Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  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 "i915_drv.h"
 10#include "i915_trace.h"
 11#include "intel_dsb.h"
 12#include "intel_uncore.h"
 13
 14static inline struct intel_uncore *__to_uncore(struct intel_display *display)
 15{
 16	return &to_i915(display->drm)->uncore;
 17}
 18
 19static inline u32
 20__intel_de_read(struct intel_display *display, i915_reg_t reg)
 21{
 22	u32 val;
 23
 24	intel_dmc_wl_get(display, reg);
 25
 26	val = intel_uncore_read(__to_uncore(display), reg);
 27
 28	intel_dmc_wl_put(display, reg);
 29
 30	return val;
 31}
 32#define intel_de_read(p,...) __intel_de_read(__to_intel_display(p), __VA_ARGS__)
 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
 67__intel_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#define intel_de_posting_read(p,...) __intel_de_posting_read(__to_intel_display(p), __VA_ARGS__)
 76
 77static inline void
 78__intel_de_write(struct intel_display *display, i915_reg_t reg, u32 val)
 79{
 80	intel_dmc_wl_get(display, reg);
 81
 82	intel_uncore_write(__to_uncore(display), reg, val);
 83
 84	intel_dmc_wl_put(display, reg);
 85}
 86#define intel_de_write(p,...) __intel_de_write(__to_intel_display(p), __VA_ARGS__)
 87
 88static inline u32
 89__intel_de_rmw_nowl(struct intel_display *display, i915_reg_t reg,
 90		    u32 clear, u32 set)
 91{
 92	return intel_uncore_rmw(__to_uncore(display), reg, clear, set);
 93}
 94
 95static inline u32
 96__intel_de_rmw(struct intel_display *display, i915_reg_t reg, u32 clear,
 97	       u32 set)
 98{
 99	u32 val;
100
101	intel_dmc_wl_get(display, reg);
102
103	val = __intel_de_rmw_nowl(display, reg, clear, set);
104
105	intel_dmc_wl_put(display, reg);
106
107	return val;
108}
109#define intel_de_rmw(p,...) __intel_de_rmw(__to_intel_display(p), __VA_ARGS__)
110
111static inline int
112__intel_de_wait_for_register_nowl(struct intel_display *display,
113				  i915_reg_t reg,
114				  u32 mask, u32 value, unsigned int timeout)
115{
116	return intel_wait_for_register(__to_uncore(display), reg, mask,
117				       value, timeout);
118}
119
120static inline int
121intel_de_wait(struct intel_display *display, i915_reg_t reg,
122	      u32 mask, u32 value, unsigned int timeout)
123{
124	int ret;
125
126	intel_dmc_wl_get(display, reg);
127
128	ret = __intel_de_wait_for_register_nowl(display, reg, mask, value,
129						timeout);
130
131	intel_dmc_wl_put(display, reg);
132
133	return ret;
134}
135
136static inline int
137intel_de_wait_fw(struct intel_display *display, i915_reg_t reg,
138		 u32 mask, u32 value, unsigned int timeout)
139{
140	int ret;
141
142	intel_dmc_wl_get(display, reg);
143
144	ret = intel_wait_for_register_fw(__to_uncore(display), reg, mask,
145					 value, timeout);
146
147	intel_dmc_wl_put(display, reg);
148
149	return ret;
150}
151
152static inline int
153intel_de_wait_custom(struct intel_display *display, i915_reg_t reg,
154		     u32 mask, u32 value,
155		     unsigned int fast_timeout_us,
156		     unsigned int slow_timeout_ms, u32 *out_value)
157{
158	int ret;
159
160	intel_dmc_wl_get(display, reg);
161
162	ret = __intel_wait_for_register(__to_uncore(display), reg, mask,
163					value,
164					fast_timeout_us, slow_timeout_ms, out_value);
165
166	intel_dmc_wl_put(display, reg);
167
168	return ret;
169}
170
171static inline int
172__intel_de_wait_for_set(struct intel_display *display, i915_reg_t reg,
173			u32 mask, unsigned int timeout)
174{
175	return intel_de_wait(display, reg, mask, mask, timeout);
176}
177#define intel_de_wait_for_set(p,...) __intel_de_wait_for_set(__to_intel_display(p), __VA_ARGS__)
178
179static inline int
180__intel_de_wait_for_clear(struct intel_display *display, i915_reg_t reg,
181			  u32 mask, unsigned int timeout)
182{
183	return intel_de_wait(display, reg, mask, 0, timeout);
184}
185#define intel_de_wait_for_clear(p,...) __intel_de_wait_for_clear(__to_intel_display(p), __VA_ARGS__)
186
187/*
188 * Unlocked mmio-accessors, think carefully before using these.
189 *
190 * Certain architectures will die if the same cacheline is concurrently accessed
191 * by different clients (e.g. on Ivybridge). Access to registers should
192 * therefore generally be serialised, by either the dev_priv->uncore.lock or
193 * a more localised lock guarding all access to that bank of registers.
194 */
195static inline u32
196__intel_de_read_fw(struct intel_display *display, i915_reg_t reg)
197{
198	u32 val;
199
200	val = intel_uncore_read_fw(__to_uncore(display), reg);
201	trace_i915_reg_rw(false, reg, val, sizeof(val), true);
202
203	return val;
204}
205#define intel_de_read_fw(p,...) __intel_de_read_fw(__to_intel_display(p), __VA_ARGS__)
206
207static inline void
208__intel_de_write_fw(struct intel_display *display, i915_reg_t reg, u32 val)
209{
210	trace_i915_reg_rw(true, reg, val, sizeof(val), true);
211	intel_uncore_write_fw(__to_uncore(display), reg, val);
212}
213#define intel_de_write_fw(p,...) __intel_de_write_fw(__to_intel_display(p), __VA_ARGS__)
214
215static inline u32
216intel_de_read_notrace(struct intel_display *display, i915_reg_t reg)
217{
218	return intel_uncore_read_notrace(__to_uncore(display), reg);
219}
220
221static inline void
222intel_de_write_notrace(struct intel_display *display, i915_reg_t reg, u32 val)
223{
224	intel_uncore_write_notrace(__to_uncore(display), reg, val);
225}
226
227static __always_inline void
228intel_de_write_dsb(struct intel_display *display, struct intel_dsb *dsb,
229		   i915_reg_t reg, u32 val)
230{
231	if (dsb)
232		intel_dsb_reg_write(dsb, reg, val);
233	else
234		intel_de_write_fw(display, reg, val);
235}
236
237#endif /* __INTEL_DE_H__ */