Exemplo n.º 1
0
AGESA_STATUS agesawrapper_amdinitreset(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdParamStruct;
	AMD_RESET_PARAMS AmdResetParams;

	memset(&AmdParamStruct, 0, sizeof(AMD_INTERFACE_PARAMS));
	memset(&AmdResetParams, 0, sizeof(AMD_RESET_PARAMS));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_RESET;
	AmdParamStruct.AllocationMethod = ByHost;
	AmdParamStruct.NewStructSize = sizeof(AMD_RESET_PARAMS);
	AmdParamStruct.NewStructPtr = &AmdResetParams;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;

	AmdCreateStruct(&AmdParamStruct);
	AmdResetParams.HtConfig.Depth = 0;

	status = AmdInitReset((AMD_RESET_PARAMS *) AmdParamStruct.NewStructPtr);
	AGESA_EVENTLOG(status, &AmdParamStruct.StdHeader);
	AmdReleaseStruct(&AmdParamStruct);
	return status;
}
Exemplo n.º 2
0
AGESA_STATUS agesawrapper_amdinitearly(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdParamStruct;
	AMD_EARLY_PARAMS     *AmdEarlyParamsPtr;

	LibAmdMemFill (&AmdParamStruct,
		       0,
		       sizeof (AMD_INTERFACE_PARAMS),
		       &(AmdParamStruct.StdHeader));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_EARLY;
	AmdParamStruct.AllocationMethod = PreMemHeap;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;
	AmdCreateStruct (&AmdParamStruct);

	AmdEarlyParamsPtr = (AMD_EARLY_PARAMS *)AmdParamStruct.NewStructPtr;
	OemCustomizeInitEarly (AmdEarlyParamsPtr);

	AmdEarlyParamsPtr->GnbConfig.PsppPolicy = PsppDisabled;
	status = AmdInitEarly ((AMD_EARLY_PARAMS *)AmdParamStruct.NewStructPtr);
	if (status != AGESA_SUCCESS) agesawrapper_amdreadeventlog(AmdParamStruct.StdHeader.HeapStatus);
	AmdReleaseStruct (&AmdParamStruct);

	return status;
}
Exemplo n.º 3
0
AGESA_STATUS agesawrapper_amdinitearly(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdParamStruct;
	AMD_EARLY_PARAMS *AmdEarlyParamsPtr;

	memset(&AmdParamStruct, 0, sizeof(AMD_INTERFACE_PARAMS));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_EARLY;
	AmdParamStruct.AllocationMethod = PreMemHeap;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;
	AmdCreateStruct(&AmdParamStruct);

	/* OEM Should Customize the defaults through this hook. */
	AmdEarlyParamsPtr = (AMD_EARLY_PARAMS *) AmdParamStruct.NewStructPtr;
	if (OemHook->InitEarly)
		OemHook->InitEarly(AmdEarlyParamsPtr);

	status = AmdInitEarly(AmdEarlyParamsPtr);
	AGESA_EVENTLOG(status, &AmdParamStruct.StdHeader);

	AmdReleaseStruct(&AmdParamStruct);

	return status;
}
Exemplo n.º 4
0
/**
 *  AgesaLaunchApForGivenTask
 *
 * Description
 *    Call the host environment interface to provide a user hook opportunity.
 *
 * @return   The AGESA Status returned from the callout.
 *
 */
AGESA_STATUS
AgesaLaunchApForGivenTask (
  VOID
  )
{
  AMD_INTERFACE_PARAMS  AmdInterfaceParams;
  AGESA_STATUS          AgesaStatus;
  AP_EXE_PARAMS         *ApExeParams;
  //
  // Invoke AmdAmdCpuLateInit
  //
  AmdInterfaceParams.AllocationMethod = PostMemDram;
  AmdInterfaceParams.AgesaFunctionName = AMD_LATE_RUN_AP_TASK;
  AgesaStatus = AmdCreateStruct (&AmdInterfaceParams);
  ApExeParams = (AP_EXE_PARAMS *)AmdInterfaceParams.NewStructPtr;

  ApExeParams->RelatedBlockLength = RelatedBlockLength;
  ApExeParams->RelatedDataBlock = RelatedDataBlock;
  ApExeParams->FunctionNumber = FunctionNumber;

  AgesaStatus = AmdLateRunApTask (ApExeParams);

  AmdReleaseStruct (&AmdInterfaceParams);

  return AgesaStatus;
}
Exemplo n.º 5
0
AGESA_STATUS agesawrapper_amdinitlate(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdParamStruct;

	memset(&AmdParamStruct, 0, sizeof(AMD_INTERFACE_PARAMS));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_LATE;
	AmdParamStruct.AllocationMethod = PostMemDram;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;

#if IS_ENABLED(CONFIG_CPU_AMD_AGESA_FAMILY15_TN) || IS_ENABLED(CONFIG_CPU_AMD_AGESA_FAMILY15_RL) || \
	IS_ENABLED(CONFIG_CPU_AMD_AGESA_FAMILY16_KB)
	AmdParamStruct.StdHeader.HeapStatus = HEAP_SYSTEM_MEM;
#endif

	AmdCreateStruct(&AmdParamStruct);
	AmdLateParams = (AMD_LATE_PARAMS *) AmdParamStruct.NewStructPtr;
	status = AmdInitLate(AmdLateParams);
	AGESA_EVENTLOG(status, &AmdLateParams->StdHeader);
	ASSERT(status == AGESA_SUCCESS);

	/* No AmdReleaseStruct(&AmdParamStruct), we need AmdLateParams later. */
	return status;
}
Exemplo n.º 6
0
AGESA_STATUS agesawrapper_amdinitenv(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdParamStruct;
	AMD_ENV_PARAMS *EnvParam;

	/* Initialize heap space */
	EmptyHeap();

	memset(&AmdParamStruct, 0, sizeof(AMD_INTERFACE_PARAMS));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_ENV;
	AmdParamStruct.AllocationMethod = PostMemDram;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;
	AmdCreateStruct(&AmdParamStruct);
	EnvParam = (AMD_ENV_PARAMS *) AmdParamStruct.NewStructPtr;

	status = AmdInitEnv(EnvParam);
	AGESA_EVENTLOG(status, &EnvParam->StdHeader);

	AmdReleaseStruct(&AmdParamStruct);
	return status;
}
Exemplo n.º 7
0
AGESA_STATUS agesawrapper_amdinitmid(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdParamStruct;
	AMD_MID_PARAMS *MidParam;

	memset(&AmdParamStruct, 0, sizeof(AMD_INTERFACE_PARAMS));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_MID;
	AmdParamStruct.AllocationMethod = PostMemDram;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;

	AmdCreateStruct(&AmdParamStruct);

	/* OEM Should Customize the defaults through this hook. */
	MidParam = (AMD_MID_PARAMS *) AmdParamStruct.NewStructPtr;
	if (OemHook->InitMid)
		OemHook->InitMid(MidParam);

	status = AmdInitMid(MidParam);
	AGESA_EVENTLOG(status, &MidParam->StdHeader);
	AmdReleaseStruct(&AmdParamStruct);

	return status;
}
Exemplo n.º 8
0
AGESA_STATUS agesawrapper_amdS3Save(void)
{
	AGESA_STATUS status;
	AMD_S3SAVE_PARAMS *AmdS3SaveParamsPtr;
	AMD_INTERFACE_PARAMS AmdInterfaceParams;

	memset(&AmdInterfaceParams, 0, sizeof(AMD_INTERFACE_PARAMS));

	AmdInterfaceParams.StdHeader.ImageBasePtr = 0;
	AmdInterfaceParams.StdHeader.HeapStatus = HEAP_SYSTEM_MEM;
	AmdInterfaceParams.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdInterfaceParams.AllocationMethod = PostMemDram;
	AmdInterfaceParams.AgesaFunctionName = AMD_S3_SAVE;
	AmdInterfaceParams.StdHeader.AltImageBasePtr = 0;
	AmdInterfaceParams.StdHeader.Func = 0;
	AmdCreateStruct(&AmdInterfaceParams);

	AmdS3SaveParamsPtr = (AMD_S3SAVE_PARAMS *) AmdInterfaceParams.NewStructPtr;
	AmdS3SaveParamsPtr->StdHeader = AmdInterfaceParams.StdHeader;

	status = AmdS3Save(AmdS3SaveParamsPtr);
	AGESA_EVENTLOG(status, &AmdInterfaceParams.StdHeader);
	ASSERT(status == AGESA_SUCCESS);

	OemS3Save(AmdS3SaveParamsPtr);

	AmdReleaseStruct(&AmdInterfaceParams);

	return status;
}
Exemplo n.º 9
0
AGESA_STATUS agesawrapper_amds3laterestore(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdInterfaceParams;
	AMD_S3LATE_PARAMS AmdS3LateParams;
	AMD_S3LATE_PARAMS *AmdS3LateParamsPtr;

	memset(&AmdS3LateParams, 0, sizeof(AMD_S3LATE_PARAMS));

	AmdInterfaceParams.StdHeader.ImageBasePtr = 0;
	AmdInterfaceParams.AllocationMethod = ByHost;
	AmdInterfaceParams.AgesaFunctionName = AMD_S3LATE_RESTORE;
	AmdInterfaceParams.NewStructPtr = &AmdS3LateParams;
	AmdInterfaceParams.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdS3LateParamsPtr = &AmdS3LateParams;
	AmdInterfaceParams.NewStructSize = sizeof(AMD_S3LATE_PARAMS);

	AmdCreateStruct(&AmdInterfaceParams);

#if 0
	/* TODO: What to do with NvStorage here? */
	AmdS3LateParamsPtr->S3DataBlock.NvStorageSize = 0;
#endif
	AmdS3LateParamsPtr->S3DataBlock.VolatileStorageSize = 0;
	OemS3LateRestore(AmdS3LateParamsPtr);

	status = AmdS3LateRestore(AmdS3LateParamsPtr);
	AGESA_EVENTLOG(status, &AmdInterfaceParams.StdHeader);
	ASSERT(status == AGESA_SUCCESS);

	return status;
}
Exemplo n.º 10
0
AGESA_STATUS agesawrapper_amdinitresume(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdParamStruct;
	AMD_RESUME_PARAMS *AmdResumeParamsPtr;

	memset(&AmdParamStruct, 0, sizeof(AMD_INTERFACE_PARAMS));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_RESUME;
	AmdParamStruct.AllocationMethod = PreMemHeap;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;
	AmdCreateStruct(&AmdParamStruct);

	AmdResumeParamsPtr = (AMD_RESUME_PARAMS *) AmdParamStruct.NewStructPtr;

	AmdResumeParamsPtr->S3DataBlock.NvStorageSize = 0;
	AmdResumeParamsPtr->S3DataBlock.VolatileStorageSize = 0;
	OemInitResume(AmdResumeParamsPtr);

	status = AmdInitResume(AmdResumeParamsPtr);

	AGESA_EVENTLOG(status, &AmdParamStruct.StdHeader);
	AmdReleaseStruct(&AmdParamStruct);

	return status;
}
Exemplo n.º 11
0
AGESA_STATUS agesawrapper_amdinitpost(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdParamStruct;
	AMD_POST_PARAMS *PostParams;

	memset(&AmdParamStruct, 0, sizeof(AMD_INTERFACE_PARAMS));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_POST;
	AmdParamStruct.AllocationMethod = PreMemHeap;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;

	AmdCreateStruct(&AmdParamStruct);

	/* OEM Should Customize the defaults through this hook. */
	PostParams = (AMD_POST_PARAMS *) AmdParamStruct.NewStructPtr;
	if (OemHook->InitPost)
		OemHook->InitPost(PostParams);

	status = AmdInitPost(PostParams);
	AGESA_EVENTLOG(status, &PostParams->StdHeader);

	AmdReleaseStruct(&AmdParamStruct);

	/* Initialize heap space */
	EmptyHeap();

	return status;
}
Exemplo n.º 12
0
AGESA_STATUS agesawrapper_amdS3Save(void)
{
	AGESA_STATUS Status;
	AMD_S3SAVE_PARAMS *AmdS3SaveParamsPtr;
	AMD_INTERFACE_PARAMS  AmdInterfaceParams;
	S3_DATA_TYPE          S3DataType;

	LibAmdMemFill (&AmdInterfaceParams,
		       0,
		       sizeof (AMD_INTERFACE_PARAMS),
		       &(AmdInterfaceParams.StdHeader));

	AmdInterfaceParams.StdHeader.ImageBasePtr = 0;
	AmdInterfaceParams.StdHeader.HeapStatus = HEAP_SYSTEM_MEM;
	AmdInterfaceParams.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdInterfaceParams.AllocationMethod = PostMemDram;
	AmdInterfaceParams.AgesaFunctionName = AMD_S3_SAVE;
	AmdInterfaceParams.StdHeader.AltImageBasePtr = 0;
	AmdInterfaceParams.StdHeader.Func = 0;

	AmdCreateStruct(&AmdInterfaceParams);
	AmdS3SaveParamsPtr = (AMD_S3SAVE_PARAMS *)AmdInterfaceParams.NewStructPtr;
	AmdS3SaveParamsPtr->StdHeader = AmdInterfaceParams.StdHeader;

	Status = AmdS3Save(AmdS3SaveParamsPtr);
	if (Status != AGESA_SUCCESS) {
		agesawrapper_amdreadeventlog(AmdInterfaceParams.StdHeader.HeapStatus);
		ASSERT(Status == AGESA_SUCCESS);
	}

	S3DataType = S3DataTypeNonVolatile;
	printk(BIOS_DEBUG, "NvStorageSize=%x, NvStorage=%x\n",
	       (unsigned int)AmdS3SaveParamsPtr->S3DataBlock.NvStorageSize,
	       (unsigned int)AmdS3SaveParamsPtr->S3DataBlock.NvStorage);

	Status = OemAgesaSaveS3Info (
		S3DataType,
		AmdS3SaveParamsPtr->S3DataBlock.NvStorageSize,
		AmdS3SaveParamsPtr->S3DataBlock.NvStorage);

	printk(BIOS_DEBUG, "VolatileStorageSize=%x, VolatileStorage=%x\n",
	       (unsigned int)AmdS3SaveParamsPtr->S3DataBlock.VolatileStorageSize,
	       (unsigned int)AmdS3SaveParamsPtr->S3DataBlock.VolatileStorage);

	if (AmdS3SaveParamsPtr->S3DataBlock.VolatileStorageSize != 0) {
		S3DataType = S3DataTypeVolatile;

		Status = OemAgesaSaveS3Info (
			S3DataType,
			AmdS3SaveParamsPtr->S3DataBlock.VolatileStorageSize,
			AmdS3SaveParamsPtr->S3DataBlock.VolatileStorage);
	}
	OemAgesaSaveMtrr();

	AmdReleaseStruct (&AmdInterfaceParams);

	return Status;
}
Exemplo n.º 13
0
AGESA_STATUS agesawrapper_amdinitpost(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS  AmdParamStruct;
	AMD_POST_PARAMS       *PostParams;

	LibAmdMemFill (&AmdParamStruct,
		       0,
		       sizeof (AMD_INTERFACE_PARAMS),
		       &(AmdParamStruct.StdHeader));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_POST;
	AmdParamStruct.AllocationMethod = PreMemHeap;
	AmdParamStruct.StdHeader.AltImageBasePtr = NULL;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;

	AmdCreateStruct (&AmdParamStruct);
	PostParams = (AMD_POST_PARAMS *)AmdParamStruct.NewStructPtr;

	OemPostParams(PostParams);

	// Do not use IS_ENABLED here.  CONFIG_GFXUMA should always have a value.  Allow
	// the compiler to flag the error if CONFIG_GFXUMA is not set.
	PostParams->MemConfig.UmaMode = CONFIG_GFXUMA ? UMA_AUTO : UMA_NONE;
	PostParams->MemConfig.UmaSize = 0;
	PostParams->MemConfig.BottomIo = (UINT16)(0xD0000000 >> 24);
	status = AmdInitPost (PostParams);
	printk(
			BIOS_SPEW,
			"setup_uma_memory: umamode %s\n",
			(PostParams->MemConfig.UmaMode == UMA_AUTO) ? "UMA_AUTO" :
			(PostParams->MemConfig.UmaMode == UMA_SPECIFIED) ? "UMA_SPECIFIED" :
			(PostParams->MemConfig.UmaMode == UMA_NONE) ? "UMA_NONE" :
			"unknown"
	);
	printk(
			BIOS_SPEW,
			"setup_uma_memory: syslimit 0x%08llX, bottomio 0x%08lx\n",
			(unsigned long long)(PostParams->MemConfig.SysLimit) << 16,
			(unsigned long)(PostParams->MemConfig.BottomIo) << 16
	);
	printk(
			BIOS_SPEW,
			"setup_uma_memory: uma size %luMB, uma start 0x%08lx\n",
			(unsigned long)(PostParams->MemConfig.UmaSize) >> (20 - 16),
			(unsigned long)(PostParams->MemConfig.UmaBase) << 16
	);

	if (status != AGESA_SUCCESS) agesawrapper_amdreadeventlog(PostParams->StdHeader.HeapStatus);
	AmdReleaseStruct (&AmdParamStruct);
	/* Initialize heap space */
	EmptyHeap();

	return status;
}
Exemplo n.º 14
0
VOID
EFIAPI
InvokeAmdInitMid (
  IN EFI_EVENT        Event,
  IN VOID             *Context
  )
/*++

Routine Description:

  Installs the AmdInitMid This function gets called
  each time the EFI_EVENT_SIGNAL_READY_TO_BOOT gets signaled

Arguments & Return Values: Standard event handling function prototype

--*/
{
  AMD_INTERFACE_PARAMS        AmdInterfaceParams;
  AGESA_STATUS                AgesaStatus;
  AMD_DXE_INIT_MID_PROTOCOL   AmdInitMidProtocol;
  EFI_HANDLE                  Handle;
  STATIC BOOLEAN              InitMidInvoked = FALSE;

  //
  // Prepare for AmdInitMid
  //
  if (!InitMidInvoked) {
    ZeroMem (&AmdInterfaceParams, sizeof (AMD_INTERFACE_PARAMS));
    AmdInterfaceParams.StdHeader.ImageBasePtr = 0;
    AmdInterfaceParams.StdHeader.HeapStatus = HEAP_SYSTEM_MEM;
    AmdInterfaceParams.AllocationMethod = PostMemDram;
    AmdInterfaceParams.AgesaFunctionName = AMD_INIT_MID;
    AgesaStatus = AmdCreateStruct (&AmdInterfaceParams);

    ((AMD_MID_PARAMS *)AmdInterfaceParams.NewStructPtr)->StdHeader = AmdInterfaceParams.StdHeader;

    OemCustomizeInitMid (gBS, (AMD_MID_PARAMS *)AmdInterfaceParams.NewStructPtr);

    AgesaStatus = AmdInitMid ((AMD_MID_PARAMS *)AmdInterfaceParams.NewStructPtr);

    OemHookAfterInitMid (gBS, (AMD_MID_PARAMS *)AmdInterfaceParams.NewStructPtr);

    if ((AgesaStatus == AGESA_CRITICAL) || (AgesaStatus == AGESA_FATAL)) {
      return;
    }
    AmdInitMidProtocol.Revision = AGESA_DXE_INIT_MID_REV;
    Handle = NULL;
    gBS->InstallProtocolInterface (
                  &Handle,
                  &gAmdDxeInitMidProtocolGuid,
                  EFI_NATIVE_INTERFACE,
                  &AmdInitMidProtocol
                  );
  }
  InitMidInvoked = TRUE;
}
Exemplo n.º 15
0
AGESA_STATUS agesawrapper_amdinitlate(void)
{
	AGESA_STATUS Status;
	AMD_INTERFACE_PARAMS AmdParamStruct;
	AMD_LATE_PARAMS *AmdLateParams;

	LibAmdMemFill (&AmdParamStruct,
		       0,
		       sizeof (AMD_INTERFACE_PARAMS),
		       &(AmdParamStruct.StdHeader));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_LATE;
	AmdParamStruct.AllocationMethod = PostMemDram;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.HeapStatus = HEAP_SYSTEM_MEM;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;

	/* NOTE: if not call amdcreatestruct, the initializer(AmdInitLateInitializer) would not be called */
	AmdCreateStruct(&AmdParamStruct);
	AmdLateParams = (AMD_LATE_PARAMS *)AmdParamStruct.NewStructPtr;
	Status = AmdInitLate(AmdLateParams);
	if (Status != AGESA_SUCCESS) {
		agesawrapper_amdreadeventlog(AmdLateParams->StdHeader.HeapStatus);
		ASSERT(Status == AGESA_SUCCESS);
	}

	DmiTable    = AmdLateParams->DmiTable;
	AcpiPstate  = AmdLateParams->AcpiPState;
#if IS_ENABLED(CONFIG_NORTHBRIDGE_AMD_PI_00630F01) || IS_ENABLED(CONFIG_NORTHBRIDGE_AMD_PI_00730F01)
	AcpiSrat    = AmdLateParams->AcpiSrat;
	AcpiSlit    = AmdLateParams->AcpiSlit;
#endif

	AcpiWheaMce = AmdLateParams->AcpiWheaMce;
	AcpiWheaCmc = AmdLateParams->AcpiWheaCmc;
	AcpiAlib    = AmdLateParams->AcpiAlib;
	AcpiIvrs    = AmdLateParams->AcpiIvrs;
	AcpiCrat    = AmdLateParams->AcpiCrat;

	printk(BIOS_DEBUG, "DmiTable:%x, AcpiPstatein: %x, AcpiSrat:%x,"
	       "AcpiSlit:%x, Mce:%x, Cmc:%x,"
	       "Alib:%x, AcpiIvrs:%x in %s\n",
	       (unsigned int)DmiTable, (unsigned int)AcpiPstate, (unsigned int)AcpiSrat,
	       (unsigned int)AcpiSlit, (unsigned int)AcpiWheaMce, (unsigned int)AcpiWheaCmc,
	       (unsigned int)AcpiAlib, (unsigned int)AcpiIvrs, __func__);

	/* AmdReleaseStruct (&AmdParamStruct); */
	return Status;
}
Exemplo n.º 16
0
AGESA_STATUS agesawrapper_amdinitmid(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdParamStruct;
	AMD_MID_PARAMS *MidParam;

	/* Enable MMIO on AMD CPU Address Map Controller */
	amd_initcpuio ();

	LibAmdMemFill (&AmdParamStruct,
		       0,
		       sizeof (AMD_INTERFACE_PARAMS),
		       &(AmdParamStruct.StdHeader));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_MID;
	AmdParamStruct.AllocationMethod = PostMemDram;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;

	AmdCreateStruct (&AmdParamStruct);
	MidParam = (AMD_MID_PARAMS *)AmdParamStruct.NewStructPtr;

	MidParam->GnbMidConfiguration.iGpuVgaMode = 0;/* 0 iGpuVgaAdapter, 1 iGpuVgaNonAdapter; */
	MidParam->GnbMidConfiguration.GnbIoapicAddress = 0xFEC20000;

	MidParam->FchInterface.AzaliaController = AzEnable;
	MidParam->FchInterface.SataClass = CONFIG_HUDSON_SATA_MODE;
	MidParam->FchInterface.SataEnable = !((CONFIG_HUDSON_SATA_MODE == 0) || (CONFIG_HUDSON_SATA_MODE == 3));
	MidParam->FchInterface.IdeEnable = (CONFIG_HUDSON_SATA_MODE == 0) || (CONFIG_HUDSON_SATA_MODE == 3);
	MidParam->FchInterface.SataIdeMode = (CONFIG_HUDSON_SATA_MODE == 3);

	status = AmdInitMid ((AMD_MID_PARAMS *)AmdParamStruct.NewStructPtr);
	if (status != AGESA_SUCCESS) agesawrapper_amdreadeventlog(AmdParamStruct.StdHeader.HeapStatus);
	AmdReleaseStruct (&AmdParamStruct);

	return status;
}
Exemplo n.º 17
0
AGESA_STATUS agesawrapper_amdinitreset(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdParamStruct;
	AMD_RESET_PARAMS AmdResetParams;

	LibAmdMemFill (&AmdParamStruct,
		       0,
		       sizeof (AMD_INTERFACE_PARAMS),
		       &(AmdParamStruct.StdHeader));

	LibAmdMemFill (&AmdResetParams,
		       0,
		       sizeof (AMD_RESET_PARAMS),
		       &(AmdResetParams.StdHeader));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_RESET;
	AmdParamStruct.AllocationMethod = ByHost;
	AmdParamStruct.NewStructSize = sizeof(AMD_RESET_PARAMS);
	AmdParamStruct.NewStructPtr = &AmdResetParams;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;
	AmdCreateStruct (&AmdParamStruct);

	AmdResetParams.FchInterface.Xhci0Enable = IS_ENABLED(CONFIG_HUDSON_XHCI_ENABLE);
	if (IS_ENABLED(CONFIG_SOUTHBRIDGE_AMD_PI_BOLTON))
		AmdResetParams.FchInterface.Xhci1Enable = TRUE;

	AmdResetParams.FchInterface.SataEnable = !((CONFIG_HUDSON_SATA_MODE == 0) || (CONFIG_HUDSON_SATA_MODE == 3));
	AmdResetParams.FchInterface.IdeEnable = (CONFIG_HUDSON_SATA_MODE == 0) || (CONFIG_HUDSON_SATA_MODE == 3);

	status = AmdInitReset(&AmdResetParams);
	if (status != AGESA_SUCCESS) agesawrapper_amdreadeventlog(AmdParamStruct.StdHeader.HeapStatus);
	AmdReleaseStruct (&AmdParamStruct);
	return status;
}
Exemplo n.º 18
0
AGESA_STATUS agesawrapper_amds3laterestore(void)
{
	AGESA_STATUS Status;
	AMD_INTERFACE_PARAMS    AmdInterfaceParams;
	AMD_S3LATE_PARAMS       AmdS3LateParams;
	AMD_S3LATE_PARAMS       *AmdS3LateParamsPtr;
	S3_DATA_TYPE          S3DataType;

	agesawrapper_amdinitcpuio();
	LibAmdMemFill (&AmdS3LateParams,
		       0,
		       sizeof (AMD_S3LATE_PARAMS),
		       &(AmdS3LateParams.StdHeader));
	AmdInterfaceParams.StdHeader.ImageBasePtr = 0;
	AmdInterfaceParams.AllocationMethod = ByHost;
	AmdInterfaceParams.AgesaFunctionName = AMD_S3LATE_RESTORE;
	AmdInterfaceParams.NewStructPtr = &AmdS3LateParams;
	AmdInterfaceParams.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdS3LateParamsPtr = &AmdS3LateParams;
	AmdInterfaceParams.NewStructSize = sizeof (AMD_S3LATE_PARAMS);

	AmdCreateStruct (&AmdInterfaceParams);

	AmdS3LateParamsPtr->S3DataBlock.VolatileStorageSize = 0;
	S3DataType = S3DataTypeVolatile;

	OemAgesaGetS3Info (S3DataType,
			   (u32 *) &AmdS3LateParamsPtr->S3DataBlock.VolatileStorageSize,
			   (void **) &AmdS3LateParamsPtr->S3DataBlock.VolatileStorage);

	Status = AmdS3LateRestore (AmdS3LateParamsPtr);
	if (Status != AGESA_SUCCESS) {
		agesawrapper_amdreadeventlog(AmdInterfaceParams.StdHeader.HeapStatus);
		ASSERT(Status == AGESA_SUCCESS);
	}

	return Status;
}
Exemplo n.º 19
0
AGESA_STATUS agesawrapper_amdinitresume(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdParamStruct;
	AMD_RESUME_PARAMS     *AmdResumeParamsPtr;
	S3_DATA_TYPE            S3DataType;

	LibAmdMemFill (&AmdParamStruct,
		       0,
		       sizeof (AMD_INTERFACE_PARAMS),
		       &(AmdParamStruct.StdHeader));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_RESUME;
	AmdParamStruct.AllocationMethod = PreMemHeap;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;
	AmdCreateStruct (&AmdParamStruct);

	AmdResumeParamsPtr = (AMD_RESUME_PARAMS *)AmdParamStruct.NewStructPtr;

	AmdResumeParamsPtr->S3DataBlock.NvStorageSize = 0;
	AmdResumeParamsPtr->S3DataBlock.VolatileStorageSize = 0;
	S3DataType = S3DataTypeNonVolatile;
	OemAgesaGetS3Info (S3DataType,
			   (u32 *) &AmdResumeParamsPtr->S3DataBlock.NvStorageSize,
			   (void **) &AmdResumeParamsPtr->S3DataBlock.NvStorage);

	status = AmdInitResume ((AMD_RESUME_PARAMS *)AmdParamStruct.NewStructPtr);

	if (status != AGESA_SUCCESS) agesawrapper_amdreadeventlog(AmdParamStruct.StdHeader.HeapStatus);
	AmdReleaseStruct (&AmdParamStruct);

	return status;
}
Exemplo n.º 20
0
AGESA_STATUS agesawrapper_amdinitenv(void)
{
	AGESA_STATUS status;
	AMD_INTERFACE_PARAMS AmdParamStruct;
	AMD_ENV_PARAMS       *EnvParam;

	LibAmdMemFill (&AmdParamStruct,
		       0,
		       sizeof (AMD_INTERFACE_PARAMS),
		       &(AmdParamStruct.StdHeader));

	AmdParamStruct.AgesaFunctionName = AMD_INIT_ENV;
	AmdParamStruct.AllocationMethod = PostMemDram;
	AmdParamStruct.StdHeader.AltImageBasePtr = 0;
	AmdParamStruct.StdHeader.CalloutPtr = &GetBiosCallout;
	AmdParamStruct.StdHeader.Func = 0;
	AmdParamStruct.StdHeader.ImageBasePtr = 0;
	status = AmdCreateStruct (&AmdParamStruct);
	EnvParam = (AMD_ENV_PARAMS *)AmdParamStruct.NewStructPtr;

	EnvParam->FchInterface.AzaliaController = AzEnable;
	EnvParam->FchInterface.SataClass = CONFIG_HUDSON_SATA_MODE;
	EnvParam->FchInterface.SataEnable = !((CONFIG_HUDSON_SATA_MODE == 0) || (CONFIG_HUDSON_SATA_MODE == 3));
	EnvParam->FchInterface.IdeEnable = (CONFIG_HUDSON_SATA_MODE == 0) || (CONFIG_HUDSON_SATA_MODE == 3);
	EnvParam->FchInterface.SataIdeMode = (CONFIG_HUDSON_SATA_MODE == 3);
	EnvParam->GnbEnvConfiguration.IommuSupport = FALSE;

	status = AmdInitEnv (EnvParam);
	if (status != AGESA_SUCCESS) agesawrapper_amdreadeventlog(EnvParam->StdHeader.HeapStatus);
	/* Initialize Subordinate Bus Number and Secondary Bus Number
	 * In platform BIOS this address is allocated by PCI enumeration code
	 Modify D1F0x18
	*/

	return status;
}
Exemplo n.º 21
0
VOID
EFIAPI
AgesaInitRtb (
  IN EFI_EVENT        Event,
  IN VOID             *Context
  )
/*++

Routine Description:

  Do last minute configuration and preparation for system suspend-to-RAM mode.
  This function gets called each time the EFI_EVENT_SIGNAL_READY_TO_BOOT gets signaled

Arguments & Return Values: Standard event handling function prototype

--*/
{
  EFI_STATUS            Status;
  AMD_INTERFACE_PARAMS  AmdInterfaceParams;
  AMD_RTB_PARAMS       *AmdInitRtbParamsPtr;
  AGESA_STATUS          AgesaStatus;
  S3_DATA_TYPE          S3DataType;

  //
  // Prepare for S3Save
  //
  AmdInterfaceParams.StdHeader.ImageBasePtr = 0;
  AmdInterfaceParams.StdHeader.HeapStatus = HEAP_SYSTEM_MEM;
  AmdInterfaceParams.AllocationMethod = PostMemDram;
  AmdInterfaceParams.AgesaFunctionName = AMD_INIT_RTB;

  AgesaStatus = AmdCreateStruct (&AmdInterfaceParams);
  AmdInitRtbParamsPtr = (AMD_RTB_PARAMS *) AmdInterfaceParams.NewStructPtr;
  //
  // OEM hook to customize any S3 Info required
  //
  OemCustomizeInitRtb (gBS, AmdInitRtbParamsPtr);

  AgesaStatus = AmdInitRtb (AmdInitRtbParamsPtr);

  if (AgesaStatus !=  AGESA_SUCCESS) {
    return;
  }

  if (AmdInitRtbParamsPtr->S3DataBlock.NvStorageSize != 0) {
    S3DataType = S3DataTypeNonVolatile;

    Status = OemAgesaSaveS3Info (
      S3DataType,
      AmdInitRtbParamsPtr->S3DataBlock.NvStorageSize,
      AmdInitRtbParamsPtr->S3DataBlock.NvStorage
      );
  }

  if (AmdInitRtbParamsPtr->S3DataBlock.VolatileStorageSize != 0) {
    S3DataType = S3DataTypeVolatile;

    Status = OemAgesaSaveS3Info (
      S3DataType,
      AmdInitRtbParamsPtr->S3DataBlock.VolatileStorageSize,
      AmdInitRtbParamsPtr->S3DataBlock.VolatileStorage
      );
  }

  //
  // Close this event to avoid any alternate run
  //
  gBS->CloseEvent (Event);
}
Exemplo n.º 22
0
VOID
EFIAPI
InvokeAmdInitLate (
  IN EFI_EVENT        Event,
  IN VOID             *Context
  )
/*++

Routine Description:

  Invoke AmdinitLate entry point. This function gets called
  each time the EFI_EVENT_SIGNAL_READY_TO_BOOT gets signaled

Arguments & Return Values: Standard event handling function prototype

--*/
{
  AMD_INTERFACE_PARAMS        AmdInterfaceParams;
  AGESA_STATUS                AgesaStatus;
  AMD_DXE_INIT_LATE_PROTOCOL  AmdInitLateProtocol;
  AMD_AGESA_DXE_PROTOCOL      *AmdAgesaDxe;
  EFI_HANDLE                  Handle;
  UINTN                       TableBufferLength;
  UINT8                       *TableBufferPtr;
  EFI_ACPI_TABLE_PROTOCOL     *AcpiTable;
  UINTN                       TableKey;
  EFI_STATUS                  Status;

  //
  // Prepare for AmdInitLate
  //
  ZeroMem (&AmdInterfaceParams, sizeof (AMD_INTERFACE_PARAMS));
  AmdInterfaceParams.StdHeader.ImageBasePtr = 0;
  AmdInterfaceParams.StdHeader.HeapStatus = HEAP_SYSTEM_MEM;
  AmdInterfaceParams.AllocationMethod = PostMemDram;
  AmdInterfaceParams.AgesaFunctionName = AMD_INIT_LATE;
  AgesaStatus = AmdCreateStruct (&AmdInterfaceParams);

  ((AMD_LATE_PARAMS *)AmdInterfaceParams.NewStructPtr)->StdHeader = AmdInterfaceParams.StdHeader;

  OemCustomizeInitLate (gBS, (AMD_LATE_PARAMS *)AmdInterfaceParams.NewStructPtr);

  AgesaStatus = AmdInitLate ((AMD_LATE_PARAMS *)AmdInterfaceParams.NewStructPtr);

  OemHookAfterInitLate (gBS, (AMD_LATE_PARAMS *)AmdInterfaceParams.NewStructPtr);

  if ((AgesaStatus == AGESA_CRITICAL) || (AgesaStatus == AGESA_FATAL)) {
    return;
  }

  mAgesaDxePrivate->LateParamsPtr = (AMD_LATE_PARAMS *)AmdInterfaceParams.NewStructPtr;

  //
  // Now Install the AmdDxeInitLateProtocol which helps notify any consumer
  // which is depending upon it.
  //
  AmdInitLateProtocol.Revision = AGESA_DXE_INIT_LATE_REV;
  Handle = NULL;
  gBS->InstallProtocolInterface (
                  &Handle,
                  &gAmdDxeInitLateProtocolGuid,
                  EFI_NATIVE_INTERFACE,
                  &AmdInitLateProtocol
                  );
  //
  // Install the AMD_AGESA_DXE_PROTOCOL to notify OEM to override default value
  //
  Handle = NULL;

  gBS->InstallProtocolInterface (
                  &Handle,
                  &gAmdAgesaDxeProtocolGuid,
                  EFI_NATIVE_INTERFACE,
                  &mAgesaDxePrivate->CpuInterface
                  );

  //Publish ACPI TABLES.
  (UINT8*)TableBufferPtr = NULL;
  TableKey = NULL;
  AcpiTable = NULL;
  AmdAgesaDxe = NULL;

  //By default PCD is set to FALSE. Before Enabling PCD make sure to disable publishing of ACPI Tables by IBVs to avoid conflict.
  if (PcdGetBool (PcdPublishAgesaAcpiTable)) {
    Status = gBS->LocateProtocol (
                  &gAcpiTableProtocolGuid,
                  NULL,
                  &AcpiTable
                  );
    ASSERT_EFI_ERROR (Status);

    //-PSTATE
    TableBufferLength = 0;
    mAgesaDxePrivate->CpuInterface.CreateProcessorTables (AmdAgesaDxe, AcpiPstateType, &TableBufferLength, &TableBufferPtr); //First get the buffer size needed for the table.
    if (TableBufferLength != 0 ) {
      TableBufferPtr = AllocateZeroPool (TableBufferLength);
      mAgesaDxePrivate->CpuInterface.CreateProcessorTables (AmdAgesaDxe, AcpiPstateType, &TableBufferLength, &TableBufferPtr);
      Status = AcpiTable->InstallAcpiTable (AcpiTable, TableBufferPtr, TableBufferLength, &TableKey);
      FreePool (TableBufferPtr);
    }

    //-Crat
    TableBufferLength = 0;
    mAgesaDxePrivate->CpuInterface.CreateProcessorTables (AmdAgesaDxe, AcpiCratType, &TableBufferLength, &TableBufferPtr); //First get the buffer size needed for the table.
    if (TableBufferLength != 0 ) {
      TableBufferPtr = AllocateZeroPool (TableBufferLength);
      mAgesaDxePrivate->CpuInterface.CreateProcessorTables (AmdAgesaDxe, AcpiCratType, &TableBufferLength, &TableBufferPtr);
      Status = AcpiTable->InstallAcpiTable (AcpiTable, TableBufferPtr, TableBufferLength, &TableKey);
      FreePool (TableBufferPtr);
    }

    //-Cdit
    TableBufferLength = 0;
    mAgesaDxePrivate->CpuInterface.CreateProcessorTables (AmdAgesaDxe, AcpiCditType, &TableBufferLength, &TableBufferPtr); //First get the buffer size needed for the table.
    if (TableBufferLength != 0 ) {
      TableBufferPtr = AllocateZeroPool (TableBufferLength);
      mAgesaDxePrivate->CpuInterface.CreateProcessorTables (AmdAgesaDxe, AcpiCditType, &TableBufferLength, &TableBufferPtr);
      Status = AcpiTable->InstallAcpiTable (AcpiTable, TableBufferPtr, TableBufferLength, &TableKey);
      FreePool (TableBufferPtr);
    }
  }
  return;
}
Exemplo n.º 23
0
VOID
EFIAPI
InvokeAmdInitLate (
    IN EFI_EVENT        Event,
    IN VOID             *Context
)
/*++

Routine Description:

  Invoke AmdinitLate entry point. This function gets called
  each time the EFI_EVENT_SIGNAL_READY_TO_BOOT gets signaled

Arguments & Return Values: Standard event handling function prototype

--*/
{
    AMD_INTERFACE_PARAMS              AmdInterfaceParams;
    AGESA_STATUS                      AgesaStatus;
    AMD_DXE_INIT_LATE_PROTOCOL        AmdInitLateProtocol;
    EFI_HANDLE                        Handle;

    //
    // Prepare for AmdInitLate
    //
    EfiZeroMem (&AmdInterfaceParams, sizeof (AMD_INTERFACE_PARAMS));
    AmdInterfaceParams.StdHeader.ImageBasePtr = 0;
    AmdInterfaceParams.StdHeader.HeapStatus = HEAP_SYSTEM_MEM;
    AmdInterfaceParams.AllocationMethod = PostMemDram;
    AmdInterfaceParams.AgesaFunctionName = AMD_INIT_LATE;
    AgesaStatus = AmdCreateStruct (&AmdInterfaceParams);

    ((AMD_LATE_PARAMS *)AmdInterfaceParams.NewStructPtr)->StdHeader = AmdInterfaceParams.StdHeader;

    OemCustomizeInitLate (gBS, (AMD_LATE_PARAMS *)AmdInterfaceParams.NewStructPtr);

    AgesaStatus = AmdInitLate ((AMD_LATE_PARAMS *)AmdInterfaceParams.NewStructPtr);

    OemHookAfterInitLate (gBS, (AMD_LATE_PARAMS *)AmdInterfaceParams.NewStructPtr);

    if ((AgesaStatus == AGESA_CRITICAL) || (AgesaStatus == AGESA_FATAL)) {
        return;
    }

    mAgesaDxePrivate->LateParamsPtr = (AMD_LATE_PARAMS *)AmdInterfaceParams.NewStructPtr;

    //
    // Now Install the AmdDxeInitLateProtocol which helps notify any consumer
    // which is depending upon it.
    //
    AmdInitLateProtocol.Revision = AGESA_DXE_INIT_LATE_REV;
    Handle = NULL;
    gBS->InstallProtocolInterface (
        &Handle,
        &gAmdDxeInitLateProtocolGuid,
        EFI_NATIVE_INTERFACE,
        &AmdInitLateProtocol
    );
    //
    // Install the AMD_AGESA_DXE_PROTOCOL to notify OEM to override default value
    //
    Handle = NULL;

    gBS->InstallProtocolInterface (
        &Handle,
        &gAmdAgesaDxeProtocolGuid,
        EFI_NATIVE_INTERFACE,
        &mAgesaDxePrivate->CpuInterface
    );


    //
    // Install AgesaDxeMiscellaneous Protocol
    //
    Handle = NULL;
    gBS->CopyMem (
        &mAgesaDxePrivate->AgesaMiscServices.StdHeader,
        &AmdInterfaceParams.StdHeader,
        sizeof (AMD_CONFIG_PARAMS)
    );

    mAgesaDxePrivate->AgesaMiscServices.GetDimmInfo = AgesaGetDimmInfo;

    gBS->InstallProtocolInterface (
        &Handle,
        &gAmdAgesaDxeMiscServicesProtocolGuid,
        EFI_NATIVE_INTERFACE,
        &mAgesaDxePrivate->AgesaMiscServices
    );

    return;
}
Exemplo n.º 24
0
EFI_STATUS
EFIAPI
AgesaDxeDriverEntryPoint (
  IN       EFI_HANDLE                       ImageHandle,
  IN       EFI_SYSTEM_TABLE                 *SystemTable
  )
{
  EFI_STATUS                  Status;
  AMD_INTERFACE_PARAMS        AmdInterfaceParams;
  AGESA_STATUS                AgesaStatus;
  AMD_ENV_PARAMS              AmdInitEnvParams;
  EFI_EVENT                   ReadyToBootEvent;
  EFI_HANDLE                  Handle;
  AMD_BUFFER_MANAGER_PROTOCOL *BufferMgr;

  //
  // Initialize Global Variable
  //
  //
  // Initialize the configuration structure and private data area
  //
  // Allocate memory for the private data
  Status = gBS->AllocatePool (
                  EfiBootServicesData,
                  sizeof (AGESA_DXE_PRIVATE_DATA),
                  &mAgesaDxePrivate);

  ASSERT_EFI_ERROR (Status);

  if (EFI_ERROR (Status)) {
    return Status;
  }
  //
  // Install the AMD_AGESA_MMIO_PROTOCOL
  //
  mAgesaDxePrivate->MmioMapManager.AmdMmioMapManager = AmdMmioMapManager;

  Handle = NULL;
  gBS->InstallProtocolInterface (
                  &Handle,
                  &gAmdAgesaMmioProtocolGuid,
                  EFI_NATIVE_INTERFACE,
                  &mAgesaDxePrivate->MmioMapManager
                  );
  //
  // Initialize the private data structure
  //
  mAgesaDxePrivate->Signature = AGESA_DXE_PRIVATE_DATA_SIGNATURE;

  //
  // Create the first buffer for AGESA_ALLOCATE_BUFFER Manager
  //
  Status = gBS->AllocatePool (
                  EfiBootServicesData,
                  sizeof (AGESA_DXE_BUFFER_MANAGER),
                  &mAgesaDxePrivate->BufferManagerPtr
                  );

  ASSERT_EFI_ERROR (Status);

  if (EFI_ERROR (Status)) {
    return Status;
  }
  ZeroMem (mAgesaDxePrivate->BufferManagerPtr, sizeof (AGESA_DXE_BUFFER_MANAGER));
  mAgesaDxePrivate->BufferManagerPtr->NextAgesaBufferManagerPtr = NULL;
  AgesaBufferManager = mAgesaDxePrivate->BufferManagerPtr;

  //
  // Rebuild persist heap from HOB.
  //
  Status = RebuildHeap (&mAgesaDxePrivate->HeapManagerPtr);
  if (EFI_ERROR (Status)) {
    return EFI_OUT_OF_RESOURCES;
  }

  //
  // Invoke AmdInitEnv
  //
  ZeroMem (&AmdInterfaceParams, sizeof (AMD_INTERFACE_PARAMS));
  ZeroMem (&AmdInitEnvParams, sizeof (AMD_ENV_PARAMS));
  AmdInterfaceParams.StdHeader.ImageBasePtr = 0;
  AmdInterfaceParams.StdHeader.HeapStatus = HEAP_SYSTEM_MEM;
  AmdInterfaceParams.AllocationMethod = ByHost;
  AmdInterfaceParams.AgesaFunctionName = AMD_INIT_ENV;
  AmdInterfaceParams.NewStructPtr = &AmdInitEnvParams;
  AmdInterfaceParams.NewStructSize = sizeof (AMD_ENV_PARAMS);
  AgesaStatus = AmdCreateStruct (&AmdInterfaceParams);

  AmdInitEnvParams.StdHeader = AmdInterfaceParams.StdHeader;

  OemCustomizeInitEnv (gBS, &AmdInitEnvParams);

  AgesaStatus = AmdInitEnv (&AmdInitEnvParams);

  OemHookAfterInitEnv (gBS, &AmdInitEnvParams);

  if ((AgesaStatus == AGESA_CRITICAL) || (AgesaStatus == AGESA_FATAL)) {
    return EFI_DEVICE_ERROR;
  }

  //
  // Install AmdBufferManagerProtocol which notifies other dependent drivers
  //
  Status = gBS->AllocatePool (
                  EfiBootServicesData,
                  sizeof (AMD_BUFFER_MANAGER_PROTOCOL),
                  &BufferMgr
                  );
  ASSERT_EFI_ERROR (Status);

  BufferMgr->StdHeader = AmdInitEnvParams.StdHeader;
  BufferMgr->DxeBufferManager = mAgesaDxePrivate->BufferManagerPtr;
  BufferMgr->AmdBufferCallout = AgesaDxeCallout;

  Handle = NULL;
  gBS->InstallProtocolInterface (
                  &Handle,
                  &gAmdBufferManagerProtocolGuid,
                  EFI_NATIVE_INTERFACE,
                  BufferMgr
                  );


  //
  // Register the event handling function for AmdInitMid to be launched after
  // PciIo protocol
  //
  Status = gBS->CreateEventEx (
             EVT_NOTIFY_SIGNAL,
             TPL_NOTIFY,
             InvokeAmdInitMid,
             NULL,
             &PciIoProtocolInstallEventGuid,
             &PciIoEvent
             );

  Status = gBS->RegisterProtocolNotify (
              &gEfiPciIoProtocolGuid,
              PciIoEvent,
              &mRegistrationForPciIo
              );

  //
  // Set up call back for AmdInitLate after AmdInitMid has been launched.
  //
  Status = gBS->CreateEventEx (
             EVT_NOTIFY_SIGNAL,
             TPL_NOTIFY,
             InvokeAmdInitLate,
             NULL,
             &AmdInitMidProtocolInstallEventGuid,
             &AmdInitMidEvent
             );

  Status = gBS->RegisterProtocolNotify (
              &gAmdDxeInitMidProtocolGuid,
              AmdInitMidEvent,
              &(mRegistrationForAmdInitMid)
              );


  //
  // Initialize AMD CPU Interface protocol
  //
  mAgesaDxePrivate->CpuInterface.CreateProcessorTables = AmdCpuCreateProcessorTables;

  // S3 Interface
  // Register the event handling function to produce
  // resulting Smbios image.
  //
  Status = gBS->CreateEventEx (
             EVT_NOTIFY_SIGNAL,
             TPL_NOTIFY,
             AgesaInitRtb,
             NULL,
             &gEfiEventReadyToBootGuid,
             &ReadyToBootEvent
             );

  return EFI_SUCCESS;
}