Module Name: src Committed By: tsutsui Date: Sat Feb 11 02:31:34 UTC 2023
Modified Files: src/sys/arch/next68k/dev: intio.c intiovar.h nextdisplay.c src/sys/arch/next68k/include: bus_space.h cpu.h src/sys/arch/next68k/next68k: locore.s nextrom.c pmap_bootstrap.c Log Message: Handle NeXT Turbo VRAM regions properly. Info from Andreas Grabher on port-next68k@: https://mail-index.netbsd.org/port-next68k/2023/02/06/msg000052.html Also refactor bus_space_map(9) and fix (unused) bus_space_mmap(9). To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/sys/arch/next68k/dev/intio.c cvs rdiff -u -r1.7 -r1.8 src/sys/arch/next68k/dev/intiovar.h cvs rdiff -u -r1.27 -r1.28 src/sys/arch/next68k/dev/nextdisplay.c cvs rdiff -u -r1.22 -r1.23 src/sys/arch/next68k/include/bus_space.h cvs rdiff -u -r1.51 -r1.52 src/sys/arch/next68k/include/cpu.h cvs rdiff -u -r1.71 -r1.72 src/sys/arch/next68k/next68k/locore.s cvs rdiff -u -r1.27 -r1.28 src/sys/arch/next68k/next68k/nextrom.c cvs rdiff -u -r1.46 -r1.47 src/sys/arch/next68k/next68k/pmap_bootstrap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/next68k/dev/intio.c diff -u src/sys/arch/next68k/dev/intio.c:1.18 src/sys/arch/next68k/dev/intio.c:1.19 --- src/sys/arch/next68k/dev/intio.c:1.18 Sat Feb 4 14:38:09 2023 +++ src/sys/arch/next68k/dev/intio.c Sat Feb 11 02:31:34 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: intio.c,v 1.18 2023/02/04 14:38:09 tsutsui Exp $ */ +/* $NetBSD: intio.c,v 1.19 2023/02/11 02:31:34 tsutsui Exp $ */ /*- * Copyright (c) 1996 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: intio.c,v 1.18 2023/02/04 14:38:09 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: intio.c,v 1.19 2023/02/11 02:31:34 tsutsui Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: intio.c,v 1. #include <sys/reboot.h> #include <machine/autoconf.h> +#include <machine/cpu.h> #include <next68k/dev/intiovar.h> @@ -107,3 +108,27 @@ intiosearch(device_t parent, cfdata_t cf return 0; } + +int +bus_space_map(bus_space_tag_t bst, bus_addr_t addr, bus_size_t size, + int flags, bus_space_handle_t *bsh) +{ + + if (addr >= INTIOBASE && (addr + size) < INTIOTOP) { + *bsh = IIOV(addr); + return 0; + } + + return EINVAL; +} + +paddr_t +bus_space_mmap(bus_space_tag_t bst, bus_addr_t addr, off_t offset, int prot, + int flags) +{ + + if (addr >= INTIOBASE && (addr + offset) < INTIOTOP) + return m68k_btop(addr + offset); + + return -1; +} Index: src/sys/arch/next68k/dev/intiovar.h diff -u src/sys/arch/next68k/dev/intiovar.h:1.7 src/sys/arch/next68k/dev/intiovar.h:1.8 --- src/sys/arch/next68k/dev/intiovar.h:1.7 Sun Jan 2 08:19:03 2011 +++ src/sys/arch/next68k/dev/intiovar.h Sat Feb 11 02:31:34 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: intiovar.h,v 1.7 2011/01/02 08:19:03 tsutsui Exp $ */ +/* $NetBSD: intiovar.h,v 1.8 2023/02/11 02:31:34 tsutsui Exp $ */ /*- * Copyright (c) 1996 The NetBSD Foundation, Inc. @@ -47,7 +47,7 @@ struct intio_attach_args { extern vaddr_t intiobase; extern vaddr_t intiolimit; -extern vaddr_t monobase; -extern vaddr_t monolimit; -extern vaddr_t colorbase; -extern vaddr_t colorlimit; +extern vaddr_t fbbase; +extern vaddr_t fblimit; +extern paddr_t fbbasepa; +extern paddr_t fblimitpa; Index: src/sys/arch/next68k/dev/nextdisplay.c diff -u src/sys/arch/next68k/dev/nextdisplay.c:1.27 src/sys/arch/next68k/dev/nextdisplay.c:1.28 --- src/sys/arch/next68k/dev/nextdisplay.c:1.27 Fri Feb 3 23:21:17 2023 +++ src/sys/arch/next68k/dev/nextdisplay.c Sat Feb 11 02:31:34 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: nextdisplay.c,v 1.27 2023/02/03 23:21:17 tsutsui Exp $ */ +/* $NetBSD: nextdisplay.c,v 1.28 2023/02/11 02:31:34 tsutsui Exp $ */ /* * Copyright (c) 1998 Matt DeBergalis @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nextdisplay.c,v 1.27 2023/02/03 23:21:17 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nextdisplay.c,v 1.28 2023/02/11 02:31:34 tsutsui Exp $"); #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ @@ -162,15 +162,9 @@ nextdisplay_init(struct nextdisplay_conf /* printf("in nextdisplay_init\n"); */ - if (color) { - dc->dc_vaddr = colorbase; - dc->dc_paddr = COLORBASE; - dc->dc_size = NEXT_P_C16_VIDEOSIZE; - } else { - dc->dc_vaddr = monobase; - dc->dc_paddr = MONOBASE; - dc->dc_size = NEXT_P_VIDEOSIZE; - } + dc->dc_vaddr = fbbase; + dc->dc_paddr = fbbasepa; + dc->dc_size = color ? NEXT_P_C16_VIDEOSIZE : NEXT_P_VIDEOSIZE; dc->dc_wid = 1120; dc->dc_ht = 832; @@ -182,8 +176,8 @@ nextdisplay_init(struct nextdisplay_conf #if 0 printf("intiobase at: %08x\n", intiobase); printf("intiolimit at: %08x\n", intiolimit); - printf("videobase at: %08x\n", color ? colorbase : monobase); - printf("videolimit at: %08x\n", color ? colorlimit : monolimit); + printf("videobase at: %08x\n", fbbase); + printf("videolimit at: %08x\n", fblimit); printf("virtual fb at: %08x\n", dc->dc_vaddr); printf("physical fb at: %08x\n", dc->dc_paddr); @@ -231,19 +225,11 @@ nextdisplay_attach(device_t parent, devi struct nextdisplay_softc *sc = device_private(self); struct wsemuldisplaydev_attach_args waa; int isconsole; - int iscolor; - paddr_t addr; + vaddr_t addr; sc->sc_dev = self; - if (rom_machine_type == NeXT_WARP9C || - rom_machine_type == NeXT_TURBO_COLOR) { - iscolor = 1; - addr = colorbase; - } else { - iscolor = 0; - addr = monobase; - } + addr = fbbase; isconsole = nextdisplay_is_console(addr); @@ -400,13 +386,6 @@ nextdisplay_cnattach(void) { struct nextdisplay_config *dc = &nextdisplay_console_dc; long defattr; - int iscolor; - - if (rom_machine_type == NeXT_WARP9C || - rom_machine_type == NeXT_TURBO_COLOR) - iscolor = 1; - else - iscolor = 0; /* set up the display */ nextdisplay_init(&nextdisplay_console_dc, iscolor); Index: src/sys/arch/next68k/include/bus_space.h diff -u src/sys/arch/next68k/include/bus_space.h:1.22 src/sys/arch/next68k/include/bus_space.h:1.23 --- src/sys/arch/next68k/include/bus_space.h:1.22 Fri Feb 3 23:21:18 2023 +++ src/sys/arch/next68k/include/bus_space.h Sat Feb 11 02:31:34 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_space.h,v 1.22 2023/02/03 23:21:18 tsutsui Exp $ */ +/* $NetBSD: bus_space.h,v 1.23 2023/02/11 02:31:34 tsutsui Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. @@ -82,22 +82,11 @@ typedef u_long bus_space_handle_t; #define NEXT68K_INTIO_BUS_SPACE ((bus_space_tag_t)intiobase) /* - * Values for the next68k video bus space tags, not to be used directly - * by MI code. - */ -#define NEXT68K_MONO_VIDEO_BUS_SPACE ((bus_space_tag_t)monobase) -#define NEXT68K_COLOR_VIDEO_BUS_SPACE ((bus_space_tag_t)colorbase) - -/* * Mapping and unmapping operations. */ -#define bus_space_map(t, a, s, f, hp) \ - ((((a)>=INTIOBASE)&&((a)+(s)<INTIOTOP)) ? \ - ((*(hp)=(bus_space_handle_t)((t)+((a)-INTIOBASE))),0) : \ - ((((a)>=MONOBASE)&&((a)+(s)<MONOTOP)) ? \ - ((*(hp)=(bus_space_handle_t)((t)+((a)-MONOBASE))),0) : \ - ((((a)>=COLORBASE)&&((a)+(s)<COLORTOP)) ? \ - ((*(hp)=(bus_space_handle_t)((t)+((a)-COLORBASE))),0) : (-1)))) + +int bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t, int, + bus_space_handle_t *); #define bus_space_unmap(t, h, s) @@ -122,13 +111,7 @@ typedef u_long bus_space_handle_t; * Mmap an area of bus space. */ -#define bus_space_mmap(t, a, s, prot, flags) \ - ((((a)>=INTIOBASE)&&((a)+(s)<INTIOTOP)) ? \ - m68k_btop((t)+((a)-INTIOBASE)) : \ - ((((a)>=MONOBASE)&&((a)+(s)<MONOTOP)) ? \ - m68k_btop((t)+((a)-MONOBASE)) : \ - ((((a)>=COLORBASE)&&((a)+(s)<COLORTOP)) ? \ - m68k_btop((t)+((a)-COLORBASE)) : (-1)))) +paddr_t bus_space_mmap(bus_space_tag_t, bus_addr_t, off_t, int, int); /* * uintN_t bus_space_read_N(bus_space_tag_t tag, Index: src/sys/arch/next68k/include/cpu.h diff -u src/sys/arch/next68k/include/cpu.h:1.51 src/sys/arch/next68k/include/cpu.h:1.52 --- src/sys/arch/next68k/include/cpu.h:1.51 Fri Jan 27 15:21:52 2023 +++ src/sys/arch/next68k/include/cpu.h Sat Feb 11 02:31:34 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.51 2023/01/27 15:21:52 tsutsui Exp $ */ +/* $NetBSD: cpu.h,v 1.52 2023/02/11 02:31:34 tsutsui Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -120,6 +120,7 @@ void loadustp(int); void doboot(void) __attribute__((__noreturn__)); int nmihand(void *); +extern int iscolor; #endif /* _KERNEL */ #define NEXT_RAMBASE (0x4000000) /* really depends on slot, but... */ @@ -315,7 +316,10 @@ int nmihand(void *); #define MONOBASE (0x0b000000) #define MONOTOP (0x0b03a800) #define COLORBASE (0x2c000000) -#define COLORTOP (0x2c1D4000) +#define COLORTOP (0x2c1d4000) +#define TURBOFBBASE (0x0c000000) +#define TURBOMONOTOP (0x0c03a800) +#define TURBOCOLORTOP (0x0c1d4000) #define NEXT_INTR_BITS \ "\20\40NMI\37PFAIL\36TIMER\35ENETX_DMA\34ENETR_DMA\33SCSI_DMA\32DISK_DMA\31PRINTER_DMA\30SOUND_OUT_DMA\27SOUND_IN_DMA\26SCC_DMA\25DSP_DMA\24M2R_DMA\23R2M_DMA\22SCC\21REMOTE\20BUS\17DSP_4\16DISK|C16_VIDEO\15SCSI\14PRINTER\13ENETX\12ENETR\11SOUND_OVRUN\10PHONE\07DSP_3\06VIDEO\05MONITOR\04KYBD_MOUSE\03POWER\02SOFTINT1\01SOFTINT0" @@ -333,10 +337,4 @@ int nmihand(void *); #define IIOP(va) ((int)(va)-intiobase+INTIOBASE) #define IIOMAPSIZE btoc(INTIOTOP-INTIOBASE) /* 2mb */ -/* mono fb space */ -#define MONOMAPSIZE btoc(MONOTOP-MONOBASE) /* who cares */ - -/* color fb space */ -#define COLORMAPSIZE btoc(COLORTOP-COLORBASE) /* who cares */ - #endif /* _MACHINE_CPU_H_ */ Index: src/sys/arch/next68k/next68k/locore.s diff -u src/sys/arch/next68k/next68k/locore.s:1.71 src/sys/arch/next68k/next68k/locore.s:1.72 --- src/sys/arch/next68k/next68k/locore.s:1.71 Sat Feb 4 08:42:45 2023 +++ src/sys/arch/next68k/next68k/locore.s Sat Feb 11 02:31:34 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.s,v 1.71 2023/02/04 08:42:45 tsutsui Exp $ */ +/* $NetBSD: locore.s,v 1.72 2023/02/11 02:31:34 tsutsui Exp $ */ /* * Copyright (c) 1998 Darrin B. Jewell @@ -1076,17 +1076,17 @@ GLOBAL(intiobase) GLOBAL(intiolimit) .long INTIOTOP | KVA of end of internal IO space -GLOBAL(monobase) - .long MONOBASE | KVA of base of mono FB +GLOBAL(fbbase) + .long 0 | KVA of base of framebuffer -GLOBAL(monolimit) - .long MONOTOP | KVA of end of mono FB +GLOBAL(fblimit) + .long 0 | KVA of end of framebuffer -GLOBAL(colorbase) - .long COLORBASE | KVA of base of color FB +GLOBAL(fbbasepa) + .long MONOBASE | PA of base of framebuffer -GLOBAL(colorlimit) - .long COLORTOP | KVA of end of color FB +GLOBAL(fblimitpa) + .long MONOTOP | PA of end of framebuffer ASLOCAL(save_vbr) | VBR from ROM .long 0xdeadbeef Index: src/sys/arch/next68k/next68k/nextrom.c diff -u src/sys/arch/next68k/next68k/nextrom.c:1.27 src/sys/arch/next68k/next68k/nextrom.c:1.28 --- src/sys/arch/next68k/next68k/nextrom.c:1.27 Wed Jul 18 23:10:27 2018 +++ src/sys/arch/next68k/next68k/nextrom.c Sat Feb 11 02:31:34 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: nextrom.c,v 1.27 2018/07/18 23:10:27 sevan Exp $ */ +/* $NetBSD: nextrom.c,v 1.28 2023/02/11 02:31:34 tsutsui Exp $ */ /* * Copyright (c) 1998 Darrin B. Jewell * All rights reserved. @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nextrom.c,v 1.27 2018/07/18 23:10:27 sevan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nextrom.c,v 1.28 2023/02/11 02:31:34 tsutsui Exp $"); #include "opt_ddb.h" #include "opt_serial.h" @@ -35,6 +35,7 @@ __KERNEL_RCSID(0, "$NetBSD: nextrom.c,v #include <next68k/next68k/seglist.h> #include <next68k/next68k/nextrom.h> +#include <next68k/dev/intiovar.h> #ifdef DDB #include <sys/param.h> @@ -130,6 +131,7 @@ u_int rom_intrstat; paddr_t rom_reboot_vect; int turbo; +int iscolor; void next68k_bootargs(unsigned char **args) @@ -230,6 +232,8 @@ next68k_bootargs(unsigned char **args) int ix; int j = 0; char mach; + int turbo_l, iscolor_l; + paddr_t fbbasepa_l, fblimitpa_l; if (MONRELOC(char, MG_machine_type) == NeXT_X15) { msize16 = 0x1000000; @@ -267,9 +271,32 @@ next68k_bootargs(unsigned char **args) mach = MONRELOC(char, MG_machine_type); RELOC(rom_machine_type, char) = mach; if (mach == NeXT_TURBO_MONO || mach == NeXT_TURBO_COLOR) - RELOC(turbo, int) = 1; + turbo_l = 1; else - RELOC(turbo, int) = 0; + turbo_l = 0; + RELOC(turbo, int) = turbo_l; + + /* save framebuffer addresses for pmap_bootstrap() */ + if (mach == NeXT_WARP9C || mach == NeXT_TURBO_COLOR) + iscolor_l = 1; + else + iscolor_l = 0; + if (turbo_l == 1) { + fbbasepa_l = TURBOFBBASE; + fblimitpa_l = (iscolor_l == 1) ? + TURBOCOLORTOP : TURBOMONOTOP; + } else { + if (iscolor_l == 1) { + fbbasepa_l = COLORBASE; + fblimitpa_l = COLORTOP; + } else { + fbbasepa_l = MONOBASE; + fblimitpa_l = MONOTOP; + } + } + RELOC(iscolor, int) = iscolor_l; + RELOC(fbbasepa, paddr_t) = fbbasepa_l; + RELOC(fblimitpa, paddr_t) = fblimitpa_l; for (ix = 0; ix < N_SIMM; ix++) { Index: src/sys/arch/next68k/next68k/pmap_bootstrap.c diff -u src/sys/arch/next68k/next68k/pmap_bootstrap.c:1.46 src/sys/arch/next68k/next68k/pmap_bootstrap.c:1.47 --- src/sys/arch/next68k/next68k/pmap_bootstrap.c:1.46 Sat Feb 4 14:38:09 2023 +++ src/sys/arch/next68k/next68k/pmap_bootstrap.c Sat Feb 11 02:31:34 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_bootstrap.c,v 1.46 2023/02/04 14:38:09 tsutsui Exp $ */ +/* $NetBSD: pmap_bootstrap.c,v 1.47 2023/02/11 02:31:34 tsutsui Exp $ */ /* * This file was taken from mvme68k/mvme68k/pmap_bootstrap.c @@ -45,7 +45,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.46 2023/02/04 14:38:09 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.47 2023/02/11 02:31:34 tsutsui Exp $"); #include "opt_m68k_arch.h" @@ -108,6 +108,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t f #if defined(M68040) || defined(M68060) u_int stfree = 0; /* XXX: gcc -Wuninitialized */ #endif + u_int fbmapsize; /* * Initialize the mem_clusters[] array for the crash dump @@ -178,8 +179,9 @@ pmap_bootstrap(paddr_t nextpa, paddr_t f kptmpa = nextpa; nextpa += PAGE_SIZE; kptpa = nextpa; - nptpages = RELOC(Sysptsize, int) + howmany(RELOC(physmem, int), NPTEPG) + - (IIOMAPSIZE + MONOMAPSIZE + COLORMAPSIZE + NPTEPG - 1) / NPTEPG; + fbmapsize = btoc(RELOC(fblimitpa, paddr_t) - RELOC(fbbasepa, paddr_t)); + nptpages = RELOC(Sysptsize, int) + howmany(RELOC(physmem, int), NPTEPG) + + (IIOMAPSIZE + fbmapsize + NPTEPG - 1) / NPTEPG; nextpa += nptpages * PAGE_SIZE; /* @@ -416,29 +418,20 @@ pmap_bootstrap(paddr_t nextpa, paddr_t f protopte = INTIOBASE | PG_RW | PG_CI | PG_U | PG_M | PG_V; epte = &pte[IIOMAPSIZE]; - RELOC(intiobase, uint8_t *) = (uint8_t *)PTE2VA(pte); - RELOC(intiolimit, uint8_t *) = (uint8_t *)PTE2VA(epte); + RELOC(intiobase, vaddr_t) = PTE2VA(pte); + RELOC(intiolimit, vaddr_t) = PTE2VA(epte); while (pte < epte) { *pte++ = protopte; protopte += PAGE_SIZE; } - /* validate the mono fb space PTEs */ + /* validate the framebuffer space PTEs */ - protopte = MONOBASE | PG_RW | PG_CWT | PG_U | PG_M | PG_V; - epte = &pte[MONOMAPSIZE]; - RELOC(monobase, uint8_t *) = (uint8_t *)PTE2VA(pte); - RELOC(monolimit, uint8_t *) = (uint8_t *)PTE2VA(epte); - while (pte < epte) { - *pte++ = protopte; - protopte += PAGE_SIZE; - } - - /* validate the color fb space PTEs */ - protopte = COLORBASE | PG_RW | PG_CWT | PG_U | PG_M | PG_V; - epte = &pte[COLORMAPSIZE]; - RELOC(colorbase, uint8_t *) = (uint8_t *)PTE2VA(pte); - RELOC(colorlimit, uint8_t *) = (uint8_t *)PTE2VA(epte); + protopte = RELOC(fbbasepa, paddr_t) | + PG_RW | PG_CWT | PG_U | PG_M | PG_V; + epte = &pte[fbmapsize]; + RELOC(fbbase, vaddr_t) = PTE2VA(pte); + RELOC(fblimit, vaddr_t) = PTE2VA(epte); while (pte < epte) { *pte++ = protopte; protopte += PAGE_SIZE;