Skip to content

Commit 765425f

Browse files
lucacoelhojnikula
authored andcommitted
drm/i915/display: add support for DMC wakelocks
In order to reduce the DC5->DC2 restore time, wakelocks have been introduced in DMC so the driver can tell it when registers and other memory areas are going to be accessed and keep their respective blocks awake. Implement this in the driver by adding the concept of DMC wakelocks. When the driver needs to access memory which lies inside pre-defined ranges, it will tell DMC to set the wakelock, access the memory, then wait for a while and clear the wakelock. The wakelock state is protected in the driver with spinlocks to prevent concurrency issues. BSpec: 71583 Signed-off-by: Luca Coelho <[email protected]> Reviewed-by: Uma Shankar <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Jani Nikula <[email protected]>
1 parent 578ff98 commit 765425f

File tree

8 files changed

+373
-8
lines changed

8 files changed

+373
-8
lines changed

Documentation/gpu/i915.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,15 @@ DMC Firmware Support
204204
.. kernel-doc:: drivers/gpu/drm/i915/display/intel_dmc.c
205205
:internal:
206206

207+
DMC wakelock support
208+
--------------------
209+
210+
.. kernel-doc:: drivers/gpu/drm/i915/display/intel_dmc_wl.c
211+
:doc: DMC wakelock support
212+
213+
.. kernel-doc:: drivers/gpu/drm/i915/display/intel_dmc_wl.c
214+
:internal:
215+
207216
Video BIOS Table (VBT)
208217
----------------------
209218

drivers/gpu/drm/i915/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ i915-y += \
265265
display/intel_display_rps.o \
266266
display/intel_display_wa.o \
267267
display/intel_dmc.o \
268+
display/intel_dmc_wl.o \
268269
display/intel_dpio_phy.o \
269270
display/intel_dpll.o \
270271
display/intel_dpll_mgr.o \

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

Lines changed: 89 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,52 +13,125 @@
1313
static inline u32
1414
intel_de_read(struct drm_i915_private *i915, i915_reg_t reg)
1515
{
16-
return intel_uncore_read(&i915->uncore, reg);
16+
u32 val;
17+
18+
intel_dmc_wl_get(i915, reg);
19+
20+
val = intel_uncore_read(&i915->uncore, reg);
21+
22+
intel_dmc_wl_put(i915, reg);
23+
24+
return val;
1725
}
1826

1927
static inline u8
2028
intel_de_read8(struct drm_i915_private *i915, i915_reg_t reg)
2129
{
22-
return intel_uncore_read8(&i915->uncore, reg);
30+
u8 val;
31+
32+
intel_dmc_wl_get(i915, reg);
33+
34+
val = intel_uncore_read8(&i915->uncore, reg);
35+
36+
intel_dmc_wl_put(i915, reg);
37+
38+
return val;
2339
}
2440

2541
static inline u64
2642
intel_de_read64_2x32(struct drm_i915_private *i915,
2743
i915_reg_t lower_reg, i915_reg_t upper_reg)
2844
{
29-
return intel_uncore_read64_2x32(&i915->uncore, lower_reg, upper_reg);
45+
u64 val;
46+
47+
intel_dmc_wl_get(i915, lower_reg);
48+
intel_dmc_wl_get(i915, upper_reg);
49+
50+
val = intel_uncore_read64_2x32(&i915->uncore, lower_reg, upper_reg);
51+
52+
intel_dmc_wl_put(i915, upper_reg);
53+
intel_dmc_wl_put(i915, lower_reg);
54+
55+
return val;
3056
}
3157

3258
static inline void
3359
intel_de_posting_read(struct drm_i915_private *i915, i915_reg_t reg)
3460
{
61+
intel_dmc_wl_get(i915, reg);
62+
3563
intel_uncore_posting_read(&i915->uncore, reg);
64+
65+
intel_dmc_wl_put(i915, reg);
3666
}
3767

3868
static inline void
3969
intel_de_write(struct drm_i915_private *i915, i915_reg_t reg, u32 val)
4070
{
71+
intel_dmc_wl_get(i915, reg);
72+
4173
intel_uncore_write(&i915->uncore, reg, val);
74+
75+
intel_dmc_wl_put(i915, reg);
4276
}
4377

4478
static inline u32
45-
intel_de_rmw(struct drm_i915_private *i915, i915_reg_t reg, u32 clear, u32 set)
79+
__intel_de_rmw_nowl(struct drm_i915_private *i915, i915_reg_t reg,
80+
u32 clear, u32 set)
4681
{
4782
return intel_uncore_rmw(&i915->uncore, reg, clear, set);
4883
}
4984

85+
static inline u32
86+
intel_de_rmw(struct drm_i915_private *i915, i915_reg_t reg, u32 clear, u32 set)
87+
{
88+
u32 val;
89+
90+
intel_dmc_wl_get(i915, reg);
91+
92+
val = __intel_de_rmw_nowl(i915, reg, clear, set);
93+
94+
intel_dmc_wl_put(i915, reg);
95+
96+
return val;
97+
}
98+
99+
static inline int
100+
__intel_wait_for_register_nowl(struct drm_i915_private *i915, i915_reg_t reg,
101+
u32 mask, u32 value, unsigned int timeout)
102+
{
103+
return intel_wait_for_register(&i915->uncore, reg, mask,
104+
value, timeout);
105+
}
106+
50107
static inline int
51108
intel_de_wait(struct drm_i915_private *i915, i915_reg_t reg,
52109
u32 mask, u32 value, unsigned int timeout)
53110
{
54-
return intel_wait_for_register(&i915->uncore, reg, mask, value, timeout);
111+
int ret;
112+
113+
intel_dmc_wl_get(i915, reg);
114+
115+
ret = __intel_wait_for_register_nowl(i915, reg, mask, value, timeout);
116+
117+
intel_dmc_wl_put(i915, reg);
118+
119+
return ret;
55120
}
56121

57122
static inline int
58123
intel_de_wait_fw(struct drm_i915_private *i915, i915_reg_t reg,
59124
u32 mask, u32 value, unsigned int timeout)
60125
{
61-
return intel_wait_for_register_fw(&i915->uncore, reg, mask, value, timeout);
126+
int ret;
127+
128+
intel_dmc_wl_get(i915, reg);
129+
130+
ret = intel_wait_for_register_fw(&i915->uncore, reg, mask, value, timeout);
131+
132+
intel_dmc_wl_put(i915, reg);
133+
134+
return ret;
62135
}
63136

64137
static inline int
@@ -67,8 +140,16 @@ intel_de_wait_custom(struct drm_i915_private *i915, i915_reg_t reg,
67140
unsigned int fast_timeout_us,
68141
unsigned int slow_timeout_ms, u32 *out_value)
69142
{
70-
return __intel_wait_for_register(&i915->uncore, reg, mask, value,
71-
fast_timeout_us, slow_timeout_ms, out_value);
143+
int ret;
144+
145+
intel_dmc_wl_get(i915, reg);
146+
147+
ret = __intel_wait_for_register(&i915->uncore, reg, mask, value,
148+
fast_timeout_us, slow_timeout_ms, out_value);
149+
150+
intel_dmc_wl_put(i915, reg);
151+
152+
return ret;
72153
}
73154

74155
static inline int

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "intel_global_state.h"
2727
#include "intel_gmbus.h"
2828
#include "intel_opregion.h"
29+
#include "intel_dmc_wl.h"
2930
#include "intel_wm_types.h"
3031

3132
struct task_struct;
@@ -546,6 +547,7 @@ struct intel_display {
546547
struct intel_overlay *overlay;
547548
struct intel_display_params params;
548549
struct intel_vbt_data vbt;
550+
struct intel_dmc_wl wl;
549551
struct intel_wm wm;
550552
};
551553

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,10 @@
9797
#define TGL_DMC_DEBUG3 _MMIO(0x101090)
9898
#define DG1_DMC_DEBUG3 _MMIO(0x13415c)
9999

100+
#define DMC_WAKELOCK_CFG _MMIO(0x8F1B0)
101+
#define DMC_WAKELOCK_CFG_ENABLE REG_BIT(31)
102+
#define DMC_WAKELOCK1_CTL _MMIO(0x8F140)
103+
#define DMC_WAKELOCK_CTL_REQ REG_BIT(31)
104+
#define DMC_WAKELOCK_CTL_ACK REG_BIT(15)
105+
100106
#endif /* __INTEL_DMC_REGS_H__ */

0 commit comments

Comments
 (0)