From: Sepherosa Ziehau Date: Thu, 17 Mar 2011 05:37:43 +0000 (+0800) Subject: mptable: Get pin count of I/O APIC and calculate GSI base accordingly X-Git-Tag: v2.11.0~241 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/0471bb0eba914cb2acede25ee3638621e3aa7264 mptable: Get pin count of I/O APIC and calculate GSI base accordingly --- diff --git a/sys/platform/pc32/apic/mpapic.c b/sys/platform/pc32/apic/mpapic.c index 57fce94e51..83906b4e98 100644 --- a/sys/platform/pc32/apic/mpapic.c +++ b/sys/platform/pc32/apic/mpapic.c @@ -1069,6 +1069,9 @@ ioapic_config(void) } e->ioapic_enumerate(e); + + if (!ioapic_use_old) + panic("ioapic_config: new ioapic not working yet\n"); } void diff --git a/sys/platform/pc32/i386/mp_machdep.c b/sys/platform/pc32/i386/mp_machdep.c index 905969294e..aa229330e5 100644 --- a/sys/platform/pc32/i386/mp_machdep.c +++ b/sys/platform/pc32/i386/mp_machdep.c @@ -199,6 +199,8 @@ struct mptable_ioapic { int mio_idx; int mio_apic_id; uint32_t mio_addr; + int mio_gsi_base; + int mio_npin; TAILQ_ENTRY(mptable_ioapic) mio_link; }; @@ -3602,7 +3604,7 @@ static void mptable_ioapic_enumerate(struct ioapic_enumerator *e) { struct mptable_bus_info bus_info; - const struct mptable_ioapic *ioapic; + struct mptable_ioapic *ioapic; struct mptable_pos mpt; mpcth_t cth; int error; @@ -3611,13 +3613,37 @@ mptable_ioapic_enumerate(struct ioapic_enumerator *e) KKASSERT(!TAILQ_EMPTY(&mptable_ioapic_list)); TAILQ_FOREACH(ioapic, &mptable_ioapic_list, mio_link) { + if (!ioapic_use_old) { + const struct mptable_ioapic *prev_ioapic; + uint32_t ver; + void *addr; + + addr = ioapic_map(ioapic->mio_addr); + + ver = ioapic_read(addr, IOAPIC_VER); + ioapic->mio_npin = ((ver & IOART_VER_MAXREDIR) + >> MAXREDIRSHIFT) + 1; + + prev_ioapic = TAILQ_PREV(ioapic, + mptable_ioapic_list, mio_link); + if (prev_ioapic == NULL) { + ioapic->mio_gsi_base = 0; + } else { + ioapic->mio_gsi_base = + prev_ioapic->mio_gsi_base + + prev_ioapic->mio_npin; + } + /* TODO */ + } if (bootverbose) { kprintf("MPTABLE: IOAPIC addr 0x%08x, " - "apic id %d, idx %d\n", + "apic id %d, idx %d, gsi base %d, npin %d\n", ioapic->mio_addr, - ioapic->mio_apic_id, ioapic->mio_idx); + ioapic->mio_apic_id, + ioapic->mio_idx, + ioapic->mio_gsi_base, + ioapic->mio_npin); } - /* TODO */ } if (mptable_use_default) { diff --git a/sys/platform/pc64/apic/mpapic.c b/sys/platform/pc64/apic/mpapic.c index a32b987fe5..7ea67207a8 100644 --- a/sys/platform/pc64/apic/mpapic.c +++ b/sys/platform/pc64/apic/mpapic.c @@ -1132,6 +1132,9 @@ ioapic_config(void) } e->ioapic_enumerate(e); + + if (!ioapic_use_old) + panic("ioapic_config: new ioapic not working yet\n"); } void diff --git a/sys/platform/pc64/x86_64/mp_machdep.c b/sys/platform/pc64/x86_64/mp_machdep.c index 0fe0b0afa1..05ed6c2d9e 100644 --- a/sys/platform/pc64/x86_64/mp_machdep.c +++ b/sys/platform/pc64/x86_64/mp_machdep.c @@ -198,6 +198,8 @@ struct mptable_ioapic { int mio_idx; int mio_apic_id; uint32_t mio_addr; + int mio_gsi_base; + int mio_npin; TAILQ_ENTRY(mptable_ioapic) mio_link; }; @@ -3597,7 +3599,7 @@ static void mptable_ioapic_enumerate(struct ioapic_enumerator *e) { struct mptable_bus_info bus_info; - const struct mptable_ioapic *ioapic; + struct mptable_ioapic *ioapic; struct mptable_pos mpt; mpcth_t cth; int error; @@ -3606,13 +3608,37 @@ mptable_ioapic_enumerate(struct ioapic_enumerator *e) KKASSERT(!TAILQ_EMPTY(&mptable_ioapic_list)); TAILQ_FOREACH(ioapic, &mptable_ioapic_list, mio_link) { + if (!ioapic_use_old) { + const struct mptable_ioapic *prev_ioapic; + uint32_t ver; + void *addr; + + addr = ioapic_map(ioapic->mio_addr); + + ver = ioapic_read(addr, IOAPIC_VER); + ioapic->mio_npin = ((ver & IOART_VER_MAXREDIR) + >> MAXREDIRSHIFT) + 1; + + prev_ioapic = TAILQ_PREV(ioapic, + mptable_ioapic_list, mio_link); + if (prev_ioapic == NULL) { + ioapic->mio_gsi_base = 0; + } else { + ioapic->mio_gsi_base = + prev_ioapic->mio_gsi_base + + prev_ioapic->mio_npin; + } + /* TODO */ + } if (bootverbose) { kprintf("MPTABLE: IOAPIC addr 0x%08x, " - "apic id %d, idx %d\n", + "apic id %d, idx %d, gsi base %d, npin %d\n", ioapic->mio_addr, - ioapic->mio_apic_id, ioapic->mio_idx); + ioapic->mio_apic_id, + ioapic->mio_idx, + ioapic->mio_gsi_base, + ioapic->mio_npin); } - /* TODO */ } if (mptable_use_default) {