Ejemplo n.º 1
0
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);
}