54 int new_isa_assert, x;
58 if (d->pic2->irr & ~d->pic2->ier)
61 d->pic1->irr &= ~0x04;
66 new_isa_assert = d->pic1->irr & ~d->pic1->ier;
68 if (old_isa_assert == new_isa_assert)
71 if (!new_isa_assert) {
76 for (x=0; x<16; x++) {
80 if (x < 8 && (d->pic1->irr & ~d->pic1->ier & (1 << x)))
83 if (x >= 8 && (d->pic2->irr & ~d->pic2->ier & (1 << (x&7))))
87 *d->ptr_to_last_int = x;
100 struct bus_isa_data *d = (
struct bus_isa_data *)
interrupt->
extra;
102 int mask = 1 << (line & 7);
104 old_isa_assert = d->pic1->irr & ~d->pic1->ier;
107 d->pic1->irr |= mask;
108 else if (d->pic2 != NULL)
109 d->pic2->irr |= mask;
122 struct bus_isa_data *d = (
struct bus_isa_data *)
interrupt->
extra;
124 int old_irr1 = d->pic1->irr, old_isa_assert;
126 old_isa_assert = old_irr1 & ~d->pic1->ier;
129 d->pic1->irr &= ~mask;
130 else if (d->pic2 != NULL)
131 d->pic2->irr &= ~mask;
135 if (old_irr1 & 1 && !(d->pic1->irr & 1) &&
136 d->ptr_to_pending_timer_interrupts != NULL &&
137 (*d->ptr_to_pending_timer_interrupts) > 0)
138 (*d->ptr_to_pending_timer_interrupts) --;
175 char *interrupt_base_path, uint32_t bus_isa_flags,
176 uint64_t isa_portbase, uint64_t isa_membase)
178 struct bus_isa_data *d;
179 char tmpstr[300], tmpstr2[300];
180 int wdc0_irq = 14, wdc1_irq = 15;
181 int i, tmp_handle, kbd_in_use;
184 CHECK_ALLOCATION(d = (
struct bus_isa_data *) malloc(
sizeof(
struct bus_isa_data)));
185 memset(d, 0,
sizeof(
struct bus_isa_data));
187 d->isa_portbase = isa_portbase;
188 d->isa_membase = isa_membase;
196 for (i=0; i<16; i++) {
200 "%s.isa.%i", interrupt_base_path, i);
201 memset(&templ, 0,
sizeof(templ));
216 wdc0_irq = wdc1_irq = 13;
220 snprintf(tmpstr,
sizeof(tmpstr),
"8259 irq=%s addr=0x%llx",
221 interrupt_base_path, (
long long)(isa_portbase + 0x20));
224 d->ptr_to_pending_timer_interrupts =
231 snprintf(tmpstr,
sizeof(tmpstr),
232 "8259 irq=%s.isa.2 addr=0x%llx",
233 interrupt_base_path,(
long long)(isa_portbase+0xa0));
241 snprintf(tmpstr,
sizeof(tmpstr),
"8253 irq=%s.isa.%i addr=0x%llx "
242 "in_use=0", interrupt_base_path, 0,
243 (
long long)(isa_portbase + 0x40));
246 snprintf(tmpstr,
sizeof(tmpstr),
"pccmos irq=%s.isa.%i addr=0x%llx",
247 interrupt_base_path, 8, (
long long)(isa_portbase + 0x70));
250 snprintf(tmpstr,
sizeof(tmpstr),
"ns16550 irq=%s.isa.%i addr=0x%llx "
251 "name2=tty0 in_use=%i", interrupt_base_path, 4,
252 (
long long)(isa_portbase + 0x3f8), 1 - kbd_in_use);
255 snprintf(tmpstr,
sizeof(tmpstr),
"ns16550 irq=%s.isa.%i addr=0x%llx "
256 "name2=tty1 in_use=0", interrupt_base_path, 3,
257 (
long long)(isa_portbase + 0x2f8));
265 snprintf(tmpstr,
sizeof(tmpstr),
"lpt irq=%s.isa.%i addr=0x%llx "
266 "name2=lpt in_use=0", interrupt_base_path, 7,
267 (
long long)(isa_portbase + lptbase));
272 snprintf(tmpstr,
sizeof(tmpstr),
"wdc irq=%s.isa.%i "
273 "addr=0x%llx", interrupt_base_path, wdc0_irq,
274 (
long long)(isa_portbase + 0x1f0));
282 snprintf(tmpstr,
sizeof(tmpstr),
"wdc irq=%s.isa.%i "
283 "addr=0x%llx", interrupt_base_path, wdc1_irq,
284 (
long long)(isa_portbase + 0x170));
292 snprintf(tmpstr,
sizeof(tmpstr),
"fdc irq=%s.isa.%i "
293 "addr=0x%llx", interrupt_base_path, 6,
294 (
long long)(isa_portbase + 0x3f0));
301 isa_membase + 0xa0000, isa_portbase + 0x3c0,
306 snprintf(tmpstr,
sizeof(tmpstr),
"%s.isa.1", interrupt_base_path);
307 snprintf(tmpstr2,
sizeof(tmpstr2),
"%s.isa.12", interrupt_base_path);
309 isa_portbase + 0x60,
PCKBC_8042, tmpstr, tmpstr2,
317 if (bus_isa_flags != 0)
318 fatal(
"WARNING! bus_isa(): unimplemented bus_isa_flags 0x%x\n",