| /** @file | |
| This file defines the Legacy SPI Controller Protocol. | |
| Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| @par Revision Reference: | |
| This Protocol was introduced in UEFI PI Specification 1.6. | |
| **/ | |
| #ifndef __LEGACY_SPI_CONTROLLER_PROTOCOL_H__ | |
| #define __LEGACY_SPI_CONTROLLER_PROTOCOL_H__ | |
| /// | |
| /// Note: The UEFI PI 1.6 specification uses the character 'l' in the GUID | |
| /// definition. This definition assumes it was supposed to be '1'. | |
| /// | |
| /// Global ID for the Legacy SPI Controller Protocol | |
| /// | |
| #define EFI_LEGACY_SPI_CONTROLLER_GUID \ | |
| { 0x39136fc7, 0x1a11, 0x49de, \ | |
| { 0xbf, 0x35, 0x0e, 0x78, 0xdd, 0xb5, 0x24, 0xfc }} | |
| typedef | |
| struct _EFI_LEGACY_SPI_CONTROLLER_PROTOCOL | |
| EFI_LEGACY_SPI_CONTROLLER_PROTOCOL; | |
| /** | |
| Set the erase block opcode. | |
| This routine must be called at or below TPL_NOTIFY. | |
| The menu table contains SPI transaction opcodes which are accessible after | |
| the legacy SPI flash controller's configuration is locked. The board layer | |
| specifies the erase block size for the SPI NOR flash part. The SPI NOR flash | |
| peripheral driver selects the erase block opcode which matches the erase | |
| block size and uses this API to load the opcode into the opcode menu table. | |
| @param[in] This Pointer to an EFI_LEGACY_SPI_CONTROLLER_PROTOCOL | |
| structure. | |
| @param[in] EraseBlockOpcode Erase block opcode to be placed into the opcode | |
| menu table. | |
| @retval EFI_SUCCESS The opcode menu table was updated | |
| @retval EFI_ACCESS_ERROR The SPI controller is locked | |
| **/ | |
| typedef EFI_STATUS | |
| (EFIAPI *EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_ERASE_BLOCK_OPCODE)( | |
| IN CONST EFI_LEGACY_SPI_CONTROLLER_PROTOCOL *This, | |
| IN UINT8 EraseBlockOpcode | |
| ); | |
| /** | |
| Set the write status prefix opcode. | |
| This routine must be called at or below TPL_NOTIFY. | |
| The prefix table contains SPI transaction write prefix opcodes which are | |
| accessible after the legacy SPI flash controller's configuration is locked. | |
| The board layer specifies the write status prefix opcode for the SPI NOR | |
| flash part. The SPI NOR flash peripheral driver uses this API to load the | |
| opcode into the prefix table. | |
| @param[in] This Pointer to an | |
| EFI_LEGACY_SPI_CONTROLLER_PROTOCOL structure. | |
| @param[in] WriteStatusPrefix Prefix opcode for the write status command. | |
| @retval EFI_SUCCESS The prefix table was updated | |
| @retval EFI_ACCESS_ERROR The SPI controller is locked | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_WRITE_STATUS_PREFIX)( | |
| IN CONST EFI_LEGACY_SPI_CONTROLLER_PROTOCOL *This, | |
| IN UINT8 WriteStatusPrefix | |
| ); | |
| /** | |
| Set the BIOS base address. | |
| This routine must be called at or below TPL_NOTIFY. | |
| The BIOS base address works with the protect range registers to protect | |
| portions of the SPI NOR flash from erase and write operat ions. The BIOS | |
| calls this API prior to passing control to the OS loader. | |
| @param[in] This Pointer to an EFI_LEGACY_SPI_CONTROLLER_PROTOCOL | |
| structure. | |
| @param[in] BiosBaseAddress The BIOS base address. | |
| @retval EFI_SUCCESS The BIOS base address was properly set | |
| @retval EFI_ACCESS_ERROR The SPI controller is locked | |
| @retval EFI_INVALID_PARAMETER The BIOS base address is greater than | |
| This->Maxi.mumOffset | |
| @retval EFI_UNSUPPORTED The BIOS base address was already set | |
| **/ | |
| typedef EFI_STATUS | |
| (EFIAPI *EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_BIOS_BASE_ADDRESS)( | |
| IN CONST EFI_LEGACY_SPI_CONTROLLER_PROTOCOL *This, | |
| IN UINT32 BiosBaseAddress | |
| ); | |
| /** | |
| Clear the SPI protect range registers. | |
| This routine must be called at or below TPL_NOTIFY. | |
| The BIOS uses this routine to set an initial condition on the SPI protect | |
| range registers. | |
| @param[in] This Pointer to an EFI_LEGACY_SPI_CONTROLLER_PROTOCOL structure. | |
| @retval EFI_SUCCESS The registers were successfully cleared | |
| @retval EFI_ACCESS_ERROR The SPI controller is locked | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_CLEAR_SPI_PROTECT)( | |
| IN CONST EFI_LEGACY_SPI_CONTROLLER_PROTOCOL *This | |
| ); | |
| /** | |
| Determine if the SPI range is protected. | |
| This routine must be called at or below TPL_NOTIFY. | |
| The BIOS uses this routine to verify a range in the SPI is protected. | |
| @param[in] This Pointer to an EFI_LEGACY_SPI_CONTROLLER_PROTOCOL | |
| structure. | |
| @param[in] BiosAddress Address within a 4 KiB block to start protecting. | |
| @param[in] BytesToProtect The number of 4 KiB blocks to protect. | |
| @retval TRUE The range is protected | |
| @retval FALSE The range is not protected | |
| **/ | |
| typedef | |
| BOOLEAN | |
| (EFIAPI *EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_IS_RANGE_PROTECTED)( | |
| IN CONST EFI_LEGACY_SPI_CONTROLLER_PROTOCOL *This, | |
| IN UINT32 BiosAddress, | |
| IN UINT32 BlocksToProtect | |
| ); | |
| /** | |
| Set the next protect range register. | |
| This routine must be called at or below TPL_NOTIFY. | |
| The BIOS sets the protect range register to prevent write and erase | |
| operations to a portion of the SPI NOR flash device. | |
| @param[in] This Pointer to an EFI_LEGACY_SPI_CONTROLLER_PROTOCOL | |
| structure. | |
| @param[in] BiosAddress Address within a 4 KiB block to start protecting. | |
| @param[in] BlocksToProtect The number of 4 KiB blocks to protect. | |
| @retval EFI_SUCCESS The register was successfully updated | |
| @retval EFI_ACCESS_ERROR The SPI controller is locked | |
| @retval EFI_INVALID_PARAMETER BiosAddress < This->BiosBaseAddress, or | |
| BlocksToProtect * 4 KiB | |
| > This->MaximumRangeBytes, or | |
| BiosAddress - This->BiosBaseAddress | |
| + (BlocksToProtect * 4 KiB) | |
| > This->MaximumRangeBytes | |
| @retval EFI_OUT_OF_RESOURCES No protect range register available | |
| @retval EFI_UNSUPPORTED Call This->SetBaseAddress because the BIOS base | |
| address is not set | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_PROTECT_NEXT_RANGE)( | |
| IN CONST EFI_LEGACY_SPI_CONTROLLER_PROTOCOL *This, | |
| IN UINT32 BiosAddress, | |
| IN UINT32 BlocksToProtect | |
| ); | |
| /** | |
| Lock the SPI controller configuration. | |
| This routine must be called at or below TPL_NOTIFY. | |
| This routine locks the SPI controller's configuration so that the software | |
| is no longer able to update: | |
| * Prefix table | |
| * Opcode menu | |
| * Opcode type table | |
| * BIOS base address | |
| * Protect range registers | |
| @param[in] This Pointer to an EFI_LEGACY_SPI_CONTROLLER_PROTOCOL structure. | |
| @retval EFI_SUCCESS The SPI controller was successfully locked | |
| @retval EFI_ALREADY_STARTED The SPI controller was already locked | |
| **/ | |
| typedef EFI_STATUS | |
| (EFIAPI *EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_LOCK_CONTROLLER)( | |
| IN CONST EFI_LEGACY_SPI_CONTROLLER_PROTOCOL *This | |
| ); | |
| /// | |
| /// Support the extra features of the legacy SPI flash controller. | |
| /// | |
| struct _EFI_LEGACY_SPI_CONTROLLER_PROTOCOL { | |
| /// | |
| /// Maximum offset from the BIOS base address that is able to be protected. | |
| /// | |
| UINT32 MaximumOffset; | |
| /// | |
| /// Maximum number of bytes that can be protected by one range register. | |
| /// | |
| UINT32 MaximumRangeBytes; | |
| /// | |
| /// The number of registers available for protecting the BIOS. | |
| /// | |
| UINT32 RangeRegisterCount; | |
| /// | |
| /// Set the erase block opcode. | |
| /// | |
| EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_ERASE_BLOCK_OPCODE EraseBlockOpcode; | |
| /// | |
| /// Set the write status prefix opcode. | |
| /// | |
| EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_WRITE_STATUS_PREFIX WriteStatusPrefix; | |
| /// | |
| /// Set the BIOS base address. | |
| /// | |
| EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_BIOS_BASE_ADDRESS BiosBaseAddress; | |
| /// | |
| /// Clear the SPI protect range registers. | |
| /// | |
| EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_CLEAR_SPI_PROTECT ClearSpiProtect; | |
| /// | |
| /// Determine if the SPI range is protected. | |
| /// | |
| EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_IS_RANGE_PROTECTED IsRangeProtected; | |
| /// | |
| /// Set the next protect range register. | |
| /// | |
| EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_PROTECT_NEXT_RANGE ProtectNextRange; | |
| /// | |
| /// Lock the SPI controller configuration. | |
| /// | |
| EFI_LEGACY_SPI_CONTROLLER_PROTOCOL_LOCK_CONTROLLER LockController; | |
| }; | |
| extern EFI_GUID gEfiLegacySpiControllerProtocolGuid; | |
| #endif // __LEGACY_SPI_CONTROLLER_PROTOCOL_H__ |