Commit f4c41a7f authored by Dave Airlie's avatar Dave Airlie

Merge tag 'amd-drm-fixes-6.4-2023-05-03' of...

Merge tag 'amd-drm-fixes-6.4-2023-05-03' of https://gitlab.freedesktop.org/agd5f/linux into drm-next

amd-drm-fixes-6.4-2023-05-03:

amdgpu:
- GPU reset fixes
- Doorbell fix when resizing BARs
- Fix spurious warnings in gmc
- Locking fix for AMDGPU_SCHED IOCTL
- SR-IOV fix
- DCN 3.1.4 fix
- DCN 3.2 fix
- Fix job cleanup when CS is aborted
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230504034018.7950-1-alexander.deucher@amd.com
parents fa0d9c06 1253685f
...@@ -1276,7 +1276,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, ...@@ -1276,7 +1276,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
r = drm_sched_job_add_dependency(&leader->base, fence); r = drm_sched_job_add_dependency(&leader->base, fence);
if (r) { if (r) {
dma_fence_put(fence); dma_fence_put(fence);
goto error_cleanup; return r;
} }
} }
...@@ -1303,7 +1303,8 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, ...@@ -1303,7 +1303,8 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
} }
if (r) { if (r) {
r = -EAGAIN; r = -EAGAIN;
goto error_unlock; mutex_unlock(&p->adev->notifier_lock);
return r;
} }
p->fence = dma_fence_get(&leader->base.s_fence->finished); p->fence = dma_fence_get(&leader->base.s_fence->finished);
...@@ -1350,14 +1351,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, ...@@ -1350,14 +1351,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
mutex_unlock(&p->adev->notifier_lock); mutex_unlock(&p->adev->notifier_lock);
mutex_unlock(&p->bo_list->bo_list_mutex); mutex_unlock(&p->bo_list->bo_list_mutex);
return 0; return 0;
error_unlock:
mutex_unlock(&p->adev->notifier_lock);
error_cleanup:
for (i = 0; i < p->gang_size; ++i)
drm_sched_job_cleanup(&p->jobs[i]->base);
return r;
} }
/* Cleanup the parser structure */ /* Cleanup the parser structure */
......
...@@ -3578,6 +3578,7 @@ int amdgpu_device_init(struct amdgpu_device *adev, ...@@ -3578,6 +3578,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
int r, i; int r, i;
bool px = false; bool px = false;
u32 max_MBps; u32 max_MBps;
int tmp;
adev->shutdown = false; adev->shutdown = false;
adev->flags = flags; adev->flags = flags;
...@@ -3799,7 +3800,13 @@ int amdgpu_device_init(struct amdgpu_device *adev, ...@@ -3799,7 +3800,13 @@ int amdgpu_device_init(struct amdgpu_device *adev,
} }
} }
} else { } else {
tmp = amdgpu_reset_method;
/* It should do a default reset when loading or reloading the driver,
* regardless of the module parameter reset_method.
*/
amdgpu_reset_method = AMD_RESET_METHOD_NONE;
r = amdgpu_asic_reset(adev); r = amdgpu_asic_reset(adev);
amdgpu_reset_method = tmp;
if (r) { if (r) {
dev_err(adev->dev, "asic reset on init failed\n"); dev_err(adev->dev, "asic reset on init failed\n");
goto failed; goto failed;
......
...@@ -38,6 +38,7 @@ static int amdgpu_sched_process_priority_override(struct amdgpu_device *adev, ...@@ -38,6 +38,7 @@ static int amdgpu_sched_process_priority_override(struct amdgpu_device *adev,
{ {
struct fd f = fdget(fd); struct fd f = fdget(fd);
struct amdgpu_fpriv *fpriv; struct amdgpu_fpriv *fpriv;
struct amdgpu_ctx_mgr *mgr;
struct amdgpu_ctx *ctx; struct amdgpu_ctx *ctx;
uint32_t id; uint32_t id;
int r; int r;
...@@ -51,8 +52,11 @@ static int amdgpu_sched_process_priority_override(struct amdgpu_device *adev, ...@@ -51,8 +52,11 @@ static int amdgpu_sched_process_priority_override(struct amdgpu_device *adev,
return r; return r;
} }
idr_for_each_entry(&fpriv->ctx_mgr.ctx_handles, ctx, id) mgr = &fpriv->ctx_mgr;
mutex_lock(&mgr->lock);
idr_for_each_entry(&mgr->ctx_handles, ctx, id)
amdgpu_ctx_priority_override(ctx, priority); amdgpu_ctx_priority_override(ctx, priority);
mutex_unlock(&mgr->lock);
fdput(f); fdput(f);
return 0; return 0;
......
...@@ -1143,7 +1143,6 @@ static int gmc_v10_0_hw_fini(void *handle) ...@@ -1143,7 +1143,6 @@ static int gmc_v10_0_hw_fini(void *handle)
return 0; return 0;
} }
amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0); amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
return 0; return 0;
......
...@@ -951,7 +951,6 @@ static int gmc_v11_0_hw_fini(void *handle) ...@@ -951,7 +951,6 @@ static int gmc_v11_0_hw_fini(void *handle)
return 0; return 0;
} }
amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0); amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
gmc_v11_0_gart_disable(adev); gmc_v11_0_gart_disable(adev);
......
...@@ -1999,7 +1999,6 @@ static int gmc_v9_0_hw_fini(void *handle) ...@@ -1999,7 +1999,6 @@ static int gmc_v9_0_hw_fini(void *handle)
if (adev->mmhub.funcs->update_power_gating) if (adev->mmhub.funcs->update_power_gating)
adev->mmhub.funcs->update_power_gating(adev, false); adev->mmhub.funcs->update_power_gating(adev, false);
amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0); amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
return 0; return 0;
......
...@@ -531,13 +531,6 @@ static void nv_program_aspm(struct amdgpu_device *adev) ...@@ -531,13 +531,6 @@ static void nv_program_aspm(struct amdgpu_device *adev)
} }
static void nv_enable_doorbell_aperture(struct amdgpu_device *adev,
bool enable)
{
adev->nbio.funcs->enable_doorbell_aperture(adev, enable);
adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, enable);
}
const struct amdgpu_ip_block_version nv_common_ip_block = const struct amdgpu_ip_block_version nv_common_ip_block =
{ {
.type = AMD_IP_BLOCK_TYPE_COMMON, .type = AMD_IP_BLOCK_TYPE_COMMON,
...@@ -999,6 +992,11 @@ static int nv_common_late_init(void *handle) ...@@ -999,6 +992,11 @@ static int nv_common_late_init(void *handle)
} }
} }
/* Enable selfring doorbell aperture late because doorbell BAR
* aperture will change if resize BAR successfully in gmc sw_init.
*/
adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, true);
return 0; return 0;
} }
...@@ -1038,7 +1036,7 @@ static int nv_common_hw_init(void *handle) ...@@ -1038,7 +1036,7 @@ static int nv_common_hw_init(void *handle)
if (adev->nbio.funcs->remap_hdp_registers && !amdgpu_sriov_vf(adev)) if (adev->nbio.funcs->remap_hdp_registers && !amdgpu_sriov_vf(adev))
adev->nbio.funcs->remap_hdp_registers(adev); adev->nbio.funcs->remap_hdp_registers(adev);
/* enable the doorbell aperture */ /* enable the doorbell aperture */
nv_enable_doorbell_aperture(adev, true); adev->nbio.funcs->enable_doorbell_aperture(adev, true);
return 0; return 0;
} }
...@@ -1047,8 +1045,13 @@ static int nv_common_hw_fini(void *handle) ...@@ -1047,8 +1045,13 @@ static int nv_common_hw_fini(void *handle)
{ {
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
/* disable the doorbell aperture */ /* Disable the doorbell aperture and selfring doorbell aperture
nv_enable_doorbell_aperture(adev, false); * separately in hw_fini because nv_enable_doorbell_aperture
* has been removed and there is no need to delay disabling
* selfring doorbell.
*/
adev->nbio.funcs->enable_doorbell_aperture(adev, false);
adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, false);
return 0; return 0;
} }
......
...@@ -510,10 +510,7 @@ static int sdma_v6_0_gfx_resume(struct amdgpu_device *adev) ...@@ -510,10 +510,7 @@ static int sdma_v6_0_gfx_resume(struct amdgpu_device *adev)
lower_32_bits(ring->rptr_gpu_addr) & 0xFFFFFFFC); lower_32_bits(ring->rptr_gpu_addr) & 0xFFFFFFFC);
rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_QUEUE0_RB_CNTL, RPTR_WRITEBACK_ENABLE, 1); rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_QUEUE0_RB_CNTL, RPTR_WRITEBACK_ENABLE, 1);
if (amdgpu_sriov_vf(adev)) rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_QUEUE0_RB_CNTL, WPTR_POLL_ENABLE, 0);
rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_QUEUE0_RB_CNTL, WPTR_POLL_ENABLE, 1);
else
rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_QUEUE0_RB_CNTL, WPTR_POLL_ENABLE, 0);
rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_QUEUE0_RB_CNTL, F32_WPTR_POLL_ENABLE, 1); rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_QUEUE0_RB_CNTL, F32_WPTR_POLL_ENABLE, 1);
WREG32_SOC15_IP(GC, sdma_v6_0_get_reg_offset(adev, i, regSDMA0_QUEUE0_RB_BASE), ring->gpu_addr >> 8); WREG32_SOC15_IP(GC, sdma_v6_0_get_reg_offset(adev, i, regSDMA0_QUEUE0_RB_BASE), ring->gpu_addr >> 8);
......
...@@ -40,7 +40,7 @@ static bool sienna_cichlid_is_mode2_default(struct amdgpu_reset_control *reset_c ...@@ -40,7 +40,7 @@ static bool sienna_cichlid_is_mode2_default(struct amdgpu_reset_control *reset_c
adev->pm.fw_version >= 0x3a5500 && !amdgpu_sriov_vf(adev)) adev->pm.fw_version >= 0x3a5500 && !amdgpu_sriov_vf(adev))
return true; return true;
#endif #endif
return false; return amdgpu_reset_method == AMD_RESET_METHOD_MODE2;
} }
static struct amdgpu_reset_handler * static struct amdgpu_reset_handler *
......
...@@ -619,13 +619,6 @@ static void soc15_program_aspm(struct amdgpu_device *adev) ...@@ -619,13 +619,6 @@ static void soc15_program_aspm(struct amdgpu_device *adev)
adev->nbio.funcs->program_aspm(adev); adev->nbio.funcs->program_aspm(adev);
} }
static void soc15_enable_doorbell_aperture(struct amdgpu_device *adev,
bool enable)
{
adev->nbio.funcs->enable_doorbell_aperture(adev, enable);
adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, enable);
}
const struct amdgpu_ip_block_version vega10_common_ip_block = const struct amdgpu_ip_block_version vega10_common_ip_block =
{ {
.type = AMD_IP_BLOCK_TYPE_COMMON, .type = AMD_IP_BLOCK_TYPE_COMMON,
...@@ -1125,6 +1118,11 @@ static int soc15_common_late_init(void *handle) ...@@ -1125,6 +1118,11 @@ static int soc15_common_late_init(void *handle)
if (amdgpu_sriov_vf(adev)) if (amdgpu_sriov_vf(adev))
xgpu_ai_mailbox_get_irq(adev); xgpu_ai_mailbox_get_irq(adev);
/* Enable selfring doorbell aperture late because doorbell BAR
* aperture will change if resize BAR successfully in gmc sw_init.
*/
adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, true);
return 0; return 0;
} }
...@@ -1182,7 +1180,8 @@ static int soc15_common_hw_init(void *handle) ...@@ -1182,7 +1180,8 @@ static int soc15_common_hw_init(void *handle)
adev->nbio.funcs->remap_hdp_registers(adev); adev->nbio.funcs->remap_hdp_registers(adev);
/* enable the doorbell aperture */ /* enable the doorbell aperture */
soc15_enable_doorbell_aperture(adev, true); adev->nbio.funcs->enable_doorbell_aperture(adev, true);
/* HW doorbell routing policy: doorbell writing not /* HW doorbell routing policy: doorbell writing not
* in SDMA/IH/MM/ACV range will be routed to CP. So * in SDMA/IH/MM/ACV range will be routed to CP. So
* we need to init SDMA doorbell range prior * we need to init SDMA doorbell range prior
...@@ -1198,8 +1197,14 @@ static int soc15_common_hw_fini(void *handle) ...@@ -1198,8 +1197,14 @@ static int soc15_common_hw_fini(void *handle)
{ {
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
/* disable the doorbell aperture */ /* Disable the doorbell aperture and selfring doorbell aperture
soc15_enable_doorbell_aperture(adev, false); * separately in hw_fini because soc15_enable_doorbell_aperture
* has been removed and there is no need to delay disabling
* selfring doorbell.
*/
adev->nbio.funcs->enable_doorbell_aperture(adev, false);
adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, false);
if (amdgpu_sriov_vf(adev)) if (amdgpu_sriov_vf(adev))
xgpu_ai_mailbox_put_irq(adev); xgpu_ai_mailbox_put_irq(adev);
......
...@@ -450,13 +450,6 @@ static void soc21_program_aspm(struct amdgpu_device *adev) ...@@ -450,13 +450,6 @@ static void soc21_program_aspm(struct amdgpu_device *adev)
adev->nbio.funcs->program_aspm(adev); adev->nbio.funcs->program_aspm(adev);
} }
static void soc21_enable_doorbell_aperture(struct amdgpu_device *adev,
bool enable)
{
adev->nbio.funcs->enable_doorbell_aperture(adev, enable);
adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, enable);
}
const struct amdgpu_ip_block_version soc21_common_ip_block = const struct amdgpu_ip_block_version soc21_common_ip_block =
{ {
.type = AMD_IP_BLOCK_TYPE_COMMON, .type = AMD_IP_BLOCK_TYPE_COMMON,
...@@ -764,6 +757,11 @@ static int soc21_common_late_init(void *handle) ...@@ -764,6 +757,11 @@ static int soc21_common_late_init(void *handle)
amdgpu_irq_get(adev, &adev->nbio.ras_err_event_athub_irq, 0); amdgpu_irq_get(adev, &adev->nbio.ras_err_event_athub_irq, 0);
} }
/* Enable selfring doorbell aperture late because doorbell BAR
* aperture will change if resize BAR successfully in gmc sw_init.
*/
adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, true);
return 0; return 0;
} }
...@@ -797,7 +795,7 @@ static int soc21_common_hw_init(void *handle) ...@@ -797,7 +795,7 @@ static int soc21_common_hw_init(void *handle)
if (adev->nbio.funcs->remap_hdp_registers) if (adev->nbio.funcs->remap_hdp_registers)
adev->nbio.funcs->remap_hdp_registers(adev); adev->nbio.funcs->remap_hdp_registers(adev);
/* enable the doorbell aperture */ /* enable the doorbell aperture */
soc21_enable_doorbell_aperture(adev, true); adev->nbio.funcs->enable_doorbell_aperture(adev, true);
return 0; return 0;
} }
...@@ -806,8 +804,13 @@ static int soc21_common_hw_fini(void *handle) ...@@ -806,8 +804,13 @@ static int soc21_common_hw_fini(void *handle)
{ {
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
/* disable the doorbell aperture */ /* Disable the doorbell aperture and selfring doorbell aperture
soc21_enable_doorbell_aperture(adev, false); * separately in hw_fini because soc21_enable_doorbell_aperture
* has been removed and there is no need to delay disabling
* selfring doorbell.
*/
adev->nbio.funcs->enable_doorbell_aperture(adev, false);
adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, false);
if (amdgpu_sriov_vf(adev)) { if (amdgpu_sriov_vf(adev)) {
xgpu_nv_mailbox_put_irq(adev); xgpu_nv_mailbox_put_irq(adev);
......
...@@ -2079,6 +2079,14 @@ static struct resource_funcs dcn32_res_pool_funcs = { ...@@ -2079,6 +2079,14 @@ static struct resource_funcs dcn32_res_pool_funcs = {
.restore_mall_state = dcn32_restore_mall_state, .restore_mall_state = dcn32_restore_mall_state,
}; };
static uint32_t read_pipe_fuses(struct dc_context *ctx)
{
uint32_t value = REG_READ(CC_DC_PIPE_DIS);
/* DCN32 support max 4 pipes */
value = value & 0xf;
return value;
}
static bool dcn32_resource_construct( static bool dcn32_resource_construct(
uint8_t num_virtual_links, uint8_t num_virtual_links,
...@@ -2122,7 +2130,7 @@ static bool dcn32_resource_construct( ...@@ -2122,7 +2130,7 @@ static bool dcn32_resource_construct(
pool->base.res_cap = &res_cap_dcn32; pool->base.res_cap = &res_cap_dcn32;
/* max number of pipes for ASIC before checking for pipe fuses */ /* max number of pipes for ASIC before checking for pipe fuses */
num_pipes = pool->base.res_cap->num_timing_generator; num_pipes = pool->base.res_cap->num_timing_generator;
pipe_fuses = REG_READ(CC_DC_PIPE_DIS); pipe_fuses = read_pipe_fuses(ctx);
for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) for (i = 0; i < pool->base.res_cap->num_timing_generator; i++)
if (pipe_fuses & 1 << i) if (pipe_fuses & 1 << i)
......
...@@ -1632,6 +1632,14 @@ static struct resource_funcs dcn321_res_pool_funcs = { ...@@ -1632,6 +1632,14 @@ static struct resource_funcs dcn321_res_pool_funcs = {
.restore_mall_state = dcn32_restore_mall_state, .restore_mall_state = dcn32_restore_mall_state,
}; };
static uint32_t read_pipe_fuses(struct dc_context *ctx)
{
uint32_t value = REG_READ(CC_DC_PIPE_DIS);
/* DCN321 support max 4 pipes */
value = value & 0xf;
return value;
}
static bool dcn321_resource_construct( static bool dcn321_resource_construct(
uint8_t num_virtual_links, uint8_t num_virtual_links,
...@@ -1674,7 +1682,7 @@ static bool dcn321_resource_construct( ...@@ -1674,7 +1682,7 @@ static bool dcn321_resource_construct(
pool->base.res_cap = &res_cap_dcn321; pool->base.res_cap = &res_cap_dcn321;
/* max number of pipes for ASIC before checking for pipe fuses */ /* max number of pipes for ASIC before checking for pipe fuses */
num_pipes = pool->base.res_cap->num_timing_generator; num_pipes = pool->base.res_cap->num_timing_generator;
pipe_fuses = REG_READ(CC_DC_PIPE_DIS); pipe_fuses = read_pipe_fuses(ctx);
for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) for (i = 0; i < pool->base.res_cap->num_timing_generator; i++)
if (pipe_fuses & 1 << i) if (pipe_fuses & 1 << i)
......
...@@ -149,8 +149,8 @@ static struct _vcs_dpi_soc_bounding_box_st dcn3_14_soc = { ...@@ -149,8 +149,8 @@ static struct _vcs_dpi_soc_bounding_box_st dcn3_14_soc = {
.num_states = 5, .num_states = 5,
.sr_exit_time_us = 16.5, .sr_exit_time_us = 16.5,
.sr_enter_plus_exit_time_us = 18.5, .sr_enter_plus_exit_time_us = 18.5,
.sr_exit_z8_time_us = 210.0, .sr_exit_z8_time_us = 268.0,
.sr_enter_plus_exit_z8_time_us = 310.0, .sr_enter_plus_exit_z8_time_us = 393.0,
.writeback_latency_us = 12.0, .writeback_latency_us = 12.0,
.dram_channel_width_bytes = 4, .dram_channel_width_bytes = 4,
.round_trip_ping_latency_dcfclk_cycles = 106, .round_trip_ping_latency_dcfclk_cycles = 106,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment