/** * 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); }
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; }
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; }