xref: /freebsd/sys/contrib/dev/rtw89/acpi.h (revision df279a26d3315e7abc9e6f0744137959a4c2fb86)
1e2340276SBjoern A. Zeeb /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2e2340276SBjoern A. Zeeb /* Copyright(c) 2021-2023  Realtek Corporation
3e2340276SBjoern A. Zeeb  */
4e2340276SBjoern A. Zeeb 
5e2340276SBjoern A. Zeeb #ifndef __RTW89_ACPI_H__
6e2340276SBjoern A. Zeeb #define __RTW89_ACPI_H__
7e2340276SBjoern A. Zeeb 
8e2340276SBjoern A. Zeeb #include "core.h"
9e2340276SBjoern A. Zeeb 
10e2340276SBjoern A. Zeeb enum rtw89_acpi_dsm_func {
11e2340276SBjoern A. Zeeb 	RTW89_ACPI_DSM_FUNC_IDN_BAND_SUP = 2,
12e2340276SBjoern A. Zeeb 	RTW89_ACPI_DSM_FUNC_6G_DIS = 3,
13e2340276SBjoern A. Zeeb 	RTW89_ACPI_DSM_FUNC_6G_BP = 4,
14e2340276SBjoern A. Zeeb 	RTW89_ACPI_DSM_FUNC_TAS_EN = 5,
156d67aabdSBjoern A. Zeeb 	RTW89_ACPI_DSM_FUNC_UNII4_SUP = 6,
166d67aabdSBjoern A. Zeeb 	RTW89_ACPI_DSM_FUNC_6GHZ_SP_SUP = 7,
176d67aabdSBjoern A. Zeeb };
186d67aabdSBjoern A. Zeeb 
196d67aabdSBjoern A. Zeeb enum rtw89_acpi_conf_unii4 {
206d67aabdSBjoern A. Zeeb 	RTW89_ACPI_CONF_UNII4_FCC = BIT(0),
216d67aabdSBjoern A. Zeeb 	RTW89_ACPI_CONF_UNII4_IC = BIT(1),
226d67aabdSBjoern A. Zeeb };
236d67aabdSBjoern A. Zeeb 
246d67aabdSBjoern A. Zeeb enum rtw89_acpi_policy_mode {
256d67aabdSBjoern A. Zeeb 	RTW89_ACPI_POLICY_BLOCK = 0,
266d67aabdSBjoern A. Zeeb 	RTW89_ACPI_POLICY_ALLOW = 1,
276d67aabdSBjoern A. Zeeb };
286d67aabdSBjoern A. Zeeb 
296d67aabdSBjoern A. Zeeb struct rtw89_acpi_country_code {
306d67aabdSBjoern A. Zeeb 	/* below are allowed:
316d67aabdSBjoern A. Zeeb 	 * * ISO alpha2 country code
326d67aabdSBjoern A. Zeeb 	 * * EU for countries in Europe
336d67aabdSBjoern A. Zeeb 	 */
346d67aabdSBjoern A. Zeeb 	char alpha2[2];
356d67aabdSBjoern A. Zeeb } __packed;
366d67aabdSBjoern A. Zeeb 
376d67aabdSBjoern A. Zeeb struct rtw89_acpi_policy_6ghz {
386d67aabdSBjoern A. Zeeb 	u8 signature[3];
396d67aabdSBjoern A. Zeeb 	u8 rsvd;
406d67aabdSBjoern A. Zeeb 	u8 policy_mode;
416d67aabdSBjoern A. Zeeb 	u8 country_count;
426d67aabdSBjoern A. Zeeb 	struct rtw89_acpi_country_code country_list[] __counted_by(country_count);
436d67aabdSBjoern A. Zeeb } __packed;
446d67aabdSBjoern A. Zeeb 
456d67aabdSBjoern A. Zeeb enum rtw89_acpi_conf_6ghz_sp {
466d67aabdSBjoern A. Zeeb 	RTW89_ACPI_CONF_6GHZ_SP_US = BIT(0),
476d67aabdSBjoern A. Zeeb };
486d67aabdSBjoern A. Zeeb 
496d67aabdSBjoern A. Zeeb struct rtw89_acpi_policy_6ghz_sp {
506d67aabdSBjoern A. Zeeb 	u8 signature[4];
516d67aabdSBjoern A. Zeeb 	u8 revision;
526d67aabdSBjoern A. Zeeb 	u8 override;
536d67aabdSBjoern A. Zeeb 	u8 conf;
546d67aabdSBjoern A. Zeeb 	u8 rsvd;
556d67aabdSBjoern A. Zeeb } __packed;
566d67aabdSBjoern A. Zeeb 
576d67aabdSBjoern A. Zeeb struct rtw89_acpi_dsm_result {
586d67aabdSBjoern A. Zeeb 	union {
596d67aabdSBjoern A. Zeeb 		u8 value;
606d67aabdSBjoern A. Zeeb 		/* caller needs to free it after using */
616d67aabdSBjoern A. Zeeb 		struct rtw89_acpi_policy_6ghz *policy_6ghz;
626d67aabdSBjoern A. Zeeb 		struct rtw89_acpi_policy_6ghz_sp *policy_6ghz_sp;
636d67aabdSBjoern A. Zeeb 	} u;
64e2340276SBjoern A. Zeeb };
65e2340276SBjoern A. Zeeb 
66*df279a26SBjoern A. Zeeb struct rtw89_acpi_rtag_result {
67*df279a26SBjoern A. Zeeb 	u8 tag[4];
68*df279a26SBjoern A. Zeeb 	u8 revision;
69*df279a26SBjoern A. Zeeb 	__le32 domain;
70*df279a26SBjoern A. Zeeb 	u8 ant_gain_table[RTW89_ANT_GAIN_CHAIN_NUM][RTW89_ANT_GAIN_SUBBAND_NR];
71*df279a26SBjoern A. Zeeb } __packed;
72*df279a26SBjoern A. Zeeb 
73e2340276SBjoern A. Zeeb int rtw89_acpi_evaluate_dsm(struct rtw89_dev *rtwdev,
746d67aabdSBjoern A. Zeeb 			    enum rtw89_acpi_dsm_func func,
756d67aabdSBjoern A. Zeeb 			    struct rtw89_acpi_dsm_result *res);
76*df279a26SBjoern A. Zeeb int rtw89_acpi_evaluate_rtag(struct rtw89_dev *rtwdev,
77*df279a26SBjoern A. Zeeb 			     struct rtw89_acpi_rtag_result *res);
78e2340276SBjoern A. Zeeb 
79e2340276SBjoern A. Zeeb #endif
80