/*
 * 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 0x2052545020445352ULL /* == "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 0x01U

/* 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;

#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);

#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

#endif /* CONFIG_ACPI */

#endif /* _ASMLANGUAGE */

#endif /* ZEPHYR_INCLUDE_ARCH_X86_ACPI_H */
