1 /* SPDX-License-Identifier: MIT */ 2 /* Copyright © 2026 Intel Corporation */ 3 4 #ifndef __INTEL_DP_LINK_CAPS_H__ 5 #define __INTEL_DP_LINK_CAPS_H__ 6 7 #include <linux/bitops.h> 8 #include <linux/types.h> 9 10 struct intel_connector; 11 struct intel_dp; 12 struct intel_dp_link_caps; 13 struct intel_dp_link_config; 14 15 /** 16 * enum intel_dp_link_caps_order_key - key used to order configurations 17 * @INTEL_DP_LINK_CAPS_ORDER_KEY_BW: 18 * Order configurations by bandwidth, then by link rate. 19 * @INTEL_DP_LINK_CAPS_ORDER_KEY_RATE_LANE: 20 * Order configurations by link rate, then by lane count. 21 * @INTEL_DP_LINK_CAPS_ORDER_KEY_LANE_RATE: 22 * Order configurations by lane count, then by link rate. 23 * @INTEL_DP_LINK_CAPS_ORDER_KEY_NUM: 24 * Number of ordering keys. 25 * 26 * Selects how a caller wants the configuration table to be ordered, 27 * together with an &enum intel_dp_link_caps_order_direction, for 28 * iteration queries. 29 * 30 * See also: 31 * - &struct intel_dp_link_caps_order 32 * - intel_dp_link_caps_get_max_config() 33 */ 34 enum intel_dp_link_caps_order_key { 35 INTEL_DP_LINK_CAPS_ORDER_KEY_BW, 36 INTEL_DP_LINK_CAPS_ORDER_KEY_RATE_LANE, 37 INTEL_DP_LINK_CAPS_ORDER_KEY_LANE_RATE, 38 39 INTEL_DP_LINK_CAPS_ORDER_KEY_NUM 40 }; 41 42 /** 43 * enum intel_dp_link_caps_order_direction - iteration direction 44 * @INTEL_DP_LINK_CAPS_ORDER_DIR_ASC: 45 * Iterate in ascending order according to the selected ordering key. 46 * @INTEL_DP_LINK_CAPS_ORDER_DIR_DESC: 47 * Iterate in descending order according to the selected ordering key. 48 * @INTEL_DP_LINK_CAPS_ORDER_DIR_NUM: 49 * Number of ordering directions. 50 * 51 * Selects the direction associated with an 52 * &enum intel_dp_link_caps_order_key for iteration queries. 53 * 54 * See also: 55 * - &struct intel_dp_link_caps_order 56 */ 57 enum intel_dp_link_caps_order_direction { 58 INTEL_DP_LINK_CAPS_ORDER_DIR_ASC, 59 INTEL_DP_LINK_CAPS_ORDER_DIR_DESC, 60 61 INTEL_DP_LINK_CAPS_ORDER_DIR_NUM 62 }; 63 64 /** 65 * struct intel_dp_link_caps_order - configuration ordering 66 * @key: 67 * Key used to order configurations. 68 * @dir: 69 * Direction of the selected ordering. 70 * 71 * Describes an iteration order for link configurations. 72 * 73 * See also: 74 * - for_each_dp_link_config() 75 */ 76 struct intel_dp_link_caps_order { 77 enum intel_dp_link_caps_order_key key; 78 enum intel_dp_link_caps_order_direction dir; 79 }; 80 81 struct intel_dp_link_caps_filter { 82 u32 config_mask; 83 }; 84 85 #define INTEL_DP_LINK_CAPS_FILTER_NONE \ 86 ((struct intel_dp_link_caps_filter){ .config_mask = 0 }) 87 #define INTEL_DP_LINK_CAPS_FILTER_ALL \ 88 ((struct intel_dp_link_caps_filter){ .config_mask = (u32)-1 }) 89 90 struct intel_dp_link_caps_iter { 91 struct intel_dp_link_caps *link_caps; 92 int pos; 93 struct intel_dp_link_caps_order order; 94 struct intel_dp_link_caps_filter filter; 95 96 bool (*get_next_config)(struct intel_dp_link_caps_iter *iter, 97 struct intel_dp_link_config *config); 98 }; 99 100 /** 101 * for_each_dp_link_config - iterate allowed link configurations 102 * @__iter: 103 * &struct intel_dp_link_caps_iter being iterated 104 * @__config: 105 * pointer to &struct intel_dp_link_config filled for each match 106 */ 107 #define for_each_dp_link_config(__iter, __config) \ 108 while ((__iter)->get_next_config((__iter), (__config))) 109 110 void intel_dp_link_caps_iter_start(struct intel_dp_link_caps_iter *iter, 111 struct intel_dp_link_caps *link_caps, 112 struct intel_dp_link_caps_order order, 113 struct intel_dp_link_caps_filter filter); 114 115 void intel_dp_link_caps_iter_end(struct intel_dp_link_caps_iter *iter); 116 117 struct intel_dp_link_caps_order 118 intel_dp_link_caps_connector_compute_order(struct intel_connector *connector); 119 struct intel_dp_link_caps_order 120 intel_dp_link_caps_connector_fallback_order(bool is_mst); 121 122 void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps); 123 124 void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps, 125 struct intel_dp_link_config *forced_params); 126 127 bool intel_dp_link_caps_filter_add(struct intel_dp_link_caps *link_caps, 128 struct intel_dp_link_caps_filter *filter, 129 const struct intel_dp_link_config *config); 130 131 bool intel_dp_link_caps_get_max_config(struct intel_dp_link_caps *link_caps, 132 enum intel_dp_link_caps_order_key order_key, 133 struct intel_dp_link_caps_filter filter, 134 struct intel_dp_link_config *max_config); 135 136 void intel_dp_link_caps_get_max_bw_config(struct intel_dp_link_caps *link_caps, 137 struct intel_dp_link_config *max_config); 138 139 bool intel_dp_link_caps_disable_config(struct intel_dp_link_caps *link_caps, 140 const struct intel_dp_link_config *config); 141 142 void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps, 143 struct intel_dp_link_config *max_link_limits); 144 bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps, 145 const struct intel_dp_link_config *max_link_limits); 146 void intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps); 147 148 bool intel_dp_link_caps_update(struct intel_dp_link_caps *link_caps, 149 const int *rates, int num_rates, int max_lane_count, 150 bool reset); 151 void intel_dp_link_caps_reset(struct intel_dp_link_caps *link_caps); 152 153 void intel_dp_link_caps_debugfs_add(struct intel_connector *connector); 154 155 struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp); 156 void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps); 157 158 #if IS_ENABLED(CONFIG_KUNIT) 159 160 #define INTEL_DP_LINK_CAPS_TEST_OPS_MEMBERS(__X) \ 161 __X(connector_compute_order, intel_dp_link_caps_connector_compute_order) \ 162 __X(connector_fallback_order, intel_dp_link_caps_connector_fallback_order) \ 163 __X(iter_start, intel_dp_link_caps_iter_start) \ 164 __X(iter_end, intel_dp_link_caps_iter_end) \ 165 __X(set_max_limits, intel_dp_link_caps_set_max_limits) \ 166 __X(get_max_limits, intel_dp_link_caps_get_max_limits) \ 167 __X(get_max_bw_config, intel_dp_link_caps_get_max_bw_config) \ 168 __X(reset_max_limits, intel_dp_link_caps_reset_max_limits) \ 169 __X(disable_config, intel_dp_link_caps_disable_config) \ 170 __X(update, intel_dp_link_caps_update) \ 171 __X(init, intel_dp_link_caps_init) \ 172 __X(cleanup, intel_dp_link_caps_cleanup) 173 174 #define __DECLARE_MEMBER(__name, __fn) \ 175 typeof(__fn) *__name; 176 177 #define INTEL_DP_LINK_CAPS_TEST_OPS_DECLARE \ 178 INTEL_DP_LINK_CAPS_TEST_OPS_MEMBERS(__DECLARE_MEMBER) 179 180 struct intel_dp_link_caps_test_ops { 181 INTEL_DP_LINK_CAPS_TEST_OPS_DECLARE 182 }; 183 184 #undef INTEL_DP_LINK_CAPS_TEST_OPS_DECLARE 185 #undef __DECLARE_MEMBER 186 187 #ifdef I915 188 extern const struct intel_dp_link_caps_test_ops i915_display_dp_link_caps_test_ops; 189 #else 190 extern const struct intel_dp_link_caps_test_ops intel_display_dp_link_caps_test_ops; 191 #endif /* I915 */ 192 193 #endif /* CONFIG_KUNIT */ 194 195 #endif /* __INTEL_DP_LINK_CAPS_H__ */ 196