summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openbios/drivers/obio.c
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/openbios/drivers/obio.c')
-rw-r--r--qemu/roms/openbios/drivers/obio.c459
1 files changed, 0 insertions, 459 deletions
diff --git a/qemu/roms/openbios/drivers/obio.c b/qemu/roms/openbios/drivers/obio.c
deleted file mode 100644
index 4ac063188..000000000
--- a/qemu/roms/openbios/drivers/obio.c
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- * OpenBIOS Sparc OBIO driver
- *
- * (C) 2004 Stefan Reinauer <stepan@openbios.org>
- * (C) 2005 Ed Schouten <ed@fxq.nl>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2
- *
- */
-
-#include "config.h"
-#include "libopenbios/bindings.h"
-#include "kernel/kernel.h"
-#include "libc/byteorder.h"
-#include "libc/vsprintf.h"
-
-#include "drivers/drivers.h"
-#include "arch/common/nvram.h"
-#include "libopenbios/ofmem.h"
-#include "obio.h"
-#include "escc.h"
-
-#define PROMDEV_KBD 0 /* input from keyboard */
-#define PROMDEV_SCREEN 0 /* output to screen */
-#define PROMDEV_TTYA 1 /* in/out to ttya */
-
-
-void
-ob_new_obio_device(const char *name, const char *type)
-{
- push_str("/obio");
- fword("find-device");
- fword("new-device");
-
- push_str(name);
- fword("device-name");
-
- if (type) {
- push_str(type);
- fword("device-type");
- }
-}
-
-static unsigned long
-map_reg(uint64_t base, uint64_t offset, unsigned long size, int map,
- int phys_hi)
-{
- PUSH(phys_hi);
- fword("encode-int");
- PUSH(offset);
- fword("encode-int");
- fword("encode+");
- PUSH(size);
- fword("encode-int");
- fword("encode+");
- push_str("reg");
- fword("property");
-
- if (map) {
- unsigned long addr;
-
- addr = (unsigned long)ofmem_map_io(base + offset, size);
-
- PUSH(addr);
- fword("encode-int");
- push_str("address");
- fword("property");
- return addr;
- }
- return 0;
-}
-
-unsigned long
-ob_reg(uint64_t base, uint64_t offset, unsigned long size, int map)
-{
- return map_reg(base, offset, size, map, 0);
-}
-
-void
-ob_intr(int intr)
-{
- PUSH(intr);
- fword("encode-int");
- PUSH(0);
- fword("encode-int");
- fword("encode+");
- push_str("intr");
- fword("property");
-}
-
-void
-ob_eccmemctl_init(uint64_t base)
-{
- uint32_t version, *regs;
- const char *mc_type;
-
- push_str("/");
- fword("find-device");
- fword("new-device");
-
- push_str("eccmemctl");
- fword("device-name");
-
- PUSH(0x20);
- fword("encode-int");
- push_str("width");
- fword("property");
-
- regs = (uint32_t *)map_reg(ECC_BASE, 0, ECC_SIZE, 1, ECC_BASE >> 32);
-
- version = regs[0];
- switch (version) {
- case 0x00000000:
- mc_type = "MCC";
- break;
- case 0x10000000:
- mc_type = "EMC";
- break;
- default:
- case 0x20000000:
- mc_type = "SMC";
- break;
- }
- push_str(mc_type);
- fword("encode-string");
- push_str("mc-type");
- fword("property");
-
- fword("finish-device");
-}
-
-static unsigned char *nvram;
-
-#define NVRAM_OB_START (0)
-#define NVRAM_OB_SIZE ((NVRAM_IDPROM - NVRAM_OB_START) & ~15)
-
-void
-arch_nvram_get(char *data)
-{
- memcpy(data, &nvram[NVRAM_OB_START], NVRAM_OB_SIZE);
-}
-
-void
-arch_nvram_put(char *data)
-{
- memcpy(&nvram[NVRAM_OB_START], data, NVRAM_OB_SIZE);
-}
-
-int
-arch_nvram_size(void)
-{
- return NVRAM_OB_SIZE;
-}
-
-void
-ss5_init(uint64_t base)
-{
- ob_new_obio_device("slavioconfig", NULL);
-
- ob_reg(base, SLAVIO_SCONFIG, SCONFIG_REGS, 0);
-
- fword("finish-device");
-}
-
-static void
-ob_nvram_init(uint64_t base, uint64_t offset)
-{
- ob_new_obio_device("eeprom", NULL);
-
- nvram = (unsigned char *)ob_reg(base, offset, NVRAM_SIZE, 1);
-
- PUSH((unsigned long)nvram);
- fword("encode-int");
- push_str("address");
- fword("property");
-
- push_str("mk48t08");
- fword("model");
-
- fword("finish-device");
-
- // Add /idprom
- push_str("/");
- fword("find-device");
-
- PUSH((long)&nvram[NVRAM_IDPROM]);
- PUSH(32);
- fword("encode-bytes");
- push_str("idprom");
- fword("property");
-}
-
-static void
-ob_fd_init(uint64_t base, uint64_t offset, int intr)
-{
- unsigned long addr;
-
- ob_new_obio_device("SUNW,fdtwo", "block");
-
- addr = ob_reg(base, offset, FD_REGS, 1);
-
- ob_intr(intr);
-
- fword("is-deblocker");
-
- ob_floppy_init("/obio", "SUNW,fdtwo", 0, addr);
-
- fword("finish-device");
-}
-
-static void
-ob_auxio_init(uint64_t base, uint64_t offset)
-{
- ob_new_obio_device("auxio", NULL);
-
- ob_reg(base, offset, AUXIO_REGS, 1);
-
- fword("finish-device");
-}
-
-volatile unsigned char *power_reg;
-volatile unsigned int *reset_reg;
-
-static void
-sparc32_reset_all(void)
-{
- *reset_reg = 1;
-}
-
-// AUX 2 (Software Powerdown Control) and reset
-static void
-ob_aux2_reset_init(uint64_t base, uint64_t offset, int intr)
-{
- ob_new_obio_device("power", NULL);
-
- power_reg = (void *)ob_reg(base, offset, AUXIO2_REGS, 1);
-
- // Not in device tree
- reset_reg = (unsigned int *)ofmem_map_io(base + (uint64_t)SLAVIO_RESET, RESET_REGS);
-
- bind_func("sparc32-reset-all", sparc32_reset_all);
- push_str("' sparc32-reset-all to reset-all");
- fword("eval");
-
- ob_intr(intr);
-
- fword("finish-device");
-}
-
-volatile struct sun4m_timer_regs *counter_regs;
-
-static void
-ob_counter_init(uint64_t base, unsigned long offset, int ncpu)
-{
- int i;
-
- ob_new_obio_device("counter", NULL);
-
- for (i = 0; i < ncpu; i++) {
- PUSH(0);
- fword("encode-int");
- if (i != 0) fword("encode+");
- PUSH(offset + (i * PAGE_SIZE));
- fword("encode-int");
- fword("encode+");
- PUSH(COUNTER_REGS);
- fword("encode-int");
- fword("encode+");
- }
-
- PUSH(0);
- fword("encode-int");
- fword("encode+");
- PUSH(offset + 0x10000);
- fword("encode-int");
- fword("encode+");
- PUSH(COUNTER_REGS);
- fword("encode-int");
- fword("encode+");
-
- push_str("reg");
- fword("property");
-
-
- counter_regs = (struct sun4m_timer_regs *)ofmem_map_io(base + (uint64_t)offset, sizeof(*counter_regs));
- counter_regs->cfg = 0xfffffffe;
- counter_regs->l10_timer_limit = 0;
- counter_regs->cpu_timers[0].l14_timer_limit = 0x9c4000; /* see comment in obio.h */
- counter_regs->cpu_timers[0].cntrl = 1;
-
- for (i = 0; i < ncpu; i++) {
- PUSH((unsigned long)&counter_regs->cpu_timers[i]);
- fword("encode-int");
- if (i != 0)
- fword("encode+");
- }
- PUSH((unsigned long)&counter_regs->l10_timer_limit);
- fword("encode-int");
- fword("encode+");
- push_str("address");
- fword("property");
-
- fword("finish-device");
-}
-
-static volatile struct sun4m_intregs *intregs;
-
-static void
-ob_interrupt_init(uint64_t base, unsigned long offset, int ncpu)
-{
- int i;
-
- ob_new_obio_device("interrupt", NULL);
-
- for (i = 0; i < ncpu; i++) {
- PUSH(0);
- fword("encode-int");
- if (i != 0) fword("encode+");
- PUSH(offset + (i * PAGE_SIZE));
- fword("encode-int");
- fword("encode+");
- PUSH(INTERRUPT_REGS);
- fword("encode-int");
- fword("encode+");
- }
-
- PUSH(0);
- fword("encode-int");
- fword("encode+");
- PUSH(offset + 0x10000);
- fword("encode-int");
- fword("encode+");
- PUSH(INTERRUPT_REGS);
- fword("encode-int");
- fword("encode+");
-
- push_str("reg");
- fword("property");
-
- intregs = (struct sun4m_intregs *)ofmem_map_io(base | (uint64_t)offset, sizeof(*intregs));
- intregs->clear = ~SUN4M_INT_MASKALL;
- intregs->cpu_intregs[0].clear = ~0x17fff;
-
- for (i = 0; i < ncpu; i++) {
- PUSH((unsigned long)&intregs->cpu_intregs[i]);
- fword("encode-int");
- if (i != 0)
- fword("encode+");
- }
- PUSH((unsigned long)&intregs->tbt);
- fword("encode-int");
- fword("encode+");
- push_str("address");
- fword("property");
-
- fword("finish-device");
-}
-
-/* SMP CPU boot structure */
-struct smp_cfg {
- uint32_t smp_ctx;
- uint32_t smp_ctxtbl;
- uint32_t smp_entry;
- uint32_t valid;
-};
-
-static struct smp_cfg *smp_header;
-
-int
-start_cpu(unsigned int pc, unsigned int context_ptr, unsigned int context, int cpu)
-{
- if (!cpu)
- return -1;
-
- cpu &= 7;
-
- smp_header->smp_entry = pc;
- smp_header->smp_ctxtbl = context_ptr;
- smp_header->smp_ctx = context;
- smp_header->valid = cpu;
-
- intregs->cpu_intregs[cpu].set = SUN4M_SOFT_INT(14);
-
- return 0;
-}
-
-static void
-ob_smp_init(unsigned long mem_size)
-{
- // See arch/sparc32/entry.S for memory layout
- smp_header = (struct smp_cfg *)ofmem_map_io((uint64_t)(mem_size - 0x100),
- sizeof(struct smp_cfg));
-}
-
-static void
-ob_set_obio_ranges(uint64_t base)
-{
- push_str("/obio");
- fword("find-device");
- PUSH(0);
- fword("encode-int");
- PUSH(0);
- fword("encode-int");
- fword("encode+");
- PUSH(base >> 32);
- fword("encode-int");
- fword("encode+");
- PUSH(base & 0xffffffff);
- fword("encode-int");
- fword("encode+");
- PUSH(SLAVIO_SIZE);
- fword("encode-int");
- fword("encode+");
- push_str("ranges");
- fword("property");
-}
-
-
-int
-ob_obio_init(uint64_t slavio_base, unsigned long fd_offset,
- unsigned long counter_offset, unsigned long intr_offset,
- int intr_ncpu, unsigned long aux1_offset, unsigned long aux2_offset,
- unsigned long mem_size)
-{
-
- // All devices were integrated to NCR89C105, see
- // http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt
-
- //printk("Initializing OBIO devices...\n");
- ob_set_obio_ranges(slavio_base);
-
- // Zilog Z8530 serial ports, see http://www.zilog.com
- // Must be before zs@0,0 or Linux won't boot
- ob_zs_init(slavio_base, SLAVIO_ZS1, ZS_INTR, 0, 0);
-
- ob_zs_init(slavio_base, SLAVIO_ZS, ZS_INTR, 1, 1);
-
- // M48T08 NVRAM, see http://www.st.com
- ob_nvram_init(slavio_base, SLAVIO_NVRAM);
-
- // 82078 FDC
- if (fd_offset != (unsigned long) -1)
- ob_fd_init(slavio_base, fd_offset, FD_INTR);
-
- ob_auxio_init(slavio_base, aux1_offset);
-
- if (aux2_offset != (unsigned long) -1)
- ob_aux2_reset_init(slavio_base, aux2_offset, AUXIO2_INTR);
-
- ob_counter_init(slavio_base, counter_offset, intr_ncpu);
-
- ob_interrupt_init(slavio_base, intr_offset, intr_ncpu);
-
- ob_smp_init(mem_size);
-
- return 0;
-}