int verbose = 0;
int noisy = 0;
/* preamble to the mptable. This is fixed for all coreboots */
-
+
char *preamble[] = {
"#include <console/console.h>",
"#include <arch/smp/mpspec.h>",
+"#include <arch/ioapic.h>",
"#include <device/pci.h>",
"#include <string.h>",
"#include <stdint.h>",
"",
"static void *smp_write_config_table(void *v)",
"{",
-" static const char sig[4] = \"PCMP\";",
-" static const char oem[8] = \"LNXI \";",
-" static const char productid[12] = \"P4DPE \";",
" struct mp_config_table *mc;",
"",
" mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);",
-" memset(mc, 0, sizeof(*mc));",
"",
-" memcpy(mc->mpc_signature, sig, sizeof(sig));",
-" mc->mpc_length = sizeof(*mc); /* initially just the header */",
-" mc->mpc_spec = 0x04;",
-" mc->mpc_checksum = 0; /* not yet computed */",
-" memcpy(mc->mpc_oem, oem, sizeof(oem));",
-" memcpy(mc->mpc_productid, productid, sizeof(productid));",
-" mc->mpc_oemptr = 0;",
-" mc->mpc_oemsize = 0;",
-" mc->mpc_entry_count = 0; /* No entries yet... */",
-" mc->mpc_lapic = LAPIC_ADDR;",
-" mc->mpe_length = 0;",
-" mc->mpe_checksum = 0;",
-" mc->reserved = 0;",
+" mptable_init(mc, \"TODO \", LAPIC_ADDR);",
"",
" smp_write_processors(mc);",
"",
};
char *postamble[] = {
-" /* There is no extension information... */",
-"",
-" /* Compute the checksums */",
+" /* Compute the checksums. */",
" mc->mpe_checksum = smp_compute_checksum(smp_next_mpc_entry(mc), mc->mpe_length);",
" mc->mpc_checksum = smp_compute_checksum(mc, mc->mpc_length);",
" printk(BIOS_DEBUG, \"Wrote the mp table end at: %p - %p\\n\",",
};
char *ioapic_code[] = {
-" smp_write_ioapic(mc, 2, 0x20, 0xfec00000);",
-" {",
-" device_t dev;",
-" struct resource *res;",
-" dev = dev_find_slot(1, PCI_DEVFN(0x1e,0));",
-" if (dev) {",
-" res = find_resource(dev, PCI_BASE_ADDRESS_0);",
-" if (res) {",
-" smp_write_ioapic(mc, 3, 0x20, res->base);",
-" }",
-" }",
-" dev = dev_find_slot(1, PCI_DEVFN(0x1c,0));",
-" if (dev) {",
-" res = find_resource(dev, PCI_BASE_ADDRESS_0);",
-" if (res) {",
-" smp_write_ioapic(mc, 4, 0x20, res->base);",
-" }",
-" }",
-" dev = dev_find_slot(4, PCI_DEVFN(0x1e,0));",
-" if (dev) {",
-" res = find_resource(dev, PCI_BASE_ADDRESS_0);",
-" if (res) {",
-" smp_write_ioapic(mc, 5, 0x20, res->base);",
-" }",
-" }",
-" dev = dev_find_slot(4, PCI_DEVFN(0x1c,0));",
-" if (dev) {",
-" res = find_resource(dev, PCI_BASE_ADDRESS_0);",
-" if (res) {",
-" smp_write_ioapic(mc, 8, 0x20, res->base);",
-" }",
-" }",
-" }",
+" smp_write_ioapic(mc, 2, 0x20, IO_APIC_ADDR);",
+" /* TODO: If you have multiple IOAPICs, add them here. */",
0
};
static void
printf("%s\n", *code++);
}
/*
- *
+ *
*/
int
main( int argc, char *argv[] )
int defaultConfig;
/* announce ourselves */
-
+
if (verbose) puts( SEP_LINE2 );
printf( "/* generated by MPTable, version %d.%d.%d*/\n", VMAJOR, VMINOR, VDELTA );
for(argc--, argv++; argc; argc--, argv++){
if ( strcmp( argv[0], "-dmesg") == 0 ) {
dmesg = 1;
- } else
+ } else
if ( strcmp( argv[0], "-help") == 0 )
{
usage();
/*
- *
+ *
*/
static void
MPFloatingPointer( vm_offset_t paddr, int where, mpfps_t* mpfps )
/*
- *
+ *
*/
static void
MPConfigDefault( int featureByte )
/*
- *
+ *
*/
static void
MPConfigTableHeader( uint32_t pap )
/*
- *
+ *
*/
static int
readType( void )
/*
- *
+ *
*/
static void
seekEntry( vm_offset_t addr )
/*
- *
+ *
*/
static void
readEntry( void* entry, int size )
/*
- *
+ *
*/
static int
lookupBusType( char* name )
apics[ entry.apicID ] = entry.apicID;
// the numbering and setup of ioapics is so irrational
- // that for now we will punt.
+ // that for now we will punt.
#if 0
if (entry.apicFlags & IOAPICENTRY_FLAG_EN)
printf("\tsmp_write_ioapic(mc, 0x%x, 0x%x, 0x%x);\n",
entry.apicID, entry.apicVersion, entry.apicAddress);
#endif
-
+
}
printf( "\t %5d", (int)entry.srcBusID );
if ( busses[ (int)entry.srcBusID ] == PCI )
- printf( "\t%2d:%c",
+ printf( "\t%2d:%c",
((int)entry.srcBusIRQ >> 2) & 0x1f,
((int)entry.srcBusIRQ & 0x03) + 'A' );
else
- printf( "\t 0x%x:0x%x(0x%x)",
+ printf( "\t 0x%x:0x%x(0x%x)",
(int)entry.srcBusIRQ>>2,
(int)entry.srcBusIRQ & 3,
(int)entry.srcBusIRQ );
(int)entry.srcBusIRQ,
(int)entry.dstApicID ,
(int)entry.dstApicINT );
-
+
}
static void
printf( "\t %5d", (int)entry.srcBusID );
if ( busses[ (int)entry.srcBusID ] == PCI )
- printf( "\t%2d:%c",
+ printf( "\t%2d:%c",
((int)entry.srcBusIRQ >> 2) & 0x1f,
((int)entry.srcBusIRQ & 0x03) + 'A' );
else
printf( "\t %6d", (int)entry.dstApicID );
printf( "\t %3d\n", (int)entry.dstApicINT );
}
- printf("\tsmp_write_intsrc(mc, %s, %s|%s, 0x%x, 0x%x, MP_APIC_ALL, 0x%x);\n",
+ printf("\tsmp_write_lintsrc(mc, %s, %s|%s, 0x%x, 0x%x, MP_APIC_ALL, 0x%x);\n",
intTypes[ (int)entry.intType ],
triggerMode[ ((int)entry.intFlags >> 2) & 0x03 ] ,
polarityMode[ (int)entry.intFlags & 0x03 ],
(int)entry.srcBusID,
(int)entry.srcBusIRQ,
(int)entry.dstApicINT );
-
+
}
/*
- *
+ *
*/
static void
pnstr( uint8_t* s, int c )