mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 22:52:19 +02:00
amd-drm-next-6.17-2025-07-11:
amdgpu: - Clean up function signatures - GC 10 KGQ reset fix - SDMA reset cleanups - Misc fixes - LVDS fixes - UserQ fix amdkfd: - Reset fix -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQQgO5Idg2tXNTSZAr293/aFa7yZ2AUCaHF5fgAKCRC93/aFa7yZ 2FbQAPsH59r6i1K6TfyLYuCIOwFXyqx/AEy2/HmlBx3r2ElC2AEA8R0rrKTVpzlP ZN6WaCDLEBOlk21S3U3QCHuSlf/G1Ac= =H/st -----END PGP SIGNATURE----- Merge tag 'amd-drm-next-6.17-2025-07-11' of https://gitlab.freedesktop.org/agd5f/linux into drm-next amd-drm-next-6.17-2025-07-11: amdgpu: - Clean up function signatures - GC 10 KGQ reset fix - SDMA reset cleanups - Misc fixes - LVDS fixes - UserQ fix amdkfd: - Reset fix Signed-off-by: Simona Vetter <simona.vetter@ffwll.ch> From: Alex Deucher <alexander.deucher@amd.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250711205548.21052-1-alexander.deucher@amd.com
This commit is contained in:
commit
7e11e01d1f
|
|
@ -1562,16 +1562,16 @@ void amdgpu_device_program_register_sequence(struct amdgpu_device *adev,
|
|||
|
||||
int amdgpu_device_mode1_reset(struct amdgpu_device *adev);
|
||||
int amdgpu_device_link_reset(struct amdgpu_device *adev);
|
||||
bool amdgpu_device_supports_atpx(struct drm_device *dev);
|
||||
bool amdgpu_device_supports_px(struct drm_device *dev);
|
||||
bool amdgpu_device_supports_boco(struct drm_device *dev);
|
||||
bool amdgpu_device_supports_smart_shift(struct drm_device *dev);
|
||||
int amdgpu_device_supports_baco(struct drm_device *dev);
|
||||
bool amdgpu_device_supports_atpx(struct amdgpu_device *adev);
|
||||
bool amdgpu_device_supports_px(struct amdgpu_device *adev);
|
||||
bool amdgpu_device_supports_boco(struct amdgpu_device *adev);
|
||||
bool amdgpu_device_supports_smart_shift(struct amdgpu_device *adev);
|
||||
int amdgpu_device_supports_baco(struct amdgpu_device *adev);
|
||||
void amdgpu_device_detect_runtime_pm_mode(struct amdgpu_device *adev);
|
||||
bool amdgpu_device_is_peer_accessible(struct amdgpu_device *adev,
|
||||
struct amdgpu_device *peer_adev);
|
||||
int amdgpu_device_baco_enter(struct drm_device *dev);
|
||||
int amdgpu_device_baco_exit(struct drm_device *dev);
|
||||
int amdgpu_device_baco_enter(struct amdgpu_device *adev);
|
||||
int amdgpu_device_baco_exit(struct amdgpu_device *adev);
|
||||
|
||||
void amdgpu_device_flush_hdp(struct amdgpu_device *adev,
|
||||
struct amdgpu_ring *ring);
|
||||
|
|
@ -1674,7 +1674,8 @@ int amdgpu_acpi_pcie_performance_request(struct amdgpu_device *adev,
|
|||
u8 perf_req, bool advertise);
|
||||
int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev,
|
||||
u8 dev_state, bool drv_state);
|
||||
int amdgpu_acpi_smart_shift_update(struct drm_device *dev, enum amdgpu_ss ss_state);
|
||||
int amdgpu_acpi_smart_shift_update(struct amdgpu_device *adev,
|
||||
enum amdgpu_ss ss_state);
|
||||
int amdgpu_acpi_pcie_notify_device_ready(struct amdgpu_device *adev);
|
||||
int amdgpu_acpi_get_tmr_info(struct amdgpu_device *adev, u64 *tmr_offset,
|
||||
u64 *tmr_size);
|
||||
|
|
@ -1705,8 +1706,11 @@ static inline void amdgpu_acpi_release(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,
|
||||
u8 dev_state, bool drv_state) { return 0; }
|
||||
static inline int amdgpu_acpi_smart_shift_update(struct drm_device *dev,
|
||||
enum amdgpu_ss ss_state) { return 0; }
|
||||
static inline int amdgpu_acpi_smart_shift_update(struct amdgpu_device *adev,
|
||||
enum amdgpu_ss ss_state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void amdgpu_acpi_get_backlight_caps(struct amdgpu_dm_backlight_caps *caps) { }
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -811,18 +811,18 @@ int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev,
|
|||
/**
|
||||
* amdgpu_acpi_smart_shift_update - update dGPU device state to SBIOS
|
||||
*
|
||||
* @dev: drm_device pointer
|
||||
* @adev: amdgpu device pointer
|
||||
* @ss_state: current smart shift event
|
||||
*
|
||||
* returns 0 on success,
|
||||
* otherwise return error number.
|
||||
*/
|
||||
int amdgpu_acpi_smart_shift_update(struct drm_device *dev, enum amdgpu_ss ss_state)
|
||||
int amdgpu_acpi_smart_shift_update(struct amdgpu_device *adev,
|
||||
enum amdgpu_ss ss_state)
|
||||
{
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
int r;
|
||||
|
||||
if (!amdgpu_device_supports_smart_shift(dev))
|
||||
if (!amdgpu_device_supports_smart_shift(adev))
|
||||
return 0;
|
||||
|
||||
switch (ss_state) {
|
||||
|
|
|
|||
|
|
@ -411,19 +411,16 @@ static const struct attribute_group amdgpu_board_attrs_group = {
|
|||
|
||||
static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev);
|
||||
|
||||
|
||||
/**
|
||||
* amdgpu_device_supports_px - Is the device a dGPU with ATPX power control
|
||||
*
|
||||
* @dev: drm_device pointer
|
||||
* @adev: amdgpu device pointer
|
||||
*
|
||||
* Returns true if the device is a dGPU with ATPX power control,
|
||||
* otherwise return false.
|
||||
*/
|
||||
bool amdgpu_device_supports_px(struct drm_device *dev)
|
||||
bool amdgpu_device_supports_px(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
|
||||
if ((adev->flags & AMD_IS_PX) && !amdgpu_is_atpx_hybrid())
|
||||
return true;
|
||||
return false;
|
||||
|
|
@ -432,15 +429,13 @@ bool amdgpu_device_supports_px(struct drm_device *dev)
|
|||
/**
|
||||
* amdgpu_device_supports_boco - Is the device a dGPU with ACPI power resources
|
||||
*
|
||||
* @dev: drm_device pointer
|
||||
* @adev: amdgpu device pointer
|
||||
*
|
||||
* Returns true if the device is a dGPU with ACPI power control,
|
||||
* otherwise return false.
|
||||
*/
|
||||
bool amdgpu_device_supports_boco(struct drm_device *dev)
|
||||
bool amdgpu_device_supports_boco(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
|
||||
if (!IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE))
|
||||
return false;
|
||||
|
||||
|
|
@ -453,29 +448,24 @@ bool amdgpu_device_supports_boco(struct drm_device *dev)
|
|||
/**
|
||||
* amdgpu_device_supports_baco - Does the device support BACO
|
||||
*
|
||||
* @dev: drm_device pointer
|
||||
* @adev: amdgpu device pointer
|
||||
*
|
||||
* Return:
|
||||
* 1 if the device supports BACO;
|
||||
* 3 if the device supports MACO (only works if BACO is supported)
|
||||
* otherwise return 0.
|
||||
*/
|
||||
int amdgpu_device_supports_baco(struct drm_device *dev)
|
||||
int amdgpu_device_supports_baco(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
|
||||
return amdgpu_asic_supports_baco(adev);
|
||||
}
|
||||
|
||||
void amdgpu_device_detect_runtime_pm_mode(struct amdgpu_device *adev)
|
||||
{
|
||||
struct drm_device *dev;
|
||||
int bamaco_support;
|
||||
|
||||
dev = adev_to_drm(adev);
|
||||
|
||||
adev->pm.rpm_mode = AMDGPU_RUNPM_NONE;
|
||||
bamaco_support = amdgpu_device_supports_baco(dev);
|
||||
bamaco_support = amdgpu_device_supports_baco(adev);
|
||||
|
||||
switch (amdgpu_runtime_pm) {
|
||||
case 2:
|
||||
|
|
@ -495,10 +485,12 @@ void amdgpu_device_detect_runtime_pm_mode(struct amdgpu_device *adev)
|
|||
break;
|
||||
case -1:
|
||||
case -2:
|
||||
if (amdgpu_device_supports_px(dev)) { /* enable PX as runtime mode */
|
||||
if (amdgpu_device_supports_px(adev)) {
|
||||
/* enable PX as runtime mode */
|
||||
adev->pm.rpm_mode = AMDGPU_RUNPM_PX;
|
||||
dev_info(adev->dev, "Using ATPX for runtime pm\n");
|
||||
} else if (amdgpu_device_supports_boco(dev)) { /* enable boco as runtime mode */
|
||||
} else if (amdgpu_device_supports_boco(adev)) {
|
||||
/* enable boco as runtime mode */
|
||||
adev->pm.rpm_mode = AMDGPU_RUNPM_BOCO;
|
||||
dev_info(adev->dev, "Using BOCO for runtime pm\n");
|
||||
} else {
|
||||
|
|
@ -547,14 +539,14 @@ void amdgpu_device_detect_runtime_pm_mode(struct amdgpu_device *adev)
|
|||
* amdgpu_device_supports_smart_shift - Is the device dGPU with
|
||||
* smart shift support
|
||||
*
|
||||
* @dev: drm_device pointer
|
||||
* @adev: amdgpu device pointer
|
||||
*
|
||||
* Returns true if the device is a dGPU with Smart Shift support,
|
||||
* otherwise returns false.
|
||||
*/
|
||||
bool amdgpu_device_supports_smart_shift(struct drm_device *dev)
|
||||
bool amdgpu_device_supports_smart_shift(struct amdgpu_device *adev)
|
||||
{
|
||||
return (amdgpu_device_supports_boco(dev) &&
|
||||
return (amdgpu_device_supports_boco(adev) &&
|
||||
amdgpu_acpi_is_power_shift_control_supported());
|
||||
}
|
||||
|
||||
|
|
@ -2200,7 +2192,8 @@ static void amdgpu_switcheroo_set_state(struct pci_dev *pdev,
|
|||
struct drm_device *dev = pci_get_drvdata(pdev);
|
||||
int r;
|
||||
|
||||
if (amdgpu_device_supports_px(dev) && state == VGA_SWITCHEROO_OFF)
|
||||
if (amdgpu_device_supports_px(drm_to_adev(dev)) &&
|
||||
state == VGA_SWITCHEROO_OFF)
|
||||
return;
|
||||
|
||||
if (state == VGA_SWITCHEROO_ON) {
|
||||
|
|
@ -4192,13 +4185,13 @@ static void amdgpu_device_xgmi_reset_func(struct work_struct *__work)
|
|||
if (amdgpu_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
|
||||
|
||||
task_barrier_enter(&hive->tb);
|
||||
adev->asic_reset_res = amdgpu_device_baco_enter(adev_to_drm(adev));
|
||||
adev->asic_reset_res = amdgpu_device_baco_enter(adev);
|
||||
|
||||
if (adev->asic_reset_res)
|
||||
goto fail;
|
||||
|
||||
task_barrier_exit(&hive->tb);
|
||||
adev->asic_reset_res = amdgpu_device_baco_exit(adev_to_drm(adev));
|
||||
adev->asic_reset_res = amdgpu_device_baco_exit(adev);
|
||||
|
||||
if (adev->asic_reset_res)
|
||||
goto fail;
|
||||
|
|
@ -4353,7 +4346,6 @@ static void amdgpu_device_set_mcbp(struct amdgpu_device *adev)
|
|||
int amdgpu_device_init(struct amdgpu_device *adev,
|
||||
uint32_t flags)
|
||||
{
|
||||
struct drm_device *ddev = adev_to_drm(adev);
|
||||
struct pci_dev *pdev = adev->pdev;
|
||||
int r, i;
|
||||
bool px = false;
|
||||
|
|
@ -4814,7 +4806,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
|
|||
if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
|
||||
vga_client_register(adev->pdev, amdgpu_device_vga_set_decode);
|
||||
|
||||
px = amdgpu_device_supports_px(ddev);
|
||||
px = amdgpu_device_supports_px(adev);
|
||||
|
||||
if (px || (!dev_is_removable(&adev->pdev->dev) &&
|
||||
apple_gmux_detect(NULL, NULL)))
|
||||
|
|
@ -4980,7 +4972,7 @@ void amdgpu_device_fini_sw(struct amdgpu_device *adev)
|
|||
kfree(adev->xcp_mgr);
|
||||
adev->xcp_mgr = NULL;
|
||||
|
||||
px = amdgpu_device_supports_px(adev_to_drm(adev));
|
||||
px = amdgpu_device_supports_px(adev);
|
||||
|
||||
if (px || (!dev_is_removable(&adev->pdev->dev) &&
|
||||
apple_gmux_detect(NULL, NULL)))
|
||||
|
|
@ -5152,7 +5144,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool notify_clients)
|
|||
return r;
|
||||
}
|
||||
|
||||
if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D3))
|
||||
if (amdgpu_acpi_smart_shift_update(adev, AMDGPU_SS_DEV_D3))
|
||||
dev_warn(adev->dev, "smart shift update failed\n");
|
||||
|
||||
if (notify_clients)
|
||||
|
|
@ -5321,7 +5313,7 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients)
|
|||
}
|
||||
adev->in_suspend = false;
|
||||
|
||||
if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D0))
|
||||
if (amdgpu_acpi_smart_shift_update(adev, AMDGPU_SS_DEV_D0))
|
||||
dev_warn(adev->dev, "smart shift update failed\n");
|
||||
|
||||
return 0;
|
||||
|
|
@ -6365,7 +6357,8 @@ static int amdgpu_device_sched_resume(struct list_head *device_list,
|
|||
amdgpu_vf_error_put(tmp_adev, AMDGIM_ERROR_VF_GPU_RESET_FAIL, 0, r);
|
||||
} else {
|
||||
dev_info(tmp_adev->dev, "GPU reset(%d) succeeded!\n", atomic_read(&tmp_adev->gpu_reset_counter));
|
||||
if (amdgpu_acpi_smart_shift_update(adev_to_drm(tmp_adev), AMDGPU_SS_DEV_D0))
|
||||
if (amdgpu_acpi_smart_shift_update(tmp_adev,
|
||||
AMDGPU_SS_DEV_D0))
|
||||
dev_warn(tmp_adev->dev,
|
||||
"smart shift update failed\n");
|
||||
}
|
||||
|
|
@ -6839,12 +6832,11 @@ bool amdgpu_device_is_peer_accessible(struct amdgpu_device *adev,
|
|||
#endif
|
||||
}
|
||||
|
||||
int amdgpu_device_baco_enter(struct drm_device *dev)
|
||||
int amdgpu_device_baco_enter(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);
|
||||
|
||||
if (!amdgpu_device_supports_baco(dev))
|
||||
if (!amdgpu_device_supports_baco(adev))
|
||||
return -ENOTSUPP;
|
||||
|
||||
if (ras && adev->ras_enabled &&
|
||||
|
|
@ -6854,13 +6846,12 @@ int amdgpu_device_baco_enter(struct drm_device *dev)
|
|||
return amdgpu_dpm_baco_enter(adev);
|
||||
}
|
||||
|
||||
int amdgpu_device_baco_exit(struct drm_device *dev)
|
||||
int amdgpu_device_baco_exit(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);
|
||||
int ret = 0;
|
||||
|
||||
if (!amdgpu_device_supports_baco(dev))
|
||||
if (!amdgpu_device_supports_baco(adev))
|
||||
return -ENOTSUPP;
|
||||
|
||||
ret = amdgpu_dpm_baco_exit(adev);
|
||||
|
|
|
|||
|
|
@ -2457,10 +2457,10 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
|
|||
|
||||
if (adev->pm.rpm_mode != AMDGPU_RUNPM_NONE) {
|
||||
/* only need to skip on ATPX */
|
||||
if (amdgpu_device_supports_px(ddev))
|
||||
if (amdgpu_device_supports_px(adev))
|
||||
dev_pm_set_driver_flags(ddev->dev, DPM_FLAG_NO_DIRECT_COMPLETE);
|
||||
/* we want direct complete for BOCO */
|
||||
if (amdgpu_device_supports_boco(ddev))
|
||||
if (amdgpu_device_supports_boco(adev))
|
||||
dev_pm_set_driver_flags(ddev->dev, DPM_FLAG_SMART_PREPARE |
|
||||
DPM_FLAG_SMART_SUSPEND |
|
||||
DPM_FLAG_MAY_SKIP_RESUME);
|
||||
|
|
@ -2493,9 +2493,9 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
|
|||
* into D0 state. Then there will be a PMFW-aware D-state
|
||||
* transition(D0->D3) on runpm suspend.
|
||||
*/
|
||||
if (amdgpu_device_supports_baco(ddev) &&
|
||||
if (amdgpu_device_supports_baco(adev) &&
|
||||
!(adev->flags & AMD_IS_APU) &&
|
||||
(adev->asic_type >= CHIP_NAVI10))
|
||||
adev->asic_type >= CHIP_NAVI10)
|
||||
amdgpu_get_secondary_funcs(adev);
|
||||
}
|
||||
|
||||
|
|
@ -2560,8 +2560,7 @@ static int amdgpu_pmops_prepare(struct device *dev)
|
|||
/* Return a positive number here so
|
||||
* DPM_FLAG_SMART_SUSPEND works properly
|
||||
*/
|
||||
if (amdgpu_device_supports_boco(drm_dev) &&
|
||||
pm_runtime_suspended(dev))
|
||||
if (amdgpu_device_supports_boco(adev) && pm_runtime_suspended(dev))
|
||||
return 1;
|
||||
|
||||
/* if we will not support s3 or s2i for the device
|
||||
|
|
@ -2834,7 +2833,7 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
|
|||
/* nothing to do */
|
||||
} else if ((adev->pm.rpm_mode == AMDGPU_RUNPM_BACO) ||
|
||||
(adev->pm.rpm_mode == AMDGPU_RUNPM_BAMACO)) {
|
||||
amdgpu_device_baco_enter(drm_dev);
|
||||
amdgpu_device_baco_enter(adev);
|
||||
}
|
||||
|
||||
dev_dbg(&pdev->dev, "asic/device is runtime suspended\n");
|
||||
|
|
@ -2875,7 +2874,7 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)
|
|||
pci_set_master(pdev);
|
||||
} else if ((adev->pm.rpm_mode == AMDGPU_RUNPM_BACO) ||
|
||||
(adev->pm.rpm_mode == AMDGPU_RUNPM_BAMACO)) {
|
||||
amdgpu_device_baco_exit(drm_dev);
|
||||
amdgpu_device_baco_exit(adev);
|
||||
}
|
||||
ret = amdgpu_device_resume(drm_dev, false);
|
||||
if (ret) {
|
||||
|
|
@ -2912,6 +2911,20 @@ static int amdgpu_pmops_runtime_idle(struct device *dev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int amdgpu_drm_release(struct inode *inode, struct file *filp)
|
||||
{
|
||||
struct drm_file *file_priv = filp->private_data;
|
||||
struct amdgpu_fpriv *fpriv = file_priv->driver_priv;
|
||||
|
||||
if (fpriv) {
|
||||
fpriv->evf_mgr.fd_closing = true;
|
||||
amdgpu_eviction_fence_destroy(&fpriv->evf_mgr);
|
||||
amdgpu_userq_mgr_fini(&fpriv->userq_mgr);
|
||||
}
|
||||
|
||||
return drm_release(inode, filp);
|
||||
}
|
||||
|
||||
long amdgpu_drm_ioctl(struct file *filp,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
|
|
@ -2963,7 +2976,7 @@ static const struct file_operations amdgpu_driver_kms_fops = {
|
|||
.owner = THIS_MODULE,
|
||||
.open = drm_open,
|
||||
.flush = amdgpu_flush,
|
||||
.release = drm_release,
|
||||
.release = amdgpu_drm_release,
|
||||
.unlocked_ioctl = amdgpu_drm_ioctl,
|
||||
.mmap = drm_gem_mmap,
|
||||
.poll = drm_poll,
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ void amdgpu_driver_unload_kms(struct drm_device *dev)
|
|||
if (adev->rmmio == NULL)
|
||||
return;
|
||||
|
||||
if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DRV_UNLOAD))
|
||||
if (amdgpu_acpi_smart_shift_update(adev, AMDGPU_SS_DRV_UNLOAD))
|
||||
DRM_WARN("smart shift update failed\n");
|
||||
|
||||
amdgpu_acpi_fini(adev);
|
||||
|
|
@ -161,7 +161,7 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
|
|||
if (acpi_status)
|
||||
dev_dbg(dev->dev, "Error during ACPI methods call\n");
|
||||
|
||||
if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DRV_LOAD))
|
||||
if (amdgpu_acpi_smart_shift_update(adev, AMDGPU_SS_DRV_LOAD))
|
||||
DRM_WARN("smart shift update failed\n");
|
||||
|
||||
out:
|
||||
|
|
@ -1503,9 +1503,6 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
|
|||
amdgpu_vm_bo_del(adev, fpriv->prt_va);
|
||||
amdgpu_bo_unreserve(pd);
|
||||
}
|
||||
fpriv->evf_mgr.fd_closing = true;
|
||||
amdgpu_eviction_fence_destroy(&fpriv->evf_mgr);
|
||||
amdgpu_userq_mgr_fini(&fpriv->userq_mgr);
|
||||
|
||||
amdgpu_ctx_mgr_fini(&fpriv->ctx_mgr);
|
||||
amdgpu_vm_fini(adev, &fpriv->vm);
|
||||
|
|
|
|||
|
|
@ -575,9 +575,11 @@ static int psp_sw_fini(struct amdgpu_ip_block *ip_block)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int psp_wait_for(struct psp_context *psp, uint32_t reg_index,
|
||||
uint32_t reg_val, uint32_t mask, bool check_changed)
|
||||
int psp_wait_for(struct psp_context *psp, uint32_t reg_index, uint32_t reg_val,
|
||||
uint32_t mask, uint32_t flags)
|
||||
{
|
||||
bool check_changed = flags & PSP_WAITREG_CHANGED;
|
||||
bool verbose = !(flags & PSP_WAITREG_NOVERBOSE);
|
||||
uint32_t val;
|
||||
int i;
|
||||
struct amdgpu_device *adev = psp->adev;
|
||||
|
|
@ -597,9 +599,10 @@ int psp_wait_for(struct psp_context *psp, uint32_t reg_index,
|
|||
udelay(1);
|
||||
}
|
||||
|
||||
dev_err(adev->dev,
|
||||
"psp reg (0x%x) wait timed out, mask: %x, read: %x exp: %x",
|
||||
reg_index, mask, val, reg_val);
|
||||
if (verbose)
|
||||
dev_err(adev->dev,
|
||||
"psp reg (0x%x) wait timed out, mask: %x, read: %x exp: %x",
|
||||
reg_index, mask, val, reg_val);
|
||||
|
||||
return -ETIME;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -134,6 +134,9 @@ enum psp_reg_prog_id {
|
|||
PSP_REG_LAST
|
||||
};
|
||||
|
||||
#define PSP_WAITREG_CHANGED BIT(0) /* check if the value has changed */
|
||||
#define PSP_WAITREG_NOVERBOSE BIT(1) /* No error verbose */
|
||||
|
||||
struct psp_funcs {
|
||||
int (*init_microcode)(struct psp_context *psp);
|
||||
int (*wait_for_bootloader)(struct psp_context *psp);
|
||||
|
|
@ -532,8 +535,8 @@ extern const struct amdgpu_ip_block_version psp_v13_0_ip_block;
|
|||
extern const struct amdgpu_ip_block_version psp_v13_0_4_ip_block;
|
||||
extern const struct amdgpu_ip_block_version psp_v14_0_ip_block;
|
||||
|
||||
extern int psp_wait_for(struct psp_context *psp, uint32_t reg_index,
|
||||
uint32_t field_val, uint32_t mask, bool check_changed);
|
||||
int psp_wait_for(struct psp_context *psp, uint32_t reg_index,
|
||||
uint32_t field_val, uint32_t mask, uint32_t flags);
|
||||
extern int psp_wait_for_spirom_update(struct psp_context *psp, uint32_t reg_index,
|
||||
uint32_t field_val, uint32_t mask, uint32_t msec_timeout);
|
||||
|
||||
|
|
|
|||
|
|
@ -545,10 +545,13 @@ static int amdgpu_sdma_soft_reset(struct amdgpu_device *adev, u32 instance_id)
|
|||
* amdgpu_sdma_reset_engine - Reset a specific SDMA engine
|
||||
* @adev: Pointer to the AMDGPU device
|
||||
* @instance_id: Logical ID of the SDMA engine instance to reset
|
||||
* @caller_handles_kernel_queues: Skip kernel queue processing. Caller
|
||||
* will handle it.
|
||||
*
|
||||
* Returns: 0 on success, or a negative error code on failure.
|
||||
*/
|
||||
int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id)
|
||||
int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id,
|
||||
bool caller_handles_kernel_queues)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_sdma_instance *sdma_instance = &adev->sdma.instance[instance_id];
|
||||
|
|
@ -556,14 +559,17 @@ int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id)
|
|||
struct amdgpu_ring *page_ring = &sdma_instance->page;
|
||||
|
||||
mutex_lock(&sdma_instance->engine_reset_mutex);
|
||||
/* Stop the scheduler's work queue for the GFX and page rings if they are running.
|
||||
* This ensures that no new tasks are submitted to the queues while
|
||||
* the reset is in progress.
|
||||
*/
|
||||
drm_sched_wqueue_stop(&gfx_ring->sched);
|
||||
|
||||
if (adev->sdma.has_page_queue)
|
||||
drm_sched_wqueue_stop(&page_ring->sched);
|
||||
if (!caller_handles_kernel_queues) {
|
||||
/* Stop the scheduler's work queue for the GFX and page rings if they are running.
|
||||
* This ensures that no new tasks are submitted to the queues while
|
||||
* the reset is in progress.
|
||||
*/
|
||||
drm_sched_wqueue_stop(&gfx_ring->sched);
|
||||
|
||||
if (adev->sdma.has_page_queue)
|
||||
drm_sched_wqueue_stop(&page_ring->sched);
|
||||
}
|
||||
|
||||
if (sdma_instance->funcs->stop_kernel_queue) {
|
||||
sdma_instance->funcs->stop_kernel_queue(gfx_ring);
|
||||
|
|
@ -585,14 +591,19 @@ int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id)
|
|||
}
|
||||
|
||||
exit:
|
||||
/* Restart the scheduler's work queue for the GFX and page rings
|
||||
* if they were stopped by this function. This allows new tasks
|
||||
* to be submitted to the queues after the reset is complete.
|
||||
*/
|
||||
if (!ret) {
|
||||
drm_sched_wqueue_start(&gfx_ring->sched);
|
||||
if (adev->sdma.has_page_queue)
|
||||
drm_sched_wqueue_start(&page_ring->sched);
|
||||
if (!caller_handles_kernel_queues) {
|
||||
/* Restart the scheduler's work queue for the GFX and page rings
|
||||
* if they were stopped by this function. This allows new tasks
|
||||
* to be submitted to the queues after the reset is complete.
|
||||
*/
|
||||
if (!ret) {
|
||||
amdgpu_fence_driver_force_completion(gfx_ring);
|
||||
drm_sched_wqueue_start(&gfx_ring->sched);
|
||||
if (adev->sdma.has_page_queue) {
|
||||
amdgpu_fence_driver_force_completion(page_ring);
|
||||
drm_sched_wqueue_start(&page_ring->sched);
|
||||
}
|
||||
}
|
||||
}
|
||||
mutex_unlock(&sdma_instance->engine_reset_mutex);
|
||||
|
||||
|
|
|
|||
|
|
@ -172,7 +172,8 @@ struct amdgpu_buffer_funcs {
|
|||
uint32_t byte_count);
|
||||
};
|
||||
|
||||
int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id);
|
||||
int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id,
|
||||
bool caller_handles_kernel_queues);
|
||||
|
||||
#define amdgpu_emit_copy_buffer(adev, ib, s, d, b, t) (adev)->mman.buffer_funcs->emit_copy_buffer((ib), (s), (d), (b), (t))
|
||||
#define amdgpu_emit_fill_buffer(adev, ib, s, d, b) (adev)->mman.buffer_funcs->emit_fill_buffer((ib), (s), (d), (b))
|
||||
|
|
|
|||
|
|
@ -719,7 +719,7 @@ static void amdgpu_userq_restore_worker(struct work_struct *work)
|
|||
struct amdgpu_fpriv *fpriv = uq_mgr_to_fpriv(uq_mgr);
|
||||
int ret;
|
||||
|
||||
flush_work(&fpriv->evf_mgr.suspend_work.work);
|
||||
flush_delayed_work(&fpriv->evf_mgr.suspend_work);
|
||||
|
||||
mutex_lock(&uq_mgr->userq_mutex);
|
||||
|
||||
|
|
|
|||
|
|
@ -9544,7 +9544,7 @@ static int gfx_v10_0_reset_kgq(struct amdgpu_ring *ring,
|
|||
|
||||
spin_lock_irqsave(&kiq->ring_lock, flags);
|
||||
|
||||
if (amdgpu_ring_alloc(kiq_ring, 5 + 7 + 7 + kiq->pmf->map_queues_size)) {
|
||||
if (amdgpu_ring_alloc(kiq_ring, 5 + 7 + 7)) {
|
||||
spin_unlock_irqrestore(&kiq->ring_lock, flags);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
@ -9564,12 +9564,9 @@ static int gfx_v10_0_reset_kgq(struct amdgpu_ring *ring,
|
|||
0, 1, 0x20);
|
||||
gfx_v10_0_ring_emit_reg_wait(kiq_ring,
|
||||
SOC15_REG_OFFSET(GC, 0, mmCP_VMID_RESET), 0, 0xffffffff);
|
||||
kiq->pmf->kiq_map_queues(kiq_ring, ring);
|
||||
amdgpu_ring_commit(kiq_ring);
|
||||
|
||||
spin_unlock_irqrestore(&kiq->ring_lock, flags);
|
||||
|
||||
r = amdgpu_ring_test_ring(kiq_ring);
|
||||
spin_unlock_irqrestore(&kiq->ring_lock, flags);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
|
@ -9579,6 +9576,19 @@ static int gfx_v10_0_reset_kgq(struct amdgpu_ring *ring,
|
|||
return r;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&kiq->ring_lock, flags);
|
||||
|
||||
if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->map_queues_size)) {
|
||||
spin_unlock_irqrestore(&kiq->ring_lock, flags);
|
||||
return -ENOMEM;
|
||||
}
|
||||
kiq->pmf->kiq_map_queues(kiq_ring, ring);
|
||||
amdgpu_ring_commit(kiq_ring);
|
||||
r = amdgpu_ring_test_ring(kiq_ring);
|
||||
spin_unlock_irqrestore(&kiq->ring_lock, flags);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
r = amdgpu_ring_test_ring(ring);
|
||||
if (r)
|
||||
return r;
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ static int psp_v10_0_ring_create(struct psp_context *psp,
|
|||
|
||||
/* Wait for response flag (bit 31) in C2PMSG_64 */
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -115,7 +115,7 @@ static int psp_v10_0_ring_stop(struct psp_context *psp,
|
|||
|
||||
/* Wait for response flag (bit 31) in C2PMSG_64 */
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -152,11 +152,9 @@ static int psp_v11_0_wait_for_bootloader(struct psp_context *psp)
|
|||
for (retry_loop = 0; retry_loop < 10; retry_loop++) {
|
||||
/* Wait for bootloader to signify that is
|
||||
ready having bit 31 of C2PMSG_35 set to 1 */
|
||||
ret = psp_wait_for(psp,
|
||||
SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
|
||||
0x80000000,
|
||||
0x80000000,
|
||||
false);
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, PSP_WAITREG_NOVERBOSE);
|
||||
|
||||
if (ret == 0)
|
||||
return 0;
|
||||
|
|
@ -252,8 +250,8 @@ static int psp_v11_0_bootloader_load_sos(struct psp_context *psp)
|
|||
/* there might be handshake issue with hardware which needs delay */
|
||||
mdelay(20);
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_81),
|
||||
RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81),
|
||||
0, true);
|
||||
RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81), 0,
|
||||
PSP_WAITREG_CHANGED);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -279,11 +277,11 @@ static int psp_v11_0_ring_stop(struct psp_context *psp,
|
|||
if (amdgpu_sriov_vf(adev))
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
else
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -321,13 +319,13 @@ static int psp_v11_0_ring_create(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) in C2PMSG_101 */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
|
||||
} else {
|
||||
/* Wait for sOS ready for ring creation */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_READY_FLAG, MBOX_TOS_READY_MASK, false);
|
||||
MBOX_TOS_READY_FLAG, MBOX_TOS_READY_MASK, 0);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to wait for sOS ready for ring creation\n");
|
||||
return ret;
|
||||
|
|
@ -353,7 +351,7 @@ static int psp_v11_0_ring_create(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) in C2PMSG_64 */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
@ -387,7 +385,7 @@ static int psp_v11_0_mode1_reset(struct psp_context *psp)
|
|||
offset = SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64);
|
||||
|
||||
ret = psp_wait_for(psp, offset, MBOX_TOS_READY_FLAG,
|
||||
MBOX_TOS_READY_MASK, false);
|
||||
MBOX_TOS_READY_MASK, 0);
|
||||
|
||||
if (ret) {
|
||||
DRM_INFO("psp is not working correctly before mode1 reset!\n");
|
||||
|
|
@ -402,7 +400,7 @@ static int psp_v11_0_mode1_reset(struct psp_context *psp)
|
|||
offset = SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_33);
|
||||
|
||||
ret = psp_wait_for(psp, offset, MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK,
|
||||
false);
|
||||
0);
|
||||
|
||||
if (ret) {
|
||||
DRM_INFO("psp mode 1 reset failed!\n");
|
||||
|
|
@ -428,8 +426,9 @@ static int psp_v11_0_memory_training_send_msg(struct psp_context *psp, int msg)
|
|||
|
||||
max_wait = MEM_TRAIN_SEND_MSG_TIMEOUT_US / adev->usec_timeout;
|
||||
for (i = 0; i < max_wait; i++) {
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, PSP_WAITREG_NOVERBOSE);
|
||||
if (ret == 0)
|
||||
break;
|
||||
}
|
||||
|
|
@ -608,7 +607,7 @@ static int psp_v11_0_load_usbc_pd_fw(struct psp_context *psp, uint64_t fw_pri_mc
|
|||
WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36, (fw_pri_mc_addr >> 20));
|
||||
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
0x80000000, 0x80000000, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -645,7 +644,7 @@ static int psp_v11_0_read_usbc_pd_fw(struct psp_context *psp, uint32_t *fw_ver)
|
|||
WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_35, C2PMSG_CMD_GFX_USB_PD_FW_VER);
|
||||
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
0x80000000, 0x80000000, 0);
|
||||
if (!ret)
|
||||
*fw_ver = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36);
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ static int psp_v11_0_8_ring_stop(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
} else {
|
||||
/* Write the ring destroy command*/
|
||||
WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64,
|
||||
|
|
@ -53,7 +53,7 @@ static int psp_v11_0_8_ring_stop(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
@ -91,13 +91,13 @@ static int psp_v11_0_8_ring_create(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) in C2PMSG_101 */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
|
||||
} else {
|
||||
/* Wait for sOS ready for ring creation */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_READY_FLAG, MBOX_TOS_READY_MASK, false);
|
||||
MBOX_TOS_READY_FLAG, MBOX_TOS_READY_MASK, 0);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to wait for trust OS ready for ring creation\n");
|
||||
return ret;
|
||||
|
|
@ -123,7 +123,7 @@ static int psp_v11_0_8_ring_create(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) in C2PMSG_64 */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ static int psp_v12_0_bootloader_load_sysdrv(struct psp_context *psp)
|
|||
|
||||
/* Wait for bootloader to signify that is ready having bit 31 of C2PMSG_35 set to 1 */
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
0x80000000, 0x80000000, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -97,7 +97,7 @@ static int psp_v12_0_bootloader_load_sysdrv(struct psp_context *psp)
|
|||
psp_gfxdrv_command_reg);
|
||||
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
0x80000000, 0x80000000, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -118,7 +118,7 @@ static int psp_v12_0_bootloader_load_sos(struct psp_context *psp)
|
|||
|
||||
/* Wait for bootloader to signify that is ready having bit 31 of C2PMSG_35 set to 1 */
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
0x80000000, 0x80000000, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -133,8 +133,8 @@ static int psp_v12_0_bootloader_load_sos(struct psp_context *psp)
|
|||
psp_gfxdrv_command_reg);
|
||||
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_81),
|
||||
RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81),
|
||||
0, true);
|
||||
RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81), 0,
|
||||
PSP_WAITREG_CHANGED);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -163,7 +163,7 @@ static int psp_v12_0_ring_create(struct psp_context *psp,
|
|||
|
||||
/* Wait for response flag (bit 31) in C2PMSG_64 */
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -186,11 +186,11 @@ static int psp_v12_0_ring_stop(struct psp_context *psp,
|
|||
if (amdgpu_sriov_vf(adev))
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
else
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -222,7 +222,7 @@ static int psp_v12_0_mode1_reset(struct psp_context *psp)
|
|||
offset = SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64);
|
||||
|
||||
ret = psp_wait_for(psp, offset, MBOX_TOS_READY_FLAG,
|
||||
MBOX_TOS_READY_MASK, false);
|
||||
MBOX_TOS_READY_MASK, 0);
|
||||
|
||||
if (ret) {
|
||||
DRM_INFO("psp is not working correctly before mode1 reset!\n");
|
||||
|
|
@ -237,7 +237,7 @@ static int psp_v12_0_mode1_reset(struct psp_context *psp)
|
|||
offset = SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_33);
|
||||
|
||||
ret = psp_wait_for(psp, offset, MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK,
|
||||
false);
|
||||
0);
|
||||
|
||||
if (ret) {
|
||||
DRM_INFO("psp mode 1 reset failed!\n");
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ static int psp_v13_0_wait_for_vmbx_ready(struct psp_context *psp)
|
|||
ready having bit 31 of C2PMSG_33 set to 1 */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_33),
|
||||
0x80000000, 0xffffffff, false);
|
||||
0x80000000, 0xffffffff, PSP_WAITREG_NOVERBOSE);
|
||||
|
||||
if (ret == 0)
|
||||
break;
|
||||
|
|
@ -213,7 +213,7 @@ static int psp_v13_0_wait_for_bootloader(struct psp_context *psp)
|
|||
for (retry_loop = 0; retry_loop < retry_cnt; retry_loop++) {
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0xffffffff, false);
|
||||
0x80000000, 0xffffffff, PSP_WAITREG_NOVERBOSE);
|
||||
|
||||
if (ret == 0)
|
||||
return 0;
|
||||
|
|
@ -362,8 +362,8 @@ static int psp_v13_0_bootloader_load_sos(struct psp_context *psp)
|
|||
/* there might be handshake issue with hardware which needs delay */
|
||||
mdelay(20);
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_81),
|
||||
RREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_81),
|
||||
0, true);
|
||||
RREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_81), 0,
|
||||
PSP_WAITREG_CHANGED);
|
||||
|
||||
if (!ret)
|
||||
psp_v13_0_init_sos_version(psp);
|
||||
|
|
@ -386,7 +386,7 @@ static int psp_v13_0_ring_stop(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_101),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
} else {
|
||||
/* Write the ring destroy command*/
|
||||
WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_64,
|
||||
|
|
@ -396,7 +396,7 @@ static int psp_v13_0_ring_stop(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
@ -434,13 +434,13 @@ static int psp_v13_0_ring_create(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) in C2PMSG_101 */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_101),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
|
||||
} else {
|
||||
/* Wait for sOS ready for ring creation */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_READY_FLAG, MBOX_TOS_READY_MASK, false);
|
||||
MBOX_TOS_READY_FLAG, MBOX_TOS_READY_MASK, 0);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to wait for trust OS ready for ring creation\n");
|
||||
return ret;
|
||||
|
|
@ -466,7 +466,7 @@ static int psp_v13_0_ring_create(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) in C2PMSG_64 */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
@ -529,8 +529,9 @@ static int psp_v13_0_memory_training_send_msg(struct psp_context *psp, int msg)
|
|||
|
||||
max_wait = MEM_TRAIN_SEND_MSG_TIMEOUT_US / adev->usec_timeout;
|
||||
for (i = 0; i < max_wait; i++) {
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, PSP_WAITREG_NOVERBOSE);
|
||||
if (ret == 0)
|
||||
break;
|
||||
}
|
||||
|
|
@ -682,7 +683,7 @@ static int psp_v13_0_load_usbc_pd_fw(struct psp_context *psp, uint64_t fw_pri_mc
|
|||
WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_36, (fw_pri_mc_addr >> 20));
|
||||
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
0x80000000, 0x80000000, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -719,7 +720,7 @@ static int psp_v13_0_read_usbc_pd_fw(struct psp_context *psp, uint32_t *fw_ver)
|
|||
WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_35, C2PMSG_CMD_GFX_USB_PD_FW_VER);
|
||||
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
0x80000000, 0x80000000, 0);
|
||||
if (!ret)
|
||||
*fw_ver = RREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_36);
|
||||
|
||||
|
|
@ -744,8 +745,9 @@ static int psp_v13_0_exec_spi_cmd(struct psp_context *psp, int cmd)
|
|||
ret = psp_wait_for_spirom_update(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_115),
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, PSP_SPIROM_UPDATE_TIMEOUT);
|
||||
else
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_115),
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, false);
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_115),
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, 0);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "SPI cmd %x timed out, ret = %d", cmd, ret);
|
||||
return ret;
|
||||
|
|
@ -769,7 +771,7 @@ static int psp_v13_0_update_spirom(struct psp_context *psp,
|
|||
|
||||
/* Confirm PSP is ready to start */
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_115),
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, false);
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, 0);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "PSP Not ready to start processing, ret = %d", ret);
|
||||
return ret;
|
||||
|
|
@ -804,7 +806,7 @@ static int psp_v13_0_dump_spirom(struct psp_context *psp,
|
|||
|
||||
/* Confirm PSP is ready to start */
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_115),
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, false);
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, 0);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "PSP Not ready to start processing, ret = %d", ret);
|
||||
return ret;
|
||||
|
|
@ -931,8 +933,9 @@ static int psp_v13_0_reg_program_no_ring(struct psp_context *psp, uint32_t val,
|
|||
WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_102, id);
|
||||
WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_103, val);
|
||||
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_101),
|
||||
0x80000000, 0x80000000, false);
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_101),
|
||||
0x80000000, 0x80000000, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -76,11 +76,9 @@ static int psp_v13_0_4_wait_for_bootloader(struct psp_context *psp)
|
|||
for (retry_loop = 0; retry_loop < 10; retry_loop++) {
|
||||
/* Wait for bootloader to signify that is
|
||||
ready having bit 31 of C2PMSG_35 set to 1 */
|
||||
ret = psp_wait_for(psp,
|
||||
SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_35),
|
||||
0x80000000,
|
||||
0x80000000,
|
||||
false);
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, PSP_WAITREG_NOVERBOSE);
|
||||
|
||||
if (ret == 0)
|
||||
return 0;
|
||||
|
|
@ -185,8 +183,8 @@ static int psp_v13_0_4_bootloader_load_sos(struct psp_context *psp)
|
|||
/* there might be handshake issue with hardware which needs delay */
|
||||
mdelay(20);
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_81),
|
||||
RREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_81),
|
||||
0, true);
|
||||
RREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_81), 0,
|
||||
PSP_WAITREG_CHANGED);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -206,7 +204,7 @@ static int psp_v13_0_4_ring_stop(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_101),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
} else {
|
||||
/* Write the ring destroy command*/
|
||||
WREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_64,
|
||||
|
|
@ -216,7 +214,7 @@ static int psp_v13_0_4_ring_stop(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
@ -254,13 +252,13 @@ static int psp_v13_0_4_ring_create(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) in C2PMSG_101 */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_101),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
|
||||
} else {
|
||||
/* Wait for sOS ready for ring creation */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_READY_FLAG, MBOX_TOS_READY_MASK, false);
|
||||
MBOX_TOS_READY_FLAG, MBOX_TOS_READY_MASK, 0);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to wait for trust OS ready for ring creation\n");
|
||||
return ret;
|
||||
|
|
@ -286,7 +284,7 @@ static int psp_v13_0_4_ring_create(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) in C2PMSG_64 */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -109,11 +109,9 @@ static int psp_v14_0_wait_for_bootloader(struct psp_context *psp)
|
|||
for (retry_loop = 0; retry_loop < 10; retry_loop++) {
|
||||
/* Wait for bootloader to signify that is
|
||||
ready having bit 31 of C2PMSG_35 set to 1 */
|
||||
ret = psp_wait_for(psp,
|
||||
SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_35),
|
||||
0x80000000,
|
||||
0x80000000,
|
||||
false);
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, PSP_WAITREG_NOVERBOSE);
|
||||
|
||||
if (ret == 0)
|
||||
return 0;
|
||||
|
|
@ -228,9 +226,10 @@ static int psp_v14_0_bootloader_load_sos(struct psp_context *psp)
|
|||
|
||||
/* there might be handshake issue with hardware which needs delay */
|
||||
mdelay(20);
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_81),
|
||||
RREG32_SOC15(MP0, 0, regMPASP_SMN_C2PMSG_81),
|
||||
0, true);
|
||||
ret = psp_wait_for(psp,
|
||||
SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_81),
|
||||
RREG32_SOC15(MP0, 0, regMPASP_SMN_C2PMSG_81), 0,
|
||||
PSP_WAITREG_CHANGED);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -250,7 +249,7 @@ static int psp_v14_0_ring_stop(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_101),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
} else {
|
||||
/* Write the ring destroy command*/
|
||||
WREG32_SOC15(MP0, 0, regMPASP_SMN_C2PMSG_64,
|
||||
|
|
@ -260,7 +259,7 @@ static int psp_v14_0_ring_stop(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
@ -298,13 +297,13 @@ static int psp_v14_0_ring_create(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) in C2PMSG_101 */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_101),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
|
||||
} else {
|
||||
/* Wait for sOS ready for ring creation */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_64),
|
||||
MBOX_TOS_READY_FLAG, MBOX_TOS_READY_MASK, false);
|
||||
MBOX_TOS_READY_FLAG, MBOX_TOS_READY_MASK, 0);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to wait for trust OS ready for ring creation\n");
|
||||
return ret;
|
||||
|
|
@ -330,7 +329,7 @@ static int psp_v14_0_ring_create(struct psp_context *psp,
|
|||
/* Wait for response flag (bit 31) in C2PMSG_64 */
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_64),
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, false);
|
||||
MBOX_TOS_RESP_FLAG, MBOX_TOS_RESP_MASK, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
@ -393,8 +392,9 @@ static int psp_v14_0_memory_training_send_msg(struct psp_context *psp, int msg)
|
|||
|
||||
max_wait = MEM_TRAIN_SEND_MSG_TIMEOUT_US / adev->usec_timeout;
|
||||
for (i = 0; i < max_wait; i++) {
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, PSP_WAITREG_NOVERBOSE);
|
||||
if (ret == 0)
|
||||
break;
|
||||
}
|
||||
|
|
@ -545,8 +545,9 @@ static int psp_v14_0_load_usbc_pd_fw(struct psp_context *psp, uint64_t fw_pri_mc
|
|||
*/
|
||||
WREG32_SOC15(MP0, 0, regMPASP_SMN_C2PMSG_36, (fw_pri_mc_addr >> 20));
|
||||
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
ret = psp_wait_for(psp,
|
||||
SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -582,8 +583,9 @@ static int psp_v14_0_read_usbc_pd_fw(struct psp_context *psp, uint32_t *fw_ver)
|
|||
|
||||
WREG32_SOC15(MP0, 0, regMPASP_SMN_C2PMSG_35, C2PMSG_CMD_GFX_USB_PD_FW_VER);
|
||||
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
ret = psp_wait_for(psp,
|
||||
SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, 0);
|
||||
if (!ret)
|
||||
*fw_ver = RREG32_SOC15(MP0, 0, regMPASP_SMN_C2PMSG_36);
|
||||
|
||||
|
|
@ -607,11 +609,13 @@ static int psp_v14_0_exec_spi_cmd(struct psp_context *psp, int cmd)
|
|||
ret = psp_wait_for_spirom_update(psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_115),
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, PSP_SPIROM_UPDATE_TIMEOUT);
|
||||
else
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_115),
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, false);
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_115),
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, 0);
|
||||
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_115),
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, false);
|
||||
ret = psp_wait_for(psp,
|
||||
SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_115),
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, 0);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "SPI cmd %x timed out, ret = %d", cmd, ret);
|
||||
return ret;
|
||||
|
|
@ -634,8 +638,9 @@ static int psp_v14_0_update_spirom(struct psp_context *psp,
|
|||
int ret;
|
||||
|
||||
/* Confirm PSP is ready to start */
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_115),
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, false);
|
||||
ret = psp_wait_for(psp,
|
||||
SOC15_REG_OFFSET(MP0, 0, regMPASP_SMN_C2PMSG_115),
|
||||
MBOX_READY_FLAG, MBOX_READY_MASK, 0);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "PSP Not ready to start processing, ret = %d", ret);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ static int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp)
|
|||
|
||||
/* Wait for bootloader to signify that is ready having bit 31 of C2PMSG_35 set to 1 */
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
0x80000000, 0x80000000, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -109,7 +109,7 @@ static int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp)
|
|||
mdelay(20);
|
||||
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
0x80000000, 0x80000000, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -130,7 +130,7 @@ static int psp_v3_1_bootloader_load_sos(struct psp_context *psp)
|
|||
|
||||
/* Wait for bootloader to signify that is ready having bit 31 of C2PMSG_35 set to 1 */
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
|
||||
0x80000000, 0x80000000, false);
|
||||
0x80000000, 0x80000000, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -147,8 +147,8 @@ static int psp_v3_1_bootloader_load_sos(struct psp_context *psp)
|
|||
/* there might be handshake issue with hardware which needs delay */
|
||||
mdelay(20);
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_81),
|
||||
RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81),
|
||||
0, true);
|
||||
RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81), 0,
|
||||
PSP_WAITREG_CHANGED);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -168,7 +168,7 @@ static void psp_v3_1_reroute_ih(struct psp_context *psp)
|
|||
|
||||
mdelay(20);
|
||||
psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
0x80000000, 0x8000FFFF, false);
|
||||
0x80000000, 0x8000FFFF, 0);
|
||||
|
||||
/* Change IH ring for UMC */
|
||||
tmp = REG_SET_FIELD(0, IH_CLIENT_CFG_DATA, CREDIT_RETURN_ADDR, 0x1216b);
|
||||
|
|
@ -180,7 +180,7 @@ static void psp_v3_1_reroute_ih(struct psp_context *psp)
|
|||
|
||||
mdelay(20);
|
||||
psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
0x80000000, 0x8000FFFF, false);
|
||||
0x80000000, 0x8000FFFF, 0);
|
||||
}
|
||||
|
||||
static int psp_v3_1_ring_create(struct psp_context *psp,
|
||||
|
|
@ -217,9 +217,9 @@ static int psp_v3_1_ring_create(struct psp_context *psp,
|
|||
mdelay(20);
|
||||
|
||||
/* Wait for response flag (bit 31) in C2PMSG_101 */
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0,
|
||||
mmMP0_SMN_C2PMSG_101), 0x80000000,
|
||||
0x8000FFFF, false);
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
|
||||
0x80000000, 0x8000FFFF, 0);
|
||||
} else {
|
||||
|
||||
/* Write low address of the ring to C2PMSG_69 */
|
||||
|
|
@ -240,10 +240,9 @@ static int psp_v3_1_ring_create(struct psp_context *psp,
|
|||
mdelay(20);
|
||||
|
||||
/* Wait for response flag (bit 31) in C2PMSG_64 */
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0,
|
||||
mmMP0_SMN_C2PMSG_64), 0x80000000,
|
||||
0x8000FFFF, false);
|
||||
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
0x80000000, 0x8000FFFF, 0);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -267,11 +266,13 @@ static int psp_v3_1_ring_stop(struct psp_context *psp,
|
|||
|
||||
/* Wait for response flag (bit 31) */
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
|
||||
0x80000000, 0x80000000, false);
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),
|
||||
0x80000000, 0x80000000, 0);
|
||||
else
|
||||
ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
0x80000000, 0x80000000, false);
|
||||
ret = psp_wait_for(
|
||||
psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
|
||||
0x80000000, 0x80000000, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -311,7 +312,7 @@ static int psp_v3_1_mode1_reset(struct psp_context *psp)
|
|||
|
||||
offset = SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64);
|
||||
|
||||
ret = psp_wait_for(psp, offset, 0x80000000, 0x8000FFFF, false);
|
||||
ret = psp_wait_for(psp, offset, 0x80000000, 0x8000FFFF, 0);
|
||||
|
||||
if (ret) {
|
||||
DRM_INFO("psp is not working correctly before mode1 reset!\n");
|
||||
|
|
@ -325,7 +326,7 @@ static int psp_v3_1_mode1_reset(struct psp_context *psp)
|
|||
|
||||
offset = SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_33);
|
||||
|
||||
ret = psp_wait_for(psp, offset, 0x80000000, 0x80000000, false);
|
||||
ret = psp_wait_for(psp, offset, 0x80000000, 0x80000000, 0);
|
||||
|
||||
if (ret) {
|
||||
DRM_INFO("psp mode 1 reset failed!\n");
|
||||
|
|
|
|||
|
|
@ -1668,7 +1668,7 @@ static int sdma_v4_4_2_reset_queue(struct amdgpu_ring *ring,
|
|||
return -EOPNOTSUPP;
|
||||
|
||||
amdgpu_amdkfd_suspend(adev, true);
|
||||
r = amdgpu_sdma_reset_engine(adev, id);
|
||||
r = amdgpu_sdma_reset_engine(adev, id, false);
|
||||
amdgpu_amdkfd_resume(adev, true);
|
||||
return r;
|
||||
}
|
||||
|
|
@ -1714,7 +1714,7 @@ static int sdma_v4_4_2_stop_queue(struct amdgpu_ring *ring)
|
|||
static int sdma_v4_4_2_restore_queue(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
u32 inst_mask, tmp_mask;
|
||||
u32 inst_mask;
|
||||
int i, r;
|
||||
|
||||
inst_mask = 1 << ring->me;
|
||||
|
|
@ -1733,21 +1733,6 @@ static int sdma_v4_4_2_restore_queue(struct amdgpu_ring *ring)
|
|||
}
|
||||
|
||||
r = sdma_v4_4_2_inst_start(adev, inst_mask, true);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
tmp_mask = inst_mask;
|
||||
for_each_inst(i, tmp_mask) {
|
||||
ring = &adev->sdma.instance[i].ring;
|
||||
|
||||
amdgpu_fence_driver_force_completion(ring);
|
||||
|
||||
if (adev->sdma.has_page_queue) {
|
||||
struct amdgpu_ring *page = &adev->sdma.instance[i].page;
|
||||
|
||||
amdgpu_fence_driver_force_completion(page);
|
||||
}
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1548,7 +1548,7 @@ static int sdma_v5_0_reset_queue(struct amdgpu_ring *ring,
|
|||
int r;
|
||||
|
||||
amdgpu_amdkfd_suspend(adev, true);
|
||||
r = amdgpu_sdma_reset_engine(adev, inst_id);
|
||||
r = amdgpu_sdma_reset_engine(adev, inst_id, false);
|
||||
amdgpu_amdkfd_resume(adev, true);
|
||||
|
||||
return r;
|
||||
|
|
@ -1618,10 +1618,8 @@ static int sdma_v5_0_restore_queue(struct amdgpu_ring *ring)
|
|||
|
||||
r = sdma_v5_0_gfx_resume_instance(adev, inst_id, true);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev, 0);
|
||||
if (r)
|
||||
return r;
|
||||
amdgpu_fence_driver_force_completion(ring);
|
||||
return 0;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int sdma_v5_0_ring_preempt_ib(struct amdgpu_ring *ring)
|
||||
|
|
|
|||
|
|
@ -1461,7 +1461,7 @@ static int sdma_v5_2_reset_queue(struct amdgpu_ring *ring,
|
|||
int r;
|
||||
|
||||
amdgpu_amdkfd_suspend(adev, true);
|
||||
r = amdgpu_sdma_reset_engine(adev, inst_id);
|
||||
r = amdgpu_sdma_reset_engine(adev, inst_id, false);
|
||||
amdgpu_amdkfd_resume(adev, true);
|
||||
|
||||
return r;
|
||||
|
|
@ -1534,10 +1534,8 @@ static int sdma_v5_2_restore_queue(struct amdgpu_ring *ring)
|
|||
r = sdma_v5_2_gfx_resume_instance(adev, inst_id, true);
|
||||
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev, 0);
|
||||
if (r)
|
||||
return r;
|
||||
amdgpu_fence_driver_force_completion(ring);
|
||||
return 0;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int sdma_v5_2_ring_preempt_ib(struct amdgpu_ring *ring)
|
||||
|
|
|
|||
|
|
@ -2312,7 +2312,7 @@ static int reset_hung_queues_sdma(struct device_queue_manager *dqm)
|
|||
continue;
|
||||
|
||||
/* Reset engine and check. */
|
||||
if (amdgpu_sdma_reset_engine(dqm->dev->adev, i) ||
|
||||
if (amdgpu_sdma_reset_engine(dqm->dev->adev, i, false) ||
|
||||
dqm->dev->kfd2kgd->hqd_sdma_get_doorbell(dqm->dev->adev, i, j) ||
|
||||
!set_sdma_queue_as_reset(dqm, doorbell_off)) {
|
||||
r = -ENOTRECOVERABLE;
|
||||
|
|
@ -2339,9 +2339,18 @@ static int reset_hung_queues_sdma(struct device_queue_manager *dqm)
|
|||
|
||||
static int reset_queues_on_hws_hang(struct device_queue_manager *dqm, bool is_sdma)
|
||||
{
|
||||
struct amdgpu_device *adev = dqm->dev->adev;
|
||||
|
||||
while (halt_if_hws_hang)
|
||||
schedule();
|
||||
|
||||
if (adev->debug_disable_gpu_ring_reset) {
|
||||
dev_info_once(adev->dev,
|
||||
"%s queue hung, but ring reset disabled",
|
||||
is_sdma ? "sdma" : "compute");
|
||||
|
||||
return -EPERM;
|
||||
}
|
||||
if (!amdgpu_gpu_recovery)
|
||||
return -ENOTRECOVERABLE;
|
||||
|
||||
|
|
|
|||
|
|
@ -7901,7 +7901,8 @@ static int dm_encoder_helper_atomic_check(struct drm_encoder *encoder,
|
|||
int clock, bpp = 0;
|
||||
bool is_y420 = false;
|
||||
|
||||
if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
|
||||
if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
|
||||
(connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
|
||||
struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
|
||||
struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
|
||||
enum drm_mode_status result;
|
||||
|
|
@ -8374,7 +8375,8 @@ static int amdgpu_dm_connector_get_modes(struct drm_connector *connector)
|
|||
drm_add_modes_noedid(connector, 1920, 1080);
|
||||
} else {
|
||||
amdgpu_dm_connector_ddc_get_modes(connector, drm_edid);
|
||||
if (encoder && connector->connector_type != DRM_MODE_CONNECTOR_eDP)
|
||||
if (encoder && (connector->connector_type != DRM_MODE_CONNECTOR_eDP) &&
|
||||
(connector->connector_type != DRM_MODE_CONNECTOR_LVDS))
|
||||
amdgpu_dm_connector_add_common_modes(encoder, connector);
|
||||
amdgpu_dm_connector_add_freesync_modes(connector, drm_edid);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1890,7 +1890,7 @@ static ssize_t amdgpu_set_smartshift_bias(struct device *dev,
|
|||
static int ss_power_attr_update(struct amdgpu_device *adev, struct amdgpu_device_attr *attr,
|
||||
uint32_t mask, enum amdgpu_device_attr_states *states)
|
||||
{
|
||||
if (!amdgpu_device_supports_smart_shift(adev_to_drm(adev)))
|
||||
if (!amdgpu_device_supports_smart_shift(adev))
|
||||
*states = ATTR_STATE_UNSUPPORTED;
|
||||
|
||||
return 0;
|
||||
|
|
@ -1901,7 +1901,7 @@ static int ss_bias_attr_update(struct amdgpu_device *adev, struct amdgpu_device_
|
|||
{
|
||||
uint32_t ss_power;
|
||||
|
||||
if (!amdgpu_device_supports_smart_shift(adev_to_drm(adev)))
|
||||
if (!amdgpu_device_supports_smart_shift(adev))
|
||||
*states = ATTR_STATE_UNSUPPORTED;
|
||||
else if (amdgpu_hwmon_get_sensor_generic(adev, AMDGPU_PP_SENSOR_SS_APU_SHARE,
|
||||
(void *)&ss_power))
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ int phm_wait_on_indirect_register(struct pp_hwmgr *hwmgr,
|
|||
}
|
||||
|
||||
cgs_write_register(hwmgr->device, indirect_port, index);
|
||||
return phm_wait_on_register(hwmgr, indirect_port + 1, mask, value);
|
||||
return phm_wait_on_register(hwmgr, indirect_port + 1, value, mask);
|
||||
}
|
||||
|
||||
int phm_wait_for_register_unequal(struct pp_hwmgr *hwmgr,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user