On PC-98, map IRQ 6 to IRQ 7 at the pcic level. That is, when we're

told to use IRQ 6, progam the pcic to use irq 7 instead.  Evidentally,
at least some of the cards are wired this way.  If you want to use irq
6, configure it.  All the mapping is done just before we set the
interrupt registers.  See [FreeBSD98-testers 5064] for details.

Added commentary about valid interrupts on some CBUS pc98 CL PD6722
based cards.

Submitted by: Hiroshi TSUKADA-san <hiroshi@kiwi.ne.jp>
This commit is contained in:
imp 2001-06-16 06:18:16 +00:00
parent b08196841e
commit 2819707a6c
3 changed files with 17 additions and 4 deletions

View File

@ -267,11 +267,11 @@
*
* For NEC PC98 machines, irq 3, 5, 6, 9, 10, 11, 12, 13 are allowed.
* These correspond to the C-BUS signals INT 0, 1, 2, 3, 41, 42, 5, 6
* respectively. This is with the desktop C-BUS addin card. I don't
* know if this corresponds to laptop usage or not.
* respectively. This is with the desktop C-BUS addin card.
*
* I'm not sure the proper way to map these interrupts, but it looks
* like pc98 is a subset of ibm-at so no actual mapping is required.
* Hiroshi TSUKADA-san writes in FreeBSD98-testers that cbus IRQ
* 6 is routed to the IRQ 7 pin of the pcic in pc98 cbus based
* cards. I do not know how pc98 laptop models are wired.
*/
#ifdef PC98
#define PCIC_INT_MASK_ALLOWED 0x3E68 /* PC98 */

View File

@ -129,6 +129,16 @@ pcic_putw(struct pcic_slot *sp, int reg, unsigned short word)
sp->putb(sp, reg + 1, (word >> 8) & 0xff);
}
static __inline int
host_irq_to_pcic(int irq)
{
#ifdef PC98
if (irq == 6)
irq = 7;
#endif
return (irq);
}
/*
* Free up resources allocated so far.
*/
@ -284,6 +294,7 @@ pcic_do_mgt_irq(struct pcic_slot *sp, int irq)
} else {
/* Management IRQ changes */
pcic_clrb(sp, PCIC_INT_GEN, PCIC_INTR_ENA);
irq = host_irq_to_pcic(irq);
sp->putb(sp, PCIC_STAT_INT, (irq << 4) | 0x8);
}
}
@ -509,6 +520,7 @@ pcic_mapirq(struct slot *slt, int irq)
struct pcic_slot *sp = slt->cdata;
if (sp->sc->csc_route == pci_parallel)
return;
irq = host_irq_to_pcic(irq);
if (irq == 0)
pcic_clrb(sp, PCIC_INT_GEN, 0xF);
else

View File

@ -51,6 +51,7 @@ static struct isa_pnp_id pcic_ids[] = {
{PCIC_PNP_82365_CARDBUS, NULL}, /* PNP0E03 */
{PCIC_PNP_SCM_SWAPBOX, NULL}, /* SCM0469 */
{PCIC_NEC_PC9801_102, NULL}, /* NEC8091 */
{PCIC_NEC_PC9821RA_E01, NULL}, /* NEC8121 */
{0}
};