* mptable.c
*/
-#ifndef lint
-static const char rcsid[] =
- "$Id$";
-#endif /* not lint */
-
#define VMAJOR 2
#define VMINOR 0
#define VDELTA 15
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <stdint.h>
#define SEP_LINE \
"\n-------------------------------------------------------------------------------\n"
#define MAXPNSTR 132
-#define LINUXBIOS_MP_TABLE 0
+#define COREBOOT_MP_TABLE 0
enum busTypes {
CBUS = 1,
};
typedef struct BUSTYPENAME {
- u_char type;
+ uint8_t type;
char name[ 7 ];
} busTypeName;
};
typedef struct TABLE_ENTRY {
- u_char type;
- u_char length;
+ uint8_t type;
+ uint8_t length;
char name[ 32 ];
} tableEntry;
/* MP Floating Pointer Structure */
typedef struct MPFPS {
- char signature[ 4 ];
- void* pap;
- u_char length;
- u_char spec_rev;
- u_char checksum;
- u_char mpfb1;
- u_char mpfb2;
- u_char mpfb3;
- u_char mpfb4;
- u_char mpfb5;
+ uint8_t signature[ 4 ];
+ uint32_t pap;
+ uint8_t length;
+ uint8_t spec_rev;
+ uint8_t checksum;
+ uint8_t mpfb1;
+ uint8_t mpfb2;
+ uint8_t mpfb3;
+ uint8_t mpfb4;
+ uint8_t mpfb5;
} mpfps_t;
/* MP Configuration Table Header */
typedef struct MPCTH {
- char signature[ 4 ];
- u_short base_table_length;
- u_char spec_rev;
- u_char checksum;
- u_char oem_id[ 8 ];
- u_char product_id[ 12 ];
- void* oem_table_pointer;
- u_short oem_table_size;
- u_short entry_count;
- void* apic_address;
- u_short extended_table_length;
- u_char extended_table_checksum;
- u_char reserved;
+ uint8_t signature[ 4 ];
+ uint16_t base_table_length;
+ uint8_t spec_rev;
+ uint8_t checksum;
+ uint8_t oem_id[ 8 ];
+ uint8_t product_id[ 12 ];
+ uint32_t oem_table_pointer;
+ uint16_t oem_table_size;
+ uint16_t entry_count;
+ uint32_t apic_address;
+ uint16_t extended_table_length;
+ uint8_t extended_table_checksum;
+ uint8_t reserved;
} mpcth_t;
typedef struct PROCENTRY {
- u_char type;
- u_char apicID;
- u_char apicVersion;
- u_char cpuFlags;
- u_long cpuSignature;
- u_long featureFlags;
- u_long reserved1;
- u_long reserved2;
+ uint8_t type;
+ uint8_t apicID;
+ uint8_t apicVersion;
+ uint8_t cpuFlags;
+ uint32_t cpuSignature;
+ uint32_t featureFlags;
+ uint32_t reserved1;
+ uint32_t reserved2;
} ProcEntry;
typedef struct BUSENTRY {
- u_char type;
- u_char busID;
- char busType[ 6 ];
+ uint8_t type;
+ uint8_t busID;
+ uint8_t busType[ 6 ];
} BusEntry;
typedef struct IOAPICENTRY {
- u_char type;
- u_char apicID;
- u_char apicVersion;
- u_char apicFlags;
- void* apicAddress;
+ uint8_t type;
+ uint8_t apicID;
+ uint8_t apicVersion;
+ uint8_t apicFlags;
+ uint32_t apicAddress;
} IOApicEntry;
typedef struct INTENTRY {
- u_char type;
- u_char intType;
- u_short intFlags;
- u_char srcBusID;
- u_char srcBusIRQ;
- u_char dstApicID;
- u_char dstApicINT;
+ uint8_t type;
+ uint8_t intType;
+ uint16_t intFlags;
+ uint8_t srcBusID;
+ uint8_t srcBusIRQ;
+ uint8_t dstApicID;
+ uint8_t dstApicINT;
} IntEntry;
*/
typedef struct SASENTRY {
- u_char type;
- u_char length;
- u_char busID;
- u_char addressType;
- u_int64_t addressBase;
- u_int64_t addressLength;
+ uint8_t type;
+ uint8_t length;
+ uint8_t busID;
+ uint8_t addressType;
+ uint64_t addressBase;
+ uint64_t addressLength;
} SasEntry;
typedef struct BHDENTRY {
- u_char type;
- u_char length;
- u_char busID;
- u_char busInfo;
- u_char busParent;
- u_char reserved[ 3 ];
+ uint8_t type;
+ uint8_t length;
+ uint8_t busID;
+ uint8_t busInfo;
+ uint8_t busParent;
+ uint8_t reserved[ 3 ];
} BhdEntry;
typedef struct CBASMENTRY {
- u_char type;
- u_char length;
- u_char busID;
- u_char addressMod;
- u_int predefinedRange;
+ uint8_t type;
+ uint8_t length;
+ uint8_t busID;
+ uint8_t addressMod;
+ uint32_t predefinedRange;
} CbasmEntry;
-typedef unsigned long vm_offset_t;
+typedef uint32_t vm_offset_t;
static void apic_probe( vm_offset_t* paddr, int* where );
static void MPConfigDefault( int featureByte );
static void MPFloatingPointer( vm_offset_t paddr, int where, mpfps_t* mpfps );
-static void MPConfigTableHeader( void* pap );
+static void MPConfigTableHeader( uint32_t pap );
static int readType( void );
static void seekEntry( vm_offset_t addr );
static void doOptionList( void );
static void doDmesg( void );
-static void pnstr( char* s, int c );
+static void pnstr( uint8_t* s, int c );
/* global data */
int pfd; /* physical /dev/mem fd */
int grope = 0;
int verbose = 0;
int noisy = 0;
-/* preamble to the mptable. This is fixed for all linuxbioses */
-
+/* 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 <printk.h>",
-"#include <pci.h>",
"#include <stdint.h>",
"",
-"void *smp_write_config_table(void *v, unsigned long * processor_map)",
+"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, processor_map);",
+" smp_write_processors(mc);",
"",
"",
0
};
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_debug(\"Wrote the mp table end at: %p - %p\\n\",",
+" printk(BIOS_DEBUG, \"Wrote the mp table end at: %p - %p\\n\",",
" mc, smp_next_mpe_entry(mc));",
" return smp_next_mpe_entry(mc);",
"}",
"",
-"unsigned long write_smp_table(unsigned long addr, unsigned long *processor_map)",
+"unsigned long write_smp_table(unsigned long addr)",
"{",
" void *v;",
" v = smp_write_floating_table(addr);",
-" return (unsigned long)smp_write_config_table(v, processor_map);",
+" return (unsigned long)smp_write_config_table(v);",
"}",
0
};
char *ioapic_code[] = {
-" smp_write_ioapic(mc, 2, 0x20, 0xfec00000);",
-" {",
-" struct pci_dev *dev;",
-" uint32_t base;",
-" dev = pci_find_slot(1, PCI_DEVFN(0x1e,0));",
-" if (dev) {",
-" pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &base);",
-" base &= PCI_BASE_ADDRESS_MEM_MASK;",
-" smp_write_ioapic(mc, 3, 0x20, base);",
-" }",
-" dev = pci_find_slot(1, PCI_DEVFN(0x1c,0));",
-" if (dev) {",
-" pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &base);",
-" base &= PCI_BASE_ADDRESS_MEM_MASK;",
-" smp_write_ioapic(mc, 4, 0x20, base);",
-" }",
-" dev = pci_find_slot(4, PCI_DEVFN(0x1e,0));",
-" if (dev) {",
-" pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &base);",
-" base &= PCI_BASE_ADDRESS_MEM_MASK;",
-" smp_write_ioapic(mc, 5, 0x20, base);",
-" }",
-" dev = pci_find_slot(4, PCI_DEVFN(0x1c,0));",
-" if (dev) {",
-" pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &base);",
-" base &= PCI_BASE_ADDRESS_MEM_MASK;",
-" smp_write_ioapic(mc, 8, 0x20, 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[] )
mpfps_t mpfps;
int defaultConfig;
- extern int optreset;
- int ch;
-
/* announce ourselves */
-
+
if (verbose) puts( SEP_LINE2 );
- printf( "/* generatred by MPTable, version %d.%d.%d*/\n", VMAJOR, VMINOR, VDELTA );
- printf("/* as modified by RGM for LinuxBIOS */\n");
+ printf( "/* generated by MPTable, version %d.%d.%d*/\n", VMAJOR, VMINOR, VDELTA );
+ printf("/* as modified by RGM for coreboot */\n");
write_code(preamble);
/* Ron hates getopt() */
for(argc--, argv++; argc; argc--, argv++){
- char *optarg = argv[0];
- if ( strcmp( optarg, "-dmesg") == 0 ) {
+ if ( strcmp( argv[0], "-dmesg") == 0 ) {
dmesg = 1;
- } else
- if ( strcmp( optarg, "-help") == 0 )
+ } else
+ if ( strcmp( argv[0], "-help") == 0 )
{
usage();
} else
- if ( strcmp( optarg, "-grope") == 0 ){
+ if ( strcmp( argv[0], "-grope") == 0 ){
grope = 1;
- } else if ( strcmp( optarg, "-verbose") == 0 )
+ } else if ( strcmp( argv[0], "-verbose") == 0 )
verbose = 1;
- else if ( strcmp( optarg, "-noisy") == 0 )
+ else if ( strcmp( argv[0], "-noisy") == 0 )
noisy = 1;
else usage();
}
target = 0;
segment = 0;
if ( verbose )
- printf( " searching for LinuxBIOS MP table @ 0x%08x (%dK)\n",
+ printf( " searching for coreboot MP table @ 0x%08x (%dK)\n",
target, segment );
seekEntry( target );
readEntry( buffer, ONE_KBYTE );
/*
- *
+ *
*/
static void
MPFloatingPointer( vm_offset_t paddr, int where, mpfps_t* mpfps )
/*
- *
+ *
*/
static void
MPConfigDefault( int featureByte )
/*
- *
+ *
*/
static void
-MPConfigTableHeader( void* pap )
+MPConfigTableHeader( uint32_t pap )
{
vm_offset_t paddr;
mpcth_t cth;
/*
- *
+ *
*/
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
-
+
}
};
char* polarityMode[] = {
- "conforms", "MP_IRQ_POLARITY_HIGH", "reserved", "MP_IRQ_POLARITY_LOW"
+ "MP_IRQ_POLARITY_DEFAULT", "MP_IRQ_POLARITY_HIGH", "reserved", "MP_IRQ_POLARITY_LOW"
};
char* triggerMode[] = {
- "conforms", "MP_IRQ_TRIGGER_EDGE", "reserved", "MP_IRQ_TRIGGER_LEVEL"
+ "MP_IRQ_TRIGGER_DEFAULT", "MP_IRQ_TRIGGER_EDGE", "reserved", "MP_IRQ_TRIGGER_LEVEL"
};
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 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 );
-
+
}
break;
}
- printf( " address base: 0x%qx\n", entry.addressBase );
- printf( " address range: 0x%qx\n", entry.addressLength );
+ printf( " address base: 0x%lx\n", entry.addressBase );
+ printf( " address range: 0x%lx\n", entry.addressLength );
}
/*
- *
+ *
*/
static void
-pnstr( char* s, int c )
+pnstr( uint8_t* s, int c )
{
- char string[ MAXPNSTR + 1 ];
+ uint8_t string[ MAXPNSTR + 1 ];
if ( c > MAXPNSTR )
c = MAXPNSTR;
- strncpy( string, s, c );
+ strncpy( (char *)string, (char *)s, c );
string[ c ] = '\0';
printf( "%s", string );
}