/* $NetBSD: c_nec_eisa.c,v 1.18 2018/02/08 09:05:17 dholland Exp $ */ /*- * Copyright (c) 2003 Izumi Tsutsui. 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. * * 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. */ /*- * Copyright (C) 2000 Shuichiro URATA. 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. 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. */ /* * for NEC EISA generation machines. */ #include __KERNEL_RCSID(0, "$NetBSD: c_nec_eisa.c,v 1.18 2018/02/08 09:05:17 dholland Exp $"); #define __INTR_PRIVATE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "vga_isa.h" #if NVGA_ISA > 0 #include #include #include #include #ifdef VGA_RESET static void gd54xx_initregs(struct vga_handle *); #endif #endif /* * chipset-dependent isa bus configuration */ int isabr_nec_eisa_intr_status(void); struct isabr_config isabr_nec_eisa_conf = { isabr_nec_eisa_intr_status, }; /* * This is a mask of bits to clear in the SR when we go to a * given interrupt priority level. */ static const struct ipl_sr_map nec_eisa_ipl_sr_map = { .sr_bits = { [IPL_NONE] = 0, [IPL_SOFTCLOCK] = MIPS_SOFT_INT_MASK_0, [IPL_SOFTNET] = MIPS_SOFT_INT_MASK, [IPL_VM] = MIPS_SOFT_INT_MASK | MIPS_INT_MASK_0 | MIPS_INT_MASK_1 | MIPS_INT_MASK_2, [IPL_SCHED] = MIPS_INT_MASK, [IPL_DDB] = MIPS_INT_MASK, [IPL_HIGH] = MIPS_INT_MASK, }, }; int isabr_nec_eisa_intr_status(void) { return in32(RD94_SYS_INTSTAT2) & (ICU_LEN - 1); } /* * chipset-dependent jazzio bus configuration */ void jazzio_nec_eisa_set_iointr_mask(int); struct jazzio_config jazzio_nec_eisa_conf = { RD94_SYS_INTSTAT1, jazzio_nec_eisa_set_iointr_mask, RD94_SYS_TL_BASE, RD94_SYS_DMA0_REGS, }; void jazzio_nec_eisa_set_iointr_mask(int mask) { out16(RD94_SYS_LB_IE2, mask); } /* * critial i/o space, interrupt, and other chipset related initialization. */ void c_nec_eisa_init(void) { /* * Initialize interrupt priority */ ipl_sr_map = nec_eisa_ipl_sr_map; /* * Initialize I/O address offset */ arc_bus_space_init(&jazzio_bus, "jazzio", RD94_P_LOCAL_IO_BASE, RD94_V_LOCAL_IO_BASE, RD94_V_LOCAL_IO_BASE, RD94_S_LOCAL_IO_BASE); arc_bus_space_init(&arc_bus_io, "r94eisaio", RD94_P_PCI_IO, RD94_V_EISA_IO, 0, RD94_S_EISA_IO); arc_bus_space_init(&arc_bus_mem, "r94eisamem", RD94_P_PCI_MEM, RD94_V_EISA_MEM, 0, RD94_S_EISA_MEM); /* * Initialize wired TLB for I/O space which is used on early stage */ arc_init_wired_map(); arc_wired_enter_page(RD94_V_LOCAL_IO_BASE, RD94_P_LOCAL_IO_BASE, RD94_S_LOCAL_IO_BASE); arc_wired_enter_page(RD94_V_EISA_IO, RD94_P_EISA_IO, RD94_S_EISA_IO); arc_wired_enter_page(RD94_V_EISA_MEM, RD94_P_EISA_MEM, MIPS3_PG_SIZE_MASK_TO_SIZE(MIPS3_PG_SIZE_16M)); /* * Disable all interrupts. New masks will be set up * during system configuration */ out16(RD94_SYS_LB_IE1, 0); out16(RD94_SYS_LB_IE2, 0); out32(RD94_SYS_EXT_IMASK, 0); /* * common configuration between NEC EISA and PCI platforms */ c_nec_jazz_init(); /* common configuration for Magnum derived and NEC EISA machines */ c_jazz_eisa_init(); /* chipset-dependent isa bus configuration */ isabr_conf = &isabr_nec_eisa_conf; /* chipset-dependent jazzio bus configuration */ jazzio_conf = &jazzio_nec_eisa_conf; } void c_nec_eisa_cons_init(void) { #if NVGA_ISA > 0 if (!com_console) { if (strcmp(arc_displayc_id, "necvdfrb") == 0) { /* NEC RISCserver 2200 R4400 EISA [NEC-R96] */ /* NEC Express5800/240 R4400 EISA [NEC-J96A] */ #ifdef VGA_RESET struct vga_handle handle; handle.vh_memt = &arc_bus_mem; handle.vh_iot = &arc_bus_io; vga_reset(&handle, gd54xx_initregs); #endif vga_no_builtinfont = 1; } } #endif c_jazz_eisa_cons_init(); } #if NVGA_ISA > 0 && defined(VGA_RESET) /* values to initialize cirrus GD54xx specific ext registers */ /* XXX these values are taken from PC XXX */ static const uint8_t vga_ts_gd54xx[] = { 0x0f, /* 05: ??? */ 0x12, /* 06: enable ext reg (?) */ 0x00, /* 07: reset ext sequence (?) */ 0x00, /* 08: ??? */ 0x5c, /* 09: ??? */ 0x09, /* 0A: BIOS Scratch register for 542x (?) */ 0x4a, /* 0B: ??? */ 0x5b, /* 0C: ??? */ 0x42, /* 0D: VCLK2 frequency */ 0x00, /* 0E: VCLK3 frequency */ 0x09, /* 0F: ??? */ 0x00, /* 10: ??? */ 0x00, /* 11: ??? */ 0x00, /* 12: ??? */ 0x00, /* 13: ??? */ 0x00, /* 14: BIOS scratch register for 546x (?) */ 0x00, /* 15: ??? */ 0xd8, /* 16: ??? */ 0x39, /* 17: ??? */ 0x00, /* 18: ??? */ 0x01, /* 19: ??? */ 0x00, /* 1A: ??? */ 0x2b, /* 1B: ??? */ 0x2f, /* 1C: ??? */ 0x1f, /* 1D: VCLK2 denominator and post-scalar value */ 0x00, /* 1E: VCLK3 denominator and post-scalar value */ 0x19 /* 1F: MCLK (?) */ }; static void gd54xx_initregs(struct vga_handle *vh) { int i; /* disable video */ vga_ts_write(vh, mode, vga_ts_read(vh, mode) | VGA_TS_MODE_BLANK); /* enable access to GD54xx ext regs */ _vga_ts_write(vh, 0x06, 0x12); /* setup GD54xx ext regs */ for (i = 0; i < sizeof(vga_ts_gd54xx); i++) _vga_ts_write(vh, VGA_TS_NREGS + i, vga_ts_gd54xx[i]); /* disable access to GD54xx ext regs */ _vga_ts_write(vh, 0x06, 0x0); /* reenable video */ vga_ts_write(vh, mode, vga_ts_read(vh, mode) & ~VGA_TS_MODE_BLANK); } #endif