| /* |
| * Copyright (c) 2020 Intel Corporation |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef ZEPHYR_INCLUDE_ARCH_X86_ACPI_H |
| #define ZEPHYR_INCLUDE_ARCH_X86_ACPI_H |
| |
| #ifndef _ASMLANGUAGE |
| |
| #define ACPI_RSDP_SIGNATURE 0x2052545020445352 /* == "RSD PTR " */ |
| |
| /* Root System Description Pointer */ |
| struct acpi_rsdp { |
| char signature[8]; |
| uint8_t chksum; |
| char oem_id[6]; |
| uint8_t revision; |
| uint32_t rsdt_ptr; |
| uint32_t length; |
| uint64_t xsdt_ptr; |
| uint8_t ext_chksum; |
| uint8_t _reserved[3]; |
| } __packed; |
| |
| /* Standard table header */ |
| struct acpi_sdt { |
| uint32_t signature; |
| uint32_t length; |
| uint8_t revision; |
| uint8_t chksum; |
| char oem_id[6]; |
| char oem_table_id[8]; |
| uint32_t oem_revision; |
| uint32_t creator_id; |
| uint32_t creator_revision; |
| } __packed; |
| |
| /* Root System Description Table */ |
| struct acpi_rsdt { |
| struct acpi_sdt sdt; |
| uint32_t table_ptrs[]; |
| } __packed; |
| |
| /* eXtended System Descriptor Table */ |
| struct acpi_xsdt { |
| struct acpi_sdt sdt; |
| uint64_t table_ptrs[]; |
| } __packed; |
| |
| /* MCFG table storing MMIO addresses for PCI configuration space */ |
| |
| #define ACPI_MCFG_SIGNATURE 0x4746434d /* 'MCFG' */ |
| |
| struct acpi_mcfg { |
| struct acpi_sdt sdt; |
| uint64_t _reserved; |
| struct { |
| uint64_t base_addr; |
| uint16_t seg_group_num; |
| uint8_t start_bus; |
| uint8_t end_bus; |
| } pci_segs[]; |
| } __packed; |
| |
| /* MADT table storing IO-APIC and multiprocessor configuration */ |
| |
| #define ACPI_MADT_SIGNATURE 0x43495041 /* 'APIC' */ |
| |
| struct acpi_madt_entry { |
| uint8_t type; /* See ACPI_MADT_ENTRY_* below */ |
| uint8_t length; |
| } __packed; |
| |
| #define ACPI_MADT_ENTRY_CPU 0 |
| |
| struct acpi_madt { |
| struct acpi_sdt sdt; |
| uint32_t loapic; /* local APIC MMIO address */ |
| uint32_t flags; /* see ACPI_MADT_FLAGS_* below */ |
| struct acpi_madt_entry entries[]; |
| } __packed; |
| |
| #define ACPI_MADT_FLAGS_PICS 0x01 /* legacy 8259s installed */ |
| |
| struct acpi_cpu { |
| struct acpi_madt_entry entry; |
| uint8_t acpi_id; |
| uint8_t apic_id; /* local APIC ID */ |
| uint8_t flags; /* see ACPI_CPU_FLAGS_* below */ |
| } __packed; |
| |
| #define ACPI_CPU_FLAGS_ENABLED 0x01 |
| |
| /* Generic DMA Remapping entry structure part */ |
| struct acpi_dmar_entry { |
| uint16_t type; /* See ACPI_DMAR_TYPE_* below */ |
| uint16_t length; |
| } __packed; |
| |
| #define ACPI_DMAR_TYPE_DRHD 0 /* DMA Remapping Hardware Unit Definition */ |
| #define ACPI_DMAR_TYPE_RMRR 1 /* Do not care atm (legacy usage) */ |
| #define ACPI_DMAR_TYPE_ATSR 2 /* Do not care atm (PCIE ATS support) */ |
| #define ACPI_DMAR_TYPE_RHSA 3 /* Do not care atm (NUMA specific ) */ |
| #define ACPI_DMAR_TYPE_ANDD 4 /* Do not care atm (ACPI DSDT related) */ |
| #define ACPI_DMAR_TYPE_SACT 5 /* Do not care atm */ |
| |
| /* PCI Device/Function Pair (forming the BDF, with start_bus_num below) */ |
| struct acpi_dmar_dev_path { |
| uint8_t device; |
| uint8_t function; |
| } __packed; |
| |
| #define ACPI_DMAR_DEV_PATH_SIZE 2 |
| |
| /* DMA Remapping Device Scope */ |
| struct acpi_dmar_dev_scope { |
| uint8_t type; /* See ACPI_DRHD_DEV_SCOPE_* below */ |
| uint8_t length; /* 6 + X where X is Path attribute size */ |
| uint16_t _reserved; |
| uint8_t enumeration_id; |
| uint8_t start_bus_num; /* PCI bus, forming BDF with each Path below */ |
| struct acpi_dmar_dev_path path[]; /* One is at least always found */ |
| } __packed; |
| |
| #define ACPI_DMAR_DEV_SCOPE_MIN_SIZE 6 |
| |
| #define ACPI_DRHD_DEV_SCOPE_PCI_EPD 0x01 |
| #define ACPI_DRHD_DEV_SCOPE_PCI_SUB_H 0x02 |
| #define ACPI_DRHD_DEV_SCOPE_IOAPIC 0x03 |
| #define ACPI_DRHD_DEV_SCOPE_MSI_CAP_HPET 0x04 |
| #define ACPI_DRHD_DEV_SCOPE_NAMESPACE_DEV 0x05 |
| |
| struct acpi_drhd { |
| struct acpi_dmar_entry entry; |
| uint8_t flags; /* See ACPI_DRHD_FLAG_* below */ |
| uint8_t _reserved; |
| uint16_t segment_num; /* Associated PCI segment */ |
| uint64_t base_address; /* Base address of the remapping hw */ |
| struct acpi_dmar_dev_scope device_scope[]; |
| } __packed; |
| |
| #define ACPI_DRHD_MIN_SIZE 16 |
| |
| #define ACPI_DRHD_FLAG_INCLUDE_PCI_ALL BIT(0) |
| |
| #define ACPI_DMAR_SIGNATURE 0x52414D44 /* 'DMAR' */ |
| |
| #define ACPI_DMAR_FLAG_INTR_REMAP BIT(0) |
| #define ACPI_DMAR_FLAG_X2APIC_OPT_OUT BIT(1) |
| #define ACPI_DMAR_FLAG_DMA_CTRL_PLATFORM_OPT_IN BIT(2) |
| |
| /* DMA Remapping reporting structure */ |
| struct acpi_dmar { |
| struct acpi_sdt sdt; |
| uint8_t host_addr_width; |
| uint8_t flags; |
| uint8_t _reserved[10]; |
| struct acpi_dmar_entry remap_entries[]; |
| } __packed; |
| |
| union acpi_dmar_id { |
| struct { |
| uint16_t function : 3; |
| uint16_t device : 5; |
| uint16_t bus : 8; |
| } bits; |
| |
| uint16_t raw; |
| }; |
| |
| #if defined(CONFIG_ACPI) |
| |
| void *z_acpi_find_table(uint32_t signature); |
| |
| struct acpi_cpu *z_acpi_get_cpu(int n); |
| |
| struct acpi_dmar *z_acpi_find_dmar(void); |
| |
| struct acpi_drhd *z_acpi_find_drhds(int *n); |
| |
| struct acpi_dmar_dev_scope *z_acpi_get_drhd_dev_scopes(struct acpi_drhd *drhd, |
| int *n); |
| |
| struct acpi_dmar_dev_path * |
| z_acpi_get_dev_scope_paths(struct acpi_dmar_dev_scope *dev_scope, int *n); |
| |
| uint16_t z_acpi_get_dev_id_from_dmar(uint8_t dev_scope_type); |
| |
| #else /* CONFIG_ACPI */ |
| |
| #define z_acpi_find_table(...) NULL |
| #define z_acpi_get_cpu(...) NULL |
| #define z_acpi_find_dmar(...) NULL |
| #define z_acpi_find_drhds(...) NULL |
| #define z_acpi_get_drhd_dev_scopes(...) NULL |
| #define z_acpi_get_dev_scope_paths(...) NULL |
| #define z_acpi_get_dev_id_from_dmar(...) USHRT_MAX |
| |
| #endif /* CONFIG_ACPI */ |
| |
| #endif /* _ASMLANGUAGE */ |
| |
| #endif /* ZEPHYR_INCLUDE_ARCH_X86_ACPI_H */ |