/*
* Acess2 UDI Layer
+ * - By John Hodge (thePowersGang)
+ *
+ * main.c
+ * - UDI Entrypoint and Module loading
*/
#define DEBUG 1
#define VERSION ((0<<8)|1)
#include <acess.h>
#include <modules.h>
#include <udi.h>
-#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 <udi_internal.h>
+#include <udi_internal_ma.h>
+#include <trans_pci.h>
+#include <trans_nsr.h>
+#include <trans_uart.h>
// === 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 ===
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;
}
};
#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);
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;
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;
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++];
// 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);
}
}
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
// 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
{
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 ++ )
- {
- if( Inst->Module->MetaLangs[i].meta_idx == index )
- return Inst->Module->MetaLangs[i].metalang;
- }
- return NULL;
-}
-
-void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel)
-{
- const udi_cb_init_t *cb_init;
- LOG("Inst=%p, bind_cb_idx=%i, channel=%p", Inst, bind_cb_idx, channel);
- if(Inst) {
- ASSERT(Inst->Module);
- ASSERT(Inst->Module->InitInfo);
- ASSERT(Inst->Module->InitInfo->cb_init_list);
- }
- cb_init = Inst ? Inst->Module->InitInfo->cb_init_list : cUDI_MgmtCbInitList;
- for( ; cb_init->cb_idx; cb_init ++ )
+ ASSERT(Module);
+ for( int i = 0; i < Module->nMetaLangs; i ++ )
{
- if( cb_init->cb_idx == bind_cb_idx )
- {
- // TODO: Get base size using meta/cbnum
- tUDI_MetaLang *metalang = UDI_int_GetMetaLang(Inst, cb_init->meta_idx);
- if( !metalang ) {
- Log_Warning("UDI", "Metalang referenced in %s CB %i is invalid (%i)",
- Inst->Module->ModuleName, bind_cb_idx, cb_init->meta_idx);
- return NULL;
- }
- ASSERTC(cb_init->meta_cb_num, <, metalang->nCbTypes);
- size_t base = metalang->CbTypes[cb_init->meta_cb_num].Size;
- ASSERTC(base, >=, sizeof(udi_cb_t));
- base -= sizeof(udi_cb_t);
- LOG("+ %i + %i + %i", base, cb_init->inline_size, cb_init->scratch_requirement);
- udi_cb_t *ret = NEW(udi_cb_t, + base
- + cb_init->inline_size + cb_init->scratch_requirement);
- ret->channel = channel;
- return ret;
- }
+ if( Module->MetaLangs[i].meta_idx == index )
+ return Module->MetaLangs[i].metalang;
}
- Log_Warning("UDI", "Cannot find CB init def %i for '%s'",
- bind_cb_idx, Inst->Module->ModuleName);
return NULL;
-
}
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 ++ )