CPU support for 4000/90 (KA49).
This commit is contained in:
parent
c1eb799c3a
commit
3c8bd07cd4
|
@ -0,0 +1,230 @@
|
|||
/*
|
||||
* Copyright (c) 1999 Ludd, University of Lule}, Sweden.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed at Ludd, University of
|
||||
* Lule}, Sweden and its contributors.
|
||||
* 4. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/device.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
#include <machine/clock.h>
|
||||
#include <machine/cpu.h>
|
||||
#include <machine/scb.h>
|
||||
|
||||
static void ka49_conf __P((void));
|
||||
static void ka49_memerr __P((void));
|
||||
static int ka49_mchk __P((caddr_t));
|
||||
static void ka49_halt __P((void));
|
||||
static void ka49_reboot __P((int));
|
||||
static void ka49_softmem __P((int));
|
||||
static void ka49_hardmem __P((int));
|
||||
static void ka49_steal_pages __P((void));
|
||||
static void ka49_cache_enable __P((void));
|
||||
static void ka49_halt __P((void));
|
||||
|
||||
/*
|
||||
* Declaration of 49-specific calls.
|
||||
*/
|
||||
struct cpu_dep ka49_calls = {
|
||||
ka49_steal_pages,
|
||||
ka49_mchk,
|
||||
ka49_memerr,
|
||||
ka49_conf,
|
||||
chip_clkread,
|
||||
chip_clkwrite,
|
||||
16, /* ~VUPS */
|
||||
2, /* SCB pages */
|
||||
ka49_halt,
|
||||
ka49_reboot,
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
ka49_conf()
|
||||
{
|
||||
printf("cpu0: KA49\n");
|
||||
|
||||
/* Why??? */
|
||||
{ volatile int *hej = (void *)mfpr(PR_ISP); *hej = *hej; hej[-1] = hej[-1];}
|
||||
|
||||
/*
|
||||
* Setup parameters necessary to read time from clock chip.
|
||||
*/
|
||||
clk_adrshift = 1; /* Addressed at long's... */
|
||||
clk_tweak = 2; /* ...and shift two */
|
||||
clk_page = (short *)vax_map_physmem(0x25400000, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Why may we get memory errors during startup???
|
||||
*/
|
||||
void
|
||||
ka49_hardmem(arg)
|
||||
{
|
||||
if (cold == 0)
|
||||
printf("Hard memory error\n");
|
||||
splhigh();
|
||||
}
|
||||
|
||||
void
|
||||
ka49_softmem(arg)
|
||||
{
|
||||
if (cold == 0)
|
||||
printf("Soft memory error\n");
|
||||
splhigh();
|
||||
}
|
||||
|
||||
/*
|
||||
* KA49-specific IPRs. KA49 has the funny habit to control all caches
|
||||
* via IPRs.
|
||||
*/
|
||||
#define PR_CCTL 0xa0
|
||||
#define CCTL_ENABLE 0x00000001
|
||||
#define CCTL_SSIZE 0x00000002
|
||||
#define CCTL_VSIZE 0x00000004
|
||||
#define CCTL_SW_ETM 0x40000000
|
||||
#define CCTL_HW_ETM 0x80000000
|
||||
|
||||
#define PR_BCETSTS 0xa3
|
||||
#define PR_BCEDSTS 0xa6
|
||||
#define PR_NESTS 0xae
|
||||
|
||||
#define PR_VMAR 0xd0
|
||||
#define PR_VTAG 0xd1
|
||||
#define PR_ICSR 0xd3
|
||||
#define ICSR_ENABLE 0x01
|
||||
|
||||
#define PR_PCCTL 0xf8
|
||||
#define PCCTL_P_EN 0x10
|
||||
#define PCCTL_I_EN 0x02
|
||||
#define PCCTL_D_EN 0x01
|
||||
|
||||
void
|
||||
ka49_cache_enable()
|
||||
{
|
||||
int start, slut;
|
||||
|
||||
/*
|
||||
* Turn caches off.
|
||||
*/
|
||||
mtpr(0, PR_ICSR);
|
||||
mtpr(0, PR_PCCTL);
|
||||
mtpr(mfpr(PR_CCTL) | CCTL_SW_ETM, PR_CCTL);
|
||||
|
||||
/*
|
||||
* Invalidate caches.
|
||||
*/
|
||||
mtpr(mfpr(PR_CCTL) | 0x10, PR_CCTL); /* Set cache size */
|
||||
mtpr(mfpr(PR_BCETSTS), PR_BCETSTS); /* Clear error bits */
|
||||
mtpr(mfpr(PR_BCEDSTS), PR_BCEDSTS); /* Clear error bits */
|
||||
mtpr(mfpr(PR_NESTS), PR_NESTS); /* Clear error bits */
|
||||
|
||||
|
||||
start = 0x01400000;
|
||||
slut = 0x01440000;
|
||||
|
||||
/* Flush cache lines */
|
||||
for (; start < slut; start += 0x20)
|
||||
mtpr(0, start);
|
||||
|
||||
mtpr((mfpr(PR_CCTL) & ~(CCTL_SW_ETM|CCTL_ENABLE)) | CCTL_HW_ETM,
|
||||
PR_CCTL);
|
||||
|
||||
start = 0x01000000;
|
||||
slut = 0x01040000;
|
||||
|
||||
/* clear tag and valid */
|
||||
for (; start < slut; start += 0x20)
|
||||
mtpr(0, start);
|
||||
|
||||
mtpr(mfpr(PR_CCTL) | 0x10 | CCTL_ENABLE, PR_CCTL); /* enab. bcache */
|
||||
|
||||
start = 0x01800000;
|
||||
slut = 0x01802000;
|
||||
|
||||
/* Clear primary cache */
|
||||
for (; start < slut; start += 0x20)
|
||||
mtpr(0, start);
|
||||
|
||||
/* Flush the pipes (via REI) */
|
||||
asm("movpsl -(sp); movab 1f,-(sp); rei; 1:;");
|
||||
|
||||
/* Enable primary cache */
|
||||
mtpr(PCCTL_P_EN|PCCTL_I_EN|PCCTL_D_EN, PR_PCCTL);
|
||||
|
||||
/* Enable the VIC */
|
||||
start = 0;
|
||||
slut = 0x800;
|
||||
for (; start < slut; start += 0x20) {
|
||||
mtpr(start, PR_VMAR);
|
||||
mtpr(0, PR_VTAG);
|
||||
}
|
||||
mtpr(ICSR_ENABLE, PR_ICSR);
|
||||
}
|
||||
|
||||
void
|
||||
ka49_memerr()
|
||||
{
|
||||
printf("Memory err!\n");
|
||||
}
|
||||
|
||||
int
|
||||
ka49_mchk(addr)
|
||||
caddr_t addr;
|
||||
{
|
||||
panic("Machine check");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
ka49_steal_pages()
|
||||
{
|
||||
|
||||
/*
|
||||
* Get the soft and hard memory error vectors now.
|
||||
*/
|
||||
scb_vecalloc(0x54, ka49_softmem, 0, 0);
|
||||
scb_vecalloc(0x60, ka49_hardmem, 0, 0);
|
||||
|
||||
/* Turn on caches (to speed up execution a bit) */
|
||||
ka49_cache_enable();
|
||||
}
|
||||
|
||||
static void
|
||||
ka49_halt()
|
||||
{
|
||||
asm("halt");
|
||||
}
|
||||
|
||||
static void
|
||||
ka49_reboot(arg)
|
||||
int arg;
|
||||
{
|
||||
asm("halt");
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: locore.c,v 1.39 1999/08/07 10:36:49 ragge Exp $ */
|
||||
/* $NetBSD: locore.c,v 1.40 1999/08/27 20:02:05 ragge Exp $ */
|
||||
/*
|
||||
* Copyright (c) 1994, 1998 Ludd, University of Lule}, Sweden.
|
||||
* All rights reserved.
|
||||
|
@ -67,9 +67,11 @@ extern struct cpu_dep ka820_calls;
|
|||
extern struct cpu_dep ka43_calls;
|
||||
extern struct cpu_dep ka46_calls;
|
||||
extern struct cpu_dep ka48_calls;
|
||||
extern struct cpu_dep ka49_calls;
|
||||
extern struct cpu_dep ka410_calls;
|
||||
extern struct cpu_dep ka630_calls;
|
||||
extern struct cpu_dep ka650_calls;
|
||||
extern struct cpu_dep ka660_calls;
|
||||
extern struct cpu_dep ka670_calls;
|
||||
|
||||
/*
|
||||
|
@ -151,7 +153,7 @@ start()
|
|||
#endif
|
||||
#if VAX49
|
||||
case VAX_BTYP_49:
|
||||
dep_call = &ka48_calls;
|
||||
dep_call = &ka49_calls;
|
||||
strcat(cpu_model, "4000/90");
|
||||
break;
|
||||
#endif
|
||||
|
@ -184,6 +186,12 @@ start()
|
|||
}
|
||||
break;
|
||||
#endif
|
||||
#if VAX660
|
||||
case VAX_BTYP_660:
|
||||
dep_call = &ka660_calls;
|
||||
strcpy(cpu_model,"VAX 4000/200");
|
||||
break;
|
||||
#endif
|
||||
#if VAX670
|
||||
case VAX_BTYP_670:
|
||||
dep_call = &ka670_calls;
|
||||
|
|
Loading…
Reference in New Issue