acpi: Move acpi_write_tables() to a generic header
[platform/kernel/u-boot.git] / arch / x86 / include / asm / acpi_table.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Based on acpi.c from coreboot
4  *
5  * Copyright (C) 2015, Saket Sinha <saket.sinha89@gmail.com>
6  * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
7  */
8
9 #ifndef __ASM_ACPI_TABLE_H__
10 #define __ASM_ACPI_TABLE_H__
11
12 #ifndef __ACPI__
13
14 #include <pci.h>
15
16 struct acpi_facs;
17 struct acpi_fadt;
18 struct acpi_global_nvs;
19 struct acpi_madt_ioapic;
20 struct acpi_madt_irqoverride;
21 struct acpi_madt_lapic_nmi;
22 struct acpi_mcfg_mmconfig;
23 struct acpi_table_header;
24
25 /* These can be used by the target port */
26
27 int acpi_create_madt_lapics(u32 current);
28 int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id,
29                             u32 addr, u32 gsi_base);
30 int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
31                                  u8 bus, u8 source, u32 gsirq, u16 flags);
32 int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
33                                u8 cpu, u16 flags, u8 lint);
34 u32 acpi_fill_madt(u32 current);
35 int acpi_create_mcfg_mmconfig(struct acpi_mcfg_mmconfig *mmconfig, u32 base,
36                               u16 seg_nr, u8 start, u8 end);
37
38 /**
39  * acpi_write_hpet() - Write out a HPET table
40  *
41  * Write out the table for High-Precision Event Timers
42  *
43  * @ctx: Current ACPI context
44  * Return: 0 if OK, -ve on error
45  */
46 int acpi_write_hpet(struct acpi_ctx *ctx);
47
48 /**
49  * acpi_write_dbg2_pci_uart() - Write out a DBG2 table
50  *
51  * @ctx: Current ACPI context
52  * @dev: Debug UART device to describe
53  * @access_size: Access size for UART (e.g. ACPI_ACCESS_SIZE_DWORD_ACCESS)
54  * Return: 0 if OK, -ve on error
55  */
56 int acpi_write_dbg2_pci_uart(struct acpi_ctx *ctx, struct udevice *dev,
57                              uint access_size);
58
59 /**
60  * acpi_create_gnvs() - Create a GNVS (Global Non Volatile Storage) table
61  *
62  * @gnvs: Table to fill in
63  * Return: 0 if OK, -ve on error
64  */
65 int acpi_create_gnvs(struct acpi_global_nvs *gnvs);
66
67 /**
68  * acpi_get_rsdp_addr() - get ACPI RSDP table address
69  *
70  * This routine returns the ACPI RSDP table address in the system memory.
71  *
72  * @return:     ACPI RSDP table address
73  */
74 ulong acpi_get_rsdp_addr(void);
75
76 /**
77  * arch_read_sci_irq_select() - Read the system-control interrupt number
78  *
79  * @returns value of IRQ register in the PMC
80  */
81 int arch_read_sci_irq_select(void);
82
83 /**
84  * arch_write_sci_irq_select() - Set the system-control interrupt number
85  *
86  * @scis: New value for IRQ register in the PMC
87  */
88 int arch_write_sci_irq_select(uint scis);
89
90 /**
91  * arch_madt_sci_irq_polarity() - Return the priority to use for the MADT
92  *
93  * @sci: System-control interrupt number
94  * Return: priority to use (MP_IRQ_POLARITY_...)
95  */
96 int arch_madt_sci_irq_polarity(int sci);
97
98 /**
99  * acpi_create_dmar_drhd() - Create a table for DMA remapping with the IOMMU
100  *
101  * See here for the specification
102  * https://software.intel.com/sites/default/files/managed/c5/15/vt-directed-io-spec.pdf
103  *
104  * @ctx: ACPI context pointer
105  * @flags: (DRHD_INCLUDE_...)
106  * @segment: PCI segment asscociated with this unit
107  * @bar: Base address of remapping hardware register-set for this unit
108  */
109 void acpi_create_dmar_drhd(struct acpi_ctx *ctx, uint flags, uint segment,
110                            u64 bar);
111
112 /**
113  * acpi_create_dmar_rmrr() - Set up an RMRR
114  *
115  * This sets up a Reserved-Memory Region Reporting structure, used to allow
116  * DMA to regions used by devices that the BIOS controls.
117  *
118  * @ctx: ACPI context pointer
119  * @segment: PCI segment asscociated with this unit
120  * @bar: Base address of mapping
121  * @limit: End address of mapping
122  */
123 void acpi_create_dmar_rmrr(struct acpi_ctx *ctx, uint segment, u64 bar,
124                            u64 limit);
125
126 /**
127  * acpi_dmar_drhd_fixup() - Set the length of an DRHD
128  *
129  * This sets the DRHD length field based on the current ctx->current
130  *
131  * @ctx: ACPI context pointer
132  * @base: Address of the start of the DRHD
133  */
134 void acpi_dmar_drhd_fixup(struct acpi_ctx *ctx, void *base);
135
136 /**
137  * acpi_dmar_rmrr_fixup() - Set the length of an RMRR
138  *
139  * This sets the RMRR length field based on the current ctx->current
140  *
141  * @ctx: ACPI context pointer
142  * @base: Address of the start of the RMRR
143  */
144 void acpi_dmar_rmrr_fixup(struct acpi_ctx *ctx, void *base);
145
146 /**
147  * acpi_create_dmar_ds_pci() - Set up a DMAR scope for a PCI device
148  *
149  * @ctx: ACPI context pointer
150  * @bdf: PCI device to add
151  * Return: length of mapping in bytes
152  */
153 int acpi_create_dmar_ds_pci(struct acpi_ctx *ctx, pci_dev_t bdf);
154
155 /**
156  * acpi_create_dmar_ds_pci_br() - Set up a DMAR scope for a PCI bridge
157  *
158  * This is used to provide a mapping for a PCI bridge
159  *
160  * @ctx: ACPI context pointer
161  * @bdf: PCI device to add
162  * Return: length of mapping in bytes
163  */
164 int acpi_create_dmar_ds_pci_br(struct acpi_ctx *ctx, pci_dev_t bdf);
165
166 /**
167  * acpi_create_dmar_ds_ioapic() - Set up a DMAR scope for an IOAPIC device
168  *
169  * @ctx: ACPI context pointer
170  * @enumeration_id: Enumeration ID (typically 2)
171  * @bdf: PCI device to add
172  * Return: length of mapping in bytes
173  */
174 int acpi_create_dmar_ds_ioapic(struct acpi_ctx *ctx, uint enumeration_id,
175                                pci_dev_t bdf);
176
177 /**
178  * acpi_create_dmar_ds_msi_hpet() - Set up a DMAR scope for an HPET
179  *
180  * Sets up a scope for a High-Precision Event Timer that supports
181  * Message-Signalled Interrupts
182  *
183  * @ctx: ACPI context pointer
184  * @enumeration_id: Enumeration ID (typically 0)
185  * @bdf: PCI device to add
186  * Return: length of mapping in bytes
187  */
188 int acpi_create_dmar_ds_msi_hpet(struct acpi_ctx *ctx, uint enumeration_id,
189                                  pci_dev_t bdf);
190
191 /**
192  * acpi_fadt_common() - Handle common parts of filling out an FADT
193  *
194  * This sets up the Fixed ACPI Description Table
195  *
196  * @fadt: Pointer to place to put FADT
197  * @facs: Pointer to the FACS
198  * @dsdt: Pointer to the DSDT
199  */
200 void acpi_fadt_common(struct acpi_fadt *fadt, struct acpi_facs *facs,
201                       void *dsdt);
202
203 /**
204  * intel_acpi_fill_fadt() - Set up the contents of the FADT
205  *
206  * This sets up parts of the Fixed ACPI Description Table that are common to
207  * Intel chips
208  *
209  * @fadt: Pointer to place to put FADT
210  */
211 void intel_acpi_fill_fadt(struct acpi_fadt *fadt);
212
213 #endif /* !__ACPI__ */
214
215 #endif /* __ASM_ACPI_TABLE_H__ */