Skip to content

Commit df9d494

Browse files
committed
Merge tag 'drm-intel-next-fixes-2025-06-05' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-next
- Fix PSR register definitions for ALPM - Fix u32 overflow in SNPS PHY HDMI PLL setup - Fix GuC pending message underflow when submit fails - Fix GuC wakeref underflow race during reset Signed-off-by: Dave Airlie <[email protected]> From: Joonas Lahtinen <[email protected]> Link: https://lore.kernel.org/r/aEFW1wGnt1kTVNGF@jlahtine-mobl
2 parents 61a4b7d + 791d760 commit df9d494

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,8 @@
325325
#define PORT_ALPM_LFPS_CTL_LFPS_HALF_CYCLE_DURATION_MASK REG_GENMASK(20, 16)
326326
#define PORT_ALPM_LFPS_CTL_LFPS_HALF_CYCLE_DURATION(val) REG_FIELD_PREP(PORT_ALPM_LFPS_CTL_LFPS_HALF_CYCLE_DURATION_MASK, val)
327327
#define PORT_ALPM_LFPS_CTL_FIRST_LFPS_HALF_CYCLE_DURATION_MASK REG_GENMASK(12, 8)
328-
#define PORT_ALPM_LFPS_CTL_FIRST_LFPS_HALF_CYCLE_DURATION(val) REG_FIELD_PREP(PORT_ALPM_LFPS_CTL_LFPS_HALF_CYCLE_DURATION_MASK, val)
328+
#define PORT_ALPM_LFPS_CTL_FIRST_LFPS_HALF_CYCLE_DURATION(val) REG_FIELD_PREP(PORT_ALPM_LFPS_CTL_FIRST_LFPS_HALF_CYCLE_DURATION_MASK, val)
329329
#define PORT_ALPM_LFPS_CTL_LAST_LFPS_HALF_CYCLE_DURATION_MASK REG_GENMASK(4, 0)
330-
#define PORT_ALPM_LFPS_CTL_LAST_LFPS_HALF_CYCLE_DURATION(val) REG_FIELD_PREP(PORT_ALPM_LFPS_CTL_LFPS_HALF_CYCLE_DURATION_MASK, val)
330+
#define PORT_ALPM_LFPS_CTL_LAST_LFPS_HALF_CYCLE_DURATION(val) REG_FIELD_PREP(PORT_ALPM_LFPS_CTL_LAST_LFPS_HALF_CYCLE_DURATION_MASK, val)
331331

332332
#endif /* __INTEL_PSR_REGS_H__ */

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ static s64 interp(s64 x, s64 x1, s64 x2, s64 y1, s64 y2)
4141
{
4242
s64 dydx;
4343

44-
dydx = DIV_ROUND_UP_ULL((y2 - y1) * 100000, (x2 - x1));
44+
dydx = DIV64_U64_ROUND_UP((y2 - y1) * 100000, (x2 - x1));
4545

46-
return (y1 + DIV_ROUND_UP_ULL(dydx * (x - x1), 100000));
46+
return (y1 + DIV64_U64_ROUND_UP(dydx * (x - x1), 100000));
4747
}
4848

49-
static void get_ana_cp_int_prop(u32 vco_clk,
49+
static void get_ana_cp_int_prop(u64 vco_clk,
5050
u32 refclk_postscalar,
5151
int mpll_ana_v2i,
5252
int c, int a,
@@ -115,16 +115,16 @@ static void get_ana_cp_int_prop(u32 vco_clk,
115115
CURVE0_MULTIPLIER));
116116

117117
scaled_interpolated_sqrt =
118-
int_sqrt(DIV_ROUND_UP_ULL(interpolated_product, vco_div_refclk_float) *
118+
int_sqrt(DIV64_U64_ROUND_UP(interpolated_product, vco_div_refclk_float) *
119119
DIV_ROUND_DOWN_ULL(1000000000000ULL, 55));
120120

121121
/* Scale vco_div_refclk for ana_cp_int */
122122
scaled_vco_div_refclk2 = DIV_ROUND_UP_ULL(vco_div_refclk_float, 1000000);
123-
adjusted_vco_clk2 = 1460281 * DIV_ROUND_UP_ULL(scaled_interpolated_sqrt *
123+
adjusted_vco_clk2 = 1460281 * DIV64_U64_ROUND_UP(scaled_interpolated_sqrt *
124124
scaled_vco_div_refclk2,
125125
curve_1_interpolated);
126126

127-
*ana_cp_prop = DIV_ROUND_UP_ULL(adjusted_vco_clk2, curve_2_scaled2);
127+
*ana_cp_prop = DIV64_U64_ROUND_UP(adjusted_vco_clk2, curve_2_scaled2);
128128
*ana_cp_prop = max(1, min(*ana_cp_prop, 127));
129129
}
130130

@@ -165,10 +165,10 @@ static void compute_hdmi_tmds_pll(u64 pixel_clock, u32 refclk,
165165
/* Select appropriate v2i point */
166166
if (datarate <= INTEL_SNPS_PHY_HDMI_9999MHZ) {
167167
mpll_ana_v2i = 2;
168-
tx_clk_div = ilog2(DIV_ROUND_DOWN_ULL(INTEL_SNPS_PHY_HDMI_9999MHZ, datarate));
168+
tx_clk_div = ilog2(div64_u64(INTEL_SNPS_PHY_HDMI_9999MHZ, datarate));
169169
} else {
170170
mpll_ana_v2i = 3;
171-
tx_clk_div = ilog2(DIV_ROUND_DOWN_ULL(INTEL_SNPS_PHY_HDMI_16GHZ, datarate));
171+
tx_clk_div = ilog2(div64_u64(INTEL_SNPS_PHY_HDMI_16GHZ, datarate));
172172
}
173173
vco_clk = (datarate << tx_clk_div) >> 1;
174174

drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ static int guc_submission_send_busy_loop(struct intel_guc *guc,
633633
atomic_inc(&guc->outstanding_submission_g2h);
634634

635635
ret = intel_guc_send_busy_loop(guc, action, len, g2h_len_dw, loop);
636-
if (ret)
636+
if (ret && g2h_len_dw)
637637
atomic_dec(&guc->outstanding_submission_g2h);
638638

639639
return ret;
@@ -3443,18 +3443,29 @@ static inline int guc_lrc_desc_unpin(struct intel_context *ce)
34433443
* GuC is active, lets destroy this context, but at this point we can still be racing
34443444
* with suspend, so we undo everything if the H2G fails in deregister_context so
34453445
* that GuC reset will find this context during clean up.
3446+
*
3447+
* There is a race condition where the reset code could have altered
3448+
* this context's state and done a wakeref put before we try to
3449+
* deregister it here. So check if the context is still set to be
3450+
* destroyed before undoing earlier changes, to avoid two wakeref puts
3451+
* on the same context.
34463452
*/
34473453
ret = deregister_context(ce, ce->guc_id.id);
34483454
if (ret) {
3455+
bool pending_destroyed;
34493456
spin_lock_irqsave(&ce->guc_state.lock, flags);
3450-
set_context_registered(ce);
3451-
clr_context_destroyed(ce);
3457+
pending_destroyed = context_destroyed(ce);
3458+
if (pending_destroyed) {
3459+
set_context_registered(ce);
3460+
clr_context_destroyed(ce);
3461+
}
34523462
spin_unlock_irqrestore(&ce->guc_state.lock, flags);
34533463
/*
34543464
* As gt-pm is awake at function entry, intel_wakeref_put_async merely decrements
34553465
* the wakeref immediately but per function spec usage call this after unlock.
34563466
*/
3457-
intel_wakeref_put_async(&gt->wakeref);
3467+
if (pending_destroyed)
3468+
intel_wakeref_put_async(&gt->wakeref);
34583469
}
34593470

34603471
return ret;

0 commit comments

Comments
 (0)