/* SPDX-License-Identifier: MIT */ /* * Copyright © 2023 Intel Corporation */ #ifndef __DRM_DP_TUNNEL_H__ #define __DRM_DP_TUNNEL_H__ #include #include #include struct drm_dp_aux; struct drm_device; struct drm_atomic_state; struct drm_dp_tunnel_mgr; struct drm_dp_tunnel_state; struct ref_tracker; struct drm_dp_tunnel_ref { struct drm_dp_tunnel *tunnel; struct ref_tracker *tracker; }; #ifdef CONFIG_DRM_DISPLAY_DP_TUNNEL struct drm_dp_tunnel * drm_dp_tunnel_get(struct drm_dp_tunnel *tunnel, struct ref_tracker **tracker); void drm_dp_tunnel_put(struct drm_dp_tunnel *tunnel, struct ref_tracker **tracker); static inline void drm_dp_tunnel_ref_get(struct drm_dp_tunnel *tunnel, struct drm_dp_tunnel_ref *tunnel_ref) { tunnel_ref->tunnel = drm_dp_tunnel_get(tunnel, &tunnel_ref->tracker); } static inline void drm_dp_tunnel_ref_put(struct drm_dp_tunnel_ref *tunnel_ref) { drm_dp_tunnel_put(tunnel_ref->tunnel, &tunnel_ref->tracker); tunnel_ref->tunnel = NULL; } struct drm_dp_tunnel * drm_dp_tunnel_detect(struct drm_dp_tunnel_mgr *mgr, struct drm_dp_aux *aux); int drm_dp_tunnel_destroy(struct drm_dp_tunnel *tunnel); int drm_dp_tunnel_enable_bw_alloc(struct drm_dp_tunnel *tunnel); int drm_dp_tunnel_disable_bw_alloc(struct drm_dp_tunnel *tunnel); bool drm_dp_tunnel_bw_alloc_is_enabled(const struct drm_dp_tunnel *tunnel); int drm_dp_tunnel_alloc_bw(struct drm_dp_tunnel *tunnel, int bw); int drm_dp_tunnel_get_allocated_bw(struct drm_dp_tunnel *tunnel); int drm_dp_tunnel_update_state(struct drm_dp_tunnel *tunnel); void drm_dp_tunnel_set_io_error(struct drm_dp_tunnel *tunnel); int drm_dp_tunnel_handle_irq(struct drm_dp_tunnel_mgr *mgr, struct drm_dp_aux *aux); int drm_dp_tunnel_max_dprx_rate(const struct drm_dp_tunnel *tunnel); int drm_dp_tunnel_max_dprx_lane_count(const struct drm_dp_tunnel *tunnel); int drm_dp_tunnel_available_bw(const struct drm_dp_tunnel *tunnel); const char *drm_dp_tunnel_name(const struct drm_dp_tunnel *tunnel); struct drm_dp_tunnel_state * drm_dp_tunnel_atomic_get_state(struct drm_atomic_state *state, struct drm_dp_tunnel *tunnel); struct drm_dp_tunnel_state * drm_dp_tunnel_atomic_get_old_state(struct drm_atomic_state *state, const struct drm_dp_tunnel *tunnel); struct drm_dp_tunnel_state * drm_dp_tunnel_atomic_get_new_state(struct drm_atomic_state *state, const struct drm_dp_tunnel *tunnel); int drm_dp_tunnel_atomic_set_stream_bw(struct drm_atomic_state *state, struct drm_dp_tunnel *tunnel, u8 stream_id, int bw); int drm_dp_tunnel_atomic_get_group_streams_in_state(struct drm_atomic_state *state, const struct drm_dp_tunnel *tunnel, u32 *stream_mask); int drm_dp_tunnel_atomic_check_stream_bws(struct drm_atomic_state *state, u32 *failed_stream_mask); int drm_dp_tunnel_atomic_get_required_bw(const struct drm_dp_tunnel_state *tunnel_state); struct drm_dp_tunnel_mgr * drm_dp_tunnel_mgr_create(struct drm_device *dev, int max_group_count); void drm_dp_tunnel_mgr_destroy(struct drm_dp_tunnel_mgr *mgr); #else static inline struct drm_dp_tunnel * drm_dp_tunnel_get(struct drm_dp_tunnel *tunnel, struct ref_tracker **tracker) { return NULL; } static inline void drm_dp_tunnel_put(struct drm_dp_tunnel *tunnel, struct ref_tracker **tracker) {} static inline void drm_dp_tunnel_ref_get(struct drm_dp_tunnel *tunnel, struct drm_dp_tunnel_ref *tunnel_ref) {} static inline void drm_dp_tunnel_ref_put(struct drm_dp_tunnel_ref *tunnel_ref) {} static inline struct drm_dp_tunnel * drm_dp_tunnel_detect(struct drm_dp_tunnel_mgr *mgr, struct drm_dp_aux *aux) { return ERR_PTR(-EOPNOTSUPP); } static inline int drm_dp_tunnel_destroy(struct drm_dp_tunnel *tunnel) { return 0; } static inline int drm_dp_tunnel_enable_bw_alloc(struct drm_dp_tunnel *tunnel) { return -EOPNOTSUPP; } static inline int drm_dp_tunnel_disable_bw_alloc(struct drm_dp_tunnel *tunnel) { return -EOPNOTSUPP; } static inline bool drm_dp_tunnel_bw_alloc_is_enabled(const struct drm_dp_tunnel *tunnel) { return false; } static inline int drm_dp_tunnel_alloc_bw(struct drm_dp_tunnel *tunnel, int bw) { return -EOPNOTSUPP; } static inline int drm_dp_tunnel_get_allocated_bw(struct drm_dp_tunnel *tunnel) { return -1; } static inline int drm_dp_tunnel_update_state(struct drm_dp_tunnel *tunnel) { return -EOPNOTSUPP; } static inline void drm_dp_tunnel_set_io_error(struct drm_dp_tunnel *tunnel) {} static inline int drm_dp_tunnel_handle_irq(struct drm_dp_tunnel_mgr *mgr, struct drm_dp_aux *aux) { return -EOPNOTSUPP; } static inline int drm_dp_tunnel_max_dprx_rate(const struct drm_dp_tunnel *tunnel) { return 0; } static inline int drm_dp_tunnel_max_dprx_lane_count(const struct drm_dp_tunnel *tunnel) { return 0; } static inline int drm_dp_tunnel_available_bw(const struct drm_dp_tunnel *tunnel) { return -1; } static inline const char * drm_dp_tunnel_name(const struct drm_dp_tunnel *tunnel) { return NULL; } static inline struct drm_dp_tunnel_state * drm_dp_tunnel_atomic_get_state(struct drm_atomic_state *state, struct drm_dp_tunnel *tunnel) { return ERR_PTR(-EOPNOTSUPP); } static inline struct drm_dp_tunnel_state * drm_dp_tunnel_atomic_get_new_state(struct drm_atomic_state *state, const struct drm_dp_tunnel *tunnel) { return ERR_PTR(-EOPNOTSUPP); } static inline int drm_dp_tunnel_atomic_set_stream_bw(struct drm_atomic_state *state, struct drm_dp_tunnel *tunnel, u8 stream_id, int bw) { return -EOPNOTSUPP; } static inline int drm_dp_tunnel_atomic_get_group_streams_in_state(struct drm_atomic_state *state, const struct drm_dp_tunnel *tunnel, u32 *stream_mask) { return -EOPNOTSUPP; } static inline int drm_dp_tunnel_atomic_check_stream_bws(struct drm_atomic_state *state, u32 *failed_stream_mask) { return -EOPNOTSUPP; } static inline int drm_dp_tunnel_atomic_get_required_bw(const struct drm_dp_tunnel_state *tunnel_state) { return 0; } static inline struct drm_dp_tunnel_mgr * drm_dp_tunnel_mgr_create(struct drm_device *dev, int max_group_count) { return ERR_PTR(-EOPNOTSUPP); } static inline void drm_dp_tunnel_mgr_destroy(struct drm_dp_tunnel_mgr *mgr) {} #endif /* CONFIG_DRM_DISPLAY_DP_TUNNEL */ #endif /* __DRM_DP_TUNNEL_H__ */