Skip to content

Commit f1be7b6

Browse files
committed
Merge tag 'drm-fixes-2023-04-13' of git://anongit.freedesktop.org/drm/drm
Pull drm fixes from Daniel Vetter: - two fbcon regressions - amdgpu: dp mst, smu13 - i915: dual link dsi for tgl+ - armada, nouveau, drm/sched, fbmem * tag 'drm-fixes-2023-04-13' of git://anongit.freedesktop.org/drm/drm: fbcon: set_con2fb_map needs to set con2fb_map! fbcon: Fix error paths in set_con2fb_map drm/amd/pm: correct the pcie link state check for SMU13 drm/amd/pm: correct SMU13.0.7 max shader clock reporting drm/amd/pm: correct SMU13.0.7 pstate profiling clock settings drm/amd/display: Pass the right info to drm_dp_remove_payload drm/armada: Fix a potential double free in an error handling path fbmem: Reject FB_ACTIVATE_KD_TEXT from userspace drm/nouveau/fb: add missing sysmen flush callbacks drm/i915/dsi: fix DSS CTL register offsets for TGL+ drm/scheduler: Fix UAF race in drm_sched_entity_push_job()
2 parents de46644 + cab2932 commit f1be7b6

File tree

13 files changed

+175
-35
lines changed

13 files changed

+175
-35
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,40 @@ void dm_helpers_dp_update_branch_info(
177177
const struct dc_link *link)
178178
{}
179179

180+
static void dm_helpers_construct_old_payload(
181+
struct dc_link *link,
182+
int pbn_per_slot,
183+
struct drm_dp_mst_atomic_payload *new_payload,
184+
struct drm_dp_mst_atomic_payload *old_payload)
185+
{
186+
struct link_mst_stream_allocation_table current_link_table =
187+
link->mst_stream_alloc_table;
188+
struct link_mst_stream_allocation *dc_alloc;
189+
int i;
190+
191+
*old_payload = *new_payload;
192+
193+
/* Set correct time_slots/PBN of old payload.
194+
* other fields (delete & dsc_enabled) in
195+
* struct drm_dp_mst_atomic_payload are don't care fields
196+
* while calling drm_dp_remove_payload()
197+
*/
198+
for (i = 0; i < current_link_table.stream_count; i++) {
199+
dc_alloc =
200+
&current_link_table.stream_allocations[i];
201+
202+
if (dc_alloc->vcp_id == new_payload->vcpi) {
203+
old_payload->time_slots = dc_alloc->slot_count;
204+
old_payload->pbn = dc_alloc->slot_count * pbn_per_slot;
205+
break;
206+
}
207+
}
208+
209+
/* make sure there is an old payload*/
210+
ASSERT(i != current_link_table.stream_count);
211+
212+
}
213+
180214
/*
181215
* Writes payload allocation table in immediate downstream device.
182216
*/
@@ -188,7 +222,7 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
188222
{
189223
struct amdgpu_dm_connector *aconnector;
190224
struct drm_dp_mst_topology_state *mst_state;
191-
struct drm_dp_mst_atomic_payload *payload;
225+
struct drm_dp_mst_atomic_payload *target_payload, *new_payload, old_payload;
192226
struct drm_dp_mst_topology_mgr *mst_mgr;
193227

194228
aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
@@ -204,17 +238,26 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
204238
mst_state = to_drm_dp_mst_topology_state(mst_mgr->base.state);
205239

206240
/* It's OK for this to fail */
207-
payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
208-
if (enable)
209-
drm_dp_add_payload_part1(mst_mgr, mst_state, payload);
210-
else
211-
drm_dp_remove_payload(mst_mgr, mst_state, payload, payload);
241+
new_payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
242+
243+
if (enable) {
244+
target_payload = new_payload;
245+
246+
drm_dp_add_payload_part1(mst_mgr, mst_state, new_payload);
247+
} else {
248+
/* construct old payload by VCPI*/
249+
dm_helpers_construct_old_payload(stream->link, mst_state->pbn_div,
250+
new_payload, &old_payload);
251+
target_payload = &old_payload;
252+
253+
drm_dp_remove_payload(mst_mgr, mst_state, &old_payload, new_payload);
254+
}
212255

213256
/* mst_mgr->->payloads are VC payload notify MST branch using DPCD or
214257
* AUX message. The sequence is slot 1-63 allocated sequence for each
215258
* stream. AMD ASIC stream slot allocation should follow the same
216259
* sequence. copy DRM MST allocation to dc */
217-
fill_dc_mst_payload_table_from_drm(stream->link, enable, payload, proposed_table);
260+
fill_dc_mst_payload_table_from_drm(stream->link, enable, target_payload, proposed_table);
218261

219262
return true;
220263
}

drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@
6161
#define CTF_OFFSET_HOTSPOT 5
6262
#define CTF_OFFSET_MEM 5
6363

64+
static const int pmfw_decoded_link_speed[5] = {1, 2, 3, 4, 5};
65+
static const int pmfw_decoded_link_width[7] = {0, 1, 2, 4, 8, 12, 16};
66+
67+
#define DECODE_GEN_SPEED(gen_speed_idx) (pmfw_decoded_link_speed[gen_speed_idx])
68+
#define DECODE_LANE_WIDTH(lane_width_idx) (pmfw_decoded_link_width[lane_width_idx])
69+
6470
struct smu_13_0_max_sustainable_clocks {
6571
uint32_t display_clock;
6672
uint32_t phy_clock;

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,8 +1144,8 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,
11441144
(pcie_table->pcie_lane[i] == 5) ? "x12" :
11451145
(pcie_table->pcie_lane[i] == 6) ? "x16" : "",
11461146
pcie_table->clk_freq[i],
1147-
((gen_speed - 1) == pcie_table->pcie_gen[i]) &&
1148-
(lane_width == link_width[pcie_table->pcie_lane[i]]) ?
1147+
(gen_speed == DECODE_GEN_SPEED(pcie_table->pcie_gen[i])) &&
1148+
(lane_width == DECODE_LANE_WIDTH(link_width[pcie_table->pcie_lane[i]])) ?
11491149
"*" : "");
11501150
break;
11511151

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c

Lines changed: 77 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,14 @@ static int smu_v13_0_7_set_default_dpm_table(struct smu_context *smu)
575575
dpm_table);
576576
if (ret)
577577
return ret;
578+
579+
if (skutable->DriverReportedClocks.GameClockAc &&
580+
(dpm_table->dpm_levels[dpm_table->count - 1].value >
581+
skutable->DriverReportedClocks.GameClockAc)) {
582+
dpm_table->dpm_levels[dpm_table->count - 1].value =
583+
skutable->DriverReportedClocks.GameClockAc;
584+
dpm_table->max = skutable->DriverReportedClocks.GameClockAc;
585+
}
578586
} else {
579587
dpm_table->count = 1;
580588
dpm_table->dpm_levels[0].value = smu->smu_table.boot_values.gfxclk / 100;
@@ -828,6 +836,57 @@ static int smu_v13_0_7_get_smu_metrics_data(struct smu_context *smu,
828836
return ret;
829837
}
830838

839+
static int smu_v13_0_7_get_dpm_ultimate_freq(struct smu_context *smu,
840+
enum smu_clk_type clk_type,
841+
uint32_t *min,
842+
uint32_t *max)
843+
{
844+
struct smu_13_0_dpm_context *dpm_context =
845+
smu->smu_dpm.dpm_context;
846+
struct smu_13_0_dpm_table *dpm_table;
847+
848+
switch (clk_type) {
849+
case SMU_MCLK:
850+
case SMU_UCLK:
851+
/* uclk dpm table */
852+
dpm_table = &dpm_context->dpm_tables.uclk_table;
853+
break;
854+
case SMU_GFXCLK:
855+
case SMU_SCLK:
856+
/* gfxclk dpm table */
857+
dpm_table = &dpm_context->dpm_tables.gfx_table;
858+
break;
859+
case SMU_SOCCLK:
860+
/* socclk dpm table */
861+
dpm_table = &dpm_context->dpm_tables.soc_table;
862+
break;
863+
case SMU_FCLK:
864+
/* fclk dpm table */
865+
dpm_table = &dpm_context->dpm_tables.fclk_table;
866+
break;
867+
case SMU_VCLK:
868+
case SMU_VCLK1:
869+
/* vclk dpm table */
870+
dpm_table = &dpm_context->dpm_tables.vclk_table;
871+
break;
872+
case SMU_DCLK:
873+
case SMU_DCLK1:
874+
/* dclk dpm table */
875+
dpm_table = &dpm_context->dpm_tables.dclk_table;
876+
break;
877+
default:
878+
dev_err(smu->adev->dev, "Unsupported clock type!\n");
879+
return -EINVAL;
880+
}
881+
882+
if (min)
883+
*min = dpm_table->min;
884+
if (max)
885+
*max = dpm_table->max;
886+
887+
return 0;
888+
}
889+
831890
static int smu_v13_0_7_read_sensor(struct smu_context *smu,
832891
enum amd_pp_sensors sensor,
833892
void *data,
@@ -1074,8 +1133,8 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
10741133
(pcie_table->pcie_lane[i] == 5) ? "x12" :
10751134
(pcie_table->pcie_lane[i] == 6) ? "x16" : "",
10761135
pcie_table->clk_freq[i],
1077-
(gen_speed == pcie_table->pcie_gen[i]) &&
1078-
(lane_width == pcie_table->pcie_lane[i]) ?
1136+
(gen_speed == DECODE_GEN_SPEED(pcie_table->pcie_gen[i])) &&
1137+
(lane_width == DECODE_LANE_WIDTH(pcie_table->pcie_lane[i])) ?
10791138
"*" : "");
10801139
break;
10811140

@@ -1329,9 +1388,17 @@ static int smu_v13_0_7_populate_umd_state_clk(struct smu_context *smu)
13291388
&dpm_context->dpm_tables.fclk_table;
13301389
struct smu_umd_pstate_table *pstate_table =
13311390
&smu->pstate_table;
1391+
struct smu_table_context *table_context = &smu->smu_table;
1392+
PPTable_t *pptable = table_context->driver_pptable;
1393+
DriverReportedClocks_t driver_clocks =
1394+
pptable->SkuTable.DriverReportedClocks;
13321395

13331396
pstate_table->gfxclk_pstate.min = gfx_table->min;
1334-
pstate_table->gfxclk_pstate.peak = gfx_table->max;
1397+
if (driver_clocks.GameClockAc &&
1398+
(driver_clocks.GameClockAc < gfx_table->max))
1399+
pstate_table->gfxclk_pstate.peak = driver_clocks.GameClockAc;
1400+
else
1401+
pstate_table->gfxclk_pstate.peak = gfx_table->max;
13351402

13361403
pstate_table->uclk_pstate.min = mem_table->min;
13371404
pstate_table->uclk_pstate.peak = mem_table->max;
@@ -1348,12 +1415,12 @@ static int smu_v13_0_7_populate_umd_state_clk(struct smu_context *smu)
13481415
pstate_table->fclk_pstate.min = fclk_table->min;
13491416
pstate_table->fclk_pstate.peak = fclk_table->max;
13501417

1351-
/*
1352-
* For now, just use the mininum clock frequency.
1353-
* TODO: update them when the real pstate settings available
1354-
*/
1355-
pstate_table->gfxclk_pstate.standard = gfx_table->min;
1356-
pstate_table->uclk_pstate.standard = mem_table->min;
1418+
if (driver_clocks.BaseClockAc &&
1419+
driver_clocks.BaseClockAc < gfx_table->max)
1420+
pstate_table->gfxclk_pstate.standard = driver_clocks.BaseClockAc;
1421+
else
1422+
pstate_table->gfxclk_pstate.standard = gfx_table->max;
1423+
pstate_table->uclk_pstate.standard = mem_table->max;
13571424
pstate_table->socclk_pstate.standard = soc_table->min;
13581425
pstate_table->vclk_pstate.standard = vclk_table->min;
13591426
pstate_table->dclk_pstate.standard = dclk_table->min;
@@ -1676,7 +1743,7 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
16761743
.dpm_set_jpeg_enable = smu_v13_0_set_jpeg_enable,
16771744
.init_pptable_microcode = smu_v13_0_init_pptable_microcode,
16781745
.populate_umd_state_clk = smu_v13_0_7_populate_umd_state_clk,
1679-
.get_dpm_ultimate_freq = smu_v13_0_get_dpm_ultimate_freq,
1746+
.get_dpm_ultimate_freq = smu_v13_0_7_get_dpm_ultimate_freq,
16801747
.get_vbios_bootup_values = smu_v13_0_get_vbios_bootup_values,
16811748
.read_sensor = smu_v13_0_7_read_sensor,
16821749
.feature_is_enabled = smu_cmn_feature_is_enabled,

drivers/gpu/drm/armada/armada_drv.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ static int armada_drm_bind(struct device *dev)
9999
if (ret) {
100100
dev_err(dev, "[" DRM_NAME ":%s] can't kick out simple-fb: %d\n",
101101
__func__, ret);
102-
kfree(priv);
103102
return ret;
104103
}
105104

drivers/gpu/drm/i915/display/icl_dsi.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -300,9 +300,21 @@ static void configure_dual_link_mode(struct intel_encoder *encoder,
300300
{
301301
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
302302
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
303+
i915_reg_t dss_ctl1_reg, dss_ctl2_reg;
303304
u32 dss_ctl1;
304305

305-
dss_ctl1 = intel_de_read(dev_priv, DSS_CTL1);
306+
/* FIXME: Move all DSS handling to intel_vdsc.c */
307+
if (DISPLAY_VER(dev_priv) >= 12) {
308+
struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
309+
310+
dss_ctl1_reg = ICL_PIPE_DSS_CTL1(crtc->pipe);
311+
dss_ctl2_reg = ICL_PIPE_DSS_CTL2(crtc->pipe);
312+
} else {
313+
dss_ctl1_reg = DSS_CTL1;
314+
dss_ctl2_reg = DSS_CTL2;
315+
}
316+
317+
dss_ctl1 = intel_de_read(dev_priv, dss_ctl1_reg);
306318
dss_ctl1 |= SPLITTER_ENABLE;
307319
dss_ctl1 &= ~OVERLAP_PIXELS_MASK;
308320
dss_ctl1 |= OVERLAP_PIXELS(intel_dsi->pixel_overlap);
@@ -323,16 +335,16 @@ static void configure_dual_link_mode(struct intel_encoder *encoder,
323335

324336
dss_ctl1 &= ~LEFT_DL_BUF_TARGET_DEPTH_MASK;
325337
dss_ctl1 |= LEFT_DL_BUF_TARGET_DEPTH(dl_buffer_depth);
326-
dss_ctl2 = intel_de_read(dev_priv, DSS_CTL2);
338+
dss_ctl2 = intel_de_read(dev_priv, dss_ctl2_reg);
327339
dss_ctl2 &= ~RIGHT_DL_BUF_TARGET_DEPTH_MASK;
328340
dss_ctl2 |= RIGHT_DL_BUF_TARGET_DEPTH(dl_buffer_depth);
329-
intel_de_write(dev_priv, DSS_CTL2, dss_ctl2);
341+
intel_de_write(dev_priv, dss_ctl2_reg, dss_ctl2);
330342
} else {
331343
/* Interleave */
332344
dss_ctl1 |= DUAL_LINK_MODE_INTERLEAVE;
333345
}
334346

335-
intel_de_write(dev_priv, DSS_CTL1, dss_ctl1);
347+
intel_de_write(dev_priv, dss_ctl1_reg, dss_ctl1);
336348
}
337349

338350
/* aka DSI 8X clock */

drivers/gpu/drm/nouveau/nvkm/subdev/fb/gf108.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ gf108_fb = {
3131
.init = gf100_fb_init,
3232
.init_page = gf100_fb_init_page,
3333
.intr = gf100_fb_intr,
34+
.sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
3435
.ram_new = gf108_ram_new,
3536
.default_bigpage = 17,
3637
};

drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk104.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ gk104_fb = {
7777
.init = gf100_fb_init,
7878
.init_page = gf100_fb_init_page,
7979
.intr = gf100_fb_intr,
80+
.sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
8081
.ram_new = gk104_ram_new,
8182
.default_bigpage = 17,
8283
.clkgate_pack = gk104_fb_clkgate_pack,

drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk110.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ gk110_fb = {
5959
.init = gf100_fb_init,
6060
.init_page = gf100_fb_init_page,
6161
.intr = gf100_fb_intr,
62+
.sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
6263
.ram_new = gk104_ram_new,
6364
.default_bigpage = 17,
6465
.clkgate_pack = gk110_fb_clkgate_pack,

drivers/gpu/drm/nouveau/nvkm/subdev/fb/gm107.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ gm107_fb = {
3131
.init = gf100_fb_init,
3232
.init_page = gf100_fb_init_page,
3333
.intr = gf100_fb_intr,
34+
.sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
3435
.ram_new = gm107_ram_new,
3536
.default_bigpage = 17,
3637
};

0 commit comments

Comments
 (0)