summaryrefslogtreecommitdiff
path: root/src/drivers/wifi/generic/generic.c
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@google.com>2020-10-04 12:42:09 -0700
committerFurquan Shaikh <furquan@google.com>2020-10-13 17:38:26 +0000
commita1ddd2a15d3238befdf257c33e569e6e5773f93f (patch)
tree68e014319d5aab42cb78627e96536baf2c3a6b3d /src/drivers/wifi/generic/generic.c
parent288426d35cd7f3dcf75524d2228f06267da288f2 (diff)
drivers/wifi/generic: Add support for generating SMBIOS data
This change adds support in generic WiFi driver in coreboot to generate SMBIOS data for the WiFi device. Currently, this is used only for Intel WiFi devices and the function is copied over from Intel WiFi driver in coreboot. This change is done in preparation for getting rid of the separate chip driver for Intel WiFi in coreboot. BUG=b:169802515 BRANCH=zork Change-Id: If3c056718bdc57f6976ce8e3f8acc7665ec3ccd7 Signed-off-by: Furquan Shaikh <furquan@google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/46034 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Michael Niewöhner <foss@mniewoehner.de>
Diffstat (limited to 'src/drivers/wifi/generic/generic.c')
-rw-r--r--src/drivers/wifi/generic/generic.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/drivers/wifi/generic/generic.c b/src/drivers/wifi/generic/generic.c
index 0705731e58..e551bf3637 100644
--- a/src/drivers/wifi/generic/generic.c
+++ b/src/drivers/wifi/generic/generic.c
@@ -6,8 +6,10 @@
#include <device/device.h>
#include <device/pci.h>
#include <device/pci_def.h>
+#include <device/pci_ids.h>
#include <elog.h>
#include <sar.h>
+#include <smbios.h>
#include <string.h>
#include <wrdd.h>
#include "chip.h"
@@ -244,6 +246,42 @@ static void wifi_pci_dev_init(struct device *dev)
elog_add_event_wake(ELOG_WAKE_SOURCE_PME_WIFI, 0);
}
+#if CONFIG(GENERATE_SMBIOS_TABLES)
+static int smbios_write_intel_wifi(struct device *dev, int *handle, unsigned long *current)
+{
+ struct smbios_type_intel_wifi {
+ u8 type;
+ u8 length;
+ u16 handle;
+ u8 str;
+ u8 eos[2];
+ } __packed;
+
+ struct smbios_type_intel_wifi *t = (struct smbios_type_intel_wifi *)*current;
+ int len = sizeof(struct smbios_type_intel_wifi);
+
+ memset(t, 0, sizeof(struct smbios_type_intel_wifi));
+ t->type = 0x85;
+ t->length = len - 2;
+ t->handle = *handle;
+ /* Intel wifi driver expects this string to be in the table 0x85. */
+ t->str = smbios_add_string(t->eos, "KHOIHGIUCCHHII");
+
+ len = t->length + smbios_string_table_len(t->eos);
+ *current += len;
+ *handle += 1;
+ return len;
+}
+
+static int smbios_write_wifi(struct device *dev, int *handle, unsigned long *current)
+{
+ if (dev->vendor == PCI_VENDOR_ID_INTEL)
+ return smbios_write_intel_wifi(dev, handle, current);
+
+ return 0;
+}
+#endif
+
struct device_operations wifi_generic_ops = {
.read_resources = pci_dev_read_resources,
.set_resources = pci_dev_set_resources,
@@ -252,6 +290,9 @@ struct device_operations wifi_generic_ops = {
.ops_pci = &pci_dev_ops_pci,
.acpi_name = wifi_generic_acpi_name,
.acpi_fill_ssdt = wifi_generic_fill_ssdt_generator,
+#if CONFIG(GENERATE_SMBIOS_TABLES)
+ .get_smbios_data = smbios_write_wifi,
+#endif
};
static void wifi_generic_enable(struct device *dev)