diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
36 files changed, 527 insertions, 380 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile index 66f729eaf00b..20c9539abc36 100644 --- a/drivers/gpu/drm/amd/amdgpu/Makefile +++ b/drivers/gpu/drm/amd/amdgpu/Makefile @@ -25,7 +25,7 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \  	amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o  # add asic specific block -amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o gmc_v7_0.o cik_ih.o kv_smc.o kv_dpm.o \ +amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \  	ci_smc.o ci_dpm.o dce_v8_0.o gfx_v7_0.o cik_sdma.o uvd_v4_2.o vce_v2_0.o \  	amdgpu_amdkfd_gfx_v7.o @@ -34,6 +34,7 @@ amdgpu-y += \  # add GMC block  amdgpu-y += \ +	gmc_v7_0.o \  	gmc_v8_0.o  # add IH block diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 313b0cc8d676..5e7770f9a415 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -87,6 +87,8 @@ extern int amdgpu_sched_jobs;  extern int amdgpu_sched_hw_submission;  extern int amdgpu_enable_semaphores;  extern int amdgpu_powerplay; +extern unsigned amdgpu_pcie_gen_cap; +extern unsigned amdgpu_pcie_lane_cap;  #define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS	        3000  #define AMDGPU_MAX_USEC_TIMEOUT			100000	/* 100 ms */ @@ -132,47 +134,6 @@ extern int amdgpu_powerplay;  #define AMDGPU_RESET_VCE			(1 << 13)  #define AMDGPU_RESET_VCE1			(1 << 14) -/* CG block flags */ -#define AMDGPU_CG_BLOCK_GFX			(1 << 0) -#define AMDGPU_CG_BLOCK_MC			(1 << 1) -#define AMDGPU_CG_BLOCK_SDMA			(1 << 2) -#define AMDGPU_CG_BLOCK_UVD			(1 << 3) -#define AMDGPU_CG_BLOCK_VCE			(1 << 4) -#define AMDGPU_CG_BLOCK_HDP			(1 << 5) -#define AMDGPU_CG_BLOCK_BIF			(1 << 6) - -/* CG flags */ -#define AMDGPU_CG_SUPPORT_GFX_MGCG		(1 << 0) -#define AMDGPU_CG_SUPPORT_GFX_MGLS		(1 << 1) -#define AMDGPU_CG_SUPPORT_GFX_CGCG		(1 << 2) -#define AMDGPU_CG_SUPPORT_GFX_CGLS		(1 << 3) -#define AMDGPU_CG_SUPPORT_GFX_CGTS		(1 << 4) -#define AMDGPU_CG_SUPPORT_GFX_CGTS_LS		(1 << 5) -#define AMDGPU_CG_SUPPORT_GFX_CP_LS		(1 << 6) -#define AMDGPU_CG_SUPPORT_GFX_RLC_LS		(1 << 7) -#define AMDGPU_CG_SUPPORT_MC_LS			(1 << 8) -#define AMDGPU_CG_SUPPORT_MC_MGCG		(1 << 9) -#define AMDGPU_CG_SUPPORT_SDMA_LS		(1 << 10) -#define AMDGPU_CG_SUPPORT_SDMA_MGCG		(1 << 11) -#define AMDGPU_CG_SUPPORT_BIF_LS		(1 << 12) -#define AMDGPU_CG_SUPPORT_UVD_MGCG		(1 << 13) -#define AMDGPU_CG_SUPPORT_VCE_MGCG		(1 << 14) -#define AMDGPU_CG_SUPPORT_HDP_LS		(1 << 15) -#define AMDGPU_CG_SUPPORT_HDP_MGCG		(1 << 16) - -/* PG flags */ -#define AMDGPU_PG_SUPPORT_GFX_PG		(1 << 0) -#define AMDGPU_PG_SUPPORT_GFX_SMG		(1 << 1) -#define AMDGPU_PG_SUPPORT_GFX_DMG		(1 << 2) -#define AMDGPU_PG_SUPPORT_UVD			(1 << 3) -#define AMDGPU_PG_SUPPORT_VCE			(1 << 4) -#define AMDGPU_PG_SUPPORT_CP			(1 << 5) -#define AMDGPU_PG_SUPPORT_GDS			(1 << 6) -#define AMDGPU_PG_SUPPORT_RLC_SMU_HS		(1 << 7) -#define AMDGPU_PG_SUPPORT_SDMA			(1 << 8) -#define AMDGPU_PG_SUPPORT_ACP			(1 << 9) -#define AMDGPU_PG_SUPPORT_SAMU			(1 << 10) -  /* GFX current status */  #define AMDGPU_GFX_NORMAL_MODE			0x00000000L  #define AMDGPU_GFX_SAFE_MODE			0x00000001L @@ -606,8 +567,6 @@ struct amdgpu_sa_manager {  	uint32_t		align;  }; -struct amdgpu_sa_bo; -  /* sub-allocation buffer */  struct amdgpu_sa_bo {  	struct list_head		olist; @@ -2278,60 +2237,60 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)  #define amdgpu_dpm_enable_bapm(adev, e) (adev)->pm.funcs->enable_bapm((adev), (e))  #define amdgpu_dpm_get_temperature(adev) \ -	(adev)->pp_enabled ?						\ +	((adev)->pp_enabled ?						\  	      (adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle) : \ -	      (adev)->pm.funcs->get_temperature((adev)) +	      (adev)->pm.funcs->get_temperature((adev)))  #define amdgpu_dpm_set_fan_control_mode(adev, m) \ -	(adev)->pp_enabled ?						\ +	((adev)->pp_enabled ?						\  	      (adev)->powerplay.pp_funcs->set_fan_control_mode((adev)->powerplay.pp_handle, (m)) : \ -	      (adev)->pm.funcs->set_fan_control_mode((adev), (m)) +	      (adev)->pm.funcs->set_fan_control_mode((adev), (m)))  #define amdgpu_dpm_get_fan_control_mode(adev) \ -	(adev)->pp_enabled ?						\ +	((adev)->pp_enabled ?						\  	      (adev)->powerplay.pp_funcs->get_fan_control_mode((adev)->powerplay.pp_handle) : \ -	      (adev)->pm.funcs->get_fan_control_mode((adev)) +	      (adev)->pm.funcs->get_fan_control_mode((adev)))  #define amdgpu_dpm_set_fan_speed_percent(adev, s) \ -	(adev)->pp_enabled ?						\ +	((adev)->pp_enabled ?						\  	      (adev)->powerplay.pp_funcs->set_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \ -	      (adev)->pm.funcs->set_fan_speed_percent((adev), (s)) +	      (adev)->pm.funcs->set_fan_speed_percent((adev), (s)))  #define amdgpu_dpm_get_fan_speed_percent(adev, s) \ -	(adev)->pp_enabled ?						\ +	((adev)->pp_enabled ?						\  	      (adev)->powerplay.pp_funcs->get_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \ -	      (adev)->pm.funcs->get_fan_speed_percent((adev), (s)) +	      (adev)->pm.funcs->get_fan_speed_percent((adev), (s)))  #define amdgpu_dpm_get_sclk(adev, l) \ -	(adev)->pp_enabled ?						\ +	((adev)->pp_enabled ?						\  	      (adev)->powerplay.pp_funcs->get_sclk((adev)->powerplay.pp_handle, (l)) : \ -		(adev)->pm.funcs->get_sclk((adev), (l)) +		(adev)->pm.funcs->get_sclk((adev), (l)))  #define amdgpu_dpm_get_mclk(adev, l)  \ -	(adev)->pp_enabled ?						\ +	((adev)->pp_enabled ?						\  	      (adev)->powerplay.pp_funcs->get_mclk((adev)->powerplay.pp_handle, (l)) : \ -	      (adev)->pm.funcs->get_mclk((adev), (l)) +	      (adev)->pm.funcs->get_mclk((adev), (l)))  #define amdgpu_dpm_force_performance_level(adev, l) \ -	(adev)->pp_enabled ?						\ +	((adev)->pp_enabled ?						\  	      (adev)->powerplay.pp_funcs->force_performance_level((adev)->powerplay.pp_handle, (l)) : \ -	      (adev)->pm.funcs->force_performance_level((adev), (l)) +	      (adev)->pm.funcs->force_performance_level((adev), (l)))  #define amdgpu_dpm_powergate_uvd(adev, g) \ -	(adev)->pp_enabled ?						\ +	((adev)->pp_enabled ?						\  	      (adev)->powerplay.pp_funcs->powergate_uvd((adev)->powerplay.pp_handle, (g)) : \ -	      (adev)->pm.funcs->powergate_uvd((adev), (g)) +	      (adev)->pm.funcs->powergate_uvd((adev), (g)))  #define amdgpu_dpm_powergate_vce(adev, g) \ -	(adev)->pp_enabled ?						\ +	((adev)->pp_enabled ?						\  	      (adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g)) : \ -	      (adev)->pm.funcs->powergate_vce((adev), (g)) +	      (adev)->pm.funcs->powergate_vce((adev), (g)))  #define amdgpu_dpm_debugfs_print_current_performance_level(adev, m) \ -	(adev)->pp_enabled ?						\ +	((adev)->pp_enabled ?						\  	      (adev)->powerplay.pp_funcs->print_current_performance_level((adev)->powerplay.pp_handle, (m)) : \ -	      (adev)->pm.funcs->debugfs_print_current_performance_level((adev), (m)) +	      (adev)->pm.funcs->debugfs_print_current_performance_level((adev), (m)))  #define amdgpu_dpm_get_current_power_state(adev) \  	(adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle) @@ -2360,6 +2319,8 @@ bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object *bo);  int amdgpu_ttm_tt_set_userptr(struct ttm_tt *ttm, uint64_t addr,  				     uint32_t flags);  bool amdgpu_ttm_tt_has_userptr(struct ttm_tt *ttm); +bool amdgpu_ttm_tt_affect_userptr(struct ttm_tt *ttm, unsigned long start, +				  unsigned long end);  bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm);  uint32_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,  				 struct ttm_mem_reg *mem); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c index 0e1376317683..362bedc9e507 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c @@ -154,7 +154,7 @@ static const struct kfd2kgd_calls kfd2kgd = {  	.get_fw_version = get_fw_version  }; -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions() +struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void)  {  	return (struct kfd2kgd_calls *)&kfd2kgd;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c index 79fa5c7de856..04b744d64b57 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c @@ -115,7 +115,7 @@ static const struct kfd2kgd_calls kfd2kgd = {  	.get_fw_version = get_fw_version  }; -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions() +struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void)  {  	return (struct kfd2kgd_calls *)&kfd2kgd;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c index a081dda9fa2f..7a4b101e10c6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c @@ -795,6 +795,12 @@ static int amdgpu_cgs_query_system_info(void *cgs_device,  	case CGS_SYSTEM_INFO_PCIE_MLW:  		sys_info->value = adev->pm.pcie_mlw_mask;  		break; +	case CGS_SYSTEM_INFO_CG_FLAGS: +		sys_info->value = adev->cg_flags; +		break; +	case CGS_SYSTEM_INFO_PG_FLAGS: +		sys_info->value = adev->pg_flags; +		break;  	default:  		return -ENODEV;  	} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 6f89f8e034d0..b882e8175615 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -478,9 +478,9 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, bo  	struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;  	unsigned i; -	amdgpu_vm_move_pt_bos_in_lru(parser->adev, &fpriv->vm); -  	if (!error) { +		amdgpu_vm_move_pt_bos_in_lru(parser->adev, &fpriv->vm); +  		/* Sort the buffer list from the smallest to largest buffer,  		 * which affects the order of buffers in the LRU list.  		 * This assures that the smallest buffers are added first diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 65531463f88e..51bfc114584e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -1795,15 +1795,20 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon)  	}  	/* post card */ -	amdgpu_atom_asic_init(adev->mode_info.atom_context); +	if (!amdgpu_card_posted(adev)) +		amdgpu_atom_asic_init(adev->mode_info.atom_context);  	r = amdgpu_resume(adev); +	if (r) +		DRM_ERROR("amdgpu_resume failed (%d).\n", r);  	amdgpu_fence_driver_resume(adev); -	r = amdgpu_ib_ring_tests(adev); -	if (r) -		DRM_ERROR("ib ring test failed (%d).\n", r); +	if (resume) { +		r = amdgpu_ib_ring_tests(adev); +		if (r) +			DRM_ERROR("ib ring test failed (%d).\n", r); +	}  	r = amdgpu_late_init(adev);  	if (r) @@ -1933,80 +1938,97 @@ retry:  	return r;  } +#define AMDGPU_DEFAULT_PCIE_GEN_MASK 0x30007  /* gen: chipset 1/2, asic 1/2/3 */ +#define AMDGPU_DEFAULT_PCIE_MLW_MASK 0x2f0000 /* 1/2/4/8/16 lanes */ +  void amdgpu_get_pcie_info(struct amdgpu_device *adev)  {  	u32 mask;  	int ret; -	if (pci_is_root_bus(adev->pdev->bus)) -		return; +	if (amdgpu_pcie_gen_cap) +		adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap; -	if (amdgpu_pcie_gen2 == 0) -		return; +	if (amdgpu_pcie_lane_cap) +		adev->pm.pcie_mlw_mask = amdgpu_pcie_lane_cap; -	if (adev->flags & AMD_IS_APU) +	/* covers APUs as well */ +	if (pci_is_root_bus(adev->pdev->bus)) { +		if (adev->pm.pcie_gen_mask == 0) +			adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK; +		if (adev->pm.pcie_mlw_mask == 0) +			adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;  		return; +	} -	ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask); -	if (!ret) { -		adev->pm.pcie_gen_mask = (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 | -					  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 | -					  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3); - -		if (mask & DRM_PCIE_SPEED_25) -			adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1; -		if (mask & DRM_PCIE_SPEED_50) -			adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2; -		if (mask & DRM_PCIE_SPEED_80) -			adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3; -	} -	ret = drm_pcie_get_max_link_width(adev->ddev, &mask); -	if (!ret) { -		switch (mask) { -		case 32: -			adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); -			break; -		case 16: -			adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); -			break; -		case 12: -			adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); -			break; -		case 8: -			adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); -			break; -		case 4: -			adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); -			break; -		case 2: -			adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | -						  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); -			break; -		case 1: -			adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1; -			break; -		default: -			break; +	if (adev->pm.pcie_gen_mask == 0) { +		ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask); +		if (!ret) { +			adev->pm.pcie_gen_mask = (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 | +						  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 | +						  CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3); + +			if (mask & DRM_PCIE_SPEED_25) +				adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1; +			if (mask & DRM_PCIE_SPEED_50) +				adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2; +			if (mask & DRM_PCIE_SPEED_80) +				adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3; +		} else { +			adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK; +		} +	} +	if (adev->pm.pcie_mlw_mask == 0) { +		ret = drm_pcie_get_max_link_width(adev->ddev, &mask); +		if (!ret) { +			switch (mask) { +			case 32: +				adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); +				break; +			case 16: +				adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); +				break; +			case 12: +				adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); +				break; +			case 8: +				adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); +				break; +			case 4: +				adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); +				break; +			case 2: +				adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 | +							  CAIL_PCIE_LINK_WIDTH_SUPPORT_X1); +				break; +			case 1: +				adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1; +				break; +			default: +				break; +			} +		} else { +			adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;  		}  	}  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index acd066d0a805..8297bc319369 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c @@ -72,8 +72,8 @@ static void amdgpu_flip_work_func(struct work_struct *__work)  	struct drm_crtc *crtc = &amdgpuCrtc->base;  	unsigned long flags; -	unsigned i; -	int vpos, hpos, stat, min_udelay; +	unsigned i, repcnt = 4; +	int vpos, hpos, stat, min_udelay = 0;  	struct drm_vblank_crtc *vblank = &crtc->dev->vblank[work->crtc_id];  	amdgpu_flip_wait_fence(adev, &work->excl); @@ -96,7 +96,7 @@ static void amdgpu_flip_work_func(struct work_struct *__work)  	 * In practice this won't execute very often unless on very fast  	 * machines because the time window for this to happen is very small.  	 */ -	for (;;) { +	while (amdgpuCrtc->enabled && repcnt--) {  		/* GET_DISTANCE_TO_VBLANKSTART returns distance to real vblank  		 * start in hpos, and to the "fudged earlier" vblank start in  		 * vpos. @@ -114,10 +114,22 @@ static void amdgpu_flip_work_func(struct work_struct *__work)  		/* Sleep at least until estimated real start of hw vblank */  		spin_unlock_irqrestore(&crtc->dev->event_lock, flags);  		min_udelay = (-hpos + 1) * max(vblank->linedur_ns / 1000, 5); +		if (min_udelay > vblank->framedur_ns / 2000) { +			/* Don't wait ridiculously long - something is wrong */ +			repcnt = 0; +			break; +		}  		usleep_range(min_udelay, 2 * min_udelay);  		spin_lock_irqsave(&crtc->dev->event_lock, flags);  	}; +	if (!repcnt) +		DRM_DEBUG_DRIVER("Delay problem on crtc %d: min_udelay %d, " +				 "framedur %d, linedur %d, stat %d, vpos %d, " +				 "hpos %d\n", work->crtc_id, min_udelay, +				 vblank->framedur_ns / 1000, +				 vblank->linedur_ns / 1000, stat, vpos, hpos); +  	/* do the flip (mmio) */  	adev->mode_info.funcs->page_flip(adev, work->crtc_id, work->base);  	/* set the flip status */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index b5dbbb573491..9ef1db87cf26 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -83,6 +83,8 @@ int amdgpu_sched_jobs = 32;  int amdgpu_sched_hw_submission = 2;  int amdgpu_enable_semaphores = 0;  int amdgpu_powerplay = -1; +unsigned amdgpu_pcie_gen_cap = 0; +unsigned amdgpu_pcie_lane_cap = 0;  MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes");  module_param_named(vramlimit, amdgpu_vram_limit, int, 0600); @@ -170,6 +172,12 @@ MODULE_PARM_DESC(powerplay, "Powerplay component (1 = enable, 0 = disable, -1 =  module_param_named(powerplay, amdgpu_powerplay, int, 0444);  #endif +MODULE_PARM_DESC(pcie_gen_cap, "PCIE Gen Caps (0: autodetect (default))"); +module_param_named(pcie_gen_cap, amdgpu_pcie_gen_cap, uint, 0444); + +MODULE_PARM_DESC(pcie_lane_cap, "PCIE Lane Caps (0: autodetect (default))"); +module_param_named(pcie_lane_cap, amdgpu_pcie_lane_cap, uint, 0444); +  static struct pci_device_id pciidlist[] = {  #ifdef CONFIG_DRM_AMDGPU_CIK  	/* Kaveri */ @@ -256,11 +264,11 @@ static struct pci_device_id pciidlist[] = {  	{0x1002, 0x985F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|AMD_IS_MOBILITY|AMD_IS_APU},  #endif  	/* topaz */ -	{0x1002, 0x6900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT}, -	{0x1002, 0x6901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT}, -	{0x1002, 0x6902, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT}, -	{0x1002, 0x6903, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT}, -	{0x1002, 0x6907, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ|AMD_EXP_HW_SUPPORT}, +	{0x1002, 0x6900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ}, +	{0x1002, 0x6901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ}, +	{0x1002, 0x6902, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ}, +	{0x1002, 0x6903, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ}, +	{0x1002, 0x6907, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TOPAZ},  	/* tonga */  	{0x1002, 0x6920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA},  	{0x1002, 0x6921, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA}, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c index cfb6caad2a73..919146780a15 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c @@ -333,6 +333,10 @@ int amdgpu_fbdev_init(struct amdgpu_device *adev)  	if (!adev->mode_info.mode_config_initialized)  		return 0; +	/* don't init fbdev if there are no connectors */ +	if (list_empty(&adev->ddev->mode_config.connector_list)) +		return 0; +  	/* select 8 bpp console on low vram cards */  	if (adev->mc.real_vram_size <= (32*1024*1024))  		bpp_sel = 8; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index 7380f782cd14..d20c2a8929cb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -596,7 +596,8 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,  		break;  	}  	ttm_eu_backoff_reservation(&ticket, &list); -	if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE)) +	if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE) && +	    !amdgpu_vm_debug)  		amdgpu_gem_va_update_vm(adev, bo_va, args->operation);  	drm_gem_object_unreference_unlocked(gobj); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c index b1969f2b2038..d4e2780c0796 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c @@ -142,7 +142,8 @@ static void amdgpu_mn_invalidate_range_start(struct mmu_notifier *mn,  		list_for_each_entry(bo, &node->bos, mn_list) { -			if (!bo->tbo.ttm || bo->tbo.ttm->state != tt_bound) +			if (!amdgpu_ttm_tt_affect_userptr(bo->tbo.ttm, start, +							  end))  				continue;  			r = amdgpu_bo_reserve(bo, true); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index c3ce103b6a33..b8fbbd7699e4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -33,6 +33,7 @@  #include <linux/slab.h>  #include <drm/drmP.h>  #include <drm/amdgpu_drm.h> +#include <drm/drm_cache.h>  #include "amdgpu.h"  #include "amdgpu_trace.h" @@ -261,6 +262,13 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev,  				       AMDGPU_GEM_DOMAIN_OA);  	bo->flags = flags; + +	/* For architectures that don't support WC memory, +	 * mask out the WC flag from the BO +	 */ +	if (!drm_arch_can_wc_memory()) +		bo->flags &= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC; +  	amdgpu_fill_placement_to_bo(bo, placement);  	/* Kernel allocation are uninterruptible */  	r = ttm_bo_init(&adev->mman.bdev, &bo->tbo, size, type, @@ -399,7 +407,8 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,  		}  		if (fpfn > bo->placements[i].fpfn)  			bo->placements[i].fpfn = fpfn; -		if (lpfn && lpfn < bo->placements[i].lpfn) +		if (!bo->placements[i].lpfn || +		    (lpfn && lpfn < bo->placements[i].lpfn))  			bo->placements[i].lpfn = lpfn;  		bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;  	} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 7d8d84eaea4a..66855b62a603 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c @@ -113,6 +113,10 @@ static ssize_t amdgpu_get_dpm_forced_performance_level(struct device *dev,  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private; +	if  ((adev->flags & AMD_IS_PX) && +	     (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) +		return snprintf(buf, PAGE_SIZE, "off\n"); +  	if (adev->pp_enabled) {  		enum amd_dpm_forced_level level; @@ -140,6 +144,11 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev,  	enum amdgpu_dpm_forced_level level;  	int ret = 0; +	/* Can't force performance level when the card is off */ +	if  ((adev->flags & AMD_IS_PX) && +	     (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) +		return -EINVAL; +  	if (strncmp("low", buf, strlen("low")) == 0) {  		level = AMDGPU_DPM_FORCED_LEVEL_LOW;  	} else if (strncmp("high", buf, strlen("high")) == 0) { @@ -157,6 +166,7 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev,  		mutex_lock(&adev->pm.mutex);  		if (adev->pm.dpm.thermal_active) {  			count = -EINVAL; +			mutex_unlock(&adev->pm.mutex);  			goto fail;  		}  		ret = amdgpu_dpm_force_performance_level(adev, level); @@ -167,8 +177,6 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev,  		mutex_unlock(&adev->pm.mutex);  	}  fail: -	mutex_unlock(&adev->pm.mutex); -  	return count;  } @@ -182,8 +190,14 @@ static ssize_t amdgpu_hwmon_show_temp(struct device *dev,  				      char *buf)  {  	struct amdgpu_device *adev = dev_get_drvdata(dev); +	struct drm_device *ddev = adev->ddev;  	int temp; +	/* Can't get temperature when the card is off */ +	if  ((adev->flags & AMD_IS_PX) && +	     (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) +		return -EINVAL; +  	if (!adev->pp_enabled && !adev->pm.funcs->get_temperature)  		temp = 0;  	else @@ -634,8 +648,6 @@ force:  	/* update display watermarks based on new power state */  	amdgpu_display_bandwidth_update(adev); -	/* update displays */ -	amdgpu_dpm_display_configuration_changed(adev);  	adev->pm.dpm.current_active_crtcs = adev->pm.dpm.new_active_crtcs;  	adev->pm.dpm.current_active_crtc_count = adev->pm.dpm.new_active_crtc_count; @@ -655,6 +667,9 @@ force:  	amdgpu_dpm_post_set_power_state(adev); +	/* update displays */ +	amdgpu_dpm_display_configuration_changed(adev); +  	if (adev->pm.funcs->force_performance_level) {  		if (adev->pm.dpm.thermal_active) {  			enum amdgpu_dpm_forced_level level = adev->pm.dpm.forced_level; @@ -847,12 +862,16 @@ static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data)  	struct drm_info_node *node = (struct drm_info_node *) m->private;  	struct drm_device *dev = node->minor->dev;  	struct amdgpu_device *adev = dev->dev_private; +	struct drm_device *ddev = adev->ddev;  	if (!adev->pm.dpm_enabled) {  		seq_printf(m, "dpm not enabled\n");  		return 0;  	} -	if (adev->pp_enabled) { +	if  ((adev->flags & AMD_IS_PX) && +	     (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) { +		seq_printf(m, "PX asic powered off\n"); +	} else if (adev->pp_enabled) {  		amdgpu_dpm_debugfs_print_current_performance_level(adev, m);  	} else {  		mutex_lock(&adev->pm.mutex); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c index 5ee9a0690278..b9d0d55f6b47 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c @@ -99,13 +99,24 @@ static int amdgpu_pp_early_init(void *handle)  #ifdef CONFIG_DRM_AMD_POWERPLAY  	switch (adev->asic_type) { -		case CHIP_TONGA: -		case CHIP_FIJI: -			adev->pp_enabled = (amdgpu_powerplay > 0) ? true : false; -			break; -		default: -			adev->pp_enabled = (amdgpu_powerplay > 0) ? true : false; -			break; +	case CHIP_TONGA: +	case CHIP_FIJI: +		adev->pp_enabled = (amdgpu_powerplay == 0) ? false : true; +		break; +	case CHIP_CARRIZO: +	case CHIP_STONEY: +		adev->pp_enabled = (amdgpu_powerplay > 0) ? true : false; +		break; +	/* These chips don't have powerplay implemenations */ +	case CHIP_BONAIRE: +	case CHIP_HAWAII: +	case CHIP_KABINI: +	case CHIP_MULLINS: +	case CHIP_KAVERI: +	case CHIP_TOPAZ: +	default: +		adev->pp_enabled = false; +		break;  	}  #else  	adev->pp_enabled = false; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c index 78e9b0f14661..d1f234dd2126 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c @@ -487,7 +487,7 @@ static int amdgpu_debugfs_ring_info(struct seq_file *m, void *data)  	seq_printf(m, "rptr: 0x%08x [%5d]\n",  		   rptr, rptr); -	rptr_next = ~0; +	rptr_next = le32_to_cpu(*ring->next_rptr_cpu_addr);  	seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n",  		   ring->wptr, ring->wptr); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c index 8b88edb0434b..ca72a2e487b9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c @@ -354,12 +354,15 @@ int amdgpu_sa_bo_new(struct amdgpu_sa_manager *sa_manager,  		for (i = 0, count = 0; i < AMDGPU_MAX_RINGS; ++i)  			if (fences[i]) -				fences[count++] = fences[i]; +				fences[count++] = fence_get(fences[i]);  		if (count) {  			spin_unlock(&sa_manager->wq.lock);  			t = fence_wait_any_timeout(fences, count, false,  						   MAX_SCHEDULE_TIMEOUT); +			for (i = 0; i < count; ++i) +				fence_put(fences[i]); +  			r = (t > 0) ? 0 : t;  			spin_lock(&sa_manager->wq.lock);  		} else { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 8a1752ff3d8e..1cbb16e15307 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -712,7 +712,7 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm)  						       0, PAGE_SIZE,  						       PCI_DMA_BIDIRECTIONAL);  		if (pci_dma_mapping_error(adev->pdev, gtt->ttm.dma_address[i])) { -			while (--i) { +			while (i--) {  				pci_unmap_page(adev->pdev, gtt->ttm.dma_address[i],  					       PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);  				gtt->ttm.dma_address[i] = 0; @@ -783,6 +783,25 @@ bool amdgpu_ttm_tt_has_userptr(struct ttm_tt *ttm)  	return !!gtt->userptr;  } +bool amdgpu_ttm_tt_affect_userptr(struct ttm_tt *ttm, unsigned long start, +				  unsigned long end) +{ +	struct amdgpu_ttm_tt *gtt = (void *)ttm; +	unsigned long size; + +	if (gtt == NULL) +		return false; + +	if (gtt->ttm.ttm.state != tt_bound || !gtt->userptr) +		return false; + +	size = (unsigned long)gtt->ttm.ttm.num_pages * PAGE_SIZE; +	if (gtt->userptr > end || gtt->userptr + size <= start) +		return false; + +	return true; +} +  bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm)  {  	struct amdgpu_ttm_tt *gtt = (void *)ttm; @@ -808,7 +827,7 @@ uint32_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,  			flags |= AMDGPU_PTE_SNOOPED;  	} -	if (adev->asic_type >= CHIP_TOPAZ) +	if (adev->asic_type >= CHIP_TONGA)  		flags |= AMDGPU_PTE_EXECUTABLE;  	flags |= AMDGPU_PTE_READABLE; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index aefc668e6b5d..9599f7559b3d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -1282,7 +1282,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)  {  	const unsigned align = min(AMDGPU_VM_PTB_ALIGN_SIZE,  		AMDGPU_VM_PTE_COUNT * 8); -	unsigned pd_size, pd_entries, pts_size; +	unsigned pd_size, pd_entries;  	int i, r;  	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { @@ -1300,8 +1300,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)  	pd_entries = amdgpu_vm_num_pdes(adev);  	/* allocate page table array */ -	pts_size = pd_entries * sizeof(struct amdgpu_vm_pt); -	vm->page_tables = kzalloc(pts_size, GFP_KERNEL); +	vm->page_tables = drm_calloc_large(pd_entries, sizeof(struct amdgpu_vm_pt));  	if (vm->page_tables == NULL) {  		DRM_ERROR("Cannot allocate memory for page table array\n");  		return -ENOMEM; @@ -1361,7 +1360,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)  	for (i = 0; i < amdgpu_vm_num_pdes(adev); i++)  		amdgpu_bo_unref(&vm->page_tables[i].entry.robj); -	kfree(vm->page_tables); +	drm_free_large(vm->page_tables);  	amdgpu_bo_unref(&vm->page_directory);  	fence_put(vm->page_directory_fence); diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c index 8b4731d4e10e..474ca02b0949 100644 --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c @@ -31,6 +31,7 @@  #include "ci_dpm.h"  #include "gfx_v7_0.h"  #include "atom.h" +#include "amd_pcie.h"  #include <linux/seq_file.h>  #include "smu/smu_7_0_1_d.h" @@ -5835,18 +5836,16 @@ static int ci_dpm_init(struct amdgpu_device *adev)  	u8 frev, crev;  	struct ci_power_info *pi;  	int ret; -	u32 mask;  	pi = kzalloc(sizeof(struct ci_power_info), GFP_KERNEL);  	if (pi == NULL)  		return -ENOMEM;  	adev->pm.dpm.priv = pi; -	ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask); -	if (ret) -		pi->sys_pcie_mask = 0; -	else -		pi->sys_pcie_mask = mask; +	pi->sys_pcie_mask = +		(adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_MASK) >> +		CAIL_PCIE_LINK_SPEED_SUPPORT_SHIFT; +  	pi->force_pcie_gen = AMDGPU_PCIE_GEN_INVALID;  	pi->pcie_gen_performance.max = AMDGPU_PCIE_GEN1; diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c index fd9c9588ef46..155965ed14a3 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik.c +++ b/drivers/gpu/drm/amd/amdgpu/cik.c @@ -1762,6 +1762,9 @@ static void cik_program_aspm(struct amdgpu_device *adev)  	if (amdgpu_aspm == 0)  		return; +	if (pci_is_root_bus(adev->pdev->bus)) +		return; +  	/* XXX double check APUs */  	if (adev->flags & AMD_IS_APU)  		return; @@ -2332,72 +2335,72 @@ static int cik_common_early_init(void *handle)  	switch (adev->asic_type) {  	case CHIP_BONAIRE:  		adev->cg_flags = -			AMDGPU_CG_SUPPORT_GFX_MGCG | -			AMDGPU_CG_SUPPORT_GFX_MGLS | -			/*AMDGPU_CG_SUPPORT_GFX_CGCG |*/ -			AMDGPU_CG_SUPPORT_GFX_CGLS | -			AMDGPU_CG_SUPPORT_GFX_CGTS | -			AMDGPU_CG_SUPPORT_GFX_CGTS_LS | -			AMDGPU_CG_SUPPORT_GFX_CP_LS | -			AMDGPU_CG_SUPPORT_MC_LS | -			AMDGPU_CG_SUPPORT_MC_MGCG | -			AMDGPU_CG_SUPPORT_SDMA_MGCG | -			AMDGPU_CG_SUPPORT_SDMA_LS | -			AMDGPU_CG_SUPPORT_BIF_LS | -			AMDGPU_CG_SUPPORT_VCE_MGCG | -			AMDGPU_CG_SUPPORT_UVD_MGCG | -			AMDGPU_CG_SUPPORT_HDP_LS | -			AMDGPU_CG_SUPPORT_HDP_MGCG; +			AMD_CG_SUPPORT_GFX_MGCG | +			AMD_CG_SUPPORT_GFX_MGLS | +			/*AMD_CG_SUPPORT_GFX_CGCG |*/ +			AMD_CG_SUPPORT_GFX_CGLS | +			AMD_CG_SUPPORT_GFX_CGTS | +			AMD_CG_SUPPORT_GFX_CGTS_LS | +			AMD_CG_SUPPORT_GFX_CP_LS | +			AMD_CG_SUPPORT_MC_LS | +			AMD_CG_SUPPORT_MC_MGCG | +			AMD_CG_SUPPORT_SDMA_MGCG | +			AMD_CG_SUPPORT_SDMA_LS | +			AMD_CG_SUPPORT_BIF_LS | +			AMD_CG_SUPPORT_VCE_MGCG | +			AMD_CG_SUPPORT_UVD_MGCG | +			AMD_CG_SUPPORT_HDP_LS | +			AMD_CG_SUPPORT_HDP_MGCG;  		adev->pg_flags = 0;  		adev->external_rev_id = adev->rev_id + 0x14;  		break;  	case CHIP_HAWAII:  		adev->cg_flags = -			AMDGPU_CG_SUPPORT_GFX_MGCG | -			AMDGPU_CG_SUPPORT_GFX_MGLS | -			/*AMDGPU_CG_SUPPORT_GFX_CGCG |*/ -			AMDGPU_CG_SUPPORT_GFX_CGLS | -			AMDGPU_CG_SUPPORT_GFX_CGTS | -			AMDGPU_CG_SUPPORT_GFX_CP_LS | -			AMDGPU_CG_SUPPORT_MC_LS | -			AMDGPU_CG_SUPPORT_MC_MGCG | -			AMDGPU_CG_SUPPORT_SDMA_MGCG | -			AMDGPU_CG_SUPPORT_SDMA_LS | -			AMDGPU_CG_SUPPORT_BIF_LS | -			AMDGPU_CG_SUPPORT_VCE_MGCG | -			AMDGPU_CG_SUPPORT_UVD_MGCG | -			AMDGPU_CG_SUPPORT_HDP_LS | -			AMDGPU_CG_SUPPORT_HDP_MGCG; +			AMD_CG_SUPPORT_GFX_MGCG | +			AMD_CG_SUPPORT_GFX_MGLS | +			/*AMD_CG_SUPPORT_GFX_CGCG |*/ +			AMD_CG_SUPPORT_GFX_CGLS | +			AMD_CG_SUPPORT_GFX_CGTS | +			AMD_CG_SUPPORT_GFX_CP_LS | +			AMD_CG_SUPPORT_MC_LS | +			AMD_CG_SUPPORT_MC_MGCG | +			AMD_CG_SUPPORT_SDMA_MGCG | +			AMD_CG_SUPPORT_SDMA_LS | +			AMD_CG_SUPPORT_BIF_LS | +			AMD_CG_SUPPORT_VCE_MGCG | +			AMD_CG_SUPPORT_UVD_MGCG | +			AMD_CG_SUPPORT_HDP_LS | +			AMD_CG_SUPPORT_HDP_MGCG;  		adev->pg_flags = 0;  		adev->external_rev_id = 0x28;  		break;  	case CHIP_KAVERI:  		adev->cg_flags = -			AMDGPU_CG_SUPPORT_GFX_MGCG | -			AMDGPU_CG_SUPPORT_GFX_MGLS | -			/*AMDGPU_CG_SUPPORT_GFX_CGCG |*/ -			AMDGPU_CG_SUPPORT_GFX_CGLS | -			AMDGPU_CG_SUPPORT_GFX_CGTS | -			AMDGPU_CG_SUPPORT_GFX_CGTS_LS | -			AMDGPU_CG_SUPPORT_GFX_CP_LS | -			AMDGPU_CG_SUPPORT_SDMA_MGCG | -			AMDGPU_CG_SUPPORT_SDMA_LS | -			AMDGPU_CG_SUPPORT_BIF_LS | -			AMDGPU_CG_SUPPORT_VCE_MGCG | -			AMDGPU_CG_SUPPORT_UVD_MGCG | -			AMDGPU_CG_SUPPORT_HDP_LS | -			AMDGPU_CG_SUPPORT_HDP_MGCG; +			AMD_CG_SUPPORT_GFX_MGCG | +			AMD_CG_SUPPORT_GFX_MGLS | +			/*AMD_CG_SUPPORT_GFX_CGCG |*/ +			AMD_CG_SUPPORT_GFX_CGLS | +			AMD_CG_SUPPORT_GFX_CGTS | +			AMD_CG_SUPPORT_GFX_CGTS_LS | +			AMD_CG_SUPPORT_GFX_CP_LS | +			AMD_CG_SUPPORT_SDMA_MGCG | +			AMD_CG_SUPPORT_SDMA_LS | +			AMD_CG_SUPPORT_BIF_LS | +			AMD_CG_SUPPORT_VCE_MGCG | +			AMD_CG_SUPPORT_UVD_MGCG | +			AMD_CG_SUPPORT_HDP_LS | +			AMD_CG_SUPPORT_HDP_MGCG;  		adev->pg_flags = -			/*AMDGPU_PG_SUPPORT_GFX_PG | -			  AMDGPU_PG_SUPPORT_GFX_SMG | -			  AMDGPU_PG_SUPPORT_GFX_DMG |*/ -			AMDGPU_PG_SUPPORT_UVD | -			/*AMDGPU_PG_SUPPORT_VCE | -			  AMDGPU_PG_SUPPORT_CP | -			  AMDGPU_PG_SUPPORT_GDS | -			  AMDGPU_PG_SUPPORT_RLC_SMU_HS | -			  AMDGPU_PG_SUPPORT_ACP | -			  AMDGPU_PG_SUPPORT_SAMU |*/ +			/*AMD_PG_SUPPORT_GFX_PG | +			  AMD_PG_SUPPORT_GFX_SMG | +			  AMD_PG_SUPPORT_GFX_DMG |*/ +			AMD_PG_SUPPORT_UVD | +			/*AMD_PG_SUPPORT_VCE | +			  AMD_PG_SUPPORT_CP | +			  AMD_PG_SUPPORT_GDS | +			  AMD_PG_SUPPORT_RLC_SMU_HS | +			  AMD_PG_SUPPORT_ACP | +			  AMD_PG_SUPPORT_SAMU |*/  			0;  		if (adev->pdev->device == 0x1312 ||  			adev->pdev->device == 0x1316 || @@ -2409,29 +2412,29 @@ static int cik_common_early_init(void *handle)  	case CHIP_KABINI:  	case CHIP_MULLINS:  		adev->cg_flags = -			AMDGPU_CG_SUPPORT_GFX_MGCG | -			AMDGPU_CG_SUPPORT_GFX_MGLS | -			/*AMDGPU_CG_SUPPORT_GFX_CGCG |*/ -			AMDGPU_CG_SUPPORT_GFX_CGLS | -			AMDGPU_CG_SUPPORT_GFX_CGTS | -			AMDGPU_CG_SUPPORT_GFX_CGTS_LS | -			AMDGPU_CG_SUPPORT_GFX_CP_LS | -			AMDGPU_CG_SUPPORT_SDMA_MGCG | -			AMDGPU_CG_SUPPORT_SDMA_LS | -			AMDGPU_CG_SUPPORT_BIF_LS | -			AMDGPU_CG_SUPPORT_VCE_MGCG | -			AMDGPU_CG_SUPPORT_UVD_MGCG | -			AMDGPU_CG_SUPPORT_HDP_LS | -			AMDGPU_CG_SUPPORT_HDP_MGCG; +			AMD_CG_SUPPORT_GFX_MGCG | +			AMD_CG_SUPPORT_GFX_MGLS | +			/*AMD_CG_SUPPORT_GFX_CGCG |*/ +			AMD_CG_SUPPORT_GFX_CGLS | +			AMD_CG_SUPPORT_GFX_CGTS | +			AMD_CG_SUPPORT_GFX_CGTS_LS | +			AMD_CG_SUPPORT_GFX_CP_LS | +			AMD_CG_SUPPORT_SDMA_MGCG | +			AMD_CG_SUPPORT_SDMA_LS | +			AMD_CG_SUPPORT_BIF_LS | +			AMD_CG_SUPPORT_VCE_MGCG | +			AMD_CG_SUPPORT_UVD_MGCG | +			AMD_CG_SUPPORT_HDP_LS | +			AMD_CG_SUPPORT_HDP_MGCG;  		adev->pg_flags = -			/*AMDGPU_PG_SUPPORT_GFX_PG | -			  AMDGPU_PG_SUPPORT_GFX_SMG | */ -			AMDGPU_PG_SUPPORT_UVD | -			/*AMDGPU_PG_SUPPORT_VCE | -			  AMDGPU_PG_SUPPORT_CP | -			  AMDGPU_PG_SUPPORT_GDS | -			  AMDGPU_PG_SUPPORT_RLC_SMU_HS | -			  AMDGPU_PG_SUPPORT_SAMU |*/ +			/*AMD_PG_SUPPORT_GFX_PG | +			  AMD_PG_SUPPORT_GFX_SMG | */ +			AMD_PG_SUPPORT_UVD | +			/*AMD_PG_SUPPORT_VCE | +			  AMD_PG_SUPPORT_CP | +			  AMD_PG_SUPPORT_GDS | +			  AMD_PG_SUPPORT_RLC_SMU_HS | +			  AMD_PG_SUPPORT_SAMU |*/  			0;  		if (adev->asic_type == CHIP_KABINI) {  			if (adev->rev_id == 0) diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index 5f712ceddf08..c55ecf0ea845 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c @@ -885,7 +885,7 @@ static void cik_enable_sdma_mgcg(struct amdgpu_device *adev,  {  	u32 orig, data; -	if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_SDMA_MGCG)) { +	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_SDMA_MGCG)) {  		WREG32(mmSDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, 0x00000100);  		WREG32(mmSDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, 0x00000100);  	} else { @@ -906,7 +906,7 @@ static void cik_enable_sdma_mgls(struct amdgpu_device *adev,  {  	u32 orig, data; -	if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_SDMA_LS)) { +	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_SDMA_LS)) {  		orig = data = RREG32(mmSDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);  		data |= 0x100;  		if (orig != data) diff --git a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c index 4dd17f2dd905..9056355309d1 100644 --- a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c @@ -445,13 +445,13 @@ static int cz_dpm_init(struct amdgpu_device *adev)  	pi->gfx_pg_threshold = 500;  	pi->caps_fps = true;  	/* uvd */ -	pi->caps_uvd_pg = (adev->pg_flags & AMDGPU_PG_SUPPORT_UVD) ? true : false; +	pi->caps_uvd_pg = (adev->pg_flags & AMD_PG_SUPPORT_UVD) ? true : false;  	pi->caps_uvd_dpm = true;  	/* vce */ -	pi->caps_vce_pg = (adev->pg_flags & AMDGPU_PG_SUPPORT_VCE) ? true : false; +	pi->caps_vce_pg = (adev->pg_flags & AMD_PG_SUPPORT_VCE) ? true : false;  	pi->caps_vce_dpm = true;  	/* acp */ -	pi->caps_acp_pg = (adev->pg_flags & AMDGPU_PG_SUPPORT_ACP) ? true : false; +	pi->caps_acp_pg = (adev->pg_flags & AMD_PG_SUPPORT_ACP) ? true : false;  	pi->caps_acp_dpm = true;  	pi->caps_stable_power_state = false; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 72793f93e2fc..7732059ae30f 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c @@ -4109,7 +4109,7 @@ static void gfx_v7_0_enable_cgcg(struct amdgpu_device *adev, bool enable)  	orig = data = RREG32(mmRLC_CGCG_CGLS_CTRL); -	if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_CGCG)) { +	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {  		gfx_v7_0_enable_gui_idle_interrupt(adev, true);  		tmp = gfx_v7_0_halt_rlc(adev); @@ -4147,9 +4147,9 @@ static void gfx_v7_0_enable_mgcg(struct amdgpu_device *adev, bool enable)  {  	u32 data, orig, tmp = 0; -	if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_MGCG)) { -		if (adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_MGLS) { -			if (adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_CP_LS) { +	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) { +		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) { +			if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) {  				orig = data = RREG32(mmCP_MEM_SLP_CNTL);  				data |= CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK;  				if (orig != data) @@ -4176,14 +4176,14 @@ static void gfx_v7_0_enable_mgcg(struct amdgpu_device *adev, bool enable)  		gfx_v7_0_update_rlc(adev, tmp); -		if (adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_CGTS) { +		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGTS) {  			orig = data = RREG32(mmCGTS_SM_CTRL_REG);  			data &= ~CGTS_SM_CTRL_REG__SM_MODE_MASK;  			data |= (0x2 << CGTS_SM_CTRL_REG__SM_MODE__SHIFT);  			data |= CGTS_SM_CTRL_REG__SM_MODE_ENABLE_MASK;  			data &= ~CGTS_SM_CTRL_REG__OVERRIDE_MASK; -			if ((adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_MGLS) && -			    (adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_CGTS_LS)) +			if ((adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) && +			    (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGTS_LS))  				data &= ~CGTS_SM_CTRL_REG__LS_OVERRIDE_MASK;  			data &= ~CGTS_SM_CTRL_REG__ON_MONITOR_ADD_MASK;  			data |= CGTS_SM_CTRL_REG__ON_MONITOR_ADD_EN_MASK; @@ -4249,7 +4249,7 @@ static void gfx_v7_0_enable_sclk_slowdown_on_pu(struct amdgpu_device *adev,  	u32 data, orig;  	orig = data = RREG32(mmRLC_PG_CNTL); -	if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_RLC_SMU_HS)) +	if (enable && (adev->pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS))  		data |= RLC_PG_CNTL__SMU_CLK_SLOWDOWN_ON_PU_ENABLE_MASK;  	else  		data &= ~RLC_PG_CNTL__SMU_CLK_SLOWDOWN_ON_PU_ENABLE_MASK; @@ -4263,7 +4263,7 @@ static void gfx_v7_0_enable_sclk_slowdown_on_pd(struct amdgpu_device *adev,  	u32 data, orig;  	orig = data = RREG32(mmRLC_PG_CNTL); -	if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_RLC_SMU_HS)) +	if (enable && (adev->pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS))  		data |= RLC_PG_CNTL__SMU_CLK_SLOWDOWN_ON_PD_ENABLE_MASK;  	else  		data &= ~RLC_PG_CNTL__SMU_CLK_SLOWDOWN_ON_PD_ENABLE_MASK; @@ -4276,7 +4276,7 @@ static void gfx_v7_0_enable_cp_pg(struct amdgpu_device *adev, bool enable)  	u32 data, orig;  	orig = data = RREG32(mmRLC_PG_CNTL); -	if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_CP)) +	if (enable && (adev->pg_flags & AMD_PG_SUPPORT_CP))  		data &= ~0x8000;  	else  		data |= 0x8000; @@ -4289,7 +4289,7 @@ static void gfx_v7_0_enable_gds_pg(struct amdgpu_device *adev, bool enable)  	u32 data, orig;  	orig = data = RREG32(mmRLC_PG_CNTL); -	if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_GDS)) +	if (enable && (adev->pg_flags & AMD_PG_SUPPORT_GDS))  		data &= ~0x2000;  	else  		data |= 0x2000; @@ -4370,7 +4370,7 @@ static void gfx_v7_0_enable_gfx_cgpg(struct amdgpu_device *adev,  {  	u32 data, orig; -	if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_PG)) { +	if (enable && (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG)) {  		orig = data = RREG32(mmRLC_PG_CNTL);  		data |= RLC_PG_CNTL__GFX_POWER_GATING_ENABLE_MASK;  		if (orig != data) @@ -4442,7 +4442,7 @@ static void gfx_v7_0_enable_gfx_static_mgpg(struct amdgpu_device *adev,  	u32 data, orig;  	orig = data = RREG32(mmRLC_PG_CNTL); -	if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_SMG)) +	if (enable && (adev->pg_flags & AMD_PG_SUPPORT_GFX_SMG))  		data |= RLC_PG_CNTL__STATIC_PER_CU_PG_ENABLE_MASK;  	else  		data &= ~RLC_PG_CNTL__STATIC_PER_CU_PG_ENABLE_MASK; @@ -4456,7 +4456,7 @@ static void gfx_v7_0_enable_gfx_dynamic_mgpg(struct amdgpu_device *adev,  	u32 data, orig;  	orig = data = RREG32(mmRLC_PG_CNTL); -	if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_DMG)) +	if (enable && (adev->pg_flags & AMD_PG_SUPPORT_GFX_DMG))  		data |= RLC_PG_CNTL__DYN_PER_CU_PG_ENABLE_MASK;  	else  		data &= ~RLC_PG_CNTL__DYN_PER_CU_PG_ENABLE_MASK; @@ -4623,15 +4623,15 @@ static void gfx_v7_0_get_csb_buffer(struct amdgpu_device *adev,  static void gfx_v7_0_init_pg(struct amdgpu_device *adev)  { -	if (adev->pg_flags & (AMDGPU_PG_SUPPORT_GFX_PG | -			      AMDGPU_PG_SUPPORT_GFX_SMG | -			      AMDGPU_PG_SUPPORT_GFX_DMG | -			      AMDGPU_PG_SUPPORT_CP | -			      AMDGPU_PG_SUPPORT_GDS | -			      AMDGPU_PG_SUPPORT_RLC_SMU_HS)) { +	if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG | +			      AMD_PG_SUPPORT_GFX_SMG | +			      AMD_PG_SUPPORT_GFX_DMG | +			      AMD_PG_SUPPORT_CP | +			      AMD_PG_SUPPORT_GDS | +			      AMD_PG_SUPPORT_RLC_SMU_HS)) {  		gfx_v7_0_enable_sclk_slowdown_on_pu(adev, true);  		gfx_v7_0_enable_sclk_slowdown_on_pd(adev, true); -		if (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_PG) { +		if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) {  			gfx_v7_0_init_gfx_cgpg(adev);  			gfx_v7_0_enable_cp_pg(adev, true);  			gfx_v7_0_enable_gds_pg(adev, true); @@ -4643,14 +4643,14 @@ static void gfx_v7_0_init_pg(struct amdgpu_device *adev)  static void gfx_v7_0_fini_pg(struct amdgpu_device *adev)  { -	if (adev->pg_flags & (AMDGPU_PG_SUPPORT_GFX_PG | -			      AMDGPU_PG_SUPPORT_GFX_SMG | -			      AMDGPU_PG_SUPPORT_GFX_DMG | -			      AMDGPU_PG_SUPPORT_CP | -			      AMDGPU_PG_SUPPORT_GDS | -			      AMDGPU_PG_SUPPORT_RLC_SMU_HS)) { +	if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG | +			      AMD_PG_SUPPORT_GFX_SMG | +			      AMD_PG_SUPPORT_GFX_DMG | +			      AMD_PG_SUPPORT_CP | +			      AMD_PG_SUPPORT_GDS | +			      AMD_PG_SUPPORT_RLC_SMU_HS)) {  		gfx_v7_0_update_gfx_pg(adev, false); -		if (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_PG) { +		if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) {  			gfx_v7_0_enable_cp_pg(adev, false);  			gfx_v7_0_enable_gds_pg(adev, false);  		} @@ -4738,6 +4738,22 @@ static int gfx_v7_0_early_init(void *handle)  	return 0;  } +static int gfx_v7_0_late_init(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int r; + +	r = amdgpu_irq_get(adev, &adev->gfx.priv_reg_irq, 0); +	if (r) +		return r; + +	r = amdgpu_irq_get(adev, &adev->gfx.priv_inst_irq, 0); +	if (r) +		return r; + +	return 0; +} +  static int gfx_v7_0_sw_init(void *handle)  {  	struct amdgpu_ring *ring; @@ -4890,6 +4906,8 @@ static int gfx_v7_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0); +	amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);  	gfx_v7_0_cp_enable(adev, false);  	gfx_v7_0_rlc_stop(adev);  	gfx_v7_0_fini_pg(adev); @@ -5509,14 +5527,14 @@ static int gfx_v7_0_set_powergating_state(void *handle,  	if (state == AMD_PG_STATE_GATE)  		gate = true; -	if (adev->pg_flags & (AMDGPU_PG_SUPPORT_GFX_PG | -			      AMDGPU_PG_SUPPORT_GFX_SMG | -			      AMDGPU_PG_SUPPORT_GFX_DMG | -			      AMDGPU_PG_SUPPORT_CP | -			      AMDGPU_PG_SUPPORT_GDS | -			      AMDGPU_PG_SUPPORT_RLC_SMU_HS)) { +	if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG | +			      AMD_PG_SUPPORT_GFX_SMG | +			      AMD_PG_SUPPORT_GFX_DMG | +			      AMD_PG_SUPPORT_CP | +			      AMD_PG_SUPPORT_GDS | +			      AMD_PG_SUPPORT_RLC_SMU_HS)) {  		gfx_v7_0_update_gfx_pg(adev, gate); -		if (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_PG) { +		if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) {  			gfx_v7_0_enable_cp_pg(adev, gate);  			gfx_v7_0_enable_gds_pg(adev, gate);  		} @@ -5527,7 +5545,7 @@ static int gfx_v7_0_set_powergating_state(void *handle,  const struct amd_ip_funcs gfx_v7_0_ip_funcs = {  	.early_init = gfx_v7_0_early_init, -	.late_init = NULL, +	.late_init = gfx_v7_0_late_init,  	.sw_init = gfx_v7_0_sw_init,  	.sw_fini = gfx_v7_0_sw_fini,  	.hw_init = gfx_v7_0_hw_init, diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 13235d84e5a6..1c40bd90afbb 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c @@ -111,7 +111,6 @@ MODULE_FIRMWARE("amdgpu/topaz_ce.bin");  MODULE_FIRMWARE("amdgpu/topaz_pfp.bin");  MODULE_FIRMWARE("amdgpu/topaz_me.bin");  MODULE_FIRMWARE("amdgpu/topaz_mec.bin"); -MODULE_FIRMWARE("amdgpu/topaz_mec2.bin");  MODULE_FIRMWARE("amdgpu/topaz_rlc.bin");  MODULE_FIRMWARE("amdgpu/fiji_ce.bin"); @@ -828,7 +827,8 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)  	adev->gfx.mec_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);  	adev->gfx.mec_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); -	if (adev->asic_type != CHIP_STONEY) { +	if ((adev->asic_type != CHIP_STONEY) && +	    (adev->asic_type != CHIP_TOPAZ)) {  		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name);  		err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);  		if (!err) { @@ -3851,10 +3851,16 @@ static int gfx_v8_0_cp_resume(struct amdgpu_device *adev)  			if (r)  				return -EINVAL; -			r = adev->smu.smumgr_funcs->check_fw_load_finish(adev, -							AMDGPU_UCODE_ID_CP_MEC1); -			if (r) -				return -EINVAL; +			if (adev->asic_type == CHIP_TOPAZ) { +				r = gfx_v8_0_cp_compute_load_microcode(adev); +				if (r) +					return r; +			} else { +				r = adev->smu.smumgr_funcs->check_fw_load_finish(adev, +										 AMDGPU_UCODE_ID_CP_MEC1); +				if (r) +					return -EINVAL; +			}  		}  	} @@ -3901,6 +3907,8 @@ static int gfx_v8_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0); +	amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);  	gfx_v8_0_cp_enable(adev, false);  	gfx_v8_0_rlc_stop(adev);  	gfx_v8_0_cp_compute_fini(adev); @@ -4186,7 +4194,18 @@ static int gfx_v8_0_soft_reset(void *handle)  		gfx_v8_0_cp_gfx_enable(adev, false);  		/* Disable MEC parsing/prefetching */ -		/* XXX todo */ +		gfx_v8_0_cp_compute_enable(adev, false); + +		if (grbm_soft_reset || srbm_soft_reset) { +			tmp = RREG32(mmGMCON_DEBUG); +			tmp = REG_SET_FIELD(tmp, +					    GMCON_DEBUG, GFX_STALL, 1); +			tmp = REG_SET_FIELD(tmp, +					    GMCON_DEBUG, GFX_CLEAR, 1); +			WREG32(mmGMCON_DEBUG, tmp); + +			udelay(50); +		}  		if (grbm_soft_reset) {  			tmp = RREG32(mmGRBM_SOFT_RESET); @@ -4215,6 +4234,16 @@ static int gfx_v8_0_soft_reset(void *handle)  			WREG32(mmSRBM_SOFT_RESET, tmp);  			tmp = RREG32(mmSRBM_SOFT_RESET);  		} + +		if (grbm_soft_reset || srbm_soft_reset) { +			tmp = RREG32(mmGMCON_DEBUG); +			tmp = REG_SET_FIELD(tmp, +					    GMCON_DEBUG, GFX_STALL, 0); +			tmp = REG_SET_FIELD(tmp, +					    GMCON_DEBUG, GFX_CLEAR, 0); +			WREG32(mmGMCON_DEBUG, tmp); +		} +  		/* Wait a little for things to settle down */  		udelay(50);  		gfx_v8_0_print_status((void *)adev); @@ -4308,6 +4337,14 @@ static int gfx_v8_0_late_init(void *handle)  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;  	int r; +	r = amdgpu_irq_get(adev, &adev->gfx.priv_reg_irq, 0); +	if (r) +		return r; + +	r = amdgpu_irq_get(adev, &adev->gfx.priv_inst_irq, 0); +	if (r) +		return r; +  	/* requires IBs so do in late init after IB pool is initialized */  	r = gfx_v8_0_do_edc_gpr_workarounds(adev);  	if (r) @@ -4958,7 +4995,7 @@ static int gfx_v8_0_set_priv_reg_fault_state(struct amdgpu_device *adev,  	case AMDGPU_IRQ_STATE_ENABLE:  		cp_int_cntl = RREG32(mmCP_INT_CNTL_RING0);  		cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0, -					    PRIV_REG_INT_ENABLE, 0); +					    PRIV_REG_INT_ENABLE, 1);  		WREG32(mmCP_INT_CNTL_RING0, cp_int_cntl);  		break;  	default: diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c index 3f956065d069..b8060795b27b 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c @@ -42,9 +42,39 @@ static void gmc_v7_0_set_irq_funcs(struct amdgpu_device *adev);  MODULE_FIRMWARE("radeon/bonaire_mc.bin");  MODULE_FIRMWARE("radeon/hawaii_mc.bin"); +MODULE_FIRMWARE("amdgpu/topaz_mc.bin"); + +static const u32 golden_settings_iceland_a11[] = +{ +	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff, +	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff, +	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff, +	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff +}; + +static const u32 iceland_mgcg_cgcg_init[] = +{ +	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104 +}; + +static void gmc_v7_0_init_golden_registers(struct amdgpu_device *adev) +{ +	switch (adev->asic_type) { +	case CHIP_TOPAZ: +		amdgpu_program_register_sequence(adev, +						 iceland_mgcg_cgcg_init, +						 (const u32)ARRAY_SIZE(iceland_mgcg_cgcg_init)); +		amdgpu_program_register_sequence(adev, +						 golden_settings_iceland_a11, +						 (const u32)ARRAY_SIZE(golden_settings_iceland_a11)); +		break; +	default: +		break; +	} +}  /** - * gmc8_mc_wait_for_idle - wait for MC idle callback. + * gmc7_mc_wait_for_idle - wait for MC idle callback.   *   * @adev: amdgpu_device pointer   * @@ -132,13 +162,20 @@ static int gmc_v7_0_init_microcode(struct amdgpu_device *adev)  	case CHIP_HAWAII:  		chip_name = "hawaii";  		break; +	case CHIP_TOPAZ: +		chip_name = "topaz"; +		break;  	case CHIP_KAVERI:  	case CHIP_KABINI:  		return 0;  	default: BUG();  	} -	snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); +	if (adev->asic_type == CHIP_TOPAZ) +		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mc.bin", chip_name); +	else +		snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); +  	err = request_firmware(&adev->mc.fw, fw_name, adev->dev);  	if (err)  		goto out; @@ -755,7 +792,7 @@ static void gmc_v7_0_enable_mc_ls(struct amdgpu_device *adev,  	for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {  		orig = data = RREG32(mc_cg_registers[i]); -		if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_MC_LS)) +		if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_LS))  			data |= mc_cg_ls_en[i];  		else  			data &= ~mc_cg_ls_en[i]; @@ -772,7 +809,7 @@ static void gmc_v7_0_enable_mc_mgcg(struct amdgpu_device *adev,  	for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {  		orig = data = RREG32(mc_cg_registers[i]); -		if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_MC_MGCG)) +		if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG))  			data |= mc_cg_en[i];  		else  			data &= ~mc_cg_en[i]; @@ -788,7 +825,7 @@ static void gmc_v7_0_enable_bif_mgls(struct amdgpu_device *adev,  	orig = data = RREG32_PCIE(ixPCIE_CNTL2); -	if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_BIF_LS)) { +	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_BIF_LS)) {  		data = REG_SET_FIELD(data, PCIE_CNTL2, SLV_MEM_LS_EN, 1);  		data = REG_SET_FIELD(data, PCIE_CNTL2, MST_MEM_LS_EN, 1);  		data = REG_SET_FIELD(data, PCIE_CNTL2, REPLAY_MEM_LS_EN, 1); @@ -811,7 +848,7 @@ static void gmc_v7_0_enable_hdp_mgcg(struct amdgpu_device *adev,  	orig = data = RREG32(mmHDP_HOST_PATH_CNTL); -	if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_HDP_MGCG)) +	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_MGCG))  		data = REG_SET_FIELD(data, HDP_HOST_PATH_CNTL, CLOCK_GATING_DIS, 0);  	else  		data = REG_SET_FIELD(data, HDP_HOST_PATH_CNTL, CLOCK_GATING_DIS, 1); @@ -827,7 +864,7 @@ static void gmc_v7_0_enable_hdp_ls(struct amdgpu_device *adev,  	orig = data = RREG32(mmHDP_MEM_POWER_LS); -	if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_HDP_LS)) +	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS))  		data = REG_SET_FIELD(data, HDP_MEM_POWER_LS, LS_ENABLE, 1);  	else  		data = REG_SET_FIELD(data, HDP_MEM_POWER_LS, LS_ENABLE, 0); @@ -984,6 +1021,8 @@ static int gmc_v7_0_hw_init(void *handle)  	int r;  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	gmc_v7_0_init_golden_registers(adev); +  	gmc_v7_0_mc_program(adev);  	if (!(adev->flags & AMD_IS_APU)) { diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index c0c9a0101eb4..3efd45546241 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c @@ -42,9 +42,7 @@  static void gmc_v8_0_set_gart_funcs(struct amdgpu_device *adev);  static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev); -MODULE_FIRMWARE("amdgpu/topaz_mc.bin");  MODULE_FIRMWARE("amdgpu/tonga_mc.bin"); -MODULE_FIRMWARE("amdgpu/fiji_mc.bin");  static const u32 golden_settings_tonga_a11[] =  { @@ -75,19 +73,6 @@ static const u32 fiji_mgcg_cgcg_init[] =  	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104  }; -static const u32 golden_settings_iceland_a11[] = -{ -	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff, -	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff, -	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff, -	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff -}; - -static const u32 iceland_mgcg_cgcg_init[] = -{ -	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104 -}; -  static const u32 cz_mgcg_cgcg_init[] =  {  	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104 @@ -102,14 +87,6 @@ static const u32 stoney_mgcg_cgcg_init[] =  static void gmc_v8_0_init_golden_registers(struct amdgpu_device *adev)  {  	switch (adev->asic_type) { -	case CHIP_TOPAZ: -		amdgpu_program_register_sequence(adev, -						 iceland_mgcg_cgcg_init, -						 (const u32)ARRAY_SIZE(iceland_mgcg_cgcg_init)); -		amdgpu_program_register_sequence(adev, -						 golden_settings_iceland_a11, -						 (const u32)ARRAY_SIZE(golden_settings_iceland_a11)); -		break;  	case CHIP_FIJI:  		amdgpu_program_register_sequence(adev,  						 fiji_mgcg_cgcg_init, @@ -229,15 +206,10 @@ static int gmc_v8_0_init_microcode(struct amdgpu_device *adev)  	DRM_DEBUG("\n");  	switch (adev->asic_type) { -	case CHIP_TOPAZ: -		chip_name = "topaz"; -		break;  	case CHIP_TONGA:  		chip_name = "tonga";  		break;  	case CHIP_FIJI: -		chip_name = "fiji"; -		break;  	case CHIP_CARRIZO:  	case CHIP_STONEY:  		return 0; @@ -1007,7 +979,7 @@ static int gmc_v8_0_hw_init(void *handle)  	gmc_v8_0_mc_program(adev); -	if (!(adev->flags & AMD_IS_APU)) { +	if (adev->asic_type == CHIP_TONGA) {  		r = gmc_v8_0_mc_load_microcode(adev);  		if (r) {  			DRM_ERROR("Failed to load MC firmware!\n"); diff --git a/drivers/gpu/drm/amd/amdgpu/iceland_smc.c b/drivers/gpu/drm/amd/amdgpu/iceland_smc.c index 966d4b2ed9da..090486c18249 100644 --- a/drivers/gpu/drm/amd/amdgpu/iceland_smc.c +++ b/drivers/gpu/drm/amd/amdgpu/iceland_smc.c @@ -432,7 +432,7 @@ static uint32_t iceland_smu_get_mask_for_fw_type(uint32_t fw_type)  		case AMDGPU_UCODE_ID_CP_ME:  			return UCODE_ID_CP_ME_MASK;  		case AMDGPU_UCODE_ID_CP_MEC1: -			return UCODE_ID_CP_MEC_MASK | UCODE_ID_CP_MEC_JT1_MASK | UCODE_ID_CP_MEC_JT2_MASK; +			return UCODE_ID_CP_MEC_MASK | UCODE_ID_CP_MEC_JT1_MASK;  		case AMDGPU_UCODE_ID_CP_MEC2:  			return UCODE_ID_CP_MEC_MASK;  		case AMDGPU_UCODE_ID_RLC_G: @@ -522,12 +522,6 @@ static int iceland_smu_request_load_fw(struct amdgpu_device *adev)  		return -EINVAL;  	} -	if (iceland_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_MEC_JT2, -			&toc->entry[toc->num_entries++])) { -		DRM_ERROR("Failed to get firmware entry for MEC_JT2\n"); -		return -EINVAL; -	} -  	if (iceland_smu_populate_single_firmware_entry(adev, UCODE_ID_SDMA0,  			&toc->entry[toc->num_entries++])) {  		DRM_ERROR("Failed to get firmware entry for SDMA0\n"); @@ -550,8 +544,8 @@ static int iceland_smu_request_load_fw(struct amdgpu_device *adev)  			UCODE_ID_CP_ME_MASK |  			UCODE_ID_CP_PFP_MASK |  			UCODE_ID_CP_MEC_MASK | -			UCODE_ID_CP_MEC_JT1_MASK | -			UCODE_ID_CP_MEC_JT2_MASK; +			UCODE_ID_CP_MEC_JT1_MASK; +  	if (iceland_send_msg_to_smc_with_parameter_without_waiting(adev, PPSMC_MSG_LoadUcodes, fw_to_load)) {  		DRM_ERROR("Fail to request SMU load ucode\n"); diff --git a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c index 7e9154c7f1db..654d76723bc3 100644 --- a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c @@ -2859,11 +2859,11 @@ static int kv_dpm_init(struct amdgpu_device *adev)  	pi->voltage_drop_t = 0;  	pi->caps_sclk_throttle_low_notification = false;  	pi->caps_fps = false; /* true? */ -	pi->caps_uvd_pg = (adev->pg_flags & AMDGPU_PG_SUPPORT_UVD) ? true : false; +	pi->caps_uvd_pg = (adev->pg_flags & AMD_PG_SUPPORT_UVD) ? true : false;  	pi->caps_uvd_dpm = true; -	pi->caps_vce_pg = (adev->pg_flags & AMDGPU_PG_SUPPORT_VCE) ? true : false; -	pi->caps_samu_pg = (adev->pg_flags & AMDGPU_PG_SUPPORT_SAMU) ? true : false; -	pi->caps_acp_pg = (adev->pg_flags & AMDGPU_PG_SUPPORT_ACP) ? true : false; +	pi->caps_vce_pg = (adev->pg_flags & AMD_PG_SUPPORT_VCE) ? true : false; +	pi->caps_samu_pg = (adev->pg_flags & AMD_PG_SUPPORT_SAMU) ? true : false; +	pi->caps_acp_pg = (adev->pg_flags & AMD_PG_SUPPORT_ACP) ? true : false;  	pi->caps_stable_p_state = false;  	ret = kv_parse_sys_info_table(adev); diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_dpm.c b/drivers/gpu/drm/amd/amdgpu/tonga_dpm.c index f4a1346525fe..0497784b3652 100644 --- a/drivers/gpu/drm/amd/amdgpu/tonga_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/tonga_dpm.c @@ -122,25 +122,12 @@ static int tonga_dpm_hw_fini(void *handle)  static int tonga_dpm_suspend(void *handle)  { -	return 0; +	return tonga_dpm_hw_fini(handle);  }  static int tonga_dpm_resume(void *handle)  { -	int ret; -	struct amdgpu_device *adev = (struct amdgpu_device *)handle; - -	mutex_lock(&adev->pm.mutex); - -	ret = tonga_smu_start(adev); -	if (ret) { -		DRM_ERROR("SMU start failed\n"); -		goto fail; -	} - -fail: -	mutex_unlock(&adev->pm.mutex); -	return ret; +	return tonga_dpm_hw_init(handle);  }  static int tonga_dpm_set_clockgating_state(void *handle, diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c index 5e9f73af83a8..fbd3767671bb 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c @@ -611,7 +611,7 @@ static void uvd_v4_2_enable_mgcg(struct amdgpu_device *adev,  {  	u32 orig, data; -	if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_UVD_MGCG)) { +	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) {  		data = RREG32_UVD_CTX(ixUVD_CGC_MEM_CTRL);  		data = 0xfff;  		WREG32_UVD_CTX(ixUVD_CGC_MEM_CTRL, data); @@ -830,6 +830,9 @@ static int uvd_v4_2_set_clockgating_state(void *handle,  	bool gate = false;  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) +		return 0; +  	if (state == AMD_CG_STATE_GATE)  		gate = true; @@ -848,7 +851,10 @@ static int uvd_v4_2_set_powergating_state(void *handle,  	 * revisit this when there is a cleaner line between  	 * the smc and the hw blocks  	 */ -	 struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	if (!(adev->pg_flags & AMD_PG_SUPPORT_UVD)) +		return 0;  	if (state == AMD_PG_STATE_GATE) {  		uvd_v4_2_stop(adev); diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c index 38864f562981..57f1c5bf3bf1 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c @@ -774,6 +774,11 @@ static int uvd_v5_0_process_interrupt(struct amdgpu_device *adev,  static int uvd_v5_0_set_clockgating_state(void *handle,  					  enum amd_clockgating_state state)  { +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) +		return 0; +  	return 0;  } @@ -789,6 +794,9 @@ static int uvd_v5_0_set_powergating_state(void *handle,  	 */  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	if (!(adev->pg_flags & AMD_PG_SUPPORT_UVD)) +		return 0; +  	if (state == AMD_PG_STATE_GATE) {  		uvd_v5_0_stop(adev);  		return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c index 3d5913926436..0b365b7651ff 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c @@ -532,7 +532,7 @@ static int uvd_v6_0_start(struct amdgpu_device *adev)  	uvd_v6_0_mc_resume(adev);  	/* Set dynamic clock gating in S/W control mode */ -	if (adev->cg_flags & AMDGPU_CG_SUPPORT_UVD_MGCG) { +	if (adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG) {  		if (adev->flags & AMD_IS_APU)  			cz_set_uvd_clock_gating_branches(adev, false);  		else @@ -1000,7 +1000,7 @@ static int uvd_v6_0_set_clockgating_state(void *handle,  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;  	bool enable = (state == AMD_CG_STATE_GATE) ? true : false; -	if (!(adev->cg_flags & AMDGPU_CG_SUPPORT_UVD_MGCG)) +	if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG))  		return 0;  	if (enable) { @@ -1030,6 +1030,9 @@ static int uvd_v6_0_set_powergating_state(void *handle,  	 */  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	if (!(adev->pg_flags & AMD_PG_SUPPORT_UVD)) +		return 0; +  	if (state == AMD_PG_STATE_GATE) {  		uvd_v6_0_stop(adev);  		return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c index 52ac7a8f1e58..a822edacfa95 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c @@ -373,7 +373,7 @@ static void vce_v2_0_enable_mgcg(struct amdgpu_device *adev, bool enable)  {  	bool sw_cg = false; -	if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_VCE_MGCG)) { +	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG)) {  		if (sw_cg)  			vce_v2_0_set_sw_cg(adev, true);  		else @@ -608,6 +608,9 @@ static int vce_v2_0_set_powergating_state(void *handle,  	 */  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	if (!(adev->pg_flags & AMD_PG_SUPPORT_VCE)) +		return 0; +  	if (state == AMD_PG_STATE_GATE)  		/* XXX do we need a vce_v2_0_stop()? */  		return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c index e99af81e4aec..d662fa9f9091 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c @@ -277,7 +277,7 @@ static int vce_v3_0_start(struct amdgpu_device *adev)  		WREG32_P(mmVCE_STATUS, 0, ~1);  		/* Set Clock-Gating off */ -		if (adev->cg_flags & AMDGPU_CG_SUPPORT_VCE_MGCG) +		if (adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG)  			vce_v3_0_set_vce_sw_clock_gating(adev, false);  		if (r) { @@ -676,7 +676,7 @@ static int vce_v3_0_set_clockgating_state(void *handle,  	bool enable = (state == AMD_CG_STATE_GATE) ? true : false;  	int i; -	if (!(adev->cg_flags & AMDGPU_CG_SUPPORT_VCE_MGCG)) +	if (!(adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG))  		return 0;  	mutex_lock(&adev->grbm_idx_mutex); @@ -728,6 +728,9 @@ static int vce_v3_0_set_powergating_state(void *handle,  	 */  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	if (!(adev->pg_flags & AMD_PG_SUPPORT_VCE)) +		return 0; +  	if (state == AMD_PG_STATE_GATE)  		/* XXX do we need a vce_v3_0_stop()? */  		return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c index 652e76644c31..0d14d108a6c4 100644 --- a/drivers/gpu/drm/amd/amdgpu/vi.c +++ b/drivers/gpu/drm/amd/amdgpu/vi.c @@ -61,6 +61,7 @@  #include "vi.h"  #include "vi_dpm.h"  #include "gmc_v8_0.h" +#include "gmc_v7_0.h"  #include "gfx_v8_0.h"  #include "sdma_v2_4.h"  #include "sdma_v3_0.h" @@ -1109,10 +1110,10 @@ static const struct amdgpu_ip_block_version topaz_ip_blocks[] =  	},  	{  		.type = AMD_IP_BLOCK_TYPE_GMC, -		.major = 8, -		.minor = 0, +		.major = 7, +		.minor = 4,  		.rev = 0, -		.funcs = &gmc_v8_0_ip_funcs, +		.funcs = &gmc_v7_0_ip_funcs,  	},  	{  		.type = AMD_IP_BLOCK_TYPE_IH, @@ -1442,8 +1443,7 @@ static int vi_common_early_init(void *handle)  		break;  	case CHIP_FIJI:  		adev->has_uvd = true; -		adev->cg_flags = AMDGPU_CG_SUPPORT_UVD_MGCG | -				AMDGPU_CG_SUPPORT_VCE_MGCG; +		adev->cg_flags = 0;  		adev->pg_flags = 0;  		adev->external_rev_id = adev->rev_id + 0x3c;  		break; @@ -1457,8 +1457,7 @@ static int vi_common_early_init(void *handle)  	case CHIP_STONEY:  		adev->has_uvd = true;  		adev->cg_flags = 0; -		/* Disable UVD pg */ -		adev->pg_flags = /* AMDGPU_PG_SUPPORT_UVD | */AMDGPU_PG_SUPPORT_VCE; +		adev->pg_flags = 0;  		adev->external_rev_id = adev->rev_id + 0x1;  		break;  	default: | 
