X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FInterfaces%2FUDI%2Fmain.c;h=7a61d81f3acce68b17d8f99921b48bba579e8bf8;hb=bf4936e107e62b9c03e8cbf78395ef462e50fb47;hp=51e04b32aa4cb70a986076b59fe189a1c850f4ef;hpb=8d3b2c5f55f648f964afe7540a9fca97ab0b17d6;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Interfaces/UDI/main.c b/KernelLand/Modules/Interfaces/UDI/main.c index 51e04b32..7a61d81f 100644 --- a/KernelLand/Modules/Interfaces/UDI/main.c +++ b/KernelLand/Modules/Interfaces/UDI/main.c @@ -1,24 +1,26 @@ /* * Acess2 UDI Layer + * - By John Hodge (thePowersGang) + * + * main.c + * - UDI Entrypoint and Module loading */ #define DEBUG 1 #define VERSION ((0<<8)|1) #include #include #include -#include "udi_internal.h" -#include "udi_ma.h" - -// === IMPORTS === -extern udi_init_t pci_init; -extern char pci_udiprops[]; -extern size_t pci_udiprops_size; +#include +#include +#include +#include +#include // === PROTOTYPES === int UDI_Install(char **Arguments); int UDI_DetectDriver(void *Base); int UDI_LoadDriver(void *Base); -tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, udi_init_t *info, const char *udiprops, size_t udiprops_size); +tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, const udi_init_t *info, const char *udiprops, size_t udiprops_size); const tUDI_MetaLang *UDI_int_GetMetaLangByName(const char *Name); // === GLOBALS === @@ -40,6 +42,8 @@ int UDI_Install(char **Arguments) Proc_SpawnWorker(UDI_int_DeferredThread, NULL); UDI_int_LoadDriver(NULL, &pci_init, pci_udiprops, pci_udiprops_size); + UDI_int_LoadDriver(NULL, &acessnsr_init, acessnsr_udiprops, acessnsr_udiprops_size); + UDI_int_LoadDriver(NULL, &acessuart_init, acessuart_udiprops, acessuart_udiprops_size); return MODULE_ERR_OK; } @@ -318,7 +322,7 @@ const char *caUDI_UdipropsNames[] = { }; #undef _defpropname -tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, udi_init_t *info, const char *udiprops, size_t udiprops_size) +tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, const udi_init_t *info, const char *udiprops, size_t udiprops_size) { //UDI_int_DumpInitInfo(info); @@ -404,6 +408,7 @@ tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, udi_init_t *info, const ch driver_module->Devices = NEW(tUDI_PropDevSpec*,* driver_module->nDevices); // Populate + bool error_hit = false; int cur_locale = 0; int msg_index = 0; int ml_index = 0; @@ -422,13 +427,13 @@ tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, udi_init_t *info, const ch case UDIPROPS__properties_version: if( _get_token_uint32(str, &str) != 0x101 ) { Log_Warning("UDI", "Properties version mismatch."); + error_hit = true; } break; case UDIPROPS__module: driver_module->ModuleName = str; break; - case UDIPROPS__meta: - { + case UDIPROPS__meta: { tUDI_MetaLangRef *ml = &driver_module->MetaLangs[ml_index++]; ml->meta_idx = _get_token_idx(str, &str); if( !str ) continue; @@ -438,9 +443,10 @@ tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, udi_init_t *info, const ch if( !ml->metalang ) { Log_Error("UDI", "Module %s referenced unsupported metalang %s", driver_module->ModuleName, ml->interface_name); + error_hit = true; + // TODO: error } - break; - } + break; } case UDIPROPS__message: { tUDI_PropMessage *msg = &driver_module->Messages[msg_index++]; @@ -639,6 +645,7 @@ tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, udi_init_t *info, const ch // TODO: Array Log_Warning("UDI", "TODO: Parse 'array' attribute in 'device'"); _get_token_str(str, &str, NULL); + error_hit = true; break; case 3: // ubit32 at->attr_length = sizeof(udi_ubit32_t); @@ -664,6 +671,24 @@ tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, udi_init_t *info, const ch } } free(udipropsptrs); + if( error_hit ) { + Log_Error("UDI", "Error encountered while parsing udiprops for '%s' (%p), bailing", + driver_module->ModuleName, LoadBase); + for( int i = 0; i < device_index; i ++ ) + free(driver_module->Devices[i]); + free(driver_module->Messages); + free(driver_module->RegionTypes); + free(driver_module->MetaLangs); + free(driver_module->Parents); + free(driver_module->ChildBindOps); + free(driver_module->Devices); + free(driver_module); + return NULL; + } + + for( int i = 0; i < driver_module->nDevices; i ++ ) + driver_module->Devices[i]->Metalang = UDI_int_GetMetaLang(driver_module, + driver_module->Devices[i]->MetaIdx); // Sort message list // TODO: Sort message list @@ -681,10 +706,7 @@ tUDI_DriverModule *UDI_int_LoadDriver(void *LoadBase, udi_init_t *info, const ch // Check for orphan drivers, and create an instance of them when loaded if( driver_module->nParents == 0 ) { - tUDI_DriverInstance *inst = UDI_MA_CreateInstance(driver_module); - - // Enumerate so any pre-loaded drivers are detected - UDI_MA_BeginEnumeration(inst); + UDI_MA_CreateInstance(driver_module, NULL, NULL); } else { @@ -770,15 +792,15 @@ udi_ops_init_t *UDI_int_GetOps(tUDI_DriverInstance *Inst, udi_index_t index) return ops; } -tUDI_MetaLang *UDI_int_GetMetaLang(tUDI_DriverInstance *Inst, udi_index_t index) +tUDI_MetaLang *UDI_int_GetMetaLang(tUDI_DriverModule *Module, udi_index_t index) { if( index == 0 ) return &cMetaLang_Management; - ASSERT(Inst); - for( int i = 0; i < Inst->Module->nMetaLangs; i ++ ) + ASSERT(Module); + for( int i = 0; i < Module->nMetaLangs; i ++ ) { - if( Inst->Module->MetaLangs[i].meta_idx == index ) - return Inst->Module->MetaLangs[i].metalang; + if( Module->MetaLangs[i].meta_idx == index ) + return Module->MetaLangs[i].metalang; } return NULL; } @@ -787,8 +809,12 @@ const tUDI_MetaLang *UDI_int_GetMetaLangByName(const char *Name) { //extern tUDI_MetaLang cMetaLang_Management; extern tUDI_MetaLang cMetaLang_BusBridge; + extern tUDI_MetaLang cMetaLang_GIO; + extern tUDI_MetaLang cMetaLang_NIC; const tUDI_MetaLang *langs[] = { &cMetaLang_BusBridge, + &cMetaLang_GIO, + &cMetaLang_NIC, NULL }; for( int i = 0; langs[i]; i ++ )