diff options
Diffstat (limited to 'drivers/gpu/drm/amd')
29 files changed, 199 insertions, 99 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c index 8f53837d4d3e..97178b307ed6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c @@ -468,14 +468,18 @@ bool amdgpu_atomfirmware_dynamic_boot_config_supported(struct amdgpu_device *ade  	return (fw_cap & ATOM_FIRMWARE_CAP_DYNAMIC_BOOT_CFG_ENABLE) ? true : false;  } -/* - * Helper function to query RAS EEPROM address - * - * @adev: amdgpu_device pointer +/** + * amdgpu_atomfirmware_ras_rom_addr -- Get the RAS EEPROM addr from VBIOS + * adev: amdgpu_device pointer + * i2c_address: pointer to u8; if not NULL, will contain + *    the RAS EEPROM address if the function returns true   * - * Return true if vbios supports ras rom address reporting + * Return true if VBIOS supports RAS EEPROM address reporting, + * else return false. If true and @i2c_address is not NULL, + * will contain the RAS ROM address.   */ -bool amdgpu_atomfirmware_ras_rom_addr(struct amdgpu_device *adev, uint8_t* i2c_address) +bool amdgpu_atomfirmware_ras_rom_addr(struct amdgpu_device *adev, +				      u8 *i2c_address)  {  	struct amdgpu_mode_info *mode_info = &adev->mode_info;  	int index; @@ -483,27 +487,39 @@ bool amdgpu_atomfirmware_ras_rom_addr(struct amdgpu_device *adev, uint8_t* i2c_a  	union firmware_info *firmware_info;  	u8 frev, crev; -	if (i2c_address == NULL) -		return false; - -	*i2c_address = 0; -  	index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, -			firmwareinfo); +					    firmwareinfo);  	if (amdgpu_atom_parse_data_header(adev->mode_info.atom_context, -				index, &size, &frev, &crev, &data_offset)) { +					  index, &size, &frev, &crev, +					  &data_offset)) {  		/* support firmware_info 3.4 + */  		if ((frev == 3 && crev >=4) || (frev > 3)) {  			firmware_info = (union firmware_info *)  				(mode_info->atom_context->bios + data_offset); -			*i2c_address = firmware_info->v34.ras_rom_i2c_slave_addr; +			/* The ras_rom_i2c_slave_addr should ideally +			 * be a 19-bit EEPROM address, which would be +			 * used as is by the driver; see top of +			 * amdgpu_eeprom.c. +			 * +			 * When this is the case, 0 is of course a +			 * valid RAS EEPROM address, in which case, +			 * we'll drop the first "if (firm...)" and only +			 * leave the check for the pointer. +			 * +			 * The reason this works right now is because +			 * ras_rom_i2c_slave_addr contains the EEPROM +			 * device type qualifier 1010b in the top 4 +			 * bits. +			 */ +			if (firmware_info->v34.ras_rom_i2c_slave_addr) { +				if (i2c_address) +					*i2c_address = firmware_info->v34.ras_rom_i2c_slave_addr; +				return true; +			}  		}  	} -	if (*i2c_address != 0) -		return true; -  	return false;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index 8e5a7ac8c36f..7a7316731911 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c @@ -522,6 +522,7 @@ uint32_t amdgpu_display_supported_domains(struct amdgpu_device *adev,  			break;  		case CHIP_RENOIR:  		case CHIP_VANGOGH: +		case CHIP_YELLOW_CARP:  			domain |= AMDGPU_GEM_DOMAIN_GTT;  			break; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index b6640291f980..f18240f87387 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -1181,7 +1181,12 @@ static const struct pci_device_id pciidlist[] = {  	{0x1002, 0x73A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},  	{0x1002, 0x73A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},  	{0x1002, 0x73A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID}, +	{0x1002, 0x73A5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID}, +	{0x1002, 0x73A8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID}, +	{0x1002, 0x73A9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},  	{0x1002, 0x73AB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID}, +	{0x1002, 0x73AC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID}, +	{0x1002, 0x73AD, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},  	{0x1002, 0x73AE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},  	{0x1002, 0x73AF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},  	{0x1002, 0x73BF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID}, @@ -1197,6 +1202,11 @@ static const struct pci_device_id pciidlist[] = {  	{0x1002, 0x73C0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},  	{0x1002, 0x73C1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},  	{0x1002, 0x73C3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER}, +	{0x1002, 0x73DA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER}, +	{0x1002, 0x73DB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER}, +	{0x1002, 0x73DC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER}, +	{0x1002, 0x73DD, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER}, +	{0x1002, 0x73DE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},  	{0x1002, 0x73DF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVY_FLOUNDER},  	/* DIMGREY_CAVEFISH */ @@ -1204,6 +1214,13 @@ static const struct pci_device_id pciidlist[] = {  	{0x1002, 0x73E1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},  	{0x1002, 0x73E2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},  	{0x1002, 0x73E3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH}, +	{0x1002, 0x73E8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH}, +	{0x1002, 0x73E9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH}, +	{0x1002, 0x73EA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH}, +	{0x1002, 0x73EB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH}, +	{0x1002, 0x73EC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH}, +	{0x1002, 0x73ED, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH}, +	{0x1002, 0x73EF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},  	{0x1002, 0x73FF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_DIMGREY_CAVEFISH},  	/* Aldebaran */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c index d94c5419ec25..5a6857c44bb6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c @@ -59,6 +59,7 @@ void amdgpu_show_fdinfo(struct seq_file *m, struct file *f)  	uint64_t vram_mem = 0, gtt_mem = 0, cpu_mem = 0;  	struct drm_file *file = f->private_data;  	struct amdgpu_device *adev = drm_to_adev(file->minor->dev); +	struct amdgpu_bo *root;  	int ret;  	ret = amdgpu_file_to_fpriv(f, &fpriv); @@ -69,13 +70,19 @@ void amdgpu_show_fdinfo(struct seq_file *m, struct file *f)  	dev = PCI_SLOT(adev->pdev->devfn);  	fn = PCI_FUNC(adev->pdev->devfn); -	ret = amdgpu_bo_reserve(fpriv->vm.root.bo, false); +	root = amdgpu_bo_ref(fpriv->vm.root.bo); +	if (!root) +		return; + +	ret = amdgpu_bo_reserve(root, false);  	if (ret) {  		DRM_ERROR("Fail to reserve bo\n");  		return;  	}  	amdgpu_vm_get_memory(&fpriv->vm, &vram_mem, >t_mem, &cpu_mem); -	amdgpu_bo_unreserve(fpriv->vm.root.bo); +	amdgpu_bo_unreserve(root); +	amdgpu_bo_unref(&root); +  	seq_printf(m, "pdev:\t%04x:%02x:%02x.%d\npasid:\t%u\n", domain, bus,  			dev, fn, fpriv->vm.pasid);  	seq_printf(m, "vram mem:\t%llu kB\n", vram_mem/1024UL); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index 14499f0de32d..8d682befe0d6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c @@ -552,6 +552,9 @@ void amdgpu_fence_driver_hw_fini(struct amdgpu_device *adev)  		if (!ring || !ring->fence_drv.initialized)  			continue; +		if (!ring->no_scheduler) +			drm_sched_stop(&ring->sched, NULL); +  		/* You can't wait for HW to signal if it's gone */  		if (!drm_dev_is_unplugged(&adev->ddev))  			r = amdgpu_fence_wait_empty(ring); @@ -611,6 +614,11 @@ void amdgpu_fence_driver_hw_init(struct amdgpu_device *adev)  		if (!ring || !ring->fence_drv.initialized)  			continue; +		if (!ring->no_scheduler) { +			drm_sched_resubmit_jobs(&ring->sched); +			drm_sched_start(&ring->sched, true); +		} +  		/* enable the interrupt */  		if (ring->fence_drv.irq_src)  			amdgpu_irq_get(adev, ring->fence_drv.irq_src, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index cb07cc3b06ed..d6aa032890ee 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -341,21 +341,18 @@ retry:  	r = amdgpu_gem_object_create(adev, size, args->in.alignment,  				     initial_domain,  				     flags, ttm_bo_type_device, resv, &gobj); -	if (r) { -		if (r != -ERESTARTSYS) { -			if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) { -				flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; -				goto retry; -			} +	if (r && r != -ERESTARTSYS) { +		if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) { +			flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; +			goto retry; +		} -			if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) { -				initial_domain |= AMDGPU_GEM_DOMAIN_GTT; -				goto retry; -			} -			DRM_DEBUG("Failed to allocate GEM object (%llu, %d, %llu, %d)\n", -				  size, initial_domain, args->in.alignment, r); +		if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) { +			initial_domain |= AMDGPU_GEM_DOMAIN_GTT; +			goto retry;  		} -		return r; +		DRM_DEBUG("Failed to allocate GEM object (%llu, %d, %llu, %d)\n", +				size, initial_domain, args->in.alignment, r);  	}  	if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index 543000304a1c..675a72ef305d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c @@ -118,7 +118,7 @@ bool amdgpu_gtt_mgr_has_gart_addr(struct ttm_resource *res)   * @man: TTM memory type manager   * @tbo: TTM BO we need this range for   * @place: placement flags and restrictions - * @mem: the resulting mem object + * @res: the resulting mem object   *   * Dummy, allocate the node but no space for it yet.   */ @@ -182,7 +182,7 @@ err_out:   * amdgpu_gtt_mgr_del - free ranges   *   * @man: TTM memory type manager - * @mem: TTM memory object + * @res: TTM memory object   *   * Free the allocated GTT again.   */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index 23efdc672502..9b41cb8c3de5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c @@ -469,10 +469,10 @@ psp_cmd_submit_buf(struct psp_context *psp,  	 */  	if (!skip_unsupport && (psp->cmd_buf_mem->resp.status || !timeout) && !ras_intr) {  		if (ucode) -			DRM_WARN("failed to load ucode (%s) ", -				  amdgpu_ucode_name(ucode->ucode_id)); -		DRM_WARN("psp gfx command (%s) failed and response status is (0x%X)\n", -			 psp_gfx_cmd_name(psp->cmd_buf_mem->cmd_id), +			DRM_WARN("failed to load ucode %s(0x%X) ", +				  amdgpu_ucode_name(ucode->ucode_id), ucode->ucode_id); +		DRM_WARN("psp gfx command %s(0x%X) failed and response status is (0x%X)\n", +			 psp_gfx_cmd_name(psp->cmd_buf_mem->cmd_id), psp->cmd_buf_mem->cmd_id,  			 psp->cmd_buf_mem->resp.status);  		if (!timeout) {  			ret = -EINVAL; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c index 9dc3b2d88176..dc44c946a244 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c @@ -114,27 +114,24 @@ static bool __get_eeprom_i2c_addr_arct(struct amdgpu_device *adev,  static bool __get_eeprom_i2c_addr(struct amdgpu_device *adev,  				  struct amdgpu_ras_eeprom_control *control)  { -	uint8_t ras_rom_i2c_slave_addr; +	u8 i2c_addr;  	if (!control)  		return false; -	control->i2c_address = 0; - -	if (amdgpu_atomfirmware_ras_rom_addr(adev, &ras_rom_i2c_slave_addr)) -	{ -		switch (ras_rom_i2c_slave_addr) { -		case 0xA0: -			control->i2c_address = 0; -			return true; -		case 0xA8: -			control->i2c_address = 0x40000; -			return true; -		default: -			dev_warn(adev->dev, "RAS EEPROM I2C slave address %02x not supported", -				 ras_rom_i2c_slave_addr); -			return false; -		} +	if (amdgpu_atomfirmware_ras_rom_addr(adev, &i2c_addr)) { +		/* The address given by VBIOS is an 8-bit, wire-format +		 * address, i.e. the most significant byte. +		 * +		 * Normalize it to a 19-bit EEPROM address. Remove the +		 * device type identifier and make it a 7-bit address; +		 * then make it a 19-bit EEPROM address. See top of +		 * amdgpu_eeprom.c. +		 */ +		i2c_addr = (i2c_addr & 0x0F) >> 1; +		control->i2c_address = ((u32) i2c_addr) << 16; + +		return true;  	}  	switch (adev->asic_type) { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 2fd77c36a1ff..7b2b0980ec41 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -361,7 +361,7 @@ static void amdgpu_vram_mgr_virt_start(struct ttm_resource *mem,   * @man: TTM memory type manager   * @tbo: TTM BO we need this range for   * @place: placement flags and restrictions - * @mem: the resulting mem object + * @res: the resulting mem object   *   * Allocate VRAM for the given BO.   */ @@ -487,7 +487,7 @@ error_sub:   * amdgpu_vram_mgr_del - free ranges   *   * @man: TTM memory type manager - * @mem: TTM memory object + * @res: TTM memory object   *   * Free the allocated VRAM again.   */ @@ -522,7 +522,7 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man,   * amdgpu_vram_mgr_alloc_sgt - allocate and fill a sg table   *   * @adev: amdgpu device pointer - * @mem: TTM memory object + * @res: TTM memory object   * @offset: byte offset from the base of VRAM BO   * @length: number of bytes to export in sg_table   * @dev: the other device diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c index ff2307d7ee0f..23b066bcffb2 100644 --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c @@ -258,6 +258,8 @@ static void xgpu_ai_mailbox_flr_work(struct work_struct *work)  	amdgpu_virt_fini_data_exchange(adev);  	atomic_set(&adev->in_gpu_reset, 1); +	xgpu_ai_mailbox_trans_msg(adev, IDH_READY_TO_RESET, 0, 0, 0); +  	do {  		if (xgpu_ai_mailbox_peek_msg(adev) == IDH_FLR_NOTIFICATION_CMPL)  			goto flr_done; diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h index 50572635d0f8..bd3b23171579 100644 --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h @@ -37,6 +37,7 @@ enum idh_request {  	IDH_REQ_GPU_RESET_ACCESS,  	IDH_LOG_VF_ERROR       = 200, +	IDH_READY_TO_RESET 	= 201,  };  enum idh_event { diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c index ba1d3ab869c1..f50045cebd44 100644 --- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c @@ -85,11 +85,14 @@  #define mmRCC_DEV0_EPF0_STRAP0_ALDE			0x0015  #define mmRCC_DEV0_EPF0_STRAP0_ALDE_BASE_IDX		2 -#define mmBIF_DOORBELL_INT_CNTL_ALDE 			0x3878 +#define mmBIF_DOORBELL_INT_CNTL_ALDE 			0x00fe  #define mmBIF_DOORBELL_INT_CNTL_ALDE_BASE_IDX 		2  #define BIF_DOORBELL_INT_CNTL_ALDE__DOORBELL_INTERRUPT_DISABLE__SHIFT	0x18  #define BIF_DOORBELL_INT_CNTL_ALDE__DOORBELL_INTERRUPT_DISABLE_MASK	0x01000000L +#define mmBIF_INTR_CNTL_ALDE 				0x0101 +#define mmBIF_INTR_CNTL_ALDE_BASE_IDX 			2 +  static void nbio_v7_4_query_ras_error_count(struct amdgpu_device *adev,  					void *ras_error_status); @@ -440,14 +443,23 @@ static int nbio_v7_4_set_ras_controller_irq_state(struct amdgpu_device *adev,  	 */  	uint32_t bif_intr_cntl; -	bif_intr_cntl = RREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL); +	if (adev->asic_type == CHIP_ALDEBARAN) +		bif_intr_cntl = RREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL_ALDE); +	else +		bif_intr_cntl = RREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL); +  	if (state == AMDGPU_IRQ_STATE_ENABLE) {  		/* set interrupt vector select bit to 0 to select  		 * vetcor 1 for bare metal case */  		bif_intr_cntl = REG_SET_FIELD(bif_intr_cntl,  					      BIF_INTR_CNTL,  					      RAS_INTR_VEC_SEL, 0); -		WREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL, bif_intr_cntl); + +		if (adev->asic_type == CHIP_ALDEBARAN) +			WREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL_ALDE, bif_intr_cntl); +		else +			WREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL, bif_intr_cntl); +  	}  	return 0; @@ -476,14 +488,22 @@ static int nbio_v7_4_set_ras_err_event_athub_irq_state(struct amdgpu_device *ade  	 */  	uint32_t bif_intr_cntl; -	bif_intr_cntl = RREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL); +	if (adev->asic_type == CHIP_ALDEBARAN) +		bif_intr_cntl = RREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL_ALDE); +	else +		bif_intr_cntl = RREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL); +  	if (state == AMDGPU_IRQ_STATE_ENABLE) {  		/* set interrupt vector select bit to 0 to select  		 * vetcor 1 for bare metal case */  		bif_intr_cntl = REG_SET_FIELD(bif_intr_cntl,  					      BIF_INTR_CNTL,  					      RAS_INTR_VEC_SEL, 0); -		WREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL, bif_intr_cntl); + +		if (adev->asic_type == CHIP_ALDEBARAN) +			WREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL_ALDE, bif_intr_cntl); +		else +			WREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL, bif_intr_cntl);  	}  	return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c index 42a35d9520f9..fe9a7cc8d9eb 100644 --- a/drivers/gpu/drm/amd/amdgpu/vi.c +++ b/drivers/gpu/drm/amd/amdgpu/vi.c @@ -904,14 +904,7 @@ static bool vi_asic_supports_baco(struct amdgpu_device *adev)  	case CHIP_POLARIS11:  	case CHIP_POLARIS12:  	case CHIP_TOPAZ: -		/* Disable BACO support for the specific polaris12 SKU temporarily */ -		if ((adev->pdev->device == 0x699F) && -		     (adev->pdev->revision == 0xC7) && -		     (adev->pdev->subsystem_vendor == 0x1028) && -		     (adev->pdev->subsystem_device == 0x0039)) -			return false; -		else -			return amdgpu_dpm_is_baco_supported(adev); +		return amdgpu_dpm_is_baco_supported(adev);  	default:  		return false;  	} diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c index 491373fcdb38..9fc8021bb0ab 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c @@ -2484,7 +2484,8 @@ svm_range_restore_pages(struct amdgpu_device *adev, unsigned int pasid,  	}  	if (!p->xnack_enabled) {  		pr_debug("XNACK not enabled for pasid 0x%x\n", pasid); -		return -EFAULT; +		r = -EFAULT; +		goto out;  	}  	svms = &p->svms; diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 816723691d51..9b1fc54555ee 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -1200,7 +1200,7 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)  	dc_hardware_init(adev->dm.dc);  #if defined(CONFIG_DRM_AMD_DC_DCN) -	if (adev->apu_flags) { +	if ((adev->flags & AMD_IS_APU) && (adev->asic_type >= CHIP_CARRIZO)) {  		struct dc_phy_addr_space_config pa_config;  		mmhub_read_system_context(adev, &pa_config); diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c index cd025c12f17b..330edd666b7d 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c @@ -1561,7 +1561,7 @@ bool dc_link_dp_perform_link_training_skip_aux(  	struct dc_link *link,  	const struct dc_link_settings *link_setting)  { -	struct link_training_settings lt_settings; +	struct link_training_settings lt_settings = {0};  	dp_decide_training_settings(  			link, @@ -1707,7 +1707,7 @@ enum link_training_result dc_link_dp_perform_link_training(  	bool skip_video_pattern)  {  	enum link_training_result status = LINK_TRAINING_SUCCESS; -	struct link_training_settings lt_settings; +	struct link_training_settings lt_settings = {0};  	enum dp_link_encoding encoding =  			dp_get_link_encoding_format(link_settings); @@ -1923,7 +1923,7 @@ enum link_training_result dc_link_dp_sync_lt_attempt(      struct dc_link_settings *link_settings,      struct dc_link_training_overrides *lt_overrides)  { -	struct link_training_settings lt_settings; +	struct link_training_settings lt_settings = {0};  	enum link_training_result lt_status = LINK_TRAINING_SUCCESS;  	enum dp_panel_mode panel_mode = DP_PANEL_MODE_DEFAULT;  	enum clock_source_id dp_cs_id = CLOCK_SOURCE_ID_EXTERNAL; diff --git a/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c b/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c index dc7823d23ba8..dd38796ba30a 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c @@ -510,8 +510,12 @@ static struct stream_encoder *dcn303_stream_encoder_create(enum engine_id eng_id  	vpg = dcn303_vpg_create(ctx, vpg_inst);  	afmt = dcn303_afmt_create(ctx, afmt_inst); -	if (!enc1 || !vpg || !afmt) +	if (!enc1 || !vpg || !afmt) { +		kfree(enc1); +		kfree(vpg); +		kfree(afmt);  		return NULL; +	}  	dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id, vpg, afmt, &stream_enc_regs[eng_id],  			&se_shift, &se_mask); diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_panel_cntl.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_panel_cntl.c index 7db268da6976..3b3721386571 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_panel_cntl.c +++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_panel_cntl.c @@ -109,7 +109,7 @@ bool dcn31_is_panel_backlight_on(struct panel_cntl *panel_cntl)  	union dmub_rb_cmd cmd;  	if (!dcn31_query_backlight_info(panel_cntl, &cmd)) -		return 0; +		return false;  	return cmd.panel_cntl.data.is_backlight_on;  } @@ -119,7 +119,7 @@ bool dcn31_is_panel_powered_on(struct panel_cntl *panel_cntl)  	union dmub_rb_cmd cmd;  	if (!dcn31_query_backlight_info(panel_cntl, &cmd)) -		return 0; +		return false;  	return cmd.panel_cntl.data.is_powered_on;  } diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c index fbed5304692d..63bbdf8b8678 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c @@ -2641,7 +2641,7 @@ static void dml20v2_DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndP  		for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {  			if (mode_lib->vba.PrefetchMode[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] == 0) {  				if (mode_lib->vba.DRAMClockChangeWatermark > -				dml_max(mode_lib->vba.StutterEnterPlusExitWatermark, mode_lib->vba.UrgentWatermark)) +					dml_max(mode_lib->vba.StutterEnterPlusExitWatermark, mode_lib->vba.UrgentWatermark))  					mode_lib->vba.MinTTUVBlank[k] += 25;  			}  		} diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c index 2d55627b05b1..249cb0aeb5ae 100644 --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c @@ -2005,10 +2005,10 @@ static int ss_bias_attr_update(struct amdgpu_device *adev, struct amdgpu_device_  static struct amdgpu_device_attr amdgpu_device_attrs[] = {  	AMDGPU_DEVICE_ATTR_RW(power_dpm_state,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),  	AMDGPU_DEVICE_ATTR_RW(power_dpm_force_performance_level,	ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), -	AMDGPU_DEVICE_ATTR_RO(pp_num_states,				ATTR_FLAG_BASIC), -	AMDGPU_DEVICE_ATTR_RO(pp_cur_state,				ATTR_FLAG_BASIC), -	AMDGPU_DEVICE_ATTR_RW(pp_force_state,				ATTR_FLAG_BASIC), -	AMDGPU_DEVICE_ATTR_RW(pp_table,					ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RO(pp_num_states,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RO(pp_cur_state,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RW(pp_force_state,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RW(pp_table,					ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),  	AMDGPU_DEVICE_ATTR_RW(pp_dpm_sclk,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),  	AMDGPU_DEVICE_ATTR_RW(pp_dpm_mclk,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),  	AMDGPU_DEVICE_ATTR_RW(pp_dpm_socclk,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h index 715b4225f5ee..8156729c370b 100644 --- a/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h +++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h @@ -1335,6 +1335,30 @@ enum smu_cmn2asic_mapping_type {  #define WORKLOAD_MAP(profile, workload) \  	[profile] = {1, (workload)} +/** + * smu_memcpy_trailing - Copy the end of one structure into the middle of another + * + * @dst: Pointer to destination struct + * @first_dst_member: The member name in @dst where the overwrite begins + * @last_dst_member: The member name in @dst where the overwrite ends after + * @src: Pointer to the source struct + * @first_src_member: The member name in @src where the copy begins + * + */ +#define smu_memcpy_trailing(dst, first_dst_member, last_dst_member,	   \ +			    src, first_src_member)			   \ +({									   \ +	size_t __src_offset = offsetof(typeof(*(src)), first_src_member);  \ +	size_t __src_size = sizeof(*(src)) - __src_offset;		   \ +	size_t __dst_offset = offsetof(typeof(*(dst)), first_dst_member);  \ +	size_t __dst_size = offsetofend(typeof(*(dst)), last_dst_member) - \ +			    __dst_offset;				   \ +	BUILD_BUG_ON(__src_size != __dst_size);				   \ +	__builtin_memcpy((u8 *)(dst) + __dst_offset,			   \ +			 (u8 *)(src) + __src_offset,			   \ +			 __dst_size);					   \ +}) +  #if !defined(SWSMU_CODE_LAYER_L2) && !defined(SWSMU_CODE_LAYER_L3) && !defined(SWSMU_CODE_LAYER_L4)  int smu_get_power_limit(void *handle,  			uint32_t *limit, diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c index 465ff8d2a01a..e7803ce8f67a 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c @@ -27,6 +27,9 @@  #include <linux/pci.h>  #include <linux/slab.h>  #include <asm/div64.h> +#if IS_ENABLED(CONFIG_X86_64) +#include <asm/intel-family.h> +#endif  #include <drm/amdgpu_drm.h>  #include "ppatomctrl.h"  #include "atombios.h" @@ -1733,6 +1736,17 @@ static int smu7_disable_dpm_tasks(struct pp_hwmgr *hwmgr)  	return result;  } +static bool intel_core_rkl_chk(void) +{ +#if IS_ENABLED(CONFIG_X86_64) +	struct cpuinfo_x86 *c = &cpu_data(0); + +	return (c->x86 == 6 && c->x86_model == INTEL_FAM6_ROCKETLAKE); +#else +	return false; +#endif +} +  static void smu7_init_dpm_defaults(struct pp_hwmgr *hwmgr)  {  	struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); @@ -1758,7 +1772,8 @@ static void smu7_init_dpm_defaults(struct pp_hwmgr *hwmgr)  	data->mclk_dpm_key_disabled = hwmgr->feature_mask & PP_MCLK_DPM_MASK ? false : true;  	data->sclk_dpm_key_disabled = hwmgr->feature_mask & PP_SCLK_DPM_MASK ? false : true; -	data->pcie_dpm_key_disabled = hwmgr->feature_mask & PP_PCIE_DPM_MASK ? false : true; +	data->pcie_dpm_key_disabled = +		intel_core_rkl_chk() || !(hwmgr->feature_mask & PP_PCIE_DPM_MASK);  	/* need to set voltage control types before EVV patching */  	data->voltage_control = SMU7_VOLTAGE_CONTROL_NONE;  	data->vddci_control = SMU7_VOLTAGE_CONTROL_NONE; diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c index 273df66cac14..e343cc218990 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c @@ -483,10 +483,8 @@ static int arcturus_append_powerplay_table(struct smu_context *smu)  	if ((smc_dpm_table->table_header.format_revision == 4) &&  	    (smc_dpm_table->table_header.content_revision == 6)) -		memcpy(&smc_pptable->MaxVoltageStepGfx, -		       &smc_dpm_table->maxvoltagestepgfx, -		       sizeof(*smc_dpm_table) - offsetof(struct atom_smc_dpm_info_v4_6, maxvoltagestepgfx)); - +		smu_memcpy_trailing(smc_pptable, MaxVoltageStepGfx, BoardReserved, +				    smc_dpm_table, maxvoltagestepgfx);  	return 0;  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c index f96681700c41..a5fc5d7cb6c7 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c @@ -431,16 +431,16 @@ static int navi10_append_powerplay_table(struct smu_context *smu)  	switch (smc_dpm_table->table_header.content_revision) {  	case 5: /* nv10 and nv14 */ -		memcpy(smc_pptable->I2cControllers, smc_dpm_table->I2cControllers, -			sizeof(*smc_dpm_table) - sizeof(smc_dpm_table->table_header)); +		smu_memcpy_trailing(smc_pptable, I2cControllers, BoardReserved, +				    smc_dpm_table, I2cControllers);  		break;  	case 7: /* nv12 */  		ret = amdgpu_atombios_get_data_table(adev, index, NULL, NULL, NULL,  					      (uint8_t **)&smc_dpm_table_v4_7);  		if (ret)  			return ret; -		memcpy(smc_pptable->I2cControllers, smc_dpm_table_v4_7->I2cControllers, -			sizeof(*smc_dpm_table_v4_7) - sizeof(smc_dpm_table_v4_7->table_header)); +		smu_memcpy_trailing(smc_pptable, I2cControllers, BoardReserved, +				    smc_dpm_table_v4_7, I2cControllers);  		break;  	default:  		dev_err(smu->adev->dev, "smc_dpm_info with unsupported content revision %d!\n", diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c index 6eb50b05a33c..3a3421452e57 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c @@ -1869,7 +1869,7 @@ static int vangogh_od_edit_dpm_table(struct smu_context *smu, enum PP_OD_DPM_TAB  		} else {  			if (smu->gfx_actual_hard_min_freq > smu->gfx_actual_soft_max_freq) {  				dev_err(smu->adev->dev, -					"The setting minimun sclk (%d) MHz is greater than the setting maximum sclk (%d) MHz\n", +					"The setting minimum sclk (%d) MHz is greater than the setting maximum sclk (%d) MHz\n",  					smu->gfx_actual_hard_min_freq,  					smu->gfx_actual_soft_max_freq);  				return -EINVAL; diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c index b39138041141..5aa175e12a78 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c @@ -426,7 +426,7 @@ static int renoir_od_edit_dpm_table(struct smu_context *smu,  		} else {  			if (smu->gfx_actual_hard_min_freq > smu->gfx_actual_soft_max_freq) {  				dev_err(smu->adev->dev, -					"The setting minimun sclk (%d) MHz is greater than the setting maximum sclk (%d) MHz\n", +					"The setting minimum sclk (%d) MHz is greater than the setting maximum sclk (%d) MHz\n",  					smu->gfx_actual_hard_min_freq,  					smu->gfx_actual_soft_max_freq);  				return -EINVAL; diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c index ec8c30daf31c..ab652028e003 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c @@ -409,9 +409,8 @@ static int aldebaran_append_powerplay_table(struct smu_context *smu)  	if ((smc_dpm_table->table_header.format_revision == 4) &&  	    (smc_dpm_table->table_header.content_revision == 10)) -		memcpy(&smc_pptable->GfxMaxCurrent, -		       &smc_dpm_table->GfxMaxCurrent, -		       sizeof(*smc_dpm_table) - offsetof(struct atom_smc_dpm_info_v4_10, GfxMaxCurrent)); +		smu_memcpy_trailing(smc_pptable, GfxMaxCurrent, reserved, +				    smc_dpm_table, GfxMaxCurrent);  	return 0;  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c index 0f17c2522c85..627ba2eec7fd 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c @@ -731,7 +731,7 @@ static int yellow_carp_od_edit_dpm_table(struct smu_context *smu, enum PP_OD_DPM  		} else {  			if (smu->gfx_actual_hard_min_freq > smu->gfx_actual_soft_max_freq) {  				dev_err(smu->adev->dev, -					"The setting minimun sclk (%d) MHz is greater than the setting maximum sclk (%d) MHz\n", +					"The setting minimum sclk (%d) MHz is greater than the setting maximum sclk (%d) MHz\n",  					smu->gfx_actual_hard_min_freq,  					smu->gfx_actual_soft_max_freq);  				return -EINVAL; | 
