1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2 /*
3 * Copyright(c) 2021 Intel Corporation
4 */
5 #ifndef __iwl_fw_uefi__
6 #define __iwl_fw_uefi__
7
8 #define IWL_UEFI_OEM_PNVM_NAME L"UefiCnvWlanOemSignedPnvm"
9 #define IWL_UEFI_REDUCED_POWER_NAME L"UefiCnvWlanReducedPower"
10 #define IWL_UEFI_SGOM_NAME L"UefiCnvWlanSarGeoOffsetMapping"
11
12 /*
13 * TODO: we have these hardcoded values that the caller must pass,
14 * because reading from the UEFI is not working. To implement this
15 * properly, we have to change iwl_pnvm_get_from_uefi() to call
16 * efivar_entry_size() and return the value to the caller instead.
17 */
18 #define IWL_HARDCODED_PNVM_SIZE 4096
19 #define IWL_HARDCODED_REDUCE_POWER_SIZE 32768
20 #define IWL_HARDCODED_SGOM_SIZE 339
21
22 struct pnvm_sku_package {
23 u8 rev;
24 u32 total_size;
25 u8 n_skus;
26 u32 reserved[2];
27 u8 data[];
28 } __packed;
29
30 struct uefi_cnv_wlan_sgom_data {
31 u8 revision;
32 u8 offset_map[IWL_HARDCODED_SGOM_SIZE - 1];
33 } __packed;
34
35 /*
36 * This is known to be broken on v4.19 and to work on v5.4. Until we
37 * figure out why this is the case and how to make it work, simply
38 * disable the feature in old kernels.
39 */
40 #ifdef CONFIG_EFI
41 void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len);
42 void *iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len);
43 #else /* CONFIG_EFI */
44 static inline
iwl_uefi_get_pnvm(struct iwl_trans * trans,size_t * len)45 void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len)
46 {
47 return ERR_PTR(-EOPNOTSUPP);
48 }
49
50 static inline
iwl_uefi_get_reduced_power(struct iwl_trans * trans,size_t * len)51 void *iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len)
52 {
53 return ERR_PTR(-EOPNOTSUPP);
54 }
55 #endif /* CONFIG_EFI */
56
57 #if defined(CONFIG_EFI) && defined(CONFIG_ACPI)
58 void iwl_uefi_get_sgom_table(struct iwl_trans *trans, struct iwl_fw_runtime *fwrt);
59 #else
60 static inline
iwl_uefi_get_sgom_table(struct iwl_trans * trans,struct iwl_fw_runtime * fwrt)61 void iwl_uefi_get_sgom_table(struct iwl_trans *trans, struct iwl_fw_runtime *fwrt)
62 {
63 }
64 #endif
65 #endif /* __iwl_fw_uefi__ */
66