From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.1.88; helo=eur01-ve1-obe.outbound.protection.outlook.com; envelope-from=pankaj.bansal@nxp.com; receiver=edk2-devel@lists.01.org Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0088.outbound.protection.outlook.com [104.47.1.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D7B9B223C1766 for ; Mon, 19 Feb 2018 20:45:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=xCt1n/uaKwpf07inNbJgYkmk9RDZbclK7iGsKs3QUXo=; b=ix8daZ5g8IxX03D+w73n7oJTCOsE8Ux1V/cKekARrh8sj/dUu2I/wzo0x2xKt5EKoMhW2Qm6ykgDyCjsDoJn4k2ZpCh8huU8ljhZ87uxcHlL8bIxwfsyMIea7ut5I0s87jguFl8HsjBnQdFgpMcFRFGsAzXTa/rltD+yEOrMGDc= Received: from AM0PR0402MB3940.eurprd04.prod.outlook.com (52.133.40.140) by AM0PR0402MB3635.eurprd04.prod.outlook.com (52.133.38.30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.485.10; Tue, 20 Feb 2018 04:51:27 +0000 Received: from AM0PR0402MB3940.eurprd04.prod.outlook.com ([fe80::4815:8101:2a92:25ea]) by AM0PR0402MB3940.eurprd04.prod.outlook.com ([fe80::4815:8101:2a92:25ea%13]) with mapi id 15.20.0506.020; Tue, 20 Feb 2018 04:51:27 +0000 From: Pankaj Bansal To: "edk2-devel@lists.01.org" CC: Ard Biesheuvel , Leif Lindholm , Michael D Kinney Thread-Topic: [PATCH 1/2] Silicon/NXP: Add Modified SPI protocol stack Thread-Index: AQHToZzVHxv6tkXad0msPsQerXBg4aOsyWrQ Date: Tue, 20 Feb 2018 04:51:27 +0000 Message-ID: References: <1518177236-30343-1-git-send-email-pankaj.bansal@nxp.com> In-Reply-To: <1518177236-30343-1-git-send-email-pankaj.bansal@nxp.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=pankaj.bansal@nxp.com; x-originating-ip: [49.36.1.179] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; AM0PR0402MB3635; 7:R+6f9v3uESMvkqSBT4zg598EoyzhTxyCsvGNtL/EbFN4Yn2y55eovha/wJ58uSd/dLtfVC19Mo1C4Y4gDjAnVeYqmmJuEjRiWfs0n/1ZXDJx5RtmVpu8RrgGyxUkYO/076Y56Ilbl9LagbkuNfJhoL2MSSM842oGxvhH29nSx9famA6aIE/A1HyTeWwev/lllIAvaAVo02rDqVjBwnnAlW09RxIYF+rJE7GE7Bpp6oXUTpVTnILklfyDU/44pkVV x-ms-exchange-antispam-srfa-diagnostics: SSOS; x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: dd1480b2-8595-4efe-2918-08d5781d99fe x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(3008032)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603307)(7153060)(7193020); SRVR:AM0PR0402MB3635; x-ms-traffictypediagnostic: AM0PR0402MB3635: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(131327999870524)(185117386973197)(788757137089)(162533806227266)(228905959029699); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001056)(6040501)(2401047)(8121501046)(5005006)(10201501046)(3231101)(944501161)(93006095)(93001095)(3002001)(6055026)(6041288)(20161123562045)(20161123560045)(20161123564045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:AM0PR0402MB3635; BCL:0; PCL:0; RULEID:; SRVR:AM0PR0402MB3635; x-forefront-prvs: 05891FB07F x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(366004)(346002)(376002)(39380400002)(39860400002)(396003)(13464003)(199004)(189003)(53754006)(6306002)(33656002)(3280700002)(7736002)(6246003)(15188155005)(5250100002)(229853002)(2351001)(5890100001)(3660700001)(2501003)(106356001)(53546011)(59450400001)(53376002)(14454004)(2900100001)(97736004)(16799955002)(25786009)(68736007)(305945005)(74316002)(26005)(6916009)(2950100002)(5660300001)(102836004)(8676002)(551934003)(186003)(6116002)(7696005)(81166006)(105586002)(86362001)(2906002)(54906003)(53936002)(66066001)(99286004)(5640700003)(53946003)(3846002)(81156014)(4326008)(966005)(55016002)(6506007)(76176011)(8936002)(6436002)(478600001)(16200700003)(9686003)(316002)(559001)(569006); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR0402MB3635; H:AM0PR0402MB3940.eurprd04.prod.outlook.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; received-spf: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: 9XYffF1QtN4px7ul1zZtYyKVBOixsuME9g0bzTRft+rXU84i0pNY99mtEwAqGNytuzU+wixyGXWT0mr8UmXH2DB98VkMA0GwLkkT4DTfDlqcsckDXiuGt1V4dkJLyWYXN/g98+L/P8gYHuCDJx8R/MjAlN6/0aSkijaOuu8Mk9w= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: dd1480b2-8595-4efe-2918-08d5781d99fe X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Feb 2018 04:51:27.4498 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR0402MB3635 Subject: Re: [PATCH 1/2] Silicon/NXP: Add Modified SPI protocol stack X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 20 Feb 2018 04:45:34 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable 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 ; Ard Biesheuvel > ; Leif Lindholm ; > Michael D Kinney > Subject: [PATCH 1/2] Silicon/NXP: Add Modified SPI protocol stack >=20 > 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. >=20 > Therefore we are modifying the SPI protocol defined in PI 1.6 spec. >=20 > Untill these changes are incorporated in PI specs, we are calling it revi= sed PI > 1.6 spec. >=20 > Cc: Ard Biesheuvel > Cc: Leif Lindholm > Cc: Michael D Kinney > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Pankaj Bansal > --- > 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(+) >=20 > diff --git a/Silicon/NXP/Include/Pi/PiSpi.h b/Silicon/NXP/Include/Pi/PiSp= i.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.
> + 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 =3D 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 memo= ry. > + /// the master tri-states the bus during "dummy" cycles. > + /// No data (WriteBuffer =3D NULL and ReadBuffer =3D 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 =3D 1, > + > + /// Two line transfer > + SPI_TRANSACTION_BUS_WIDTH_2 =3D 2, > + > + /// Four line transfer > + SPI_TRANSACTION_BUS_WIDTH_4 =3D 4, > + > + /// Eight line transfer > + SPI_TRANSACTION_BUS_WIDTH_8 =3D 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 =3D 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.
> + 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 megaher= tz. > +/// > +#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 sel= ect 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 l= ine of > + the SPI peripheral. > + > + @retval EFI_SUCCESS The chip select was set successfully > + @retval EFI_NOT_READY Support for the chip select is not prop= erly > + 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 structu= re > from > + which the routine can access the ClockParame= ter, > + ClockPhase and ClockPolarity fields. The rou= tine > + 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. Th= e > clock > + generator will choose a supported clock freq= uency > + 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 th= e > + 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 t= he 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 connecte= d 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 manipulat= e 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 dri= ver. > + /// 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 periphe= ral > 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 frequen= cy > 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 chi= p. > + /// > + 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 sta= ck. > +/// 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.
> + 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 > +#include > + > +/// > +/// 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 sel= ect 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 l= ine 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 prop= erly > + 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 structu= re > from > + which the routine can access the ClockParame= ter, > + ClockPhase and ClockPolarity fields. The rou= tine > + 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. Th= e SPI > + host controller will choose a supported cloc= k > + frequency which is less then or equal to thi= s > + value. Specify zero to turn the clock genera= tor > + 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 th= e > + 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 th= e > slave > + address. EFI_DEVICE_ERROR will be ret= urned 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 se= t: > + /// * SPI_HALF_DUPLEX - The SPI Host Controller supports only half dup= lex > + /// 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 m= ost > + /// significant bits instead of least significant bits.The host dr= iver > + /// 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 dr= iver > + /// 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.
> + 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 > +#include #include > + > + > +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 struct= ure. > + @param[in] RequestPacket Pointer to an EFI_SPI_REQUEST_PACKET > + structure describing the SPI transaction= s. > + > + @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-z= ero > + value only when a specific SPI transacti= on > + 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 pro= perly > + initialized > + @retval EFI_INVALID_PARAMETER The ChipSeLect value or its contents > are > + invalid > + @retval EFI_NO_RESPONSE The SPI device is not responding to th= e > slave > + address. EFI_DEVICE_ERROR will be ret= urned 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 successf= ully > + @retval EFI_INVALID_PARAMETER The SpiPeripheral value is NULL, > + or the SpiPeripheral->SpiBus is NULL, > + or the SpiP eripheral - >SpiBus pointin= g 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 transacti= ons > + /// * 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.
> + 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 > + > +/// > +/// 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 manufact= ure > 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 pa= rt. > + > +**/ > +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 da= ta > + 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 >=3D 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 da= ta > + structure. > + @param[in] LengthInBytes Number of status bytes to read. > + @param[out] FlashStatus Pointer to a buffer to receive the flash st= atus. > + > + @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 dat= a > + structure. > + @param[in] LengthInBytes Number of status bytes to write. > + @param[in] FlashStatus Pointer to a buffer containing the new statu= s. > + > + @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 dat= a > + 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 >=3D This->FlashSize, or > + LengthInBytes > This->FlashSize - Flash= Address > + @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 >=3D 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