Ejemplo n.º 1
0
/**
 * The Dispatcher is the entry point into the AGESA software. It takes a function
 * number as entry parameter in order to invoke the published function
 *
 * @param[in,out]  ConfigPtr
 *
 * @return   AGESA Status.
 *
 */
AGESA_STATUS
CALLCONV
AmdAgesaDispatcher (
  IN OUT   VOID *ConfigPtrParm
  )
{
	AGESA_STATUS Status = AGESA_UNSUPPORTED;
	AMD_CONFIG_PARAMS *ConfigPtr = ConfigPtrParm;

	{
		DISPATCH_TABLE *Entry;
		Entry = (DISPATCH_TABLE *) DispatchTable;
		while (Entry->FunctionId != 0) {
			if (ConfigPtr->Func == Entry->FunctionId) {
				Status = Entry->EntryPoint (ConfigPtr);
				break;
			}
			Entry++;
		}
	}

	// 2. Try next dispatcher if possible, and we have not already got status back
	if ((mCpuModuleID.NextBlock != NULL) && (Status == AGESA_UNSUPPORTED)) {
		MODULE_ENTRY  ModuleEntry = NULL;
		ModuleEntry = (MODULE_ENTRY) (UINT64) mCpuModuleID.NextBlock->ModuleDispatcher;
		if (ModuleEntry != NULL) {
		  Status = (*ModuleEntry) (ConfigPtr);
		}
	}


	// 3. If not this image specific function, see if we can find alternative image instead
	if (Status == AGESA_UNSUPPORTED) {
		IMAGE_ENTRY ImageEntry = NULL;
		UINT32 ImageStart = 0xFFE80000;
		UINT32 ImageEnd = 0xFFFC0000;
		AMD_IMAGE_HEADER* AltImagePtr = NULL;
		if ((((AMD_CONFIG_PARAMS *)ConfigPtr)->AltImageBasePtr != 0xFFFFFFFF  ) || (((AMD_CONFIG_PARAMS *)ConfigPtr)->AltImageBasePtr != 0)) {
			ImageStart = ((AMD_CONFIG_PARAMS *)ConfigPtr)->AltImageBasePtr;
			ImageEnd = ImageStart + 4;
			// Locate/test image base that matches this component
			AltImagePtr = LibAmdLocateImage (
					(VOID *)ImageStart,
					(VOID *)ImageEnd,
					4096,
					(CHAR8 *)AGESA_ID
				);
			if (AltImagePtr != NULL) {
				//Invoke alternative Image
				ImageEntry = (IMAGE_ENTRY) ((UINT64) AltImagePtr + AltImagePtr->EntryPointAddress);
				Status = (*ImageEntry) (ConfigPtr);
			}
		}
	}

	return (Status);
}
Ejemplo n.º 2
0
const void *agesawrapper_locate_module (const CHAR8 name[8])
{
	const void* agesa;
	const AMD_IMAGE_HEADER* image;
	const AMD_MODULE_HEADER* module;
	size_t file_size;

	agesa = cbfs_boot_map_with_leak((const char *)CONFIG_CBFS_AGESA_NAME,
					CBFS_TYPE_RAW, &file_size);
	if (!agesa)
		return NULL;
	image =  LibAmdLocateImage(agesa, agesa + file_size - 1, 4096, name);
	module = (AMD_MODULE_HEADER*)image->ModuleInfoOffset;

	return module;
}
Ejemplo n.º 3
0
const void *agesawrapper_locate_module (const CHAR8 name[8])
{
	struct cbfs_media media;
	struct cbfs_file* file;
	const void* agesa;
	const AMD_IMAGE_HEADER* image;
	const AMD_MODULE_HEADER* module;
	size_t file_size;

	if (init_default_cbfs_media(&media))
		return NULL;
	file = cbfs_get_file(&media, (const char*)CONFIG_CBFS_AGESA_NAME);
	if (!file)
		return NULL;
	agesa = cbfs_get_file_content(&media, (const char*)CONFIG_CBFS_AGESA_NAME,
		ntohl(file->type), &file_size);
	if (!agesa)
		return NULL;
	image =  LibAmdLocateImage(agesa, agesa + file_size - 1, 4096, name);
	module = (AMD_MODULE_HEADER*)image->ModuleInfoOffset;

	return module;
}