| /** @file |
| This PPI provides the super I/O register access functionality. |
| |
| Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR> |
| SPDX-License-Identifier: BSD-2-Clause-Patent |
| |
| @par Revision Reference: |
| This PPI is from PI Version 1.2.1. |
| |
| **/ |
| |
| #ifndef __EFI_SUPER_IO_PPI_H__ |
| #define __EFI_SUPER_IO_PPI_H__ |
| |
| #include <Protocol/SuperIo.h> |
| |
| #define EFI_SIO_PPI_GUID \ |
| { \ |
| 0x23a464ad, 0xcb83, 0x48b8, {0x94, 0xab, 0x1a, 0x6f, 0xef, 0xcf, 0xe5, 0x22} \ |
| } |
| |
| typedef struct _EFI_SIO_PPI EFI_SIO_PPI; |
| typedef struct _EFI_SIO_PPI *PEFI_SIO_PPI; |
| |
| typedef UINT16 EFI_SIO_REGISTER; |
| #define EFI_SIO_REG(ldn,reg) (EFI_SIO_REGISTER) (((ldn) << 8) | reg) |
| #define EFI_SIO_LDN_GLOBAL 0xFF |
| |
| /** |
| Read a Super I/O register. |
| |
| The register is specified as an 8-bit logical device number and an 8-bit |
| register value. The logical device numbers for specific SIO devices can be |
| determined using the Info member of the PPI structure. |
| |
| @param PeiServices A pointer to a pointer to the PEI Services. |
| @param This A pointer to this instance of the EFI_SIO_PPI. |
| @param ExitCfgMode A boolean specifying whether the driver should turn on |
| configuration mode (FALSE) or turn off configuration mode |
| (TRUE) after completing the read operation. The driver must |
| track the current state of the configuration mode (if any) |
| and turn on configuration mode (if necessary) prior to |
| register access. |
| @param Register A value specifying the logical device number (bits 15:8) |
| and the register to read (bits 7:0). The logical device |
| number of EFI_SIO_LDN_GLOBAL indicates that global |
| registers will be used. |
| @param IoData A pointer to the returned register value. |
| |
| @retval EFI_SUCCESS Success. |
| @retval EFI_TIMEOUT The register could not be read in the a reasonable |
| amount of time. The exact time is device-specific. |
| @retval EFI_INVALID_PARAMETERS Register was out of range for this device. |
| @retval EFI_INVALID_PARAMETERS IoData was NULL |
| @retval EFI_DEVICE_ERROR There was a device fault or the device was not present. |
| **/ |
| typedef |
| EFI_STATUS |
| (EFIAPI *EFI_PEI_SIO_REGISTER_READ)( |
| IN EFI_PEI_SERVICES **PeiServices, |
| IN CONST EFI_SIO_PPI *This, |
| IN BOOLEAN ExitCfgMode, |
| IN EFI_SIO_REGISTER Register, |
| OUT UINT8 *IoData |
| ); |
| |
| /** |
| Write a Super I/O register. |
| |
| The register is specified as an 8-bit logical device number and an 8-bit register |
| value. The logical device numbers for specific SIO devices can be determined |
| using the Info member of the PPI structure. |
| |
| @param PeiServices A pointer to a pointer to the PEI Services. |
| @param This A pointer to this instance of the EFI_SIO_PPI. |
| @param ExitCfgMode A boolean specifying whether the driver should turn on |
| configuration mode (FALSE) or turn off configuration mode |
| (TRUE) after completing the read operation. The driver must |
| track the current state of the configuration mode (if any) |
| and turn on configuration mode (if necessary) prior to |
| register access. |
| @param Register A value specifying the logical device number (bits 15:8) |
| and the register to read (bits 7:0). The logical device |
| number of EFI_SIO_LDN_GLOBAL indicates that global |
| registers will be used. |
| @param IoData A pointer to the returned register value. |
| |
| @retval EFI_SUCCESS Success. |
| @retval EFI_TIMEOUT The register could not be read in the a reasonable |
| amount of time. The exact time is device-specific. |
| @retval EFI_INVALID_PARAMETERS Register was out of range for this device. |
| @retval EFI_INVALID_PARAMETERS IoData was NULL |
| @retval EFI_DEVICE_ERROR There was a device fault or the device was not present. |
| **/ |
| typedef |
| EFI_STATUS |
| (EFIAPI *EFI_PEI_SIO_REGISTER_WRITE)( |
| IN EFI_PEI_SERVICES **PeiServices, |
| IN CONST EFI_SIO_PPI *This, |
| IN BOOLEAN ExitCfgMode, |
| IN EFI_SIO_REGISTER Register, |
| IN UINT8 IoData |
| ); |
| |
| /** |
| Provides an interface for a table based programming of the Super I/O registers. |
| |
| The Modify() function provides an interface for table based programming of the |
| Super I/O registers. This function can be used to perform programming of |
| multiple Super I/O registers with a single function call. For each table entry, |
| the Register is read, its content is bitwise ANDed with AndMask, and then ORed |
| with OrMask before being written back to the Register. The Super I/O driver |
| must track the current state of the Super I/O and enable the configuration mode |
| of Super I/O if necessary prior to table processing. Once the table is processed, |
| the Super I/O device must be returned to the original state. |
| |
| @param PeiServices A pointer to a pointer to the PEI Services. |
| @param This A pointer to this instance of the EFI_SIO_PPI. |
| @param Command A pointer to an array of NumberOfCommands EFI_SIO_REGISTER_MODIFY |
| structures. Each structure specifies a single Super I/O register |
| modify operation. |
| @param NumberOfCommands The number of elements in the Command array. |
| |
| @retval EFI_SUCCESS The operation completed successfully. |
| @retval EFI_INVALID_PARAMETERS Command is NULL. |
| **/ |
| typedef |
| EFI_STATUS |
| (EFIAPI *EFI_PEI_SIO_REGISTER_MODIFY)( |
| IN EFI_PEI_SERVICES **PeiServices, |
| IN CONST EFI_SIO_PPI *This, |
| IN CONST EFI_SIO_REGISTER_MODIFY *Command, |
| IN UINTN NumberOfCommands |
| ); |
| |
| /// |
| /// Specifies the end of the information list. |
| /// |
| #define EFI_ACPI_PNP_HID_END EFI_PNP_ID (0x0000) |
| |
| typedef UINT32 EFI_ACPI_HID; |
| typedef UINT32 EFI_ACPI_UID; |
| #pragma pack(1) |
| typedef struct _EFI_SIO_INFO { |
| EFI_ACPI_HID Hid; |
| EFI_ACPI_UID Uid; |
| UINT8 Ldn; |
| } EFI_SIO_INFO, *PEFI_SIO_INFO; |
| #pragma pack() |
| |
| /// |
| /// This PPI provides low-level access to Super I/O registers using Read() and |
| /// Write(). It also uniquely identifies this Super I/O controller using a GUID |
| /// and provides mappings between ACPI style PNP IDs and the logical device numbers. |
| /// There is one instance of this PPI per Super I/O device. |
| /// |
| struct _EFI_SIO_PPI { |
| /// |
| /// This function reads a register's value from the Super I/O controller. |
| /// |
| EFI_PEI_SIO_REGISTER_READ Read; |
| /// |
| /// This function writes a value to a register in the Super I/O controller. |
| /// |
| EFI_PEI_SIO_REGISTER_WRITE Write; |
| /// |
| /// This function modifies zero or more registers in the Super I/O controller |
| /// using a table. |
| /// |
| EFI_PEI_SIO_REGISTER_MODIFY Modify; |
| /// |
| /// This GUID uniquely identifies the Super I/O controller. |
| /// |
| EFI_GUID SioGuid; |
| /// |
| /// This pointer is to an array which maps EISA identifiers to logical devices numbers. |
| /// |
| PEFI_SIO_INFO Info; |
| }; |
| |
| extern EFI_GUID gEfiSioPpiGuid; |
| |
| #endif |