- Fix to build a native i386 kernel without the SMP and atpic.
- Merge r232744 changes to pc98. (Allow a kernel to be built with 'nodevice atpic'.) - Move ICU related defines from x86/isa/atpic.c to x86/isa/icu.h and use them in x86/x86/intr_machdep.c. Reviewed by: jhb
This commit is contained in:
parent
b827337ee6
commit
dff207f860
@ -226,7 +226,7 @@ pc98/cbus/gdc.c optional gdc
|
||||
pc98/cbus/nmi.c standard
|
||||
pc98/cbus/olpt.c optional olpt
|
||||
pc98/cbus/pckbd.c optional pckbd
|
||||
pc98/cbus/pcrtc.c optional atpic
|
||||
pc98/cbus/pcrtc.c standard
|
||||
pc98/cbus/pmc.c optional pmc
|
||||
pc98/cbus/scgdcrndr.c optional sc gdc
|
||||
pc98/cbus/scterm-sck.c optional sc
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_apic.h"
|
||||
#include "opt_atalk.h"
|
||||
#include "opt_atpic.h"
|
||||
#include "opt_compat.h"
|
||||
@ -136,6 +137,10 @@ __FBSDID("$FreeBSD$");
|
||||
#include <machine/smp.h>
|
||||
#endif
|
||||
|
||||
#ifdef DEV_APIC
|
||||
#include <machine/apicvar.h>
|
||||
#endif
|
||||
|
||||
#ifdef DEV_ISA
|
||||
#include <x86/isa/icu.h>
|
||||
#endif
|
||||
|
@ -40,7 +40,9 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_apic.h"
|
||||
#include "opt_atalk.h"
|
||||
#include "opt_atpic.h"
|
||||
#include "opt_compat.h"
|
||||
#include "opt_cpu.h"
|
||||
#include "opt_ddb.h"
|
||||
@ -132,6 +134,10 @@ __FBSDID("$FreeBSD$");
|
||||
#include <machine/smp.h>
|
||||
#endif
|
||||
|
||||
#ifdef DEV_APIC
|
||||
#include <machine/apicvar.h>
|
||||
#endif
|
||||
|
||||
#ifdef DEV_ISA
|
||||
#include <x86/isa/icu.h>
|
||||
#endif
|
||||
@ -2296,7 +2302,21 @@ init386(first)
|
||||
printf("WARNING: loader(8) metadata is missing!\n");
|
||||
|
||||
#ifdef DEV_ISA
|
||||
#ifdef DEV_ATPIC
|
||||
atpic_startup();
|
||||
#else
|
||||
/* Reset and mask the atpics and leave them shut down. */
|
||||
atpic_reset();
|
||||
|
||||
/*
|
||||
* Point the ICU spurious interrupt vectors at the APIC spurious
|
||||
* interrupt handler.
|
||||
*/
|
||||
setidt(IDT_IO_INTS + 7, IDTVEC(spuriousint), SDT_SYS386IGT, SEL_KPL,
|
||||
GSEL(GCODE_SEL, SEL_KPL));
|
||||
setidt(IDT_IO_INTS + 15, IDTVEC(spuriousint), SDT_SYS386IGT, SEL_KPL,
|
||||
GSEL(GCODE_SEL, SEL_KPL));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef DDB
|
||||
|
@ -72,48 +72,6 @@ __FBSDID("$FreeBSD$");
|
||||
#define MASTER 0
|
||||
#define SLAVE 1
|
||||
|
||||
/*
|
||||
* PC-98 machines wire the slave 8259A to pin 7 on the master PIC, and
|
||||
* PC-AT machines wire the slave PIC to pin 2 on the master PIC.
|
||||
*/
|
||||
#ifdef PC98
|
||||
#define ICU_SLAVEID 7
|
||||
#else
|
||||
#define ICU_SLAVEID 2
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Determine the base master and slave modes not including auto EOI support.
|
||||
* All machines that FreeBSD supports use 8086 mode.
|
||||
*/
|
||||
#ifdef PC98
|
||||
/*
|
||||
* PC-98 machines do not support auto EOI on the second PIC. Also, it
|
||||
* seems that PC-98 machine PICs use buffered mode, and the master PIC
|
||||
* uses special fully nested mode.
|
||||
*/
|
||||
#define BASE_MASTER_MODE (ICW4_SFNM | ICW4_BUF | ICW4_MS | ICW4_8086)
|
||||
#define BASE_SLAVE_MODE (ICW4_BUF | ICW4_8086)
|
||||
#else
|
||||
#define BASE_MASTER_MODE ICW4_8086
|
||||
#define BASE_SLAVE_MODE ICW4_8086
|
||||
#endif
|
||||
|
||||
/* Enable automatic EOI if requested. */
|
||||
#ifdef AUTO_EOI_1
|
||||
#define MASTER_MODE (BASE_MASTER_MODE | ICW4_AEOI)
|
||||
#else
|
||||
#define MASTER_MODE BASE_MASTER_MODE
|
||||
#endif
|
||||
#ifdef AUTO_EOI_2
|
||||
#define SLAVE_MODE (BASE_SLAVE_MODE | ICW4_AEOI)
|
||||
#else
|
||||
#define SLAVE_MODE BASE_SLAVE_MODE
|
||||
#endif
|
||||
|
||||
#define IRQ_MASK(irq) (1 << (irq))
|
||||
#define IMEN_MASK(ai) (IRQ_MASK((ai)->at_irq))
|
||||
|
||||
#define NUM_ISA_IRQS 16
|
||||
|
||||
static void atpic_init(void *dummy);
|
||||
|
@ -47,6 +47,48 @@
|
||||
#define ICU_IMR_OFFSET 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* PC-98 machines wire the slave 8259A to pin 7 on the master PIC, and
|
||||
* PC-AT machines wire the slave PIC to pin 2 on the master PIC.
|
||||
*/
|
||||
#ifdef PC98
|
||||
#define ICU_SLAVEID 7
|
||||
#else
|
||||
#define ICU_SLAVEID 2
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Determine the base master and slave modes not including auto EOI support.
|
||||
* All machines that FreeBSD supports use 8086 mode.
|
||||
*/
|
||||
#ifdef PC98
|
||||
/*
|
||||
* PC-98 machines do not support auto EOI on the second PIC. Also, it
|
||||
* seems that PC-98 machine PICs use buffered mode, and the master PIC
|
||||
* uses special fully nested mode.
|
||||
*/
|
||||
#define BASE_MASTER_MODE (ICW4_SFNM | ICW4_BUF | ICW4_MS | ICW4_8086)
|
||||
#define BASE_SLAVE_MODE (ICW4_BUF | ICW4_8086)
|
||||
#else
|
||||
#define BASE_MASTER_MODE ICW4_8086
|
||||
#define BASE_SLAVE_MODE ICW4_8086
|
||||
#endif
|
||||
|
||||
/* Enable automatic EOI if requested. */
|
||||
#ifdef AUTO_EOI_1
|
||||
#define MASTER_MODE (BASE_MASTER_MODE | ICW4_AEOI)
|
||||
#else
|
||||
#define MASTER_MODE BASE_MASTER_MODE
|
||||
#endif
|
||||
#ifdef AUTO_EOI_2
|
||||
#define SLAVE_MODE (BASE_SLAVE_MODE | ICW4_AEOI)
|
||||
#else
|
||||
#define SLAVE_MODE BASE_SLAVE_MODE
|
||||
#endif
|
||||
|
||||
#define IRQ_MASK(irq) (1 << (irq))
|
||||
#define IMEN_MASK(ai) (IRQ_MASK((ai)->at_irq))
|
||||
|
||||
void atpic_handle_intr(u_int vector, struct trapframe *frame);
|
||||
void atpic_startup(void);
|
||||
|
||||
|
@ -63,8 +63,12 @@
|
||||
#include <machine/frame.h>
|
||||
#include <dev/ic/i8259.h>
|
||||
#include <x86/isa/icu.h>
|
||||
#ifdef PC98
|
||||
#include <pc98/cbus/cbus.h>
|
||||
#else
|
||||
#include <x86/isa/isa.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define MAX_STRAY_LOG 5
|
||||
|
||||
@ -391,15 +395,15 @@ atpic_reset(void)
|
||||
|
||||
outb(IO_ICU1, ICW1_RESET | ICW1_IC4);
|
||||
outb(IO_ICU1 + ICU_IMR_OFFSET, IDT_IO_INTS);
|
||||
outb(IO_ICU1 + ICU_IMR_OFFSET, 1 << 2);
|
||||
outb(IO_ICU1 + ICU_IMR_OFFSET, ICW4_8086);
|
||||
outb(IO_ICU1 + ICU_IMR_OFFSET, IRQ_MASK(ICU_SLAVEID));
|
||||
outb(IO_ICU1 + ICU_IMR_OFFSET, MASTER_MODE);
|
||||
outb(IO_ICU1 + ICU_IMR_OFFSET, 0xff);
|
||||
outb(IO_ICU1, OCW3_SEL | OCW3_RR);
|
||||
|
||||
outb(IO_ICU2, ICW1_RESET | ICW1_IC4);
|
||||
outb(IO_ICU2 + ICU_IMR_OFFSET, IDT_IO_INTS + 8);
|
||||
outb(IO_ICU2 + ICU_IMR_OFFSET, 2);
|
||||
outb(IO_ICU2 + ICU_IMR_OFFSET, ICW4_8086);
|
||||
outb(IO_ICU2 + ICU_IMR_OFFSET, ICU_SLAVEID);
|
||||
outb(IO_ICU2 + ICU_IMR_OFFSET, SLAVE_MODE);
|
||||
outb(IO_ICU2 + ICU_IMR_OFFSET, 0xff);
|
||||
outb(IO_ICU2, OCW3_SEL | OCW3_RR);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user