Attach int0 at mainbus (precedent being the ip32 CRIME device, which handled
interrupts and timer calibration yet is also attached at mainbus). Introduce the INDY_R4600_CACHE config option, which more accurately describes the code enabled by this option. This renders #ifdef IPxx completely obsolete, thus we theoretically can unify the GENERIC files if a workable load address relocation scheme can be found.
This commit is contained in:
parent
1fa0b4f2cc
commit
90448f3f3f
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: GENERIC32_IP2x,v 1.8 2004/01/15 08:46:31 pooka Exp $
|
# $NetBSD: GENERIC32_IP2x,v 1.9 2004/01/19 00:12:31 sekiya Exp $
|
||||||
#
|
#
|
||||||
# GENERIC32_IP2x machine description file
|
# GENERIC32_IP2x machine description file
|
||||||
#
|
#
|
||||||
@ -29,14 +29,14 @@ makeoptions TEXTADDR=0x88069000 # entry point
|
|||||||
|
|
||||||
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
|
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
|
||||||
|
|
||||||
#ident "GENERIC32-IP2x-$Revision: 1.8 $"
|
#ident "GENERIC32-IP2x-$Revision: 1.9 $"
|
||||||
|
|
||||||
maxusers 32
|
maxusers 32
|
||||||
|
|
||||||
# CPU related options
|
# CPU related options
|
||||||
options IP2X # Indigo / Indigo2 / Indy
|
|
||||||
|
|
||||||
options MIPS3 # MIPS3 support
|
options MIPS3 # MIPS3 support
|
||||||
|
options INDY_R4600_CACHE # Include routines to handle special
|
||||||
|
# R4600 cache -- required for Indy.
|
||||||
|
|
||||||
#options BLINK # blinkenlitzen
|
#options BLINK # blinkenlitzen
|
||||||
|
|
||||||
@ -186,6 +186,7 @@ uk* at scsibus? target ? lun ? # unknown SCSI
|
|||||||
imc0 at mainbus0 addr 0x1fa00000
|
imc0 at mainbus0 addr 0x1fa00000
|
||||||
gio0 at imc0
|
gio0 at imc0
|
||||||
eisa0 at imc0
|
eisa0 at imc0
|
||||||
|
int0 at mainbus0 # Interrupt controller
|
||||||
|
|
||||||
hpc0 at gio? addr 0x1fb80000
|
hpc0 at gio? addr 0x1fb80000
|
||||||
hpc1 at gio? addr 0x1fb00000
|
hpc1 at gio? addr 0x1fb00000
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: files.sgimips,v 1.34 2004/01/18 04:06:42 sekiya Exp $
|
# $NetBSD: files.sgimips,v 1.35 2004/01/19 00:12:31 sekiya Exp $
|
||||||
|
|
||||||
maxpartitions 16
|
maxpartitions 16
|
||||||
|
|
||||||
@ -17,8 +17,7 @@ file arch/sgimips/sgimips/cpu.c cpu
|
|||||||
file dev/arcbios/arcbios.c
|
file dev/arcbios/arcbios.c
|
||||||
file dev/arcbios/arcbios_tty.c
|
file dev/arcbios/arcbios_tty.c
|
||||||
|
|
||||||
file arch/sgimips/sgimips/ip22_cache.S ip2x
|
file arch/sgimips/sgimips/ip22_cache.S indy_r4600_cache
|
||||||
file arch/sgimips/sgimips/int.c ip1x | ip2x
|
|
||||||
file arch/sgimips/sgimips/autoconf.c
|
file arch/sgimips/sgimips/autoconf.c
|
||||||
file arch/sgimips/sgimips/bus.c
|
file arch/sgimips/sgimips/bus.c
|
||||||
file arch/sgimips/sgimips/clock.c
|
file arch/sgimips/sgimips/clock.c
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
# $NetBSD: files.dev,v 1.1 2004/01/18 04:07:17 sekiya Exp $
|
# $NetBSD: files.dev,v 1.2 2004/01/19 00:12:31 sekiya Exp $
|
||||||
|
|
||||||
define giobus {}
|
define giobus {}
|
||||||
|
|
||||||
|
device int
|
||||||
|
attach int at mainbus
|
||||||
|
file arch/sgimips/dev/int.c int
|
||||||
|
|
||||||
device imc: giobus, eisabus
|
device imc: giobus, eisabus
|
||||||
attach imc at mainbus
|
attach imc at mainbus
|
||||||
file arch/sgimips/dev/imc.c imc
|
file arch/sgimips/dev/imc.c imc
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: int.c,v 1.1 2004/01/18 00:47:21 sekiya Exp $ */
|
/* $NetBSD: int.c,v 1.1 2004/01/19 00:12:31 sekiya Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2004 Christopher SEKIYA
|
* Copyright (c) 2004 Christopher SEKIYA
|
||||||
@ -32,7 +32,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: int.c,v 1.1 2004/01/18 00:47:21 sekiya Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: int.c,v 1.1 2004/01/19 00:12:31 sekiya Exp $");
|
||||||
|
|
||||||
#include "opt_cputype.h"
|
#include "opt_cputype.h"
|
||||||
#include "opt_machtypes.h"
|
#include "opt_machtypes.h"
|
||||||
@ -56,7 +56,13 @@ __KERNEL_RCSID(0, "$NetBSD: int.c,v 1.1 2004/01/18 00:47:21 sekiya Exp $");
|
|||||||
static bus_space_handle_t ioh;
|
static bus_space_handle_t ioh;
|
||||||
static bus_space_tag_t iot;
|
static bus_space_tag_t iot;
|
||||||
|
|
||||||
void int_init(u_int32_t);
|
struct int_softc {
|
||||||
|
struct device sc_dev;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static int int_match(struct device *, struct cfdata *, void *);
|
||||||
|
static void int_attach(struct device *, struct device *, void *);
|
||||||
void int_local0_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
|
void int_local0_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
|
||||||
void int_local1_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
|
void int_local1_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
|
||||||
int int_mappable_intr(void *);
|
int int_mappable_intr(void *);
|
||||||
@ -65,13 +71,42 @@ void *int_intr_establish(int, int, int (*)(void *), void *);
|
|||||||
unsigned long int_cal_timer(void);
|
unsigned long int_cal_timer(void);
|
||||||
void int_8254_cal(void);
|
void int_8254_cal(void);
|
||||||
|
|
||||||
void
|
CFATTACH_DECL(int, sizeof(struct int_softc),
|
||||||
int_init(u_int32_t address)
|
int_match, int_attach, NULL, NULL);
|
||||||
|
|
||||||
|
static int
|
||||||
|
int_match(struct device *parent, struct cfdata *match, void *aux)
|
||||||
|
{
|
||||||
|
if ( (mach_type == MACH_SGI_IP12) || (mach_type == MACH_SGI_IP20) ||
|
||||||
|
(mach_type == MACH_SGI_IP22) )
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
int_attach(struct device *parent, struct device *self, void *aux)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned long cps;
|
unsigned long cps;
|
||||||
unsigned long ctrdiff[3];
|
unsigned long ctrdiff[3];
|
||||||
|
u_int32_t address;
|
||||||
|
|
||||||
|
if (mach_type == MACH_SGI_IP12)
|
||||||
|
address = INT_IP12;
|
||||||
|
else if (mach_type == MACH_SGI_IP20)
|
||||||
|
address = INT_IP20;
|
||||||
|
else if (mach_type == MACH_SGI_IP22) {
|
||||||
|
if (mach_subtype == MACH_SGI_IP22_FULLHOUSE)
|
||||||
|
address = INT_IP22;
|
||||||
|
else
|
||||||
|
address = INT_IP24;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
panic("\nint0: passed match, but failed attach?");
|
||||||
|
|
||||||
|
printf(" addr 0x%x", address);
|
||||||
|
|
||||||
bus_space_map(iot, address, 0, 0, &ioh);
|
bus_space_map(iot, address, 0, 0, &ioh);
|
||||||
iot = SGIMIPS_BUS_SPACE_NORMAL;
|
iot = SGIMIPS_BUS_SPACE_NORMAL;
|
||||||
|
|
||||||
@ -109,18 +144,19 @@ int_init(u_int32_t address)
|
|||||||
|
|
||||||
cps = cps / (sizeof(ctrdiff) / sizeof(ctrdiff[0]));
|
cps = cps / (sizeof(ctrdiff) / sizeof(ctrdiff[0]));
|
||||||
|
|
||||||
printf("Timer calibration, %lu cycles (%lu, %lu, %lu)\n", cps,
|
printf(": bus %luMHz, CPU %luMHz", cps / 10000, cps / 5000);
|
||||||
ctrdiff[0], ctrdiff[1], ctrdiff[2]);
|
|
||||||
|
|
||||||
/* R4k/R4400/R4600/R5k count at half CPU frequency */
|
/* R4k/R4400/R4600/R5k count at half CPU frequency */
|
||||||
curcpu()->ci_cpu_freq = 2 * cps * hz;
|
curcpu()->ci_cpu_freq = 2 * cps * hz;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
panic("int: unsupported machine type %i\n", mach_type);
|
panic("int0: unsupported machine type %i\n", mach_type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
curcpu()->ci_cycles_per_hz = curcpu()->ci_cpu_freq / (2 * hz);
|
curcpu()->ci_cycles_per_hz = curcpu()->ci_cpu_freq / (2 * hz);
|
||||||
curcpu()->ci_divisor_delay = curcpu()->ci_cpu_freq / (2 * 1000000);
|
curcpu()->ci_divisor_delay = curcpu()->ci_cpu_freq / (2 * 1000000);
|
||||||
MIPS_SET_CI_RECIPRICAL(curcpu());
|
MIPS_SET_CI_RECIPRICAL(curcpu());
|
||||||
@ -160,7 +196,7 @@ int_mappable_intr(void *arg)
|
|||||||
ret |= (intrtab[intnum].ih_fun)
|
ret |= (intrtab[intnum].ih_fun)
|
||||||
(intrtab[intnum].ih_arg);
|
(intrtab[intnum].ih_arg);
|
||||||
else
|
else
|
||||||
printf("Unexpected mappable interrupt %d\n",
|
printf("int0: unexpected mapped interrupt %d\n",
|
||||||
intnum);
|
intnum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -187,7 +223,7 @@ int_local0_intr(u_int32_t status, u_int32_t cause, u_int32_t pc, u_int32_t ipend
|
|||||||
if (intrtab[i].ih_fun != NULL)
|
if (intrtab[i].ih_fun != NULL)
|
||||||
ret |= (intrtab[i].ih_fun)(intrtab[i].ih_arg);
|
ret |= (intrtab[i].ih_fun)(intrtab[i].ih_arg);
|
||||||
else
|
else
|
||||||
printf("Unexpected local0 interrupt %d\n", i);
|
printf("int0: unexpected local0 interrupt %d\n", i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -212,7 +248,7 @@ int_local1_intr(u_int32_t status, u_int32_t cause, u_int32_t pc, u_int32_t ipend
|
|||||||
ret |= (intrtab[8 + i].ih_fun)
|
ret |= (intrtab[8 + i].ih_fun)
|
||||||
(intrtab[8 + i].ih_arg);
|
(intrtab[8 + i].ih_arg);
|
||||||
else
|
else
|
||||||
printf("Unexpected local1 interrupt %x\n",
|
printf("int0: unexpected local1 interrupt %x\n",
|
||||||
8 + i );
|
8 + i );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,7 +264,7 @@ int_intr_establish(int level, int ipl, int (*handler) (void *), void *arg)
|
|||||||
|
|
||||||
if (intrtab[level].ih_fun != NULL)
|
if (intrtab[level].ih_fun != NULL)
|
||||||
{
|
{
|
||||||
printf("warning: ip2x cannot share interrupts yet.\n");
|
printf("int0: cannot share interrupts yet.\n");
|
||||||
return (void *)NULL;
|
return (void *)NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: machdep.c,v 1.76 2004/01/18 04:43:42 sekiya Exp $ */
|
/* $NetBSD: machdep.c,v 1.77 2004/01/19 00:12:31 sekiya Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2000 Soren S. Jorvang
|
* Copyright (c) 2000 Soren S. Jorvang
|
||||||
@ -34,7 +34,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.76 2004/01/18 04:43:42 sekiya Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.77 2004/01/19 00:12:31 sekiya Exp $");
|
||||||
|
|
||||||
#include "opt_ddb.h"
|
#include "opt_ddb.h"
|
||||||
#include "opt_kgdb.h"
|
#include "opt_kgdb.h"
|
||||||
@ -141,10 +141,9 @@ u_int32_t clockmask;
|
|||||||
phys_ram_seg_t mem_clusters[VM_PHYSSEG_MAX];
|
phys_ram_seg_t mem_clusters[VM_PHYSSEG_MAX];
|
||||||
int mem_cluster_cnt;
|
int mem_cluster_cnt;
|
||||||
|
|
||||||
#if !defined(IP32)
|
#if defined(INDY_R4600_CACHE)
|
||||||
extern void ip22_sdcache_disable(void);
|
extern void ip22_sdcache_disable(void);
|
||||||
extern void ip22_sdcache_enable(void);
|
extern void ip22_sdcache_enable(void);
|
||||||
extern void int_init(u_int32_t);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void mips1_clock_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
|
extern void mips1_clock_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
|
||||||
@ -385,10 +384,8 @@ mach_init(int argc, char **argv, int magic, struct btinfo_common *btinfo)
|
|||||||
|
|
||||||
switch (mach_type) {
|
switch (mach_type) {
|
||||||
case MACH_SGI_IP12:
|
case MACH_SGI_IP12:
|
||||||
#if defined(IP1X)
|
|
||||||
int_init(INT_IP12);
|
|
||||||
i = *(volatile u_int32_t *)MIPS_PHYS_TO_KSEG1(0x1fbd0000);
|
i = *(volatile u_int32_t *)MIPS_PHYS_TO_KSEG1(0x1fbd0000);
|
||||||
mach_boardrev = (sysid & 0x7000) >> 12;
|
mach_boardrev = (i & 0x7000) >> 12;
|
||||||
|
|
||||||
if ((i & 0x8000) == 0) {
|
if ((i & 0x8000) == 0) {
|
||||||
if (mach_boardrev < 7) /* 4D/3X */
|
if (mach_boardrev < 7) /* 4D/3X */
|
||||||
@ -408,11 +405,8 @@ mach_init(int argc, char **argv, int magic, struct btinfo_common *btinfo)
|
|||||||
clockmask = 0xbf00;
|
clockmask = 0xbf00;
|
||||||
platform.intr3 = mips1_clock_intr;
|
platform.intr3 = mips1_clock_intr;
|
||||||
platform.clkread = mips1_clkread;
|
platform.clkread = mips1_clkread;
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case MACH_SGI_IP20:
|
case MACH_SGI_IP20:
|
||||||
#if defined(IP2X)
|
|
||||||
int_init(INT_IP20);
|
|
||||||
i = *(volatile u_int32_t *)MIPS_PHYS_TO_KSEG1(0x1fbd0000);
|
i = *(volatile u_int32_t *)MIPS_PHYS_TO_KSEG1(0x1fbd0000);
|
||||||
mach_boardrev = (i & 0x7000) >> 12;
|
mach_boardrev = (i & 0x7000) >> 12;
|
||||||
|
|
||||||
@ -424,22 +418,12 @@ mach_init(int argc, char **argv, int magic, struct btinfo_common *btinfo)
|
|||||||
platform.clkread = mips3_clkread;
|
platform.clkread = mips3_clkread;
|
||||||
break;
|
break;
|
||||||
case MACH_SGI_IP22:
|
case MACH_SGI_IP22:
|
||||||
i = *(volatile u_int32_t *)MIPS_PHYS_TO_KSEG1(0x1fbd9858);
|
|
||||||
if (i & 1) {
|
|
||||||
mach_subtype = MACH_SGI_IP22_FULLHOUSE;
|
|
||||||
int_init(INT_IP22);
|
|
||||||
} else {
|
|
||||||
mach_subtype = MACH_SGI_IP22_GUINESS;
|
|
||||||
int_init(INT_IP24);
|
|
||||||
}
|
|
||||||
mach_boardrev = (i >> 1) & 0x0f;
|
|
||||||
biomask = 0x0700;
|
biomask = 0x0700;
|
||||||
netmask = 0x0700;
|
netmask = 0x0700;
|
||||||
ttymask = 0x0f00;
|
ttymask = 0x0f00;
|
||||||
clockmask = 0xbf00;
|
clockmask = 0xbf00;
|
||||||
platform.intr5 = mips3_clock_intr;
|
platform.intr5 = mips3_clock_intr;
|
||||||
platform.clkread = mips3_clkread;
|
platform.clkread = mips3_clkread;
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case MACH_SGI_IP32:
|
case MACH_SGI_IP32:
|
||||||
biomask = 0x0700;
|
biomask = 0x0700;
|
||||||
@ -842,7 +826,7 @@ void mips_machdep_cache_config(void)
|
|||||||
arcbios_tree_walk(mips_machdep_find_l2cache, NULL);
|
arcbios_tree_walk(mips_machdep_find_l2cache, NULL);
|
||||||
|
|
||||||
switch (MIPS_PRID_IMPL(cpu_id)) {
|
switch (MIPS_PRID_IMPL(cpu_id)) {
|
||||||
#if defined(IP2X)
|
#if defined(INDY_R4600_CACHE)
|
||||||
case MIPS_R4600:
|
case MIPS_R4600:
|
||||||
/*
|
/*
|
||||||
* R4600 is on Indy-class machines only. Disable and
|
* R4600 is on Indy-class machines only. Disable and
|
||||||
|
Loading…
Reference in New Issue
Block a user