File Index
Files and directories
Sign in
FILE

intel_de.h

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/i915/display/intel_de.h C
  1/* SPDX-License-Identifier: MIT */
  2/*
  3 * Copyright © 2019 Intel Corporation
  4 */
  5
  6#ifndef __INTEL_DE_H__
  7#define __INTEL_DE_H__
  8
  9#include "intel_display_core.h"
 10#include "intel_dmc_wl.h"
 11#include "intel_dsb.h"
 12#include "intel_uncore.h"
 13#include "intel_uncore_trace.h"
 14
 15static inline struct intel_uncore *__to_uncore(struct intel_display *display)
 16{
 17	return to_intel_uncore(display->drm);
 18}
 19
 20static inline u32
 21intel_de_read(struct intel_display *display, i915_reg_t reg)
 22{
 23	u32 val;
 24
 25	intel_dmc_wl_get(display, reg);
 26
 27	val = intel_uncore_read(__to_uncore(display), reg);
 28
 29	intel_dmc_wl_put(display, reg);
 30
 31	return val;
 32}
 33
 34static inline u8
 35intel_de_read8(struct intel_display *display, i915_reg_t reg)
 36{
 37	u8 val;
 38
 39	intel_dmc_wl_get(display, reg);
 40
 41	val = intel_uncore_read8(__to_uncore(display), reg);
 42
 43	intel_dmc_wl_put(display, reg);
 44
 45	return val;
 46}
 47
 48static inline u64
 49intel_de_read64_2x32(struct intel_display *display,
 50		     i915_reg_t lower_reg, i915_reg_t upper_reg)
 51{
 52	u64 val;
 53
 54	intel_dmc_wl_get(display, lower_reg);
 55	intel_dmc_wl_get(display, upper_reg);
 56
 57	val = intel_uncore_read64_2x32(__to_uncore(display), lower_reg,
 58				       upper_reg);
 59
 60	intel_dmc_wl_put(display, upper_reg);
 61	intel_dmc_wl_put(display, lower_reg);
 62
 63	return val;
 64}
 65
 66static inline void
 67intel_de_posting_read(struct intel_display *display, i915_reg_t reg)
 68{
 69	intel_dmc_wl_get(display, reg);
 70
 71	intel_uncore_posting_read(__to_uncore(display), reg);
 72
 73	intel_dmc_wl_put(display, reg);
 74}
 75
 76static inline void
 77intel_de_write(struct intel_display *display, i915_reg_t reg, u32 val)
 78{
 79	intel_dmc_wl_get(display, reg);
 80
 81	intel_uncore_write(__to_uncore(display), reg, val);
 82
 83	intel_dmc_wl_put(display, reg);
 84}
 85
 86static inline u32
 87intel_de_rmw(struct intel_display *display, i915_reg_t reg, u32 clear, u32 set)
 88{
 89	u32 val;
 90
 91	intel_dmc_wl_get(display, reg);
 92
 93	val = intel_uncore_rmw(__to_uncore(display), reg, clear, set);
 94
 95	intel_dmc_wl_put(display, reg);
 96
 97	return val;
 98}
 99
100static inline int
101intel_de_wait_us(struct intel_display *display, i915_reg_t reg,
102		 u32 mask, u32 value, unsigned int timeout_us,
103		 u32 *out_value)
104{
105	int ret;
106
107	intel_dmc_wl_get(display, reg);
108
109	ret = __intel_wait_for_register(__to_uncore(display), reg, mask,
110					value, timeout_us, 0, out_value);
111
112	intel_dmc_wl_put(display, reg);
113
114	return ret;
115}
116
117static inline int
118intel_de_wait_ms(struct intel_display *display, i915_reg_t reg,
119		 u32 mask, u32 value, unsigned int timeout_ms,
120		 u32 *out_value)
121{
122	int ret;
123
124	intel_dmc_wl_get(display, reg);
125
126	ret = __intel_wait_for_register(__to_uncore(display), reg, mask,
127					value, 2, timeout_ms, out_value);
128
129	intel_dmc_wl_put(display, reg);
130
131	return ret;
132}
133
134static inline int
135intel_de_wait_fw_ms(struct intel_display *display, i915_reg_t reg,
136		    u32 mask, u32 value, unsigned int timeout_ms,
137		    u32 *out_value)
138{
139	return __intel_wait_for_register_fw(__to_uncore(display), reg, mask,
140					    value, 2, timeout_ms, out_value);
141}
142
143static inline int
144intel_de_wait_fw_us_atomic(struct intel_display *display, i915_reg_t reg,
145			   u32 mask, u32 value, unsigned int timeout_us,
146			   u32 *out_value)
147{
148	return __intel_wait_for_register_fw(__to_uncore(display), reg, mask,
149					    value, timeout_us, 0, out_value);
150}
151
152static inline int
153intel_de_wait_for_set_us(struct intel_display *display, i915_reg_t reg,
154			 u32 mask, unsigned int timeout_us)
155{
156	return intel_de_wait_us(display, reg, mask, mask, timeout_us, NULL);
157}
158
159static inline int
160intel_de_wait_for_clear_us(struct intel_display *display, i915_reg_t reg,
161			   u32 mask, unsigned int timeout_us)
162{
163	return intel_de_wait_us(display, reg, mask, 0, timeout_us, NULL);
164}
165
166static inline int
167intel_de_wait_for_set_ms(struct intel_display *display, i915_reg_t reg,
168			 u32 mask, unsigned int timeout_ms)
169{
170	return intel_de_wait_ms(display, reg, mask, mask, timeout_ms, NULL);
171}
172
173static inline int
174intel_de_wait_for_clear_ms(struct intel_display *display, i915_reg_t reg,
175			   u32 mask, unsigned int timeout_ms)
176{
177	return intel_de_wait_ms(display, reg, mask, 0, timeout_ms, NULL);
178}
179
180/*
181 * Unlocked mmio-accessors, think carefully before using these.
182 *
183 * Certain architectures will die if the same cacheline is concurrently accessed
184 * by different clients (e.g. on Ivybridge). Access to registers should
185 * therefore generally be serialised, by either the dev_priv->uncore.lock or
186 * a more localised lock guarding all access to that bank of registers.
187 */
188static inline u32
189intel_de_read_fw(struct intel_display *display, i915_reg_t reg)
190{
191	u32 val;
192
193	val = intel_uncore_read_fw(__to_uncore(display), reg);
194	trace_i915_reg_rw(false, reg, val, sizeof(val), true);
195
196	return val;
197}
198
199static inline void
200intel_de_write_fw(struct intel_display *display, i915_reg_t reg, u32 val)
201{
202	trace_i915_reg_rw(true, reg, val, sizeof(val), true);
203	intel_uncore_write_fw(__to_uncore(display), reg, val);
204}
205
206static inline u32
207intel_de_rmw_fw(struct intel_display *display, i915_reg_t reg, u32 clear, u32 set)
208{
209	u32 old, val;
210
211	old = intel_de_read_fw(display, reg);
212	val = (old & ~clear) | set;
213	intel_de_write_fw(display, reg, val);
214
215	return old;
216}
217
218static inline u32
219intel_de_read_notrace(struct intel_display *display, i915_reg_t reg)
220{
221	return intel_uncore_read_notrace(__to_uncore(display), reg);
222}
223
224static inline void
225intel_de_write_notrace(struct intel_display *display, i915_reg_t reg, u32 val)
226{
227	intel_uncore_write_notrace(__to_uncore(display), reg, val);
228}
229
230static __always_inline void
231intel_de_write_dsb(struct intel_display *display, struct intel_dsb *dsb,
232		   i915_reg_t reg, u32 val)
233{
234	if (dsb)
235		intel_dsb_reg_write(dsb, reg, val);
236	else
237		intel_de_write_fw(display, reg, val);
238}
239
240#endif /* __INTEL_DE_H__ */
~/ Read-only file preview.