FILE
acpi.h
File preview with syntax highlighting.
linux-6.19.14/drivers/net/wireless/realtek/rtw89/acpi.h
1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2/* Copyright(c) 2021-2023 Realtek Corporation 3 */ 4 5#ifndef __RTW89_ACPI_H__ 6#define __RTW89_ACPI_H__ 7 8#include "core.h" 9 10struct rtw89_acpi_data { 11 u32 len; 12 u8 buf[] __counted_by(len); 13}; 14 15enum rtw89_acpi_dsm_func { 16 RTW89_ACPI_DSM_FUNC_IDN_BAND_SUP = 2, 17 RTW89_ACPI_DSM_FUNC_6G_DIS = 3, 18 RTW89_ACPI_DSM_FUNC_6G_BP = 4, 19 RTW89_ACPI_DSM_FUNC_TAS_EN = 5, 20 RTW89_ACPI_DSM_FUNC_UNII4_SUP = 6, 21 RTW89_ACPI_DSM_FUNC_6GHZ_SP_SUP = 7, 22 RTW89_ACPI_DSM_FUNC_REG_RULES_EN = 10, 23 RTW89_ACPI_DSM_FUNC_6GHZ_VLP_SUP = 11, 24}; 25 26enum rtw89_acpi_conf_unii4 { 27 RTW89_ACPI_CONF_UNII4_US = BIT(0), 28 RTW89_ACPI_CONF_UNII4_CA = BIT(1), 29}; 30 31enum rtw89_acpi_policy_mode { 32 RTW89_ACPI_POLICY_BLOCK = 0, 33 RTW89_ACPI_POLICY_ALLOW = 1, 34}; 35 36enum rtw89_acpi_conf_tas { 37 RTW89_ACPI_CONF_TAS_US = BIT(0), 38 RTW89_ACPI_CONF_TAS_CA = BIT(1), 39 RTW89_ACPI_CONF_TAS_KR = BIT(2), 40 RTW89_ACPI_CONF_TAS_OTHERS = BIT(7), 41}; 42 43struct rtw89_acpi_country_code { 44 /* below are allowed: 45 * * ISO alpha2 country code 46 * * EU for countries in Europe 47 */ 48 char alpha2[2]; 49} __packed; 50 51struct rtw89_acpi_policy_6ghz { 52 u8 signature[3]; 53 u8 rsvd; 54 u8 policy_mode; 55 u8 country_count; 56 struct rtw89_acpi_country_code country_list[] __counted_by(country_count); 57} __packed; 58 59enum rtw89_acpi_conf_6ghz_sp { 60 RTW89_ACPI_CONF_6GHZ_SP_US = BIT(0), 61 RTW89_ACPI_CONF_6GHZ_SP_CA = BIT(1), 62}; 63 64struct rtw89_acpi_policy_6ghz_sp { 65 u8 signature[4]; 66 u8 revision; 67 u8 override; 68 u8 conf; 69 u8 rsvd; 70} __packed; 71 72enum rtw89_acpi_conf_6ghz_vlp { 73 RTW89_ACPI_CONF_6GHZ_VLP_US = BIT(0), 74 RTW89_ACPI_CONF_6GHZ_VLP_CA = BIT(1), 75}; 76 77struct rtw89_acpi_policy_6ghz_vlp { 78 u8 signature[4]; 79 u8 revision; 80 u8 override; 81 u8 conf; 82 u8 rsvd; 83} __packed; 84 85struct rtw89_acpi_policy_tas { 86 u8 signature[4]; 87 u8 revision; 88 u8 enable; 89 u8 enabled_countries; 90 u8 rsvd[3]; 91} __packed; 92 93enum rtw89_acpi_conf_reg_rules { 94 RTW89_ACPI_CONF_REG_RULE_REGD_UK = BIT(0), 95}; 96 97struct rtw89_acpi_policy_reg_rules { 98 u8 signature[4]; 99 u8 revision; 100 u8 conf; 101 u8 rsvd[3]; 102} __packed; 103 104struct rtw89_acpi_dsm_result { 105 union { 106 u8 value; 107 /* caller needs to free it after using */ 108 struct rtw89_acpi_policy_6ghz *policy_6ghz; 109 struct rtw89_acpi_policy_6ghz_sp *policy_6ghz_sp; 110 struct rtw89_acpi_policy_6ghz_vlp *policy_6ghz_vlp; 111 struct rtw89_acpi_policy_tas *policy_tas; 112 struct rtw89_acpi_policy_reg_rules *policy_reg_rules; 113 } u; 114}; 115 116struct rtw89_acpi_rtag_result { 117 u8 tag[4]; 118 u8 revision; 119 __le32 domain; 120 u8 ant_gain_table[RTW89_ANT_GAIN_CHAIN_NUM][RTW89_ANT_GAIN_SUBBAND_NR]; 121} __packed; 122 123enum rtw89_acpi_sar_cid { 124 RTW89_ACPI_SAR_CID_HP = 0x5048, 125 RTW89_ACPI_SAR_CID_RT = 0x5452, 126}; 127 128enum rtw89_acpi_sar_rev { 129 RTW89_ACPI_SAR_REV_LEGACY = 1, 130 RTW89_ACPI_SAR_REV_HAS_6GHZ = 2, 131}; 132 133#define RTW89_ACPI_SAR_ANT_NR_STD 4 134#define RTW89_ACPI_SAR_ANT_NR_SML 2 135 136#define RTW89_ACPI_METHOD_STATIC_SAR "WRDS" 137#define RTW89_ACPI_METHOD_DYNAMIC_SAR "RWRD" 138#define RTW89_ACPI_METHOD_DYNAMIC_SAR_INDICATOR "RWSI" 139#define RTW89_ACPI_METHOD_GEO_SAR "RWGS" 140 141struct rtw89_acpi_sar_std_legacy { 142 u8 v[RTW89_ACPI_SAR_ANT_NR_STD][RTW89_ACPI_SAR_SUBBAND_NR_LEGACY]; 143} __packed; 144 145struct rtw89_acpi_sar_std_has_6ghz { 146 u8 v[RTW89_ACPI_SAR_ANT_NR_STD][RTW89_ACPI_SAR_SUBBAND_NR_HAS_6GHZ]; 147} __packed; 148 149struct rtw89_acpi_sar_sml_legacy { 150 u8 v[RTW89_ACPI_SAR_ANT_NR_SML][RTW89_ACPI_SAR_SUBBAND_NR_LEGACY]; 151} __packed; 152 153struct rtw89_acpi_sar_sml_has_6ghz { 154 u8 v[RTW89_ACPI_SAR_ANT_NR_SML][RTW89_ACPI_SAR_SUBBAND_NR_HAS_6GHZ]; 155} __packed; 156 157struct rtw89_acpi_static_sar_hdr { 158 __le16 cid; 159 u8 rev; 160 u8 content[]; 161} __packed; 162 163struct rtw89_acpi_dynamic_sar_hdr { 164 __le16 cid; 165 u8 rev; 166 u8 cnt; 167 u8 content[]; 168} __packed; 169 170struct rtw89_acpi_sar_identifier { 171 enum rtw89_acpi_sar_cid cid; 172 enum rtw89_acpi_sar_rev rev; 173 u8 size; 174}; 175 176/* for rtw89_acpi_sar_identifier::size */ 177#define RTW89_ACPI_SAR_SIZE_MAX U8_MAX 178#define RTW89_ACPI_SAR_SIZE_OF(type) \ 179 (BUILD_BUG_ON_ZERO(sizeof(struct rtw89_acpi_sar_ ## type) > \ 180 RTW89_ACPI_SAR_SIZE_MAX) + \ 181 sizeof(struct rtw89_acpi_sar_ ## type)) 182 183struct rtw89_acpi_sar_recognition { 184 struct rtw89_acpi_sar_identifier id; 185 const struct rtw89_acpi_geo_sar_handler *geo; 186 187 u8 (*rfpath_to_antidx)(enum rtw89_rf_path rfpath); 188 s16 (*normalize)(u8 v); 189 void (*load)(struct rtw89_dev *rtwdev, 190 const struct rtw89_acpi_sar_recognition *rec, 191 const void *content, 192 struct rtw89_sar_entry_from_acpi *ent); 193}; 194 195struct rtw89_acpi_geo_sar_hp_val { 196 u8 max; 197 s8 delta[RTW89_ACPI_SAR_ANT_NR_STD]; 198} __packed; 199 200struct rtw89_acpi_geo_sar_hp_legacy_entry { 201 struct rtw89_acpi_geo_sar_hp_val val_2ghz; 202 struct rtw89_acpi_geo_sar_hp_val val_5ghz; 203} __packed; 204 205struct rtw89_acpi_geo_sar_hp_has_6ghz_entry { 206 struct rtw89_acpi_geo_sar_hp_val val_2ghz; 207 struct rtw89_acpi_geo_sar_hp_val val_5ghz; 208 struct rtw89_acpi_geo_sar_hp_val val_6ghz; 209} __packed; 210 211enum rtw89_acpi_geo_sar_regd_hp { 212 RTW89_ACPI_GEO_SAR_REGD_HP_FCC = 0, 213 RTW89_ACPI_GEO_SAR_REGD_HP_ETSI = 1, 214 RTW89_ACPI_GEO_SAR_REGD_HP_WW = 2, 215 216 RTW89_ACPI_GEO_SAR_REGD_NR_HP, 217}; 218 219struct rtw89_acpi_geo_sar_hp_legacy { 220 struct rtw89_acpi_geo_sar_hp_legacy_entry 221 entries[RTW89_ACPI_GEO_SAR_REGD_NR_HP]; 222} __packed; 223 224struct rtw89_acpi_geo_sar_hp_has_6ghz { 225 struct rtw89_acpi_geo_sar_hp_has_6ghz_entry 226 entries[RTW89_ACPI_GEO_SAR_REGD_NR_HP]; 227} __packed; 228 229struct rtw89_acpi_geo_sar_rt_val { 230 u8 max; 231 s8 delta; 232} __packed; 233 234struct rtw89_acpi_geo_sar_rt_legacy_entry { 235 struct rtw89_acpi_geo_sar_rt_val val_2ghz; 236 struct rtw89_acpi_geo_sar_rt_val val_5ghz; 237} __packed; 238 239struct rtw89_acpi_geo_sar_rt_has_6ghz_entry { 240 struct rtw89_acpi_geo_sar_rt_val val_2ghz; 241 struct rtw89_acpi_geo_sar_rt_val val_5ghz; 242 struct rtw89_acpi_geo_sar_rt_val val_6ghz; 243} __packed; 244 245enum rtw89_acpi_geo_sar_regd_rt { 246 RTW89_ACPI_GEO_SAR_REGD_RT_FCC = 0, 247 RTW89_ACPI_GEO_SAR_REGD_RT_ETSI = 1, 248 RTW89_ACPI_GEO_SAR_REGD_RT_MKK = 2, 249 RTW89_ACPI_GEO_SAR_REGD_RT_IC = 3, 250 RTW89_ACPI_GEO_SAR_REGD_RT_KCC = 4, 251 RTW89_ACPI_GEO_SAR_REGD_RT_WW = 5, 252 253 RTW89_ACPI_GEO_SAR_REGD_NR_RT, 254}; 255 256struct rtw89_acpi_geo_sar_rt_legacy { 257 struct rtw89_acpi_geo_sar_rt_legacy_entry 258 entries[RTW89_ACPI_GEO_SAR_REGD_NR_RT]; 259} __packed; 260 261struct rtw89_acpi_geo_sar_rt_has_6ghz { 262 struct rtw89_acpi_geo_sar_rt_has_6ghz_entry 263 entries[RTW89_ACPI_GEO_SAR_REGD_NR_RT]; 264} __packed; 265 266struct rtw89_acpi_geo_sar_handler { 267 u8 data_size; 268 269 void (*load)(struct rtw89_dev *rtwdev, 270 const void *content, 271 enum rtw89_regulation_type regd, 272 struct rtw89_sar_entry_from_acpi *ent); 273}; 274 275/* for rtw89_acpi_geo_sar_handler::data_size */ 276#define RTW89_ACPI_GEO_SAR_SIZE_MAX U8_MAX 277#define RTW89_ACPI_GEO_SAR_SIZE_OF(type) \ 278 (BUILD_BUG_ON_ZERO(sizeof(struct rtw89_acpi_geo_sar_ ## type) > \ 279 RTW89_ACPI_GEO_SAR_SIZE_MAX) + \ 280 sizeof(struct rtw89_acpi_geo_sar_ ## type)) 281 282enum rtw89_acpi_sar_subband rtw89_acpi_sar_get_subband(struct rtw89_dev *rtwdev, 283 u32 center_freq); 284enum rtw89_band rtw89_acpi_sar_subband_to_band(struct rtw89_dev *rtwdev, 285 enum rtw89_acpi_sar_subband subband); 286 287int rtw89_acpi_evaluate_dsm(struct rtw89_dev *rtwdev, 288 enum rtw89_acpi_dsm_func func, 289 struct rtw89_acpi_dsm_result *res); 290int rtw89_acpi_evaluate_rtag(struct rtw89_dev *rtwdev, 291 struct rtw89_acpi_rtag_result *res); 292int rtw89_acpi_evaluate_sar(struct rtw89_dev *rtwdev, 293 struct rtw89_sar_cfg_acpi *cfg); 294int rtw89_acpi_evaluate_dynamic_sar_indicator(struct rtw89_dev *rtwdev, 295 struct rtw89_sar_cfg_acpi *cfg, 296 bool *changed); 297 298#endif
~/
Read-only file preview.