diff options
Diffstat (limited to 'drivers/gpu/drm/amd')
42 files changed, 570 insertions, 350 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 82edf95b7740..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; @@ -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_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c index 89c3dd62ba21..119cdc2c43e7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c @@ -77,7 +77,7 @@ void amdgpu_connector_hotplug(struct drm_connector *connector)  			} else if (amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) {  				/* Don't try to start link training before we  				 * have the dpcd */ -				if (!amdgpu_atombios_dp_get_dpcd(amdgpu_connector)) +				if (amdgpu_atombios_dp_get_dpcd(amdgpu_connector))  					return;  				/* set it to OFF so that drm_helper_connector_dpms() 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..1846d65b7285 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. @@ -112,12 +112,24 @@ static void amdgpu_flip_work_func(struct work_struct *__work)  			break;  		/* 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; +		} +		spin_unlock_irqrestore(&crtc->dev->event_lock, flags);  		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_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 a2a16acee34d..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, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 7d8d84eaea4a..95a4a25d8df9 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,11 +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;  	/* wait for the rings to drain */  	for (i = 0; i < AMDGPU_MAX_RINGS; i++) { @@ -655,6 +664,12 @@ force:  	amdgpu_dpm_post_set_power_state(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; +  	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 b9d0d55f6b47..3cb6d6c413c7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c @@ -143,8 +143,10 @@ static int amdgpu_pp_late_init(void *handle)  					adev->powerplay.pp_handle);  #ifdef CONFIG_DRM_AMD_POWERPLAY -	if (adev->pp_enabled) +	if (adev->pp_enabled) {  		amdgpu_pm_sysfs_init(adev); +		amdgpu_dpm_dispatch_task(adev, AMD_PP_EVENT_COMPLETE_INIT, NULL, NULL); +	}  #endif  	return ret;  } 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/atombios_dp.c b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c index 21aacc1f45c1..bf731e9f643e 100644 --- a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c +++ b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c @@ -265,15 +265,27 @@ static int amdgpu_atombios_dp_get_dp_link_config(struct drm_connector *connector  	unsigned max_lane_num = drm_dp_max_lane_count(dpcd);  	unsigned lane_num, i, max_pix_clock; -	for (lane_num = 1; lane_num <= max_lane_num; lane_num <<= 1) { -		for (i = 0; i < ARRAY_SIZE(link_rates) && link_rates[i] <= max_link_rate; i++) { -			max_pix_clock = (lane_num * link_rates[i] * 8) / bpp; +	if (amdgpu_connector_encoder_get_dp_bridge_encoder_id(connector) == +	    ENCODER_OBJECT_ID_NUTMEG) { +		for (lane_num = 1; lane_num <= max_lane_num; lane_num <<= 1) { +			max_pix_clock = (lane_num * 270000 * 8) / bpp;  			if (max_pix_clock >= pix_clock) {  				*dp_lanes = lane_num; -				*dp_rate = link_rates[i]; +				*dp_rate = 270000;  				return 0;  			}  		} +	} else { +		for (lane_num = 1; lane_num <= max_lane_num; lane_num <<= 1) { +			for (i = 0; i < ARRAY_SIZE(link_rates) && link_rates[i] <= max_link_rate; i++) { +				max_pix_clock = (lane_num * link_rates[i] * 8) / bpp; +				if (max_pix_clock >= pix_clock) { +					*dp_lanes = lane_num; +					*dp_rate = link_rates[i]; +					return 0; +				} +			} +		}  	}  	return -EINVAL; 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..e7ef2261ff4a 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; @@ -2202,8 +2202,7 @@ static void cz_dpm_powergate_vce(struct amdgpu_device *adev, bool gate)  							    AMD_PG_STATE_GATE);  				cz_enable_vce_dpm(adev, false); -				/* TODO: to figure out why vce can't be poweroff. */ -				/* cz_send_msg_to_smc(adev, PPSMC_MSG_VCEPowerOFF); */ +				cz_send_msg_to_smc(adev, PPSMC_MSG_VCEPowerOFF);  				pi->vce_power_gated = true;  			} else {  				cz_send_msg_to_smc(adev, PPSMC_MSG_VCEPowerON); @@ -2226,10 +2225,8 @@ static void cz_dpm_powergate_vce(struct amdgpu_device *adev, bool gate)  		}  	} else { /*pi->caps_vce_pg*/  		cz_update_vce_dpm(adev); -		cz_enable_vce_dpm(adev, true); +		cz_enable_vce_dpm(adev, !gate);  	} - -	return;  }  const struct amd_ip_funcs cz_dpm_ip_funcs = { diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 72793f93e2fc..06602df707f8 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c @@ -3628,6 +3628,19 @@ static void gfx_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring,  					unsigned vm_id, uint64_t pd_addr)  {  	int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); +	uint32_t seq = ring->fence_drv.sync_seq; +	uint64_t addr = ring->fence_drv.gpu_addr; + +	amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); +	amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ +				 WAIT_REG_MEM_FUNCTION(3) | /* equal */ +				 WAIT_REG_MEM_ENGINE(usepfp)));   /* pfp or me */ +	amdgpu_ring_write(ring, addr & 0xfffffffc); +	amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff); +	amdgpu_ring_write(ring, seq); +	amdgpu_ring_write(ring, 0xffffffff); +	amdgpu_ring_write(ring, 4); /* poll interval */ +  	if (usepfp) {  		/* synce CE with ME to prevent CE fetch CEIB before context switch done */  		amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); @@ -4109,7 +4122,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 +4160,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 +4189,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 +4262,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 +4276,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 +4289,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 +4302,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 +4383,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 +4455,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 +4469,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 +4636,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 +4656,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 +4751,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 +4919,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 +5540,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 +5558,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 95c0cdfbd1b3..7086ac17abee 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); @@ -4329,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) @@ -4793,7 +4809,8 @@ static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,  	amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));  	amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ -		 WAIT_REG_MEM_FUNCTION(3))); /* equal */ +				 WAIT_REG_MEM_FUNCTION(3) | /* equal */ +				 WAIT_REG_MEM_ENGINE(usepfp))); /* pfp or me */  	amdgpu_ring_write(ring, addr & 0xfffffffc);  	amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);  	amdgpu_ring_write(ring, seq); @@ -4979,7 +4996,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/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: diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c index 9be007081b72..a902ae037398 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c @@ -194,7 +194,7 @@ static void kfd_process_wq_release(struct work_struct *work)  	kfree(p); -	kfree((void *)work); +	kfree(work);  }  static void kfd_process_destroy_delayed(struct rcu_head *rcu) diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h index 1195d06f55bc..dbf7e6413cab 100644 --- a/drivers/gpu/drm/amd/include/amd_shared.h +++ b/drivers/gpu/drm/amd/include/amd_shared.h @@ -85,6 +85,38 @@ enum amd_powergating_state {  	AMD_PG_STATE_UNGATE,  }; +/* CG flags */ +#define AMD_CG_SUPPORT_GFX_MGCG			(1 << 0) +#define AMD_CG_SUPPORT_GFX_MGLS			(1 << 1) +#define AMD_CG_SUPPORT_GFX_CGCG			(1 << 2) +#define AMD_CG_SUPPORT_GFX_CGLS			(1 << 3) +#define AMD_CG_SUPPORT_GFX_CGTS			(1 << 4) +#define AMD_CG_SUPPORT_GFX_CGTS_LS		(1 << 5) +#define AMD_CG_SUPPORT_GFX_CP_LS		(1 << 6) +#define AMD_CG_SUPPORT_GFX_RLC_LS		(1 << 7) +#define AMD_CG_SUPPORT_MC_LS			(1 << 8) +#define AMD_CG_SUPPORT_MC_MGCG			(1 << 9) +#define AMD_CG_SUPPORT_SDMA_LS			(1 << 10) +#define AMD_CG_SUPPORT_SDMA_MGCG		(1 << 11) +#define AMD_CG_SUPPORT_BIF_LS			(1 << 12) +#define AMD_CG_SUPPORT_UVD_MGCG			(1 << 13) +#define AMD_CG_SUPPORT_VCE_MGCG			(1 << 14) +#define AMD_CG_SUPPORT_HDP_LS			(1 << 15) +#define AMD_CG_SUPPORT_HDP_MGCG			(1 << 16) + +/* PG flags */ +#define AMD_PG_SUPPORT_GFX_PG			(1 << 0) +#define AMD_PG_SUPPORT_GFX_SMG			(1 << 1) +#define AMD_PG_SUPPORT_GFX_DMG			(1 << 2) +#define AMD_PG_SUPPORT_UVD			(1 << 3) +#define AMD_PG_SUPPORT_VCE			(1 << 4) +#define AMD_PG_SUPPORT_CP			(1 << 5) +#define AMD_PG_SUPPORT_GDS			(1 << 6) +#define AMD_PG_SUPPORT_RLC_SMU_HS		(1 << 7) +#define AMD_PG_SUPPORT_SDMA			(1 << 8) +#define AMD_PG_SUPPORT_ACP			(1 << 9) +#define AMD_PG_SUPPORT_SAMU			(1 << 10) +  enum amd_pm_state_type {  	/* not used for dpm */  	POWER_STATE_TYPE_DEFAULT, diff --git a/drivers/gpu/drm/amd/include/cgs_common.h b/drivers/gpu/drm/amd/include/cgs_common.h index 713aec954692..aec38fc3834f 100644 --- a/drivers/gpu/drm/amd/include/cgs_common.h +++ b/drivers/gpu/drm/amd/include/cgs_common.h @@ -109,6 +109,8 @@ enum cgs_system_info_id {  	CGS_SYSTEM_INFO_ADAPTER_BDF_ID = 1,  	CGS_SYSTEM_INFO_PCIE_GEN_INFO,  	CGS_SYSTEM_INFO_PCIE_MLW, +	CGS_SYSTEM_INFO_CG_FLAGS, +	CGS_SYSTEM_INFO_PG_FLAGS,  	CGS_SYSTEM_INFO_ID_MAXIMUM,  }; diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c index aa67244a77ae..589599f66fcc 100644 --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c @@ -402,8 +402,11 @@ int pp_dpm_dispatch_tasks(void *handle, enum amd_pp_event event_id, void *input,  		data.requested_ui_label = power_state_convert(ps);  		ret = pem_handle_event(pp_handle->eventmgr, event_id, &data); +		break;  	} -	break; +	case AMD_PP_EVENT_COMPLETE_INIT: +		ret = pem_handle_event(pp_handle->eventmgr, event_id, &data); +		break;  	default:  		break;  	} diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c index 83be3cf210e0..6b52c78cb404 100644 --- a/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c +++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c @@ -165,6 +165,7 @@ const struct action_chain resume_action_chain = {  };  static const pem_event_action *complete_init_event[] = { +	unblock_adjust_power_state_tasks,  	adjust_power_state_tasks,  	enable_gfx_clock_gating_tasks,  	enable_gfx_voltage_island_power_gating_tasks, diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventmgr.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventmgr.c index 52a3efc97f05..46410e3c7349 100644 --- a/drivers/gpu/drm/amd/powerplay/eventmgr/eventmgr.c +++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventmgr.c @@ -31,7 +31,7 @@  static int pem_init(struct pp_eventmgr *eventmgr)  {  	int result = 0; -	struct pem_event_data event_data; +	struct pem_event_data event_data = { {0} };  	/* Initialize PowerPlay feature info */  	pem_init_feature_info(eventmgr); @@ -52,7 +52,7 @@ static int pem_init(struct pp_eventmgr *eventmgr)  static void pem_fini(struct pp_eventmgr *eventmgr)  { -	struct pem_event_data event_data; +	struct pem_event_data event_data = { {0} };  	pem_uninit_featureInfo(eventmgr);  	pem_unregister_interrupts(eventmgr); diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c index ad7700822a1c..ff08ce41bde9 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c @@ -226,7 +226,7 @@ int cz_dpm_powergate_vce(struct pp_hwmgr *hwmgr, bool bgate)  		}  	} else {  		cz_dpm_update_vce_dpm(hwmgr); -		cz_enable_disable_vce_dpm(hwmgr, true); +		cz_enable_disable_vce_dpm(hwmgr, !bgate);  		return 0;  	} diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c index 0874ab42ee95..cf01177ca3b5 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c @@ -174,6 +174,8 @@ static int cz_initialize_dpm_defaults(struct pp_hwmgr *hwmgr)  {  	struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend);  	uint32_t i; +	struct cgs_system_info sys_info = {0}; +	int result;  	cz_hwmgr->gfx_ramp_step = 256*25/100; @@ -247,6 +249,22 @@ static int cz_initialize_dpm_defaults(struct pp_hwmgr *hwmgr)  	phm_cap_set(hwmgr->platform_descriptor.platformCaps,  				   PHM_PlatformCaps_DisableVoltageIsland); +	phm_cap_unset(hwmgr->platform_descriptor.platformCaps, +		      PHM_PlatformCaps_UVDPowerGating); +	phm_cap_unset(hwmgr->platform_descriptor.platformCaps, +		      PHM_PlatformCaps_VCEPowerGating); +	sys_info.size = sizeof(struct cgs_system_info); +	sys_info.info_id = CGS_SYSTEM_INFO_PG_FLAGS; +	result = cgs_query_system_info(hwmgr->device, &sys_info); +	if (!result) { +		if (sys_info.value & AMD_PG_SUPPORT_UVD) +			phm_cap_set(hwmgr->platform_descriptor.platformCaps, +				      PHM_PlatformCaps_UVDPowerGating); +		if (sys_info.value & AMD_PG_SUPPORT_VCE) +			phm_cap_set(hwmgr->platform_descriptor.platformCaps, +				      PHM_PlatformCaps_VCEPowerGating); +	} +  	return 0;  } diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c index 44a925006479..980d3bf8ea76 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c @@ -4451,6 +4451,7 @@ int tonga_hwmgr_backend_init(struct pp_hwmgr *hwmgr)  	pp_atomctrl_gpio_pin_assignment gpio_pin_assignment;  	struct phm_ppt_v1_information *pptable_info = (struct phm_ppt_v1_information *)(hwmgr->pptable);  	phw_tonga_ulv_parm *ulv; +	struct cgs_system_info sys_info = {0};  	PP_ASSERT_WITH_CODE((NULL != hwmgr),  		"Invalid Parameter!", return -1;); @@ -4615,9 +4616,23 @@ int tonga_hwmgr_backend_init(struct pp_hwmgr *hwmgr)  	data->vddc_phase_shed_control = 0; -	if (0 == result) { -		struct cgs_system_info sys_info = {0}; +	phm_cap_unset(hwmgr->platform_descriptor.platformCaps, +		      PHM_PlatformCaps_UVDPowerGating); +	phm_cap_unset(hwmgr->platform_descriptor.platformCaps, +		      PHM_PlatformCaps_VCEPowerGating); +	sys_info.size = sizeof(struct cgs_system_info); +	sys_info.info_id = CGS_SYSTEM_INFO_PG_FLAGS; +	result = cgs_query_system_info(hwmgr->device, &sys_info); +	if (!result) { +		if (sys_info.value & AMD_PG_SUPPORT_UVD) +			phm_cap_set(hwmgr->platform_descriptor.platformCaps, +				      PHM_PlatformCaps_UVDPowerGating); +		if (sys_info.value & AMD_PG_SUPPORT_VCE) +			phm_cap_set(hwmgr->platform_descriptor.platformCaps, +				      PHM_PlatformCaps_VCEPowerGating); +	} +	if (0 == result) {  		data->is_tlu_enabled = 0;  		hwmgr->platform_descriptor.hardwareActivityPerformanceLevels =  			TONGA_MAX_HARDWARE_POWERLEVELS; | 
