1 /* SPDX-License-Identifier: MIT */ 2 /* 3 * Copyright © 2023 Intel Corporation 4 */ 5 6 #ifndef __DRM_DP_TUNNEL_H__ 7 #define __DRM_DP_TUNNEL_H__ 8 9 #include <linux/err.h> 10 #include <linux/errno.h> 11 #include <linux/types.h> 12 13 struct drm_dp_aux; 14 15 struct drm_device; 16 17 struct drm_atomic_state; 18 struct drm_dp_tunnel_mgr; 19 struct drm_dp_tunnel_state; 20 21 struct ref_tracker; 22 23 struct drm_dp_tunnel_ref { 24 struct drm_dp_tunnel *tunnel; 25 struct ref_tracker *tracker; 26 }; 27 28 #ifdef CONFIG_DRM_DISPLAY_DP_TUNNEL 29 30 struct drm_dp_tunnel * 31 drm_dp_tunnel_get(struct drm_dp_tunnel *tunnel, struct ref_tracker **tracker); 32 33 void 34 drm_dp_tunnel_put(struct drm_dp_tunnel *tunnel, struct ref_tracker **tracker); 35 36 static inline void drm_dp_tunnel_ref_get(struct drm_dp_tunnel *tunnel, 37 struct drm_dp_tunnel_ref *tunnel_ref) 38 { 39 tunnel_ref->tunnel = drm_dp_tunnel_get(tunnel, &tunnel_ref->tracker); 40 } 41 42 static inline void drm_dp_tunnel_ref_put(struct drm_dp_tunnel_ref *tunnel_ref) 43 { 44 drm_dp_tunnel_put(tunnel_ref->tunnel, &tunnel_ref->tracker); 45 tunnel_ref->tunnel = NULL; 46 } 47 48 struct drm_dp_tunnel * 49 drm_dp_tunnel_detect(struct drm_dp_tunnel_mgr *mgr, 50 struct drm_dp_aux *aux); 51 int drm_dp_tunnel_destroy(struct drm_dp_tunnel *tunnel); 52 53 int drm_dp_tunnel_enable_bw_alloc(struct drm_dp_tunnel *tunnel); 54 int drm_dp_tunnel_disable_bw_alloc(struct drm_dp_tunnel *tunnel); 55 bool drm_dp_tunnel_bw_alloc_is_enabled(const struct drm_dp_tunnel *tunnel); 56 int drm_dp_tunnel_alloc_bw(struct drm_dp_tunnel *tunnel, int bw); 57 int drm_dp_tunnel_get_allocated_bw(struct drm_dp_tunnel *tunnel); 58 int drm_dp_tunnel_update_state(struct drm_dp_tunnel *tunnel); 59 60 void drm_dp_tunnel_set_io_error(struct drm_dp_tunnel *tunnel); 61 62 int drm_dp_tunnel_handle_irq(struct drm_dp_tunnel_mgr *mgr, 63 struct drm_dp_aux *aux); 64 65 int drm_dp_tunnel_max_dprx_rate(const struct drm_dp_tunnel *tunnel); 66 int drm_dp_tunnel_max_dprx_lane_count(const struct drm_dp_tunnel *tunnel); 67 int drm_dp_tunnel_available_bw(const struct drm_dp_tunnel *tunnel); 68 69 const char *drm_dp_tunnel_name(const struct drm_dp_tunnel *tunnel); 70 71 struct drm_dp_tunnel_state * 72 drm_dp_tunnel_atomic_get_state(struct drm_atomic_state *state, 73 struct drm_dp_tunnel *tunnel); 74 75 struct drm_dp_tunnel_state * 76 drm_dp_tunnel_atomic_get_old_state(struct drm_atomic_state *state, 77 const struct drm_dp_tunnel *tunnel); 78 79 struct drm_dp_tunnel_state * 80 drm_dp_tunnel_atomic_get_new_state(struct drm_atomic_state *state, 81 const struct drm_dp_tunnel *tunnel); 82 83 int drm_dp_tunnel_atomic_set_stream_bw(struct drm_atomic_state *state, 84 struct drm_dp_tunnel *tunnel, 85 u8 stream_id, int bw); 86 int drm_dp_tunnel_atomic_get_group_streams_in_state(struct drm_atomic_state *state, 87 const struct drm_dp_tunnel *tunnel, 88 u32 *stream_mask); 89 90 int drm_dp_tunnel_atomic_check_stream_bws(struct drm_atomic_state *state, 91 u32 *failed_stream_mask); 92 93 int drm_dp_tunnel_atomic_get_required_bw(const struct drm_dp_tunnel_state *tunnel_state); 94 95 struct drm_dp_tunnel_mgr * 96 drm_dp_tunnel_mgr_create(struct drm_device *dev, int max_group_count); 97 void drm_dp_tunnel_mgr_destroy(struct drm_dp_tunnel_mgr *mgr); 98 99 #else 100 101 static inline struct drm_dp_tunnel * 102 drm_dp_tunnel_get(struct drm_dp_tunnel *tunnel, struct ref_tracker **tracker) 103 { 104 return NULL; 105 } 106 107 static inline void 108 drm_dp_tunnel_put(struct drm_dp_tunnel *tunnel, struct ref_tracker **tracker) {} 109 110 static inline void drm_dp_tunnel_ref_get(struct drm_dp_tunnel *tunnel, 111 struct drm_dp_tunnel_ref *tunnel_ref) {} 112 113 static inline void drm_dp_tunnel_ref_put(struct drm_dp_tunnel_ref *tunnel_ref) {} 114 115 static inline struct drm_dp_tunnel * 116 drm_dp_tunnel_detect(struct drm_dp_tunnel_mgr *mgr, 117 struct drm_dp_aux *aux) 118 { 119 return ERR_PTR(-EOPNOTSUPP); 120 } 121 122 static inline int 123 drm_dp_tunnel_destroy(struct drm_dp_tunnel *tunnel) 124 { 125 return 0; 126 } 127 128 static inline int drm_dp_tunnel_enable_bw_alloc(struct drm_dp_tunnel *tunnel) 129 { 130 return -EOPNOTSUPP; 131 } 132 133 static inline int drm_dp_tunnel_disable_bw_alloc(struct drm_dp_tunnel *tunnel) 134 { 135 return -EOPNOTSUPP; 136 } 137 138 static inline bool drm_dp_tunnel_bw_alloc_is_enabled(const struct drm_dp_tunnel *tunnel) 139 { 140 return false; 141 } 142 143 static inline int 144 drm_dp_tunnel_alloc_bw(struct drm_dp_tunnel *tunnel, int bw) 145 { 146 return -EOPNOTSUPP; 147 } 148 149 static inline int 150 drm_dp_tunnel_get_allocated_bw(struct drm_dp_tunnel *tunnel) 151 { 152 return -1; 153 } 154 155 static inline int 156 drm_dp_tunnel_update_state(struct drm_dp_tunnel *tunnel) 157 { 158 return -EOPNOTSUPP; 159 } 160 161 static inline void drm_dp_tunnel_set_io_error(struct drm_dp_tunnel *tunnel) {} 162 163 static inline int 164 drm_dp_tunnel_handle_irq(struct drm_dp_tunnel_mgr *mgr, 165 struct drm_dp_aux *aux) 166 { 167 return -EOPNOTSUPP; 168 } 169 170 static inline int 171 drm_dp_tunnel_max_dprx_rate(const struct drm_dp_tunnel *tunnel) 172 { 173 return 0; 174 } 175 176 static inline int 177 drm_dp_tunnel_max_dprx_lane_count(const struct drm_dp_tunnel *tunnel) 178 { 179 return 0; 180 } 181 182 static inline int 183 drm_dp_tunnel_available_bw(const struct drm_dp_tunnel *tunnel) 184 { 185 return -1; 186 } 187 188 static inline const char * 189 drm_dp_tunnel_name(const struct drm_dp_tunnel *tunnel) 190 { 191 return NULL; 192 } 193 194 static inline struct drm_dp_tunnel_state * 195 drm_dp_tunnel_atomic_get_state(struct drm_atomic_state *state, 196 struct drm_dp_tunnel *tunnel) 197 { 198 return ERR_PTR(-EOPNOTSUPP); 199 } 200 201 static inline struct drm_dp_tunnel_state * 202 drm_dp_tunnel_atomic_get_new_state(struct drm_atomic_state *state, 203 const struct drm_dp_tunnel *tunnel) 204 { 205 return ERR_PTR(-EOPNOTSUPP); 206 } 207 208 static inline int 209 drm_dp_tunnel_atomic_set_stream_bw(struct drm_atomic_state *state, 210 struct drm_dp_tunnel *tunnel, 211 u8 stream_id, int bw) 212 { 213 return -EOPNOTSUPP; 214 } 215 216 static inline int 217 drm_dp_tunnel_atomic_get_group_streams_in_state(struct drm_atomic_state *state, 218 const struct drm_dp_tunnel *tunnel, 219 u32 *stream_mask) 220 { 221 return -EOPNOTSUPP; 222 } 223 224 static inline int 225 drm_dp_tunnel_atomic_check_stream_bws(struct drm_atomic_state *state, 226 u32 *failed_stream_mask) 227 { 228 return -EOPNOTSUPP; 229 } 230 231 static inline int 232 drm_dp_tunnel_atomic_get_required_bw(const struct drm_dp_tunnel_state *tunnel_state) 233 { 234 return 0; 235 } 236 237 static inline struct drm_dp_tunnel_mgr * 238 drm_dp_tunnel_mgr_create(struct drm_device *dev, int max_group_count) 239 { 240 return ERR_PTR(-EOPNOTSUPP); 241 } 242 243 static inline 244 void drm_dp_tunnel_mgr_destroy(struct drm_dp_tunnel_mgr *mgr) {} 245 246 #endif /* CONFIG_DRM_DISPLAY_DP_TUNNEL */ 247 248 #endif /* __DRM_DP_TUNNEL_H__ */ 249