123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /** @file
- LS1043 DXE platform driver.
- Copyright 2018-2020 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 <Soc.h>
- #include <Protocol/NonDiscoverableDevice.h>
- typedef struct {
- EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR StartDesc;
- UINT8 EndDesc;
- } ADDRESS_SPACE_DESCRIPTOR;
- STATIC ADDRESS_SPACE_DESCRIPTOR mI2cDesc[LS1043A_I2C_NUM_CONTROLLERS];
- 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 < ARRAY_SIZE (mI2cDesc); 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 = LS1043A_I2C0_PHYS_ADDRESS +
- (Index * LS1043A_I2C_SIZE);
- mI2cDesc[Index].StartDesc.AddrRangeMax = mI2cDesc[Index].StartDesc.AddrRangeMin +
- LS1043A_I2C_SIZE - 1;
- mI2cDesc[Index].StartDesc.AddrTranslationOffset = 0;
- mI2cDesc[Index].StartDesc.AddrLen = LS1043A_I2C_SIZE;
- 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;
- }
|