blob: c3e551a7b9be54ea7b84fd11a315cd7ee3d58236 [file] [log] [blame]
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +01001/*
2 * This file is part of the coreboot project.
3 *
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +01004 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 2 or (at your option)
7 * any later version of the License.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010013 */
14
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010015#include <device/device.h>
16#include <device/pci.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +020017#include <device/pci_ops.h>
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010018#include <device/pci_ids.h>
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053019#include <elog.h>
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010020#include <smbios.h>
21#include <string.h>
Duncan Laurie5c026442016-05-11 14:05:07 -070022#include "chip.h"
Karthikeyan Ramasubramanianfd5d7882019-05-29 15:09:42 -060023#include "drivers/wifi/generic_wifi.h"
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010024
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053025#define PMCS_DR 0xcc
26#define PME_STS (1 << 15)
27
Julius Wernercd49cce2019-03-05 16:53:33 -080028#if CONFIG(GENERATE_SMBIOS_TABLES)
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010029static int smbios_write_wifi(struct device *dev, int *handle,
30 unsigned long *current)
31{
32 struct smbios_type_intel_wifi {
33 u8 type;
34 u8 length;
35 u16 handle;
36 u8 str;
Konstantin Aladyshevd0df1d72017-08-01 15:52:46 +030037 u8 eos[2];
Stefan Reinauer6a001132017-07-13 02:20:27 +020038 } __packed;
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010039
Duncan Laurie5c026442016-05-11 14:05:07 -070040 struct smbios_type_intel_wifi *t =
41 (struct smbios_type_intel_wifi *)*current;
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010042 int len = sizeof(struct smbios_type_intel_wifi);
43
44 memset(t, 0, sizeof(struct smbios_type_intel_wifi));
45 t->type = 0x85;
46 t->length = len - 2;
47 t->handle = *handle;
Duncan Laurie5c026442016-05-11 14:05:07 -070048 /*
49 * Intel wifi driver expects this string to be in the table 0x85
50 * with PCI IDs enumerated below.
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010051 */
52 t->str = smbios_add_string(t->eos, "KHOIHGIUCCHHII");
53
54 len = t->length + smbios_string_table_len(t->eos);
55 *current += len;
56 *handle += 1;
57 return len;
58}
Kyösti Mälkki828e73e2016-07-28 17:26:39 +030059#endif
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010060
Julius Wernercd49cce2019-03-05 16:53:33 -080061#if CONFIG(HAVE_ACPI_TABLES)
Duncan Laurie5c026442016-05-11 14:05:07 -070062static void intel_wifi_fill_ssdt(struct device *dev)
63{
64 struct drivers_intel_wifi_config *config = dev->chip_info;
Karthikeyan Ramasubramanianfd5d7882019-05-29 15:09:42 -060065 struct generic_wifi_config generic_config;
Duncan Laurie5c026442016-05-11 14:05:07 -070066
Karthikeyan Ramasubramanianfd5d7882019-05-29 15:09:42 -060067 if (config) {
68 generic_config.wake = config->wake;
69 /* By default, all intel wifi chips wake from S3 */
70 generic_config.maxsleep = 3;
Duncan Laurie5c026442016-05-11 14:05:07 -070071 }
Karthikeyan Ramasubramanianfd5d7882019-05-29 15:09:42 -060072 generic_wifi_fill_ssdt(dev, config ? &generic_config : NULL);
Duncan Laurie5c026442016-05-11 14:05:07 -070073}
74#endif
75
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053076static void wifi_pci_dev_init(struct device *dev)
77{
78 pci_dev_init(dev);
79
Julius Wernercd49cce2019-03-05 16:53:33 -080080 if (CONFIG(ELOG)) {
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053081 uint32_t val;
82 val = pci_read_config16(dev, PMCS_DR);
83 if (val & PME_STS)
84 elog_add_event_wake(ELOG_WAKE_SOURCE_PME_WIFI, 0);
Elyes HAOUAS88607a42018-10-05 10:36:45 +020085 }
Naresh G Solanki3c6377f2017-07-03 21:57:11 +053086}
87
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +010088static struct pci_operations pci_ops = {
89 .set_subsystem = pci_dev_set_subsystem,
90};
91
92struct device_operations device_ops = {
Nico Huber68680dd2020-03-31 17:34:52 +020093 .read_resources = pci_dev_read_resources,
94 .set_resources = pci_dev_set_resources,
95 .enable_resources = pci_dev_enable_resources,
96 .init = wifi_pci_dev_init,
Julius Wernercd49cce2019-03-05 16:53:33 -080097#if CONFIG(GENERATE_SMBIOS_TABLES)
Nico Huber68680dd2020-03-31 17:34:52 +020098 .get_smbios_data = smbios_write_wifi,
Kyösti Mälkki828e73e2016-07-28 17:26:39 +030099#endif
Nico Huber68680dd2020-03-31 17:34:52 +0200100 .ops_pci = &pci_ops,
Julius Wernercd49cce2019-03-05 16:53:33 -0800101#if CONFIG(HAVE_ACPI_TABLES)
Nico Huber68680dd2020-03-31 17:34:52 +0200102 .acpi_name = generic_wifi_acpi_name,
103 .acpi_fill_ssdt = intel_wifi_fill_ssdt,
Duncan Laurie5c026442016-05-11 14:05:07 -0700104#endif
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +0100105};
106
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +0100107static const unsigned short pci_device_ids[] = {
Subrata Banikf9529832018-03-22 05:25:45 +0530108 PCI_DEVICE_ID_1000_SERIES_WIFI,
109 PCI_DEVICE_ID_6005_SERIES_WIFI,
110 PCI_DEVICE_ID_6005_I_SERIES_WIFI,
111 PCI_DEVICE_ID_1030_SERIES_WIFI,
112 PCI_DEVICE_ID_6030_I_SERIES_WIFI,
113 PCI_DEVICE_ID_6030_SERIES_WIFI,
114 PCI_DEVICE_ID_6150_SERIES_WIFI,
115 PCI_DEVICE_ID_2030_SERIES_WIFI,
116 PCI_DEVICE_ID_2000_SERIES_WIFI,
117 PCI_DEVICE_ID_0135_SERIES_WIFI,
118 PCI_DEVICE_ID_0105_SERIES_WIFI,
119 PCI_DEVICE_ID_6035_SERIES_WIFI,
120 PCI_DEVICE_ID_5300_SERIES_WIFI,
121 PCI_DEVICE_ID_5100_SERIES_WIFI,
122 PCI_DEVICE_ID_6000_SERIES_WIFI,
123 PCI_DEVICE_ID_6000_I_SERIES_WIFI,
124 PCI_DEVICE_ID_5350_SERIES_WIFI,
125 PCI_DEVICE_ID_5150_SERIES_WIFI,
126 /* Wilkins Peak 2 */
127 PCI_DEVICE_ID_WP_7260_SERIES_1_WIFI,
128 PCI_DEVICE_ID_WP_7260_SERIES_2_WIFI,
129 /* Stone Peak 2 */
130 PCI_DEVICE_ID_SP_7265_SERIES_1_WIFI,
131 PCI_DEVICE_ID_SP_7265_SERIES_2_WIFI,
Subrata Banik4530af22018-09-28 22:43:10 +0530132 /* Stone Field Peak */
133 PCI_DEVICE_ID_SFP_8260_SERIES_1_WIFI,
134 PCI_DEVICE_ID_SFP_8260_SERIES_2_WIFI,
135 /* Windstorm Peak */
136 PCI_DEVICE_ID_WSP_8275_SERIES_1_WIFI,
Subrata Banikf9529832018-03-22 05:25:45 +0530137 /* Jefferson Peak */
138 PCI_DEVICE_ID_JP_9000_SERIES_1_WIFI,
139 PCI_DEVICE_ID_JP_9000_SERIES_2_WIFI,
140 PCI_DEVICE_ID_JP_9000_SERIES_3_WIFI,
Furquan Shaikh39130a42018-05-30 19:57:14 -0700141 /* Thunder Peak 2 */
142 PCI_DEVICE_ID_TP_9260_SERIES_WIFI,
Subrata Banikf9529832018-03-22 05:25:45 +0530143 /* Harrison Peak */
144 PCI_DEVICE_ID_HrP_9560_SERIES_1_WIFI,
145 PCI_DEVICE_ID_HrP_9560_SERIES_2_WIFI,
Subrata Banik71da5fe2019-02-19 12:11:26 +0530146 PCI_DEVICE_ID_HrP_9560_SERIES_3_WIFI,
Subrata Banik13f53602019-03-28 10:35:30 +0530147 PCI_DEVICE_ID_HrP_9560_SERIES_4_WIFI,
Subrata Banikb98c8962020-04-06 12:08:01 +0530148 PCI_DEVICE_ID_HrP_6SERIES_WIFI,
149 /* Cyclone Peak */
150 PCI_DEVICE_ID_CyP_6SERIES_WIFI,
151 /* Typhoon Peak */
152 PCI_DEVICE_ID_TyP_6SERIES_WIFI,
153 /* Garfiled Peak */
154 PCI_DEVICE_ID_GrP_6SERIES_1_WIFI,
155 PCI_DEVICE_ID_GrP_6SERIES_2_WIFI,
Duncan Laurie5c026442016-05-11 14:05:07 -0700156 0
157};
Vladimir Serbinenko41f55b72014-10-31 09:10:16 +0100158
159static const struct pci_driver pch_intel_wifi __pci_driver = {
160 .ops = &device_ops,
161 .vendor = PCI_VENDOR_ID_INTEL,
162 .devices = pci_device_ids,
163};
Duncan Laurie5c026442016-05-11 14:05:07 -0700164
165static void intel_wifi_enable(struct device *dev)
166{
167 dev->ops = &device_ops;
168}
169
170struct chip_operations drivers_intel_wifi_ops = {
171 CHIP_NAME("Intel WiFi")
Elyes HAOUAS2aa3b162018-11-27 17:02:10 +0100172 .enable_dev = intel_wifi_enable
Duncan Laurie5c026442016-05-11 14:05:07 -0700173};