[acpi] Allow for platforms that provide ACPI tables individually

The ACPI API currently expects platforms to provide access to a single
contiguous ACPI table.  Some platforms (e.g. Linux userspace) do not
provide a convenient way to obtain the entire ACPI table, but do
provide access to individual tables.

All iPXE consumers of the ACPI API require access only to individual
tables.

Redefine the internal API to make acpi_find() an API method, with all
existing implementations delegating to the current RSDT-based
implementation.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
diff --git a/src/arch/x86/include/ipxe/rsdp.h b/src/arch/x86/include/ipxe/rsdp.h
index 7e32c00..14afcd7 100644
--- a/src/arch/x86/include/ipxe/rsdp.h
+++ b/src/arch/x86/include/ipxe/rsdp.h
@@ -15,4 +15,17 @@
 #define ACPI_PREFIX_rsdp __rsdp_
 #endif
 
+/**
+ * Locate ACPI table
+ *
+ * @v signature		Requested table signature
+ * @v index		Requested index of table with this signature
+ * @ret table		Table, or UNULL if not found
+ */
+static inline __attribute__ (( always_inline )) userptr_t
+ACPI_INLINE ( rsdp, acpi_find ) ( uint32_t signature, unsigned int index ) {
+
+	return acpi_find_via_rsdt ( signature, index );
+}
+
 #endif /* _IPXE_RSDP_H */
diff --git a/src/arch/x86/interface/pcbios/rsdp.c b/src/arch/x86/interface/pcbios/rsdp.c
index 8da0b55..3c67b75 100644
--- a/src/arch/x86/interface/pcbios/rsdp.c
+++ b/src/arch/x86/interface/pcbios/rsdp.c
@@ -123,3 +123,4 @@
 }
 
 PROVIDE_ACPI ( rsdp, acpi_find_rsdt, rsdp_find_rsdt );
+PROVIDE_ACPI_INLINE ( rsdp, acpi_find );
diff --git a/src/core/acpi.c b/src/core/acpi.c
index 7551173..52eb63a 100644
--- a/src/core/acpi.c
+++ b/src/core/acpi.c
@@ -83,13 +83,13 @@
 }
 
 /**
- * Locate ACPI table
+ * Locate ACPI table via RSDT
  *
  * @v signature		Requested table signature
  * @v index		Requested index of table with this signature
  * @ret table		Table, or UNULL if not found
  */
-userptr_t acpi_find ( uint32_t signature, unsigned int index ) {
+userptr_t acpi_find_via_rsdt ( uint32_t signature, unsigned int index ) {
 	struct acpi_header acpi;
 	struct acpi_rsdt *rsdtab;
 	typeof ( rsdtab->entry[0] ) entry;
diff --git a/src/core/null_acpi.c b/src/core/null_acpi.c
index 90c7848..acca378 100644
--- a/src/core/null_acpi.c
+++ b/src/core/null_acpi.c
@@ -1,3 +1,3 @@
 #include <ipxe/acpi.h>
 
-PROVIDE_ACPI_INLINE ( null, acpi_find_rsdt );
+PROVIDE_ACPI_INLINE ( null, acpi_find );
diff --git a/src/include/ipxe/acpi.h b/src/include/ipxe/acpi.h
index f979ace..6d19f05 100644
--- a/src/include/ipxe/acpi.h
+++ b/src/include/ipxe/acpi.h
@@ -355,6 +355,8 @@
 #define PROVIDE_ACPI_INLINE( _subsys, _api_func ) \
 	PROVIDE_SINGLE_API_INLINE ( ACPI_PREFIX_ ## _subsys, _api_func )
 
+extern userptr_t acpi_find_via_rsdt ( uint32_t signature, unsigned int index );
+
 /* Include all architecture-independent ACPI API headers */
 #include <ipxe/null_acpi.h>
 #include <ipxe/efi/efi_acpi.h>
@@ -369,13 +371,21 @@
  */
 userptr_t acpi_find_rsdt ( void );
 
+/**
+ * Locate ACPI table
+ *
+ * @v signature		Requested table signature
+ * @v index		Requested index of table with this signature
+ * @ret table		Table, or UNULL if not found
+ */
+userptr_t acpi_find ( uint32_t signature, unsigned int index );
+
 extern struct acpi_descriptor *
 acpi_describe ( struct interface *interface );
 #define acpi_describe_TYPE( object_type )				\
 	typeof ( struct acpi_descriptor * ( object_type ) )
 
 extern void acpi_fix_checksum ( struct acpi_header *acpi );
-extern userptr_t acpi_find ( uint32_t signature, unsigned int index );
 extern int acpi_sx ( uint32_t signature );
 extern void acpi_add ( struct acpi_descriptor *desc );
 extern void acpi_del ( struct acpi_descriptor *desc );
diff --git a/src/include/ipxe/efi/efi_acpi.h b/src/include/ipxe/efi/efi_acpi.h
index 01456f1..a698863 100644
--- a/src/include/ipxe/efi/efi_acpi.h
+++ b/src/include/ipxe/efi/efi_acpi.h
@@ -15,4 +15,17 @@
 #define ACPI_PREFIX_efi __efi_
 #endif
 
+/**
+ * Locate ACPI table
+ *
+ * @v signature		Requested table signature
+ * @v index		Requested index of table with this signature
+ * @ret table		Table, or UNULL if not found
+ */
+static inline __attribute__ (( always_inline )) userptr_t
+ACPI_INLINE ( efi, acpi_find ) ( uint32_t signature, unsigned int index ) {
+
+	return acpi_find_via_rsdt ( signature, index );
+}
+
 #endif /* _IPXE_EFI_ACPI_H */
diff --git a/src/include/ipxe/null_acpi.h b/src/include/ipxe/null_acpi.h
index 1e469e3..cedb028 100644
--- a/src/include/ipxe/null_acpi.h
+++ b/src/include/ipxe/null_acpi.h
@@ -15,8 +15,10 @@
 #define ACPI_PREFIX_null __null_
 #endif
 
-static inline __always_inline userptr_t
-ACPI_INLINE ( null, acpi_find_rsdt ) ( void ) {
+static inline __attribute__ (( always_inline )) userptr_t
+ACPI_INLINE ( null, acpi_find ) ( uint32_t signature __unused,
+				  unsigned int index __unused ) {
+
 	return UNULL;
 }
 
diff --git a/src/interface/efi/efi_acpi.c b/src/interface/efi/efi_acpi.c
index a347eaf..07a2256 100644
--- a/src/interface/efi/efi_acpi.c
+++ b/src/interface/efi/efi_acpi.c
@@ -54,3 +54,4 @@
 }
 
 PROVIDE_ACPI ( efi, acpi_find_rsdt, efi_find_rsdt );
+PROVIDE_ACPI_INLINE ( efi, acpi_find );