coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
acpi_pirq_gen.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <acpi/acpigen.h>
4 #include <acpi/acpigen_pci.h>
5 #include <device/pci_def.h>
6 #include <device/pci_ops.h>
7 
8 #include "acpi_pirq_gen.h"
9 
10 static void gen_apic_route(const struct slot_pin_irq_map *pin_irq_map,
11  unsigned int map_count)
12 {
13  for (unsigned int i = 0; i < map_count; i++)
14  /*
15  * The reason for subtracting PCI_INT_A from the pin given is
16  * that PCI defines pins as 1-4, and _PRT uses 0-3.
17  */
18  acpigen_write_PRT_GSI_entry(pin_irq_map[i].slot,
19  pin_irq_map[i].pin - PCI_INT_A,
20  pin_irq_map[i].apic_gsi);
21 }
22 
23 static void gen_pic_route(const struct slot_pin_irq_map *pin_irq_map,
24  unsigned int map_count,
25  const struct pic_pirq_map *pirq_map)
26 {
27  for (unsigned int i = 0; i < map_count; i++) {
28  const enum pirq pirq = pin_irq_map[i].pic_pirq;
29  const unsigned int pin = pin_irq_map[i].pin - PCI_INT_A;
30  if (pirq == PIRQ_INVALID)
31  continue;
32 
33  const size_t pirq_index = pirq_idx(pirq);
34  if (pirq_map->type == PIRQ_GSI)
35  acpigen_write_PRT_GSI_entry(pin_irq_map[i].slot,
36  pin,
37  pirq_map->gsi[pirq_index]);
38  else
39  acpigen_write_PRT_source_entry(pin_irq_map[i].slot,
40  pin,
41  pirq_map->source_path[pirq_index],
42  0);
43  }
44 }
45 
46 void intel_write_pci0_PRT(const struct slot_pin_irq_map *pin_irq_map,
47  unsigned int map_count,
48  const struct pic_pirq_map *pirq_map)
49 {
50  /* \_SB.PCI0._PRT */
51  acpigen_write_scope("\\_SB.PCI0");
52  acpigen_write_method("_PRT", 0);
56  acpigen_write_package(map_count);
57  gen_apic_route(pin_irq_map, map_count);
58  acpigen_pop_len(); /* package */
61  acpigen_write_package(map_count);
62  gen_pic_route(pin_irq_map, map_count, pirq_map);
63  acpigen_pop_len(); /* package */
64  acpigen_pop_len(); /* else PICM */
65  acpigen_pop_len(); /* _PRT */
66  acpigen_pop_len(); /* \_SB */
67 }
68 
69 bool is_slot_pin_assigned(const struct slot_pin_irq_map *pin_irq_map,
70  unsigned int map_count, unsigned int slot,
71  enum pci_pin pin)
72 {
73  for (size_t i = 0; i < map_count; i++) {
74  if (pin_irq_map[i].slot == slot && pin_irq_map[i].pin == pin)
75  return true;
76  }
77 
78  return false;
79 }
static void gen_pic_route(const struct slot_pin_irq_map *pin_irq_map, unsigned int map_count, const struct pic_pirq_map *pirq_map)
Definition: acpi_pirq_gen.c:23
bool is_slot_pin_assigned(const struct slot_pin_irq_map *pin_irq_map, unsigned int map_count, unsigned int slot, enum pci_pin pin)
Definition: acpi_pirq_gen.c:69
void intel_write_pci0_PRT(const struct slot_pin_irq_map *pin_irq_map, unsigned int map_count, const struct pic_pirq_map *pirq_map)
Definition: acpi_pirq_gen.c:46
static void gen_apic_route(const struct slot_pin_irq_map *pin_irq_map, unsigned int map_count)
Definition: acpi_pirq_gen.c:10
pirq
Definition: acpi_pirq_gen.h:20
@ PIRQ_INVALID
Definition: acpi_pirq_gen.h:21
@ PIRQ_GSI
Definition: acpi_pirq_gen.h:66
static size_t pirq_idx(enum pirq pirq)
Definition: acpi_pirq_gen.h:33
pci_pin
Definition: acpi_pirq_gen.h:11
@ PCI_INT_A
Definition: acpi_pirq_gen.h:13
void acpigen_write_if(void)
Definition: acpigen.c:1437
void acpigen_emit_namestring(const char *namepath)
Definition: acpigen.c:275
void acpigen_pop_len(void)
Definition: acpigen.c:37
void acpigen_write_scope(const char *name)
Definition: acpigen.c:326
char * acpigen_write_package(int nr_el)
Definition: acpigen.c:86
void acpigen_emit_byte(unsigned char b)
Definition: acpigen.c:61
void acpigen_write_method(const char *name, int nargs)
Definition: acpigen.c:758
void acpigen_write_else(void)
Definition: acpigen.c:1510
void acpigen_write_PRT_GSI_entry(unsigned int pci_dev, unsigned int acpi_pin, unsigned int gsi)
Definition: acpigen_pci.c:28
void acpigen_write_PRT_source_entry(unsigned int pci_dev, unsigned int acpi_pin, const char *source_path, unsigned int index)
Definition: acpigen_pci.c:43
@ RETURN_OP
Definition: acpigen.h:146
enum pirq_map_type type
Definition: acpi_pirq_gen.h:75
char source_path[PIRQ_COUNT][DEVICE_PATH_MAX]
Definition: acpi_pirq_gen.h:78
unsigned int gsi[PIRQ_COUNT]
Definition: acpi_pirq_gen.h:77
unsigned int pic_pirq
Definition: acpi_pirq_gen.h:60
enum pci_pin pin
Definition: acpi_pirq_gen.h:58