Hi everybody, Any review comments on this patch set ?
> -----Original Message----- > From: Pankaj Bansal > Sent: Friday, February 09, 2018 5:24 PM > To: edk2-devel@lists.01.org > Cc: Pankaj Bansal <pankaj.ban...@nxp.com>; Ard Biesheuvel > <ard.biesheu...@linaro.org>; Leif Lindholm <leif.lindh...@linaro.org>; > Michael D Kinney <michael.d.kin...@intel.com> > Subject: [PATCH 1/2] Silicon/NXP: Add Modified SPI protocol stack > > The PI 1.6 SPI specs are not adequate to handle all type of SPI > communication, specially the QUAD mode read/write comminications with > the periphrals that support it. > > Therefore we are modifying the SPI protocol defined in PI 1.6 spec. > > Untill these changes are incorporated in PI specs, we are calling it revised > PI > 1.6 spec. > > Cc: Ard Biesheuvel <ard.biesheu...@linaro.org> > Cc: Leif Lindholm <leif.lindh...@linaro.org> > Cc: Michael D Kinney <michael.d.kin...@intel.com> > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Pankaj Bansal <pankaj.ban...@nxp.com> > --- > Silicon/NXP/Include/Pi/PiSpi.h | 233 ++++++++++++ > .../NXP/Include/Protocol/SpiConfiguration.h | 313 +++++++++++++++++ > Silicon/NXP/Include/Protocol/SpiHc.h | 208 +++++++++++ > Silicon/NXP/Include/Protocol/SpiIo.h | 168 +++++++++ > Silicon/NXP/Include/Protocol/SpiNorFlash.h | 269 ++++++++++++++ > 5 files changed, 1191 insertions(+) > > diff --git a/Silicon/NXP/Include/Pi/PiSpi.h b/Silicon/NXP/Include/Pi/PiSpi.h > new file mode 100644 index 0000000..8c35d86 > --- /dev/null > +++ b/Silicon/NXP/Include/Pi/PiSpi.h > @@ -0,0 +1,233 @@ > +/** @file > + Include file matches things in PI. > + > + Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> > + Copyright 2017-2018 NXP > + > + This program and the accompanying materials are licensed and made > + available under the terms and conditions of the BSD License which > + accompanies this distribution. The full text of the license may be > + found at http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > + > + @par Revision Reference: > + This Protocol was introduced in revised UEFI PI Specification 1.6. > + > +**/ > + > +#ifndef __PI_SPI_H__ > +#define __PI_SPI_H__ > + > +/// > +/// Define the SPI flags > +/// > + > +/// The SPI peripheral/controller supports only half duplex transactions > +#define SPI_HALF_DUPLEX BIT0 > +/// The SPI peripheral/controller supports write only transactions. > +#define SPI_SUPPORTS_WRITE_ONLY_OPERATIONS BIT1 > +/// The SPI peripheral/controller supports Read only transactions. > +#define SPI_SUPPORTS_READ_ONLY_OPERATIONS BIT2 > +/// The SPI peripheral/controller supports Double Transfer Rate (DTR). > +/// DTR : Transfer may be input or output on both the /// rising and > +falling edges of the clock. > +#define SPI_SUPPORTS_DTR_OPERATIONS BIT3 > +/// The SPI peripheral/controller supports a 2-bit data bus > +#define SPI_SUPPORTS_2_BIT_DATA_BUS_WIDTH BIT4 > +/// The SPI peripheral/controller supports a 4-bit data bus > +#define SPI_SUPPORTS_4_BIT_DATA_BUS_WIDTH BIT5 > +/// The SPI peripheral/controller supports a 8-bit data bus > +#define SPI_SUPPORTS_8_BIT_DATA_BUS_WIDTH BIT6 > +/// Transfer size includes the opcode byte > +#define SPI_TRANSFER_SIZE_INCLUDES_OPCODE BIT7 > +/// Transfer size includes the 4 address bytes > +#define SPI_TRANSFER_SIZE_INCLUDES_ADDRESS BIT8 > + > +/// > +/// SPI Frame Size supported Mask > +/// > +#define SPI_FRAME_MASK(FrameSize) (1U << FrameSize) > + > +/// > +/// Calculate the Clock cycles from number of bytes and BusWidth /// > +#define SPI_BYTES_TO_CYCLES(Bytes, BusWidth) ( ( (Bytes << sizeof > (UINT8)) + BusWidth - 1) / BusWidth) > +/// > +/// Calculate the number of bytes from Clock cycles and BusWidth /// > +#define SPI_CYCLES_TO_BYTES(Cycles, BusWidth) ( (Cycles * BusWidth) >> > sizeof (UINT8)) > + > +/// > +/// SPI Device Path can be used to describe the device path of both SPI > +controller /// and SPI Peripheral. > +/// > +typedef struct { > + /// > + /// Vendor device path specifying Vendor GUID for SPI Host controller or > SPI Peripheral. > + /// > + VENDOR_DEVICE_PATH Vendor; > + /// > + /// Controller device path to distinguish between two instances of SPI > controller or SPI Peripheral. > + /// > + CONTROLLER_DEVICE_PATH Controller; > + /// > + /// Signify the end of Device Path. > + /// > + EFI_DEVICE_PATH_PROTOCOL End; > +} EFI_SPI_DEVICE_PATH; > + > +/// > +/// Note: The revised UEFI PI 1.6 specification does not specify values for > the > +/// members below. The order matches the specification. > +/// > +typedef enum { > + /// > + /// Data flowing from the host to the SPI peripheral > + /// or Data flowing from the SPI peripheral to the host > + /// > + SPI_TRANSACTION_DATA = 0, > + > + /// > + /// Command to send to SPI Peripheral /// > SPI_TRANSACTION_COMMAND, > + > + /// > + /// Offset in SPI Peripheral from/to which data is to be read/written > + /// SPI_TRANSACTION_ADDRESS, > + > + /// > + /// Optional control bits that follow the address bits. > + /// These bits are driven by the controller if they are specified. > + /// > + /// NOTE This field should be counted in clocks not number of bits > + received by the /// serial flash. The SPI master drives the bus > + during "mode bits" cycles; /// Example: If 8 mode bits are needed > + with a quad input address phase command, then /// length for this type of > transaction would be 2. > + /// > + SPI_TRANSACTION_MODE, > + > + /// > + /// Clock cycles during which no data is transferred to or from a memory. > + /// the master tri-states the bus during "dummy" cycles. > + /// No data (WriteBuffer = NULL and ReadBuffer = NULL) can be > + specified /// in SPI Transaction. if these buffer are specified, then > + SPI HOST controller must ignore /// these buffers. > + /// > + SPI_TRANSACTION_DUMMY, > + > + /// > + /// Maximum element that should be present in any enum. > + /// > + SPI_TRANSACTION_MAX > + > +} EFI_SPI_TRANSACTION_TYPE; > + > +/// > +/// SPI Peripheral transaction bus width /// /// The SPI_TRANSFER_LINE > +describes the number of data lines to use for /// a transaction. > +/// > +typedef enum { > + /// One line transfer > + SPI_TRANSACTION_BUS_WIDTH_1 = 1, > + > + /// Two line transfer > + SPI_TRANSACTION_BUS_WIDTH_2 = 2, > + > + /// Four line transfer > + SPI_TRANSACTION_BUS_WIDTH_4 = 4, > + > + /// Eight line transfer > + SPI_TRANSACTION_BUS_WIDTH_8 = 8, > + > + /// Maximum element that should be present in any enum. > + SPI_TRANSACTION_BUS_WIDTH > +} EFI_SPI_TRANSACTION_BUS_WIDTH; > + > +/// > +/// The EFI_SPI_BUS_TRANSACTION data structure contains the description > +of the /// SPI transaction to perform on the host controller. > +/// > +typedef struct _EFI_SPI_BUS_TRANSACTION { > + /// > + /// Type of transaction specified by one of the > +EFI_SPI_TRANSACTION_TYPE > + /// values. > + /// > + EFI_SPI_TRANSACTION_TYPE TransactionType; > + > + /// > + /// TRUE if the transaction is being debugged. Debugging may be > + turned on for /// a single SPI transaction. Only this transaction > + will display debugging /// messages. All other transactions with this > + value set to FALSE will not /// display any debugging messages. > + /// > + BOOLEAN DebugTransaction; > + > + /// > + /// SPI bus width in bits: 1, 2, 4, 8 /// > + UINT32 BusWidth; > + > + /// > + /// Transfer may be input or output on both the /// rising and > + falling edges of the clock. > + /// > + BOOLEAN DoubleTransferRate; > + > + /// > + /// Frame size in bits, range: 1 - 32 /// > + UINT32 FrameSize; > + > + /// For TransactionType command/address/data, number of bytes needed > + to complete the /// transaction. (Read or write or both). > + /// e.g. for 3 byte address the Length is 3. > + /// > + /// For TransactionType dummy/mode, the clock cycles needed to > + complete the /// transaction. > + /// e.g. if 1 byte (8 bits) of mode is to be transferred on 2 data bus. > + /// then clock cycles needed are 8/2 = 4. so Length is 4. > + /// > + UINT32 Length; > + > + /// > + /// Buffer containing data to send to the SPI peripheral /// Frame > + sizes 1 - 8 bits: UINT8 (one byte) per frame /// Frame sizes 7 - 16 > + bits : UINT16 (two bytes) per frame /// Can be NULL if the SPI > + TransactionType is SPI_TRANSACTION_DUMMY. > + /// > + UINT8 *WriteBuffer; > + > + /// > + /// Buffer to receive the data from the SPI peripheral > + /// * Frame sizes 1 - 8 bits: UINT8 (one byte) per frame > + /// * Frame sizes 7 - 16 bits : UINT16 (two bytes) per frame > + /// * Frame sizes 17 - 32 bits : UINT32 (four bytes) per frame > + /// Can be NULL if the SPI TransactionType is SPI_TRANSACTION_DUMMY > + /// > + UINT8 *ReadBuffer; > +} EFI_SPI_BUS_TRANSACTION; > + > +/// > +/// SPI device request > +/// > +/// The EFI_SPI_REQUEST_PACKET describes a single SPI transaction. > +/// > +typedef struct { > + /// > + /// Number of elements in the Transaction array > + /// > + UINTN TransactionCount; > + > + /// > + /// Description of the SPI TransactionTransaction > + /// > + EFI_SPI_BUS_TRANSACTION Transaction [1]; > +} EFI_SPI_REQUEST_PACKET; > + > +#endif // __PI_SPI_H__ > diff --git a/Silicon/NXP/Include/Protocol/SpiConfiguration.h > b/Silicon/NXP/Include/Protocol/SpiConfiguration.h > new file mode 100644 > index 0000000..6383151 > --- /dev/null > +++ b/Silicon/NXP/Include/Protocol/SpiConfiguration.h > @@ -0,0 +1,313 @@ > +/** @file > + This file defines the SPI Configuration Protocol. > + > + Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> > + Copyright 2017-2018 NXP > + > + This program and the accompanying materials are licensed and made > + available under the terms and conditions of the BSD License which > + accompanies this distribution. The full text of the license may be > + found at http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > + > + @par Revision Reference: > + This Protocol was introduced in UEFI PI Specification 1.6. > + > +**/ > + > +#ifndef __SPI_CONFIGURATION_PROTOCOL_H__ #define > +__SPI_CONFIGURATION_PROTOCOL_H__ > + > +/// > +/// Global ID for the SPI Configuration Protocol /// #define > +EFI_SPI_CONFIGURATION_GUID \ > + { 0x85a6d3e6, 0xb65b, 0x4afc, \ > + { 0xb3, 0x8f, 0xc6, 0xd5, 0x4a, 0xf6, 0xdd, 0xc8 }} > + > +/// > +/// Macros to easily specify frequencies in hertz, kilohertz and megahertz. > +/// > +#define Hz(Frequency) (Frequency) > +#define KHz(Frequency) (1000 * Hz (Frequency)) #define MHz(Frequency) > +(1000 * KHz (Frequency)) > + > +typedef struct _EFI_SPI_PERIPHERAL EFI_SPI_PERIPHERAL; > + > +/** > + Manipulate the chip select for a SPI device. > + > + This routine must be called at or below TPL_NOTIFY. > + Update the value of the chip select line for a SPI peripheral. > + The SPI bus layer calls this routine either in the board layer or in > + the SPI controller to manipulate the chip select pin at the start and > + end of a SPI transaction. > + > + @param[in] SpiPeripheral The address of an EFI_SPI_PERIPHERAL data > structure > + describing the SPI peripheral whose chip select > pin > + is to be manipulated. The routine may access the > + ChipSelectParameter field to gain sufficient > + context to complete the operation. > + @param[in] PinValue The value to be applied to the chip select line > of > + the SPI peripheral. > + > + @retval EFI_SUCCESS The chip select was set successfully > + @retval EFI_NOT_READY Support for the chip select is not properly > + initialized @retval > + EFI_INVALID_PARAMETER The SpiPeripheral->ChipSelectParameter value > + is invalid > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_SPI_CHIP_SELECT) ( > + IN CONST EFI_SPI_PERIPHERAL *SpiPeripheral, > + IN BOOLEAN PinValue > + ); > + > +/** > + Set up the clock generator to produce the correct clock frequency, > +phase and > + polarity for a SPI chip. > + > + This routine must be called at or below TPL_NOTIFY. > + This routine updates the clock generator to generate the correct > + frequency and polarity for the SPI clock. > + > + @param[in] SpiPeripheral Pointer to a EFI_SPI_PERIPHERAL data structure > from > + which the routine can access the ClockParameter, > + ClockPhase and ClockPolarity fields. The routine > + also has access to the names for the SPI bus and > + chip which can be used during debugging. > + @param[in] ClockHz Pointer to the requested clock frequency. The > clock > + generator will choose a supported clock frequency > + which is less then or equal to this value. > + Specify zero to turn the clock generator off. > + The actual clock frequency supported by the clock > + generator will be returned. > + > + @retval EFI_SUCCESS The clock was set up successfully > + @retval EFI_UNSUPPORTED The SPI controller was not able to support the > + frequency requested by CLockHz > + > +**/ > +typedef EFI_STATUS > +(EFIAPI *EFI_SPI_CLOCK) ( > + IN CONST EFI_SPI_PERIPHERAL *SpiPeripheral, > + IN UINT32 *ClockHz > + ); > + > +/// > +/// The EFI_SPI_PART data structure provides a description of a SPI > +part which /// is independent of the use on the board. This data is > +available directly /// from the part's datasheet and may be provided by the > vendor. > +/// > +typedef struct _EFI_SPI_PART { > + /// > + /// A Unicode string specifying the SPI chip vendor. > + /// > + CONST CHAR16 *Vendor; > + > + /// > + /// A Unicode string specifying the SPI chip part number. > + /// > + CONST CHAR16 *PartNumber; > + > + /// > + /// The minimum SPI bus clock frequency used to access this chip. > + This value /// may be specified in the chip's datasheet. If not, use the > value > of zero. > + /// > + UINT32 MinClockHz; > + > + /// > + /// The maximum SPI bus clock frequency used to access this chip. > + This value /// is found in the chip's datasheet. > + /// > + UINT32 MaxClockHz; > + > + /// > + /// Specify the polarity of the chip select pin. This value can be > +found in > + /// the SPI chip's datasheet. Specify TRUE when a one asserts the > +chip select > + ///and FALSE when a zero asserts the chip select. > + /// > + BOOLEAN ChipSelectPolarity; > +} EFI_SPI_PART; > + > +/// > +/// The EFI_SPI_BUS data structure provides the connection details > +between the /// physical SPI bus and the EFI_SPI_HC_PROTOCOL instance > +which controls that /// SPI bus. This data structure also describes the > +details of how the clock is /// generated for that SPI bus. Finally > +this data structure provides the list /// of physical SPI devices which are > attached to the SPI bus. > +/// > +typedef struct _EFI_SPI_BUS { > + /// > + /// A Unicode string describing the SPI bus > + /// > + CONST CHAR16 *FriendlyName; > + > + /// > + /// Address of the first EFI_SPI_PERIPHERAL data structure connected > + to this /// bus. Specify NULL if there are no SPI peripherals connected to > this bus. > + /// > + CONST EFI_SPI_PERIPHERAL *Peripherallist; > + > + /// > + /// Address of the first Runtime EFI_SPI_PERIPHERAL data structure > + connected to this /// bus. Specify NULL if there are no Runtime SPI > peripherals connected to this bus. > + /// > + CONST EFI_SPI_PERIPHERAL *RuntimePeripherallist; > + > + /// > + /// Address of an EFI_DEVICE_PATH_PROTOCOL data structure which > + uniquely /// describes the SPI controller. > + /// > + CONST EFI_DEVICE_PATH_PROTOCOL *ControllerPath; > + > + /// > + /// Address of the routine which controls the clock used by the SPI > + bus for /// this SPI peripheral. The SPI host controller's clock > + routine is called /// when this value is set to NULL. > + /// > + EFI_SPI_CLOCK Clock; > + > + /// > + /// Address of a data structure containing the additional values > +which > + /// describe the necessary control for the clock. When Clock is NULL, > + /// the declaration for this data structure is provided by the vendor > +of the > + /// host's SPI controller driver. When Clock is not NULL, the > +declaration for > + /// this data structure is provided by the board layer. > + /// > + VOID *ClockParameter; > +} EFI_SPI_BUS; > + > +/// > +/// The EFI_SPI_PERIPHERAL data structure describes how a specific > +block of /// logic which is connected to the SPI bus. This data > +structure also selects /// which upper level driver is used to manipulate > this > SPI device. > +/// The SpiPeripheraLDriverGuid is available from the vendor of the SPI > +/// peripheral driver. > +/// > +struct _EFI_SPI_PERIPHERAL { > + /// > + /// Address of the next EFI_SPI_PERIPHERAL data structure. Specify > +NULL if > + /// the current data structure is the last one on the SPI bus. > + /// > + CONST EFI_SPI_PERIPHERAL *NextSpiPeripheral; > + > + /// > + /// A unicode string describing the function of the SPI part. > + /// > + CONST CHAR16 *FriendlyName; > + > + /// > + /// Address of a GUID provided by the vendor of the SPI peripheral driver. > + /// Instead of using a " EFI_SPI_IO_PROTOCOL" GUID, the SPI bus > + driver uses /// this GUID to identify an EFI_SPI_IO_PROTOCOL data > + structure and to /// provide the connection points for the SPI peripheral > drivers. > + /// This reduces the comparison logic in the SPI peripheral driver's > + /// Supported routine. > + /// > + CONST GUID *SpiPeripheralDriverGuid; > + > + /// > + /// The address of an EFI_SPI_PART data structure which describes this > chip. > + /// > + CONST EFI_SPI_PART *SpiPart; > + > + /// > + /// The maximum clock frequency is specified in the EFI_SPI_P ART. > + When this /// this value is non-zero and less than the value in the > + EFI_SPI_PART then /// this value is used for the maximum clock frequency > for the SPI part. > + /// > + UINT32 MaxClockHz; > + > + /// > + /// Specify the idle value of the clock as found in the datasheet. > + /// Use zero (0) if the clock'S idle value is low or one (1) if the > + the /// clock's idle value is high. > + /// > + BOOLEAN ClockPolarity; > + > + /// > + /// Specify the clock delay after chip select. Specify zero (0) to > + delay an /// entire clock cycle or one (1) to delay only half a clock > cycle. > + /// > + BOOLEAN ClockPhase; > + > + /// > + /// SPI peripheral attributes, select zero or more of: > + /// * SPI_HALF_DUPLEX - The SPI peripheral supports only half duplex > + /// transactions > + /// * SPI_SUPPORTS_WRITE_ONLY_OPERATIONS - The SPI peripheral > supports > + /// write only transactions. > + /// * SPI_SUPPORTS_READ_ONLY_OPERATIONS - The SPI peripheral > supports > + /// read only transactions. > + /// * SPI_SUPPORTS_DTR_OPERATIONS - The SPI peripheral supports > + /// Double Transfer Rate (DTR). > + /// DTR : Transfer may be input or output on both the > + /// rising and falling edges of the clock. > + /// * SPI_SUPPORTS_2_B1T_DATA_BUS_W1DTH - The SPI peripheral is > wired to > + /// support a 2-bit data bus > + /// * SPI_SUPPORTS_4_B1T_DATA_BUS_W1DTH - The SPI peripheral is > wired to > + /// support a 4-bit data bus > + /// * SPI_SUPPORTS_8_B1T_DATA_BUS_W1DTH - The SPI peripheral is > wired to > + /// support a 8-bit data bus > + /// > + UINT32 Attributes; > + > + /// > + /// Address of a vendor specific data structure containing additional > + board /// configuration details related to the SPI chip. The SPI > + peripheral layer /// uses this data structure when configuring the chip. > + /// > + CONST VOID *ConfigurationData; > + > + /// > + /// The address of an EFI_SPI_BUS data structure which describes the > + SPI bus /// to which this chip is connected. > + /// > + CONST EFI_SPI_BUS *SpiBus; > + > + /// > + /// Address of the routine which controls the chip select pin for > + this SPI /// peripheral. Call the SPI host controller's chip select > + routine when this /// value is set to NULL. > + /// > + EFI_SPI_CHIP_SELECT ChipSelect; > + > + /// > + /// Address of a data structure containing the additional values > +which > + /// describe the necessary control for the chip select. When > +ChipSelect is > + /// NULL, the declaration for this data structure is provided by the > +vendor > + /// of the host's SPI controller driver. The vendor's documentation > +specifies > + /// the necessary values to use for the chip select pin selection and > + /// control. When Chipselect is not NULL, the declaration for this > +data > + /// structure is provided by the board layer. > + /// > + VOID *ChipSelectParameter; > +}; > + > +/// > +/// Describe the details of the board's SPI busses to the SPI driver stack. > +/// The board layer uses the EFI_SPI_CONFIGURATION_PROTOCOL to > expose > +the data /// tables which describe the board's SPI busses, The SPI bus > +layer uses these /// tables to configure the clock, chip select and > +manage the SPI transactions /// on the SPI controllers. > +/// > +typedef struct _EFI_SPI_CONFIGURATION_PROTOCOL { > + /// > + /// The number of SPI busses on the board. > + /// > + UINT32 BusCount; > + > + /// > + /// The address of an array of EFI_SPI_BUS data structure addresses. > + /// > + CONST EFI_SPI_BUS *CONST *CONST Buslist; } > +EFI_SPI_CONFIGURATION_PROTOCOL; > + > +extern EFI_GUID gEfiSpiConfigurationProtocolGuid; > + > +#endif // __SPI_CONFIGURATION_PROTOCOL_H__ > diff --git a/Silicon/NXP/Include/Protocol/SpiHc.h > b/Silicon/NXP/Include/Protocol/SpiHc.h > new file mode 100644 > index 0000000..86d27b3 > --- /dev/null > +++ b/Silicon/NXP/Include/Protocol/SpiHc.h > @@ -0,0 +1,208 @@ > +/** @file > + This file defines the SPI Host Controller Protocol. > + > + Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> > + Copyright 2017-2018 NXP > + > + This program and the accompanying materials are licensed and made > + available under the terms and conditions of the BSD License which > + accompanies this distribution. The full text of the license may be > + found at http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > + > + @par Revision Reference: > + This Protocol was introduced in revised UEFI PI Specification 1.6. > + > +**/ > + > +#ifndef __SPI_HC_PROTOCOL_H__ > +#define __SPI_HC_PROTOCOL_H__ > + > +#include <Pi/PiSpi.h> > +#include <Protocol/SpiConfiguration.h> > + > +/// > +/// Global ID for the SPI Host Controller Protocol /// #define > +EFI_SPI_HOST_GUID \ > + { 0xc74e5db2, 0xfa96, 0x4ae2, \ > + { 0xb3, 0x99, 0x15, 0x97, 0x7f, 0xe3, 0x0, 0x2d }} > + > +/// > +/// EDK2-style name > +/// > +#define EFI_SPI_HC_PROTOCOL_GUID EFI_SPI_HOST_GUID > + > +typedef struct _EFI_SPI_HC_PROTOCOL EFI_SPI_HC_PROTOCOL; > + > +/** > + Assert or deassert the SPI chip select. > + > + This routine is called at TPL_NOTIFY. > + Update the value of the chip select line for a SPI peripheral. The > + SPI bus layer calls this routine either in the board layer or in the > + SPI controller to manipulate the chip select pin at the start and end of a > SPI > transaction. > + > + @param[in] This Pointer to an EFI_SPI_HC_PROTOCOL structure. > + @param[in] SpiPeripheral The address of an EFI_SPI_PERIPHERAL data > structure > + describing the SPI peripheral whose chip select > pin > + is to be manipulated. The routine may access the > + ChipSelectParameter field to gain sufficient > + context to complete the operation. > + @param[in] PinValue The value to be applied to the chip select line > of > + the SPI peripheral. > + > + @retval EFI_SUCCESS The chip select was set as requested > + @retval EFI_NOT_READY Support for the chip select is not properly > + initialized @retval > + EFI_INVALID_PARAMETER The ChipSeLect value or its contents are > + invalid > + > +**/ > +typedef EFI_STATUS > +(EFIAPI *EFI_SPI_HC_PROTOCOL_CHIP_SELECT) ( > + IN CONST EFI_SPI_HC_PROTOCOL *This, > + IN CONST EFI_SPI_PERIPHERAL *SpiPeripheral, > + IN BOOLEAN PinValue > + ); > + > +/** > + Set up the clock generator to produce the correct clock frequency, > +phase and > + polarity for a SPI chip. > + > + This routine is called at TPL_NOTIFY. > + This routine updates the clock generator to generate the correct > + frequency and polarity for the SPI clock. > + > + @param[in] This Pointer to an EFI_SPI_HC_PROTOCOL structure. > + @param[in] SpiPeripheral Pointer to a EFI_SPI_PERIPHERAL data structure > from > + which the routine can access the ClockParameter, > + ClockPhase and ClockPolarity fields. The routine > + also has access to the names for the SPI bus and > + chip which can be used during debugging. > + @param[in] ClockHz Pointer to the requested clock frequency. The SPI > + host controller will choose a supported clock > + frequency which is less then or equal to this > + value. Specify zero to turn the clock generator > + off. The actual clock frequency supported by the > + SPI host controller will be returned. > + > + @retval EFI_SUCCESS The clock was set up successfully > + @retval EFI_UNSUPPORTED The SPI controller was not able to support the > + frequency requested by ClockHz > + > +**/ > +typedef EFI_STATUS > +(EFIAPI *EFI_SPI_HC_PROTOCOL_CLOCK) ( > + IN CONST EFI_SPI_HC_PROTOCOL *This, > + IN CONST EFI_SPI_PERIPHERAL *SpiPeripheral, > + IN UINT32 *ClockHz > + ); > + > +/** > + Perform the SPI transaction on the SPI peripheral using the SPI host > + controller. > + > + This routine is called at TPL_NOTIFY. > + This routine synchronously returns EFI_SUCCESS indicating that the > + asynchronous SPI transaction was started. The routine then waits for > + completion of the SPI transaction prior to returning the final > + transaction status. > + > + @param[in] This Pointer to an EFI_SPI_HC_PROTOCOL structure. > + @param[in] RequestPacket Pointer to a EFI_SPI_REQUEST_PACKET > containing > + the description of the SPI transactions to > perform. > + > + @retval EFI_SUCCESS The transaction completed successfully. > + @retval EFI_ALREADY_STARTED The controller is busy with another > transaction. > + @retval EFI_BAD_BUFFER_SIZE The Length value in SPI Transaction is > wrong. > + @retval EFI_DEVICE_ERROR There was an SPI error during the > transaction. > + @retval EFI_INVALID_PARAMETER The parameters specified in > RequestPacket are not > + Valid. or the RequestPacket is NULL. > + @retval EFI_NO_RESPONSE The SPI device is not responding to the > slave > + address. EFI_DEVICE_ERROR will be > returned if > + the controller cannot distinguish when the > NACK > + occurred. > + @retval EFI_UNSUPPORTED The controller does not support the > requested > + transaction. > +**/ > +typedef EFI_STATUS > +(EFIAPI *EFI_SPI_HC_PROTOCOL_TRANSACTION) ( > + IN CONST EFI_SPI_HC_PROTOCOL *This, > + IN EFI_SPI_REQUEST_PACKET *RequestPacket > + ); > + > +/// > +/// Support a SPI data transaction between the SPI controller and a SPI chip. > +/// > +struct _EFI_SPI_HC_PROTOCOL { > + /// > + /// Host control attributes, may have zero or more of the following set: > + /// * SPI_HALF_DUPLEX - The SPI Host Controller supports only half duplex > + /// transactions > + /// * SPI_SUPPORTS_WRITE_ONLY_OPERATIONS - The SPI Host Controller > supports > + /// write only transactions. > + /// * SPI_SUPPORTS_READ_ONLY_OPERATIONS - The SPI Host Controller > supports > + /// read only transactions. > + /// * SPI_SUPPORTS_DTR_OPERATIONS - The SPI Host Controller supports > + /// Double Transfer Rate (DTR). > + /// DTR : Transfer may be input or output on both the > + /// rising and falling edges of the clock. > + /// * SPI_SUPPORTS_2_B1T_DATA_BUS_W1DTH - The SPI Host Controller is > wired to > + /// support a 2-bit data bus > + /// * SPI_SUPPORTS_4_B1T_DATA_BUS_W1DTH - The SPI Host Controller is > wired to > + /// support a 4-bit data bus > + /// * SPI_SUPPORTS_8_B1T_DATA_BUS_W1DTH - The SPI Host Controller is > wired to > + /// support a 8-bit data bus > + /// The SPI host controller must support a 1 - bit bus > + /// width. > + /// * HC_TX_FRAME_IN_MOST_SIGNIFICANT_BITS > + /// - The SPI host controller requires the transmit frame to be in most > + /// significant bits instead of least significant bits.The host driver > + /// will adjust the frames if necessary. > + /// * HC_RX_FRAME_IN_MOST_SIGNIFICANT_BITS > + /// - The SPI host controller places the receive frame to be in most > + /// significant bits instead of least significant bits.The host driver > + /// will adjust the frames to be in the least significant bits if > + /// necessary. > + /// * SPI_TRANSFER_SIZE_INCLUDES_OPCODE > + /// - Transfer size includes the opcode byte > + /// * SPI_TRANSFER_SIZE_INCLUDES_ADDRESS > + /// - Transfer size includes the 4 address bytes > + UINT32 Attributes; > + > + /// > + /// Mask of frame sizes which the SPI host controller supports. Frame > + size of /// N-bits is supported when bit N-1 is set. The host > + controller must support /// a frame size of 8-bits. > + /// > + UINT32 FrameSizeSupportMask; > + > + /// > + /// Maximum transfer size in bytes: 1 - Oxffffffff /// > + UINT32 MaximumTransferBytes; > + > + /// > + /// Assert or deassert the SPI chip select. > + /// > + EFI_SPI_HC_PROTOCOL_CHIP_SELECT ChipSelect; > + > + /// > + /// Set up the clock generator to produce the correct clock > + frequency, phase /// and polarity for a SPI chip. > + /// > + EFI_SPI_HC_PROTOCOL_CLOCK Clock; > + > + /// > + /// Perform the SPI transaction on the SPI peripheral using the SPI > +host > + /// controller. > + /// > + EFI_SPI_HC_PROTOCOL_TRANSACTION Transaction; > +}; > + > +extern EFI_GUID gEfiSpiHcProtocolGuid; > + > +#endif // __SPI_HC_PROTOCOL_H__ > diff --git a/Silicon/NXP/Include/Protocol/SpiIo.h > b/Silicon/NXP/Include/Protocol/SpiIo.h > new file mode 100644 > index 0000000..c08c3bd > --- /dev/null > +++ b/Silicon/NXP/Include/Protocol/SpiIo.h > @@ -0,0 +1,168 @@ > +/** @file > + This file defines the SPI I/O Protocol. > + > + Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> > + Copyright 2017-2018 NXP > + > + This program and the accompanying materials are licensed and made > + available under the terms and conditions of the BSD License which > + accompanies this distribution. The full text of the license may be > + found at http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > + > + @par Revision Reference: > + This Protocol was introduced in revised UEFI PI Specification 1.6. > + > +**/ > + > +#ifndef __SPI_IO_PROTOCOL_H__ > +#define __SPI_IO_PROTOCOL_H__ > + > +#include <Pi/PiSpi.h> > +#include <Protocol/LegacySpiController.h> #include > +<Protocol/SpiConfiguration.h> > + > +typedef struct _EFI_SPI_IO_PROTOCOL EFI_SPI_IO_PROTOCOL; > + > +/** > + Initiate a SPI transaction between the host and a SPI peripheral. > + > + This routine must be called at or below TPL_NOTIFY. > + This routine works with the SPI bus layer to pass the SPI > + transactions to the SPI controller for execution on the SPI bus. > + > + @param[in] This Pointer to an EFI_SPI_IO_PROTOCOL structure. > + @param[in] RequestPacket Pointer to an EFI_SPI_REQUEST_PACKET > + structure describing the SPI transactions. > + > + @param[in] ClockHz Specify the ClockHz value as zero (0) to use > + the maximum clock frequency supported by the > + SPI controller and part. Specify a non-zero > + value only when a specific SPI transaction > + requires a reduced clock rate. > + > + @retval EFI_SUCCESS The transaction completed successfully. > + @retval EFI_ALREADY_STARTED The controller is busy with another > transaction. > + @retval EFI_BAD_BUFFER_SIZE The Length value in SPI Transaction is > wrong. > + @retval EFI_DEVICE_ERROR There was an SPI error during the > transaction. > + @retval EFI_INVALID_PARAMETER The parameters specified in > RequestPacket are not > + Valid. or the RequestPacket is NULL. > + @retval EFI_NOT_READY Support for the chip select is not properly > + initialized > + @retval EFI_INVALID_PARAMETER The ChipSeLect value or its contents > are > + invalid > + @retval EFI_NO_RESPONSE The SPI device is not responding to the > slave > + address. EFI_DEVICE_ERROR will be > returned if > + the controller cannot distinguish when the > NACK > + occurred. > + @retval EFI_UNSUPPORTED The controller does not support the > requested > + transaction. or The SPI controller was not > able to support > + the frequency requested by ClockHz > +**/ typedef EFI_STATUS (EFIAPI *EFI_SPI_IO_PROTOCOL_TRANSACTION) ( > + IN CONST EFI_SPI_IO_PROTOCOL *This, > + IN EFI_SPI_REQUEST_PACKET *RequestPacket, > + IN UINT32 ClockHz OPTIONAL > + ); > + > +/** > + Update the SPI peripheral associated with this SPI 10 instance. > + > + Support socketed SPI parts by allowing the SPI peripheral driver to > + replace the SPI peripheral after the connection is made. An example > + use is socketed SPI NOR flash parts, where the size and parameters > + change depending upon device is in the socket. > + > + @param[in] This Pointer to an EFI_SPI_IO_PROTOCOL structure. > + @param[in] SpiPeripheral Pointer to an EFI_SPI_PERIPHERAL structure. > + > + @retval EFI_SUCCESS The SPI peripheral was updated successfully > + @retval EFI_INVALID_PARAMETER The SpiPeripheral value is NULL, > + or the SpiPeripheral->SpiBus is NULL, > + or the SpiP eripheral - >SpiBus pointing at > + wrong bus, > + or the SpiP eripheral - >SpiPart is > + NULL > + > +**/ > +typedef EFI_STATUS > +(EFIAPI *EFI_SPI_IO_PROTOCOL_UPDATE_SPI_PERIPHERAL) ( > + IN CONST EFI_SPI_IO_PROTOCOL *This, > + IN CONST EFI_SPI_PERIPHERAL *SpiPeripheral > + ); > + > +/// > +/// Support managed SPI data transactions between the SPI controller > +and a SPI /// chip. > +/// > +struct _EFI_SPI_IO_PROTOCOL { > + /// > + /// Address of an EFI_SPI_PERIPHERAL data structure associated with > +this > + /// protocol instance. > + /// > + CONST EFI_SPI_PERIPHERAL *SpiPeripheral; > + > + /// > + /// Address of the original EFI_SPI_PERIPHERAL data structure > + associated with /// this protocol instance. > + /// > + CONST EFI_SPI_PERIPHERAL *OriginalSpiPeripheral; > + > + /// > + /// Mask of frame sizes which the SPI 10 layer supports. Frame size > + of N-bits /// is supported when bit N-1 is set. The host controller > + must support a /// frame size of 8-bits. Frame sizes of 16, 24 and > + 32-bits are converted to /// 8-bit frame sizes by the SPI bus layer > + if the frame size is not supported /// by the SPI host controller. > + /// > + UINT32 FrameSizeSupportMask; > + > + /// > + /// Maximum transfer size in bytes: 1 - Oxffffffff /// > + UINT32 MaximumTransferBytes; > + > + /// > + /// Transaction attributes: One or more from: > + /// * SPI_HALF_DUPLEX > + /// - The SPI host or peripheral supports only half duplex transactions > + /// * SPI_SUPPORTS_WRITE_ONLY_OPERATIONS > + /// - The SPI host or peripheral supports write only transactions. > + /// * SPI_SUPPORTS_READ_ONLY_OPERATIONS > + /// - The SPI host or peripheral support read only transactions. > + /// * SPI_SUPPORTS_DTR_OPERATIONS > + /// - The SPI SPI host and peripheral supports Double Transfer Rate > (DTR). > + /// DTR : Transfer may be input or output on both the > + /// rising and falling edges of the clock. > + /// * SPI_SUPPORTS_2_B1T_DATA_BUS_W1DTH > + /// - The SPI host and peripheral supports a 2-bit data bus > + /// * SPI_SUPPORTS_4_BIT_DATA_BUS_W1DTH > + /// - The SPI host and peripheral supports a 4-bit data bus > + /// * SPI_SUPPORTS_8_BIT_DATA_BUS_W1DTH > + /// - The SPI host and peripheral supports a 8-bit data bus > + /// * SPI_TRANSFER_SIZE_INCLUDES_OPCODE > + /// - Transfer size includes the opcode byte > + /// * SPI_TRANSFER_SIZE_INCLUDES_ADDRESS > + /// - Transfer size includes the 4 address bytes > + UINT32 Attributes; > + > + /// > + /// Pointer to legacy SPI controller protocol /// CONST > + EFI_LEGACY_SPI_CONTROLLER_PROTOCOL *LegacySpiProtocol; > + > + /// > + /// Initiate a SPI transaction between the host and a SPI peripheral. > + /// > + EFI_SPI_IO_PROTOCOL_TRANSACTION Transaction; > + > + /// > + /// Update the SPI peripheral associated with this SPI 10 instance. > + /// > + EFI_SPI_IO_PROTOCOL_UPDATE_SPI_PERIPHERAL UpdateSpiPeripheral; }; > + > +#endif // __SPI_IO_PROTOCOL_H__ > diff --git a/Silicon/NXP/Include/Protocol/SpiNorFlash.h > b/Silicon/NXP/Include/Protocol/SpiNorFlash.h > new file mode 100644 > index 0000000..2e57107 > --- /dev/null > +++ b/Silicon/NXP/Include/Protocol/SpiNorFlash.h > @@ -0,0 +1,269 @@ > +/** @file > + This file defines the SPI NOR Flash Protocol. > + > + Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> > + Copyright 2018 NXP > + > + This program and the accompanying materials are licensed and made > + available under the terms and conditions of the BSD License which > + accompanies this distribution. The full text of the license may be > + found at http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > + > + @par Revision Reference: > + This Protocol was introduced in revised UEFI PI Specification 1.6. > + > +**/ > + > +#ifndef __SPI_NOR_FLASH_PROTOCOL_H__ > +#define __SPI_NOR_FLASH_PROTOCOL_H__ > + > +#include <Protocol/SpiConfiguration.h> > + > +/// > +/// Global ID for the SPI NOR Flash Protocol /// #define > +EFI_SPI_NOR_FLASH_PROTOCOL_GUID \ > + { 0xb57ec3fe, 0xf833, 0x4ba6, \ > + { 0x85, 0x78, 0x2a, 0x7d, 0x6a, 0x87, 0x44, 0x4b }} > + > +typedef struct _EFI_SPI_NOR_FLASH_PROTOCOL > EFI_SPI_NOR_FLASH_PROTOCOL; > + > +/** > + Read the 3 byte manufacture and device ID from the SPI flash. > + > + This routine must be called at or below TPL_NOTIFY. > + This routine reads the 3 byte manufacture and device ID from the > + flash part filling the buffer provided. > + > + @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data > structure. > + @param[out] Buffer Pointer to a 3 byte buffer to receive the manufacture > and > + device ID. > + > + > + > + @retval EFI_SUCCESS The manufacture and device ID was read > + successfully. > + @retval EFI_INVALID_PARAMETER Buffer is NULL > + @retval EFI_DEVICE_ERROR Invalid data received from SPI flash part. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_SPI_NOR_FLASH_PROTOCOL_GET_FLASH_ID) ( > + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, > + OUT UINT8 *Buffer > + ); > + > +/** > + Read data from the SPI flash. > + > + This routine must be called at or below TPL_NOTIFY. > + This routine reads data from the SPI part in the buffer provided. > + > + @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data > + structure. > + @param[in] FlashAddress Address in the flash to start reading > + @param[in] LengthInBytes Read length in bytes > + @param[out] Buffer Address of a buffer to receive the data > + > + @retval EFI_SUCCESS The data was read successfully. > + @retval EFI_INVALID_PARAMETER Buffer is NULL, or > + FlashAddress >= This->FlashSize, or > + LengthInBytes > This->FlashSize - > + FlashAddress > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_SPI_NOR_FLASH_PROTOCOL_READ_DATA) ( > + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, > + IN UINT32 FlashAddress, > + IN UINT32 LengthInBytes, > + OUT UINT8 *Buffer > + ); > + > +/** > + Read the flash status register. > + > + This routine must be called at or below TPL_NOTIFY. > + This routine reads the flash part status register. > + > + @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data > + structure. > + @param[in] LengthInBytes Number of status bytes to read. > + @param[out] FlashStatus Pointer to a buffer to receive the flash status. > + > + @retval EFI_SUCCESS The status register was read successfully. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_SPI_NOR_FLASH_PROTOCOL_READ_STATUS) ( > + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, > + IN UINT32 LengthInBytes, > + OUT UINT8 *FlashStatus > + ); > + > +/** > + Write the flash status register. > + > + This routine must be called at or below TPL_N OTIFY. > + This routine writes the flash part status register. > + > + @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data > + structure. > + @param[in] LengthInBytes Number of status bytes to write. > + @param[in] FlashStatus Pointer to a buffer containing the new status. > + > + @retval EFI_SUCCESS The status write was successful. > + @retval EFI_OUT_OF_RESOURCES Failed to allocate the write buffer. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_SPI_NOR_FLASH_PROTOCOL_WRITE_STATUS) ( > + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, > + IN UINT32 LengthInBytes, > + IN UINT8 *FlashStatus > + ); > + > +/** > + Write data to the SPI flash. > + > + This routine must be called at or below TPL_NOTIFY. > + This routine breaks up the write operation as necessary to write the > + data to the SPI part. > + > + @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data > + structure. > + @param[in] FlashAddress Address in the flash to start writing > + @param[in] LengthInBytes Write length in bytes > + @param[in] Buffer Address of a buffer containing the data > + > + @retval EFI_SUCCESS The data was written successfully. > + @retval EFI_INVALID_PARAMETER Buffer is NULL, or > + FlashAddress >= This->FlashSize, or > + LengthInBytes > This->FlashSize - > FlashAddress > + @retval EFI_OUT_OF_RESOURCES Insufficient memory to copy buffer. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_SPI_NOR_FLASH_PROTOCOL_WRITE_DATA) ( > + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, > + IN UINT32 FlashAddress, > + IN UINT32 LengthInBytes, > + IN UINT8 *Buffer > + ); > + > +/** > + Efficiently erases one or more 4KiB regions in the SPI flash. > + > + This routine must be called at or below TPL_NOTIFY. > + This routine uses a combination of 4 KiB and larger blocks to erase > + the specified area. > + > + @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data > + structure. > + @param[in] FlashAddress Address within a 4 KiB block to start erasing > + @param[in] BlockCount Number of 4 KiB blocks to erase > + > + @retval EFI_SUCCESS The erase was completed successfully. > + @retval EFI_INVALID_PARAMETER FlashAddress >= This->FlashSize, or > + BlockCount * 4 KiB > + > This->FlashSize - FlashAddress > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_SPI_NOR_FLASH_PROTOCOL_ERASE) ( > + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, > + IN UINT32 FlashAddress, > + IN UINT32 BlockCount > + ); > + > +/// > +/// The EFI_SPI_NOR_FLASH_PROTOCOL exists in the SPI peripheral layer. > +/// This protocol manipulates the SPI NOR flash parts using a common > +set of /// commands. The board layer provides the interconnection and > +configuration /// details for the SPI NOR flash part. The SPI NOR flash > +driver uses this /// configuration data to expose a generic interface > +which provides the /// following APls: > +/// * Read manufacture and device ID > +/// * Read data > +/// * Read data using low frequency > +/// * Read status > +/// * Write data > +/// * Erase 4 KiB blocks > +/// * Erase 32 or 64 KiB blocks > +/// * Write status > +/// The EFI_SPI_NOR_FLASH_PROTOCOL also exposes some APls to set the > +security /// features on the legacy SPI flash controller. > +/// > +struct _EFI_SPI_NOR_FLASH_PROTOCOL { > + /// > + /// Pointer to an EFI_SPI_PERIPHERAL data structure > + /// > + CONST EFI_SPI_PERIPHERAL *SpiPeripheral; > + > + /// > + /// Flash size in bytes > + /// > + UINT32 FlashSize; > + > + /// > + /// Manufacture and Device ID > + /// > + UINT8 Deviceid[3]; > + > + /// > + /// Erase block size in bytes > + /// > + UINT32 EraseBlockBytes; > + > + /// > + /// Page Write size in bytes > + /// > + UINT32 PageWriteSize; > + > + /// > + /// Read the 3 byte manufacture and device ID from the SPI flash. > + /// > + EFI_SPI_NOR_FLASH_PROTOCOL_GET_FLASH_ID GetFlashid; > + > + /// > + /// Read data from the SPI flash. > + /// > + EFI_SPI_NOR_FLASH_PROTOCOL_READ_DATA ReadData; > + > + /// > + /// Low frequency read data from the SPI flash. > + /// > + EFI_SPI_NOR_FLASH_PROTOCOL_READ_DATA LfReadData; > + > + /// > + /// Read the flash status register. > + /// > + EFI_SPI_NOR_FLASH_PROTOCOL_READ_STATUS ReadStatus; > + > + /// > + /// Write the flash status register. > + /// > + EFI_SPI_NOR_FLASH_PROTOCOL_WRITE_STATUS WriteStatus; > + > + /// > + /// Write data to the SPI flash. > + /// > + EFI_SPI_NOR_FLASH_PROTOCOL_WRITE_DATA WriteData; > + > + /// > + /// Efficiently erases one or more 4KiB regions in the SPI flash. > + /// > + EFI_SPI_NOR_FLASH_PROTOCOL_ERASE Erase; > +}; > + > +extern EFI_GUID gEfiSpiNorFlashProtocolGuid; > + > +#endif // __SPI_NOR_FLASH_PROTOCOL_H__ > -- > 2.7.4 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel