/** Saves a PCI configuration value to the boot script. This internal worker function saves a PCI configuration value in the S3 script to be replayed on S3 resume. If the saving process fails, then ASSERT(). @param Width The width of PCI configuration. @param Address Address that encodes the PCI Bus, Device, Function and Register. @param Buffer The buffer containing value. **/ VOID InternalSavePciSegmentWriteValueToBootScript ( IN S3_BOOT_SCRIPT_LIB_WIDTH Width, IN UINT64 Address, IN VOID *Buffer ) { RETURN_STATUS Status; Status = S3BootScriptSavePciCfg2Write ( Width, RShiftU64 ((Address), 32) & 0xffff, PCI_SEGMENT_LIB_ADDRESS_TO_S3_BOOT_SCRIPT_PCI_ADDRESS (Address), 1, Buffer ); ASSERT_RETURN_ERROR (Status); }
/** Internal function to add PciCfg2 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 BootScriptWritePciCfg2Write ( IN VA_LIST Marker ) { S3_BOOT_SCRIPT_LIB_WIDTH Width; UINT64 Address; UINTN Count; UINT8 *Buffer; UINT16 Segment; Width = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH); Segment = VA_ARG (Marker, UINT16); Address = VA_ARG (Marker, UINT64); Count = VA_ARG (Marker, UINTN); Buffer = VA_ARG (Marker, UINT8 *); return S3BootScriptSavePciCfg2Write (Width, Segment, Address, Count, Buffer); }
/** Copies the data in a caller supplied buffer to a specified range of PCI configuration space, and saves the value in the S3 script to be replayed on S3 resume. Writes the range of PCI configuration registers specified by StartAddress and Size from the buffer specified by Buffer. This function only allows the PCI configuration registers from a single PCI function to be written. Size is returned. When possible 32-bit PCI configuration write cycles are used to write from StartAdress to StartAddress + Size. Due to alignment restrictions, 8-bit and 16-bit PCI configuration write cycles may be used at the beginning and the end of the range. If any reserved bits in StartAddress are set, then ASSERT(). If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT(). If Size > 0 and Buffer is NULL, then ASSERT(). @param StartAddress Starting address that encodes the PCI Segment, Bus, Device, Function and Register. @param Size Size in bytes of the transfer. @param Buffer Pointer to a buffer containing the data to write. @return The parameter of Size. **/ UINTN EFIAPI S3PciSegmentWriteBuffer ( IN UINT64 StartAddress, IN UINTN Size, IN VOID *Buffer ) { RETURN_STATUS Status; Status = S3BootScriptSavePciCfg2Write ( S3BootScriptWidthUint8, RShiftU64 (StartAddress, 32) & 0xffff, PCI_SEGMENT_LIB_ADDRESS_TO_S3_BOOT_SCRIPT_PCI_ADDRESS (StartAddress), PciSegmentWriteBuffer (StartAddress, Size, Buffer), Buffer ); ASSERT_RETURN_ERROR (Status); return Size; }