drm fixes for 5.16-rc6
i915: - Fix a bound check in the DMC fw load. ast: - NULL ptr deref fix simpledrm: - pixel clock units fix fb-helper: - userspace regression revert amdgpu: - Fix RLC register offset - GMC fix - Properly cache SMU FW version on Yellow Carp - Fix missing callback on DCN3.1 - Reset DMCUB before HW init - Fix for GMC powergating on PCO - Fix a possible memory leak in GPU metrics table handling on RN -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEEKbZHaGwW9KfbeusDHTzWXnEhr4FAmG8IyoACgkQDHTzWXnE hr6lsQ/+NZofDFJQUEc5Qk/VTfM7FGBa70IVxG7H8T6wDtkA8eTpiZxw2dgYwTcO gAMjI4o4ctmps8BAbs0kYjMu+31G+kK4WXJFtSHhKVNSBfARTBa4WnNJT2lQcKRq jYbovRmaNuaIS9nD9NkqO+z14PCSozj4fbCY61j4l67jW+bpRW8UUBsk0zzEoLSJ CruVBvgvvzsQYc33WrU/3G+mjCWADZXQGHxLVmMn3oGscarWK87JHAuyEhW1vbzf FffZcf85aW7CV+3qqtBxxtXE0DBHMo+IMS5N1XRs7YrgUkMmP3VheCIQ9D4EupqZ ezd5FZ9Rs3/Mzdfzftzyzr4CZOR5MzSjT6IHZ2NMo0VpM2rgI4FMyq/lf/Jnjx+K KZT6sN/SGNy+ZxOunkmySK7j7k3OtFo6q6vVMu+5bPeMj24/+Yv1JQjfOP+Dnoxx 3EhaI7i37QJBr9lUAlu+B6ywRX1PAPyYhuaTVb4WMOOvIKjzb7FoeaAAURiSlQqL 4DXtROtoinYMgAZqlbZMFJ6ZTWpy4Yj8s2HIOUMfSTZaztos17oAAskQ5/o+rhMQ /WDsXcSUaEaOTK1Df8B51Ol6LC6U50yhkFEHvUPw5fzqyprd5XD/FajMYG02ID3C KNJdMnq5AoyTdUiRsjQLC9G3TrXH2x2qqBcF3eo9PNc8PG/Q5ZM= =rNVA -----END PGP SIGNATURE----- Merge tag 'drm-fixes-2021-12-17-1' of git://anongit.freedesktop.org/drm/drm Pull drm fixes from Dave Airlie: "Mostly amdgpu fixes this week scattered around the driver, otherwise one i915, one ast, one simpledrm. There is a revert in the fb-helper for places userspace was using a string that we tried to change. i915: - Fix a bound check in the DMC fw load. ast: - NULL ptr deref fix simpledrm: - pixel clock units fix fb-helper: - userspace regression revert amdgpu: - Fix RLC register offset - GMC fix - Properly cache SMU FW version on Yellow Carp - Fix missing callback on DCN3.1 - Reset DMCUB before HW init - Fix for GMC powergating on PCO - Fix a possible memory leak in GPU metrics table handling on RN" * tag 'drm-fixes-2021-12-17-1' of git://anongit.freedesktop.org/drm/drm: drm/amd/pm: fix a potential gpu_metrics_table memory leak drm/amdgpu: correct the wrong cached state for GMC on PICASSO drm/amd/display: Reset DMCUB before HW init drm/amd/display: Set exit_optimized_pwr_state for DCN31 drm/amd/pm: fix reading SMU FW version from amdgpu_firmware_info on YC drm/amdgpu: don't override default ECO_BITs setting drm/amdgpu: correct register access for RLC_JUMP_TABLE_RESTORE drm/i915/display: Fix an unsigned subtraction which can never be negative. drm/ast: potential dereference of null pointer drm: simpledrm: fix wrong unit with pixel clock Revert "drm/fb-helper: improve DRM fbdev emulation device names"
This commit is contained in:
commit
4f549bf33e
|
@ -3070,8 +3070,8 @@ static void gfx_v9_0_init_pg(struct amdgpu_device *adev)
|
|||
AMD_PG_SUPPORT_CP |
|
||||
AMD_PG_SUPPORT_GDS |
|
||||
AMD_PG_SUPPORT_RLC_SMU_HS)) {
|
||||
WREG32(mmRLC_JUMP_TABLE_RESTORE,
|
||||
adev->gfx.rlc.cp_table_gpu_addr >> 8);
|
||||
WREG32_SOC15(GC, 0, mmRLC_JUMP_TABLE_RESTORE,
|
||||
adev->gfx.rlc.cp_table_gpu_addr >> 8);
|
||||
gfx_v9_0_init_gfx_power_gating(adev);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -162,7 +162,6 @@ static void gfxhub_v1_0_init_tlb_regs(struct amdgpu_device *adev)
|
|||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC);/* XXX for emulation. */
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1);
|
||||
|
|
|
@ -196,7 +196,6 @@ static void gfxhub_v2_0_init_tlb_regs(struct amdgpu_device *adev)
|
|||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC); /* UC, uncached */
|
||||
|
||||
|
|
|
@ -197,7 +197,6 @@ static void gfxhub_v2_1_init_tlb_regs(struct amdgpu_device *adev)
|
|||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC); /* UC, uncached */
|
||||
|
||||
|
|
|
@ -1808,6 +1808,14 @@ static int gmc_v9_0_hw_fini(void *handle)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Pair the operations did in gmc_v9_0_hw_init and thus maintain
|
||||
* a correct cached state for GMC. Otherwise, the "gate" again
|
||||
* operation on S3 resuming will fail due to wrong cached state.
|
||||
*/
|
||||
if (adev->mmhub.funcs->update_power_gating)
|
||||
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);
|
||||
|
||||
|
|
|
@ -145,7 +145,6 @@ static void mmhub_v1_0_init_tlb_regs(struct amdgpu_device *adev)
|
|||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC);/* XXX for emulation. */
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1);
|
||||
|
@ -302,10 +301,10 @@ static void mmhub_v1_0_update_power_gating(struct amdgpu_device *adev,
|
|||
if (amdgpu_sriov_vf(adev))
|
||||
return;
|
||||
|
||||
if (enable && adev->pg_flags & AMD_PG_SUPPORT_MMHUB) {
|
||||
amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GMC, true);
|
||||
|
||||
}
|
||||
if (adev->pg_flags & AMD_PG_SUPPORT_MMHUB)
|
||||
amdgpu_dpm_set_powergating_by_smu(adev,
|
||||
AMD_IP_BLOCK_TYPE_GMC,
|
||||
enable);
|
||||
}
|
||||
|
||||
static int mmhub_v1_0_gart_enable(struct amdgpu_device *adev)
|
||||
|
|
|
@ -165,7 +165,6 @@ static void mmhub_v1_7_init_tlb_regs(struct amdgpu_device *adev)
|
|||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC);/* XXX for emulation. */
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1);
|
||||
|
|
|
@ -267,7 +267,6 @@ static void mmhub_v2_0_init_tlb_regs(struct amdgpu_device *adev)
|
|||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC); /* UC, uncached */
|
||||
|
||||
|
|
|
@ -194,7 +194,6 @@ static void mmhub_v2_3_init_tlb_regs(struct amdgpu_device *adev)
|
|||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC); /* UC, uncached */
|
||||
|
||||
|
|
|
@ -189,8 +189,6 @@ static void mmhub_v9_4_init_tlb_regs(struct amdgpu_device *adev, int hubid)
|
|||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
|
||||
ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC);/* XXX for emulation. */
|
||||
tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
|
||||
|
|
|
@ -1051,6 +1051,11 @@ static int dm_dmub_hw_init(struct amdgpu_device *adev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Reset DMCUB if it was previously running - before we overwrite its memory. */
|
||||
status = dmub_srv_hw_reset(dmub_srv);
|
||||
if (status != DMUB_STATUS_OK)
|
||||
DRM_WARN("Error resetting DMUB HW: %d\n", status);
|
||||
|
||||
hdr = (const struct dmcub_firmware_header_v1_0 *)dmub_fw->data;
|
||||
|
||||
fw_inst_const = dmub_fw->data +
|
||||
|
|
|
@ -101,6 +101,7 @@ static const struct hw_sequencer_funcs dcn31_funcs = {
|
|||
.z10_restore = dcn31_z10_restore,
|
||||
.z10_save_init = dcn31_z10_save_init,
|
||||
.set_disp_pattern_generator = dcn30_set_disp_pattern_generator,
|
||||
.exit_optimized_pwr_state = dcn21_exit_optimized_pwr_state,
|
||||
.update_visual_confirm_color = dcn20_update_visual_confirm_color,
|
||||
};
|
||||
|
||||
|
|
|
@ -1328,7 +1328,12 @@ static int pp_set_powergating_by_smu(void *handle,
|
|||
pp_dpm_powergate_vce(handle, gate);
|
||||
break;
|
||||
case AMD_IP_BLOCK_TYPE_GMC:
|
||||
pp_dpm_powergate_mmhub(handle);
|
||||
/*
|
||||
* For now, this is only used on PICASSO.
|
||||
* And only "gate" operation is supported.
|
||||
*/
|
||||
if (gate)
|
||||
pp_dpm_powergate_mmhub(handle);
|
||||
break;
|
||||
case AMD_IP_BLOCK_TYPE_GFX:
|
||||
ret = pp_dpm_powergate_gfx(handle, gate);
|
||||
|
|
|
@ -191,6 +191,9 @@ int smu_v12_0_fini_smc_tables(struct smu_context *smu)
|
|||
kfree(smu_table->watermarks_table);
|
||||
smu_table->watermarks_table = NULL;
|
||||
|
||||
kfree(smu_table->gpu_metrics_table);
|
||||
smu_table->gpu_metrics_table = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -198,6 +198,7 @@ int smu_v13_0_check_fw_status(struct smu_context *smu)
|
|||
|
||||
int smu_v13_0_check_fw_version(struct smu_context *smu)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
uint32_t if_version = 0xff, smu_version = 0xff;
|
||||
uint16_t smu_major;
|
||||
uint8_t smu_minor, smu_debug;
|
||||
|
@ -210,6 +211,8 @@ int smu_v13_0_check_fw_version(struct smu_context *smu)
|
|||
smu_major = (smu_version >> 16) & 0xffff;
|
||||
smu_minor = (smu_version >> 8) & 0xff;
|
||||
smu_debug = (smu_version >> 0) & 0xff;
|
||||
if (smu->is_apu)
|
||||
adev->pm.fw_version = smu_version;
|
||||
|
||||
switch (smu->adev->ip_versions[MP1_HWIP][0]) {
|
||||
case IP_VERSION(13, 0, 2):
|
||||
|
|
|
@ -1121,7 +1121,10 @@ static void ast_crtc_reset(struct drm_crtc *crtc)
|
|||
if (crtc->state)
|
||||
crtc->funcs->atomic_destroy_state(crtc, crtc->state);
|
||||
|
||||
__drm_atomic_helper_crtc_reset(crtc, &ast_state->base);
|
||||
if (ast_state)
|
||||
__drm_atomic_helper_crtc_reset(crtc, &ast_state->base);
|
||||
else
|
||||
__drm_atomic_helper_crtc_reset(crtc, NULL);
|
||||
}
|
||||
|
||||
static struct drm_crtc_state *
|
||||
|
|
|
@ -1743,7 +1743,13 @@ void drm_fb_helper_fill_info(struct fb_info *info,
|
|||
sizes->fb_width, sizes->fb_height);
|
||||
|
||||
info->par = fb_helper;
|
||||
snprintf(info->fix.id, sizeof(info->fix.id), "%s",
|
||||
/*
|
||||
* The DRM drivers fbdev emulation device name can be confusing if the
|
||||
* driver name also has a "drm" suffix on it. Leading to names such as
|
||||
* "simpledrmdrmfb" in /proc/fb. Unfortunately, it's an uAPI and can't
|
||||
* be changed due user-space tools (e.g: pm-utils) matching against it.
|
||||
*/
|
||||
snprintf(info->fix.id, sizeof(info->fix.id), "%sdrmfb",
|
||||
fb_helper->dev->driver->name);
|
||||
|
||||
}
|
||||
|
|
|
@ -596,7 +596,7 @@ static void parse_dmc_fw(struct drm_i915_private *dev_priv,
|
|||
continue;
|
||||
|
||||
offset = readcount + dmc->dmc_info[id].dmc_offset * 4;
|
||||
if (fw->size - offset < 0) {
|
||||
if (offset > fw->size) {
|
||||
drm_err(&dev_priv->drm, "Reading beyond the fw_size\n");
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -458,7 +458,7 @@ static struct drm_display_mode simpledrm_mode(unsigned int width,
|
|||
{
|
||||
struct drm_display_mode mode = { SIMPLEDRM_MODE(width, height) };
|
||||
|
||||
mode.clock = 60 /* Hz */ * mode.hdisplay * mode.vdisplay;
|
||||
mode.clock = mode.hdisplay * mode.vdisplay * 60 / 1000 /* kHz */;
|
||||
drm_mode_set_name(&mode);
|
||||
|
||||
return mode;
|
||||
|
|
Loading…
Reference in New Issue