|
[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 |