12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- /** @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",
- __FUNCTION__
- ));
- 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",
- __FUNCTION__,
- Status
- ));
- return Status;
- }
- DEBUG ((DEBUG_INFO, "Found Xen node with Grant table @ 0x%Lx\n", RegBase));
- return EFI_SUCCESS;
- }
|