diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 334 | 
1 files changed, 177 insertions, 157 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c index dbe7442fb25c..90158289cd30 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c @@ -56,10 +56,6 @@  #define GFX10_NUM_GFX_RINGS_Sienna_Cichlid	1  #define GFX10_MEC_HPD_SIZE	2048 -#define RLCG_VFGATE_DISABLED	0x4000000 -#define RLCG_WRONG_OPERATION_TYPE	0x2000000 -#define RLCG_NOT_IN_RANGE	0x1000000 -  #define F32_CE_PROGRAM_RAM_SIZE		65536  #define RLCG_UCODE_LOADING_START_ADDRESS	0x00002000L @@ -110,6 +106,12 @@  #define mmGOLDEN_TSC_COUNT_UPPER_Vangogh_BASE_IDX       1  #define mmGOLDEN_TSC_COUNT_LOWER_Vangogh                0x0026  #define mmGOLDEN_TSC_COUNT_LOWER_Vangogh_BASE_IDX       1 + +#define mmGOLDEN_TSC_COUNT_UPPER_GC_10_3_6                0x002d +#define mmGOLDEN_TSC_COUNT_UPPER_GC_10_3_6_BASE_IDX       1 +#define mmGOLDEN_TSC_COUNT_LOWER_GC_10_3_6                0x002e +#define mmGOLDEN_TSC_COUNT_LOWER_GC_10_3_6_BASE_IDX       1 +  #define mmSPI_CONFIG_CNTL_1_Vangogh		 0x2441  #define mmSPI_CONFIG_CNTL_1_Vangogh_BASE_IDX	 1  #define mmVGT_TF_MEMORY_BASE_HI_Vangogh          0x2261 @@ -180,14 +182,6 @@  #define mmRLC_SPARE_INT_0_Sienna_Cichlid               0x4ca5  #define mmRLC_SPARE_INT_0_Sienna_Cichlid_BASE_IDX      1 -#define GFX_RLCG_GC_WRITE_OLD	(0x8 << 28) -#define GFX_RLCG_GC_WRITE	(0x0 << 28) -#define GFX_RLCG_GC_READ	(0x1 << 28) -#define GFX_RLCG_MMHUB_WRITE	(0x2 << 28) - -#define RLCG_ERROR_REPORT_ENABLED(adev) \ -	(amdgpu_sriov_reg_indirect_mmhub(adev) || amdgpu_sriov_reg_indirect_gc(adev)) -  MODULE_FIRMWARE("amdgpu/navi10_ce.bin");  MODULE_FIRMWARE("amdgpu/navi10_pfp.bin");  MODULE_FIRMWARE("amdgpu/navi10_me.bin"); @@ -270,6 +264,20 @@ MODULE_FIRMWARE("amdgpu/cyan_skillfish2_mec.bin");  MODULE_FIRMWARE("amdgpu/cyan_skillfish2_mec2.bin");  MODULE_FIRMWARE("amdgpu/cyan_skillfish2_rlc.bin"); +MODULE_FIRMWARE("amdgpu/gc_10_3_6_ce.bin"); +MODULE_FIRMWARE("amdgpu/gc_10_3_6_pfp.bin"); +MODULE_FIRMWARE("amdgpu/gc_10_3_6_me.bin"); +MODULE_FIRMWARE("amdgpu/gc_10_3_6_mec.bin"); +MODULE_FIRMWARE("amdgpu/gc_10_3_6_mec2.bin"); +MODULE_FIRMWARE("amdgpu/gc_10_3_6_rlc.bin"); + +MODULE_FIRMWARE("amdgpu/gc_10_3_7_ce.bin"); +MODULE_FIRMWARE("amdgpu/gc_10_3_7_pfp.bin"); +MODULE_FIRMWARE("amdgpu/gc_10_3_7_me.bin"); +MODULE_FIRMWARE("amdgpu/gc_10_3_7_mec.bin"); +MODULE_FIRMWARE("amdgpu/gc_10_3_7_mec2.bin"); +MODULE_FIRMWARE("amdgpu/gc_10_3_7_rlc.bin"); +  static const struct soc15_reg_golden golden_settings_gc_10_1[] =  {  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_4, 0xffffffff, 0x00400014), @@ -1463,143 +1471,6 @@ static const struct soc15_reg_golden golden_settings_gc_10_1_2[] =  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffffffff, 0x00c00000)  }; -static bool gfx_v10_get_rlcg_flag(struct amdgpu_device *adev, u32 acc_flags, u32 hwip, -				 int write, u32 *rlcg_flag) -{ -	switch (hwip) { -	case GC_HWIP: -		if (amdgpu_sriov_reg_indirect_gc(adev)) { -			*rlcg_flag = write ? GFX_RLCG_GC_WRITE : GFX_RLCG_GC_READ; - -			return true; -		/* only in new version, AMDGPU_REGS_NO_KIQ and AMDGPU_REGS_RLC enabled simultaneously */ -		} else if ((acc_flags & AMDGPU_REGS_RLC) && !(acc_flags & AMDGPU_REGS_NO_KIQ)) { -			*rlcg_flag = GFX_RLCG_GC_WRITE_OLD; - -			return true; -		} - -		break; -	case MMHUB_HWIP: -		if (amdgpu_sriov_reg_indirect_mmhub(adev) && -		    (acc_flags & AMDGPU_REGS_RLC) && write) { -			*rlcg_flag = GFX_RLCG_MMHUB_WRITE; -			return true; -		} - -		break; -	default: -		DRM_DEBUG("Not program register by RLCG\n"); -	} - -	return false; -} - -static u32 gfx_v10_rlcg_rw(struct amdgpu_device *adev, u32 offset, u32 v, uint32_t flag) -{ -	static void *scratch_reg0; -	static void *scratch_reg1; -	static void *scratch_reg2; -	static void *scratch_reg3; -	static void *spare_int; -	static uint32_t grbm_cntl; -	static uint32_t grbm_idx; -	uint32_t i = 0; -	uint32_t retries = 50000; -	u32 ret = 0; -	u32 tmp; - -	scratch_reg0 = adev->rmmio + -		       (adev->reg_offset[GC_HWIP][0][mmSCRATCH_REG0_BASE_IDX] + mmSCRATCH_REG0) * 4; -	scratch_reg1 = adev->rmmio + -		       (adev->reg_offset[GC_HWIP][0][mmSCRATCH_REG1_BASE_IDX] + mmSCRATCH_REG1) * 4; -	scratch_reg2 = adev->rmmio + -		       (adev->reg_offset[GC_HWIP][0][mmSCRATCH_REG0_BASE_IDX] + mmSCRATCH_REG2) * 4; -	scratch_reg3 = adev->rmmio + -		       (adev->reg_offset[GC_HWIP][0][mmSCRATCH_REG1_BASE_IDX] + mmSCRATCH_REG3) * 4; - -	if (adev->ip_versions[GC_HWIP][0] >= IP_VERSION(10, 3, 0)) { -		spare_int = adev->rmmio + -			    (adev->reg_offset[GC_HWIP][0][mmRLC_SPARE_INT_0_Sienna_Cichlid_BASE_IDX] -			     + mmRLC_SPARE_INT_0_Sienna_Cichlid) * 4; -	} else { -		spare_int = adev->rmmio + -			    (adev->reg_offset[GC_HWIP][0][mmRLC_SPARE_INT_BASE_IDX] + mmRLC_SPARE_INT) * 4; -	} - -	grbm_cntl = adev->reg_offset[GC_HWIP][0][mmGRBM_GFX_CNTL_BASE_IDX] + mmGRBM_GFX_CNTL; -	grbm_idx = adev->reg_offset[GC_HWIP][0][mmGRBM_GFX_INDEX_BASE_IDX] + mmGRBM_GFX_INDEX; - -	if (offset == grbm_cntl || offset == grbm_idx) { -		if (offset  == grbm_cntl) -			writel(v, scratch_reg2); -		else if (offset == grbm_idx) -			writel(v, scratch_reg3); - -		writel(v, ((void __iomem *)adev->rmmio) + (offset * 4)); -	} else { -		writel(v, scratch_reg0); -		writel(offset | flag, scratch_reg1); -		writel(1, spare_int); - -		for (i = 0; i < retries; i++) { -			tmp = readl(scratch_reg1); -			if (!(tmp & flag)) -				break; - -			udelay(10); -		} - -		if (i >= retries) { -			if (RLCG_ERROR_REPORT_ENABLED(adev)) { -				if (tmp & RLCG_VFGATE_DISABLED) -					pr_err("The vfgate is disabled, program reg:0x%05x failed!\n", offset); -				else if (tmp & RLCG_WRONG_OPERATION_TYPE) -					pr_err("Wrong operation type, program reg:0x%05x failed!\n", offset); -				else if (tmp & RLCG_NOT_IN_RANGE) -					pr_err("The register is not in range, program reg:0x%05x failed!\n", offset); -				else -					pr_err("Unknown error type, program reg:0x%05x failed!\n", offset); -			} else -				pr_err("timeout: rlcg program reg:0x%05x failed!\n", offset); -		} -	} - -	ret = readl(scratch_reg0); - -	return ret; -} - -static void gfx_v10_sriov_wreg(struct amdgpu_device *adev, u32 offset, u32 value, u32 acc_flags, u32 hwip) -{ -	u32 rlcg_flag; - -	if (!amdgpu_sriov_runtime(adev) && -	    gfx_v10_get_rlcg_flag(adev, acc_flags, hwip, 1, &rlcg_flag)) { -		gfx_v10_rlcg_rw(adev, offset, value, rlcg_flag); -		return; -	} - -	if (acc_flags & AMDGPU_REGS_NO_KIQ) -		WREG32_NO_KIQ(offset, value); -	else -		WREG32(offset, value); -} - -static u32 gfx_v10_sriov_rreg(struct amdgpu_device *adev, u32 offset, u32 acc_flags, u32 hwip) -{ -	u32 rlcg_flag; - -	if (!amdgpu_sriov_runtime(adev) && -	    gfx_v10_get_rlcg_flag(adev, acc_flags, hwip, 0, &rlcg_flag)) -		return gfx_v10_rlcg_rw(adev, offset, 0, rlcg_flag); - -	if (acc_flags & AMDGPU_REGS_NO_KIQ) -		return RREG32_NO_KIQ(offset); -	else -		return RREG32(offset); -} -  static const struct soc15_reg_golden golden_settings_gc_10_1_nv14[] =  {  	/* Pending on emulation bring up */ @@ -3557,6 +3428,57 @@ static const struct soc15_reg_golden golden_settings_gc_10_0_cyan_skillfish[] =  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0x00800000, 0x00800000)  }; +static const struct soc15_reg_golden golden_settings_gc_10_3_6[] = +{ +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SPI_CS_CLK_CTRL, 0xff7f0fff, 0x78000100), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCH_PIPE_STEER, 0x000000ff, 0x00000044), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPF_GCR_CNTL, 0x0007ffff, 0x0000c200), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG3, 0xffffffff, 0x00000280), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG4, 0xffffffff, 0x00800000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0x0c1807ff, 0x00000042), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCR_GENERAL_CNTL, 0x1ff1ffff, 0x00000500), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL1_PIPE_STEER, 0x000000ff, 0x00000044), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2_PIPE_STEER_0, 0x77777777, 0x32103210), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2_PIPE_STEER_1, 0x77777777, 0x32103210), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2A_ADDR_MATCH_MASK, 0xffffffff, 0xfffffff3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2C_ADDR_MATCH_MASK, 0xffffffff, 0xfffffff3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2C_CM_CTRL1, 0xff8fff0f, 0x580f1008), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2C_CTRL3, 0xf7ffffff, 0x00f80988), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmLDS_CONFIG, 0x000001ff, 0x00000020), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_CL_ENHANCE, 0xf17fffff, 0x01200007), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_TIMEOUT_COUNTER, 0xffffffff, 0x00000800), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_2, 0xffffffbf, 0x00000820), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQG_CONFIG, 0x000017ff, 0x00001000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSX_DEBUG_1, 0xffffff7f, 0x00010020), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfff7ffff, 0x01030000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffffffff, 0x00100000) +}; + +static const struct soc15_reg_golden golden_settings_gc_10_3_7[] = { +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCGTT_SPI_CS_CLK_CTRL, 0xff7f0fff, 0x78000100), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCH_PIPE_STEER, 0x000000ff, 0x000000e4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPF_GCR_CNTL, 0x0007ffff, 0x0000c200), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG3, 0xffffffff, 0x00000280), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG4, 0xffffffff, 0x00800000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0x0c1807ff, 0x00000041), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCR_GENERAL_CNTL, 0x1ff1ffff, 0x00000500), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL1_PIPE_STEER, 0x000000ff, 0x000000e4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2_PIPE_STEER_0, 0x77777777, 0x32103210), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2_PIPE_STEER_1, 0x77777777, 0x32103210), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2A_ADDR_MATCH_MASK, 0xffffffff, 0xffffffff), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2C_ADDR_MATCH_MASK, 0xffffffff, 0xffffffff), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2C_CM_CTRL1, 0xff8fff0f, 0x580f1008), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2C_CTRL3, 0xf7ffffff, 0x00f80988), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmLDS_CONFIG, 0x000001ff, 0x00000020), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_CL_ENHANCE, 0xf000003f, 0x01200007), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_TIMEOUT_COUNTER, 0xffffffff, 0x00000800), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_2, 0xffffffbf, 0x00000820), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQG_CONFIG, 0x000017ff, 0x00001000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSX_DEBUG_1, 0xffffff7f, 0x00010020), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfff7ffff, 0x01030000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffffffff, 0x00100000) +}; +  #define DEFAULT_SH_MEM_CONFIG \  	((SH_MEM_ADDRESS_MODE_64 << SH_MEM_CONFIG__ADDRESS_MODE__SHIFT) | \  	 (SH_MEM_ALIGNMENT_MODE_UNALIGNED << SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) | \ @@ -3790,10 +3712,21 @@ static void gfx_v10_0_init_golden_registers(struct amdgpu_device *adev)  						(const u32)ARRAY_SIZE(golden_settings_gc_10_3_5));  		break;  	case IP_VERSION(10, 1, 3): +	case IP_VERSION(10, 1, 4):  		soc15_program_register_sequence(adev,  						golden_settings_gc_10_0_cyan_skillfish,  						(const u32)ARRAY_SIZE(golden_settings_gc_10_0_cyan_skillfish));  		break; +	case IP_VERSION(10, 3, 6): +		soc15_program_register_sequence(adev, +						golden_settings_gc_10_3_6, +						(const u32)ARRAY_SIZE(golden_settings_gc_10_3_6)); +		break; +	case IP_VERSION(10, 3, 7): +		soc15_program_register_sequence(adev, +						golden_settings_gc_10_3_7, +						(const u32)ARRAY_SIZE(golden_settings_gc_10_3_7)); +		break;  	default:  		break;  	} @@ -3968,6 +3901,7 @@ static void gfx_v10_0_check_fw_write_wait(struct amdgpu_device *adev)  	case IP_VERSION(10, 1, 2):  	case IP_VERSION(10, 1, 1):  	case IP_VERSION(10, 1, 3): +	case IP_VERSION(10, 1, 4):  		if ((adev->gfx.me_fw_version >= 0x00000046) &&  		    (adev->gfx.me_feature_version >= 27) &&  		    (adev->gfx.pfp_fw_version >= 0x00000068) && @@ -3981,7 +3915,9 @@ static void gfx_v10_0_check_fw_write_wait(struct amdgpu_device *adev)  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 4):  	case IP_VERSION(10, 3, 5): +	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3): +	case IP_VERSION(10, 3, 7):  		adev->gfx.cp_fw_write_wait = true;  		break;  	default: @@ -4102,12 +4038,19 @@ static int gfx_v10_0_init_microcode(struct amdgpu_device *adev)  	case IP_VERSION(10, 3, 3):  		chip_name = "yellow_carp";  		break; +	case IP_VERSION(10, 3, 6): +		chip_name = "gc_10_3_6"; +		break;  	case IP_VERSION(10, 1, 3): +	case IP_VERSION(10, 1, 4):  		if (adev->apu_flags & AMD_APU_IS_CYAN_SKILLFISH2)  			chip_name = "cyan_skillfish2";  		else  			chip_name = "cyan_skillfish";  		break; +	case IP_VERSION(10, 3, 7): +		chip_name = "gc_10_3_7"; +		break;  	default:  		BUG();  	} @@ -4448,6 +4391,30 @@ static void gfx_v10_0_rlc_fini(struct amdgpu_device *adev)  			(void **)&adev->gfx.rlc.cp_table_ptr);  } +static void gfx_v10_0_init_rlcg_reg_access_ctrl(struct amdgpu_device *adev) +{ +	struct amdgpu_rlcg_reg_access_ctrl *reg_access_ctrl; + +	reg_access_ctrl = &adev->gfx.rlc.reg_access_ctrl; +	reg_access_ctrl->scratch_reg0 = SOC15_REG_OFFSET(GC, 0, mmSCRATCH_REG0); +	reg_access_ctrl->scratch_reg1 = SOC15_REG_OFFSET(GC, 0, mmSCRATCH_REG1); +	reg_access_ctrl->scratch_reg2 = SOC15_REG_OFFSET(GC, 0, mmSCRATCH_REG2); +	reg_access_ctrl->scratch_reg3 = SOC15_REG_OFFSET(GC, 0, mmSCRATCH_REG3); +	reg_access_ctrl->grbm_cntl = SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_CNTL); +	reg_access_ctrl->grbm_idx = SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_INDEX); +	switch (adev->ip_versions[GC_HWIP][0]) { +		case IP_VERSION(10, 3, 0): +			reg_access_ctrl->spare_int = +				SOC15_REG_OFFSET(GC, 0, mmRLC_SPARE_INT_0_Sienna_Cichlid); +			break; +		default: +			reg_access_ctrl->spare_int = +				SOC15_REG_OFFSET(GC, 0, mmRLC_SPARE_INT); +			break; +	} +	adev->gfx.rlc.rlcg_reg_access_supported = true; +} +  static int gfx_v10_0_rlc_init(struct amdgpu_device *adev)  {  	const struct cs_section_def *cs_data; @@ -4468,6 +4435,7 @@ static int gfx_v10_0_rlc_init(struct amdgpu_device *adev)  	if (adev->gfx.rlc.funcs->update_spm_vmid)  		adev->gfx.rlc.funcs->update_spm_vmid(adev, 0xf); +  	return 0;  } @@ -4678,7 +4646,9 @@ static void gfx_v10_0_gpu_early_init(struct amdgpu_device *adev)  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 4):  	case IP_VERSION(10, 3, 5): +	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3): +	case IP_VERSION(10, 3, 7):  		adev->gfx.config.max_hw_contexts = 8;  		adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;  		adev->gfx.config.sc_prim_fifo_size_backend = 0x100; @@ -4689,6 +4659,7 @@ static void gfx_v10_0_gpu_early_init(struct amdgpu_device *adev)  			1 << REG_GET_FIELD(gb_addr_config, GB_ADDR_CONFIG, NUM_PKRS);  		break;  	case IP_VERSION(10, 1, 3): +	case IP_VERSION(10, 1, 4):  		adev->gfx.config.max_hw_contexts = 8;  		adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;  		adev->gfx.config.sc_prim_fifo_size_backend = 0x100; @@ -4801,6 +4772,7 @@ static int gfx_v10_0_sw_init(void *handle)  	case IP_VERSION(10, 1, 1):  	case IP_VERSION(10, 1, 2):  	case IP_VERSION(10, 1, 3): +	case IP_VERSION(10, 1, 4):  		adev->gfx.me.num_me = 1;  		adev->gfx.me.num_pipe_per_me = 1;  		adev->gfx.me.num_queue_per_pipe = 1; @@ -4813,7 +4785,9 @@ static int gfx_v10_0_sw_init(void *handle)  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 4):  	case IP_VERSION(10, 3, 5): +	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3): +	case IP_VERSION(10, 3, 7):  		adev->gfx.me.num_me = 1;  		adev->gfx.me.num_pipe_per_me = 1;  		adev->gfx.me.num_queue_per_pipe = 1; @@ -4865,10 +4839,14 @@ static int gfx_v10_0_sw_init(void *handle)  	if (r)  		return r; -	r = gfx_v10_0_rlc_init(adev); -	if (r) { -		DRM_ERROR("Failed to init rlc BOs!\n"); -		return r; +	if (adev->gfx.rlc.funcs) { +		if (adev->gfx.rlc.funcs->init) { +			r = adev->gfx.rlc.funcs->init(adev); +			if (r) { +				dev_err(adev->dev, "Failed to init rlc BOs!\n"); +				return r; +			} +		}  	}  	r = gfx_v10_0_mec_init(adev); @@ -5047,7 +5025,8 @@ static void gfx_v10_0_setup_rb(struct amdgpu_device *adev)  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {  			bitmap = i * adev->gfx.config.max_sh_per_se + j;  			if (((adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0)) || -				(adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 3))) && +				(adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 3)) || +				(adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 6))) &&  			    ((gfx_v10_3_get_disabled_sa(adev) >> bitmap) & 1))  				continue;  			gfx_v10_0_select_se_sh(adev, i, j, 0xffffffff); @@ -6321,7 +6300,9 @@ static void gfx_v10_0_cp_gfx_set_doorbell(struct amdgpu_device *adev,  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 4):  	case IP_VERSION(10, 3, 5): +	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3): +	case IP_VERSION(10, 3, 7):  		tmp = REG_SET_FIELD(0, CP_RB_DOORBELL_RANGE_LOWER,  				    DOORBELL_RANGE_LOWER_Sienna_Cichlid, ring->doorbell_index);  		WREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_RANGE_LOWER, tmp); @@ -6458,7 +6439,9 @@ static void gfx_v10_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)  		case IP_VERSION(10, 3, 1):  		case IP_VERSION(10, 3, 4):  		case IP_VERSION(10, 3, 5): +		case IP_VERSION(10, 3, 6):  		case IP_VERSION(10, 3, 3): +		case IP_VERSION(10, 3, 7):  			WREG32_SOC15(GC, 0, mmCP_MEC_CNTL_Sienna_Cichlid, 0);  			break;  		default: @@ -6472,7 +6455,9 @@ static void gfx_v10_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)  		case IP_VERSION(10, 3, 1):  		case IP_VERSION(10, 3, 4):  		case IP_VERSION(10, 3, 5): +		case IP_VERSION(10, 3, 6):  		case IP_VERSION(10, 3, 3): +		case IP_VERSION(10, 3, 7):  			WREG32_SOC15(GC, 0, mmCP_MEC_CNTL_Sienna_Cichlid,  				     (CP_MEC_CNTL__MEC_ME1_HALT_MASK |  				      CP_MEC_CNTL__MEC_ME2_HALT_MASK)); @@ -6570,6 +6555,7 @@ static void gfx_v10_0_kiq_setting(struct amdgpu_ring *ring)  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 4):  	case IP_VERSION(10, 3, 5): +	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3):  		tmp = RREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS_Sienna_Cichlid);  		tmp &= 0xffffff00; @@ -7300,6 +7286,8 @@ static bool gfx_v10_0_check_grbm_cam_remapping(struct amdgpu_device *adev)  		break;  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 3): +	case IP_VERSION(10, 3, 6): +	case IP_VERSION(10, 3, 7):  		return true;  	default:  		data = RREG32_SOC15(GC, 0, mmVGT_ESGS_RING_SIZE); @@ -7334,7 +7322,9 @@ static void gfx_v10_0_setup_grbm_cam_remapping(struct amdgpu_device *adev)  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 4):  	case IP_VERSION(10, 3, 5): +	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3): +	case IP_VERSION(10, 3, 7):  		/* mmVGT_TF_RING_SIZE_UMD -> mmVGT_TF_RING_SIZE */  		data = (SOC15_REG_OFFSET(GC, 0, mmVGT_TF_RING_SIZE_UMD) <<  			GRBM_CAM_DATA__CAM_ADDR__SHIFT) | @@ -7654,6 +7644,7 @@ static int gfx_v10_0_soft_reset(void *handle)  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 4):  	case IP_VERSION(10, 3, 5): +	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3):  		if (REG_GET_FIELD(tmp, GRBM_STATUS2, RLC_BUSY_Sienna_Cichlid))  			grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, @@ -7721,6 +7712,21 @@ static uint64_t gfx_v10_0_get_gpu_clock_counter(struct amdgpu_device *adev)  		preempt_enable();  		clock = clock_lo | (clock_hi << 32ULL);  		break; +	case IP_VERSION(10, 3, 6): +		preempt_disable(); +		clock_hi = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_UPPER_GC_10_3_6); +		clock_lo = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_LOWER_GC_10_3_6); +		hi_check = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_UPPER_GC_10_3_6); +		/* The SMUIO TSC clock frequency is 100MHz, which sets 32-bit carry over +		 * roughly every 42 seconds. +		 */ +		if (hi_check != clock_hi) { +			clock_lo = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_LOWER_GC_10_3_6); +			clock_hi = hi_check; +		} +		preempt_enable(); +		clock = clock_lo | (clock_hi << 32ULL); +		break;  	default:  		preempt_disable();  		clock_hi = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_UPPER); @@ -7778,6 +7784,7 @@ static int gfx_v10_0_early_init(void *handle)  	case IP_VERSION(10, 1, 1):  	case IP_VERSION(10, 1, 2):  	case IP_VERSION(10, 1, 3): +	case IP_VERSION(10, 1, 4):  		adev->gfx.num_gfx_rings = GFX10_NUM_GFX_RINGS_NV1X;  		break;  	case IP_VERSION(10, 3, 0): @@ -7785,7 +7792,9 @@ static int gfx_v10_0_early_init(void *handle)  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 4):  	case IP_VERSION(10, 3, 5): +	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3): +	case IP_VERSION(10, 3, 7):  		adev->gfx.num_gfx_rings = GFX10_NUM_GFX_RINGS_Sienna_Cichlid;  		break;  	default: @@ -7801,6 +7810,9 @@ static int gfx_v10_0_early_init(void *handle)  	gfx_v10_0_set_gds_init(adev);  	gfx_v10_0_set_rlc_funcs(adev); +	/* init rlcg reg access ctrl */ +	gfx_v10_0_init_rlcg_reg_access_ctrl(adev); +  	return 0;  } @@ -7843,6 +7855,7 @@ static void gfx_v10_0_set_safe_mode(struct amdgpu_device *adev)  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 4):  	case IP_VERSION(10, 3, 5): +	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3):  		WREG32_SOC15(GC, 0, mmRLC_SAFE_MODE_Sienna_Cichlid, data); @@ -7879,6 +7892,7 @@ static void gfx_v10_0_unset_safe_mode(struct amdgpu_device *adev)  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 4):  	case IP_VERSION(10, 3, 5): +	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3):  		WREG32_SOC15(GC, 0, mmRLC_SAFE_MODE_Sienna_Cichlid, data);  		break; @@ -8333,6 +8347,7 @@ static void gfx_v10_cntl_power_gating(struct amdgpu_device *adev, bool enable)  		switch (adev->ip_versions[GC_HWIP][0]) {  		case IP_VERSION(10, 3, 1):  		case IP_VERSION(10, 3, 3): +		case IP_VERSION(10, 3, 6):  			data = 0x4E20 & RLC_PG_DELAY_3__CGCG_ACTIVE_BEFORE_CGPG_MASK_Vangogh;  			WREG32_SOC15(GC, 0, mmRLC_PG_DELAY_3, data);  			break; @@ -8377,8 +8392,6 @@ static const struct amdgpu_rlc_funcs gfx_v10_0_rlc_funcs_sriov = {  	.reset = gfx_v10_0_rlc_reset,  	.start = gfx_v10_0_rlc_start,  	.update_spm_vmid = gfx_v10_0_update_spm_vmid, -	.sriov_wreg = gfx_v10_sriov_wreg, -	.sriov_rreg = gfx_v10_sriov_rreg,  	.is_rlcg_access_range = gfx_v10_0_is_rlcg_access_range,  }; @@ -8403,6 +8416,7 @@ static int gfx_v10_0_set_powergating_state(void *handle,  		break;  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 3): +	case IP_VERSION(10, 3, 6):  		gfx_v10_cntl_pg(adev, enable);  		amdgpu_gfx_off_ctrl(adev, enable);  		break; @@ -8429,6 +8443,7 @@ static int gfx_v10_0_set_clockgating_state(void *handle,  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 4):  	case IP_VERSION(10, 3, 5): +	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3):  		gfx_v10_0_update_gfx_clock_gating(adev,  						 state == AMD_CG_STATE_GATE); @@ -9537,11 +9552,14 @@ static void gfx_v10_0_set_rlc_funcs(struct amdgpu_device *adev)  	case IP_VERSION(10, 1, 10):  	case IP_VERSION(10, 1, 1):  	case IP_VERSION(10, 1, 3): +	case IP_VERSION(10, 1, 4):  	case IP_VERSION(10, 3, 2):  	case IP_VERSION(10, 3, 1):  	case IP_VERSION(10, 3, 4):  	case IP_VERSION(10, 3, 5): +	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3): +	case IP_VERSION(10, 3, 7):  		adev->gfx.rlc.funcs = &gfx_v10_0_rlc_funcs;  		break;  	case IP_VERSION(10, 1, 2): @@ -9634,7 +9652,9 @@ static int gfx_v10_0_get_cu_info(struct amdgpu_device *adev,  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {  			bitmap = i * adev->gfx.config.max_sh_per_se + j;  			if (((adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0)) || -				(adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 3))) && +			     (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 3)) || +			     (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 6)) || +			     (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 7))) &&  			    ((gfx_v10_3_get_disabled_sa(adev) >> bitmap) & 1))  				continue;  			mask = 1;  | 
