184c3c995SLuca Coelho /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
284c3c995SLuca Coelho /*
3380bf72dSAlon Giladi  * Copyright(c) 2021-2023 Intel Corporation
484c3c995SLuca Coelho  */
591000fdfSJohannes Berg #ifndef __iwl_fw_uefi__
691000fdfSJohannes Berg #define __iwl_fw_uefi__
784c3c995SLuca Coelho 
884c3c995SLuca Coelho #define IWL_UEFI_OEM_PNVM_NAME		L"UefiCnvWlanOemSignedPnvm"
99dad325fSLuca Coelho #define IWL_UEFI_REDUCED_POWER_NAME	L"UefiCnvWlanReducedPower"
10c593d2faSAyala Barazani #define IWL_UEFI_SGOM_NAME		L"UefiCnvWlanSarGeoOffsetMapping"
1109b4c35dSAyala Barazani #define IWL_UEFI_STEP_NAME		L"UefiCnvCommonSTEP"
1284c3c995SLuca Coelho 
138ae3e231SGregory Greenman #define IWL_SGOM_MAP_SIZE		339
149dad325fSLuca Coelho 
159dad325fSLuca Coelho struct pnvm_sku_package {
169dad325fSLuca Coelho 	u8 rev;
179dad325fSLuca Coelho 	u32 total_size;
189dad325fSLuca Coelho 	u8 n_skus;
199dad325fSLuca Coelho 	u32 reserved[2];
209dad325fSLuca Coelho 	u8 data[];
219dad325fSLuca Coelho } __packed;
2284c3c995SLuca Coelho 
23c593d2faSAyala Barazani struct uefi_cnv_wlan_sgom_data {
24c593d2faSAyala Barazani 	u8 revision;
258ae3e231SGregory Greenman 	u8 offset_map[IWL_SGOM_MAP_SIZE - 1];
26c593d2faSAyala Barazani } __packed;
27c593d2faSAyala Barazani 
2809b4c35dSAyala Barazani struct uefi_cnv_common_step_data {
2909b4c35dSAyala Barazani 	u8 revision;
3009b4c35dSAyala Barazani 	u8 step_mode;
3109b4c35dSAyala Barazani 	u8 cnvi_eq_channel;
3209b4c35dSAyala Barazani 	u8 cnvr_eq_channel;
3309b4c35dSAyala Barazani 	u8 radio1;
3409b4c35dSAyala Barazani 	u8 radio2;
3509b4c35dSAyala Barazani } __packed;
3609b4c35dSAyala Barazani 
37c593d2faSAyala Barazani /*
38c593d2faSAyala Barazani  * This is known to be broken on v4.19 and to work on v5.4.  Until we
39c593d2faSAyala Barazani  * figure out why this is the case and how to make it work, simply
40c593d2faSAyala Barazani  * disable the feature in old kernels.
41c593d2faSAyala Barazani  */
4284c3c995SLuca Coelho #ifdef CONFIG_EFI
4384c3c995SLuca Coelho void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len);
44380bf72dSAlon Giladi u8 *iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len);
45380bf72dSAlon Giladi int iwl_uefi_reduce_power_parse(struct iwl_trans *trans,
46380bf72dSAlon Giladi 				const u8 *data, size_t len,
47ea3571f4SAlon Giladi 				struct iwl_pnvm_image *pnvm_data);
4809b4c35dSAyala Barazani void iwl_uefi_get_step_table(struct iwl_trans *trans);
49*372a7148SGregory Greenman int iwl_uefi_handle_tlv_mem_desc(struct iwl_trans *trans, const u8 *data,
50*372a7148SGregory Greenman 				 u32 tlv_len, struct iwl_pnvm_image *pnvm_data);
5184c3c995SLuca Coelho #else /* CONFIG_EFI */
iwl_uefi_get_pnvm(struct iwl_trans * trans,size_t * len)52380bf72dSAlon Giladi static inline void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len)
5384c3c995SLuca Coelho {
5484c3c995SLuca Coelho 	return ERR_PTR(-EOPNOTSUPP);
5584c3c995SLuca Coelho }
569dad325fSLuca Coelho 
57380bf72dSAlon Giladi static inline int
iwl_uefi_reduce_power_parse(struct iwl_trans * trans,const u8 * data,size_t len,struct iwl_pnvm_image * pnvm_data)58380bf72dSAlon Giladi iwl_uefi_reduce_power_parse(struct iwl_trans *trans,
59380bf72dSAlon Giladi 			    const u8 *data, size_t len,
60ea3571f4SAlon Giladi 			    struct iwl_pnvm_image *pnvm_data)
619dad325fSLuca Coelho {
62ea3571f4SAlon Giladi 	return -EOPNOTSUPP;
639dad325fSLuca Coelho }
6409b4c35dSAyala Barazani 
65380bf72dSAlon Giladi static inline u8 *
iwl_uefi_get_reduced_power(struct iwl_trans * trans,size_t * len)66380bf72dSAlon Giladi iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len)
67380bf72dSAlon Giladi {
68380bf72dSAlon Giladi 	return ERR_PTR(-EOPNOTSUPP);
69380bf72dSAlon Giladi }
70380bf72dSAlon Giladi 
iwl_uefi_get_step_table(struct iwl_trans * trans)71380bf72dSAlon Giladi static inline void iwl_uefi_get_step_table(struct iwl_trans *trans)
7209b4c35dSAyala Barazani {
7309b4c35dSAyala Barazani }
74*372a7148SGregory Greenman 
75*372a7148SGregory Greenman static inline int
iwl_uefi_handle_tlv_mem_desc(struct iwl_trans * trans,const u8 * data,u32 tlv_len,struct iwl_pnvm_image * pnvm_data)76*372a7148SGregory Greenman iwl_uefi_handle_tlv_mem_desc(struct iwl_trans *trans, const u8 *data,
77*372a7148SGregory Greenman 			     u32 tlv_len, struct iwl_pnvm_image *pnvm_data)
78*372a7148SGregory Greenman {
79*372a7148SGregory Greenman 	return 0;
80*372a7148SGregory Greenman }
8184c3c995SLuca Coelho #endif /* CONFIG_EFI */
8291000fdfSJohannes Berg 
83c593d2faSAyala Barazani #if defined(CONFIG_EFI) && defined(CONFIG_ACPI)
84c593d2faSAyala Barazani void iwl_uefi_get_sgom_table(struct iwl_trans *trans, struct iwl_fw_runtime *fwrt);
85c593d2faSAyala Barazani #else
86c593d2faSAyala Barazani static inline
iwl_uefi_get_sgom_table(struct iwl_trans * trans,struct iwl_fw_runtime * fwrt)87c593d2faSAyala Barazani void iwl_uefi_get_sgom_table(struct iwl_trans *trans, struct iwl_fw_runtime *fwrt)
88c593d2faSAyala Barazani {
89c593d2faSAyala Barazani }
90c593d2faSAyala Barazani #endif
9191000fdfSJohannes Berg #endif /* __iwl_fw_uefi__ */
92