Skip to content

Commit 7c9aa0f

Browse files
committed
Merge tag 'drm-intel-next-2023-08-03' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
- Removing unused declarations (Arnd, Gustavo) - ICL+ DSI modeset sequence fixes (Ville) - Improvements on HDCP (Suraj) - Fixes and clean up on MTL Display (Mika Kahola, Lee, RK, Nirmoy, Chaitanya) - Restore HSW/BDW PSR1 (Ville) - Other PSR Fixes (Jouni) - Fixes around DC states and other Display Power (Imre) - Init DDI ports in VBT order (Ville) - General documentation fixes (Jani) - General refactor for better organization (Jani) - Bigjoiner fix (Stanislav) - VDSC Fixes and improvements (Stanialav, Suraj) - Hotplug fixes and improvements (Simon, Suraj) - Start using plane scale factor for relative data rate (Stanislav) - Use shmem for dpt objects (RK) - Simplify expression &to_i915(dev)->drm (Uwe) - Do not access i915_gem_object members from frontbuffer tracking (Jouni) - Fix uncore race around i915->params.mmio_debug (Jani) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/ZMv4RCzGyCmG/BDe@intel.com
2 parents ca9e70f + d823445 commit 7c9aa0f

81 files changed

Lines changed: 1405 additions & 808 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Documentation/gpu/rfc/i915_scheduler.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,13 @@ Add I915_CONTEXT_ENGINES_EXT_PARALLEL_SUBMIT and
135135
drm_i915_context_engines_parallel_submit to the uAPI to implement this
136136
extension.
137137

138+
.. c:namespace-push:: rfc
139+
138140
.. kernel-doc:: include/uapi/drm/i915_drm.h
139141
:functions: i915_context_engines_parallel_submit
140142

143+
.. c:namespace-pop::
144+
141145
Extend execbuf2 IOCTL to support submitting N BBs in a single IOCTL
142146
-------------------------------------------------------------------
143147
Contexts that have been configured with the 'set_parallel' extension can only

drivers/gpu/drm/i915/Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ subdir-ccflags-y += $(call cc-option, -Wunused-but-set-variable)
2323
subdir-ccflags-y += $(call cc-disable-warning, frame-address)
2424
subdir-ccflags-$(CONFIG_DRM_I915_WERROR) += -Werror
2525

26+
# Fine grained warnings disable
27+
CFLAGS_i915_pci.o = $(call cc-disable-warning, override-init)
28+
CFLAGS_display/intel_display_device.o = $(call cc-disable-warning, override-init)
29+
CFLAGS_display/intel_fbdev.o = $(call cc-disable-warning, override-init)
30+
2631
subdir-ccflags-y += -I$(srctree)/$(src)
2732

2833
# Please keep these build lists sorted!

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,6 +1259,9 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv,
12591259
struct drm_encoder *encoder;
12601260
struct intel_connector *intel_connector;
12611261

1262+
if (!assert_port_valid(dev_priv, port))
1263+
return false;
1264+
12621265
devdata = intel_bios_encoder_data_lookup(dev_priv, port);
12631266

12641267
/* FIXME bail? */
@@ -1270,6 +1273,8 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv,
12701273
if (!dig_port)
12711274
return false;
12721275

1276+
dig_port->aux_ch = AUX_CH_NONE;
1277+
12731278
intel_connector = intel_connector_alloc();
12741279
if (!intel_connector)
12751280
goto err_connector_alloc;
@@ -1373,6 +1378,9 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv,
13731378
intel_infoframe_init(dig_port);
13741379

13751380
dig_port->aux_ch = intel_dp_aux_ch(intel_encoder);
1381+
if (dig_port->aux_ch == AUX_CH_NONE)
1382+
goto err_init_connector;
1383+
13761384
if (!intel_dp_init_connector(dig_port, intel_connector))
13771385
goto err_init_connector;
13781386

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,20 @@ int g4x_hdmi_connector_atomic_check(struct drm_connector *connector,
659659
return ret;
660660
}
661661

662+
static bool is_hdmi_port_valid(struct drm_i915_private *i915, enum port port)
663+
{
664+
if (IS_G4X(i915) || IS_VALLEYVIEW(i915))
665+
return port == PORT_B || port == PORT_C;
666+
else
667+
return port == PORT_B || port == PORT_C || port == PORT_D;
668+
}
669+
670+
static bool assert_hdmi_port_valid(struct drm_i915_private *i915, enum port port)
671+
{
672+
return !drm_WARN(&i915->drm, !is_hdmi_port_valid(i915, port),
673+
"Platform does not support HDMI %c\n", port_name(port));
674+
}
675+
662676
void g4x_hdmi_init(struct drm_i915_private *dev_priv,
663677
i915_reg_t hdmi_reg, enum port port)
664678
{
@@ -667,6 +681,12 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
667681
struct intel_encoder *intel_encoder;
668682
struct intel_connector *intel_connector;
669683

684+
if (!assert_port_valid(dev_priv, port))
685+
return;
686+
687+
if (!assert_hdmi_port_valid(dev_priv, port))
688+
return;
689+
670690
devdata = intel_bios_encoder_data_lookup(dev_priv, port);
671691

672692
/* FIXME bail? */
@@ -678,6 +698,8 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
678698
if (!dig_port)
679699
return;
680700

701+
dig_port->aux_ch = AUX_CH_NONE;
702+
681703
intel_connector = intel_connector_alloc();
682704
if (!intel_connector) {
683705
kfree(dig_port);
@@ -753,6 +775,5 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
753775

754776
intel_infoframe_init(dig_port);
755777

756-
dig_port->aux_ch = intel_dp_aux_ch(intel_encoder);
757778
intel_hdmi_init_connector(dig_port, intel_connector);
758779
}

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

Lines changed: 82 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -528,31 +528,16 @@ gen11_dsi_setup_dphy_timings(struct intel_encoder *encoder,
528528
enum port port;
529529
enum phy phy;
530530

531-
/* Program T-INIT master registers */
532-
for_each_dsi_port(port, intel_dsi->ports)
533-
intel_de_rmw(dev_priv, ICL_DSI_T_INIT_MASTER(port),
534-
DSI_T_INIT_MASTER_MASK, intel_dsi->init_count);
535-
536531
/* Program DPHY clock lanes timings */
537-
for_each_dsi_port(port, intel_dsi->ports) {
532+
for_each_dsi_port(port, intel_dsi->ports)
538533
intel_de_write(dev_priv, DPHY_CLK_TIMING_PARAM(port),
539534
intel_dsi->dphy_reg);
540535

541-
/* shadow register inside display core */
542-
intel_de_write(dev_priv, DSI_CLK_TIMING_PARAM(port),
543-
intel_dsi->dphy_reg);
544-
}
545-
546536
/* Program DPHY data lanes timings */
547-
for_each_dsi_port(port, intel_dsi->ports) {
537+
for_each_dsi_port(port, intel_dsi->ports)
548538
intel_de_write(dev_priv, DPHY_DATA_TIMING_PARAM(port),
549539
intel_dsi->dphy_data_lane_reg);
550540

551-
/* shadow register inside display core */
552-
intel_de_write(dev_priv, DSI_DATA_TIMING_PARAM(port),
553-
intel_dsi->dphy_data_lane_reg);
554-
}
555-
556541
/*
557542
* If DSI link operating at or below an 800 MHz,
558543
* TA_SURE should be override and programmed to
@@ -561,16 +546,10 @@ gen11_dsi_setup_dphy_timings(struct intel_encoder *encoder,
561546
*/
562547
if (DISPLAY_VER(dev_priv) == 11) {
563548
if (afe_clk(encoder, crtc_state) <= 800000) {
564-
for_each_dsi_port(port, intel_dsi->ports) {
549+
for_each_dsi_port(port, intel_dsi->ports)
565550
intel_de_rmw(dev_priv, DPHY_TA_TIMING_PARAM(port),
566551
TA_SURE_MASK,
567552
TA_SURE_OVERRIDE | TA_SURE(0));
568-
569-
/* shadow register inside display core */
570-
intel_de_rmw(dev_priv, DSI_TA_TIMING_PARAM(port),
571-
TA_SURE_MASK,
572-
TA_SURE_OVERRIDE | TA_SURE(0));
573-
}
574553
}
575554
}
576555

@@ -581,6 +560,41 @@ gen11_dsi_setup_dphy_timings(struct intel_encoder *encoder,
581560
}
582561
}
583562

563+
static void
564+
gen11_dsi_setup_timings(struct intel_encoder *encoder,
565+
const struct intel_crtc_state *crtc_state)
566+
{
567+
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
568+
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
569+
enum port port;
570+
571+
/* Program T-INIT master registers */
572+
for_each_dsi_port(port, intel_dsi->ports)
573+
intel_de_rmw(dev_priv, ICL_DSI_T_INIT_MASTER(port),
574+
DSI_T_INIT_MASTER_MASK, intel_dsi->init_count);
575+
576+
/* shadow register inside display core */
577+
for_each_dsi_port(port, intel_dsi->ports)
578+
intel_de_write(dev_priv, DSI_CLK_TIMING_PARAM(port),
579+
intel_dsi->dphy_reg);
580+
581+
/* shadow register inside display core */
582+
for_each_dsi_port(port, intel_dsi->ports)
583+
intel_de_write(dev_priv, DSI_DATA_TIMING_PARAM(port),
584+
intel_dsi->dphy_data_lane_reg);
585+
586+
/* shadow register inside display core */
587+
if (DISPLAY_VER(dev_priv) == 11) {
588+
if (afe_clk(encoder, crtc_state) <= 800000) {
589+
for_each_dsi_port(port, intel_dsi->ports) {
590+
intel_de_rmw(dev_priv, DSI_TA_TIMING_PARAM(port),
591+
TA_SURE_MASK,
592+
TA_SURE_OVERRIDE | TA_SURE(0));
593+
}
594+
}
595+
}
596+
}
597+
584598
static void gen11_dsi_gate_clocks(struct intel_encoder *encoder)
585599
{
586600
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
@@ -1090,11 +1104,15 @@ gen11_dsi_enable_port_and_phy(struct intel_encoder *encoder,
10901104
/* step 4c: configure voltage swing and skew */
10911105
gen11_dsi_voltage_swing_program_seq(encoder);
10921106

1107+
/* setup D-PHY timings */
1108+
gen11_dsi_setup_dphy_timings(encoder, crtc_state);
1109+
10931110
/* enable DDI buffer */
10941111
gen11_dsi_enable_ddi_buffer(encoder);
10951112

1096-
/* setup D-PHY timings */
1097-
gen11_dsi_setup_dphy_timings(encoder, crtc_state);
1113+
gen11_dsi_gate_clocks(encoder);
1114+
1115+
gen11_dsi_setup_timings(encoder, crtc_state);
10981116

10991117
/* Since transcoder is configured to take events from GPIO */
11001118
gen11_dsi_config_util_pin(encoder, true);
@@ -1104,9 +1122,6 @@ gen11_dsi_enable_port_and_phy(struct intel_encoder *encoder,
11041122

11051123
/* Step (4h, 4i, 4j, 4k): Configure transcoder */
11061124
gen11_dsi_configure_transcoder(encoder, crtc_state);
1107-
1108-
/* Step 4l: Gate DDI clocks */
1109-
gen11_dsi_gate_clocks(encoder);
11101125
}
11111126

11121127
static void gen11_dsi_powerup_panel(struct intel_encoder *encoder)
@@ -1138,12 +1153,7 @@ static void gen11_dsi_powerup_panel(struct intel_encoder *encoder)
11381153
"error setting max return pkt size%d\n", tmp);
11391154
}
11401155

1141-
/* panel power on related mipi dsi vbt sequences */
1142-
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_ON);
1143-
msleep(intel_dsi->panel_on_delay);
1144-
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DEASSERT_RESET);
11451156
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_INIT_OTP);
1146-
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_ON);
11471157

11481158
/* ensure all panel commands dispatched before enabling transcoder */
11491159
wait_for_cmds_dispatched_to_panel(encoder);
@@ -1154,6 +1164,14 @@ static void gen11_dsi_pre_pll_enable(struct intel_atomic_state *state,
11541164
const struct intel_crtc_state *crtc_state,
11551165
const struct drm_connector_state *conn_state)
11561166
{
1167+
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
1168+
1169+
intel_dsi_wait_panel_power_cycle(intel_dsi);
1170+
1171+
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_ON);
1172+
msleep(intel_dsi->panel_on_delay);
1173+
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DEASSERT_RESET);
1174+
11571175
/* step2: enable IO power */
11581176
gen11_dsi_enable_io_power(encoder);
11591177

@@ -1225,9 +1243,7 @@ static void gen11_dsi_enable(struct intel_atomic_state *state,
12251243
const struct drm_connector_state *conn_state)
12261244
{
12271245
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
1228-
struct intel_crtc *crtc = to_intel_crtc(conn_state->crtc);
1229-
1230-
drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
1246+
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
12311247

12321248
/* Wa_1409054076:icl,jsl,ehl */
12331249
icl_apply_kvmr_pipe_a_wa(encoder, crtc->pipe, true);
@@ -1238,6 +1254,8 @@ static void gen11_dsi_enable(struct intel_atomic_state *state,
12381254
/* step6d: enable dsi transcoder */
12391255
gen11_dsi_enable_transcoder(encoder);
12401256

1257+
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_ON);
1258+
12411259
/* step7: enable backlight */
12421260
intel_backlight_enable(crtc_state, conn_state);
12431261
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_BACKLIGHT_ON);
@@ -1271,8 +1289,6 @@ static void gen11_dsi_powerdown_panel(struct intel_encoder *encoder)
12711289
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
12721290

12731291
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_OFF);
1274-
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_ASSERT_RESET);
1275-
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_OFF);
12761292

12771293
/* ensure cmds dispatched to panel */
12781294
wait_for_cmds_dispatched_to_panel(encoder);
@@ -1373,11 +1389,21 @@ static void gen11_dsi_disable(struct intel_atomic_state *state,
13731389
const struct drm_connector_state *old_conn_state)
13741390
{
13751391
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
1376-
struct intel_crtc *crtc = to_intel_crtc(old_conn_state->crtc);
13771392

13781393
/* step1: turn off backlight */
13791394
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_BACKLIGHT_OFF);
13801395
intel_backlight_disable(old_conn_state);
1396+
}
1397+
1398+
static void gen11_dsi_post_disable(struct intel_atomic_state *state,
1399+
struct intel_encoder *encoder,
1400+
const struct intel_crtc_state *old_crtc_state,
1401+
const struct drm_connector_state *old_conn_state)
1402+
{
1403+
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
1404+
struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
1405+
1406+
intel_crtc_vblank_off(old_crtc_state);
13811407

13821408
/* step2d,e: disable transcoder and wait */
13831409
gen11_dsi_disable_transcoder(encoder);
@@ -1391,25 +1417,23 @@ static void gen11_dsi_disable(struct intel_atomic_state *state,
13911417
/* step2h,i,j: deconfig trancoder */
13921418
gen11_dsi_deconfigure_trancoder(encoder);
13931419

1420+
intel_dsc_disable(old_crtc_state);
1421+
skl_scaler_disable(old_crtc_state);
1422+
13941423
/* step3: disable port */
13951424
gen11_dsi_disable_port(encoder);
13961425

13971426
gen11_dsi_config_util_pin(encoder, false);
13981427

13991428
/* step4: disable IO power */
14001429
gen11_dsi_disable_io_power(encoder);
1401-
}
14021430

1403-
static void gen11_dsi_post_disable(struct intel_atomic_state *state,
1404-
struct intel_encoder *encoder,
1405-
const struct intel_crtc_state *old_crtc_state,
1406-
const struct drm_connector_state *old_conn_state)
1407-
{
1408-
intel_crtc_vblank_off(old_crtc_state);
1431+
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_ASSERT_RESET);
14091432

1410-
intel_dsc_disable(old_crtc_state);
1433+
msleep(intel_dsi->panel_off_delay);
1434+
intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_OFF);
14111435

1412-
skl_scaler_disable(old_crtc_state);
1436+
intel_dsi->panel_power_off_time = ktime_get_boottime();
14131437
}
14141438

14151439
static enum drm_mode_status gen11_dsi_mode_valid(struct drm_connector *connector,
@@ -1909,15 +1933,17 @@ static void icl_dsi_add_properties(struct intel_connector *connector)
19091933
fixed_mode->vdisplay);
19101934
}
19111935

1912-
void icl_dsi_init(struct drm_i915_private *dev_priv)
1936+
void icl_dsi_init(struct drm_i915_private *dev_priv,
1937+
const struct intel_bios_encoder_data *devdata)
19131938
{
19141939
struct intel_dsi *intel_dsi;
19151940
struct intel_encoder *encoder;
19161941
struct intel_connector *intel_connector;
19171942
struct drm_connector *connector;
19181943
enum port port;
19191944

1920-
if (!intel_bios_is_dsi_present(dev_priv, &port))
1945+
port = intel_bios_encoder_port(devdata);
1946+
if (port == PORT_NONE)
19211947
return;
19221948

19231949
intel_dsi = kzalloc(sizeof(*intel_dsi), GFP_KERNEL);
@@ -1934,6 +1960,8 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
19341960
intel_dsi->attached_connector = intel_connector;
19351961
connector = &intel_connector->base;
19361962

1963+
encoder->devdata = devdata;
1964+
19371965
/* register DSI encoder with DRM subsystem */
19381966
drm_encoder_init(&dev_priv->drm, &encoder->base, &gen11_dsi_encoder_funcs,
19391967
DRM_MODE_ENCODER_DSI, "DSI %c", port_name(port));
@@ -1957,6 +1985,7 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
19571985
encoder->get_power_domains = gen11_dsi_get_power_domains;
19581986
encoder->disable_clock = gen11_dsi_gate_clocks;
19591987
encoder->is_clock_enabled = gen11_dsi_is_clock_enabled;
1988+
encoder->shutdown = intel_dsi_shutdown;
19601989

19611990
/* register DSI connector with DRM subsystem */
19621991
drm_connector_init(&dev_priv->drm, connector, &gen11_dsi_connector_funcs,
@@ -1968,7 +1997,8 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
19681997
/* attach connector to encoder */
19691998
intel_connector_attach_encoder(intel_connector, encoder);
19701999

1971-
encoder->devdata = intel_bios_encoder_data_lookup(dev_priv, port);
2000+
intel_dsi->panel_power_off_time = ktime_get_boottime();
2001+
19722002
intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata, NULL);
19732003

19742004
mutex_lock(&dev_priv->drm.mode_config.mutex);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
#define __ICL_DSI_H__
88

99
struct drm_i915_private;
10+
struct intel_bios_encoder_data;
1011
struct intel_crtc_state;
1112

12-
void icl_dsi_init(struct drm_i915_private *i915);
13+
void icl_dsi_init(struct drm_i915_private *dev_priv,
14+
const struct intel_bios_encoder_data *devdata);
1315
void icl_dsi_frame_update(struct intel_crtc_state *crtc_state);
1416

1517
#endif /* __ICL_DSI_H__ */

0 commit comments

Comments
 (0)