19c757aeaSJani Nikula /* SPDX-License-Identifier: MIT */
29c757aeaSJani Nikula /*
39c757aeaSJani Nikula  * Copyright © 2019 Intel Corporation
49c757aeaSJani Nikula  */
59c757aeaSJani Nikula 
69c757aeaSJani Nikula #ifndef __INTEL_DE_H__
79c757aeaSJani Nikula #define __INTEL_DE_H__
89c757aeaSJani Nikula 
99c757aeaSJani Nikula #include "i915_drv.h"
10fcf83a21SVille Syrjälä #include "i915_trace.h"
119c757aeaSJani Nikula #include "intel_uncore.h"
129c757aeaSJani Nikula 
139c757aeaSJani Nikula static inline u32
intel_de_read(struct drm_i915_private * i915,i915_reg_t reg)149c757aeaSJani Nikula intel_de_read(struct drm_i915_private *i915, i915_reg_t reg)
159c757aeaSJani Nikula {
169c757aeaSJani Nikula 	return intel_uncore_read(&i915->uncore, reg);
179c757aeaSJani Nikula }
189c757aeaSJani Nikula 
1993b3c44dSMaarten Lankhorst static inline u8
intel_de_read8(struct drm_i915_private * i915,i915_reg_t reg)2093b3c44dSMaarten Lankhorst intel_de_read8(struct drm_i915_private *i915, i915_reg_t reg)
2193b3c44dSMaarten Lankhorst {
2293b3c44dSMaarten Lankhorst 	return intel_uncore_read8(&i915->uncore, reg);
2393b3c44dSMaarten Lankhorst }
2493b3c44dSMaarten Lankhorst 
25*1af13bc6SJani Nikula static inline u64
intel_de_read64_2x32(struct drm_i915_private * i915,i915_reg_t lower_reg,i915_reg_t upper_reg)26*1af13bc6SJani Nikula intel_de_read64_2x32(struct drm_i915_private *i915,
27*1af13bc6SJani Nikula 		     i915_reg_t lower_reg, i915_reg_t upper_reg)
28*1af13bc6SJani Nikula {
29*1af13bc6SJani Nikula 	return intel_uncore_read64_2x32(&i915->uncore, lower_reg, upper_reg);
30*1af13bc6SJani Nikula }
31*1af13bc6SJani Nikula 
329c757aeaSJani Nikula static inline void
intel_de_posting_read(struct drm_i915_private * i915,i915_reg_t reg)339c757aeaSJani Nikula intel_de_posting_read(struct drm_i915_private *i915, i915_reg_t reg)
349c757aeaSJani Nikula {
359c757aeaSJani Nikula 	intel_uncore_posting_read(&i915->uncore, reg);
369c757aeaSJani Nikula }
379c757aeaSJani Nikula 
389c757aeaSJani Nikula static inline void
intel_de_write(struct drm_i915_private * i915,i915_reg_t reg,u32 val)399c757aeaSJani Nikula intel_de_write(struct drm_i915_private *i915, i915_reg_t reg, u32 val)
409c757aeaSJani Nikula {
419c757aeaSJani Nikula 	intel_uncore_write(&i915->uncore, reg, val);
429c757aeaSJani Nikula }
439c757aeaSJani Nikula 
444fa9fc42SJani Nikula static inline u32
intel_de_rmw(struct drm_i915_private * i915,i915_reg_t reg,u32 clear,u32 set)459c757aeaSJani Nikula intel_de_rmw(struct drm_i915_private *i915, i915_reg_t reg, u32 clear, u32 set)
469c757aeaSJani Nikula {
474fa9fc42SJani Nikula 	return intel_uncore_rmw(&i915->uncore, reg, clear, set);
489c757aeaSJani Nikula }
499c757aeaSJani Nikula 
509c757aeaSJani Nikula static inline int
intel_de_wait_for_register(struct drm_i915_private * i915,i915_reg_t reg,u32 mask,u32 value,unsigned int timeout)519c757aeaSJani Nikula intel_de_wait_for_register(struct drm_i915_private *i915, i915_reg_t reg,
529c757aeaSJani Nikula 			   u32 mask, u32 value, unsigned int timeout)
539c757aeaSJani Nikula {
549c757aeaSJani Nikula 	return intel_wait_for_register(&i915->uncore, reg, mask, value, timeout);
559c757aeaSJani Nikula }
569c757aeaSJani Nikula 
579c757aeaSJani Nikula static inline int
intel_de_wait_for_register_fw(struct drm_i915_private * i915,i915_reg_t reg,u32 mask,u32 value,unsigned int timeout)5893b3c44dSMaarten Lankhorst intel_de_wait_for_register_fw(struct drm_i915_private *i915, i915_reg_t reg,
5993b3c44dSMaarten Lankhorst 			      u32 mask, u32 value, unsigned int timeout)
6093b3c44dSMaarten Lankhorst {
6193b3c44dSMaarten Lankhorst 	return intel_wait_for_register_fw(&i915->uncore, reg, mask, value, timeout);
6293b3c44dSMaarten Lankhorst }
6393b3c44dSMaarten Lankhorst 
6493b3c44dSMaarten Lankhorst static inline int
__intel_de_wait_for_register(struct drm_i915_private * i915,i915_reg_t reg,u32 mask,u32 value,unsigned int fast_timeout_us,unsigned int slow_timeout_ms,u32 * out_value)6593b3c44dSMaarten Lankhorst __intel_de_wait_for_register(struct drm_i915_private *i915, i915_reg_t reg,
6693b3c44dSMaarten Lankhorst 			     u32 mask, u32 value,
6793b3c44dSMaarten Lankhorst 			     unsigned int fast_timeout_us,
6893b3c44dSMaarten Lankhorst 			     unsigned int slow_timeout_ms, u32 *out_value)
6993b3c44dSMaarten Lankhorst {
7093b3c44dSMaarten Lankhorst 	return __intel_wait_for_register(&i915->uncore, reg, mask, value,
7193b3c44dSMaarten Lankhorst 					 fast_timeout_us, slow_timeout_ms, out_value);
7293b3c44dSMaarten Lankhorst }
7393b3c44dSMaarten Lankhorst 
7493b3c44dSMaarten Lankhorst static inline int
intel_de_wait_for_set(struct drm_i915_private * i915,i915_reg_t reg,u32 mask,unsigned int timeout)759c757aeaSJani Nikula intel_de_wait_for_set(struct drm_i915_private *i915, i915_reg_t reg,
769c757aeaSJani Nikula 		      u32 mask, unsigned int timeout)
779c757aeaSJani Nikula {
789c757aeaSJani Nikula 	return intel_de_wait_for_register(i915, reg, mask, mask, timeout);
799c757aeaSJani Nikula }
809c757aeaSJani Nikula 
819c757aeaSJani Nikula static inline int
intel_de_wait_for_clear(struct drm_i915_private * i915,i915_reg_t reg,u32 mask,unsigned int timeout)829c757aeaSJani Nikula intel_de_wait_for_clear(struct drm_i915_private *i915, i915_reg_t reg,
839c757aeaSJani Nikula 			u32 mask, unsigned int timeout)
849c757aeaSJani Nikula {
859c757aeaSJani Nikula 	return intel_de_wait_for_register(i915, reg, mask, 0, timeout);
869c757aeaSJani Nikula }
879c757aeaSJani Nikula 
88fcf83a21SVille Syrjälä /*
89fcf83a21SVille Syrjälä  * Unlocked mmio-accessors, think carefully before using these.
90fcf83a21SVille Syrjälä  *
91fcf83a21SVille Syrjälä  * Certain architectures will die if the same cacheline is concurrently accessed
92fcf83a21SVille Syrjälä  * by different clients (e.g. on Ivybridge). Access to registers should
93fcf83a21SVille Syrjälä  * therefore generally be serialised, by either the dev_priv->uncore.lock or
94fcf83a21SVille Syrjälä  * a more localised lock guarding all access to that bank of registers.
95fcf83a21SVille Syrjälä  */
96fcf83a21SVille Syrjälä static inline u32
intel_de_read_fw(struct drm_i915_private * i915,i915_reg_t reg)97fcf83a21SVille Syrjälä intel_de_read_fw(struct drm_i915_private *i915, i915_reg_t reg)
98fcf83a21SVille Syrjälä {
99fcf83a21SVille Syrjälä 	u32 val;
100fcf83a21SVille Syrjälä 
101fcf83a21SVille Syrjälä 	val = intel_uncore_read_fw(&i915->uncore, reg);
102fcf83a21SVille Syrjälä 	trace_i915_reg_rw(false, reg, val, sizeof(val), true);
103fcf83a21SVille Syrjälä 
104fcf83a21SVille Syrjälä 	return val;
105fcf83a21SVille Syrjälä }
106fcf83a21SVille Syrjälä 
107fcf83a21SVille Syrjälä static inline void
intel_de_write_fw(struct drm_i915_private * i915,i915_reg_t reg,u32 val)108fcf83a21SVille Syrjälä intel_de_write_fw(struct drm_i915_private *i915, i915_reg_t reg, u32 val)
109fcf83a21SVille Syrjälä {
110fcf83a21SVille Syrjälä 	trace_i915_reg_rw(true, reg, val, sizeof(val), true);
111fcf83a21SVille Syrjälä 	intel_uncore_write_fw(&i915->uncore, reg, val);
112fcf83a21SVille Syrjälä }
113fcf83a21SVille Syrjälä 
11493b3c44dSMaarten Lankhorst static inline u32
intel_de_read_notrace(struct drm_i915_private * i915,i915_reg_t reg)11593b3c44dSMaarten Lankhorst intel_de_read_notrace(struct drm_i915_private *i915, i915_reg_t reg)
11693b3c44dSMaarten Lankhorst {
11793b3c44dSMaarten Lankhorst 	return intel_uncore_read_notrace(&i915->uncore, reg);
11893b3c44dSMaarten Lankhorst }
11993b3c44dSMaarten Lankhorst 
12093b3c44dSMaarten Lankhorst static inline void
intel_de_write_notrace(struct drm_i915_private * i915,i915_reg_t reg,u32 val)12193b3c44dSMaarten Lankhorst intel_de_write_notrace(struct drm_i915_private *i915, i915_reg_t reg, u32 val)
12293b3c44dSMaarten Lankhorst {
12393b3c44dSMaarten Lankhorst 	intel_uncore_write_notrace(&i915->uncore, reg, val);
12493b3c44dSMaarten Lankhorst }
12593b3c44dSMaarten Lankhorst 
1269c757aeaSJani Nikula #endif /* __INTEL_DE_H__ */
127