I am having troubles getting things to post. Sorry if this is a dup AGAIN!

Has anyone tested the PIRQ table generator for the dbm690t?

I was running a minimal kernel ACPI off and IO_APIC off, and my interrupts
were not being assigned. The kernel found the PIRQ table, but that is all it
did.

The PIRQ table being generated by the dbm690t, seems pretty simplistic
compared to the table I pulled from my BIOS. The one I pulled from my BIOS
is reported as having a CRC error when I try to use it. Something seems
fishy.

The mpTable looks very similar to the one I pulled from my BIOS as I
expected it would. When my kernel is configured to use the mpTable, I am
able to get to a prompt. Interrupts are assigned WAY different when I use
the mptable generated from my BIOS, but they still work. I can find no
relation between the table and what interrupt is actually assigned.

ACPI seems to assign incorrect interrupts at random. Is it possible to dump
an ACPI table and reuse it?

I am able to boot all 3 ways with the original BIOS.

I have attached the mptable.c and irq_tables.c from the SOM-5781 690/600
board I have been working on.

Thanks
Dan Lykowski
/* This file was generated by getpir.c, do not modify!
 * (but if you do, please run checkpir on it to verify)
 *
 * Contains the IRQ Routing Table dumped directly from your
 * memory, which BIOS sets up.
 *
 * Documentation at: http://www.microsoft.com/whdc/archive/pciirq.mspx
 */

#ifdef GETPIR
#include "pirq_routing.h"
#else
#include <arch/pirq_routing.h>
#endif

const struct irq_routing_table intel_irq_routing_table = {
	PIRQ_SIGNATURE,  /* u32 signature */
	PIRQ_VERSION,    /* u16 version   */
	32+16*15,	 /* There can be total 15 devices on the bus */
	0x00,		 /* Where the interrupt router lies (bus) */
	(0x00<<3)|0x0,   /* Where the interrupt router lies (dev) */
	0xc20,		 /* IRQs devoted exclusively to PCI usage */
	0,		 /* Vendor */
	0,		 /* Device */
	0,		 /* Miniport */
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* u8 rfu[11] */
	0x32,		 /* u8 checksum. This has to be set to some
			    value that would give 0 after the sum of all
			    bytes for this structure (including checksum) */
	{
		/* bus,     dev|fn,   {link, bitmap}, {link, bitmap}, {link, bitmap}, {link, bitmap},  slot, rfu */
		{0x00,(0x02<<3)|0x0, {{0x03, 0xdcb8}, {0x03, 0xdcb8}, {0x03, 0xdcb8}, {0x03, 0xdcb8}}, 0x1, 0x0},
		{0x00,(0x03<<3)|0x0, {{0x04, 0xdcb8}, {0x04, 0xdcb8}, {0x04, 0xdcb8}, {0x04, 0xdcb8}}, 0x2, 0x0},
		{0x00,(0x04<<3)|0x0, {{0x01, 0xdcb8}, {0x01, 0xdcb8}, {0x01, 0xdcb8}, {0x01, 0xdcb8}}, 0x3, 0x0},
		{0x00,(0x06<<3)|0x0, {{0x03, 0xdcb8}, {0x03, 0xdcb8}, {0x03, 0xdcb8}, {0x03, 0xdcb8}}, 0x4, 0x0},
		{0x00,(0x07<<3)|0x0, {{0x04, 0xdcb8}, {0x04, 0xdcb8}, {0x04, 0xdcb8}, {0x04, 0xdcb8}}, 0x5, 0x0},
		{0x00,(0x08<<3)|0x0, {{0x01, 0xdcb8}, {0x01, 0xdcb8}, {0x01, 0xdcb8}, {0x01, 0xdcb8}}, 0x6, 0x0},
		{0x01,(0x05<<3)|0x0, {{0x03, 0xdcb8}, {0x04, 0xdcb8}, {0x01, 0xdcb8}, {0x02, 0xdcb8}}, 0x7, 0x0},
		{0x04,(0x04<<3)|0x0, {{0x05, 0xdcb8}, {0x05, 0xdcb8}, {0x05, 0xdcb8}, {0x05, 0xdcb8}}, 0x8, 0x0},
		{0x04,(0x05<<3)|0x0, {{0x06, 0xdcb8}, {0x07, 0xdcb8}, {0x08, 0xdcb8}, {0x05, 0xdcb8}}, 0x9, 0x0},
		{0x04,(0x06<<3)|0x0, {{0x07, 0xdcb8}, {0x08, 0xdcb8}, {0x05, 0xdcb8}, {0x06, 0xdcb8}}, 0xa, 0x0},
		{0x04,(0x07<<3)|0x0, {{0x08, 0xdcb8}, {0x05, 0xdcb8}, {0x06, 0xdcb8}, {0x07, 0xdcb8}}, 0xb, 0x0},
		{0x00,(0x01<<3)|0x0, {{0x03, 0xdcb8}, {0x04, 0xdcb8}, {0x01, 0xdcb8}, {0x02, 0xdcb8}}, 0x0, 0x0},
		{0x00,(0x13<<3)|0x0, {{0x01, 0xdcb8}, {0x02, 0xdcb8}, {0x03, 0xdcb8}, {0x04, 0xdcb8}}, 0x0, 0x0},
		{0x00,(0x12<<3)|0x0, {{0x07, 0xdcb8}, {0x07, 0xdcb8}, {0x07, 0xdcb8}, {0x07, 0xdcb8}}, 0x0, 0x0},
		{0x00,(0x14<<3)|0x0, {{0x01, 0xdcb8}, {0x02, 0xdcb8}, {0x03, 0xdcb8}, {0x04, 0xdcb8}}, 0x0, 0x0},
	}
};

unsigned long write_pirq_routing_table(unsigned long addr)
{
	return copy_pirq_routing_table(addr);
}
/* generated by MPTable, version 2.0.15*/
/* as modified by RGM for coreboot */
#include <console/console.h>
#include <arch/smp/mpspec.h>
#include <device/pci.h>
#include <string.h>
#include <stdint.h>

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;

        smp_write_processors(mc);


/*Bus:		Bus ID	Type*/
	smp_write_bus(mc, 0, "PCI   ");
	smp_write_bus(mc, 1, "PCI   ");
	smp_write_bus(mc, 2, "PCI   ");
	smp_write_bus(mc, 3, "PCI   ");
	smp_write_bus(mc, 4, "PCI   ");
	smp_write_bus(mc, 5, "ISA   ");
/*I/O APICs:	APIC ID	Version	State		Address*/
	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);
			}
                }
	}
/*I/O Ints:	Type	Polarity    Trigger	Bus ID	 IRQ	APIC ID	PIN#
*/	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, 0x0, 0x4c, 0x2, 0x10);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, 0x0, 0x4d, 0x2, 0x11);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, 0x0, 0x4e, 0x2, 0x12);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, 0x0, 0x4d, 0x2, 0x11);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, 0x0, 0x4e, 0x2, 0x12);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, 0x0, 0x4f, 0x2, 0x13);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, 0x0, 0x50, 0x2, 0x10);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, 0x1, 0x15, 0x2, 0x13);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, 0x1, 0x14, 0x2, 0x12);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, 0x3, 0x0, 0x2, 0x13);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, 0x2, 0x0, 0x2, 0x10);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_LEVEL|MP_IRQ_POLARITY_LOW, 0x0, 0x48, 0x2, 0x16);
	smp_write_intsrc(mc, mp_ExtINT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x5, 0x0, 0x2, 0x0);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x5, 0x1, 0x2, 0x1);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x5, 0x0, 0x2, 0x2);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x5, 0x3, 0x2, 0x3);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x5, 0x4, 0x2, 0x4);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x5, 0x6, 0x2, 0x6);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x5, 0x7, 0x2, 0x7);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, 0x5, 0x8, 0x2, 0x8);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x5, 0x9, 0x2, 0x9);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x5, 0xc, 0x2, 0xc);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x5, 0xd, 0x2, 0xd);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x5, 0xe, 0x2, 0xe);
	smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x5, 0xf, 0x2, 0xf);
/*Local Ints:	Type	Polarity    Trigger	Bus ID	 IRQ	APIC ID	PIN#*/
	smp_write_intsrc(mc, mp_ExtINT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x0, 0x0, MP_APIC_ALL, 0x0);
	smp_write_intsrc(mc, mp_NMI, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT, 0x0, 0x0, MP_APIC_ALL, 0x1);
	/* There is no extension information... */

	/* 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",
		mc, smp_next_mpe_entry(mc));
	return smp_next_mpe_entry(mc);
}

unsigned long write_smp_table(unsigned long addr)
{
	void *v;
	v = smp_write_floating_table(addr);
	return (unsigned long)smp_write_config_table(v);
}
--
coreboot mailing list: coreboot@coreboot.org
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to