https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
		
			
				
	
	
		
			326 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			326 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   The SioBusDxe driver is used to create child devices on the ISA bus and
 | |
|   installs the Super I/O protocols on them.
 | |
| 
 | |
|   Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef __SIO_BUS_DXE_H__
 | |
| #define __SIO_BUS_DXE_H__
 | |
| 
 | |
| #include <Uefi.h>
 | |
| 
 | |
| #include <IndustryStandard/Pci.h>
 | |
| 
 | |
| #include <Protocol/PciIo.h>
 | |
| #include <Protocol/SuperIo.h>
 | |
| 
 | |
| #include <Library/UefiDriverEntryPoint.h>
 | |
| #include <Library/UefiLib.h>
 | |
| #include <Library/UefiBootServicesTableLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/ReportStatusCodeLib.h>
 | |
| #include <Library/MemoryAllocationLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/DevicePathLib.h>
 | |
| 
 | |
| #include "SioService.h"
 | |
| 
 | |
| //
 | |
| // SIO Bus driver private data structure
 | |
| //
 | |
| typedef struct {
 | |
|   EFI_PCI_IO_PROTOCOL    *PciIo;
 | |
|   UINT64                 OriginalAttributes;
 | |
| } SIO_BUS_DRIVER_PRIVATE_DATA;
 | |
| 
 | |
| 
 | |
| //
 | |
| // Global Variables
 | |
| //
 | |
| extern EFI_COMPONENT_NAME_PROTOCOL  gSioBusComponentName;
 | |
| extern EFI_COMPONENT_NAME2_PROTOCOL gSioBusComponentName2;
 | |
| 
 | |
| 
 | |
| //
 | |
| // EFI Component Name Functions
 | |
| //
 | |
| 
 | |
| /**
 | |
|   Retrieves a Unicode string that is the user readable name of the driver.
 | |
| 
 | |
|   This function retrieves the user readable name of a driver in the form of a
 | |
|   Unicode string. If the driver specified by This has a user readable name in
 | |
|   the language specified by Language, then a pointer to the driver name is
 | |
|   returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
 | |
|   by This does not support the language specified by Language, then
 | |
|   EFI_UNSUPPORTED is returned.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL
 | |
|                                 or EFI_COMPONENT_NAME_PROTOCOL instance.
 | |
|   @param[in]  Language          A pointer to a Null-terminated ASCII string
 | |
|                                 array indicating the language. This is the
 | |
|                                 language of the driver 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. Language is specified
 | |
|                                 in RFC 4646 or ISO 639-2 language code format.
 | |
|   @param[out] 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
 | |
| SioBusComponentNameGetDriverName (
 | |
|   IN  EFI_COMPONENT_NAME_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 a driver.
 | |
| 
 | |
|   This function retrieves the user readable name of the controller specified by
 | |
|   ControllerHandle and ChildHandle in the form of a Unicode string. If the
 | |
|   driver specified by This has a user readable name in the language specified
 | |
|   by Language, then a pointer to the controller name is returned in
 | |
|   ControllerName, and EFI_SUCCESS is returned.  If the driver specified by This
 | |
|   is not currently managing the controller specified by ControllerHandle and
 | |
|   ChildHandle, then EFI_UNSUPPORTED is returned.  If the driver specified by
 | |
|   This does not support the language specified by Language, then
 | |
|   EFI_UNSUPPORTED is returned.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL
 | |
|                                 or EFI_COMPONENT_NAME_PROTOCOL instance.
 | |
|   @param[in]  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[in]  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[in]  Language          A pointer to a Null-terminated ASCII string
 | |
|                                 array indicating the language.  This is the
 | |
|                                 language of the driver 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. Language is specified in
 | |
|                                 RFC 4646 or ISO 639-2 language code format.
 | |
|   @param[out] 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
 | |
| SioBusComponentNameGetControllerName (
 | |
|   IN  EFI_COMPONENT_NAME_PROTOCOL    *This,
 | |
|   IN  EFI_HANDLE                     ControllerHandle,
 | |
|   IN  EFI_HANDLE                     ChildHandle        OPTIONAL,
 | |
|   IN  CHAR8                          *Language,
 | |
|   OUT CHAR16                         **ControllerName
 | |
|   );
 | |
| 
 | |
| 
 | |
| //
 | |
| // Driver Binding Protocol interfaces
 | |
| //
 | |
| 
 | |
| /**
 | |
|   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.
 | |
| 
 | |
|   This function checks to see if the driver specified by This supports the
 | |
|   device specified by ControllerHandle. Drivers will typically use the device
 | |
|   path attached to ControllerHandle and/or the services from the bus I/O
 | |
|   abstraction attached to ControllerHandle to determine if the driver supports
 | |
|   ControllerHandle. This function may be called many times during platform
 | |
|   initialization. In order to reduce boot times, the tests performed by this
 | |
|   function must be very small, and take as little time as possible to execute.
 | |
|   This function must not change the state of any hardware devices, and this
 | |
|   function must be aware that the device specified by ControllerHandle may
 | |
|   already be managed by the same driver or a different driver. This function
 | |
|   must match its calls to AllocatePages() with FreePages(), AllocatePool() with
 | |
|   FreePool(), and OpenProtocol() with CloseProtocol(). Since ControllerHandle
 | |
|   may have been previously started by the same driver, if a protocol is already
 | |
|   in the opened state, then it must not be closed with CloseProtocol(). This is
 | |
|   required to guarantee the state of ControllerHandle is not modified by this
 | |
|   function.
 | |
| 
 | |
|   @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.
 | |
|   @retval EFI_UNSUPPORTED          The device specified by ControllerHandle and
 | |
|                                    RemainingDevicePath is not supported by the
 | |
|                                    driver specified by This.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| SioBusDriverBindingSupported (
 | |
|   IN EFI_DRIVER_BINDING_PROTOCOL    *This,
 | |
|   IN EFI_HANDLE                     Controller,
 | |
|   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   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.
 | |
|   @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
 | |
| SioBusDriverBindingStart (
 | |
|   IN EFI_DRIVER_BINDING_PROTOCOL    *This,
 | |
|   IN EFI_HANDLE                     Controller,
 | |
|   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   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
 | |
| SioBusDriverBindingStop (
 | |
|   IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
 | |
|   IN  EFI_HANDLE                     Controller,
 | |
|   IN  UINTN                          NumberOfChildren,
 | |
|   IN  EFI_HANDLE                     *ChildHandleBuffer
 | |
|   );
 | |
| 
 | |
| #endif  // __SIO_BUS_DXE_H__
 |