#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: c_nec_pci.c,v 1.21 2021/09/19 10:34:07 andvar Exp $");
#define __INTR_PRIVATE
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kcore.h>
#include <sys/device.h>
#include <sys/intr.h>
#include <uvm/uvm_extern.h>
#include <machine/autoconf.h>
#include <sys/bus.h>
#include <machine/pio.h>
#include <machine/platform.h>
#include <machine/wired_map.h>
#include <mips/pte.h>
#include <dev/clock_subr.h>
#include <dev/ic/mc146818var.h>
#include <dev/pci/pcivar.h>
#include <arc/arc/arcbios.h>
#include <arc/jazz/pica.h>
#include <arc/jazz/rd94.h>
#include <arc/jazz/jazziovar.h>
#include <arc/jazz/mcclock_jazziovar.h>
#include <arc/pci/necpbvar.h>
#include "tga.h"
#if NTGA > 0
#include <dev/pci/tgavar.h>
#endif
#include "vga_pci.h"
#if NVGA_PCI > 0
#include <dev/pci/vga_pcivar.h>
#endif
#include "rasdisplay_jazzio.h"
#if NRASDISPLAY_JAZZIO > 0
#include <arc/jazz/rasdisplay_jazziovar.h>
#endif
#include "pckbc_jazzio.h"
#if NPCKBC_JAZZIO > 0
#include <dev/ic/pckbcvar.h>
#include <arc/jazz/pckbc_jazzioreg.h>
#endif
#include "com.h"
#if NCOM > 0
#include <sys/termios.h>
#include <dev/ic/comreg.h>
#include <dev/ic/comvar.h>
#endif
const char *c_nec_pci_mainbusdevs[] = {
"jazzio",
"necpb",
NULL,
};
static u_int mc_nec_pci_read(struct mc146818_softc *, u_int);
static void mc_nec_pci_write(struct mc146818_softc *, u_int, u_int);
struct mcclock_jazzio_config mcclock_nec_pci_conf = {
0x80004000,
2,
mc_nec_pci_read,
mc_nec_pci_write
};
static const struct ipl_sr_map nec_pci_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,
},
};
static u_int
mc_nec_pci_read(struct mc146818_softc *sc, u_int reg)
{
u_int i, as;
as = bus_space_read_1(sc->sc_bst, sc->sc_bsh, 1) & 0x80;
bus_space_write_1(sc->sc_bst, sc->sc_bsh, 1, as | reg);
i = bus_space_read_1(sc->sc_bst, sc->sc_bsh, 0);
return i;
}
static void
mc_nec_pci_write(struct mc146818_softc *sc, u_int reg, u_int datum)
{
u_int as;
as = bus_space_read_1(sc->sc_bst, sc->sc_bsh, 1) & 0x80;
bus_space_write_1(sc->sc_bst, sc->sc_bsh, 1, as | reg);
bus_space_write_1(sc->sc_bst, sc->sc_bsh, 0, datum);
}
void jazzio_nec_pci_set_iointr_mask(int);
struct jazzio_config jazzio_nec_pci_conf = {
RD94_SYS_INTSTAT1,
jazzio_nec_pci_set_iointr_mask,
RD94_SYS_TL_BASE,
RD94_SYS_DMA0_REGS,
};
void
jazzio_nec_pci_set_iointr_mask(int mask)
{
if (in32(RD94_V_LOCAL_IO_BASE + 0x560) != 0)
out16(RD94_SYS_LB_IE2, mask);
else
out16(RD94_SYS_LB_IE1, mask);
}
void
c_nec_pci_init(void)
{
ipl_sr_map = nec_pci_ipl_sr_map;
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, "rd94pciio",
RD94_P_PCI_IO, RD94_V_PCI_IO, 0, RD94_S_PCI_IO);
arc_bus_space_init(&arc_bus_mem, "rd94pcimem",
RD94_P_PCI_MEM, RD94_V_PCI_MEM, 0, RD94_S_PCI_MEM);
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_PCI_IO, RD94_P_PCI_IO, RD94_S_PCI_IO);
arc_wired_enter_page(RD94_V_PCI_MEM, RD94_P_PCI_MEM, RD94_S_PCI_IO);
kseg2iobufsize = 0x02000000;
out16(RD94_SYS_LB_IE1, 0);
out16(RD94_SYS_LB_IE2, 0);
out32(RD94_SYS_EXT_IMASK, 0);
c_nec_jazz_init();
mcclock_jazzio_conf = &mcclock_nec_pci_conf;
jazzio_conf = &jazzio_nec_pci_conf;
}
void
c_nec_pci_cons_init(void)
{
if (!com_console) {
if (strcmp(arc_displayc_id, "10110004") == 0) {
#if NTGA > 0
necpb_init(&necpb_main_context);
if (tga_cnattach(&necpb_main_context.nc_iot,
&necpb_main_context.nc_memt,
&necpb_main_context.nc_pc, 0, 3, 0) == 0) {
#if NPCKBC_JAZZIO > 0
pckbc_cnattach(&jazzio_bus, PICA_SYS_KBD,
JAZZIO_KBCMDP, PCKBC_KBD_SLOT, 0);
#endif
return;
}
#endif
} else if (strcmp(arc_displayc_id, "53335631") == 0
|| strcmp(arc_displayc_id, "3D3D0001") == 0
) {
#if NVGA_PCI > 0
necpb_init(&necpb_main_context);
if (vga_pci_cnattach(&necpb_main_context.nc_iot,
&necpb_main_context.nc_memt,
&necpb_main_context.nc_pc, 0, 3, 0) == 0) {
#if NPCKBC_JAZZIO > 0
pckbc_cnattach(&jazzio_bus, PICA_SYS_KBD,
JAZZIO_KBCMDP, PCKBC_KBD_SLOT, 0);
#endif
return;
}
#endif
} else {
printf("nec_pci: unknown display controller [%s]\n",
arc_displayc_id);
}
}
#if NCOM > 0
if (com_console_address == 0)
com_console_address = RD94_SYS_COM1;
comcnattach(&jazzio_bus, com_console_address,
com_console_speed, com_freq, COM_TYPE_NORMAL, com_console_mode);
#endif
}