#include <errno.h>
#include <byteswap.h>
#include <ipxe/uaccess.h>
+#include <ipxe/iomap.h>
#include <ipxe/acpi.h>
#include <ipxe/interface.h>
return -ENOENT;
}
+/**
+ * Map an ACPI generic address
+ *
+ * @v address Generic address
+ * @v len Length of region
+ * @ret io_addr I/O address, or NULL on error
+ */
+void * acpi_ioremap ( struct acpi_address *address, size_t len ) {
+ physaddr_t base = le64_to_cpu ( address->address );
+
+ switch ( address->type ) {
+ case ACPI_ADDRESS_TYPE_MEM:
+ return ioremap ( base, len );
+ default:
+ return NULL;
+ }
+}
+
/******************************************************************************
*
* Descriptors
#include <ipxe/api.h>
#include <config/general.h>
+/** An ACPI generic address structure */
+struct acpi_address {
+ /** Address space type */
+ uint8_t type;
+ /** Register bit width */
+ uint8_t width;
+ /** Register bit offset */
+ uint8_t offset;
+ /** Access size */
+ uint8_t access;
+ /** Address */
+ uint64_t address;
+} __attribute__ (( packed ));
+
+/** A memory address space type */
+#define ACPI_ADDRESS_TYPE_MEM 0x00
+
+/** An I/O address space type */
+#define ACPI_ADDRESS_TYPE_IO 0x01
+
+/** A bus number address space type */
+#define ACPI_ADDRESS_TYPE_BUS 0x02
+
/** An ACPI small resource descriptor header */
struct acpi_small_resource {
/** Tag byte */
uint64_t len;
} __attribute__ (( packed ));
-/** A memory address space type */
-#define ACPI_ADDRESS_TYPE_MEM 0x00
-
-/** A bus number address space type */
-#define ACPI_ADDRESS_TYPE_BUS 0x02
-
/** An ACPI resource descriptor */
union acpi_resource {
/** Tag byte */
int ( * extract ) ( const struct acpi_header *zsdt,
size_t len, size_t offset,
void *data ) );
+extern void * acpi_ioremap ( struct acpi_address *address, size_t len );
extern void acpi_add ( struct acpi_descriptor *desc );
extern void acpi_del ( struct acpi_descriptor *desc );
extern int acpi_install ( int ( * install ) ( struct acpi_header *acpi ) );