VOID EFIAPI SpiPhaseInit ( VOID ) /*++ Routine Description: This function is a a hook for Spi Smm phase specific initialization Arguments: None Returns: None --*/ { UINTN Index; // // Save SPI Registers for S3 resume usage // for (Index = 0; Index < sizeof (mSpiRegister) / sizeof (UINT32); Index++) { S3BootScriptSaveMemWrite ( S3BootScriptWidthUint32, (UINTN) (mSpiInstance->PchRootComplexBar + mSpiRegister[Index]), 1, (VOID *) (UINTN) (mSpiInstance->PchRootComplexBar + mSpiRegister[Index]) ); } }
/** Internal function to add memory write opcode to the table. @param Marker The variable argument list to get the opcode and associated attributes. @retval EFI_OUT_OF_RESOURCES Not enough resource to do operation. @retval EFI_SUCCESS Opcode is added. **/ EFI_STATUS BootScriptWriteMemWrite ( IN VA_LIST Marker ) { S3_BOOT_SCRIPT_LIB_WIDTH Width; UINT64 Address; UINTN Count; UINT8 *Buffer; Width = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH); Address = VA_ARG (Marker, UINT64); Count = VA_ARG (Marker, UINTN); Buffer = VA_ARG (Marker, UINT8 *); return S3BootScriptSaveMemWrite (Width, Address, Count, Buffer); }
VOID EFIAPI SpiPhaseInit ( VOID ) /*++ Routine Description: This function is a a hook for Spi Dxe phase specific initialization Arguments: None Returns: None --*/ { UINTN Index; // // Disable SMM BIOS write protect if it's not a SMM protocol // MmioAnd8 ( PciDeviceMmBase (PCI_BUS_NUMBER_QNC, PCI_DEVICE_NUMBER_QNC_LPC, PCI_FUNCTION_NUMBER_QNC_LPC) + R_QNC_LPC_BIOS_CNTL, (UINT8) (~B_QNC_LPC_BIOS_CNTL_SMM_BWP) ); // // Save SPI Registers for S3 resume usage // for (Index = 0; Index < sizeof (mSpiRegister) / sizeof (UINT32); Index++) { S3BootScriptSaveMemWrite ( S3BootScriptWidthUint32, (UINTN) (mSpiInstance->PchRootComplexBar + mSpiRegister[Index]), 1, (VOID *) (UINTN) (mSpiInstance->PchRootComplexBar + mSpiRegister[Index]) ); } }
EFI_STATUS EFIAPI SpiProtocolLock ( IN EFI_SPI_PROTOCOL *This ) /*++ Routine Description: Lock the SPI Static Configuration Interface. Once locked, the interface can not be changed and can only be clear by system reset. Arguments: This Pointer to the EFI_SPI_PROTOCOL instance. Returns: EFI_SUCCESS Lock operation succeed. EFI_DEVICE_ERROR Device error, operation failed. EFI_ACCESS_DENIED The interface has already been locked. --*/ { SPI_INSTANCE *SpiInstance; UINTN PchRootComplexBar; SpiInstance = SPI_INSTANCE_FROM_SPIPROTOCOL (This); PchRootComplexBar = SpiInstance->PchRootComplexBar; // // Check if the SPI interface has been locked-down. // if ((MmioRead16 (PchRootComplexBar + R_QNC_RCRB_SPIS) & B_QNC_RCRB_SPIS_SCL) != 0) { return EFI_ACCESS_DENIED; } // // Lock-down the configuration interface. // MmioOr16 ((UINTN) (PchRootComplexBar + R_QNC_RCRB_SPIS), (UINT16) (B_QNC_RCRB_SPIS_SCL)); // // Verify if it's really locked. // if ((MmioRead16 (PchRootComplexBar + R_QNC_RCRB_SPIS) & B_QNC_RCRB_SPIS_SCL) == 0) { return EFI_DEVICE_ERROR; } else { // // Save updated register in S3 Boot script. // S3BootScriptSaveMemWrite ( S3BootScriptWidthUint16, (UINTN) (PchRootComplexBar + R_QNC_RCRB_SPIS), 1, (VOID *) (UINTN) (PchRootComplexBar + R_QNC_RCRB_SPIS) ); } return EFI_SUCCESS; }