/* ------------ IOMD Handling ------------ */ typedef struct iomd_details { uint8_t lowid; uint8_t highid; }; typedef enum { IOMDModel_RPCIOMD, IOMDModel_ARM7500, IOMDModel_ARM7500FE } IOMDModel; iomd_details iomds[] = { { 0xe7, 0xd4 }, { 0x98, 0x5b }, { 0x7c, 0xaa } }; /* ------------ Processor Handling ------------ */ typedef enum { ARMArchitecture_ARMv3, ARMArchitecture_ARMv4 } ARMArchitecture; typdef enum { AbortModel_ARMv3_Early, AbortModel_ARMv3_Late, AbortModel_ARMv4 } AbortModel; typedef enum { CPUModel_ARM610, CPUModel_ARM710, CPUModel_SA110, CPUModel_ARM7500, CPUModel_ARM7500FE, CPUModel_ARM810 } CPUModel; typedef struct processor_details { ARMArchitecture arm_arch; AbortModel initial_abort_model uint32_t id; uint32_t r15diff; uint32_t cp15mask_on; unit32_t cp15mask_off; }; processor_details processors[] = { { ARMArchitecture_ARMv3, AbortModel_ARMv3_Early, 0x41560610, 4, 0, 0 }, { ARMArchitecture_ARMv3, AbortModel_ARMv3_Late , 0x41007100, 4, 0, 0 }, { ARMArchitecture_ARMv4, AbortModel_ARMv4 , 0x4401a102, 0, 0, 0 }, { ARMArchitecture_ARMv3, AbortModel_ARMv3_Late , 0x41027100, 4, 0, 0 }, { ARMArchitecture_ARMv3, AbortModel_ARMv3_Late , 0x41077100, 4, 0, 0 }, { ARMArchitecture_ARMv4, AbortModel_ARMv4 , 0x41018100, 0, 0, 0 }, }; /* ------------ Model Handling ------------ */ typdef struct model_details { char *name; processor_details *processor; iomd_details *iomd; } model_details models[] = { { "Risc PC - ARM610", &processor_details[CPUModel_ARM610], &iomd_details[IOMDModel_RPCIOMD]}, { "Risc PC - ARM710", &processor_details[CPUModel_ARM710], &iomd_details[IOMDModel_RPCIOMD]}, { "Risc PC - StrongARM", &processor_details[CPUModel_SA110], &iomd_details[IOMDModel_RPCIOMD]}, { "A7000", &processor_details[CPUModel_ARM7500], &iomd_details[IOMDModel_ARM7500]}, { "A7000+", &processor_details[CPUModel_ARM7500FE], &iomd_details[IOMDModel_ARM7500FE]}, { "Risc PC - ARM810", &processor_details[CPUModel_ARM810], &iomd_details[IOMDModel_RPCIOMD]} }; /* Examples in use */ return models[config.model]->processor.id; /* in CP 15 */ return models[config.model]->iomd.lowid; /* in IOMD read */ switch(models[config.model]->processor.initial_abort_model) { case AbortModel_ARMv3_Late: /* Insert clever abort stuff here */ }