[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 02/18] OvmfPkg: Add basic skeleton for the XenBus bus driver.
On Thu, Sep 04, 2014 at 05:50:57PM +0100, Anthony PERARD wrote: > This includes Component Name and Driver Binding. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> > > --- > Change in V2: > - Simple support of controller name. > - Cleaning up comments, files header. > - Add Licenses > - Rename XenbusDxe to XenBusDxe. > --- > OvmfPkg/OvmfPkgX64.dsc | 1 + > OvmfPkg/OvmfPkgX64.fdf | 1 + > OvmfPkg/XenBusDxe/ComponentName.c | 190 +++++++++++++++++++++++ > OvmfPkg/XenBusDxe/ComponentName.h | 110 +++++++++++++ > OvmfPkg/XenBusDxe/DriverBinding.h | 144 +++++++++++++++++ > OvmfPkg/XenBusDxe/XenBusDxe.c | 317 > ++++++++++++++++++++++++++++++++++++++ > OvmfPkg/XenBusDxe/XenBusDxe.h | 93 +++++++++++ > OvmfPkg/XenBusDxe/XenBusDxe.inf | 56 +++++++ > 8 files changed, 912 insertions(+) > create mode 100644 OvmfPkg/XenBusDxe/ComponentName.c > create mode 100644 OvmfPkg/XenBusDxe/ComponentName.h > create mode 100644 OvmfPkg/XenBusDxe/DriverBinding.h > create mode 100644 OvmfPkg/XenBusDxe/XenBusDxe.c > create mode 100644 OvmfPkg/XenBusDxe/XenBusDxe.h > create mode 100644 OvmfPkg/XenBusDxe/XenBusDxe.inf > > diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc > index 73a6460..c52d5a4 100644 > --- a/OvmfPkg/OvmfPkgX64.dsc > +++ b/OvmfPkg/OvmfPkgX64.dsc > @@ -432,6 +432,7 @@ > OvmfPkg/VirtioBlkDxe/VirtioBlk.inf > OvmfPkg/VirtioScsiDxe/VirtioScsi.inf > OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf > + OvmfPkg/XenBusDxe/XenBusDxe.inf > OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf { > <LibraryClasses> > PlatformFvbLib|OvmfPkg/Library/EmuVariableFvbLib/EmuVariableFvbLib.inf > diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf > index 29382fb..6b556a2 100644 > --- a/OvmfPkg/OvmfPkgX64.fdf > +++ b/OvmfPkg/OvmfPkgX64.fdf > @@ -227,6 +227,7 @@ INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf > INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf > INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf > INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf > +INF OvmfPkg/XenBusDxe/XenBusDxe.inf > > !if $(SECURE_BOOT_ENABLE) == TRUE > INF SecurityPkg/VariableAuthenticated/RuntimeDxe/VariableRuntimeDxe.inf > diff --git a/OvmfPkg/XenBusDxe/ComponentName.c > b/OvmfPkg/XenBusDxe/ComponentName.c > new file mode 100644 > index 0000000..bcf1e51 > --- /dev/null > +++ b/OvmfPkg/XenBusDxe/ComponentName.c > @@ -0,0 +1,190 @@ > +/** @file > + Component Name functions implementation for XenBus Bus driver. > + > + Copyright (C) 2014, Citrix Ltd. > + > + Redistribution and use in source and binary forms, with or without > + modification, are permitted provided that the following conditions > + are met: > + > + * Redistributions of source code must retain the above copyright > + notice, this list of conditions and the following disclaimer. > + * Redistributions in binary form must reproduce the above copyright > + notice, this list of conditions and the following disclaimer in > + the documentation and/or other materials provided with the > + distribution. > + > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS > + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE > + COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, > + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, > + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; > + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN > + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > + POSSIBILITY OF SUCH DAMAGE. > + > +**/ > + > +#include "XenBusDxe.h" > + > +/// > +/// Component Name Protocol instance > +/// > +GLOBAL_REMOVE_IF_UNREFERENCED > +EFI_COMPONENT_NAME_PROTOCOL gXenBusDxeComponentName = { > + (EFI_COMPONENT_NAME_GET_DRIVER_NAME) > XenBusDxeComponentNameGetDriverName, > + > (EFI_COMPONENT_NAME_GET_CONTROLLER_NAME)XenBusDxeComponentNameGetControllerName, > + "eng" > +}; > + > +/// > +/// Component Name 2 Protocol instance > +/// > +GLOBAL_REMOVE_IF_UNREFERENCED > +EFI_COMPONENT_NAME2_PROTOCOL gXenBusDxeComponentName2 = { > + XenBusDxeComponentNameGetDriverName, > + XenBusDxeComponentNameGetControllerName, > + "en" > +}; > + > +/// > +/// Table of driver names > +/// > +GLOBAL_REMOVE_IF_UNREFERENCED > +EFI_UNICODE_STRING_TABLE mXenBusDxeDriverNameTable[] = { > + { "eng;en", (CHAR16 *)L"XenBus Bus Driver" }, > + { NULL, NULL } > +}; > + > +/// > +/// Table of controller names > +/// > +GLOBAL_REMOVE_IF_UNREFERENCED > +EFI_UNICODE_STRING_TABLE mXenBusDxeControllerNameTable[] = { > + { "eng;en", (CHAR16 *)L"XenBus Controller" }, > + { NULL, NULL } > +}; > + > +/** > + Retrieves a Unicode string that is the user-readable name of the EFI > Driver. > + > + @param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. > + @param Language A pointer to a three-character ISO 639-2 language > identifier. > + This is the language of the driver name that that the > caller > + is requesting, and it must match one of the languages > specified > + in SupportedLanguages. The number of languages > supported by a > + driver is up to the driver writer. > + @param DriverName A pointer to the Unicode string to return. This > Unicode string > + is the name of the driver specified by This in the > language > + specified by Language. > + > + @retval EFI_SUCCESS The Unicode string for the Driver specified > by This > + and the language specified by Language was > returned > + in DriverName. > + @retval EFI_INVALID_PARAMETER Language is NULL. > + @retval EFI_INVALID_PARAMETER DriverName is NULL. > + @retval EFI_UNSUPPORTED The driver specified by This does not > support the > + language specified by Language. > + > +**/ > +EFI_STATUS > +EFIAPI > +XenBusDxeComponentNameGetDriverName ( > + IN EFI_COMPONENT_NAME2_PROTOCOL *This, > + IN CHAR8 *Language, > + OUT CHAR16 **DriverName > + ) > +{ > + return LookupUnicodeString2 ( > + Language, > + This->SupportedLanguages, > + mXenBusDxeDriverNameTable, > + DriverName, > + (BOOLEAN)(This != &gXenBusDxeComponentName2) > + ); > +} > + > +/** > + Retrieves a Unicode string that is the user readable name of the controller > + that is being managed by an EFI Driver. > + > + @param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL > instance. > + @param ControllerHandle The handle of a controller that the driver > specified by > + This is managing. This handle specifies the > controller > + whose name is to be returned. > + @param ChildHandle The handle of the child controller to retrieve > the name > + of. This is an optional parameter that may be > NULL. It > + will be NULL for device drivers. It will also be > NULL > + for a bus drivers that wish to retrieve the name > of the > + bus controller. It will not be NULL for a bus > driver > + that wishes to retrieve the name of a child > controller. > + @param Language A pointer to a three character ISO 639-2 language > + identifier. This is the language of the > controller name > + that the caller is requesting, and it must match > one > + of the languages specified in SupportedLanguages. > The > + number of languages supported by a driver is up > to the > + driver writer. > + @param ControllerName A pointer to the Unicode string to return. This > Unicode > + string is the name of the controller specified by > + ControllerHandle and ChildHandle in the language > specified > + by Language, from the point of view of the driver > specified > + by This. > + > + @retval EFI_SUCCESS The Unicode string for the user-readable > name in the > + language specified by Language for the driver > + specified by This was returned in DriverName. > + @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > valid EFI_HANDLE. > + @retval EFI_INVALID_PARAMETER Language is NULL. > + @retval EFI_INVALID_PARAMETER ControllerName is NULL. > + @retval EFI_UNSUPPORTED The driver specified by This is not > currently managing > + the controller specified by ControllerHandle > and > + ChildHandle. > + @retval EFI_UNSUPPORTED The driver specified by This does not > support the > + language specified by Language. > + > +**/ > +EFI_STATUS > +EFIAPI > +XenBusDxeComponentNameGetControllerName ( > + IN EFI_COMPONENT_NAME2_PROTOCOL *This, > + IN EFI_HANDLE ControllerHandle, > + IN EFI_HANDLE ChildHandle OPTIONAL, > + IN CHAR8 *Language, > + OUT CHAR16 **ControllerName > + ) > +{ > + EFI_STATUS Status; > + > + if (ChildHandle != NULL) { > + // TODO Get controller name for a child. > + return EFI_UNSUPPORTED; > + } > + > + // > + // Make sure this driver is currently managing ControllerHandle > + // > + Status = EfiTestManagedDevice ( > + ControllerHandle, > + gXenBusDxeDriverBinding.DriverBindingHandle, > + &gEfiPciIoProtocolGuid > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + // > + // Lookup name of controller specified by ControllerHandle > + // > + return LookupUnicodeString2 ( > + Language, > + This->SupportedLanguages, > + mXenBusDxeControllerNameTable, > + ControllerName, > + (BOOLEAN)(This != &gXenBusDxeComponentName2) > + ); > +} > diff --git a/OvmfPkg/XenBusDxe/ComponentName.h > b/OvmfPkg/XenBusDxe/ComponentName.h > new file mode 100644 > index 0000000..dfafce6 > --- /dev/null > +++ b/OvmfPkg/XenBusDxe/ComponentName.h > @@ -0,0 +1,110 @@ > +/** @file > + Component Name functions declaration for XenBus Bus driver. > + > + Copyright (C) 2014, Citrix Ltd. > + > + Redistribution and use in source and binary forms, with or without > + modification, are permitted provided that the following conditions > + are met: > + > + * Redistributions of source code must retain the above copyright > + notice, this list of conditions and the following disclaimer. > + * Redistributions in binary form must reproduce the above copyright > + notice, this list of conditions and the following disclaimer in > + the documentation and/or other materials provided with the > + distribution. > + > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS > + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE > + COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, > + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, > + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; > + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN > + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > + POSSIBILITY OF SUCH DAMAGE. > + > +**/ > + > +/** > + Retrieves a Unicode string that is the user-readable name of the EFI > Driver. > + > + @param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. > + @param Language A pointer to a three-character ISO 639-2 language > identifier. > + This is the language of the driver name that that the > caller > + is requesting, and it must match one of the languages > specified > + in SupportedLanguages. The number of languages > supported by a > + driver is up to the driver writer. > + @param DriverName A pointer to the Unicode string to return. This > Unicode string > + is the name of the driver specified by This in the > language > + specified by Language. > + > + @retval EFI_SUCCESS The Unicode string for the Driver specified > by This > + and the language specified by Language was > returned > + in DriverName. > + @retval EFI_INVALID_PARAMETER Language is NULL. > + @retval EFI_INVALID_PARAMETER DriverName is NULL. > + @retval EFI_UNSUPPORTED The driver specified by This does not > support the > + language specified by Language. > + > +**/ > +EFI_STATUS > +EFIAPI > +XenBusDxeComponentNameGetDriverName ( > + IN EFI_COMPONENT_NAME2_PROTOCOL *This, > + IN CHAR8 *Language, > + OUT CHAR16 **DriverName > + ); > + > +/** > + Retrieves a Unicode string that is the user readable name of the controller > + that is being managed by an EFI Driver. > + > + @param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL > instance. > + @param ControllerHandle The handle of a controller that the driver > specified by > + This is managing. This handle specifies the > controller > + whose name is to be returned. > + @param ChildHandle The handle of the child controller to retrieve > the name > + of. This is an optional parameter that may be > NULL. It > + will be NULL for device drivers. It will also be > NULL > + for a bus drivers that wish to retrieve the name > of the > + bus controller. It will not be NULL for a bus > driver > + that wishes to retrieve the name of a child > controller. > + @param Language A pointer to a three character ISO 639-2 language > + identifier. This is the language of the > controller name > + that the caller is requesting, and it must match > one > + of the languages specified in SupportedLanguages. > The > + number of languages supported by a driver is up > to the > + driver writer. > + @param ControllerName A pointer to the Unicode string to return. This > Unicode > + string is the name of the controller specified by > + ControllerHandle and ChildHandle in the language > specified > + by Language, from the point of view of the driver > specified > + by This. > + > + @retval EFI_SUCCESS The Unicode string for the user-readable > name in the > + language specified by Language for the driver > + specified by This was returned in DriverName. > + @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > valid EFI_HANDLE. > + @retval EFI_INVALID_PARAMETER Language is NULL. > + @retval EFI_INVALID_PARAMETER ControllerName is NULL. > + @retval EFI_UNSUPPORTED The driver specified by This is not > currently managing > + the controller specified by ControllerHandle > and > + ChildHandle. > + @retval EFI_UNSUPPORTED The driver specified by This does not > support the > + language specified by Language. > + > +**/ > +EFI_STATUS > +EFIAPI > +XenBusDxeComponentNameGetControllerName ( > + IN EFI_COMPONENT_NAME2_PROTOCOL *This, > + IN EFI_HANDLE ControllerHandle, > + IN EFI_HANDLE ChildHandle OPTIONAL, > + IN CHAR8 *Language, > + OUT CHAR16 **ControllerName > + ); > diff --git a/OvmfPkg/XenBusDxe/DriverBinding.h > b/OvmfPkg/XenBusDxe/DriverBinding.h > new file mode 100644 > index 0000000..13e0a90 > --- /dev/null > +++ b/OvmfPkg/XenBusDxe/DriverBinding.h > @@ -0,0 +1,144 @@ > +/** @file > + Driver Binding functions declaration for XenBus Bus driver. > + > + Copyright (C) 2014, Citrix Ltd. > + > + Redistribution and use in source and binary forms, with or without > + modification, are permitted provided that the following conditions > + are met: > + > + * Redistributions of source code must retain the above copyright > + notice, this list of conditions and the following disclaimer. > + * Redistributions in binary form must reproduce the above copyright > + notice, this list of conditions and the following disclaimer in > + the documentation and/or other materials provided with the > + distribution. > + > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS > + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE > + COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, > + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, > + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; > + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN > + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > + POSSIBILITY OF SUCH DAMAGE. > + > +**/ > + > +/** > + Tests to see if this driver supports a given controller. If a child device > is provided, > + it further tests to see if this driver supports creating a handle for the > specified child device. > + > + @param[in] This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL instance. > + @param[in] ControllerHandle The handle of the controller to test. > This handle > + must support a protocol interface that > supplies > + an I/O abstraction to the driver. > + @param[in] RemainingDevicePath A pointer to the remaining portion of a > device path. This > + parameter is ignored by device drivers, > and is optional for bus > + drivers. For bus drivers, if this > parameter is not NULL, then > + the bus driver must determine if the bus > controller specified > + by ControllerHandle and the child > controller specified > + by RemainingDevicePath are both supported > by this > + bus driver. > + > + @retval EFI_SUCCESS The device specified by ControllerHandle > and > + RemainingDevicePath is supported by the > driver specified by This. > + @retval EFI_ALREADY_STARTED The device specified by ControllerHandle > and > + RemainingDevicePath is already being > managed by the driver > + specified by This. > + @retval EFI_ACCESS_DENIED The device specified by ControllerHandle > and > + RemainingDevicePath is already being > managed by a different > + driver or an application that requires > exclusive access. > + Currently not implemented. > + @retval EFI_UNSUPPORTED The device specified by ControllerHandle > and > + RemainingDevicePath is not supported by > the driver specified by This. > +**/ > +EFI_STATUS > +EFIAPI > +XenBusDxeDriverBindingSupported ( > + IN EFI_DRIVER_BINDING_PROTOCOL *This, > + IN EFI_HANDLE ControllerHandle, > + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > + ); > + > +/** > + Starts a device controller or a bus controller. > + > + The Start() function is designed to be invoked from the EFI boot service > ConnectController(). > + As a result, much of the error checking on the parameters to Start() has > been moved into this > + common boot service. It is legal to call Start() from other locations, > + but the following calling restrictions must be followed, or the system > behavior will not be deterministic. > + 1. ControllerHandle must be a valid EFI_HANDLE. > + 2. If RemainingDevicePath is not NULL, then it must be a pointer to a > naturally aligned > + EFI_DEVICE_PATH_PROTOCOL. > + 3. Prior to calling Start(), the Supported() function for the driver > specified by This must > + have been called with the same calling parameters, and Supported() must > have returned EFI_SUCCESS. > + > + @param[in] This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL instance. > + @param[in] ControllerHandle The handle of the controller to start. > This handle > + must support a protocol interface that > supplies > + an I/O abstraction to the driver. > + @param[in] RemainingDevicePath A pointer to the remaining portion of a > device path. This > + parameter is ignored by device drivers, > and is optional for bus > + drivers. For a bus driver, if this > parameter is NULL, then handles > + for all the children of Controller are > created by this driver. > + If this parameter is not NULL and the > first Device Path Node is > + not the End of Device Path Node, then > only the handle for the > + child device specified by the first > Device Path Node of > + RemainingDevicePath is created by this > driver. > + If the first Device Path Node of > RemainingDevicePath is > + the End of Device Path Node, no child > handle is created by this > + driver. > + > + @retval EFI_SUCCESS The device was started. > + @retval EFI_DEVICE_ERROR The device could not be started due to a > device error.Currently not implemented. > + @retval EFI_OUT_OF_RESOURCES The request could not be completed due to > a lack of resources. > + @retval Others The driver failded to start the device. > + > +**/ > +EFI_STATUS > +EFIAPI > +XenBusDxeDriverBindingStart ( > + IN EFI_DRIVER_BINDING_PROTOCOL *This, > + IN EFI_HANDLE ControllerHandle, > + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > + ); > + > +/** > + Stops a device controller or a bus controller. > + > + The Stop() function is designed to be invoked from the EFI boot service > DisconnectController(). > + As a result, much of the error checking on the parameters to Stop() has > been moved > + into this common boot service. It is legal to call Stop() from other > locations, > + but the following calling restrictions must be followed, or the system > behavior will not be deterministic. > + 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous > call to this > + same driver's Start() function. > + 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a > valid > + EFI_HANDLE. In addition, all of these handles must have been created in > this driver's > + Start() function, and the Start() function must have called > OpenProtocol() on > + ControllerHandle with an Attribute of > EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. > + > + @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL > instance. > + @param[in] ControllerHandle A handle to the device being stopped. The > handle must > + support a bus specific I/O protocol for the > driver > + to use to stop the device. > + @param[in] NumberOfChildren The number of child device handles in > ChildHandleBuffer. > + @param[in] ChildHandleBuffer An array of child handles to be freed. May > be NULL > + if NumberOfChildren is 0. > + > + @retval EFI_SUCCESS The device was stopped. > + @retval EFI_DEVICE_ERROR The device could not be stopped due to a > device error. > + > +**/ > +EFI_STATUS > +EFIAPI > +XenBusDxeDriverBindingStop ( > + IN EFI_DRIVER_BINDING_PROTOCOL *This, > + IN EFI_HANDLE ControllerHandle, > + IN UINTN NumberOfChildren, > + IN EFI_HANDLE *ChildHandleBuffer OPTIONAL > + ); > diff --git a/OvmfPkg/XenBusDxe/XenBusDxe.c b/OvmfPkg/XenBusDxe/XenBusDxe.c > new file mode 100644 > index 0000000..a272204 > --- /dev/null > +++ b/OvmfPkg/XenBusDxe/XenBusDxe.c > @@ -0,0 +1,317 @@ > +/** @file > + This driver produces XenBus Protocol instances for each Xen PV devices. > + > + This XenBus bus driver will first initialize differente services in order > to > + enumerate the ParaVirtualized devices available. > + > + Those services are: > + - HyperCall > + - Event Channel > + - Grant Table > + - XenStore > + - XenBus > + > + Copyright (C) 2014, Citrix Ltd. > + > + Redistribution and use in source and binary forms, with or without > + modification, are permitted provided that the following conditions > + are met: > + > + * Redistributions of source code must retain the above copyright > + notice, this list of conditions and the following disclaimer. > + * Redistributions in binary form must reproduce the above copyright > + notice, this list of conditions and the following disclaimer in > + the documentation and/or other materials provided with the > + distribution. > + > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS > + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE > + COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, > + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, > + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; > + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN > + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > + POSSIBILITY OF SUCH DAMAGE. > + > +**/ > + > +#include <IndustryStandard/Pci.h> > +#include <IndustryStandard/Acpi.h> > +#include <Library/DebugLib.h> > + > +#include "XenBusDxe.h" > + > + > +/// > +/// Driver Binding Protocol instance > +/// > +EFI_DRIVER_BINDING_PROTOCOL gXenBusDxeDriverBinding = { > + XenBusDxeDriverBindingSupported, > + XenBusDxeDriverBindingStart, > + XenBusDxeDriverBindingStop, > + XENBUS_DXE_VERSION, > + NULL, > + NULL > +}; > + > + > +/** > + Unloads an image. > + > + @param ImageHandle Handle that identifies the image to be > unloaded. > + > + @retval EFI_SUCCESS The image has been unloaded. > + @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle. > + > +**/ > +EFI_STATUS > +EFIAPI > +XenBusDxeUnload ( > + IN EFI_HANDLE ImageHandle > + ) > +{ > + EFI_STATUS Status; > + > + EFI_HANDLE *HandleBuffer; > + UINTN HandleCount; > + UINTN Index; > + > + // > + // Retrieve array of all handles in the handle database > + // > + Status = gBS->LocateHandleBuffer ( > + AllHandles, > + NULL, > + NULL, > + &HandleCount, > + &HandleBuffer > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + // > + // Disconnect the current driver from handles in the handle database > + // > + for (Index = 0; Index < HandleCount; Index++) { > + gBS->DisconnectController (HandleBuffer[Index], gImageHandle, NULL); > + } > + > + // > + // Free the array of handles > + // > + FreePool (HandleBuffer); > + > + > + // > + // Uninstall protocols installed in the driver entry point > + // > + Status = gBS->UninstallMultipleProtocolInterfaces ( > + ImageHandle, > + &gEfiDriverBindingProtocolGuid, &gXenBusDxeDriverBinding, > + &gEfiComponentNameProtocolGuid, &gXenBusDxeComponentName, > + &gEfiComponentName2ProtocolGuid, &gXenBusDxeComponentName2, > + NULL > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + This is the declaration of an EFI image entry point. This entry point is > + the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including > + both device drivers and bus drivers. > + > + @param ImageHandle The firmware allocated handle for the UEFI > image. > + @param SystemTable A pointer to the EFI System Table. > + > + @retval EFI_SUCCESS The operation completed successfully. > + @retval Others An unexpected error occurred. > +**/ > +EFI_STATUS > +EFIAPI > +XenBusDxeDriverEntryPoint ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + > + // > + // Install UEFI Driver Model protocol(s). > + // > + Status = EfiLibInstallDriverBindingComponentName2 ( > + ImageHandle, > + SystemTable, > + &gXenBusDxeDriverBinding, > + ImageHandle, > + &gXenBusDxeComponentName, > + &gXenBusDxeComponentName2 > + ); > + ASSERT_EFI_ERROR (Status); > + > + > + return Status; > +} > + > + > +/** > + Tests to see if this driver supports a given controller. If a child device > is provided, > + it further tests to see if this driver supports creating a handle for the > specified child device. > + > + @param[in] This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL instance. > + @param[in] ControllerHandle The handle of the controller to test. > This handle > + must support a protocol interface that > supplies > + an I/O abstraction to the driver. > + @param[in] RemainingDevicePath A pointer to the remaining portion of a > device path. This > + parameter is ignored by device drivers, > and is optional for bus > + drivers. For bus drivers, if this > parameter is not NULL, then > + the bus driver must determine if the bus > controller specified > + by ControllerHandle and the child > controller specified > + by RemainingDevicePath are both supported > by this > + bus driver. > + > + @retval EFI_SUCCESS The device specified by ControllerHandle > and > + RemainingDevicePath is supported by the > driver specified by This. > + @retval EFI_ALREADY_STARTED The device specified by ControllerHandle > and > + RemainingDevicePath is already being > managed by the driver > + specified by This. > + @retval EFI_ACCESS_DENIED The device specified by ControllerHandle > and > + RemainingDevicePath is already being > managed by a different > + driver or an application that requires > exclusive access. > + Currently not implemented. > + @retval EFI_UNSUPPORTED The device specified by ControllerHandle > and > + RemainingDevicePath is not supported by > the driver specified by This. > +**/ > +EFI_STATUS > +EFIAPI > +XenBusDxeDriverBindingSupported ( > + IN EFI_DRIVER_BINDING_PROTOCOL *This, > + IN EFI_HANDLE ControllerHandle, > + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > + ) > +{ > + EFI_STATUS Status; > + EFI_PCI_IO_PROTOCOL *PciIo; > + PCI_TYPE00 Pci; > + > + Status = gBS->OpenProtocol ( > + ControllerHandle, > + &gEfiPciIoProtocolGuid, > + (VOID **)&PciIo, > + This->DriverBindingHandle, > + ControllerHandle, > + EFI_OPEN_PROTOCOL_BY_DRIVER > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, 0, > + 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); > + > + return Status; > +} > + > +/** > + Starts a bus controller. > + > + The Start() function is designed to be invoked from the EFI boot service > ConnectController(). > + As a result, much of the error checking on the parameters to Start() has > been moved into this > + common boot service. It is legal to call Start() from other locations, > + but the following calling restrictions must be followed, or the system > behavior will not be deterministic. > + 1. ControllerHandle must be a valid EFI_HANDLE. > + 2. If RemainingDevicePath is not NULL, then it must be a pointer to a > naturally aligned > + EFI_DEVICE_PATH_PROTOCOL. > + 3. Prior to calling Start(), the Supported() function for the driver > specified by This must > + have been called with the same calling parameters, and Supported() must > have returned EFI_SUCCESS. > + > + @param[in] This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL instance. > + @param[in] ControllerHandle The handle of the controller to start. > This handle > + must support a protocol interface that > supplies > + an I/O abstraction to the driver. > + @param[in] RemainingDevicePath A pointer to the remaining portion of a > device path. This > + parameter is ignored by device drivers, > and is optional for bus > + drivers. For a bus driver, if this > parameter is NULL, then handles > + for all the children of Controller are > created by this driver. > + If this parameter is not NULL and the > first Device Path Node is > + not the End of Device Path Node, then > only the handle for the > + child device specified by the first > Device Path Node of > + RemainingDevicePath is created by this > driver. > + If the first Device Path Node of > RemainingDevicePath is > + the End of Device Path Node, no child > handle is created by this > + driver. > + > + @retval EFI_SUCCESS The device was started. > + @retval EFI_DEVICE_ERROR The device could not be started due to a > device error.Currently not implemented. > + @retval EFI_OUT_OF_RESOURCES The request could not be completed due to > a lack of resources. > + @retval Others The driver failded to start the device. > + > +**/ > +EFI_STATUS > +EFIAPI > +XenBusDxeDriverBindingStart ( > + IN EFI_DRIVER_BINDING_PROTOCOL *This, > + IN EFI_HANDLE ControllerHandle, > + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + Stops a bus controller. > + > + The Stop() function is designed to be invoked from the EFI boot service > DisconnectController(). > + As a result, much of the error checking on the parameters to Stop() has > been moved > + into this common boot service. It is legal to call Stop() from other > locations, > + but the following calling restrictions must be followed, or the system > behavior will not be deterministic. > + 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous > call to this > + same driver's Start() function. > + 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a > valid > + EFI_HANDLE. In addition, all of these handles must have been created in > this driver's > + Start() function, and the Start() function must have called > OpenProtocol() on > + ControllerHandle with an Attribute of > EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. > + > + @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL > instance. > + @param[in] ControllerHandle A handle to the device being stopped. The > handle must > + support a bus specific I/O protocol for the > driver > + to use to stop the device. > + @param[in] NumberOfChildren The number of child device handles in > ChildHandleBuffer. > + @param[in] ChildHandleBuffer An array of child handles to be freed. May > be NULL > + if NumberOfChildren is 0. > + > + @retval EFI_SUCCESS The device was stopped. > + @retval EFI_DEVICE_ERROR The device could not be stopped due to a > device error. > + > +**/ > +EFI_STATUS > +EFIAPI > +XenBusDxeDriverBindingStop ( > + IN EFI_DRIVER_BINDING_PROTOCOL *This, > + IN EFI_HANDLE ControllerHandle, > + IN UINTN NumberOfChildren, > + IN EFI_HANDLE *ChildHandleBuffer OPTIONAL > + ) > +{ > + return EFI_UNSUPPORTED; > +} > diff --git a/OvmfPkg/XenBusDxe/XenBusDxe.h b/OvmfPkg/XenBusDxe/XenBusDxe.h > new file mode 100644 > index 0000000..4c11f60 > --- /dev/null > +++ b/OvmfPkg/XenBusDxe/XenBusDxe.h > @@ -0,0 +1,93 @@ > +/** @file > + Function declaration and internal data for XenBusDxe. > + > + Copyright (C) 2014, Citrix Ltd. > + > + Redistribution and use in source and binary forms, with or without > + modification, are permitted provided that the following conditions > + are met: > + > + * Redistributions of source code must retain the above copyright > + notice, this list of conditions and the following disclaimer. > + * Redistributions in binary form must reproduce the above copyright > + notice, this list of conditions and the following disclaimer in > + the documentation and/or other materials provided with the > + distribution. > + > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS > + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE > + COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, > + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, > + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; > + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN > + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > + POSSIBILITY OF SUCH DAMAGE. > + > +**/ > + > +#ifndef __EFI_XENBUS_DXE_H__ > +#define __EFI_XENBUS_DXE_H__ > + > +#include <Uefi.h> > + > +// > +// Libraries > +// > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/MemoryAllocationLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/BaseLib.h> > +#include <Library/UefiLib.h> > +#include <Library/DevicePathLib.h> > +#include <Library/DebugLib.h> > + > + > +// > +// UEFI Driver Model Protocols > +// > +#include <Protocol/DriverBinding.h> > + > + > +// > +// Consumed Protocols > +// > +#include <Protocol/PciIo.h> > + > + > +// > +// Produced Protocols > +// > + > + > +// > +// Driver Version > +// > +#define XENBUS_DXE_VERSION 0x00000000 > + > + > +// > +// Protocol instances > +// > +extern EFI_DRIVER_BINDING_PROTOCOL gXenBusDxeDriverBinding; > +extern EFI_COMPONENT_NAME2_PROTOCOL gXenBusDxeComponentName2; > +extern EFI_COMPONENT_NAME_PROTOCOL gXenBusDxeComponentName; > + > + > +// > +// Include files with function prototypes > +// > +#include "DriverBinding.h" > +#include "ComponentName.h" > + > +// > +// Other stuff > +// > +#define PCI_VENDOR_ID_XEN 0x5853 > +#define PCI_DEVICE_ID_XEN_PLATFORM 0x0001 > + > + > +#endif > diff --git a/OvmfPkg/XenBusDxe/XenBusDxe.inf b/OvmfPkg/XenBusDxe/XenBusDxe.inf > new file mode 100644 > index 0000000..b4d7551 > --- /dev/null > +++ b/OvmfPkg/XenBusDxe/XenBusDxe.inf > @@ -0,0 +1,56 @@ > + > +## @file > +# TODO: Brief Description of UEFI Driver XenBusDxe > +# > +# TODO: Detailed Description of UEFI Driver XenBusDxe > +# > +# TODO: Copyright for UEFI Driver XenBusDxe > +# > +# TODO: License for UEFI Driver XenBusDxe > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = XenBusDxe > + FILE_GUID = 565ec8ba-a484-11e3-802b-b8ac6f7d65e6 > + MODULE_TYPE = UEFI_DRIVER > + > + VERSION_STRING = 0.1 > + ENTRY_POINT = XenBusDxeDriverEntryPoint > + UNLOAD_IMAGE = XenBusDxeUnload > + > + > +[Packages] > + MdePkg/MdePkg.dec > + OvmfPkg/OvmfPkg.dec > + > +[Sources] > + XenBusDxe.h > + XenBusDxe.c > + DriverBinding.h > + ComponentName.c > + ComponentName.h > + > +[LibraryClasses] > + UefiDriverEntryPoint > + UefiBootServicesTableLib > + MemoryAllocationLib > + BaseMemoryLib > + BaseLib > + UefiLib > + DevicePathLib > + DebugLib > + HobLib > + > + > +[Protocols] > + gEfiDriverBindingProtocolGuid > + gEfiPciIoProtocolGuid > + gEfiComponentName2ProtocolGuid > + gEfiComponentNameProtocolGuid > + > + > +[Guids] > + gEfiXenInfoGuid > + > -- > Anthony PERARD > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |