EFI_STATUS SetInitRootPortDownstreamS3Item ( ) /*++ Routine Description: Set an Init Root Port Downstream devices S3 dispatch item, this function may assert if any error happend Arguments: Returns: EFI_SUCCESS The function completed successfully --*/ { EFI_STATUS Status; VOID *Context; VOID *S3DispatchEntryPoint; STATIC EFI_QNC_S3_SUPPORT_PROTOCOL *QncS3Support; STATIC UINT32 S3ParameterRootPortDownstream=0; STATIC EFI_QNC_S3_DISPATCH_ITEM S3DispatchItem = { QncS3ItemTypeInitPcieRootPortDownstream, &S3ParameterRootPortDownstream }; if (!QncS3Support) { // // Get the QNC S3 Support Protocol // Status = gBS->LocateProtocol ( &gEfiQncS3SupportProtocolGuid, NULL, &QncS3Support ); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return Status; } } Status = QncS3Support->SetDispatchItem ( QncS3Support, &S3DispatchItem, &S3DispatchEntryPoint, &Context ); ASSERT_EFI_ERROR (Status); // // Save the script dispatch item in the Boot Script // Status = S3BootScriptSaveDispatch2 (S3DispatchEntryPoint, Context); ASSERT_EFI_ERROR (Status); // return Status; }
/** Internal function to add Save jmp address according to DISPATCH_OPCODE2. The "Context" parameter is not ignored. @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 BootScriptWriteDispatch2 ( IN VA_LIST Marker ) { VOID *EntryPoint; VOID *Context; EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS); Context = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS); return S3BootScriptSaveDispatch2 (EntryPoint, Context); }