/*
 * This file is part of the UCB release of Plan 9. It is subject to the license
 * terms in the LICENSE file found in the top-level directory of this
 * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
 * part of the UCB release of Plan 9, including this file, may be copied,
 * modified, propagated, or distributed except according to the terms contained
 * in the LICENSE file.
 */

/* -----------------------------------------------------------------------------
 * ACPI is a table of tables. The tables define a hierarchy.
 *
 * From the hardware's perspective:
 * Each table that we care about has a header, and the header has a
 * length that includes the the length of all its subtables. So, even
 * if you can't completely parse a table, you can find the next table.
 *
 * The process of parsing is to find the RSDP, and then for each subtable
 * see what type it is and parse it. The process is recursive except for
 * a few issues: The RSDP signature and header differs from the header of
 * its subtables; their headers differ from the signatures of the tables
 * they contain. As you walk down the tree, you need different parsers.
 *
 * The parser is recursive descent. Each parsing function takes a pointer
 * to the parent of the node it is parsing and will attach itself to the parent
 * via that pointer. Parsing functions are responsible for building the data
 * structures that represent their node and recursive invocations of the parser
 * for subtables.
 *
 * So, in this case, it's something like this:
 *
 * RSDP is the root. It has a standard header and size. You map that
 * memory.  You find the first header, get its type and size, and
 * parse as much of it as you can. Parsing will involve either a
 * function or case statement for each element type. DMARs are complex
 * and need functions; APICs are simple and we can get by with case
 * statements.
 *
 * Each node in the tree is represented as a 'struct Atable'. This has a
 * pointer to the actual node data, a type tag, a name, pointers to this
 * node's children (if any) and a parent pointer. It also has a QID so that
 * the entire structure can be exposed as a filesystem. The Atable doesn't
 * contain any table data per se; it's metadata. The table pointer contains
 * the table data as well as a pointer back to it's corresponding Atable.
 *
 * In the end we present a directory tree for #apic that looks, in this example:
 * #acpi/DMAR/DRHD/0/{pretty,raw}
 *
 * 'cat pretty' will return JSON-encoded data described the element.
 * 'cat raw' gets you the raw bytes.
 */

#pragma once

#include <ns.h>
#include <slice.h>

enum {

	Sdthdrsz = 36,		/* size of SDT header */

	/* ACPI regions. Gas ids */
	Rsysmem = 0,
	Rsysio,
	Rpcicfg,
	Rembed,
	Rsmbus,
	Rcmos,
	Rpcibar,
	Ripmi,
	Rfixedhw = 0x7f,

	/* ACPI PM1 control */
	Pm1SciEn = 0x1,		/* Generate SCI and not SMI */

	/* ACPI tbdf as encoded in acpi region base addresses */
	Rpciregshift = 0,
	Rpciregmask = 0xFFFF,
	Rpcifunshift = 16,
	Rpcifunmask = 0xFFFF,
	Rpcidevshift = 32,
	Rpcidevmask = 0xFFFF,
	Rpcibusshift = 48,
	Rpcibusmask = 0xFFFF,

	/* Apic structure types */
	ASlapic = 0,		/* processor local apic */
	ASioapic,		/* I/O apic */
	ASintovr,		/* Interrupt source override */
	ASnmi,			/* NMI source */
	ASlnmi,			/* local apic nmi */
	ASladdr,		/* local apic address override */
	ASiosapic,		/* I/O sapic */
	ASlsapic,		/* local sapic */
	ASintsrc,		/* platform interrupt sources */
	ASlx2apic,		/* local x2 apic */
	ASlx2nmi,		/* local x2 apic NMI */

	/* Apic flags */
	AFbus = 0,		/* polarity/trigger like in ISA */
	AFhigh = 1,		/* active high */
	AFlow = 3,		/* active low */
	AFpmask = 3,		/* polarity bits */
	AFedge = 1 << 2,	/* edge triggered */
	AFlevel = 3 << 2,	/* level triggered */
	AFtmask = 3 << 2,	/* trigger bits */

	/* Table types. */
	RSDP = 0,
	SDTH,
	RSDT,
	FADT,
	FACS,
	DSDT,
	SSDT,
	MADT,
	SBST,
	XSDT,
	ECDT,
	SLIT,
	SRAT,
	CPEP,
	MSCT,
	RASF,
	MPST,
	PMTT,
	BGRT,
	FPDT,
	GTDT,
	HPET,
	APIC,
	DMAR,
	/* DMAR types */
	DRHD,
	RMRR,
	ATSR,
	RHSA,
	ANDD,
	NACPITBLS,		/* Number of ACPI tables */

	/* SRAT types */
	SRlapic = 0,		/* Local apic/sapic affinity */
	SRmem,			/* Memory affinity */
	SRlx2apic,		/* x2 apic affinity */

	/* Atable constants */
	SIGSZ		= 4+1,	/* Size of the signature (including NUL) */
	OEMIDSZ		= 6+1,	/* Size of the OEM ID (including NUL) */
	OEMTBLIDSZ	= 8+1,	/* Size of the OEM Table ID (including NUL) */

	/* Arg for _PIC */
	Ppic = 0,		/* PIC interrupt model */
	Papic,			/* APIC interrupt model */
	Psapic,			/* SAPIC interrupt model */

	CMregion = 0,		/* regio name spc base len accsz */
	CMgpe,			/* gpe name id */
};

/*
 * ACPI table (sw)
 *
 * This Atable struct corresponds to an interpretation of the standard header
 * for all table types we support. It has a pointer to the converted data, i.e.
 * the structs created by functions like acpimadt and so on. Note: althouh the
 * various things in this are a superset of many ACPI table names (DRHD, DRHD
 * scopes, etc). The raw data follows this header.
 *
 * Child entries in the table are kept in an array of pointers. Each entry has
 * a pointer to it's logically "next" sibling, thus forming a linked list. But
 * these lists are purely for convenience and all point to nodes within the
 * same array.
 */
struct Atable {
	struct qid qid;		/* QID corresponding to this table. */
	struct qid rqid;	/* This table's 'raw' QID. */
	struct qid pqid;	/* This table's 'pretty' QID. */
	struct qid tqid;	/* This table's 'table' QID. */
	int type;		/* This table's type */
	void *tbl;		/* pointer to the converted table, e.g. madt. */
	char name[16];		/* name of this table */

	struct Atable *parent;	/* Parent pointer */
	struct Atable **children; /* children of this node (an array). */
	struct dirtab *cdirs;	/* child directory entries of this node. */
	size_t nchildren;	/* count of this node's children */
	struct Atable *next;	/* Pointer to the next sibling. */

	size_t rawsize;		/* Total size of raw table */
	uint8_t *raw;		/* Raw data. */
};

struct Gpe {
	uintptr_t stsio;	/* port used for status */
	int stsbit;		/* bit number */
	uintptr_t enio;		/* port used for enable */
	int enbit;		/* bit number */
	int nb;			/* event number */
	char *obj;		/* handler object  */
	int id;			/* id as supplied by user */
};

struct Regio {
	void *arg;
	uint8_t (*get8)(uintptr_t, void *);
	void (*set8)(uintptr_t, uint8_t unused_int, void *);
	uint16_t (*get16)(uintptr_t, void *);
	void (*set16)(uintptr_t, uint16_t unused_int, void *);
	uint32_t (*get32)(uintptr_t, void *);
	void (*set32)(uintptr_t, uint32_t, void *);
	uint64_t (*get64)(uintptr_t, void *);
	void (*set64)(uintptr_t, uint64_t unused_int, void *);
};

struct Reg {
	char *name;
	int spc;		/* io space */
	uint64_t base;		/* address, physical */
	uint8_t *p;		/* address, kmapped */
	uint64_t len;
	int tbdf;
	int accsz;		/* access size */
};

/* Generic address structure.
 */
struct Gas {
	uint8_t spc;		/* address space id */
	uint8_t len;		/* register size in bits */
	uint8_t off;		/* bit offset */
	uint8_t accsz;		/* 1: byte; 2: word; 3: dword; 4: qword */
	uint64_t addr;		/* address (or acpi encoded tbdf + reg) */
};

/* Root system description table pointer.
 * Used to locate the root system description table RSDT
 * (or the extended system description table from version 2) XSDT.
 * The XDST contains (after the DST header) a list of pointers to tables:
 *	- FADT	fixed acpi description table.
 *		It points to the DSDT, AML code making the acpi namespace.
 *	- SSDTs	tables with AML code to add to the acpi namespace.
 *	- pointers to other tables for apics, etc.
 */
struct Rsdp {
	uint8_t signature[8];	/* "RSD PTR " */
	uint8_t rchecksum;
	uint8_t oemid[6];
	uint8_t revision;
	uint8_t raddr[4];	/* RSDT */
	uint8_t length[4];
	uint8_t xaddr[8];	/* XSDT */
	uint8_t xchecksum;	/* XSDT */
	uint8_t _reserved[3];	/* reserved */
};

/* Header for ACPI description tables
 */
struct Sdthdr {
	uint8_t sig[4];		/* "FACP" or whatever */
	uint8_t length[4];
	uint8_t rev;
	uint8_t csum;
	uint8_t oemid[6];
	uint8_t oemtblid[8];
	uint8_t oemrev[4];
	uint8_t creatorid[4];
	uint8_t creatorrev[4];
};

/* Firmware control structure
 */
struct Facs {
	uint8_t sig[4];
	uint8_t len[4];
	uint32_t hwsig;
	uint32_t wakingv;
	uint32_t glock;
	uint32_t flags;
	uint64_t xwakingv;
	uint8_t vers;
	uint32_t ospmflags;
};

/* Maximum System Characteristics table
 */
struct Msct {
	int ndoms;		/* number of domains */
	int nclkdoms;		/* number of clock domains */
	uint64_t maxpa;		/* max physical address */
	size_t nmdom;		/* number of discovered domains */
	struct Mdom *dom;	/* array of domains */
};

struct Mdom {
	int start;		/* start dom id */
	int end;		/* end dom id */
	int maxproc;		/* max processor capacity */
	uint64_t maxmem;	/* max memory capacity */
};

/* Multiple APIC description table
 * Interrupts are virtualized by ACPI and each APIC has
 * a `virtual interrupt base' where its interrupts start.
 * Addresses are processor-relative physical addresses.
 * Only enabled devices are linked, others are filtered out.
 */
struct Madt {
	uint64_t lapicpa;	/* local APIC addr */
	int pcat;		/* the machine has PC/AT 8259s */
};

struct Apicst {
	int type;
	union {
		struct {
			int pid;		/* processor id */
			int id;			/* apic no */
		} lapic;
		struct {
			int id;			/* io apic id */
			uint32_t ibase;		/* interrupt base addr. */
			uint64_t addr;		/* base address */
		} ioapic, iosapic;
		struct {
			int irq;		/* bus intr. source (ISA only) */
			int intr;		/* system interrupt */
			int flags;		/* apic flags */
		} intovr;
		struct {
			int intr;		/* system interrupt */
			int flags;		/* apic flags */
		} nmi;
		struct {
			int pid;		/* processor id */
			int flags;		/* lapic flags */
			int lint;		/* lapic LINTn for nmi */
		} lnmi;
		struct {
			int pid;		/* processor id */
			int id;			/* apic id */
			int eid;		/* apic eid */
			int puid;		/* processor uid */
			char *puids;		/* same thing */
		} lsapic;
		struct {
			int pid;		/* processor id */
			int peid;		/* processor eid */
			int iosv;		/* io sapic vector */
			int intr;		/* global sys intr. */
			int type;		/* intr type */
			int flags;		/* apic flags */
			int any;		/* err sts at any proc */
		} intsrc;
		struct {
			int id;			/* x2 apic id */
			int puid;		/* processor uid */
		} lx2apic;
		struct {
			int puid;
			int flags;
			int intr;
		} lx2nmi;
	};
};

/* System resource affinity table
 */
struct Srat {
	int type;
	union {
		struct {
			int dom;		/* proximity domain */
			int apic;		/* apic id */
			int sapic;		/* sapic id */
			int clkdom;		/* clock domain */
		} lapic;
		struct {
			int dom;		/* proximity domain */
			uint64_t addr;		/* base address */
			uint64_t len;
			int hplug;		/* hot pluggable */
			int nvram;		/* non volatile */
		} mem;
		struct {
			int dom;		/* proximity domain */
			int apic;		/* x2 apic id */
			int clkdom;		/* clock domain */
		} lx2apic;
	};
};

/* System locality information table
 */
struct Slit {
	uint64_t rowlen;
	struct SlEntry **e;
};

struct SlEntry {
	int dom;			/* proximity domain */
	unsigned int dist;		/* distance to proximity domain */
};

/* Fixed ACPI description table.
 * Describes implementation and hardware registers.
 * PM* blocks are low level functions.
 * GPE* blocks refer to general purpose events.
 * P_* blocks are for processor features.
 * Has address for the DSDT.
 */
struct Fadt {
	uint32_t facs;
	uint32_t dsdt;
	/* 1 reserved */
	uint8_t pmprofile;
	uint16_t sciint;
	uint32_t smicmd;
	uint8_t acpienable;
	uint8_t acpidisable;
	uint8_t s4biosreq;
	uint8_t pstatecnt;
	uint32_t pm1aevtblk;
	uint32_t pm1bevtblk;
	uint32_t pm1acntblk;
	uint32_t pm1bcntblk;
	uint32_t pm2cntblk;
	uint32_t pmtmrblk;
	uint32_t gpe0blk;
	uint32_t gpe1blk;
	uint8_t pm1evtlen;
	uint8_t pm1cntlen;
	uint8_t pm2cntlen;
	uint8_t pmtmrlen;
	uint8_t gpe0blklen;
	uint8_t gpe1blklen;
	uint8_t gp1base;
	uint8_t cstcnt;
	uint16_t plvl2lat;
	uint16_t plvl3lat;
	uint16_t flushsz;
	uint16_t flushstride;
	uint8_t dutyoff;
	uint8_t dutywidth;
	uint8_t dayalrm;
	uint8_t monalrm;
	uint8_t century;
	uint16_t iapcbootarch;
	/* 1 reserved */
	uint32_t flags;
	struct Gas resetreg;
	uint8_t resetval;
	/* 3 reserved */
	uint64_t xfacs;
	uint64_t xdsdt;
	struct Gas xpm1aevtblk;
	struct Gas xpm1bevtblk;
	struct Gas xpm1acntblk;
	struct Gas xpm1bcntblk;
	struct Gas xpm2cntblk;
	struct Gas xpmtmrblk;
	struct Gas xgpe0blk;
	struct Gas xgpe1blk;
};

/* XSDT/RSDT. 4/8 byte addresses starting at p.
 */
struct Xsdt {
	size_t len;
	size_t asize;
	uint8_t *p;
};

/* DMAR.
 */
/*
 * Device scope.
 */
struct DevScope {
	int enumeration_id;
	int start_bus_number;
	int npath;
	int *paths;
};
/*
 * The device scope is basic tbdf as uint32_t. There is a special value
 * that means "everything" and if we see that we set "all" in the Drhd.
 */
struct Drhd {
	int flags;
	int segment;
	uintptr_t rba;
	uintptr_t all;	// This drhd scope is for everything.
	size_t nscope;
	struct DevScope *scopes;
};

struct Dmar {
	int haw;
	/*
	 * If your firmware disables x2apic mode, you should not be here.
	 * We ignore that bit.
	 */
	int intr_remap;
};

int acpiinit(void);
struct Atable *mkatable(struct Atable *parent,
                        int type, char *name, uint8_t *raw,
                        size_t rawsize, size_t addsize);
struct Atable *finatable(struct Atable *t, struct slice *slice);
struct Atable *finatable_nochildren(struct Atable *t);
int get_early_num_cores(void);

extern struct Atable *apics;
extern struct Atable *dmar;
extern struct Atable *srat;
