/** @file | |
* Xenio FDT client protocol driver for xen,xen DT node | |
* | |
* Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> | |
* | |
* SPDX-License-Identifier: BSD-2-Clause-Patent | |
* | |
**/ | |
#include <Library/BaseLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/UefiDriverEntryPoint.h> | |
#include <Library/UefiBootServicesTableLib.h> | |
#include <Library/XenIoMmioLib.h> | |
#include <Protocol/FdtClient.h> | |
EFI_STATUS | |
EFIAPI | |
InitializeXenioFdtDxe ( | |
IN EFI_HANDLE ImageHandle, | |
IN EFI_SYSTEM_TABLE *SystemTable | |
) | |
{ | |
EFI_STATUS Status; | |
FDT_CLIENT_PROTOCOL *FdtClient; | |
CONST UINT64 *Reg; | |
UINT32 RegSize; | |
UINTN AddressCells, SizeCells; | |
EFI_HANDLE Handle; | |
UINT64 RegBase; | |
Status = gBS->LocateProtocol ( | |
&gFdtClientProtocolGuid, | |
NULL, | |
(VOID **)&FdtClient | |
); | |
ASSERT_EFI_ERROR (Status); | |
Status = FdtClient->FindCompatibleNodeReg ( | |
FdtClient, | |
"xen,xen", | |
(CONST VOID **)&Reg, | |
&AddressCells, | |
&SizeCells, | |
&RegSize | |
); | |
if (EFI_ERROR (Status)) { | |
DEBUG (( | |
DEBUG_WARN, | |
"%a: No 'xen,xen' compatible DT node found\n", | |
__func__ | |
)); | |
return EFI_UNSUPPORTED; | |
} | |
ASSERT (AddressCells == 2); | |
ASSERT (SizeCells == 2); | |
ASSERT (RegSize == 2 * sizeof (UINT64)); | |
// | |
// Retrieve the reg base from this node and wire it up to the | |
// MMIO flavor of the XenBus root device I/O protocol | |
// | |
RegBase = SwapBytes64 (Reg[0]); | |
Handle = NULL; | |
Status = XenIoMmioInstall (&Handle, RegBase); | |
if (EFI_ERROR (Status)) { | |
DEBUG (( | |
DEBUG_ERROR, | |
"%a: XenIoMmioInstall () failed on a new handle " | |
"(Status == %r)\n", | |
__func__, | |
Status | |
)); | |
return Status; | |
} | |
DEBUG ((DEBUG_INFO, "Found Xen node with Grant table @ 0x%Lx\n", RegBase)); | |
return EFI_SUCCESS; | |
} |