summaryrefslogtreecommitdiffstats
path: root/src/include/ipxe/ecam.h
blob: 683d613a01594abfb4ecc24bb0541511daa8c8be (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#ifndef _IPXE_ECAM_H
#define _IPXE_ECAM_H

/** @file
 *
 * PCI I/O API for Enhanced Configuration Access Mechanism (ECAM)
 *
 */

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );

#include <ipxe/acpi.h>
#include <ipxe/pci.h>

/** Enhanced Configuration Access Mechanism per-device size */
#define ECAM_SIZE 4096

/** Enhanced Configuration Access Mechanism table signature */
#define ECAM_SIGNATURE ACPI_SIGNATURE ( 'M', 'C', 'F', 'G' )

/** An Enhanced Configuration Access Mechanism allocation */
struct ecam_allocation {
	/** Base address */
	uint64_t base;
	/** PCI segment number */
	uint16_t segment;
	/** Start PCI bus number */
	uint8_t start;
	/** End PCI bus number */
	uint8_t end;
	/** Reserved */
	uint8_t reserved[4];
} __attribute__ (( packed ));

/** An Enhanced Configuration Access Mechanism table */
struct ecam_table {
	/** ACPI header */
	struct acpi_header acpi;
	/** Reserved */
	uint8_t reserved[8];
	/** Allocation structures */
	struct ecam_allocation alloc[0];
} __attribute__ (( packed ));

/** A mapped Enhanced Configuration Access Mechanism allocation */
struct ecam_mapping {
	/** Allocation */
	struct ecam_allocation alloc;
	/** PCI bus:dev.fn address range */
	struct pci_range range;
	/** MMIO base address */
	void *regs;
};

extern struct pci_api ecam_api;

#endif /* _IPXE_ECAM_H */