184c3c995SLuca Coelho /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 284c3c995SLuca Coelho /* 3*380bf72dSAlon 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 1384c3c995SLuca Coelho /* 1484c3c995SLuca Coelho * TODO: we have these hardcoded values that the caller must pass, 1584c3c995SLuca Coelho * because reading from the UEFI is not working. To implement this 1684c3c995SLuca Coelho * properly, we have to change iwl_pnvm_get_from_uefi() to call 1784c3c995SLuca Coelho * efivar_entry_size() and return the value to the caller instead. 1884c3c995SLuca Coelho */ 1984c3c995SLuca Coelho #define IWL_HARDCODED_PNVM_SIZE 4096 209dad325fSLuca Coelho #define IWL_HARDCODED_REDUCE_POWER_SIZE 32768 21c593d2faSAyala Barazani #define IWL_HARDCODED_SGOM_SIZE 339 2209b4c35dSAyala Barazani #define IWL_HARDCODED_STEP_SIZE 6 239dad325fSLuca Coelho 249dad325fSLuca Coelho struct pnvm_sku_package { 259dad325fSLuca Coelho u8 rev; 269dad325fSLuca Coelho u32 total_size; 279dad325fSLuca Coelho u8 n_skus; 289dad325fSLuca Coelho u32 reserved[2]; 299dad325fSLuca Coelho u8 data[]; 309dad325fSLuca Coelho } __packed; 3184c3c995SLuca Coelho 32c593d2faSAyala Barazani struct uefi_cnv_wlan_sgom_data { 33c593d2faSAyala Barazani u8 revision; 34c593d2faSAyala Barazani u8 offset_map[IWL_HARDCODED_SGOM_SIZE - 1]; 35c593d2faSAyala Barazani } __packed; 36c593d2faSAyala Barazani 3709b4c35dSAyala Barazani struct uefi_cnv_common_step_data { 3809b4c35dSAyala Barazani u8 revision; 3909b4c35dSAyala Barazani u8 step_mode; 4009b4c35dSAyala Barazani u8 cnvi_eq_channel; 4109b4c35dSAyala Barazani u8 cnvr_eq_channel; 4209b4c35dSAyala Barazani u8 radio1; 4309b4c35dSAyala Barazani u8 radio2; 4409b4c35dSAyala Barazani } __packed; 4509b4c35dSAyala Barazani 46c593d2faSAyala Barazani /* 47c593d2faSAyala Barazani * This is known to be broken on v4.19 and to work on v5.4. Until we 48c593d2faSAyala Barazani * figure out why this is the case and how to make it work, simply 49c593d2faSAyala Barazani * disable the feature in old kernels. 50c593d2faSAyala Barazani */ 5184c3c995SLuca Coelho #ifdef CONFIG_EFI 5284c3c995SLuca Coelho void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len); 53*380bf72dSAlon Giladi u8 *iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len); 54*380bf72dSAlon Giladi int iwl_uefi_reduce_power_parse(struct iwl_trans *trans, 55*380bf72dSAlon Giladi const u8 *data, size_t len, 56ea3571f4SAlon Giladi struct iwl_pnvm_image *pnvm_data); 5709b4c35dSAyala Barazani void iwl_uefi_get_step_table(struct iwl_trans *trans); 5884c3c995SLuca Coelho #else /* CONFIG_EFI */ 59*380bf72dSAlon Giladi static inline void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len) 6084c3c995SLuca Coelho { 6184c3c995SLuca Coelho return ERR_PTR(-EOPNOTSUPP); 6284c3c995SLuca Coelho } 639dad325fSLuca Coelho 64*380bf72dSAlon Giladi static inline int 65*380bf72dSAlon Giladi iwl_uefi_reduce_power_parse(struct iwl_trans *trans, 66*380bf72dSAlon Giladi const u8 *data, size_t len, 67ea3571f4SAlon Giladi struct iwl_pnvm_image *pnvm_data) 689dad325fSLuca Coelho { 69ea3571f4SAlon Giladi return -EOPNOTSUPP; 709dad325fSLuca Coelho } 7109b4c35dSAyala Barazani 72*380bf72dSAlon Giladi static inline u8 * 73*380bf72dSAlon Giladi iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len) 74*380bf72dSAlon Giladi { 75*380bf72dSAlon Giladi return ERR_PTR(-EOPNOTSUPP); 76*380bf72dSAlon Giladi } 77*380bf72dSAlon Giladi 78*380bf72dSAlon Giladi static inline void iwl_uefi_get_step_table(struct iwl_trans *trans) 7909b4c35dSAyala Barazani { 8009b4c35dSAyala Barazani } 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 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