| /** @file | |
| This file defines the Legacy SPI Flash 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_FLASH_PROTOCOL_H__ | |
| #define __LEGACY_SPI_FLASH_PROTOCOL_H__ | |
| #include <Protocol/SpiNorFlash.h> | |
| /// | |
| /// Global ID for the Legacy SPI Flash Protocol | |
| /// | |
| #define EFI_LEGACY_SPI_FLASH_PROTOCOL_GUID \ | |
| { 0xf01bed57, 0x04bc, 0x4f3f, \ | |
| { 0x96, 0x60, 0xd6, 0xf2, 0xea, 0x22, 0x82, 0x59 }} | |
| typedef struct _EFI_LEGACY_SPI_FLASH_PROTOCOL EFI_LEGACY_SPI_FLASH_PROTOCOL; | |
| /** | |
| 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_FLASH_PROTOCOL data | |
| 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 BiosBaseAddress > This->MaximumOffset | |
| @retval EFI_UNSUPPORTED The BIOS base address was already set or not a | |
| legacy SPI host controller | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_LEGACY_SPI_FLASH_PROTOCOL_BIOS_BASE_ADDRESS)( | |
| IN CONST EFI_LEGACY_SPI_FLASH_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_FLASH_PROTOCOL data structure. | |
| @retval EFI_SUCCESS The registers were successfully cleared | |
| @retval EFI_ACCESS_ERROR The SPI controller is locked | |
| @retval EFI_UNSUPPORTED Not a legacy SPI host controller | |
| **/ | |
| typedef EFI_STATUS | |
| (EFIAPI *EFI_LEGACY_SPI_FLASH_PROTOCOL_CLEAR_SPI_PROTECT)( | |
| IN CONST EFI_LEGACY_SPI_FLASH_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_FLASH_PROTOCOL data | |
| 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 TRUE The range is protected | |
| @retval FALSE The range is not protected | |
| **/ | |
| typedef | |
| BOOLEAN | |
| (EFIAPI *EFI_LEGACY_SPI_FLASH_PROTOCOL_IS_RANGE_PROTECTED)( | |
| IN CONST EFI_LEGACY_SPI_FLASH_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_FLASH_PROTOCOL data | |
| 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 | |
| @retval EFI_INVALID_PARAMETER 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 Not a legacy SPI host | |
| controller | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_LEGACY_SPI_FLASH_PROTOCOL_PROTECT_NEXT_RANGE)( | |
| IN CONST EFI_LEGACY_SPI_FLASH_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_FLASH_PROTOCOL data structure. | |
| @retval EFI_SUCCESS The SPI controller was successfully locked | |
| @retval EFI_ALREADY_STARTED The SPI controller was already locked | |
| @retval EFI_UNSUPPORTED Not a legacy SPI host controller | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_LEGACY_SPI_FLASH_PROTOCOL_LOCK_CONTROLLER)( | |
| IN CONST EFI_LEGACY_SPI_FLASH_PROTOCOL *This | |
| ); | |
| /// | |
| /// The EFI_LEGACY_SPI_FLASH_PROTOCOL extends the EFI_SPI_NOR_FLASH_PROTOCOL | |
| /// with APls to support the legacy SPI flash controller. | |
| /// | |
| struct _EFI_LEGACY_SPI_FLASH_PROTOCOL { | |
| /// | |
| /// This protocol manipulates the SPI NOR flash parts using a common set of | |
| /// commands. | |
| /// | |
| EFI_SPI_NOR_FLASH_PROTOCOL FlashProtocol; | |
| // | |
| // Legacy flash (SPI host) controller support | |
| // | |
| /// | |
| /// Set the BIOS base address. | |
| /// | |
| EFI_LEGACY_SPI_FLASH_PROTOCOL_BIOS_BASE_ADDRESS BiosBaseAddress; | |
| /// | |
| /// Clear the SPI protect range registers. | |
| /// | |
| EFI_LEGACY_SPI_FLASH_PROTOCOL_CLEAR_SPI_PROTECT ClearSpiProtect; | |
| /// | |
| /// Determine if the SPI range is protected. | |
| /// | |
| EFI_LEGACY_SPI_FLASH_PROTOCOL_IS_RANGE_PROTECTED IsRangeProtected; | |
| /// | |
| /// Set the next protect range register. | |
| /// | |
| EFI_LEGACY_SPI_FLASH_PROTOCOL_PROTECT_NEXT_RANGE ProtectNextRange; | |
| /// | |
| /// Lock the SPI controller configuration. | |
| /// | |
| EFI_LEGACY_SPI_FLASH_PROTOCOL_LOCK_CONTROLLER LockController; | |
| }; | |
| extern EFI_GUID gEfiLegacySpiFlashProtocolGuid; | |
| #endif // __LEGACY_SPI_FLASH_PROTOCOL_H__ |