diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | 36 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 32 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 44 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/soc15.c | 39 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vega10_ih.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c | 1 | 
19 files changed, 168 insertions, 57 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index d0102cfc8efb..b0fc116296cb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -151,6 +151,7 @@ extern int amdgpu_compute_multipipe;  extern int amdgpu_gpu_recovery;  extern int amdgpu_emu_mode;  extern uint amdgpu_smu_memory_pool_size; +extern uint amdgpu_dc_feature_mask;  extern struct amdgpu_mgpu_info mgpu_info;  #ifdef CONFIG_DRM_AMDGPU_SI @@ -232,7 +233,7 @@ enum amdgpu_kiq_irq {  #define MAX_KIQ_REG_WAIT       5000 /* in usecs, 5ms */  #define MAX_KIQ_REG_BAILOUT_INTERVAL   5 /* in msecs, 5ms */ -#define MAX_KIQ_REG_TRY 20 +#define MAX_KIQ_REG_TRY 80 /* 20 -> 80 */  int amdgpu_device_ip_set_clockgating_state(void *dev,  					   enum amd_ip_block_type block_type, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index c31a8849e9f8..1580ec60b89f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c @@ -501,8 +501,11 @@ void amdgpu_amdkfd_set_compute_idle(struct kgd_dev *kgd, bool idle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)kgd; -	amdgpu_dpm_switch_power_profile(adev, -					PP_SMC_POWER_PROFILE_COMPUTE, !idle); +	if (adev->powerplay.pp_funcs && +	    adev->powerplay.pp_funcs->switch_power_profile) +		amdgpu_dpm_switch_power_profile(adev, +						PP_SMC_POWER_PROFILE_COMPUTE, +						!idle);  }  bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c index 8816c697b205..387f1cf1dc20 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c @@ -330,7 +330,9 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,  			case CHIP_TOPAZ:  				if (((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x81)) ||  				    ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x83)) || -				    ((adev->pdev->device == 0x6907) && (adev->pdev->revision == 0x87))) { +				    ((adev->pdev->device == 0x6907) && (adev->pdev->revision == 0x87)) || +				    ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0xD1)) || +				    ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0xD3))) {  					info->is_kicker = true;  					strcpy(fw_name, "amdgpu/topaz_k_smc.bin");  				} else @@ -351,7 +353,6 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,  				if (type == CGS_UCODE_ID_SMU) {  					if (((adev->pdev->device == 0x67ef) &&  					     ((adev->pdev->revision == 0xe0) || -					      (adev->pdev->revision == 0xe2) ||  					      (adev->pdev->revision == 0xe5))) ||  					    ((adev->pdev->device == 0x67ff) &&  					     ((adev->pdev->revision == 0xcf) || @@ -359,8 +360,13 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,  					      (adev->pdev->revision == 0xff)))) {  						info->is_kicker = true;  						strcpy(fw_name, "amdgpu/polaris11_k_smc.bin"); -					} else +					} else if ((adev->pdev->device == 0x67ef) && +						   (adev->pdev->revision == 0xe2)) { +						info->is_kicker = true; +						strcpy(fw_name, "amdgpu/polaris11_k2_smc.bin"); +					} else {  						strcpy(fw_name, "amdgpu/polaris11_smc.bin"); +					}  				} else if (type == CGS_UCODE_ID_SMU_SK) {  					strcpy(fw_name, "amdgpu/polaris11_smc_sk.bin");  				} @@ -375,17 +381,35 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,  					      (adev->pdev->revision == 0xe7) ||  					      (adev->pdev->revision == 0xef))) ||  					    ((adev->pdev->device == 0x6fdf) && -					     (adev->pdev->revision == 0xef))) { +					     ((adev->pdev->revision == 0xef) || +					      (adev->pdev->revision == 0xff)))) {  						info->is_kicker = true;  						strcpy(fw_name, "amdgpu/polaris10_k_smc.bin"); -					} else +					} else if ((adev->pdev->device == 0x67df) && +						   ((adev->pdev->revision == 0xe1) || +						    (adev->pdev->revision == 0xf7))) { +						info->is_kicker = true; +						strcpy(fw_name, "amdgpu/polaris10_k2_smc.bin"); +					} else {  						strcpy(fw_name, "amdgpu/polaris10_smc.bin"); +					}  				} else if (type == CGS_UCODE_ID_SMU_SK) {  					strcpy(fw_name, "amdgpu/polaris10_smc_sk.bin");  				}  				break;  			case CHIP_POLARIS12: -				strcpy(fw_name, "amdgpu/polaris12_smc.bin"); +				if (((adev->pdev->device == 0x6987) && +				     ((adev->pdev->revision == 0xc0) || +				      (adev->pdev->revision == 0xc3))) || +				    ((adev->pdev->device == 0x6981) && +				     ((adev->pdev->revision == 0x00) || +				      (adev->pdev->revision == 0x01) || +				      (adev->pdev->revision == 0x10)))) { +					info->is_kicker = true; +					strcpy(fw_name, "amdgpu/polaris12_k_smc.bin"); +				} else { +					strcpy(fw_name, "amdgpu/polaris12_smc.bin"); +				}  				break;  			case CHIP_VEGAM:  				strcpy(fw_name, "amdgpu/vegam_smc.bin"); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 663043c8f0f5..0acc8dee2cb8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -124,14 +124,14 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs  		goto free_chunk;  	} +	mutex_lock(&p->ctx->lock); +  	/* skip guilty context job */  	if (atomic_read(&p->ctx->guilty) == 1) {  		ret = -ECANCELED;  		goto free_chunk;  	} -	mutex_lock(&p->ctx->lock); -  	/* get chunks */  	chunk_array_user = u64_to_user_ptr(cs->in.chunks);  	if (copy_from_user(chunk_array, chunk_array_user, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c index f9b54236102d..95f4c4139fc6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c @@ -39,6 +39,7 @@ const unsigned int amdgpu_ctx_num_entities[AMDGPU_HW_IP_NUM] = {  	[AMDGPU_HW_IP_UVD_ENC]	=	1,  	[AMDGPU_HW_IP_VCN_DEC]	=	1,  	[AMDGPU_HW_IP_VCN_ENC]	=	1, +	[AMDGPU_HW_IP_VCN_JPEG]	=	1,  };  static int amdgput_ctx_total_num_entities(void) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index 6748cd7fc129..686a26de50f9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c @@ -626,6 +626,13 @@ int amdgpu_display_modeset_create_props(struct amdgpu_device *adev)  					 "dither",  					 amdgpu_dither_enum_list, sz); +	if (amdgpu_device_has_dc_support(adev)) { +		adev->mode_info.max_bpc_property = +			drm_property_create_range(adev->ddev, 0, "max bpc", 8, 16); +		if (!adev->mode_info.max_bpc_property) +			return -ENOMEM; +	} +  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 943dbf3c5da1..74b611e8a1b1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -127,6 +127,9 @@ int amdgpu_compute_multipipe = -1;  int amdgpu_gpu_recovery = -1; /* auto */  int amdgpu_emu_mode = 0;  uint amdgpu_smu_memory_pool_size = 0; +/* FBC (bit 0) disabled by default*/ +uint amdgpu_dc_feature_mask = 0; +  struct amdgpu_mgpu_info mgpu_info = {  	.mutex = __MUTEX_INITIALIZER(mgpu_info.mutex),  }; @@ -631,6 +634,14 @@ module_param(halt_if_hws_hang, int, 0644);  MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)");  #endif +/** + * DOC: dcfeaturemask (uint) + * Override display features enabled. See enum DC_FEATURE_MASK in drivers/gpu/drm/amd/include/amd_shared.h. + * The default is the current set of stable display features. + */ +MODULE_PARM_DESC(dcfeaturemask, "all stable DC features enabled (default))"); +module_param_named(dcfeaturemask, amdgpu_dc_feature_mask, uint, 0444); +  static const struct pci_device_id pciidlist[] = {  #ifdef  CONFIG_DRM_AMDGPU_SI  	{0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI}, @@ -861,7 +872,13 @@ static const struct pci_device_id pciidlist[] = {  	{0x1002, 0x6864, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},  	{0x1002, 0x6867, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},  	{0x1002, 0x6868, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, +	{0x1002, 0x6869, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, +	{0x1002, 0x686a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, +	{0x1002, 0x686b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},  	{0x1002, 0x686c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, +	{0x1002, 0x686d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, +	{0x1002, 0x686e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, +	{0x1002, 0x686f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},  	{0x1002, 0x687f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},  	/* Vega 12 */  	{0x1002, 0x69A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA12}, @@ -874,6 +891,7 @@ static const struct pci_device_id pciidlist[] = {  	{0x1002, 0x66A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},  	{0x1002, 0x66A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},  	{0x1002, 0x66A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20}, +	{0x1002, 0x66A4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},  	{0x1002, 0x66A7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},  	{0x1002, 0x66AF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA20},  	/* Raven */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 81732a84c2ab..8f3d44e5e787 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -467,9 +467,6 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file  	if (!info->return_size || !info->return_pointer)  		return -EINVAL; -	/* Ensure IB tests are run on ring */ -	flush_delayed_work(&adev->late_init_work); -  	switch (info->query) {  	case AMDGPU_INFO_ACCEL_WORKING:  		ui32 = adev->accel_working; @@ -950,6 +947,9 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)  	struct amdgpu_fpriv *fpriv;  	int r, pasid; +	/* Ensure IB tests are run on ring */ +	flush_delayed_work(&adev->late_init_work); +  	file_priv->driver_priv = NULL;  	r = pm_runtime_get_sync(dev->dev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h index b9e9e8b02fb7..d1b4d9b6aae0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h @@ -339,6 +339,8 @@ struct amdgpu_mode_info {  	struct drm_property *audio_property;  	/* FMT dithering */  	struct drm_property *dither_property; +	/* maximum number of bits per channel for monitor color */ +	struct drm_property *max_bpc_property;  	/* hardcoded DFP edid from BIOS */  	struct edid *bios_hardcoded_edid;  	int bios_hardcoded_edid_size; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 352b30409060..0877ff9a9594 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -181,7 +181,7 @@ static unsigned amdgpu_vm_num_entries(struct amdgpu_device *adev,  	if (level == adev->vm_manager.root_level)  		/* For the root directory */ -		return round_up(adev->vm_manager.max_pfn, 1 << shift) >> shift; +		return round_up(adev->vm_manager.max_pfn, 1ULL << shift) >> shift;  	else if (level != AMDGPU_VM_PTB)  		/* Everything in between */  		return 512; @@ -1632,13 +1632,6 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,  			continue;  		} -		/* First check if the entry is already handled */ -		if (cursor.pfn < frag_start) { -			cursor.entry->huge = true; -			amdgpu_vm_pt_next(adev, &cursor); -			continue; -		} -  		/* If it isn't already handled it can't be a huge page */  		if (cursor.entry->huge) {  			/* Add the entry to the relocated list to update it. */ @@ -1663,9 +1656,11 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,  			if (!amdgpu_vm_pt_descendant(adev, &cursor))  				return -ENOENT;  			continue; -		} else if (frag >= parent_shift) { +		} else if (frag >= parent_shift && +			   cursor.level - 1 != adev->vm_manager.root_level) {  			/* If the fragment size is even larger than the parent -			 * shift we should go up one level and check it again. +			 * shift we should go up one level and check it again +			 * unless one level up is the root level.  			 */  			if (!amdgpu_vm_pt_ancestor(&cursor))  				return -ENOENT; @@ -1673,10 +1668,10 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,  		}  		/* Looks good so far, calculate parameters for the update */ -		incr = AMDGPU_GPU_PAGE_SIZE << shift; +		incr = (uint64_t)AMDGPU_GPU_PAGE_SIZE << shift;  		mask = amdgpu_vm_entries_mask(adev, cursor.level);  		pe_start = ((cursor.pfn >> shift) & mask) * 8; -		entry_end = (mask + 1) << shift; +		entry_end = (uint64_t)(mask + 1) << shift;  		entry_end += cursor.pfn & ~(entry_end - 1);  		entry_end = min(entry_end, end); @@ -1689,7 +1684,7 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,  					      flags | AMDGPU_PTE_FRAG(frag));  			pe_start += nptes * 8; -			dst += nptes * AMDGPU_GPU_PAGE_SIZE << shift; +			dst += (uint64_t)nptes * AMDGPU_GPU_PAGE_SIZE << shift;  			frag_start = upd_end;  			if (frag_start >= frag_end) { @@ -1701,8 +1696,17 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,  			}  		} while (frag_start < entry_end); -		if (frag >= shift) +		if (amdgpu_vm_pt_descendant(adev, &cursor)) { +			/* Mark all child entries as huge */ +			while (cursor.pfn < frag_start) { +				cursor.entry->huge = true; +				amdgpu_vm_pt_next(adev, &cursor); +			} + +		} else if (frag >= shift) { +			/* or just move on to the next on the same level. */  			amdgpu_vm_pt_next(adev, &cursor); +		}  	}  	return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index 6d7baf59d6e1..21363b2b2ee5 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c @@ -2440,12 +2440,13 @@ static void gfx_v9_0_rlc_start(struct amdgpu_device *adev)  #endif  	WREG32_FIELD15(GC, 0, RLC_CNTL, RLC_ENABLE_F32, 1); +	udelay(50);  	/* carrizo do enable cp interrupt after cp inited */ -	if (!(adev->flags & AMD_IS_APU)) +	if (!(adev->flags & AMD_IS_APU)) {  		gfx_v9_0_enable_gui_idle_interrupt(adev, true); - -	udelay(50); +		udelay(50); +	}  #ifdef AMDGPU_RLC_DEBUG_RETRY  	/* RLC_GPM_GENERAL_6 : RLC Ucode version */ diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c index ceb7847b504f..bfa317ad20a9 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c @@ -72,7 +72,7 @@ static void gfxhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)  	/* Program the system aperture low logical page number. */  	WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR, -		     min(adev->gmc.vram_start, adev->gmc.agp_start) >> 18); +		     min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18);  	if (adev->asic_type == CHIP_RAVEN && adev->rev_id >= 0x8)  		/* @@ -82,11 +82,11 @@ static void gfxhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)  		 * to get rid of the VM fault and hardware hang.  		 */  		WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, -			     max((adev->gmc.vram_end >> 18) + 0x1, +			     max((adev->gmc.fb_end >> 18) + 0x1,  				 adev->gmc.agp_end >> 18));  	else  		WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, -			     max(adev->gmc.vram_end, adev->gmc.agp_end) >> 18); +			     max(adev->gmc.fb_end, adev->gmc.agp_end) >> 18);  	/* Set default page address. */  	value = adev->vram_scratch.gpu_addr - adev->gmc.vram_start diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index e1c2b4e9c7b2..73ad02aea2b2 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c @@ -46,6 +46,7 @@ MODULE_FIRMWARE("amdgpu/tahiti_mc.bin");  MODULE_FIRMWARE("amdgpu/pitcairn_mc.bin");  MODULE_FIRMWARE("amdgpu/verde_mc.bin");  MODULE_FIRMWARE("amdgpu/oland_mc.bin"); +MODULE_FIRMWARE("amdgpu/hainan_mc.bin");  MODULE_FIRMWARE("amdgpu/si58_mc.bin");  #define MC_SEQ_MISC0__MT__MASK   0xf0000000 diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index 1d3265c97b70..747c068379dc 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c @@ -56,6 +56,9 @@ MODULE_FIRMWARE("amdgpu/tonga_mc.bin");  MODULE_FIRMWARE("amdgpu/polaris11_mc.bin");  MODULE_FIRMWARE("amdgpu/polaris10_mc.bin");  MODULE_FIRMWARE("amdgpu/polaris12_mc.bin"); +MODULE_FIRMWARE("amdgpu/polaris11_k_mc.bin"); +MODULE_FIRMWARE("amdgpu/polaris10_k_mc.bin"); +MODULE_FIRMWARE("amdgpu/polaris12_k_mc.bin");  static const u32 golden_settings_tonga_a11[] =  { @@ -224,13 +227,39 @@ static int gmc_v8_0_init_microcode(struct amdgpu_device *adev)  		chip_name = "tonga";  		break;  	case CHIP_POLARIS11: -		chip_name = "polaris11"; +		if (((adev->pdev->device == 0x67ef) && +		     ((adev->pdev->revision == 0xe0) || +		      (adev->pdev->revision == 0xe5))) || +		    ((adev->pdev->device == 0x67ff) && +		     ((adev->pdev->revision == 0xcf) || +		      (adev->pdev->revision == 0xef) || +		      (adev->pdev->revision == 0xff)))) +			chip_name = "polaris11_k"; +		else if ((adev->pdev->device == 0x67ef) && +			 (adev->pdev->revision == 0xe2)) +			chip_name = "polaris11_k"; +		else +			chip_name = "polaris11";  		break;  	case CHIP_POLARIS10: -		chip_name = "polaris10"; +		if ((adev->pdev->device == 0x67df) && +		    ((adev->pdev->revision == 0xe1) || +		     (adev->pdev->revision == 0xf7))) +			chip_name = "polaris10_k"; +		else +			chip_name = "polaris10";  		break;  	case CHIP_POLARIS12: -		chip_name = "polaris12"; +		if (((adev->pdev->device == 0x6987) && +		     ((adev->pdev->revision == 0xc0) || +		      (adev->pdev->revision == 0xc3))) || +		    ((adev->pdev->device == 0x6981) && +		     ((adev->pdev->revision == 0x00) || +		      (adev->pdev->revision == 0x01) || +		      (adev->pdev->revision == 0x10)))) +			chip_name = "polaris12_k"; +		else +			chip_name = "polaris12";  		break;  	case CHIP_FIJI:  	case CHIP_CARRIZO: @@ -337,7 +366,7 @@ static int gmc_v8_0_polaris_mc_load_microcode(struct amdgpu_device *adev)  	const struct mc_firmware_header_v1_0 *hdr;  	const __le32 *fw_data = NULL;  	const __le32 *io_mc_regs = NULL; -	u32 data, vbios_version; +	u32 data;  	int i, ucode_size, regs_size;  	/* Skip MC ucode loading on SR-IOV capable boards. @@ -348,13 +377,6 @@ static int gmc_v8_0_polaris_mc_load_microcode(struct amdgpu_device *adev)  	if (amdgpu_sriov_bios(adev))  		return 0; -	WREG32(mmMC_SEQ_IO_DEBUG_INDEX, 0x9F); -	data = RREG32(mmMC_SEQ_IO_DEBUG_DATA); -	vbios_version = data & 0xf; - -	if (vbios_version == 0) -		return 0; -  	if (!adev->gmc.fw)  		return -EINVAL; diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c index fd23ba1226a5..a0db67adc34c 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c @@ -90,7 +90,7 @@ static void mmhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)  	/* Program the system aperture low logical page number. */  	WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR, -		     min(adev->gmc.vram_start, adev->gmc.agp_start) >> 18); +		     min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18);  	if (adev->asic_type == CHIP_RAVEN && adev->rev_id >= 0x8)  		/* @@ -100,11 +100,11 @@ static void mmhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)  		 * to get rid of the VM fault and hardware hang.  		 */  		WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, -			     max((adev->gmc.vram_end >> 18) + 0x1, +			     max((adev->gmc.fb_end >> 18) + 0x1,  				 adev->gmc.agp_end >> 18));  	else  		WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, -			     max(adev->gmc.vram_end, adev->gmc.agp_end) >> 18); +			     max(adev->gmc.fb_end, adev->gmc.agp_end) >> 18);  	/* Set default page address. */  	value = adev->vram_scratch.gpu_addr - adev->gmc.vram_start + diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index bf5e6a413dee..4cc0dcb1a187 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c @@ -65,6 +65,13 @@  #define mmMP0_MISC_LIGHT_SLEEP_CTRL                                                             0x01ba  #define mmMP0_MISC_LIGHT_SLEEP_CTRL_BASE_IDX                                                    0 +/* for Vega20 register name change */ +#define mmHDP_MEM_POWER_CTRL	0x00d4 +#define HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK	0x00000001L +#define HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK	0x00000002L +#define HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK	0x00010000L +#define HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK		0x00020000L +#define mmHDP_MEM_POWER_CTRL_BASE_IDX	0  /*   * Indirect registers accessor   */ @@ -870,15 +877,33 @@ static void soc15_update_hdp_light_sleep(struct amdgpu_device *adev, bool enable  {  	uint32_t def, data; -	def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS)); +	if (adev->asic_type == CHIP_VEGA20) { +		def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_CTRL)); -	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) -		data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK; -	else -		data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK; +		if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) +			data |= HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK | +				HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK | +				HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK | +				HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK; +		else +			data &= ~(HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK | +				HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK | +				HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK | +				HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK); -	if (def != data) -		WREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS), data); +		if (def != data) +			WREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_CTRL), data); +	} else { +		def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS)); + +		if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) +			data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK; +		else +			data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK; + +		if (def != data) +			WREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS), data); +	}  }  static void soc15_update_drm_clock_gating(struct amdgpu_device *adev, bool enable) diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c index eae90922fdbe..322e09b5b448 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c @@ -48,6 +48,7 @@ static void vcn_v1_0_set_enc_ring_funcs(struct amdgpu_device *adev);  static void vcn_v1_0_set_jpeg_ring_funcs(struct amdgpu_device *adev);  static void vcn_v1_0_set_irq_funcs(struct amdgpu_device *adev);  static void vcn_v1_0_jpeg_ring_set_patch_ring(struct amdgpu_ring *ring, uint32_t ptr); +static int vcn_v1_0_set_powergating_state(void *handle, enum amd_powergating_state state);  /**   * vcn_v1_0_early_init - set function pointers @@ -222,7 +223,7 @@ static int vcn_v1_0_hw_fini(void *handle)  	struct amdgpu_ring *ring = &adev->vcn.ring_dec;  	if (RREG32_SOC15(VCN, 0, mmUVD_STATUS)) -		vcn_v1_0_stop(adev); +		vcn_v1_0_set_powergating_state(adev, AMD_PG_STATE_GATE);  	ring->ready = false; diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c index a99f71797aa3..a0fda6f9252a 100644 --- a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c +++ b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c @@ -129,7 +129,7 @@ static int vega10_ih_irq_init(struct amdgpu_device *adev)  	else  		wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs * 4);  	WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_LO, lower_32_bits(wptr_off)); -	WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_HI, upper_32_bits(wptr_off) & 0xFF); +	WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_HI, upper_32_bits(wptr_off) & 0xFFFF);  	/* set rptr, wptr to 0 */  	WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, 0); diff --git a/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c b/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c index 2d4473557b0d..d13fc4fcb517 100644 --- a/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c +++ b/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c @@ -49,6 +49,7 @@ int vega20_reg_base_init(struct amdgpu_device *adev)  		adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i]));  		adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i]));  		adev->reg_offset[THM_HWIP][i] = (uint32_t *)(&(THM_BASE.instance[i])); +		adev->reg_offset[CLK_HWIP][i] = (uint32_t *)(&(CLK_BASE.instance[i]));  	}  	return 0;  }  |