#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ka660.c,v 1.12 2017/05/22 16:46:15 ragge Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/cpu.h>
#include <sys/device.h>
#include <sys/kernel.h>
#include <machine/sid.h>
#include <machine/nexus.h>
#include <machine/ka410.h>
#include <machine/ka420.h>
#include <machine/clock.h>
#include <machine/vsbus.h>
#define KA660_CCR 37
#define KA660_CTAG 0x20150000
#define KA660_CDATA 0x20150400
#define KA660_BEHR 0x20150800
#define CCR_WWP 8
#define CCR_ENA 4
#define CCR_FLU 2
#define CCR_DIA 1
static void ka660_conf(void);
static void ka660_memerr(void);
static void ka660_cache_enable(void);
static void ka660_attach_cpu(device_t);
static int ka660_mchk(void *);
static const char * const ka660_devs[] = { "cpu", "sgec", "shac", "uba", NULL };
const struct cpu_dep ka660_calls = {
.cpu_steal_pages = ka660_cache_enable,
.cpu_mchk = ka660_mchk,
.cpu_memerr = ka660_memerr,
.cpu_conf = ka660_conf,
.cpu_gettime = generic_gettime,
.cpu_settime = generic_settime,
.cpu_vups = 6,
.cpu_scbsz = 2,
.cpu_halt = generic_halt,
.cpu_reboot = generic_reboot,
.cpu_devs = ka660_devs,
.cpu_attach_cpu = ka660_attach_cpu,
};
void
ka660_conf(void)
{
cpmbx = (struct cpmbx *)vax_map_physmem(0x20140400, 1);
}
void
ka660_attach_cpu(device_t self)
{
aprint_normal(
": %s, SOC (ucode rev. %d), 6KB L1 cache\n",
"KA660",
vax_cpudata & 0377);
}
void
ka660_cache_enable(void)
{
unsigned int *p;
int cnt, bnk, behrtmp;
mtpr(0, KA660_CCR);
mtpr(CCR_DIA, KA660_CCR);
bnk = 1;
behrtmp = 0;
while(bnk <= 0x80)
{
*(int *)KA660_BEHR = bnk;
p = (int *)KA660_CDATA;
*p = 0x55aaff00L;
if(*p == 0x55aaff00L) behrtmp |= bnk;
*p = 0xffaa0055L;
if(*p != 0xffaa0055L) behrtmp &= ~bnk;
cnt = 256;
while(cnt--) *p++ = 0L;
p = (int *) KA660_CTAG;
cnt =128;
while(cnt--) { *p++ = 0x80000000L; p++; }
bnk <<= 1;
}
*(int *)KA660_BEHR = behrtmp;
mtpr(CCR_DIA|CCR_FLU, KA660_CCR);
mtpr(CCR_ENA, KA660_CCR);
}
void
ka660_memerr(void)
{
printf("Memory err!\n");
}
int
ka660_mchk(void *addr)
{
panic("Machine check");
return 0;
}