Jérémy Compostella has submitted this change. ( https://review.coreboot.org/c/coreboot/+/81790?usp=email )
Change subject: drivers/wifi: Support 320Mhz Bandwidth Enablement per MCC ......................................................................
drivers/wifi: Support 320Mhz Bandwidth Enablement per MCC
Add support for the configuration of 320MHz Bandwidth per MCC based on countries. The implementation follows document #559910 Intel Connectivity Platforms BIOS Guidelines revision 8.3.
BUG=b:333804562 BRANCH=firmware-rex-15709.B TEST=WBEM method is added to the CNVW device and return the data supplied by the SAR binary blob
Change-Id: Ie76794825f1a0104d199c078aa4ffc714aa95b17 Signed-off-by: Poornima Tom poornima.tom@intel.com Signed-off-by: Jeremy Compostella jeremy.compostella@intel.com Reviewed-on: https://review.coreboot.org/c/coreboot/+/81790 Reviewed-by: Subrata Banik subratabanik@google.com Reviewed-by: Eric Lai ericllai@google.com Tested-by: build bot (Jenkins) no-reply@coreboot.org --- M src/drivers/wifi/generic/acpi.c M src/include/sar.h M src/vendorcode/google/chromeos/sar.c 3 files changed, 58 insertions(+), 1 deletion(-)
Approvals: build bot (Jenkins): Verified Eric Lai: Looks good to me, but someone else must approve Subrata Banik: Looks good to me, approved
diff --git a/src/drivers/wifi/generic/acpi.c b/src/drivers/wifi/generic/acpi.c index e303589..13120d4 100644 --- a/src/drivers/wifi/generic/acpi.c +++ b/src/drivers/wifi/generic/acpi.c @@ -539,6 +539,43 @@ acpigen_write_package_end(); }
+static void sar_emit_wbem(const struct wbem_profile *wbem) +{ + if (wbem == NULL) + return; + + /* + * Name ("WBEM", Package() { + * { + * Revision, + * Package() + * { + * DomainType, // 0x7:WiFi + * bandwidth_320mhz_country_enablement // 0 Disabled + * // 1 Japan Enabled + * // 2 South Korea Enabled + * // 3 Japan + South Korea Enabled + * } + } }) + */ + if (wbem->revision != WBEM_REVISION) { + printk(BIOS_ERR, "Unsupported WBEM table revision: %d\n", + wbem->revision); + return; + } + + acpigen_write_name("WBEM"); + acpigen_write_package(2); + acpigen_write_dword(wbem->revision); + + acpigen_write_package(2); + acpigen_write_dword(DOMAIN_TYPE_WIFI); + acpigen_write_dword(wbem->bandwidth_320mhz_country_enablement); + + acpigen_write_package_end(); + acpigen_write_package_end(); +} + static void emit_sar_acpi_structures(const struct device *dev, struct dsm_profile *dsm, struct bsar_profile *bsar, bool *bsar_loaded) { @@ -562,6 +599,7 @@ sar_emit_wgds(sar_limits.wgds); sar_emit_ppag(sar_limits.ppag); sar_emit_wtas(sar_limits.wtas); + sar_emit_wbem(sar_limits.wbem);
/* copy the dsm data to be later used for creating _DSM function */ if (sar_limits.dsm != NULL) diff --git a/src/include/sar.h b/src/include/sar.h index 7c1b95d..5968645 100644 --- a/src/include/sar.h +++ b/src/include/sar.h @@ -9,9 +9,10 @@ #define MAX_DENYLIST_ENTRY 16 #define MAX_DSAR_SET_COUNT 3 #define MAX_GEO_OFFSET_REVISION 3 -#define MAX_PROFILE_COUNT 6 +#define MAX_PROFILE_COUNT 7 #define MAX_SAR_REVISION 2 #define BSAR_REVISION 1 +#define WBEM_REVISION 0 #define REVISION_SIZE 1 #define SAR_REV0_CHAINS_COUNT 2 #define SAR_REV0_SUBBANDS_COUNT 5 @@ -73,6 +74,11 @@ uint8_t le_lr_modulation; } __packed;
+struct wbem_profile { + uint8_t revision; + uint32_t bandwidth_320mhz_country_enablement; +} __packed; + struct sar_header { char marker[SAR_STR_PREFIX_SIZE]; uint8_t version; @@ -88,6 +94,7 @@ struct avg_profile *wtas; struct dsm_profile *dsm; struct bsar_profile *bsar; + struct wbem_profile *wbem; }; void *profile[MAX_PROFILE_COUNT]; }; diff --git a/src/vendorcode/google/chromeos/sar.c b/src/vendorcode/google/chromeos/sar.c index 8195886..50c59d5 100644 --- a/src/vendorcode/google/chromeos/sar.c +++ b/src/vendorcode/google/chromeos/sar.c @@ -102,6 +102,14 @@ return sizeof(struct bsar_profile); }
+static int wbem_table_size(const struct wbem_profile *wbem) +{ + if (wbem == NULL) + return 0; + + return sizeof(struct wbem_profile); +} + static bool valid_legacy_length(size_t bin_len) { if (bin_len == LEGACY_SAR_WGDS_BIN_SIZE) @@ -154,6 +162,7 @@ expected_sar_bin_size += sar_avg_table_size(sar_limits->wtas); expected_sar_bin_size += dsm_table_size(sar_limits->dsm); expected_sar_bin_size += bsar_table_size(sar_limits->bsar); + expected_sar_bin_size += wbem_table_size(sar_limits->wbem);
if (sar_bin_size != expected_sar_bin_size) { printk(BIOS_ERR, "Invalid SAR size, expected: %zu, obtained: %zu\n", @@ -220,6 +229,7 @@ * [WTAS_REVISION, WTAS_DATA] * [DSM_RETURN_VALUES] * [BSAR_REVISION,IPML,LB,BR,EDR2,EDR3,LE,LE2,LE_LR] + * [WBEM_REVISION, WBEM_DATA] * * The configuration data will always have the revision added in the file for each of the * block, based on the revision number and validity, size of the specific block will be @@ -259,6 +269,8 @@ * [Enable/disable the TAS feature] * [Number of blocked countries that are not approved by the OEM to support this feature] * [deny_list_entry_<1-16>: ISO country code to block] + * [WBEM_DATA] = + * [Enable or disable 320MHZ Bandwidth for Japan, SouthKorea] */ int get_wifi_sar_limits(union wifi_sar_limits *sar_limits) {