coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
acpi.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <acpi/acpi_device.h>
4 #include <acpi/acpigen.h>
5 #include <acpi/acpigen_pci.h>
6 #include <console/console.h>
7 #include <device/pci_ids.h>
8 #include <sar.h>
9 #include <stdlib.h>
10 #include <wrdd.h>
11 
12 #include "chip.h"
13 #include "wifi.h"
14 #include "wifi_private.h"
15 
16 /* WIFI Domain type */
17 #define DOMAIN_TYPE_WIFI 0x7
18 
19 /* Maximum number DSM UUID bifurcations in _DSM */
20 #define MAX_DSM_FUNCS 2
21 
22 /*
23  * WIFI ACPI NAME = "WF" + hex value of last 8 bits of dev_path_encode + '\0'
24  * The above representation returns unique and consistent name every time
25  * generate_wifi_acpi_name is invoked. The last 8 bits of dev_path_encode is
26  * chosen since it contains the bus address of the device.
27  */
28 #define WIFI_ACPI_NAME_MAX_LEN 5
29 
30 /* Unique ID for the WIFI _DSM */
31 #define ACPI_DSM_OEM_WIFI_UUID "F21202BF-8F78-4DC6-A5B3-1F738E285ADE"
32 
33 /* ID for the Wifi DmaProperty _DSD */
34 #define ACPI_DSD_DMA_PROPERTY_UUID "70D24161-6DD5-4C9E-8070-705531292865"
35 
36 /* Unique ID for CnviDdrRfim entry in WIFI _DSM */
37 #define ACPI_DSM_RFIM_WIFI_UUID "7266172C-220B-4B29-814F-75E4DD26B5FD"
38 
40 {
41  return -1;
42 }
43 
44 /*
45  * Generate ACPI AML code for _DSM method.
46  * This function takes as input uuid for the device, set of callbacks and
47  * argument to pass into the callbacks. Callbacks should ensure that Local0 and
48  * Local1 are left untouched. Use of Local2-Local7 is permitted in callbacks.
49  */
50 void wifi_emit_dsm(struct dsm_profile *dsm);
51 
52 /*
53  * Function 1: Allow PC OEMs to set ETSI 5.8GHz SRD in Passive/Disabled ESTI SRD
54  * Channels: 149, 153, 157, 161, 165
55  * 0 - ETSI 5.8GHz SRD active scan
56  * 1 - ETSI 5.8GHz SRD passive scan
57  * 2 - ETSI 5.8GHz SRD disabled
58  */
60 {
61  struct dsm_profile *dsm_config = (struct dsm_profile *)args;
62 
64 }
65 
66 /*
67  * Function 2 : Supported Indonesia 5.15-5.35 GHz Band
68  * 0 - Set 5.115-5.35GHz to Disable in Indonesia
69  * 1 - Set 5.115-5.35GHz to Enable (Passive) in Indonesia
70  * 2 - Reserved
71  */
73 {
74  struct dsm_profile *dsm_config = (struct dsm_profile *)args;
75 
77 }
78 
79 /*
80  * Function 3: Support Wi-Fi 6 11ax Rev 2 new channels on 6-7 GHz.
81  * Bit 0:
82  * 0 - No override; use device settings 0
83  * 1 - Force disable all countries that are not defined in the following bits
84  *
85  * Bit 1:
86  * 0 No override; USA 6GHz disable 0
87  * 1 6GHz allowed in the USA (enabled only if the device is certified to the USA)
88  */
90 {
91  struct dsm_profile *dsm_config = (struct dsm_profile *)args;
92 
94 }
95 
96 /*
97  * Function 4: Regulatory Special Configurations Enablements
98  */
100 {
101  struct dsm_profile *dsm_config = (struct dsm_profile *)args;
102 
104 }
105 
106 /*
107  * Function 5: M.2 UART Interface Configuration
108  */
110 {
111  struct dsm_profile *dsm_config = (struct dsm_profile *)args;
112 
114 }
115 
116 /*
117  * Function 6: Control Enablement 11ax on certificated modules
118  * Bit 0 - Apply changes to country Ukraine. 11Ax Setting within module certification
119  * 0 - None. Work with Wi-Fi FW/OTP definitions [Default]
120  * 1 - Apply changes.
121  *
122  * Bit 1 - 11Ax Mode. Effective only if Bit 0 set to 1
123  * 0 - Disable 11Ax on country Ukraine [Default]
124  * 1 - Enable 11Ax on country Ukraine
125  *
126  * Bit 2 - Apply changes to country Russia. 11Ax Setting within module certification
127  * 0 - None. Work with Wi-Fi FW/OTP definitions [Default]
128  * 1 - Apply changes.
129  *
130  * Bit 3 - 11Ax Mode. Effective only if Bit 2 set to 1
131  * 0 - Disable 11Ax on country Russia [Default]
132  * 1 - Enable 11Ax on country Russia
133  *
134  * Bit 31:04 - Reserved
135  *
136  * Note: Assumed Russia Work with Wi-Fi FW/OTP definitions
137  */
139 {
140  struct dsm_profile *dsm_config = (struct dsm_profile *)args;
141 
143 }
144 
145 /*
146  * Function 7: Control Enablement UNII-4 over certificate modules
147  */
149 {
150  struct dsm_profile *dsm_config = (struct dsm_profile *)args;
151 
153 }
154 
155 static void wifi_dsm_ddrrfim_func3_cb(void *ptr)
156 {
157  const bool is_cnvi_ddr_rfim_enabled = *(bool *)ptr;
158  acpigen_write_return_integer(is_cnvi_ddr_rfim_enabled ? 1 : 0);
159 }
160 
161 static void (*wifi_dsm_callbacks[])(void *) = {
162  NULL, /* Function 0 */
163  wifi_dsm_srd_active_channels, /* Function 1 */
164  wifi_dsm_indonasia_5Ghz_band_enable, /* Function 2 */
165  wifi_dsm_supported_ultra_high_band, /* Function 3 */
166  wifi_dsm_regulatory_configurations, /* Function 4 */
167  wifi_dsm_uart_configurations, /* Function 5 */
168  wifi_dsm_ukrane_russia_11ax_enable, /* Function 6 */
169  wifi_dsm_unii4_control_enable, /* Function 7 */
170 };
171 
172 /*
173  * The current DSM2 table is only exporting one function (function 3), some more
174  * functions are reserved so marking them NULL.
175 */
176 static void (*wifi_dsm2_callbacks[])(void *) = {
177  NULL, /* Function 0 */
178  NULL, /* Function 1 */
179  NULL, /* Function 2 */
180  wifi_dsm_ddrrfim_func3_cb, /* Function 3 */
181 };
182 
183 void wifi_emit_dsm(struct dsm_profile *dsm)
184 {
185  int i;
187 
188  if (dsm == NULL)
189  return;
190 
191  for (i = 1; i < count; i++)
192  if (!(dsm->supported_functions & (1 << i)))
194 
196 }
197 
198 static const uint8_t *sar_fetch_set(const struct sar_profile *sar, size_t set_num)
199 {
200  const uint8_t *sar_table = &sar->sar_table[0];
201 
202  return sar_table + (sar->chains_count * sar->subbands_count * set_num);
203 }
204 
205 static const uint8_t *wgds_fetch_set(struct geo_profile *wgds, size_t set_num)
206 {
207  const uint8_t *wgds_table = &wgds->wgds_table[0];
208 
209  return wgds_table + (wgds->bands_count * set_num);
210 }
211 
212 static const uint8_t *ppag_fetch_set(struct gain_profile *ppag, size_t set_num)
213 {
214  const uint8_t *ppag_table = &ppag->ppag_table[0];
215 
216  return ppag_table + (ppag->bands_count * set_num);
217 }
218 
219 static void sar_emit_wrds(const struct sar_profile *sar)
220 {
221  int i;
222  size_t package_size, table_size;
223  const uint8_t *set;
224 
225  if (sar == NULL)
226  return;
227 
228  /*
229  * Name ("WRDS", Package () {
230  * Revision,
231  * Package () {
232  * Domain Type, // 0x7:WiFi
233  * WiFi SAR BIOS, // BIOS SAR Enable/disable
234  * SAR Table Set // Set#1 of SAR Table
235  * }
236  * })
237  */
238  if (sar->revision > MAX_SAR_REVISION) {
239  printk(BIOS_ERR, "Invalid SAR table revision: %d\n", sar->revision);
240  return;
241  }
242 
243  acpigen_write_name("WRDS");
246 
247  table_size = sar->chains_count * sar->subbands_count;
248  /* Emit 'Domain Type' + 'WiFi SAR Enable' + Set#1 */
249  package_size = 1 + 1 + table_size;
250  acpigen_write_package(package_size);
253 
254  set = sar_fetch_set(sar, 0);
255  for (i = 0; i < table_size; i++)
256  acpigen_write_byte(set[i]);
257 
260 }
261 
262 static void sar_emit_ewrd(const struct sar_profile *sar)
263 {
264  int i;
265  size_t package_size, set_num, table_size;
266  const uint8_t *set;
267 
268  if (sar == NULL)
269  return;
270 
271  /*
272  * Name ("EWRD", Package () {
273  * Revision,
274  * Package () {
275  * Domain Type, // 0x7:WiFi
276  * Dynamic SAR Enable, // Dynamic SAR Enable/disable
277  * Extended SAR sets, // Number of optional SAR table sets
278  * SAR Table Set, // Set#2 of SAR Table
279  * SAR Table Set, // Set#3 of SAR Table
280  * SAR Table Set // Set#4 of SAR Table
281  * }
282  * })
283  */
284  if (sar->revision > MAX_SAR_REVISION) {
285  printk(BIOS_ERR, "Invalid SAR table revision: %d\n", sar->revision);
286  return;
287  }
288 
289  if (sar->dsar_set_count == 0) {
290  printk(BIOS_WARNING, "DSAR set count is 0\n");
291  return;
292  }
293 
294  acpigen_write_name("EWRD");
297 
298  table_size = sar->chains_count * sar->subbands_count;
299  /*
300  * Emit 'Domain Type' + 'Dynamic SAR Enable' + 'Extended SAR sets count'
301  * + number of bytes for Set#2 & 3 & 4
302  */
303  package_size = 1 + 1 + 1 + table_size * MAX_DSAR_SET_COUNT;
304  acpigen_write_package(package_size);
308 
309  for (set_num = 1; set_num <= sar->dsar_set_count; set_num++) {
310  set = sar_fetch_set(sar, set_num);
311  for (i = 0; i < table_size; i++)
312  acpigen_write_byte(set[i]);
313  }
314 
315  /* wifi driver always expects 3 DSAR sets */
316  for (i = 0; i < (table_size * (MAX_DSAR_SET_COUNT - sar->dsar_set_count)); i++)
318 
321 }
322 
323 static void sar_emit_wgds(struct geo_profile *wgds)
324 {
325  int i;
326  size_t package_size, set_num;
327  const uint8_t *set;
328 
329  if (wgds == NULL)
330  return;
331 
332  /*
333  * Name ("WGDS", Package() {
334  * Revision,
335  * Package() {
336  * DomainType, // 0x7:WiFi
337  * WgdsWiFiSarDeltaGroup1PowerMax1, // Group 1 FCC 2400 Max
338  * WgdsWiFiSarDeltaGroup1PowerChainA1, // Group 1 FCC 2400 A Offset
339  * WgdsWiFiSarDeltaGroup1PowerChainB1, // Group 1 FCC 2400 B Offset
340  * WgdsWiFiSarDeltaGroup1PowerMax2, // Group 1 FCC 5200 Max
341  * WgdsWiFiSarDeltaGroup1PowerChainA2, // Group 1 FCC 5200 A Offset
342  * WgdsWiFiSarDeltaGroup1PowerChainB2, // Group 1 FCC 5200 B Offset
343  * WgdsWiFiSarDeltaGroup1PowerMax3, // Group 1 FCC 6000-7000 Max
344  * WgdsWiFiSarDeltaGroup1PowerChainA3, // Group 1 FCC 6000-7000 A Offset
345  * WgdsWiFiSarDeltaGroup1PowerChainB3, // Group 1 FCC 6000-7000 B Offset
346  * WgdsWiFiSarDeltaGroup2PowerMax1, // Group 2 EC Jap 2400 Max
347  * WgdsWiFiSarDeltaGroup2PowerChainA1, // Group 2 EC Jap 2400 A Offset
348  * WgdsWiFiSarDeltaGroup2PowerChainB1, // Group 2 EC Jap 2400 B Offset
349  * WgdsWiFiSarDeltaGroup2PowerMax2, // Group 2 EC Jap 5200 Max
350  * WgdsWiFiSarDeltaGroup2PowerChainA2, // Group 2 EC Jap 5200 A Offset
351  * WgdsWiFiSarDeltaGroup2PowerChainB2, // Group 2 EC Jap 5200 B Offset
352  * WgdsWiFiSarDeltaGroup2PowerMax3, // Group 2 EC Jap 6000-7000 Max
353  * WgdsWiFiSarDeltaGroup2PowerChainA3, // Group 2 EC Jap 6000-7000 A Offset
354  * WgdsWiFiSarDeltaGroup2PowerChainB3, // Group 2 EC Jap 6000-7000 B Offset
355  * WgdsWiFiSarDeltaGroup3PowerMax1, // Group 3 ROW 2400 Max
356  * WgdsWiFiSarDeltaGroup3PowerChainA1, // Group 3 ROW 2400 A Offset
357  * WgdsWiFiSarDeltaGroup3PowerChainB1, // Group 3 ROW 2400 B Offset
358  * WgdsWiFiSarDeltaGroup3PowerMax2, // Group 3 ROW 5200 Max
359  * WgdsWiFiSarDeltaGroup3PowerChainA2, // Group 3 ROW 5200 A Offset
360  * WgdsWiFiSarDeltaGroup3PowerChainB2, // Group 3 ROW 5200 B Offset
361  * WgdsWiFiSarDeltaGroup3PowerMax3, // Group 3 ROW 6000-7000 Max
362  * WgdsWiFiSarDeltaGroup3PowerChainA3, // Group 3 ROW 6000-7000 A Offset
363  * WgdsWiFiSarDeltaGroup3PowerChainB3, // Group 3 ROW 6000-7000 B Offset
364  * }
365  * })
366  */
367  if (wgds->revision > MAX_GEO_OFFSET_REVISION) {
368  printk(BIOS_ERR, "Invalid WGDS revision: %d\n", wgds->revision);
369  return;
370  }
371 
372  package_size = 1 + wgds->chains_count * wgds->bands_count;
373 
374  acpigen_write_name("WGDS");
377  /* Emit 'Domain Type' +
378  * Group specific delta of power (6 bytes * NUM_WGDS_SAR_GROUPS)
379  */
380  acpigen_write_package(package_size);
382 
383  for (set_num = 0; set_num < wgds->chains_count; set_num++) {
384  set = wgds_fetch_set(wgds, set_num);
385  for (i = 0; i < wgds->bands_count; i++)
386  acpigen_write_byte(set[i]);
387  }
388 
391 }
392 
393 static void sar_emit_ppag(struct gain_profile *ppag)
394 {
395  int i;
396  size_t package_size, set_num;
397  const uint8_t *set;
398 
399  if (ppag == NULL)
400  return;
401 
402  /*
403  * Name ("PPAG", Package () {
404  * Revision,
405  * Package () {
406  * Domain Type, // 0x7:WiFi
407  * PPAG Mode, // Defines the mode of ANT_gain control to be used
408  * ANT_gain Table Chain A // Defines the ANT_gain in dBi for chain A
409  * ANT_gain Table Chain B // Defines the ANT_gain in dBi for chain B
410  * }
411  * })
412  */
413  if (ppag->revision > MAX_ANT_GAINS_REVISION) {
414  printk(BIOS_ERR, "Invalid PPAG revision: %d\n", ppag->revision);
415  return;
416  }
417 
418  package_size = 1 + 1 + ppag->chains_count * ppag->bands_count;
419 
420  acpigen_write_name("PPAG");
423  acpigen_write_package(package_size);
425  acpigen_write_dword(ppag->mode);
426 
427  for (set_num = 0; set_num < ppag->chains_count; set_num++) {
428  set = ppag_fetch_set(ppag, set_num);
429  for (i = 0; i < ppag->bands_count; i++)
430  acpigen_write_byte(set[i]);
431  }
432 
435 }
436 
437 static void sar_emit_wtas(struct avg_profile *wtas)
438 {
439  int i;
440  size_t package_size;
441 
442  if (wtas == NULL)
443  return;
444 
445  /*
446  * Name (WTAS, Package() {
447  * {
448  * Revision,
449  * Package()
450  * {
451  * DomainType, // 0x7:WiFi
452  * WifiTASSelection, // Enable/Disable the TAS feature
453  * WifiTASListEntries, // No. of blocked countries not approved by OEM to
454  * BlockedListEntry1, support this feature
455  * BlockedListEntry2,
456  * BlockedListEntry3,
457  * BlockedListEntry4,
458  * BlockedListEntry5,
459  * BlockedListEntry6,
460  * BlockedListEntry7,
461  * BlockedListEntry8,
462  * BlockedListEntry9,
463  * BlockedListEntry10,
464  * BlockedListEntry11,
465  * BlockedListEntry12,
466  * BlockedListEntry13,
467  * BlockedListEntry14,
468  * BlockedListEntry15,
469  * BlockedListEntry16,
470  * }
471  * })
472  */
473  package_size = 1 + 1 + 1 + MAX_DENYLIST_ENTRY;
474 
475  acpigen_write_name("WTAS");
478  acpigen_write_package(package_size);
482  for (i = 0; i < MAX_DENYLIST_ENTRY; i++)
484 
487 }
488 
489 static void emit_sar_acpi_structures(const struct device *dev, struct dsm_profile *dsm)
490 {
491  union wifi_sar_limits sar_limits = {{NULL, NULL, NULL, NULL, NULL} };
492 
493  /*
494  * If device type is PCI, ensure that the device has Intel vendor ID. CBFS SAR and SAR
495  * ACPI tables are currently used only by Intel WiFi devices.
496  */
497  if (dev->path.type == DEVICE_PATH_PCI && dev->vendor != PCI_VID_INTEL)
498  return;
499 
500  /* Retrieve the sar limits data */
501  if (get_wifi_sar_limits(&sar_limits) < 0) {
502  printk(BIOS_ERR, "failed getting SAR limits!\n");
503  return;
504  }
505 
506  sar_emit_wrds(sar_limits.sar);
507  sar_emit_ewrd(sar_limits.sar);
508  sar_emit_wgds(sar_limits.wgds);
509  sar_emit_ppag(sar_limits.ppag);
510  sar_emit_wtas(sar_limits.wtas);
511 
512  /* copy the dsm data to be later used for creating _DSM function */
513  if (sar_limits.dsm != NULL)
514  memcpy(dsm, &sar_limits.dsm, sizeof(struct dsm_profile));
515 
516  free(sar_limits.sar);
517 }
518 
519 static void wifi_ssdt_write_device(const struct device *dev, const char *path)
520 {
521  /* Device */
522  acpigen_write_device(path);
524 
525  if (dev->chip_ops)
526  acpigen_write_name_string("_DDN", dev->chip_ops->name);
527 
528  /* Address */
530 
531  acpigen_pop_len(); /* Device */
532 }
533 
534 static void wifi_ssdt_write_properties(const struct device *dev, const char *scope)
535 {
536  const struct drivers_wifi_generic_config *config = dev->chip_info;
537 
538  bool is_cnvi_ddr_rfim_enabled = config && config->enable_cnvi_ddr_rfim;
539 
540  /* Scope */
541  acpigen_write_scope(scope);
542 
543  if (dev->path.type == DEVICE_PATH_GENERIC) {
544  if (config) {
545  /* Wake capabilities */
547 
548  /* Add _DSD for DmaProperty property. */
549  if (config->is_untrusted) {
550  struct acpi_dp *dsd, *pkg;
551 
552  dsd = acpi_dp_new_table("_DSD");
554  acpi_dp_add_integer(pkg, "DmaProperty", 1);
555  acpi_dp_add_package(dsd, pkg);
556  acpi_dp_write(dsd);
557  }
558  }
559  }
560 
561  /* Fill regulatory domain structure */
562  if (CONFIG(HAVE_REGULATORY_DOMAIN)) {
563  /*
564  * Name ("WRDD", Package () {
565  * WRDD_REVISION, // Revision
566  * Package () {
567  * DOMAIN_TYPE_WIFI, // Domain Type, 7:WiFi
568  * wifi_regulatory_domain() // Country Identifier
569  * }
570  * })
571  */
572  acpigen_write_name("WRDD");
578  acpigen_pop_len();
579  acpigen_pop_len();
580  }
581 
582  struct dsm_uuid dsm_ids[MAX_DSM_FUNCS];
583  /* We will need a copy dsm data to be used later for creating _DSM function */
584  struct dsm_profile dsm = {0};
585  uint8_t dsm_count = 0;
586 
587  /* Fill Wifi sar related ACPI structures */
588  if (CONFIG(USE_SAR)) {
589  emit_sar_acpi_structures(dev, &dsm);
590 
591  if (dsm.supported_functions != 0) {
592  for (int i = 1; i < ARRAY_SIZE(wifi_dsm_callbacks); i++)
593  if (!(dsm.supported_functions & (1 << i)))
595 
596  dsm_ids[dsm_count].uuid = ACPI_DSM_OEM_WIFI_UUID;
597  dsm_ids[dsm_count].callbacks = &wifi_dsm_callbacks[0];
598  dsm_ids[dsm_count].count = ARRAY_SIZE(wifi_dsm_callbacks);
599  dsm_ids[dsm_count].arg = NULL;
600  dsm_count++;
601  }
602  }
603 
604  if (is_cnvi_ddr_rfim_enabled) {
605  dsm_ids[dsm_count].uuid = ACPI_DSM_RFIM_WIFI_UUID;
606  dsm_ids[dsm_count].callbacks = &wifi_dsm2_callbacks[0];
607  dsm_ids[dsm_count].count = ARRAY_SIZE(wifi_dsm2_callbacks);
608  dsm_ids[dsm_count].arg = &is_cnvi_ddr_rfim_enabled;
609  dsm_count++;
610  }
611 
612  acpigen_write_dsm_uuid_arr(dsm_ids, dsm_count);
613 
614  acpigen_pop_len(); /* Scope */
615 
616  printk(BIOS_INFO, "%s: %s %s\n", scope, dev->chip_ops ? dev->chip_ops->name : "",
617  dev_path(dev));
618 }
619 
620 void wifi_pcie_fill_ssdt(const struct device *dev)
621 {
622  const char *path;
623 
624  path = acpi_device_path(dev);
625  if (!path)
626  return;
627 
628  wifi_ssdt_write_device(dev, path);
629  const struct device *child = dev->link_list->children;
630  if (child && child->path.type == DEVICE_PATH_GENERIC)
632 }
633 
634 const char *wifi_pcie_acpi_name(const struct device *dev)
635 {
636  static char wifi_acpi_name[WIFI_ACPI_NAME_MAX_LEN];
637 
638  /* ACPI 6.3, ASL 20.2.2: (Name Objects Encoding). */
639  snprintf(wifi_acpi_name, sizeof(wifi_acpi_name), "WF%02X",
640  (dev_path_encode(dev) & 0xff));
641  return wifi_acpi_name;
642 }
643 
644 void wifi_cnvi_fill_ssdt(const struct device *dev)
645 {
646  const char *path;
647  if (!dev)
648  return;
649 
650  path = acpi_device_path(dev->bus->dev);
651  if (!path)
652  return;
653 
655 }
void acpi_device_write_uid(const struct device *dev)
Definition: device.c:203
struct acpi_dp * acpi_dp_add_package(struct acpi_dp *dp, struct acpi_dp *package)
Definition: device.c:1036
const char * acpi_device_path(const struct device *dev)
Definition: device.c:144
struct acpi_dp * acpi_dp_add_integer(struct acpi_dp *dp, const char *name, uint64_t value)
Definition: device.c:977
void acpi_dp_write(struct acpi_dp *table)
Definition: device.c:898
struct acpi_dp * acpi_dp_new_table(const char *name)
Definition: device.c:930
void acpigen_write_dword(unsigned int data)
Definition: acpigen.c:108
void acpigen_write_return_integer(uint64_t arg)
Definition: acpigen.c:1583
void acpigen_write_integer(uint64_t data)
Definition: acpigen.c:136
void acpigen_write_PRW(u32 wake, u32 level)
Definition: acpigen.c:929
void acpigen_pop_len(void)
Definition: acpigen.c:37
void acpigen_write_scope(const char *name)
Definition: acpigen.c:326
void acpigen_write_dsm_uuid_arr(struct dsm_uuid *ids, size_t count)
Definition: acpigen.c:1742
char * acpigen_write_package(int nr_el)
Definition: acpigen.c:86
void acpigen_write_dsm(const char *uuid, void(**callbacks)(void *), size_t count, void *arg)
Definition: acpigen.c:1629
void acpigen_write_word(unsigned int data)
Definition: acpigen.c:102
void acpigen_write_byte(unsigned int data)
Definition: acpigen.c:96
void acpigen_write_device(const char *name)
Definition: acpigen.c:769
void acpigen_write_name(const char *name)
Definition: acpigen.c:320
void acpigen_write_name_string(const char *name, const char *string)
Definition: acpigen.c:176
void acpigen_write_ADR_pci_device(const struct device *dev)
Definition: acpigen_pci.c:22
void * memcpy(void *dest, const void *src, size_t n)
Definition: memcpy.c:7
#define ARRAY_SIZE(a)
Definition: helpers.h:12
struct @413::@414 args
#define printk(level,...)
Definition: stdlib.h:16
u32 dev_path_encode(const struct device *dev)
Encode the device path into 3 bytes for logging to CMOS.
Definition: device_util.c:83
const char * dev_path(const struct device *dev)
Definition: device_util.c:149
#define ACPI_DSD_DMA_PROPERTY_UUID
Definition: acpi.c:34
static const uint8_t * sar_fetch_set(const struct sar_profile *sar, size_t set_num)
Definition: acpi.c:198
static const uint8_t * wgds_fetch_set(struct geo_profile *wgds, size_t set_num)
Definition: acpi.c:205
static void(* wifi_dsm2_callbacks[])(void *)
Definition: acpi.c:176
static void wifi_dsm_unii4_control_enable(void *args)
Definition: acpi.c:148
static void wifi_dsm_supported_ultra_high_band(void *args)
Definition: acpi.c:89
__weak int get_wifi_sar_limits(union wifi_sar_limits *sar_limits)
Definition: acpi.c:39
void wifi_cnvi_fill_ssdt(const struct device *dev)
Definition: acpi.c:644
static void sar_emit_ewrd(const struct sar_profile *sar)
Definition: acpi.c:262
static void wifi_dsm_uart_configurations(void *args)
Definition: acpi.c:109
const char * wifi_pcie_acpi_name(const struct device *dev)
Definition: acpi.c:634
static void wifi_dsm_ddrrfim_func3_cb(void *ptr)
Definition: acpi.c:155
static void wifi_ssdt_write_properties(const struct device *dev, const char *scope)
Definition: acpi.c:534
void wifi_pcie_fill_ssdt(const struct device *dev)
Definition: acpi.c:620
static void wifi_dsm_srd_active_channels(void *args)
Definition: acpi.c:59
static void wifi_dsm_indonasia_5Ghz_band_enable(void *args)
Definition: acpi.c:72
static void wifi_dsm_regulatory_configurations(void *args)
Definition: acpi.c:99
#define ACPI_DSM_OEM_WIFI_UUID
Definition: acpi.c:31
void wifi_emit_dsm(struct dsm_profile *dsm)
Definition: acpi.c:183
#define ACPI_DSM_RFIM_WIFI_UUID
Definition: acpi.c:37
static void sar_emit_wrds(const struct sar_profile *sar)
Definition: acpi.c:219
#define WIFI_ACPI_NAME_MAX_LEN
Definition: acpi.c:28
static void wifi_dsm_ukrane_russia_11ax_enable(void *args)
Definition: acpi.c:138
static void sar_emit_ppag(struct gain_profile *ppag)
Definition: acpi.c:393
#define DOMAIN_TYPE_WIFI
Definition: acpi.c:17
#define MAX_DSM_FUNCS
Definition: acpi.c:20
static void(* wifi_dsm_callbacks[])(void *)
Definition: acpi.c:161
static void sar_emit_wtas(struct avg_profile *wtas)
Definition: acpi.c:437
static const uint8_t * ppag_fetch_set(struct gain_profile *ppag, size_t set_num)
Definition: acpi.c:212
static void sar_emit_wgds(struct geo_profile *wgds)
Definition: acpi.c:323
static void wifi_ssdt_write_device(const struct device *dev, const char *path)
Definition: acpi.c:519
static void emit_sar_acpi_structures(const struct device *dev, struct dsm_profile *dsm)
Definition: acpi.c:489
@ CONFIG
Definition: dsi_common.h:201
@ ACPI_S3
Definition: acpi.h:1383
void acpigen_write_package_end(void)
Definition: acpigen.h:313
void free(void *ptr)
Definition: malloc.c:67
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
#define BIOS_WARNING
BIOS_WARNING - Bad configuration.
Definition: loglevel.h:86
enum board_config config
Definition: memory.c:448
@ DEVICE_PATH_PCI
Definition: path.h:9
@ DEVICE_PATH_GENERIC
Definition: path.h:18
#define PCI_VID_INTEL
Definition: pci_ids.h:2157
#define MAX_DSAR_SET_COUNT
Definition: sar.h:9
#define MAX_SAR_REVISION
Definition: sar.h:12
#define MAX_GEO_OFFSET_REVISION
Definition: sar.h:10
#define MAX_ANT_GAINS_REVISION
Definition: sar.h:7
#define MAX_DENYLIST_ENTRY
Definition: sar.h:8
const struct smm_save_state_ops *legacy_ops __weak
Definition: save_state.c:8
#define NULL
Definition: stddef.h:19
unsigned char uint8_t
Definition: stdint.h:8
uint16_t deny_list_entry[MAX_DENYLIST_ENTRY]
Definition: sar.h:47
uint8_t tas_selection
Definition: sar.h:45
uint8_t tas_list_size
Definition: sar.h:46
uint8_t revision
Definition: sar.h:44
DEVTREE_CONST struct device * children
Definition: device.h:79
DEVTREE_CONST struct device * dev
Definition: device.h:78
const char * name
Definition: device.h:29
enum device_path_type type
Definition: path.h:114
Definition: device.h:107
struct chip_operations * chip_ops
Definition: device.h:144
unsigned int vendor
Definition: device.h:116
struct device_path path
Definition: device.h:115
DEVTREE_CONST struct bus * bus
Definition: device.h:108
DEVTREE_CONST struct bus * link_list
Definition: device.h:139
DEVTREE_CONST void * chip_info
Definition: device.h:164
struct drivers_wifi_generic_config - Data structure to contain generic wifi config @wake: Wake pin fo...
Definition: chip.h:10
uint32_t enablement_11ax
Definition: sar.h:57
uint32_t disable_active_sdr_channels
Definition: sar.h:52
uint32_t support_indonesia_5g_band
Definition: sar.h:53
uint32_t uart_configurations
Definition: sar.h:56
uint32_t unii_4
Definition: sar.h:58
uint32_t support_ultra_high_band
Definition: sar.h:54
uint32_t supported_functions
Definition: sar.h:51
uint32_t regulatory_configurations
Definition: sar.h:55
void * arg
Definition: acpigen.h:231
const char * uuid
Definition: acpigen.h:228
size_t count
Definition: acpigen.h:230
void(** callbacks)(void *)
Definition: acpigen.h:229
uint8_t revision
Definition: sar.h:36
uint8_t bands_count
Definition: sar.h:39
uint8_t ppag_table[0]
Definition: sar.h:40
uint8_t mode
Definition: sar.h:37
uint8_t chains_count
Definition: sar.h:38
uint8_t chains_count
Definition: sar.h:22
uint8_t bands_count
Definition: sar.h:23
uint8_t revision
Definition: sar.h:21
uint8_t wgds_table[0]
Definition: sar.h:24
uint8_t subbands_count
Definition: sar.h:31
uint8_t revision
Definition: sar.h:28
uint8_t dsar_set_count
Definition: sar.h:29
uint8_t chains_count
Definition: sar.h:30
uint8_t sar_table[0]
Definition: sar.h:32
struct sar_profile * sar
Definition: sar.h:70
struct avg_profile * wtas
Definition: sar.h:73
struct geo_profile * wgds
Definition: sar.h:71
struct gain_profile * ppag
Definition: sar.h:72
struct dsm_profile * dsm
Definition: sar.h:74
#define count
int snprintf(char *buf, size_t size, const char *fmt,...)
Note: This file is only for POSIX compatibility, and is meant to be chain-included via string....
Definition: vsprintf.c:35
uint16_t wifi_regulatory_domain(void)
Definition: wrdd.c:5
#define WRDD_REVISION
Definition: wrdd.h:8
typedef void(X86APIP X86EMU_intrFuncs)(int num)