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