|
@@ -0,0 +1,114 @@
|
|
|
+/** @file
|
|
|
+ LS1043 DXE platform driver.
|
|
|
+
|
|
|
+ Copyright 2018-2019 NXP
|
|
|
+
|
|
|
+ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
+
|
|
|
+**/
|
|
|
+
|
|
|
+#include <Library/BaseLib.h>
|
|
|
+#include <Library/BaseMemoryLib.h>
|
|
|
+#include <Library/DebugLib.h>
|
|
|
+#include <Library/MemoryAllocationLib.h>
|
|
|
+#include <Library/PcdLib.h>
|
|
|
+#include <Library/UefiBootServicesTableLib.h>
|
|
|
+#include <Library/UefiLib.h>
|
|
|
+
|
|
|
+#include <Protocol/NonDiscoverableDevice.h>
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR StartDesc;
|
|
|
+ UINT8 EndDesc;
|
|
|
+} ADDRESS_SPACE_DESCRIPTOR;
|
|
|
+
|
|
|
+STATIC ADDRESS_SPACE_DESCRIPTOR mI2cDesc[FixedPcdGet64 (PcdNumI2cController)];
|
|
|
+
|
|
|
+STATIC
|
|
|
+EFI_STATUS
|
|
|
+RegisterDevice (
|
|
|
+ IN EFI_GUID *TypeGuid,
|
|
|
+ IN ADDRESS_SPACE_DESCRIPTOR *Desc,
|
|
|
+ OUT EFI_HANDLE *Handle
|
|
|
+ )
|
|
|
+{
|
|
|
+ NON_DISCOVERABLE_DEVICE *Device;
|
|
|
+ EFI_STATUS Status;
|
|
|
+
|
|
|
+ Device = (NON_DISCOVERABLE_DEVICE *)AllocateZeroPool (sizeof (*Device));
|
|
|
+ if (Device == NULL) {
|
|
|
+ return EFI_OUT_OF_RESOURCES;
|
|
|
+ }
|
|
|
+
|
|
|
+ Device->Type = TypeGuid;
|
|
|
+ Device->DmaType = NonDiscoverableDeviceDmaTypeNonCoherent;
|
|
|
+ Device->Resources = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)Desc;
|
|
|
+
|
|
|
+ Status = gBS->InstallMultipleProtocolInterfaces (Handle,
|
|
|
+ &gEdkiiNonDiscoverableDeviceProtocolGuid, Device,
|
|
|
+ NULL);
|
|
|
+ if (EFI_ERROR (Status)) {
|
|
|
+ goto FreeDevice;
|
|
|
+ }
|
|
|
+ return EFI_SUCCESS;
|
|
|
+
|
|
|
+FreeDevice:
|
|
|
+ FreePool (Device);
|
|
|
+
|
|
|
+ return Status;
|
|
|
+}
|
|
|
+
|
|
|
+VOID
|
|
|
+PopulateI2cInformation (
|
|
|
+ IN VOID
|
|
|
+ )
|
|
|
+{
|
|
|
+ UINT32 Index;
|
|
|
+
|
|
|
+ for (Index = 0; Index < FixedPcdGet32 (PcdNumI2cController); Index++) {
|
|
|
+ mI2cDesc[Index].StartDesc.Desc = ACPI_ADDRESS_SPACE_DESCRIPTOR;
|
|
|
+ mI2cDesc[Index].StartDesc.Len = sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) - 3;
|
|
|
+ mI2cDesc[Index].StartDesc.ResType = ACPI_ADDRESS_SPACE_TYPE_MEM;
|
|
|
+ mI2cDesc[Index].StartDesc.GenFlag = 0;
|
|
|
+ mI2cDesc[Index].StartDesc.SpecificFlag = 0;
|
|
|
+ mI2cDesc[Index].StartDesc.AddrSpaceGranularity = 32;
|
|
|
+ mI2cDesc[Index].StartDesc.AddrRangeMin = FixedPcdGet64 (PcdI2c0BaseAddr) +
|
|
|
+ (Index * FixedPcdGet32 (PcdI2cSize));
|
|
|
+ mI2cDesc[Index].StartDesc.AddrRangeMax = mI2cDesc[Index].StartDesc.AddrRangeMin +
|
|
|
+ FixedPcdGet32 (PcdI2cSize) - 1;
|
|
|
+ mI2cDesc[Index].StartDesc.AddrTranslationOffset = 0;
|
|
|
+ mI2cDesc[Index].StartDesc.AddrLen = FixedPcdGet32 (PcdI2cSize);
|
|
|
+
|
|
|
+ mI2cDesc[Index].EndDesc = ACPI_END_TAG_DESCRIPTOR;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+EFI_STATUS
|
|
|
+EFIAPI
|
|
|
+PlatformDxeEntryPoint (
|
|
|
+ IN EFI_HANDLE ImageHandle,
|
|
|
+ IN EFI_SYSTEM_TABLE *SystemTable
|
|
|
+ )
|
|
|
+{
|
|
|
+ EFI_STATUS Status;
|
|
|
+ EFI_HANDLE Handle;
|
|
|
+
|
|
|
+ Handle = NULL;
|
|
|
+
|
|
|
+ PopulateI2cInformation ();
|
|
|
+
|
|
|
+ Status = RegisterDevice (&gNxpNonDiscoverableI2cMasterGuid,
|
|
|
+ &mI2cDesc[0], &Handle);
|
|
|
+ ASSERT_EFI_ERROR (Status);
|
|
|
+
|
|
|
+ //
|
|
|
+ // Install the DS1307 I2C Master protocol on this handle so the RTC driver
|
|
|
+ // can identify it as the I2C master it can invoke directly.
|
|
|
+ //
|
|
|
+ Status = gBS->InstallProtocolInterface (&Handle,
|
|
|
+ &gDs1307RealTimeClockLibI2cMasterProtocolGuid,
|
|
|
+ EFI_NATIVE_INTERFACE, NULL);
|
|
|
+ ASSERT_EFI_ERROR (Status);
|
|
|
+
|
|
|
+ return EFI_SUCCESS;
|
|
|
+}
|