[edk2-devel] [PATCH edk2-platforms v2 1/2] Platform/96Boards: add ACPI support to mezzanine/LS connector driver
Ard Biesheuvel
ard.biesheuvel at linaro.org
Thu May 2 09:58:53 UTC 2019
Make the LS connector mezzanine support code ACPI aware, and invoke
the appropriate hook in the driver code to install a SSDT instead of
a DT overlay when running on a system that is booting in ACPI mode.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
---
Platform/96Boards/Include/Protocol/Mezzanine.h | 21 ++++++++++++
Platform/96Boards/LsConnectorDxe/LsConnectorDxe.c | 35 ++++++++++++++------
Platform/96Boards/LsConnectorDxe/LsConnectorDxe.inf | 1 +
3 files changed, 46 insertions(+), 11 deletions(-)
diff --git a/Platform/96Boards/Include/Protocol/Mezzanine.h b/Platform/96Boards/Include/Protocol/Mezzanine.h
index 9847649d2ac3..97f43e9a920f 100644
--- a/Platform/96Boards/Include/Protocol/Mezzanine.h
+++ b/Platform/96Boards/Include/Protocol/Mezzanine.h
@@ -16,6 +16,7 @@
#define _96BOARDS_MEZZANINE_H_
#include <Pi/PiI2c.h>
+#include <Protocol/AcpiTable.h>
#include <Protocol/SpiConfiguration.h>
#define MEZZANINE_PROTOCOL_GUID \
@@ -39,12 +40,32 @@ EFI_STATUS
IN OUT VOID *Dtb
);
+/**
+ Install the mezzanine's SSDT table
+
+ @param[in] This Pointer to the MEZZANINE_PROTOCOL instance.
+ @param[in] Dtb Pointer to the device tree blob
+
+ @return EFI_SUCCESS Operation succeeded.
+ @return other An error has occurred.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *INSTALL_SSDT_TABLE) (
+ IN MEZZANINE_PROTOCOL *This,
+ IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol
+ );
+
struct _MEZZANINE_PROTOCOL {
//
// Get the device tree overlay for this mezzanine board
//
APPLY_DEVICE_TREE_OVERLAY ApplyDeviceTreeOverlay;
//
+ // Install the mezzanine's SSDT table
+ //
+ INSTALL_SSDT_TABLE InstallSsdtTable;
+ //
// The number of devices on LS connector I2C bus #0
//
UINT32 I2c0NumDevices;
diff --git a/Platform/96Boards/LsConnectorDxe/LsConnectorDxe.c b/Platform/96Boards/LsConnectorDxe/LsConnectorDxe.c
index f19d95635056..27044c5da699 100644
--- a/Platform/96Boards/LsConnectorDxe/LsConnectorDxe.c
+++ b/Platform/96Boards/LsConnectorDxe/LsConnectorDxe.c
@@ -21,6 +21,7 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Protocol/AcpiTable.h>
#include <Protocol/LsConnector.h>
#include <Protocol/Mezzanine.h>
@@ -97,7 +98,7 @@ InstallHiiPages (
STATIC
VOID
EFIAPI
-ApplyDeviceTreeOverlay (
+PublishOsDescription (
EFI_EVENT Event,
VOID *Context
)
@@ -105,11 +106,30 @@ ApplyDeviceTreeOverlay (
VOID *Dtb;
MEZZANINE_PROTOCOL *Mezzanine;
EFI_STATUS Status;
+ EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol;
+
+ Status = gBS->LocateProtocol (&g96BoardsMezzanineProtocolGuid, NULL,
+ (VOID **)&Mezzanine);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_INFO, "%a: no mezzanine driver active\n", __FUNCTION__));
+ return;
+ }
+
+ Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL,
+ (VOID **)&AcpiProtocol);
+ if (!EFI_ERROR (Status)) {
+ Status = Mezzanine->InstallSsdtTable (Mezzanine, AcpiProtocol);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_WARN, "%a: failed to install SSDT table - %r\n",
+ __FUNCTION__, Status));
+ }
+ return;
+ }
//
// Find the DTB in the configuration table array. If it isn't there, just
- // bail without an error: we may be running on an ACPI platform even if
- // this driver does not support it [yet].
+ // bail without an error: the system may be able to proceed even without
+ // ACPI or DT description, so it isn't up to us to complain about this.
//
Status = EfiGetSystemConfigurationTable (&gFdtTableGuid, &Dtb);
if (Status == EFI_NOT_FOUND) {
@@ -117,13 +137,6 @@ ApplyDeviceTreeOverlay (
}
ASSERT_EFI_ERROR (Status);
- Status = gBS->LocateProtocol (&g96BoardsMezzanineProtocolGuid, NULL,
- (VOID **)&Mezzanine);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_INFO, "%a: no mezzanine driver active\n", __FUNCTION__));
- return;
- }
-
Status = Mezzanine->ApplyDeviceTreeOverlay (Mezzanine, Dtb);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: failed to apply DT overlay - %r\n", __FUNCTION__,
@@ -211,7 +224,7 @@ EntryPoint (
Status = gBS->CreateEventEx (
EVT_NOTIFY_SIGNAL,
TPL_NOTIFY,
- ApplyDeviceTreeOverlay,
+ PublishOsDescription,
NULL,
&gEfiEndOfDxeEventGroupGuid,
&EndOfDxeEvent);
diff --git a/Platform/96Boards/LsConnectorDxe/LsConnectorDxe.inf b/Platform/96Boards/LsConnectorDxe/LsConnectorDxe.inf
index 1bf528ceaa84..20b9637c1923 100644
--- a/Platform/96Boards/LsConnectorDxe/LsConnectorDxe.inf
+++ b/Platform/96Boards/LsConnectorDxe/LsConnectorDxe.inf
@@ -46,6 +46,7 @@ [LibraryClasses]
[Protocols]
g96BoardsLsConnectorProtocolGuid ## PRODUCES
g96BoardsMezzanineProtocolGuid ## CONSUMES
+ gEfiAcpiTableProtocolGuid ## SOMETIMES_CONSUMES
[Guids]
gEfiEndOfDxeEventGroupGuid
--
2.20.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#39907): https://edk2.groups.io/g/devel/message/39907
Mute This Topic: https://groups.io/mt/31453109/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-
More information about the edk2-devel-archive
mailing list