/** @file LS1043 DXE platform driver. Copyright 2018-2020 NXP SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include 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; }