blob: 2dd35437fd4bf80babcb84fc20dd6b804dc3864b [file] [log] [blame]
Patrick Georgiac959032020-05-05 22:49:26 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +01002
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +01003#include <device/device.h>
4#include <device/pci.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +02005#include <device/pci_ops.h>
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +01006#include <device/pci_ids.h>
Naresh G Solanki3c6377f2017-07-03 21:57:11 +05307#include <elog.h>
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +01008#include <smbios.h>
9#include <string.h>
Duncan Laurie5c026442016-05-11 14:05:07 -070010#include "chip.h"
Karthikeyan Ramasubramanianfd5d7882019-05-29 15:09:42 -060011#include "drivers/wifi/generic_wifi.h"
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010012
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053013#define PMCS_DR 0xcc
14#define PME_STS (1 << 15)
15
Julius Wernercd49cce2019-03-05 16:53:33 -080016#if CONFIG(GENERATE_SMBIOS_TABLES)
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010017static int smbios_write_wifi(struct device *dev, int *handle,
18 unsigned long *current)
19{
20 struct smbios_type_intel_wifi {
21 u8 type;
22 u8 length;
23 u16 handle;
24 u8 str;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +030025 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +020026 } __packed;
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010027
Duncan Laurie5c026442016-05-11 14:05:07 -070028 struct smbios_type_intel_wifi *t =
29 (struct smbios_type_intel_wifi *)*current;
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010030 int len = sizeof(struct smbios_type_intel_wifi);
31
32 memset(t, 0, sizeof(struct smbios_type_intel_wifi));
33 t->type = 0x85;
34 t->length = len - 2;
35 t->handle = *handle;
Duncan Laurie5c026442016-05-11 14:05:07 -070036 /*
37 * Intel wifi driver expects this string to be in the table 0x85
38 * with PCI IDs enumerated below.
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010039 */
40 t->str = smbios_add_string(t->eos, "KHOIHGIUCCHHII");
41
42 len = t->length + smbios_string_table_len(t->eos);
43 *current += len;
44 *handle += 1;
45 return len;
46}
Kyösti Mälkki828e73e2016-07-28 17:26:39 +030047#endif
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010048
Julius Wernercd49cce2019-03-05 16:53:33 -080049#if CONFIG(HAVE_ACPI_TABLES)
Furquan Shaikh7536a392020-04-24 21:59:21 -070050static void intel_wifi_fill_ssdt(const struct device *dev)
Duncan Laurie5c026442016-05-11 14:05:07 -070051{
52 struct drivers_intel_wifi_config *config = dev->chip_info;
Karthikeyan Ramasubramanianfd5d7882019-05-29 15:09:42 -060053 struct generic_wifi_config generic_config;
Duncan Laurie5c026442016-05-11 14:05:07 -070054
Karthikeyan Ramasubramanianfd5d7882019-05-29 15:09:42 -060055 if (config) {
56 generic_config.wake = config->wake;
57 /* By default, all intel wifi chips wake from S3 */
58 generic_config.maxsleep = 3;
Duncan Laurie5c026442016-05-11 14:05:07 -070059 }
Karthikeyan Ramasubramanianfd5d7882019-05-29 15:09:42 -060060 generic_wifi_fill_ssdt(dev, config ? &generic_config : NULL);
Duncan Laurie5c026442016-05-11 14:05:07 -070061}
62#endif
63
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053064static void wifi_pci_dev_init(struct device *dev)
65{
66 pci_dev_init(dev);
67
Julius Wernercd49cce2019-03-05 16:53:33 -080068 if (CONFIG(ELOG)) {
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053069 uint32_t val;
70 val = pci_read_config16(dev, PMCS_DR);
71 if (val & PME_STS)
72 elog_add_event_wake(ELOG_WAKE_SOURCE_PME_WIFI, 0);
Elyes HAOUAS88607a42018-10-05 10:36:45 +020073 }
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053074}
75
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010076static struct pci_operations pci_ops = {
77 .set_subsystem = pci_dev_set_subsystem,
78};
79
80struct device_operations device_ops = {
Nico Huber68680dd2020-03-31 17:34:52 +020081 .read_resources = pci_dev_read_resources,
82 .set_resources = pci_dev_set_resources,
83 .enable_resources = pci_dev_enable_resources,
84 .init = wifi_pci_dev_init,
Julius Wernercd49cce2019-03-05 16:53:33 -080085#if CONFIG(GENERATE_SMBIOS_TABLES)
Nico Huber68680dd2020-03-31 17:34:52 +020086 .get_smbios_data = smbios_write_wifi,
Kyösti Mälkki828e73e2016-07-28 17:26:39 +030087#endif
Nico Huber68680dd2020-03-31 17:34:52 +020088 .ops_pci = &pci_ops,
Julius Wernercd49cce2019-03-05 16:53:33 -080089#if CONFIG(HAVE_ACPI_TABLES)
Nico Huber68680dd2020-03-31 17:34:52 +020090 .acpi_name = generic_wifi_acpi_name,
91 .acpi_fill_ssdt = intel_wifi_fill_ssdt,
Duncan Laurie5c026442016-05-11 14:05:07 -070092#endif
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010093};
94
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010095static const unsigned short pci_device_ids[] = {
Subrata Banikf9529832018-03-22 05:25:45 +053096 PCI_DEVICE_ID_1000_SERIES_WIFI,
97 PCI_DEVICE_ID_6005_SERIES_WIFI,
98 PCI_DEVICE_ID_6005_I_SERIES_WIFI,
99 PCI_DEVICE_ID_1030_SERIES_WIFI,
100 PCI_DEVICE_ID_6030_I_SERIES_WIFI,
101 PCI_DEVICE_ID_6030_SERIES_WIFI,
102 PCI_DEVICE_ID_6150_SERIES_WIFI,
103 PCI_DEVICE_ID_2030_SERIES_WIFI,
104 PCI_DEVICE_ID_2000_SERIES_WIFI,
105 PCI_DEVICE_ID_0135_SERIES_WIFI,
106 PCI_DEVICE_ID_0105_SERIES_WIFI,
107 PCI_DEVICE_ID_6035_SERIES_WIFI,
108 PCI_DEVICE_ID_5300_SERIES_WIFI,
109 PCI_DEVICE_ID_5100_SERIES_WIFI,
110 PCI_DEVICE_ID_6000_SERIES_WIFI,
111 PCI_DEVICE_ID_6000_I_SERIES_WIFI,
112 PCI_DEVICE_ID_5350_SERIES_WIFI,
113 PCI_DEVICE_ID_5150_SERIES_WIFI,
114 /* Wilkins Peak 2 */
115 PCI_DEVICE_ID_WP_7260_SERIES_1_WIFI,
116 PCI_DEVICE_ID_WP_7260_SERIES_2_WIFI,
117 /* Stone Peak 2 */
118 PCI_DEVICE_ID_SP_7265_SERIES_1_WIFI,
119 PCI_DEVICE_ID_SP_7265_SERIES_2_WIFI,
Subrata Banik4530af22018-09-28 22:43:10 +0530120 /* Stone Field Peak */
121 PCI_DEVICE_ID_SFP_8260_SERIES_1_WIFI,
122 PCI_DEVICE_ID_SFP_8260_SERIES_2_WIFI,
123 /* Windstorm Peak */
124 PCI_DEVICE_ID_WSP_8275_SERIES_1_WIFI,
Subrata Banikf9529832018-03-22 05:25:45 +0530125 /* Jefferson Peak */
126 PCI_DEVICE_ID_JP_9000_SERIES_1_WIFI,
127 PCI_DEVICE_ID_JP_9000_SERIES_2_WIFI,
128 PCI_DEVICE_ID_JP_9000_SERIES_3_WIFI,
Furquan Shaikh39130a42018-05-30 19:57:14 -0700129 /* Thunder Peak 2 */
130 PCI_DEVICE_ID_TP_9260_SERIES_WIFI,
Subrata Banikf9529832018-03-22 05:25:45 +0530131 /* Harrison Peak */
132 PCI_DEVICE_ID_HrP_9560_SERIES_1_WIFI,
133 PCI_DEVICE_ID_HrP_9560_SERIES_2_WIFI,
Subrata Banik71da5fe2019-02-19 12:11:26 +0530134 PCI_DEVICE_ID_HrP_9560_SERIES_3_WIFI,
Subrata Banik13f53602019-03-28 10:35:30 +0530135 PCI_DEVICE_ID_HrP_9560_SERIES_4_WIFI,
Subrata Banikb98c8962020-04-06 12:08:01 +0530136 PCI_DEVICE_ID_HrP_6SERIES_WIFI,
137 /* Cyclone Peak */
138 PCI_DEVICE_ID_CyP_6SERIES_WIFI,
139 /* Typhoon Peak */
140 PCI_DEVICE_ID_TyP_6SERIES_WIFI,
141 /* Garfiled Peak */
142 PCI_DEVICE_ID_GrP_6SERIES_1_WIFI,
143 PCI_DEVICE_ID_GrP_6SERIES_2_WIFI,
Duncan Laurie5c026442016-05-11 14:05:07 -0700144 0
145};
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +0100146
147static const struct pci_driver pch_intel_wifi __pci_driver = {
148 .ops = &device_ops,
149 .vendor = PCI_VENDOR_ID_INTEL,
150 .devices = pci_device_ids,
151};
Duncan Laurie5c026442016-05-11 14:05:07 -0700152
153static void intel_wifi_enable(struct device *dev)
154{
155 dev->ops = &device_ops;
156}
157
158struct chip_operations drivers_intel_wifi_ops = {
159 CHIP_NAME("Intel WiFi")
Elyes HAOUAS2aa3b162018-11-27 17:02:10 +0100160 .enable_dev = intel_wifi_enable
Duncan Laurie5c026442016-05-11 14:05:07 -0700161};