Skip to content

Commit 2889903

Browse files
committed
Merge tag 'drm-intel-next-2026-03-30' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-next
drm/i915 feature pull #2 for v7.1: Refactoring and cleanups: - Refactor LT PHY PLL handling to use the DPLL framework (Mika) - Implement display register polling and waits in display code (Ville) - Move PCH clock gating in display PCH file (Luca) - Add shared stepping info header for i915 and display (Jani) - Clean up GVT I2C command decoding (Jonathan) - NV12 plane unlinking cleanups (Ville) - Clean up NV12 DDB/watermark handling for pre-ICL platforms (Ville) Fixes: - An assortment of DSI fixes (Ville) - Handle PORT_NONE in assert_port_valid() (Jonathan) - Fix link failure without FBDEV emulation (Arnd Bergmann) - Quirk disable panel replay on certain Dell XPS models (Jouni) - Check if VESA DPCD AUX backlight is possible (Suraj) Other: - Mailmap update for Christoph (Christoph) Signed-off-by: Dave Airlie <airlied@redhat.com> # Conflicts: # drivers/gpu/drm/i915/display/intel_plane.c From: Jani Nikula <jani.nikula@intel.com> Link: https://patch.msgid.link/ac9dfdb745d5a67c519ea150a6f36f8f74b8760e@intel.com
2 parents f6225b5 + e012fa3 commit 2889903

42 files changed

Lines changed: 1006 additions & 670 deletions

Some content is hidden

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

.mailmap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ Christophe Leroy <chleroy@kernel.org> <christophe.leroy2@cs-soprasteria.com>
196196
Christophe Ricard <christophe.ricard@gmail.com>
197197
Christopher Obbard <christopher.obbard@linaro.org> <chris.obbard@collabora.com>
198198
Christoph Hellwig <hch@lst.de>
199+
Christoph Manszewski <c.manszewski@gmail.com> <christoph.manszewski@intel.com>
199200
Chuck Lever <chuck.lever@oracle.com> <cel@kernel.org>
200201
Chuck Lever <chuck.lever@oracle.com> <cel@netapp.com>
201202
Chuck Lever <chuck.lever@oracle.com> <cel@citi.umich.edu>

drivers/gpu/drm/i915/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ i915-y += \
254254
display/intel_crtc_state_dump.o \
255255
display/intel_cursor.o \
256256
display/intel_dbuf_bw.o \
257+
display/intel_de.o \
257258
display/intel_display.o \
258259
display/intel_display_conversion.o \
259260
display/intel_display_driver.o \

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,7 @@ gen11_dsi_configure_transcoder(struct intel_encoder *encoder,
711711
dsi_trans = dsi_port_to_transcoder(port);
712712
tmp = intel_de_read(display, DSI_TRANS_FUNC_CONF(dsi_trans));
713713

714-
if (intel_dsi->eotp_pkt)
714+
if (intel_dsi->eot_pkt)
715715
tmp &= ~EOTP_DISABLED;
716716
else
717717
tmp |= EOTP_DISABLED;
@@ -729,6 +729,12 @@ gen11_dsi_configure_transcoder(struct intel_encoder *encoder,
729729
else
730730
tmp |= CLK_HS_CONTINUOUS;
731731

732+
if (DISPLAY_VER(display) >= 12 &&
733+
intel_dsi->lp_clock_during_lpm)
734+
tmp |= LP_CLK_DURING_LPM;
735+
else
736+
tmp &= ~LP_CLK_DURING_LPM;
737+
732738
/* configure buffer threshold limit to minimum */
733739
tmp &= ~PIX_BUF_THRESHOLD_MASK;
734740
tmp |= PIX_BUF_THRESHOLD_1_4;
@@ -765,10 +771,11 @@ gen11_dsi_configure_transcoder(struct intel_encoder *encoder,
765771
}
766772
}
767773

768-
if (DISPLAY_VER(display) >= 12) {
769-
if (is_vid_mode(intel_dsi))
770-
tmp |= BLANKING_PACKET_ENABLE;
771-
}
774+
if (DISPLAY_VER(display) >= 12 &&
775+
is_vid_mode(intel_dsi) && intel_dsi->blanking_pkt)
776+
tmp |= BLANKING_PACKET_ENABLE;
777+
else
778+
tmp &= ~BLANKING_PACKET_ENABLE;
772779

773780
/* program DSI operation mode */
774781
if (is_vid_mode(intel_dsi)) {
@@ -888,7 +895,7 @@ gen11_dsi_set_transcoder_timings(struct intel_encoder *encoder,
888895
* non-compressed link speeds, and simplifies down to the ratio between
889896
* compressed and non-compressed bpp.
890897
*/
891-
if (crtc_state->dsc.compression_enable) {
898+
if (is_vid_mode(intel_dsi) && crtc_state->dsc.compression_enable) {
892899
mul = fxp_q4_to_int(crtc_state->dsc.compressed_bpp_x16);
893900
div = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
894901
}
@@ -1502,7 +1509,7 @@ static void gen11_dsi_get_timings(struct intel_encoder *encoder,
15021509
struct drm_display_mode *adjusted_mode =
15031510
&pipe_config->hw.adjusted_mode;
15041511

1505-
if (pipe_config->dsc.compressed_bpp_x16) {
1512+
if (is_vid_mode(intel_dsi) && pipe_config->dsc.compressed_bpp_x16) {
15061513
int div = fxp_q4_to_int(pipe_config->dsc.compressed_bpp_x16);
15071514
int mul = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
15081515

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,12 +227,13 @@
227227
#define CLK_ENTER_LP_AFTER_DATA (0x0 << 8)
228228
#define CLK_HS_OR_LP (0x2 << 8)
229229
#define CLK_HS_CONTINUOUS (0x3 << 8)
230+
#define LP_CLK_DURING_LPM (1 << 7) /* tgl+ */
230231
#define LINK_CALIBRATION_MASK (0x3 << 4)
231232
#define LINK_CALIBRATION_SHIFT 4
232233
#define CALIBRATION_DISABLED (0x0 << 4)
233234
#define CALIBRATION_ENABLED_INITIAL_ONLY (0x2 << 4)
234235
#define CALIBRATION_ENABLED_INITIAL_PERIODIC (0x3 << 4)
235-
#define BLANKING_PACKET_ENABLE (1 << 2)
236+
#define BLANKING_PACKET_ENABLE (1 << 2) /* tgl+ */
236237
#define S3D_ORIENTATION_LANDSCAPE (1 << 1)
237238
#define EOTP_DISABLED (1 << 0)
238239

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2180,7 +2180,7 @@ static int intel_c10pll_calc_state(const struct intel_crtc_state *crtc_state,
21802180
return 0;
21812181
}
21822182

2183-
static int readout_enabled_lane_count(struct intel_encoder *encoder)
2183+
int intel_readout_lane_count(struct intel_encoder *encoder, int lane0, int lane1)
21842184
{
21852185
struct intel_display *display = to_intel_display(encoder);
21862186
u8 enabled_tx_lane_count = 0;
@@ -2212,7 +2212,7 @@ static int readout_enabled_lane_count(struct intel_encoder *encoder)
22122212
max_tx_lane_count = round_up(max_tx_lane_count, 2);
22132213

22142214
for (tx_lane = 0; tx_lane < max_tx_lane_count; tx_lane++) {
2215-
u8 phy_lane_mask = tx_lane < 2 ? INTEL_CX0_LANE0 : INTEL_CX0_LANE1;
2215+
u8 phy_lane_mask = tx_lane < 2 ? lane0 : lane1;
22162216
int tx = tx_lane % 2 + 1;
22172217
u8 val;
22182218

@@ -2252,7 +2252,8 @@ static void intel_c10pll_readout_hw_state(struct intel_encoder *encoder,
22522252
*/
22532253
intel_c10_msgbus_access_begin(encoder, lane);
22542254

2255-
cx0pll_state->lane_count = readout_enabled_lane_count(encoder);
2255+
cx0pll_state->lane_count = intel_readout_lane_count(encoder, INTEL_CX0_LANE0,
2256+
INTEL_CX0_LANE1);
22562257

22572258
for (i = 0; i < ARRAY_SIZE(pll_state->pll); i++)
22582259
pll_state->pll[i] = intel_cx0_read(encoder, lane, PHY_C10_VDR_PLL(i));
@@ -2707,7 +2708,8 @@ static void intel_c20pll_readout_hw_state(struct intel_encoder *encoder,
27072708

27082709
wakeref = intel_cx0_phy_transaction_begin(encoder);
27092710

2710-
cx0pll_state->lane_count = readout_enabled_lane_count(encoder);
2711+
cx0pll_state->lane_count = intel_readout_lane_count(encoder, INTEL_CX0_LANE0,
2712+
INTEL_CX0_LANE1);
27112713

27122714
/* 1. Read VDR params and current context selection */
27132715
intel_c20_readout_vdr_params(encoder, &pll_state->vdr, &cntx);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ struct intel_hdmi;
2828
void intel_cx0_clear_response_ready_flag(struct intel_encoder *encoder,
2929
int lane);
3030
bool intel_encoder_is_c10phy(struct intel_encoder *encoder);
31+
int intel_readout_lane_count(struct intel_encoder *encoder, int lane0, int lane1);
3132
void intel_mtl_pll_enable(struct intel_encoder *encoder,
3233
struct intel_dpll *pll,
3334
const struct intel_dpll_hw_state *dpll_hw_state);

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

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4243,21 +4243,6 @@ void intel_ddi_get_clock(struct intel_encoder *encoder,
42434243
&crtc_state->dpll_hw_state);
42444244
}
42454245

4246-
static void xe3plpd_ddi_get_config(struct intel_encoder *encoder,
4247-
struct intel_crtc_state *crtc_state)
4248-
{
4249-
struct intel_display *display = to_intel_display(encoder);
4250-
4251-
intel_lt_phy_pll_readout_hw_state(encoder, crtc_state, &crtc_state->dpll_hw_state.ltpll);
4252-
4253-
if (crtc_state->dpll_hw_state.ltpll.tbt_mode)
4254-
crtc_state->port_clock = intel_mtl_tbt_calc_port_clock(encoder);
4255-
else
4256-
crtc_state->port_clock =
4257-
intel_lt_phy_calc_port_clock(display, &crtc_state->dpll_hw_state.ltpll);
4258-
intel_ddi_get_config(encoder, crtc_state);
4259-
}
4260-
42614246
static bool icl_ddi_tc_pll_is_tbt(const struct intel_dpll *pll)
42624247
{
42634248
return pll->info->id == DPLL_ID_ICL_TBTPLL;
@@ -5298,10 +5283,13 @@ void intel_ddi_init(struct intel_display *display,
52985283
encoder->pipe_mask = ~0;
52995284

53005285
if (HAS_LT_PHY(display)) {
5301-
encoder->enable_clock = intel_xe3plpd_pll_enable;
5302-
encoder->disable_clock = intel_xe3plpd_pll_disable;
5303-
encoder->port_pll_type = intel_mtl_port_pll_type;
5304-
encoder->get_config = xe3plpd_ddi_get_config;
5286+
encoder->enable_clock = intel_mtl_pll_enable_clock;
5287+
encoder->disable_clock = intel_mtl_pll_disable_clock;
5288+
encoder->port_pll_type = icl_ddi_tc_port_pll_type;
5289+
if (intel_encoder_is_tc(encoder))
5290+
encoder->get_config = mtl_ddi_tc_phy_get_config;
5291+
else
5292+
encoder->get_config = mtl_ddi_non_tc_phy_get_config;
53055293
} else if (DISPLAY_VER(display) >= 14) {
53065294
encoder->enable_clock = intel_mtl_pll_enable_clock;
53075295
encoder->disable_clock = intel_mtl_pll_disable_clock;
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
// SPDX-License-Identifier: MIT
2+
/*
3+
* Copyright © 2026 Intel Corporation
4+
*/
5+
6+
#include <linux/delay.h>
7+
8+
#include <drm/drm_print.h>
9+
10+
#include "intel_de.h"
11+
12+
static int __intel_de_wait_for_register(struct intel_display *display,
13+
i915_reg_t reg, u32 mask, u32 value,
14+
unsigned int timeout_us,
15+
u32 (*read)(struct intel_display *display, i915_reg_t reg),
16+
u32 *out_val, bool is_atomic)
17+
{
18+
const ktime_t end = ktime_add_us(ktime_get_raw(), timeout_us);
19+
int wait_max = 1000;
20+
int wait = 10;
21+
u32 reg_value;
22+
int ret;
23+
24+
might_sleep_if(!is_atomic);
25+
26+
if (timeout_us <= 10) {
27+
is_atomic = true;
28+
wait = 1;
29+
}
30+
31+
for (;;) {
32+
bool expired = ktime_after(ktime_get_raw(), end);
33+
34+
/* guarantee the condition is evaluated after timeout expired */
35+
barrier();
36+
37+
reg_value = read(display, reg);
38+
if ((reg_value & mask) == value) {
39+
ret = 0;
40+
break;
41+
}
42+
43+
if (expired) {
44+
ret = -ETIMEDOUT;
45+
break;
46+
}
47+
48+
if (is_atomic)
49+
udelay(wait);
50+
else
51+
usleep_range(wait, wait << 1);
52+
53+
if (wait < wait_max)
54+
wait <<= 1;
55+
}
56+
57+
if (out_val)
58+
*out_val = reg_value;
59+
60+
return ret;
61+
}
62+
63+
static int intel_de_wait_for_register(struct intel_display *display,
64+
i915_reg_t reg, u32 mask, u32 value,
65+
unsigned int fast_timeout_us,
66+
unsigned int slow_timeout_us,
67+
u32 (*read)(struct intel_display *display, i915_reg_t reg),
68+
u32 *out_value, bool is_atomic)
69+
{
70+
int ret = -EINVAL;
71+
72+
if (fast_timeout_us)
73+
ret = __intel_de_wait_for_register(display, reg, mask, value,
74+
fast_timeout_us, read,
75+
out_value, is_atomic);
76+
77+
if (ret && slow_timeout_us)
78+
ret = __intel_de_wait_for_register(display, reg, mask, value,
79+
slow_timeout_us, read,
80+
out_value, is_atomic);
81+
82+
return ret;
83+
}
84+
85+
int intel_de_wait_us(struct intel_display *display, i915_reg_t reg,
86+
u32 mask, u32 value, unsigned int timeout_us,
87+
u32 *out_value)
88+
{
89+
int ret;
90+
91+
intel_dmc_wl_get(display, reg);
92+
93+
ret = intel_de_wait_for_register(display, reg, mask, value,
94+
timeout_us, 0,
95+
intel_de_read,
96+
out_value, false);
97+
98+
intel_dmc_wl_put(display, reg);
99+
100+
return ret;
101+
}
102+
103+
int intel_de_wait_ms(struct intel_display *display, i915_reg_t reg,
104+
u32 mask, u32 value, unsigned int timeout_ms,
105+
u32 *out_value)
106+
{
107+
int ret;
108+
109+
intel_dmc_wl_get(display, reg);
110+
111+
ret = intel_de_wait_for_register(display, reg, mask, value,
112+
2, timeout_ms * 1000,
113+
intel_de_read,
114+
out_value, false);
115+
116+
intel_dmc_wl_put(display, reg);
117+
118+
return ret;
119+
}
120+
121+
int intel_de_wait_fw_ms(struct intel_display *display, i915_reg_t reg,
122+
u32 mask, u32 value, unsigned int timeout_ms,
123+
u32 *out_value)
124+
{
125+
return intel_de_wait_for_register(display, reg, mask, value,
126+
2, timeout_ms * 1000,
127+
intel_de_read_fw,
128+
out_value, false);
129+
}
130+
131+
int intel_de_wait_fw_us_atomic(struct intel_display *display, i915_reg_t reg,
132+
u32 mask, u32 value, unsigned int timeout_us,
133+
u32 *out_value)
134+
{
135+
return intel_de_wait_for_register(display, reg, mask, value,
136+
timeout_us, 0,
137+
intel_de_read_fw,
138+
out_value, true);
139+
}
140+
141+
int intel_de_wait_for_set_us(struct intel_display *display, i915_reg_t reg,
142+
u32 mask, unsigned int timeout_us)
143+
{
144+
return intel_de_wait_us(display, reg, mask, mask, timeout_us, NULL);
145+
}
146+
147+
int intel_de_wait_for_clear_us(struct intel_display *display, i915_reg_t reg,
148+
u32 mask, unsigned int timeout_us)
149+
{
150+
return intel_de_wait_us(display, reg, mask, 0, timeout_us, NULL);
151+
}
152+
153+
int intel_de_wait_for_set_ms(struct intel_display *display, i915_reg_t reg,
154+
u32 mask, unsigned int timeout_ms)
155+
{
156+
return intel_de_wait_ms(display, reg, mask, mask, timeout_ms, NULL);
157+
}
158+
159+
int intel_de_wait_for_clear_ms(struct intel_display *display, i915_reg_t reg,
160+
u32 mask, unsigned int timeout_ms)
161+
{
162+
return intel_de_wait_ms(display, reg, mask, 0, timeout_ms, NULL);
163+
}
164+
165+
u8 intel_de_read8(struct intel_display *display, i915_reg_t reg)
166+
{
167+
/* this is only used on VGA registers (possible on pre-g4x) */
168+
drm_WARN_ON(display->drm, DISPLAY_VER(display) >= 5 || display->platform.g4x);
169+
170+
return intel_uncore_read8(__to_uncore(display), reg);
171+
}
172+
173+
void intel_de_write8(struct intel_display *display, i915_reg_t reg, u8 val)
174+
{
175+
drm_WARN_ON(display->drm, DISPLAY_VER(display) >= 5 || display->platform.g4x);
176+
177+
intel_uncore_write8(__to_uncore(display), reg, val);
178+
}

0 commit comments

Comments
 (0)