Ovmf/Xen: move XenBusDxe to abstract XENIO_PROTOCOL

While Xen on Intel uses a virtual PCI device to communicate the
base address of the grant table, the ARM implementation uses a DT
node, which is fundamentally incompatible with the way XenBusDxe is
implemented, i.e., as a UEFI Driver Model implementation for a PCI
device.

Contributed-under: TianoCore Contribution Agreement 1.0
Acked-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Anthony PERARD <anthony.perard@citrix.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Laszlo Ersek <lersek@redhat.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16973 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Ard Biesheuvel 2015-02-28 20:33:11 +00:00 committed by lersek
parent f2162d3410
commit d9fdfd851a
13 changed files with 29 additions and 58 deletions

View File

@ -444,6 +444,7 @@
OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
OvmfPkg/VirtioScsiDxe/VirtioScsi.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf
OvmfPkg/XenIoPciDxe/XenIoPciDxe.inf
OvmfPkg/XenBusDxe/XenBusDxe.inf OvmfPkg/XenBusDxe/XenBusDxe.inf
OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf
OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf { OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf {

View File

@ -227,6 +227,7 @@ INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf
INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf
INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
INF OvmfPkg/XenIoPciDxe/XenIoPciDxe.inf
INF OvmfPkg/XenBusDxe/XenBusDxe.inf INF OvmfPkg/XenBusDxe/XenBusDxe.inf
INF OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf INF OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf

View File

@ -451,6 +451,7 @@
OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
OvmfPkg/VirtioScsiDxe/VirtioScsi.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf
OvmfPkg/XenIoPciDxe/XenIoPciDxe.inf
OvmfPkg/XenBusDxe/XenBusDxe.inf OvmfPkg/XenBusDxe/XenBusDxe.inf
OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf
OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf { OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf {

View File

@ -227,6 +227,7 @@ INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf
INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf
INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
INF OvmfPkg/XenIoPciDxe/XenIoPciDxe.inf
INF OvmfPkg/XenBusDxe/XenBusDxe.inf INF OvmfPkg/XenBusDxe/XenBusDxe.inf
INF OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf INF OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf

View File

@ -449,6 +449,7 @@
OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
OvmfPkg/VirtioScsiDxe/VirtioScsi.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf
OvmfPkg/XenIoPciDxe/XenIoPciDxe.inf
OvmfPkg/XenBusDxe/XenBusDxe.inf OvmfPkg/XenBusDxe/XenBusDxe.inf
OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf
OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf { OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf {

View File

@ -227,6 +227,7 @@ INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf
INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf
INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
INF OvmfPkg/XenIoPciDxe/XenIoPciDxe.inf
INF OvmfPkg/XenBusDxe/XenBusDxe.inf INF OvmfPkg/XenBusDxe/XenBusDxe.inf
INF OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf INF OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf

View File

@ -155,7 +155,7 @@ XenBusDxeComponentNameGetControllerName (
Status = EfiTestManagedDevice ( Status = EfiTestManagedDevice (
ControllerHandle, ControllerHandle,
gXenBusDxeDriverBinding.DriverBindingHandle, gXenBusDxeDriverBinding.DriverBindingHandle,
&gEfiPciIoProtocolGuid &gXenIoProtocolGuid
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;

View File

@ -139,8 +139,7 @@ XenGrantTableEndAccess (
VOID VOID
XenGrantTableInit ( XenGrantTableInit (
IN XENBUS_DEVICE *Dev, IN XENBUS_DEVICE *Dev
IN UINT64 MmioAddr
) )
{ {
xen_add_to_physmap_t Parameters; xen_add_to_physmap_t Parameters;
@ -155,7 +154,7 @@ XenGrantTableInit (
XenGrantTablePutFreeEntry ((grant_ref_t)Index); XenGrantTablePutFreeEntry ((grant_ref_t)Index);
} }
GrantTable = (VOID*)(UINTN) MmioAddr; GrantTable = (VOID*)(UINTN) Dev->XenIo->GrantTableAddress;
for (Index = 0; Index < NR_GRANT_FRAMES; Index++) { for (Index = 0; Index < NR_GRANT_FRAMES; Index++) {
Parameters.domid = DOMID_SELF; Parameters.domid = DOMID_SELF;
Parameters.idx = Index; Parameters.idx = Index;

View File

@ -29,8 +29,7 @@
**/ **/
VOID VOID
XenGrantTableInit ( XenGrantTableInit (
IN XENBUS_DEVICE *Dev, IN XENBUS_DEVICE *Dev
IN UINT64 MmioAddr
); );
/** /**

View File

@ -138,7 +138,7 @@ XenBusAddDevice (
XENBUS_PRIVATE_DATA *Private; XENBUS_PRIVATE_DATA *Private;
EFI_STATUS Status; EFI_STATUS Status;
XENBUS_DEVICE_PATH *TempXenBusPath; XENBUS_DEVICE_PATH *TempXenBusPath;
VOID *ChildPciIo; VOID *ChildXenIo;
AsciiSPrint (DevicePath, sizeof (DevicePath), AsciiSPrint (DevicePath, sizeof (DevicePath),
"device/%a/%a", Type, Id); "device/%a/%a", Type, Id);
@ -208,8 +208,8 @@ XenBusAddDevice (
} }
Status = gBS->OpenProtocol (Dev->ControllerHandle, Status = gBS->OpenProtocol (Dev->ControllerHandle,
&gEfiPciIoProtocolGuid, &gXenIoProtocolGuid,
&ChildPciIo, Dev->This->DriverBindingHandle, &ChildXenIo, Dev->This->DriverBindingHandle,
Private->Handle, Private->Handle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER); EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {

View File

@ -23,8 +23,6 @@
**/ **/
#include <IndustryStandard/Pci.h>
#include <IndustryStandard/Acpi.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
#include <Library/XenHypercallLib.h> #include <Library/XenHypercallLib.h>
@ -233,34 +231,22 @@ XenBusDxeDriverBindingSupported (
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_PCI_IO_PROTOCOL *PciIo; XENIO_PROTOCOL *XenIo;
PCI_TYPE00 Pci;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
ControllerHandle, ControllerHandle,
&gEfiPciIoProtocolGuid, &gXenIoProtocolGuid,
(VOID **)&PciIo, (VOID **)&XenIo,
This->DriverBindingHandle, This->DriverBindingHandle,
ControllerHandle, ControllerHandle,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, 0, gBS->CloseProtocol (ControllerHandle, &gXenIoProtocolGuid,
sizeof Pci / sizeof (UINT32), &Pci);
if (Status == EFI_SUCCESS) {
if (Pci.Hdr.VendorId == PCI_VENDOR_ID_XEN &&
Pci.Hdr.DeviceId == PCI_DEVICE_ID_XEN_PLATFORM) {
Status = EFI_SUCCESS;
} else {
Status = EFI_UNSUPPORTED;
}
}
gBS->CloseProtocol (ControllerHandle, &gEfiPciIoProtocolGuid,
This->DriverBindingHandle, ControllerHandle); This->DriverBindingHandle, ControllerHandle);
return Status; return Status;
@ -326,19 +312,18 @@ XenBusDxeDriverBindingStart (
{ {
EFI_STATUS Status; EFI_STATUS Status;
XENBUS_DEVICE *Dev; XENBUS_DEVICE *Dev;
EFI_PCI_IO_PROTOCOL *PciIo; XENIO_PROTOCOL *XenIo;
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *BarDesc;
UINT64 MmioAddr;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
ControllerHandle, ControllerHandle,
&gEfiPciIoProtocolGuid, &gXenIoProtocolGuid,
(VOID **) &PciIo, (VOID**)&XenIo,
This->DriverBindingHandle, This->DriverBindingHandle,
ControllerHandle, ControllerHandle,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -360,7 +345,7 @@ XenBusDxeDriverBindingStart (
Dev->Signature = XENBUS_DEVICE_SIGNATURE; Dev->Signature = XENBUS_DEVICE_SIGNATURE;
Dev->This = This; Dev->This = This;
Dev->ControllerHandle = ControllerHandle; Dev->ControllerHandle = ControllerHandle;
Dev->PciIo = PciIo; Dev->XenIo = XenIo;
Dev->DevicePath = DevicePath; Dev->DevicePath = DevicePath;
InitializeListHead (&Dev->ChildList); InitializeListHead (&Dev->ChildList);
@ -376,20 +361,6 @@ XenBusDxeDriverBindingStart (
mMyDevice = Dev; mMyDevice = Dev;
EfiReleaseLock (&mMyDeviceLock); EfiReleaseLock (&mMyDeviceLock);
//
// The BAR1 of this PCI device is used for shared memory and is supposed to
// look like MMIO. The address space of the BAR1 will be used to map the
// Grant Table.
//
Status = PciIo->GetBarAttributes (PciIo, PCI_BAR_IDX1, NULL, (VOID**) &BarDesc);
ASSERT_EFI_ERROR (Status);
ASSERT (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM);
/* Get a Memory address for mapping the Grant Table. */
DEBUG ((EFI_D_INFO, "XenBus: BAR at %LX\n", BarDesc->AddrRangeMin));
MmioAddr = BarDesc->AddrRangeMin;
FreePool (BarDesc);
Status = XenGetSharedInfoPage (Dev); Status = XenGetSharedInfoPage (Dev);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((EFI_D_ERROR, "XenBus: Unable to get the shared info page.\n")); DEBUG ((EFI_D_ERROR, "XenBus: Unable to get the shared info page.\n"));
@ -397,7 +368,7 @@ XenBusDxeDriverBindingStart (
goto ErrorAllocated; goto ErrorAllocated;
} }
XenGrantTableInit (Dev, MmioAddr); XenGrantTableInit (Dev);
Status = XenStoreInit (Dev); Status = XenStoreInit (Dev);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -417,7 +388,7 @@ ErrorAllocated:
gBS->CloseProtocol (ControllerHandle, &gEfiDevicePathProtocolGuid, gBS->CloseProtocol (ControllerHandle, &gEfiDevicePathProtocolGuid,
This->DriverBindingHandle, ControllerHandle); This->DriverBindingHandle, ControllerHandle);
ErrorOpenningProtocol: ErrorOpenningProtocol:
gBS->CloseProtocol (ControllerHandle, &gEfiPciIoProtocolGuid, gBS->CloseProtocol (ControllerHandle, &gXenIoProtocolGuid,
This->DriverBindingHandle, ControllerHandle); This->DriverBindingHandle, ControllerHandle);
return Status; return Status;
} }
@ -507,7 +478,7 @@ XenBusDxeDriverBindingStop (
gBS->CloseProtocol (ControllerHandle, &gEfiDevicePathProtocolGuid, gBS->CloseProtocol (ControllerHandle, &gEfiDevicePathProtocolGuid,
This->DriverBindingHandle, ControllerHandle); This->DriverBindingHandle, ControllerHandle);
gBS->CloseProtocol (ControllerHandle, &gEfiPciIoProtocolGuid, gBS->CloseProtocol (ControllerHandle, &gXenIoProtocolGuid,
This->DriverBindingHandle, ControllerHandle); This->DriverBindingHandle, ControllerHandle);
mMyDevice = NULL; mMyDevice = NULL;

View File

@ -39,7 +39,7 @@
// //
// Consumed Protocols // Consumed Protocols
// //
#include <Protocol/PciIo.h> #include <Protocol/XenIo.h>
// //
@ -73,10 +73,6 @@ extern EFI_COMPONENT_NAME_PROTOCOL gXenBusDxeComponentName;
// //
#include <IndustryStandard/Xen/xen.h> #include <IndustryStandard/Xen/xen.h>
#define PCI_VENDOR_ID_XEN 0x5853
#define PCI_DEVICE_ID_XEN_PLATFORM 0x0001
typedef struct _XENBUS_DEVICE_PATH XENBUS_DEVICE_PATH; typedef struct _XENBUS_DEVICE_PATH XENBUS_DEVICE_PATH;
typedef struct _XENBUS_DEVICE XENBUS_DEVICE; typedef struct _XENBUS_DEVICE XENBUS_DEVICE;
@ -86,7 +82,7 @@ struct _XENBUS_DEVICE {
UINT32 Signature; UINT32 Signature;
EFI_DRIVER_BINDING_PROTOCOL *This; EFI_DRIVER_BINDING_PROTOCOL *This;
EFI_HANDLE ControllerHandle; EFI_HANDLE ControllerHandle;
EFI_PCI_IO_PROTOCOL *PciIo; XENIO_PROTOCOL *XenIo;
EFI_EVENT ExitBootEvent; EFI_EVENT ExitBootEvent;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
LIST_ENTRY ChildList; LIST_ENTRY ChildList;

View File

@ -67,8 +67,8 @@
[Protocols] [Protocols]
gEfiDriverBindingProtocolGuid gEfiDriverBindingProtocolGuid
gEfiPciIoProtocolGuid
gEfiComponentName2ProtocolGuid gEfiComponentName2ProtocolGuid
gEfiComponentNameProtocolGuid gEfiComponentNameProtocolGuid
gXenBusProtocolGuid gXenBusProtocolGuid
gXenIoProtocolGuid