Newer
Older
AMI-Aptio-BIOS-Reversed / SataController / SataController.md
@Ajax Dong Ajax Dong 2 days ago 4 KB Init

SataController

Function Table

Address Name Description
SataGetDeviceCount
SataGetDevice
SataIdentifyDevice
SataModifyDevice
SataSubmitAsyncCommand
SataStopDevice
SataCalculateBestPioMode
PchGetPchSeries
S3BootScriptLibInit
S3BootScriptEventNotify
S3BootScriptFinalize
S3ReadyToLockNotify
S3BootScriptCloseEvent
S3BootScriptCloseNotify
SaveBootScriptDataToLockBox
SmmLockBoxSave
SmmLockBoxSetAttributes
SmmLockBoxRestore
S3BootScriptLibDeinit
SataComponentNameGetDriverName
SataComponentNameGetControllerName
LookupStringTable
EFI_IDE_CONTROLLER_INIT_PROTOCOL implementation
Allocate result buffer for caller
ResultBuffer = AllocatePool (sizeof (EFI_IDE_CHANNEL_INFO));
Query best PIO mode
MaxMode = 0;
Mode valid
Mode invalid
Check DMA capability
if (SataPrivateData->DeviceIdentifyData[Channel][106] & 4) {
Device supports DMA - calculate best DMA mode
UINT16 DmaMode = 0;
No DMA
PIO Mode Calculation
Field 103: IORDY support and mode info
Field103 = IdentifyData->Field103;
No IORDY - use PIO mode 0-2 only
BestPio = Field103;
IORDY supported - determine PIO mode 0-4
Determine PIO mode from timing
if (PioModeBits <= 0x78) {
PCH Series Detection
Check if device ID falls in SPT range (0x9D00-0x9D3F with mask 0xFF70)
if (((LpcDeviceId + 24128) & 0xFF70) != 0) {
Check CNP range
if ((UINT16)(LpcDeviceId + 25280) <= 8) {
Cannon Point
S3 Boot Script Library
Allocate EfiReservedMemory for boot script context
Status = GetPcdDbProtocol ();
Locate SMM protocol
Status = gBS->LocateProtocol (&gEfiSmmBase2ProtocolGuid, NULL, &gSmst);
Register S3 boot script close notification
Status = gBS->CreateEvent (
Status = gBS->RegisterProtocolNotify (
S3 Boot Script Event Notify Callbacks
Inside SMM - check if already saved
if (gBootScriptContext != NULL && !gBootScriptContext->FlagSaved) {
S3 Boot Script Data save to LockBox
Step 1: Save boot script context to lockbox
Status = SmmLockBoxSave (&gBootScriptFinalGuid
Step 2: Get memory map
Step 3: Allocate memory ranges structure
PagesAddr = (EFI_PHYSICAL_ADDRESS)(UINTN)-1;
Count ranges that are not MMIO
for (Index = 0; Index < MemoryMapSize / MapDescriptorSize; Index++) {
Allocate memory ranges buffer
BufferSize = MemoryRanges->NumberOfMemoryRanges * sizeof (MEMORY_RANGE_ENTRY);
Step 4: Fill memory ranges
Step 5: Save memory ranges to lockbox
Status = SmmLockBoxSave (&gBootScriptFinalGuid, MemoryRanges
SMM LockBox Wrappers
ReturnStatus (UINT32 )(CommBuffer + 24) = 1; // Function: Save
HeaderSize CopyMem (CommBuffer + 40, Guid, 16);
Close DxeSmmReadyToLock event
if (gDxeSmmReadyToLockEvent != NULL) {
Unregister notifies
if (gSmst != NULL) {
Free boot script buffer
if (gBootScriptAllocated && gBootScriptContext != NULL) {
Free SMM allocated buffer
if (gSmstAllocated && gSmst != NULL) {
Component Name Protocol
Verify the controller is managed by this driver
EFI_STATUS Status;
Not PCI IO - return unsupported
if (Status != EFI_UNSUPPORTED) {
String Table Lookup
RFC 4646 language tags: compare 3-byte prefix
if (ReadUint24 ((UINT32 )Lang) == ReadUint24 ((UINT32 )SupportedLanguages)) {
ISO 639-2: split by ';', compare each
Skip to next language token
Lang += TokenLen;
Compare entry token with language
CHAR8 StrTok = Entry;
Skip semicolons

Generated by HR650X BIOS Decompilation Project