Chnage MACHINE_NONCONTIG implementation such that the message buffer is
always located at the end of onboard RAM. This allows locore.s to zero any offboard RAM to initialise the parity bit which most VMEbus RAM cards have. Without this, many cards buserr on the first read access. Thanks to Herb Peyerl for the idea.
This commit is contained in:
parent
eb0f6686d2
commit
cb8172bce4
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: locore.s,v 1.29 1997/10/21 19:25:16 scw Exp $ */
|
/* $NetBSD: locore.s,v 1.30 1997/11/01 17:56:49 scw Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988 University of Utah.
|
* Copyright (c) 1988 University of Utah.
|
||||||
|
@ -183,12 +183,36 @@ start: | start of kernel and .text!
|
||||||
movl 0xfffe0774,d1 | End + 1 of onboard memory
|
movl 0xfffe0774,d1 | End + 1 of onboard memory
|
||||||
movl d1,a0@(4) | phys_seg_list[0].ps_end
|
movl d1,a0@(4) | phys_seg_list[0].ps_end
|
||||||
clrl a0@(8) | phys_seg_list[0].ps_startpage
|
clrl a0@(8) | phys_seg_list[0].ps_startpage
|
||||||
movl 0xfffe0764,a0@(0x0c) | Start of offboard segment
|
|
||||||
|
/* offboard RAM */
|
||||||
|
clrl a0@(0x0c) | phys_seg_list[1].ps_start
|
||||||
|
movl #NBPG-1,d0
|
||||||
|
addl 0xfffe0764,d0 | Start of offboard segment
|
||||||
|
andl #-NBPG,d0 | Round up to page boundary
|
||||||
beq Lsavmaxmem | Jump if none defined
|
beq Lsavmaxmem | Jump if none defined
|
||||||
movl 0xfffe0768,d1 | End of offboard segment
|
movl #NBPG,d1 | Note: implicit '+1'
|
||||||
addql #1,d1 | +1
|
addl 0xfffe0768,d1 | End of offboard segment
|
||||||
|
andl #-NBPG,d1 | Round up to page boundary
|
||||||
|
cmpl d1,d0 | Quick and dirty validity check
|
||||||
|
bcss Loff_ok | Yup, looks good.
|
||||||
|
movel a0@(4),d1 | Just use onboard RAM otherwise
|
||||||
|
bras Lsavmaxmem
|
||||||
|
Loff_ok:
|
||||||
|
movl d0,a0@(0x0c) | phys_seg_list[1].ps_start
|
||||||
movl d1,a0@(0x10) | phys_seg_list[1].ps_end
|
movl d1,a0@(0x10) | phys_seg_list[1].ps_end
|
||||||
clrl a0@(0x14) | phys_seg_list[1].ps_startpage
|
clrl a0@(0x14) | phys_seg_list[1].ps_startpage
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Offboard RAM needs to be cleared to zero to initialise parity
|
||||||
|
* on most VMEbus RAM cards. Without this, some cards will buserr
|
||||||
|
* when first read.
|
||||||
|
*/
|
||||||
|
movel d0,a0 | offboard start address again.
|
||||||
|
Lclearoff:
|
||||||
|
clrl a0@+ | zap a word
|
||||||
|
cmpl a0,d1 | reached end?
|
||||||
|
bnes Lclearoff
|
||||||
|
|
||||||
Lsavmaxmem:
|
Lsavmaxmem:
|
||||||
moveq #PGSHIFT,d2
|
moveq #PGSHIFT,d2
|
||||||
lsrl d2,d1 | convert to page (click) number
|
lsrl d2,d1 | convert to page (click) number
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: machdep.c,v 1.28 1997/10/19 10:53:14 scw Exp $ */
|
/* $NetBSD: machdep.c,v 1.29 1997/11/01 17:56:47 scw Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1988 University of Utah.
|
* Copyright (c) 1988 University of Utah.
|
||||||
|
@ -87,10 +87,15 @@
|
||||||
#include <machine/prom.h>
|
#include <machine/prom.h>
|
||||||
#include <machine/psl.h>
|
#include <machine/psl.h>
|
||||||
#include <machine/pte.h>
|
#include <machine/pte.h>
|
||||||
|
#include <machine/vmparam.h>
|
||||||
#include <dev/cons.h>
|
#include <dev/cons.h>
|
||||||
|
|
||||||
#include <machine/kcore.h> /* XXX should be pulled in by sys/kcore.h */
|
#include <machine/kcore.h> /* XXX should be pulled in by sys/kcore.h */
|
||||||
|
|
||||||
|
#ifdef MACHINE_NONCONTIG
|
||||||
|
#include <mvme68k/mvme68k/seglist.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MAXMEM 64*1024*CLSIZE /* XXX - from cmap.h */
|
#define MAXMEM 64*1024*CLSIZE /* XXX - from cmap.h */
|
||||||
|
|
||||||
/* the following is used externally (sysctl_hw) */
|
/* the following is used externally (sysctl_hw) */
|
||||||
|
@ -219,10 +224,17 @@ mvme68k_init()
|
||||||
* Initialize error message buffer (at end of core).
|
* Initialize error message buffer (at end of core).
|
||||||
* avail_end was pre-decremented in pmap_bootstrap to compensate.
|
* avail_end was pre-decremented in pmap_bootstrap to compensate.
|
||||||
*/
|
*/
|
||||||
|
#ifdef MACHINE_NONCONTIG
|
||||||
|
#define MVME_MSG_BUF_START phys_seg_list[0].ps_end
|
||||||
|
#else
|
||||||
|
#define MVME_MSG_BUF_START avail_end
|
||||||
|
#endif
|
||||||
for (i = 0; i < btoc(MSGBUFSIZE); i++)
|
for (i = 0; i < btoc(MSGBUFSIZE); i++)
|
||||||
pmap_enter(pmap_kernel(), (vm_offset_t)msgbufaddr + i * NBPG,
|
pmap_enter(pmap_kernel(), (vm_offset_t)msgbufaddr + i * NBPG,
|
||||||
avail_end + i * NBPG, VM_PROT_ALL, TRUE);
|
MVME_MSG_BUF_START + i * NBPG, VM_PROT_ALL, TRUE);
|
||||||
initmsgbuf(msgbufaddr, round_page(MSGBUFSIZE));
|
initmsgbuf(msgbufaddr, round_page(MSGBUFSIZE));
|
||||||
|
|
||||||
|
#undef MVME_MSG_BUF_START
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MVME147
|
#ifdef MVME147
|
||||||
|
@ -334,7 +346,18 @@ cpu_startup()
|
||||||
*/
|
*/
|
||||||
printf(version);
|
printf(version);
|
||||||
identifycpu();
|
identifycpu();
|
||||||
printf("real mem = %d\n", ctob(physmem));
|
printf("real mem = %d", ctob(physmem));
|
||||||
|
|
||||||
|
#ifdef MACHINE_NONCONTIG
|
||||||
|
maxaddr = 0;
|
||||||
|
for (i = 1; i < MAX_PHYS_SEGS && phys_seg_list[i].ps_start; i++)
|
||||||
|
maxaddr += phys_seg_list[i].ps_end - phys_seg_list[i].ps_start;
|
||||||
|
|
||||||
|
if ( maxaddr )
|
||||||
|
printf(" (of which %d is offboard)", maxaddr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fine out how much space we need, allocate it,
|
* Fine out how much space we need, allocate it,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: pmap_bootstrap.c,v 1.5 1997/10/09 21:39:33 scw Exp $ */
|
/* $NetBSD: pmap_bootstrap.c,v 1.6 1997/11/01 17:56:51 scw Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1991, 1993
|
* Copyright (c) 1991, 1993
|
||||||
|
@ -410,16 +410,28 @@ pmap_bootstrap(nextpa, firstpa)
|
||||||
* the pmap module.
|
* the pmap module.
|
||||||
*/
|
*/
|
||||||
RELOC(avail_start, vm_offset_t) = nextpa;
|
RELOC(avail_start, vm_offset_t) = nextpa;
|
||||||
|
|
||||||
|
#ifndef MACHINE_NONCONTIG
|
||||||
RELOC(avail_end, vm_offset_t) =
|
RELOC(avail_end, vm_offset_t) =
|
||||||
m68k_ptob(RELOC(maxmem, int))
|
m68k_ptob(RELOC(maxmem, int))
|
||||||
/* XXX allow for msgbuf */
|
/* XXX allow for msgbuf */
|
||||||
- m68k_round_page(MSGBUFSIZE);
|
- m68k_round_page(MSGBUFSIZE);
|
||||||
|
|
||||||
#ifdef MACHINE_NONCONTIG
|
#else
|
||||||
RELOC(avail_next, vm_offset_t) = RELOC(avail_start, vm_offset_t);
|
RELOC(avail_next, vm_offset_t) = RELOC(avail_start, vm_offset_t);
|
||||||
|
|
||||||
|
/* leave space at end of onboard RAM for message buffer */
|
||||||
|
RELOC(phys_seg_list[0].ps_end, vm_offset_t) -=
|
||||||
|
m68k_round_page(MSGBUFSIZE);
|
||||||
|
|
||||||
|
/* initial avail_end is end of onboard RAM */
|
||||||
|
RELOC(avail_end, vm_offset_t) =
|
||||||
|
m68k_ptob(RELOC(phys_seg_list[0].ps_end, vm_offset_t));
|
||||||
|
|
||||||
RELOC(avail_remaining, vm_size_t) =
|
RELOC(avail_remaining, vm_size_t) =
|
||||||
(RELOC(phys_seg_list[0].ps_end, vm_offset_t) -
|
(RELOC(phys_seg_list[0].ps_end, vm_offset_t) -
|
||||||
RELOC(avail_start, vm_offset_t)) >> PGSHIFT;
|
RELOC(avail_start, vm_offset_t)) >> PGSHIFT;
|
||||||
|
|
||||||
RELOC(phys_seg_list[0].ps_start, vm_offset_t) =
|
RELOC(phys_seg_list[0].ps_start, vm_offset_t) =
|
||||||
RELOC(avail_start, vm_offset_t);
|
RELOC(avail_start, vm_offset_t);
|
||||||
RELOC(phys_seg_list[0].ps_startpage, vm_offset_t) = 0;
|
RELOC(phys_seg_list[0].ps_startpage, vm_offset_t) = 0;
|
||||||
|
@ -430,8 +442,7 @@ pmap_bootstrap(nextpa, firstpa)
|
||||||
RELOC(phys_seg_list[0].ps_start, vm_offset_t)) / NBPG;
|
RELOC(phys_seg_list[0].ps_start, vm_offset_t)) / NBPG;
|
||||||
|
|
||||||
/* iterate over any remaining segments */
|
/* iterate over any remaining segments */
|
||||||
for (i = 1; i < MAX_PHYS_SEGS; i++)
|
for (i = 1; i < MAX_PHYS_SEGS; i++) {
|
||||||
{
|
|
||||||
vm_offset_t len;
|
vm_offset_t len;
|
||||||
|
|
||||||
if ( RELOC(phys_seg_list[i].ps_start, vm_offset_t) == 0 )
|
if ( RELOC(phys_seg_list[i].ps_start, vm_offset_t) == 0 )
|
||||||
|
@ -448,12 +459,15 @@ pmap_bootstrap(nextpa, firstpa)
|
||||||
|
|
||||||
RELOC(avail_remaining, vm_size_t) += (len / NBPG);
|
RELOC(avail_remaining, vm_size_t) += (len / NBPG);
|
||||||
RELOC(physmem, int) += (len / NBPG);
|
RELOC(physmem, int) += (len / NBPG);
|
||||||
}
|
|
||||||
|
|
||||||
/* correct for message buffer */
|
if ( m68k_ptob(RELOC(phys_seg_list[i].ps_end, vm_offset_t)) >
|
||||||
RELOC(phys_seg_list[i - 1].ps_end, vm_offset_t) -=
|
RELOC(avail_end, vm_offset_t) ) {
|
||||||
m68k_round_page(MSGBUFSIZE);
|
RELOC(avail_end, vm_offset_t) =
|
||||||
|
m68k_ptob(RELOC(phys_seg_list[i].ps_end, vm_offset_t));
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
RELOC(mem_size, vm_size_t) = m68k_ptob(RELOC(physmem, int));
|
RELOC(mem_size, vm_size_t) = m68k_ptob(RELOC(physmem, int));
|
||||||
RELOC(virtual_avail, vm_offset_t) =
|
RELOC(virtual_avail, vm_offset_t) =
|
||||||
VM_MIN_KERNEL_ADDRESS + (nextpa - firstpa);
|
VM_MIN_KERNEL_ADDRESS + (nextpa - firstpa);
|
||||||
|
|
Loading…
Reference in New Issue