diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
21 files changed, 238 insertions, 91 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 164141bc8b4a..39018f784f9c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -1272,6 +1272,7 @@ void amdgpu_device_pci_config_reset(struct amdgpu_device *adev);  int amdgpu_device_pci_reset(struct amdgpu_device *adev);  bool amdgpu_device_need_post(struct amdgpu_device *adev);  bool amdgpu_device_should_use_aspm(struct amdgpu_device *adev); +bool amdgpu_device_aspm_support_quirk(void);  void amdgpu_cs_report_moved_bytes(struct amdgpu_device *adev, u64 num_bytes,  				  u64 num_vis_bytes); @@ -1391,10 +1392,12 @@ int amdgpu_acpi_smart_shift_update(struct drm_device *dev, enum amdgpu_ss ss_sta  int amdgpu_acpi_pcie_notify_device_ready(struct amdgpu_device *adev);  void amdgpu_acpi_get_backlight_caps(struct amdgpu_dm_backlight_caps *caps); +bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev);  void amdgpu_acpi_detect(void);  #else  static inline int amdgpu_acpi_init(struct amdgpu_device *adev) { return 0; }  static inline void amdgpu_acpi_fini(struct amdgpu_device *adev) { } +static inline bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) { return false; }  static inline void amdgpu_acpi_detect(void) { }  static inline bool amdgpu_acpi_is_power_shift_control_supported(void) { return false; }  static inline int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev, @@ -1405,11 +1408,9 @@ static inline int amdgpu_acpi_smart_shift_update(struct drm_device *dev,  #if defined(CONFIG_ACPI) && defined(CONFIG_SUSPEND)  bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev); -bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev);  bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev);  #else  static inline bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) { return false; } -static inline bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) { return false; }  static inline bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev) { return false; }  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c index d4196fcb85a0..aeeec211861c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c @@ -971,6 +971,34 @@ static bool amdgpu_atcs_pci_probe_handle(struct pci_dev *pdev)  	return true;  } + +/** + * amdgpu_acpi_should_gpu_reset + * + * @adev: amdgpu_device_pointer + * + * returns true if should reset GPU, false if not + */ +bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) +{ +	if ((adev->flags & AMD_IS_APU) && +	    adev->gfx.imu.funcs) /* Not need to do mode2 reset for IMU enabled APUs */ +		return false; + +	if ((adev->flags & AMD_IS_APU) && +	    amdgpu_acpi_is_s3_active(adev)) +		return false; + +	if (amdgpu_sriov_vf(adev)) +		return false; + +#if IS_ENABLED(CONFIG_SUSPEND) +	return pm_suspend_target_state != PM_SUSPEND_TO_IDLE; +#else +	return true; +#endif +} +  /*   * amdgpu_acpi_detect - detect ACPI ATIF/ATCS methods   * @@ -1043,24 +1071,6 @@ bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev)  }  /** - * amdgpu_acpi_should_gpu_reset - * - * @adev: amdgpu_device_pointer - * - * returns true if should reset GPU, false if not - */ -bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) -{ -	if (adev->flags & AMD_IS_APU) -		return false; - -	if (amdgpu_sriov_vf(adev)) -		return false; - -	return pm_suspend_target_state != PM_SUSPEND_TO_IDLE; -} - -/**   * amdgpu_acpi_is_s0ix_active   *   * @adev: amdgpu_device_pointer diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index c4a4e2fe6681..3d98fc2ad36b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -80,6 +80,10 @@  #include <drm/drm_drv.h> +#if IS_ENABLED(CONFIG_X86) +#include <asm/intel-family.h> +#endif +  MODULE_FIRMWARE("amdgpu/vega10_gpu_info.bin");  MODULE_FIRMWARE("amdgpu/vega12_gpu_info.bin");  MODULE_FIRMWARE("amdgpu/raven_gpu_info.bin"); @@ -1356,6 +1360,17 @@ bool amdgpu_device_should_use_aspm(struct amdgpu_device *adev)  	return pcie_aspm_enabled(adev->pdev);  } +bool amdgpu_device_aspm_support_quirk(void) +{ +#if IS_ENABLED(CONFIG_X86) +	struct cpuinfo_x86 *c = &cpu_data(0); + +	return !(c->x86 == 6 && c->x86_model == INTEL_FAM6_ALDERLAKE); +#else +	return true; +#endif +} +  /* if we get transitioned to only one device, take VGA back */  /**   * amdgpu_device_vga_set_decode - enable/disable vga decode @@ -4145,8 +4160,6 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)  	if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D3))  		DRM_WARN("smart shift update failed\n"); -	drm_kms_helper_poll_disable(dev); -  	if (fbcon)  		drm_fb_helper_set_suspend_unlocked(adev_to_drm(adev)->fb_helper, true); @@ -4243,8 +4256,6 @@ exit:  	if (fbcon)  		drm_fb_helper_set_suspend_unlocked(adev_to_drm(adev)->fb_helper, false); -	drm_kms_helper_poll_enable(dev); -  	amdgpu_ras_resume(adev);  	if (adev->mode_info.num_crtc) { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c index b719852daa07..1a3cb53d2e0d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c @@ -543,6 +543,7 @@ static void amdgpu_discovery_read_from_harvest_table(struct amdgpu_device *adev,  	struct harvest_table *harvest_info;  	u16 offset;  	int i; +	uint32_t umc_harvest_config = 0;  	bhdr = (struct binary_header *)adev->mman.discovery_bin;  	offset = le16_to_cpu(bhdr->table_list[HARVEST_INFO].offset); @@ -570,12 +571,17 @@ static void amdgpu_discovery_read_from_harvest_table(struct amdgpu_device *adev,  			adev->harvest_ip_mask |= AMD_HARVEST_IP_DMU_MASK;  			break;  		case UMC_HWID: +			umc_harvest_config |= +				1 << (le16_to_cpu(harvest_info->list[i].number_instance));  			(*umc_harvest_count)++;  			break;  		default:  			break;  		}  	} + +	adev->umc.active_mask = ((1 << adev->umc.node_inst_num) - 1) & +				~umc_harvest_config;  }  /* ================================================== */ @@ -1156,8 +1162,10 @@ static int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)  						AMDGPU_MAX_SDMA_INSTANCES);  			} -			if (le16_to_cpu(ip->hw_id) == UMC_HWID) +			if (le16_to_cpu(ip->hw_id) == UMC_HWID) {  				adev->gmc.num_umc++; +				adev->umc.node_inst_num++; +			}  			for (k = 0; k < num_base_address; k++) {  				/* diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index 503f89a766c3..d60fe7eb5579 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c @@ -1618,6 +1618,8 @@ int amdgpu_display_suspend_helper(struct amdgpu_device *adev)  	struct drm_connector_list_iter iter;  	int r; +	drm_kms_helper_poll_disable(dev); +  	/* turn off display hw */  	drm_modeset_lock_all(dev);  	drm_connector_list_iter_begin(dev, &iter); @@ -1694,6 +1696,8 @@ int amdgpu_display_resume_helper(struct amdgpu_device *adev)  	drm_modeset_unlock_all(dev); +	drm_kms_helper_poll_enable(dev); +  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index f5ffca24def4..ba5def374368 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -2467,7 +2467,10 @@ static int amdgpu_pmops_freeze(struct device *dev)  	adev->in_s4 = false;  	if (r)  		return r; -	return amdgpu_asic_reset(adev); + +	if (amdgpu_acpi_should_gpu_reset(adev)) +		return amdgpu_asic_reset(adev); +	return 0;  }  static int amdgpu_pmops_thaw(struct device *dev) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index faff4a3f96e6..f52d0ba91a77 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c @@ -678,6 +678,15 @@ void amdgpu_fence_driver_clear_job_fences(struct amdgpu_ring *ring)  		ptr = &ring->fence_drv.fences[i];  		old = rcu_dereference_protected(*ptr, 1);  		if (old && old->ops == &amdgpu_job_fence_ops) { +			struct amdgpu_job *job; + +			/* For non-scheduler bad job, i.e. failed ib test, we need to signal +			 * it right here or we won't be able to track them in fence_drv +			 * and they will remain unsignaled during sa_bo free. +			 */ +			job = container_of(old, struct amdgpu_job, hw_fence); +			if (!job->base.s_fence && !dma_fence_is_signaled(old)) +				dma_fence_signal(old);  			RCU_INIT_POINTER(*ptr, NULL);  			dma_fence_put(old);  		} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index e3e1ed4314dd..6c7d672412b2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -1315,7 +1315,7 @@ void amdgpu_bo_release_notify(struct ttm_buffer_object *bo)  	if (!bo->resource || bo->resource->mem_type != TTM_PL_VRAM ||  	    !(abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE) || -	    adev->in_suspend || adev->shutdown) +	    adev->in_suspend || drm_dev_is_unplugged(adev_to_drm(adev)))  		return;  	if (WARN_ON_ONCE(!dma_resv_trylock(bo->base.resv))) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index 28fe6d941054..3f5d13035aff 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c @@ -602,27 +602,14 @@ psp_cmd_submit_buf(struct psp_context *psp,  		   struct psp_gfx_cmd_resp *cmd, uint64_t fence_mc_addr)  {  	int ret; -	int index, idx; +	int index;  	int timeout = 20000;  	bool ras_intr = false;  	bool skip_unsupport = false; -	bool dev_entered;  	if (psp->adev->no_hw_access)  		return 0; -	dev_entered = drm_dev_enter(adev_to_drm(psp->adev), &idx); -	/* -	 * We allow sending PSP messages LOAD_ASD and UNLOAD_TA without acquiring -	 * a lock in drm_dev_enter during driver unload because we must call -	 * drm_dev_unplug as the beginning  of unload driver sequence . It is very -	 * crucial that userspace can't access device instances anymore. -	 */ -	if (!dev_entered) -		WARN_ON(psp->cmd_buf_mem->cmd_id != GFX_CMD_ID_LOAD_ASD && -			psp->cmd_buf_mem->cmd_id != GFX_CMD_ID_UNLOAD_TA && -			psp->cmd_buf_mem->cmd_id != GFX_CMD_ID_INVOKE_CMD); -  	memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE);  	memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp)); @@ -686,8 +673,6 @@ psp_cmd_submit_buf(struct psp_context *psp,  	}  exit: -	if (dev_entered) -		drm_dev_exit(idx);  	return ret;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h index f2bf979af588..36e19336f3b3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h @@ -42,7 +42,7 @@  #define LOOP_UMC_INST_AND_CH(umc_inst, ch_inst) LOOP_UMC_INST((umc_inst)) LOOP_UMC_CH_INST((ch_inst))  #define LOOP_UMC_NODE_INST(node_inst) \ -		for ((node_inst) = 0; (node_inst) < adev->umc.node_inst_num; (node_inst)++) +		for_each_set_bit((node_inst), &(adev->umc.active_mask), adev->umc.node_inst_num)  #define LOOP_UMC_EACH_NODE_INST_AND_CH(node_inst, umc_inst, ch_inst) \  		LOOP_UMC_NODE_INST((node_inst)) LOOP_UMC_INST_AND_CH((umc_inst), (ch_inst)) @@ -69,7 +69,7 @@ struct amdgpu_umc {  	/* number of umc instance with memory map register access */  	uint32_t umc_inst_num; -	/*number of umc node instance with memory map register access*/ +	/* Total number of umc node instance including harvest one */  	uint32_t node_inst_num;  	/* UMC regiser per channel offset */ @@ -82,6 +82,9 @@ struct amdgpu_umc {  	const struct amdgpu_umc_funcs *funcs;  	struct amdgpu_umc_ras *ras; + +	/* active mask for umc node instance */ +	unsigned long active_mask;  };  int amdgpu_umc_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *ras_block); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c index 25217b05c0ea..e7974de8b035 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c @@ -26,6 +26,7 @@  #include <linux/firmware.h>  #include <linux/module.h> +#include <linux/dmi.h>  #include <linux/pci.h>  #include <linux/debugfs.h>  #include <drm/drm_drv.h> @@ -114,6 +115,24 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)  	    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))  		adev->vcn.indirect_sram = true; +	/* +	 * Some Steam Deck's BIOS versions are incompatible with the +	 * indirect SRAM mode, leading to amdgpu being unable to get +	 * properly probed (and even potentially crashing the kernel). +	 * Hence, check for these versions here - notice this is +	 * restricted to Vangogh (Deck's APU). +	 */ +	if (adev->ip_versions[UVD_HWIP][0] == IP_VERSION(3, 0, 2)) { +		const char *bios_ver = dmi_get_system_info(DMI_BIOS_VERSION); + +		if (bios_ver && (!strncmp("F7A0113", bios_ver, 7) || +		     !strncmp("F7A0114", bios_ver, 7))) { +			adev->vcn.indirect_sram = false; +			dev_info(adev->dev, +				"Steam Deck quirk: indirect SRAM disabled on BIOS %s\n", bios_ver); +		} +	} +  	hdr = (const struct common_firmware_header *)adev->vcn.fw->data;  	adev->vcn.fw_version = le32_to_cpu(hdr->ucode_version); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h index b9e9480448af..4f7bab52282a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h @@ -124,6 +124,8 @@ enum AMDGIM_FEATURE_FLAG {  	AMDGIM_FEATURE_PP_ONE_VF = (1 << 4),  	/* Indirect Reg Access enabled */  	AMDGIM_FEATURE_INDIRECT_REG_ACCESS = (1 << 5), +	/* AV1 Support MODE*/ +	AMDGIM_FEATURE_AV1_SUPPORT = (1 << 6),  };  enum AMDGIM_REG_ACCESS_FLAG { @@ -322,6 +324,8 @@ static inline bool is_virtual_machine(void)  	((!amdgpu_in_reset(adev)) && adev->virt.tdr_debug)  #define amdgpu_sriov_is_normal(adev) \  	((!amdgpu_in_reset(adev)) && (!adev->virt.tdr_debug)) +#define amdgpu_sriov_is_av1_support(adev) \ +	((adev)->virt.gim_feature & AMDGIM_FEATURE_AV1_SUPPORT)  bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev);  void amdgpu_virt_init_setting(struct amdgpu_device *adev);  void amdgpu_virt_kiq_reg_write_reg_wait(struct amdgpu_device *adev, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h b/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h index 6c97148ca0ed..24d42d24e6a0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h @@ -93,7 +93,8 @@ union amd_sriov_msg_feature_flags {  		uint32_t mm_bw_management  : 1;  		uint32_t pp_one_vf_mode	   : 1;  		uint32_t reg_indirect_acc  : 1; -		uint32_t reserved	   : 26; +		uint32_t av1_support       : 1; +		uint32_t reserved	   : 25;  	} flags;  	uint32_t all;  }; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c index 3bf697a80cf2..ecf8ceb53311 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c @@ -1287,6 +1287,11 @@ static int gfx_v11_0_sw_init(void *handle)  		break;  	} +	/* Enable CG flag in one VF mode for enabling RLC safe mode enter/exit */ +	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(11, 0, 3) && +		amdgpu_sriov_is_pp_one_vf(adev)) +		adev->cg_flags = AMD_CG_SUPPORT_GFX_CGCG; +  	/* EOP Event */  	r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_GRBM_CP,  			      GFX_11_0_0__SRCID__CP_EOP_INTERRUPT, @@ -4655,6 +4660,14 @@ static bool gfx_v11_0_check_soft_reset(void *handle)  	return false;  } +static int gfx_v11_0_post_soft_reset(void *handle) +{ +	/** +	 * GFX soft reset will impact MES, need resume MES when do GFX soft reset +	 */ +	return amdgpu_mes_resume((struct amdgpu_device *)handle); +} +  static uint64_t gfx_v11_0_get_gpu_clock_counter(struct amdgpu_device *adev)  {  	uint64_t clock; @@ -6166,6 +6179,7 @@ static const struct amd_ip_funcs gfx_v11_0_ip_funcs = {  	.wait_for_idle = gfx_v11_0_wait_for_idle,  	.soft_reset = gfx_v11_0_soft_reset,  	.check_soft_reset = gfx_v11_0_check_soft_reset, +	.post_soft_reset = gfx_v11_0_post_soft_reset,  	.set_clockgating_state = gfx_v11_0_set_clockgating_state,  	.set_powergating_state = gfx_v11_0_set_powergating_state,  	.get_clockgating_state = gfx_v11_0_get_clockgating_state, diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c index 85e0afc3d4f7..af7b3ba1ca00 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c @@ -567,7 +567,6 @@ static void gmc_v11_0_set_umc_funcs(struct amdgpu_device *adev)  	case IP_VERSION(8, 10, 0):  		adev->umc.channel_inst_num = UMC_V8_10_CHANNEL_INSTANCE_NUM;  		adev->umc.umc_inst_num = UMC_V8_10_UMC_INSTANCE_NUM; -		adev->umc.node_inst_num = adev->gmc.num_umc;  		adev->umc.max_ras_err_cnt_per_query = UMC_V8_10_TOTAL_CHANNEL_NUM(adev);  		adev->umc.channel_offs = UMC_V8_10_PER_CHANNEL_OFFSET;  		adev->umc.retire_unit = UMC_V8_10_NA_COL_2BITS_POWER_OF_2_NUM; diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_2.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_2.c index 4b0d563c6522..4ef1fa4603c8 100644 --- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_2.c +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_2.c @@ -382,11 +382,6 @@ static void nbio_v7_2_init_registers(struct amdgpu_device *adev)  		if (def != data)  			WREG32_PCIE_PORT(SOC15_REG_OFFSET(NBIO, 0, regBIF1_PCIE_MST_CTRL_3), data);  		break; -	case IP_VERSION(7, 5, 1): -		data = RREG32_SOC15(NBIO, 0, regRCC_DEV2_EPF0_STRAP2); -		data &= ~RCC_DEV2_EPF0_STRAP2__STRAP_NO_SOFT_RESET_DEV2_F0_MASK; -		WREG32_SOC15(NBIO, 0, regRCC_DEV2_EPF0_STRAP2, data); -		fallthrough;  	default:  		def = data = RREG32_PCIE_PORT(SOC15_REG_OFFSET(NBIO, 0, regPCIE_CONFIG_CNTL));  		data = REG_SET_FIELD(data, PCIE_CONFIG_CNTL, @@ -399,6 +394,15 @@ static void nbio_v7_2_init_registers(struct amdgpu_device *adev)  		break;  	} +	switch (adev->ip_versions[NBIO_HWIP][0]) { +	case IP_VERSION(7, 3, 0): +	case IP_VERSION(7, 5, 1): +		data = RREG32_SOC15(NBIO, 0, regRCC_DEV2_EPF0_STRAP2); +		data &= ~RCC_DEV2_EPF0_STRAP2__STRAP_NO_SOFT_RESET_DEV2_F0_MASK; +		WREG32_SOC15(NBIO, 0, regRCC_DEV2_EPF0_STRAP2, data); +		break; +	} +  	if (amdgpu_sriov_vf(adev))  		adev->rmmio_remap.reg_offset = SOC15_REG_OFFSET(NBIO, 0,  			regBIF_BX_PF0_HDP_MEM_COHERENCY_FLUSH_CNTL) << 2; diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c index d972025f0d20..ebe0e2d7dbd1 100644 --- a/drivers/gpu/drm/amd/amdgpu/nv.c +++ b/drivers/gpu/drm/amd/amdgpu/nv.c @@ -444,9 +444,10 @@ static int nv_read_register(struct amdgpu_device *adev, u32 se_num,  	*value = 0;  	for (i = 0; i < ARRAY_SIZE(nv_allowed_read_registers); i++) {  		en = &nv_allowed_read_registers[i]; -		if (adev->reg_offset[en->hwip][en->inst] && -		    reg_offset != (adev->reg_offset[en->hwip][en->inst][en->seg] -				   + en->reg_offset)) +		if (!adev->reg_offset[en->hwip][en->inst]) +			continue; +		else if (reg_offset != (adev->reg_offset[en->hwip][en->inst][en->seg] +					+ en->reg_offset))  			continue;  		*value = nv_get_register_value(adev, @@ -577,7 +578,7 @@ static void nv_pcie_gen3_enable(struct amdgpu_device *adev)  static void nv_program_aspm(struct amdgpu_device *adev)  { -	if (!amdgpu_device_should_use_aspm(adev)) +	if (!amdgpu_device_should_use_aspm(adev) || !amdgpu_device_aspm_support_quirk())  		return;  	if (!(adev->flags & AMD_IS_APU) && @@ -1054,8 +1055,8 @@ static int nv_common_late_init(void *handle)  			amdgpu_virt_update_sriov_video_codec(adev,  							     sriov_sc_video_codecs_encode_array,  							     ARRAY_SIZE(sriov_sc_video_codecs_encode_array), -							     sriov_sc_video_codecs_decode_array_vcn1, -							     ARRAY_SIZE(sriov_sc_video_codecs_decode_array_vcn1)); +							     sriov_sc_video_codecs_decode_array_vcn0, +							     ARRAY_SIZE(sriov_sc_video_codecs_decode_array_vcn0));  		}  	} diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index 7cd17dda32ce..2eddd7f6cd41 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c @@ -439,8 +439,9 @@ static int soc15_read_register(struct amdgpu_device *adev, u32 se_num,  	*value = 0;  	for (i = 0; i < ARRAY_SIZE(soc15_allowed_read_registers); i++) {  		en = &soc15_allowed_read_registers[i]; -		if (adev->reg_offset[en->hwip][en->inst] && -			reg_offset != (adev->reg_offset[en->hwip][en->inst][en->seg] +		if (!adev->reg_offset[en->hwip][en->inst]) +			continue; +		else if (reg_offset != (adev->reg_offset[en->hwip][en->inst][en->seg]  					+ en->reg_offset))  			continue; diff --git a/drivers/gpu/drm/amd/amdgpu/soc21.c b/drivers/gpu/drm/amd/amdgpu/soc21.c index 620f7409825d..c82b3a7ea5f0 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc21.c +++ b/drivers/gpu/drm/amd/amdgpu/soc21.c @@ -102,6 +102,59 @@ static const struct amdgpu_video_codecs vcn_4_0_0_video_codecs_decode_vcn1 =  	.codec_array = vcn_4_0_0_video_codecs_decode_array_vcn1,  }; +/* SRIOV SOC21, not const since data is controlled by host */ +static struct amdgpu_video_codec_info sriov_vcn_4_0_0_video_codecs_encode_array_vcn0[] = { +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2304, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 2304, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)}, +}; + +static struct amdgpu_video_codec_info sriov_vcn_4_0_0_video_codecs_encode_array_vcn1[] = { +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2304, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 2304, 0)}, +}; + +static struct amdgpu_video_codecs sriov_vcn_4_0_0_video_codecs_encode_vcn0 = { +	.codec_count = ARRAY_SIZE(sriov_vcn_4_0_0_video_codecs_encode_array_vcn0), +	.codec_array = sriov_vcn_4_0_0_video_codecs_encode_array_vcn0, +}; + +static struct amdgpu_video_codecs sriov_vcn_4_0_0_video_codecs_encode_vcn1 = { +	.codec_count = ARRAY_SIZE(sriov_vcn_4_0_0_video_codecs_encode_array_vcn1), +	.codec_array = sriov_vcn_4_0_0_video_codecs_encode_array_vcn1, +}; + +static struct amdgpu_video_codec_info sriov_vcn_4_0_0_video_codecs_decode_array_vcn0[] = { +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4096, 3)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4096, 5)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4096, 4)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)}, +}; + +static struct amdgpu_video_codec_info sriov_vcn_4_0_0_video_codecs_decode_array_vcn1[] = { +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4096, 3)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4, 4096, 4096, 5)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1, 4096, 4096, 4)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)}, +}; + +static struct amdgpu_video_codecs sriov_vcn_4_0_0_video_codecs_decode_vcn0 = { +	.codec_count = ARRAY_SIZE(sriov_vcn_4_0_0_video_codecs_decode_array_vcn0), +	.codec_array = sriov_vcn_4_0_0_video_codecs_decode_array_vcn0, +}; + +static struct amdgpu_video_codecs sriov_vcn_4_0_0_video_codecs_decode_vcn1 = { +	.codec_count = ARRAY_SIZE(sriov_vcn_4_0_0_video_codecs_decode_array_vcn1), +	.codec_array = sriov_vcn_4_0_0_video_codecs_decode_array_vcn1, +}; +  static int soc21_query_video_codecs(struct amdgpu_device *adev, bool encode,  				 const struct amdgpu_video_codecs **codecs)  { @@ -111,16 +164,32 @@ static int soc21_query_video_codecs(struct amdgpu_device *adev, bool encode,  	switch (adev->ip_versions[UVD_HWIP][0]) {  	case IP_VERSION(4, 0, 0):  	case IP_VERSION(4, 0, 2): -		if (adev->vcn.harvest_config & AMDGPU_VCN_HARVEST_VCN0) { -			if (encode) -				*codecs = &vcn_4_0_0_video_codecs_encode_vcn1; -			else -				*codecs = &vcn_4_0_0_video_codecs_decode_vcn1; +	case IP_VERSION(4, 0, 4): +		if (amdgpu_sriov_vf(adev)) { +			if ((adev->vcn.harvest_config & AMDGPU_VCN_HARVEST_VCN0) || +			!amdgpu_sriov_is_av1_support(adev)) { +				if (encode) +					*codecs = &sriov_vcn_4_0_0_video_codecs_encode_vcn1; +				else +					*codecs = &sriov_vcn_4_0_0_video_codecs_decode_vcn1; +			} else { +				if (encode) +					*codecs = &sriov_vcn_4_0_0_video_codecs_encode_vcn0; +				else +					*codecs = &sriov_vcn_4_0_0_video_codecs_decode_vcn0; +			}  		} else { -			if (encode) -				*codecs = &vcn_4_0_0_video_codecs_encode_vcn0; -			else -				*codecs = &vcn_4_0_0_video_codecs_decode_vcn0; +			if ((adev->vcn.harvest_config & AMDGPU_VCN_HARVEST_VCN0)) { +				if (encode) +					*codecs = &vcn_4_0_0_video_codecs_encode_vcn1; +				else +					*codecs = &vcn_4_0_0_video_codecs_decode_vcn1; +			} else { +				if (encode) +					*codecs = &vcn_4_0_0_video_codecs_encode_vcn0; +				else +					*codecs = &vcn_4_0_0_video_codecs_decode_vcn0; +			}  		}  		return 0;  	default: @@ -291,9 +360,10 @@ static int soc21_read_register(struct amdgpu_device *adev, u32 se_num,  	*value = 0;  	for (i = 0; i < ARRAY_SIZE(soc21_allowed_read_registers); i++) {  		en = &soc21_allowed_read_registers[i]; -		if (adev->reg_offset[en->hwip][en->inst] && -		    reg_offset != (adev->reg_offset[en->hwip][en->inst][en->seg] -				   + en->reg_offset)) +		if (!adev->reg_offset[en->hwip][en->inst]) +			continue; +		else if (reg_offset != (adev->reg_offset[en->hwip][en->inst][en->seg] +					+ en->reg_offset))  			continue;  		*value = soc21_get_register_value(adev, @@ -728,8 +798,23 @@ static int soc21_common_late_init(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	if (amdgpu_sriov_vf(adev)) +	if (amdgpu_sriov_vf(adev)) {  		xgpu_nv_mailbox_get_irq(adev); +		if ((adev->vcn.harvest_config & AMDGPU_VCN_HARVEST_VCN0) || +		!amdgpu_sriov_is_av1_support(adev)) { +			amdgpu_virt_update_sriov_video_codec(adev, +							     sriov_vcn_4_0_0_video_codecs_encode_array_vcn1, +							     ARRAY_SIZE(sriov_vcn_4_0_0_video_codecs_encode_array_vcn1), +							     sriov_vcn_4_0_0_video_codecs_decode_array_vcn1, +							     ARRAY_SIZE(sriov_vcn_4_0_0_video_codecs_decode_array_vcn1)); +		} else { +			amdgpu_virt_update_sriov_video_codec(adev, +							     sriov_vcn_4_0_0_video_codecs_encode_array_vcn0, +							     ARRAY_SIZE(sriov_vcn_4_0_0_video_codecs_encode_array_vcn0), +							     sriov_vcn_4_0_0_video_codecs_decode_array_vcn0, +							     ARRAY_SIZE(sriov_vcn_4_0_0_video_codecs_decode_array_vcn0)); +		} +	}  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/umc_v8_10.h b/drivers/gpu/drm/amd/amdgpu/umc_v8_10.h index 25eaf4af5fcf..c6dfd433fec7 100644 --- a/drivers/gpu/drm/amd/amdgpu/umc_v8_10.h +++ b/drivers/gpu/drm/amd/amdgpu/umc_v8_10.h @@ -31,9 +31,9 @@  /* number of umc instance with memory map register access */  #define UMC_V8_10_UMC_INSTANCE_NUM		2 -/* Total channel instances for all umc nodes */ +/* Total channel instances for all available umc nodes */  #define UMC_V8_10_TOTAL_CHANNEL_NUM(adev) \ -	(UMC_V8_10_CHANNEL_INSTANCE_NUM * UMC_V8_10_UMC_INSTANCE_NUM * (adev)->umc.node_inst_num) +	(UMC_V8_10_CHANNEL_INSTANCE_NUM * UMC_V8_10_UMC_INSTANCE_NUM * (adev)->gmc.num_umc)  /* UMC regiser per channel offset */  #define UMC_V8_10_PER_CHANNEL_OFFSET	0x400 diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c index 12ef782eb478..ceab8783575c 100644 --- a/drivers/gpu/drm/amd/amdgpu/vi.c +++ b/drivers/gpu/drm/amd/amdgpu/vi.c @@ -81,10 +81,6 @@  #include "mxgpu_vi.h"  #include "amdgpu_dm.h" -#if IS_ENABLED(CONFIG_X86) -#include <asm/intel-family.h> -#endif -  #define ixPCIE_LC_L1_PM_SUBSTATE	0x100100C6  #define PCIE_LC_L1_PM_SUBSTATE__LC_L1_SUBSTATES_OVERRIDE_EN_MASK	0x00000001L  #define PCIE_LC_L1_PM_SUBSTATE__LC_PCI_PM_L1_2_OVERRIDE_MASK	0x00000002L @@ -1138,24 +1134,13 @@ static void vi_enable_aspm(struct amdgpu_device *adev)  		WREG32_PCIE(ixPCIE_LC_CNTL, data);  } -static bool aspm_support_quirk_check(void) -{ -#if IS_ENABLED(CONFIG_X86) -	struct cpuinfo_x86 *c = &cpu_data(0); - -	return !(c->x86 == 6 && c->x86_model == INTEL_FAM6_ALDERLAKE); -#else -	return true; -#endif -} -  static void vi_program_aspm(struct amdgpu_device *adev)  {  	u32 data, data1, orig;  	bool bL1SS = false;  	bool bClkReqSupport = true; -	if (!amdgpu_device_should_use_aspm(adev) || !aspm_support_quirk_check()) +	if (!amdgpu_device_should_use_aspm(adev) || !amdgpu_device_aspm_support_quirk())  		return;  	if (adev->flags & AMD_IS_APU || |