merge more sparc32 code from: Blue Swirl <blueswir1@hotmail.com>

git-svn-id: svn://coreboot.org/openbios/openbios-devel@16 f158a5a8-5612-0410-a976-696ce0be7e32
This commit is contained in:
Blue Swirl
2006-05-10 23:00:34 +00:00
committed by Stefan Reinauer
parent d421756207
commit db8e7fe92a
16 changed files with 782 additions and 44 deletions

View File

@@ -20,6 +20,7 @@
<object source="elfload.c"/> <object source="elfload.c"/>
<object source="forthload.c"/> <object source="forthload.c"/>
<object source="loadfs.c"/> <object source="loadfs.c"/>
<object source="romvec.c"/>
</library> </library>
<executable name="target/arch/sparc32/entry.o" target="target"> <executable name="target/arch/sparc32/entry.o" target="target">

View File

@@ -369,7 +369,22 @@ int elf_load(struct sys_info *info, const char *filename, const char *cmdline)
debug("entry point is %#x\n", addr_fixup(ehdr.e_entry)); debug("entry point is %#x\n", addr_fixup(ehdr.e_entry));
printf("Jumping to entry point...\n"); printf("Jumping to entry point...\n");
#if 1
{
extern unsigned int qemu_mem_size;
void *init_openprom(unsigned long memsize, const char *cmdline, char boot_device);
int (*entry)(const void *romvec, int p2, int p3, int p4, int p5);
const void *romvec;
romvec = init_openprom(qemu_mem_size, NULL, 'c');
entry = (void *) addr_fixup(ehdr.e_entry);
image_retval = entry(romvec, 0, 0, 0, 0);
}
#else
image_retval = start_elf(addr_fixup(ehdr.e_entry), virt_to_phys(boot_notes)); image_retval = start_elf(addr_fixup(ehdr.e_entry), virt_to_phys(boot_notes));
#endif
// console_init(); FIXME // console_init(); FIXME
printf("Image returned with return value %#x\n", image_retval); printf("Image returned with return value %#x\n", image_retval);

View File

@@ -23,6 +23,8 @@ static char intdict[256 * 1024];
static void init_memory(void) static void init_memory(void)
{ {
extern char _heap, _eheap;
/* push start and end of available memory to the stack /* push start and end of available memory to the stack
* so that the forth word QUIT can initialize memory * so that the forth word QUIT can initialize memory
* management. For now we use hardcoded memory between * management. For now we use hardcoded memory between
@@ -30,8 +32,8 @@ static void init_memory(void)
* than that we have serious bloat. * than that we have serious bloat.
*/ */
PUSH(0x10000); PUSH((unsigned int)&_heap);
PUSH(0x9FFFF); PUSH((unsigned int)&_eheap);
} }
void exception(cell no) void exception(cell no)

257
arch/sparc32/openprom.h Normal file
View File

@@ -0,0 +1,257 @@
#ifndef __SPARC_OPENPROM_H
#define __SPARC_OPENPROM_H
/* openprom.h: Prom structures and defines for access to the OPENBOOT
* prom routines and data areas.
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
*/
// #include <asm/vaddrs.h>
/* Empirical constants... */
#define LINUX_OPPROM_MAGIC 0x10010407
#ifndef __ASSEMBLY__
/* V0 prom device operations. */
struct linux_dev_v0_funcs {
int (*v0_devopen)(char *device_str);
int (*v0_devclose)(int dev_desc);
int (*v0_rdblkdev)(int dev_desc, int num_blks, int blk_st, char *buf);
int (*v0_wrblkdev)(int dev_desc, int num_blks, int blk_st, char *buf);
int (*v0_wrnetdev)(int dev_desc, int num_bytes, char *buf);
int (*v0_rdnetdev)(int dev_desc, int num_bytes, char *buf);
int (*v0_rdchardev)(int dev_desc, int num_bytes, int dummy, char *buf);
int (*v0_wrchardev)(int dev_desc, int num_bytes, int dummy, char *buf);
int (*v0_seekdev)(int dev_desc, long logical_offst, int from);
};
/* V2 and later prom device operations. */
struct linux_dev_v2_funcs {
int (*v2_inst2pkg)(int d); /* Convert ihandle to phandle */
char * (*v2_dumb_mem_alloc)(char *va, unsigned sz);
void (*v2_dumb_mem_free)(char *va, unsigned sz);
/* To map devices into virtual I/O space. */
char * (*v2_dumb_mmap)(char *virta, int which_io, unsigned paddr, unsigned sz);
void (*v2_dumb_munmap)(char *virta, unsigned size);
int (*v2_dev_open)(char *devpath);
void (*v2_dev_close)(int d);
int (*v2_dev_read)(int d, char *buf, int nbytes);
int (*v2_dev_write)(int d, char *buf, int nbytes);
int (*v2_dev_seek)(int d, int hi, int lo);
/* Never issued (multistage load support) */
void (*v2_wheee2)(void);
void (*v2_wheee3)(void);
};
struct linux_mlist_v0 {
struct linux_mlist_v0 *theres_more;
char *start_adr;
unsigned num_bytes;
};
struct linux_mem_v0 {
struct linux_mlist_v0 * const *v0_totphys;
struct linux_mlist_v0 * const *v0_prommap;
struct linux_mlist_v0 * const *v0_available; /* What we can use */
};
/* Arguments sent to the kernel from the boot prompt. */
struct linux_arguments_v0 {
const char *argv[8];
char args[100];
char boot_dev[2];
int boot_dev_ctrl;
int boot_dev_unit;
int dev_partition;
const char *kernel_file_name;
void *aieee1; /* XXX */
};
/* V2 and up boot things. */
struct linux_bootargs_v2 {
const char **bootpath;
const char **bootargs;
const int *fd_stdin;
const int *fd_stdout;
};
/* The top level PROM vector. */
struct linux_romvec {
/* Version numbers. */
unsigned int pv_magic_cookie;
unsigned int pv_romvers;
unsigned int pv_plugin_revision;
unsigned int pv_printrev;
/* Version 0 memory descriptors. */
struct linux_mem_v0 pv_v0mem;
/* Node operations. */
const struct linux_nodeops *pv_nodeops;
char **pv_bootstr;
struct linux_dev_v0_funcs pv_v0devops;
const char *pv_stdin;
const char *pv_stdout;
#define PROMDEV_KBD 0 /* input from keyboard */
#define PROMDEV_SCREEN 0 /* output to screen */
#define PROMDEV_TTYA 1 /* in/out to ttya */
#define PROMDEV_TTYB 2 /* in/out to ttyb */
/* Blocking getchar/putchar. NOT REENTRANT! (grr) */
int (*pv_getchar)(void);
void (*pv_putchar)(int ch);
/* Non-blocking variants. */
int (*pv_nbgetchar)(void);
int (*pv_nbputchar)(int ch);
void (*pv_putstr)(char *str, int len);
/* Miscellany. */
void (*pv_reboot)(char *bootstr);
void (*pv_printf)(__const__ char *fmt, ...);
void (*pv_abort)(void);
__volatile__ int *pv_ticks;
void (*pv_halt)(void);
void (**pv_synchook)(void);
/* Evaluate a forth string, not different proto for V0 and V2->up. */
union {
void (*v0_eval)(int len, char *str);
void (*v2_eval)(char *str);
} pv_fortheval;
const struct linux_arguments_v0 * const *pv_v0bootargs;
/* Get ether address. */
unsigned int (*pv_enaddr)(int d, char *enaddr);
struct linux_bootargs_v2 pv_v2bootargs;
struct linux_dev_v2_funcs pv_v2devops;
int filler[15];
/* This one is sun4c/sun4 only. */
void (*pv_setctxt)(int ctxt, char *va, int pmeg);
/* Prom version 3 Multiprocessor routines. This stuff is crazy.
* No joke. Calling these when there is only one cpu probably
* crashes the machine, have to test this. :-)
*/
/* v3_cpustart() will start the cpu 'whichcpu' in mmu-context
* 'thiscontext' executing at address 'prog_counter'
*/
int (*v3_cpustart)(unsigned int whichcpu, int ctxtbl_ptr,
int thiscontext, char *prog_counter);
/* v3_cpustop() will cause cpu 'whichcpu' to stop executing
* until a resume cpu call is made.
*/
int (*v3_cpustop)(unsigned int whichcpu);
/* v3_cpuidle() will idle cpu 'whichcpu' until a stop or
* resume cpu call is made.
*/
int (*v3_cpuidle)(unsigned int whichcpu);
/* v3_cpuresume() will resume processor 'whichcpu' executing
* starting with whatever 'pc' and 'npc' were left at the
* last 'idle' or 'stop' call.
*/
int (*v3_cpuresume)(unsigned int whichcpu);
};
/* Routines for traversing the prom device tree. */
struct linux_nodeops {
int (*no_nextnode)(int node);
int (*no_child)(int node);
int (*no_proplen)(int node, char *name);
int (*no_getprop)(int node, char *name, char *val);
int (*no_setprop)(int node, char *name, char *val, int len);
const char * (*no_nextprop)(int node, char *name);
};
/* More fun PROM structures for device probing. */
#define PROMREG_MAX 16
#define PROMVADDR_MAX 16
#define PROMINTR_MAX 15
struct linux_prom_registers {
unsigned int which_io; /* is this in OBIO space? */
unsigned int phys_addr; /* The physical address of this register */
unsigned int reg_size; /* How many bytes does this register take up? */
};
struct linux_prom_irqs {
int pri; /* IRQ priority */
int vector; /* This is foobar, what does it do? */
};
/* Element of the "ranges" vector */
struct linux_prom_ranges {
unsigned int ot_child_space;
unsigned int ot_child_base; /* Bus feels this */
unsigned int ot_parent_space;
unsigned int ot_parent_base; /* CPU looks from here */
unsigned int or_size;
};
/* Ranges and reg properties are a bit different for PCI. */
struct linux_prom_pci_registers {
/*
* We don't know what information this field contain.
* We guess, PCI device function is in bits 15:8
* So, ...
*/
unsigned int which_io; /* Let it be which_io */
unsigned int phys_hi;
unsigned int phys_lo;
unsigned int size_hi;
unsigned int size_lo;
};
struct linux_prom_pci_ranges {
unsigned int child_phys_hi; /* Only certain bits are encoded here. */
unsigned int child_phys_mid;
unsigned int child_phys_lo;
unsigned int parent_phys_hi;
unsigned int parent_phys_lo;
unsigned int size_hi;
unsigned int size_lo;
};
struct linux_prom_pci_assigned_addresses {
unsigned int which_io;
unsigned int phys_hi;
unsigned int phys_lo;
unsigned int size_hi;
unsigned int size_lo;
};
struct linux_prom_ebus_ranges {
unsigned int child_phys_hi;
unsigned int child_phys_lo;
unsigned int parent_phys_hi;
unsigned int parent_phys_mid;
unsigned int parent_phys_lo;
unsigned int size;
};
#endif /* !(__ASSEMBLY__) */
#endif /* !(__SPARC_OPENPROM_H) */

440
arch/sparc32/romvec.c Normal file
View File

@@ -0,0 +1,440 @@
/*
* PROM interface support
* Copyright 1996 The Australian National University.
* Copyright 1996 Fujitsu Laboratories Limited
* Copyright 1999 Pete A. Zaitcev
* This software may be distributed under the terms of the Gnu
* Public License version 2 or later
*/
#include "openprom.h"
#include "stdint.h"
#include "asm/io.h"
#include "asm/types.h"
#include "libc/vsprintf.h"
#include "openbios/config.h"
#include "openbios/bindings.h"
#include "openbios/kernel.h"
#include "openbios/sysinclude.h"
//#define DEBUG_OBP
#ifdef DEBUG_OBP
#define DPRINTF(fmt, args...) \
do { printk(fmt , ##args); } while (0)
#else
#define DPRINTF(fmt, args...)
#endif
#define PAGE_SIZE 4096
static struct linux_mlist_v0 totphys[1];
static struct linux_mlist_v0 totmap[1];
static struct linux_mlist_v0 totavail[1];
static struct linux_mlist_v0 *ptphys;
static struct linux_mlist_v0 *ptmap;
static struct linux_mlist_v0 *ptavail;
static char obp_stdin, obp_stdout;
static int obp_fd_stdin, obp_fd_stdout;
static int obp_nextnode(int node);
static int obp_child(int node);
static int obp_proplen(int node, char *name);
static int obp_getprop(int node, char *name, char *val);
static int obp_setprop(int node, char *name, char *val, int len);
static const char *obp_nextprop(int node, char *name);
static const struct linux_nodeops nodeops0 = {
obp_nextnode, /* int (*no_nextnode)(int node); */
obp_child, /* int (*no_child)(int node); */
obp_proplen, /* int (*no_proplen)(int node, char *name); */
obp_getprop, /* int (*no_getprop)(int node,char *name,char *val); */
obp_setprop, /* int (*no_setprop)(int node, char *name,
char *val, int len); */
obp_nextprop /* char * (*no_nextprop)(int node, char *name); */
};
static struct linux_arguments_v0 obp_arg;
static const struct linux_arguments_v0 * const obp_argp = &obp_arg;
static void (*synch_hook)(void);
static struct linux_romvec romvec0;
static int prop_mem_reg[3];
static int prop_mem_avail[3];
static int prop_vmem_avail[6];
static void doublewalk(unsigned ptab1, unsigned va)
{
}
static int obp_nextnode(int node)
{
int peer;
PUSH(node);
fword("peer");
peer = POP();
DPRINTF("obp_nextnode(%x) = %x\n", node, peer);
return peer;
}
static int obp_child(int node)
{
int child;
PUSH(node);
fword("child");
child = POP();
DPRINTF("obp_child(%x) = %x\n", node, child);
return child;
}
static int obp_proplen(int node, char *name)
{
int notfound;
push_str(name);
PUSH(node);
fword("get-package-property");
notfound = POP();
if (notfound) {
DPRINTF("obp_proplen(%x, %s) (not found)\n", node, name);
(void) POP();
(void) POP();
return -1;
} else {
int len;
len = POP();
(void) POP();
DPRINTF("obp_proplen(%x, %s) = %d\n", node, name, len);
return len;
}
}
static int obp_getprop(int node, char *name, char *value)
{
int notfound;
if (!name) {
// NULL name means get first property
name = "NULL";
push_str("");
PUSH(node);
fword("next-property");
notfound = POP();
notfound = !notfound; // Different return value
} else {
push_str(name);
PUSH(node);
fword("get-package-property");
notfound = POP();
}
if (notfound) {
DPRINTF("obp_getprop(%x, %s) (not found)\n", node, name);
(void) POP();
(void) POP();
return -1;
} else {
int len;
char *str;
len = POP();
str = (char *) POP();
memcpy(value, str, len);
DPRINTF("obp_getprop(%x, %s) = %s\n", node, name, str);
return len;
}
}
static int obp_setprop(__attribute__((unused)) int node,
__attribute__((unused)) char *name,
__attribute__((unused)) char *value,
__attribute__((unused)) int len)
{
DPRINTF("obp_setprop(%x, %s) = %s (%d)\n", node, name, value, len);
return -1;
}
static const char *obp_nextprop(int node, char *name)
{
if (!name || *name == '\0') {
// NULL name means get first property
DPRINTF("obp_nextprop(%x, NULL)\n", node);
return 0;
}
DPRINTF("obp_nextprop(%x, %s)\n", node, name);
return 0;
}
static int obp_nbgetchar(void)
{
return 0;
}
static int obp_nbputchar(int ch)
{
putchar(ch);
return 0;
}
static void obp_reboot(char *str)
{
printk("rebooting (%s)\n", str);
outb(0x71f00000, 1);
for (;;) {}
}
static void obp_abort()
{
printk("abort, power off\n");
outb(0x71910000, 1);
for (;;) {}
}
static void obp_halt()
{
printk("halt, power off\n");
outb(0x71910000, 1);
for (;;) {}
}
static int obp_devopen(char *str)
{
DPRINTF("obp_devopen(%s)\n", str);
return 0;
}
static int obp_devclose(__attribute__((unused)) int dev_desc)
{
DPRINTF("obp_devclose %x\n", dev_desc);
return 0;
}
static int obp_rdblkdev(int dev_desc, int num_blks, int offset, char *buf)
{
DPRINTF("obp_rdblkdev: fd %x, num_blks %d, offset %d, buf 0x%x\n", dev_desc, num_blks, offset, buf);
return 0;
}
static char *obp_dumb_mmap(char *va, __attribute__((unused)) int which_io,
unsigned int pa, unsigned int size)
{
unsigned int npages;
unsigned int off;
unsigned int mva;
DPRINTF("obp_dumb_mmap: virta %x, which_io %d, paddr %x, sz %d\n", va, which_io, pa, size);
off = pa & (PAGE_SIZE-1);
npages = (off + size + (PAGE_SIZE-1)) / PAGE_SIZE;
pa &= ~(PAGE_SIZE-1);
mva = (unsigned int) va;
while (npages-- != 0) {
map_page(mva, pa, 1);
mva += PAGE_SIZE;
pa += PAGE_SIZE;
}
return va;
}
static void obp_dumb_munmap(__attribute__((unused)) char *va,
__attribute__((unused)) unsigned int size)
{
DPRINTF("obp_dumb_munmap: virta %x, sz %d\n", va, size);
}
static int obp_devread(int dev_desc, char *buf, int nbytes)
{
DPRINTF("obp_devread: fd %d, nbytes %d\n", dev_desc, nbytes);
return 0;
}
static int obp_devwrite(int dev_desc, char *buf, int nbytes)
{
DPRINTF("obp_devwrite: fd %d, buf %s, nbytes %d\n", dev_desc, buf, nbytes);
return nbytes;
}
static int obp_devseek(int dev_desc, __attribute__((unused)) int hi, int lo)
{
DPRINTF("obp_devseek: fd %d, hi %d, lo %d\n", dev_desc, hi, lo);
return 0;
}
static int obp_inst2pkg(int dev_desc)
{
DPRINTF("obp_inst2pkg: fd %d\n", dev_desc);
return 0;
}
static int obp_cpustart(unsigned int whichcpu, int ctxtbl_ptr,
int thiscontext, char *prog_counter)
{
//int cpu, found;
struct linux_prom_registers *smp_ctable = (void *)ctxtbl_ptr;
DPRINTF("obp_cpustart: cpu %d, ctxptr %x, ctx %d, pc %x\n", whichcpu,
smp_ctable->phys_addr, thiscontext, prog_counter);
#if 0
found = obp_getprop(whichcpu, "mid", (char *)&cpu);
if (found == -1)
return -1;
st_bypass(PHYS_JJ_EEPROM + 0x38, (unsigned int)prog_counter);
st_bypass(PHYS_JJ_EEPROM + 0x3C, ((unsigned int)smp_ctable->phys_addr) >> 4);
st_bypass(PHYS_JJ_EEPROM + 0x40, thiscontext);
DPRINTF("obp_cpustart: sending interrupt to CPU %d\n", cpu);
st_bypass(PHYS_JJ_INTR0 + 0x1000 * cpu + 8, 0x40000000);
#endif
return 0;
}
static int obp_cpustop(__attribute__((unused)) unsigned int whichcpu)
{
DPRINTF("obp_cpustop: cpu %d\n", whichcpu);
return 0;
}
static int obp_cpuidle(__attribute__((unused)) unsigned int whichcpu)
{
DPRINTF("obp_cpuidle: cpu %d\n", whichcpu);
return 0;
}
static int obp_cpuresume(__attribute__((unused)) unsigned int whichcpu)
{
DPRINTF("obp_cpuresume: cpu %d\n", whichcpu);
return 0;
}
void *
init_openprom(unsigned long memsize, const char *cmdline, char boot_device)
{
ptphys = totphys;
ptmap = totmap;
ptavail = totavail;
/*
* Form memory descriptors.
*/
totphys[0].theres_more = 0;
totphys[0].start_adr = (char *) 0;
totphys[0].num_bytes = memsize;
totavail[0].theres_more = 0;
totavail[0].start_adr = (char*) 0;
totavail[0].num_bytes = memsize;
totmap[0].theres_more = 0;
totmap[0].start_adr = &_start;
totmap[0].num_bytes = (unsigned long) &_iomem - (unsigned long) &_start;
prop_mem_reg[0] = 0;
prop_mem_reg[1] = 0;
prop_mem_reg[2] = memsize;
prop_mem_avail[0] = 0;
prop_mem_avail[1] = 0;
prop_mem_avail[2] = va2pa((unsigned long)&_data);
prop_vmem_avail[0] = 0;
prop_vmem_avail[1] = 0;
prop_vmem_avail[2] = (unsigned long)&_start - 1;
prop_vmem_avail[3] = 0;
prop_vmem_avail[4] = 0xffe00000;
prop_vmem_avail[5] = 0x00200000;
// Linux wants a R/W romvec table
romvec0.pv_magic_cookie = LINUX_OPPROM_MAGIC;
romvec0.pv_romvers = 0;
romvec0.pv_plugin_revision = 77;
romvec0.pv_printrev = 0x10203;
romvec0.pv_v0mem.v0_totphys = &ptphys;
romvec0.pv_v0mem.v0_prommap = &ptmap;
romvec0.pv_v0mem.v0_available = &ptavail;
romvec0.pv_nodeops = &nodeops0;
romvec0.pv_bootstr = (void *)doublewalk;
romvec0.pv_v0devops.v0_devopen = &obp_devopen;
romvec0.pv_v0devops.v0_devclose = &obp_devclose;
romvec0.pv_v0devops.v0_rdblkdev = &obp_rdblkdev;
romvec0.pv_stdin = &obp_stdin;
romvec0.pv_stdout = &obp_stdout;
romvec0.pv_getchar = obp_nbgetchar;
romvec0.pv_putchar = (void (*)(int))obp_nbputchar;
romvec0.pv_nbgetchar = obp_nbgetchar;
romvec0.pv_nbputchar = obp_nbputchar;
romvec0.pv_reboot = obp_reboot;
romvec0.pv_printf = (void (*)(const char *fmt, ...))printk;
romvec0.pv_abort = obp_abort;
romvec0.pv_halt = obp_halt;
romvec0.pv_synchook = &synch_hook;
romvec0.pv_v0bootargs = &obp_argp;
romvec0.pv_v2devops.v2_inst2pkg = obp_inst2pkg;
romvec0.pv_v2devops.v2_dumb_mmap = obp_dumb_mmap;
romvec0.pv_v2devops.v2_dumb_munmap = obp_dumb_munmap;
romvec0.pv_v2devops.v2_dev_open = obp_devopen;
romvec0.pv_v2devops.v2_dev_close = (void (*)(int))obp_devclose;
romvec0.pv_v2devops.v2_dev_read = obp_devread;
romvec0.pv_v2devops.v2_dev_write = obp_devwrite;
romvec0.pv_v2devops.v2_dev_seek = obp_devseek;
obp_arg.boot_dev_ctrl = 0;
obp_arg.boot_dev_unit = '0';
obp_arg.argv[0] = "sd(0,0,0):d";
switch(boot_device) {
default:
case 'a':
obp_arg.argv[0] = "fd()";
obp_arg.boot_dev[0] = 'f';
obp_arg.boot_dev[1] = 'd';
break;
case 'd':
obp_arg.boot_dev_unit = '2';
obp_arg.argv[0] = "sd(0,2,0):d";
// Fall through
case 'c':
obp_arg.boot_dev[0] = 's';
obp_arg.boot_dev[1] = 'd';
break;
case 'n':
obp_arg.argv[0] = "le()";
obp_arg.boot_dev[0] = 'l';
obp_arg.boot_dev[1] = 'e';
break;
}
obp_arg.argv[1] = cmdline;
romvec0.pv_v2bootargs.bootpath = &obp_arg.argv[0];
romvec0.pv_v2bootargs.bootargs = &cmdline;
romvec0.pv_v2bootargs.fd_stdin = &obp_fd_stdin;
romvec0.pv_v2bootargs.fd_stdout = &obp_fd_stdout;
romvec0.v3_cpustart = obp_cpustart;
romvec0.v3_cpustop = obp_cpustop;
romvec0.v3_cpuidle = obp_cpuidle;
romvec0.v3_cpuresume = obp_cpuresume;
return &romvec0;
}

View File

@@ -3,14 +3,29 @@
2 encode-int " #address-cells" property 2 encode-int " #address-cells" property
1 encode-int " #size-cells" property 1 encode-int " #size-cells" property
" SUNW,SparcStation-5" encode-string " name" property " SUNW,SparcStation-5" encode-string " name" property
" " encode-string " idprom" property
" SparcStation" encode-string " banner-name" property " SparcStation" encode-string " banner-name" property
" sun4m" encode-string " compatible" property " sun4m" encode-string " compatible" property
h# 01800000 encode-int 0 encode-int encode+ 0 encode-int encode+ h# 00000081 encode-int encode+
0 encode-int encode+ 0 encode-int encode+ 0 encode-int encode+ 0 encode-int encode+
" idprom" property \ XXX
: encode-unit encode-unit-sbus ; : encode-unit encode-unit-sbus ;
: decode-unit decode-unit-sbus ; : decode-unit decode-unit-sbus ;
new-device new-device
" memory" device-name " memory" device-name
h# 100000 encode-int " available" property \ XXX
h# 0 encode-int h# 10000000 encode-int encode+ h# 00000300 encode-int encode+ " reg" property \ XXX
external
: open true ;
: close ;
\ claim ( phys size align -- base )
\ release ( phys size -- )
finish-device
new-device
" virtual-memory" device-name
h# 100000 encode-int " available" property \ XXX
h# 0 encode-int h# 10000000 encode-int encode+ h# 00000300 encode-int encode+ " reg" property \ XXX
external external
: open true ; : open true ;
: close ; : close ;
@@ -33,7 +48,7 @@ new-device
1 encode-int " #size-cells" property 1 encode-int " #size-cells" property
h# 0 encode-int h# 10000000 encode-int encode+ h# 00000300 encode-int encode+ " reg" property h# 0 encode-int h# 10000000 encode-int encode+ h# 00000300 encode-int encode+ " reg" property
external external
: open cr ." opening iommu" cr true ; : open ( cr ." opening iommu" cr) true ;
: close ; : close ;
: encode-unit encode-unit-sbus ; : encode-unit encode-unit-sbus ;
: decode-unit decode-unit-sbus ; : decode-unit decode-unit-sbus ;
@@ -53,7 +68,7 @@ new-device
" ranges" property " ranges" property
h# 0 encode-int h# 10001000 encode-int encode+ h# 00000028 encode-int encode+ " reg" property h# 0 encode-int h# 10001000 encode-int encode+ h# 00000028 encode-int encode+ " reg" property
external external
: open cr ." opening SBus" cr true ; : open ( cr ." opening SBus" cr) true ;
: close ; : close ;
: encode-unit encode-unit-sbus ; : encode-unit encode-unit-sbus ;
: decode-unit decode-unit-sbus ; : decode-unit decode-unit-sbus ;
@@ -157,7 +172,7 @@ new-device
h# 0 encode-int h# 0 encode-int encode+ h# 0 encode-int encode+ h# 71000000 encode-int encode+ h# 01000000 encode-int encode+ h# 0 encode-int h# 0 encode-int encode+ h# 0 encode-int encode+ h# 71000000 encode-int encode+ h# 01000000 encode-int encode+
" ranges" property " ranges" property
external external
: open cr ." opening obio" cr true ; : open ( cr ." opening obio" cr) true ;
: close ; : close ;
: encode-unit encode-unit-sbus ; : encode-unit encode-unit-sbus ;
: decode-unit decode-unit-sbus ; : decode-unit decode-unit-sbus ;

View File

@@ -26,7 +26,8 @@
<option name="CONFIG_DEBUG_INTERPRETER" type="boolean" value="false"/> <option name="CONFIG_DEBUG_INTERPRETER" type="boolean" value="false"/>
<option name="CONFIG_DEBUG_CONSOLE" type="boolean" value="true"/> <option name="CONFIG_DEBUG_CONSOLE" type="boolean" value="true"/>
<option name="CONFIG_DEBUG_CONSOLE_SERIAL" type="boolean" value="true"/> <option name="CONFIG_DEBUG_CONSOLE_SERIAL" type="boolean" value="true"/>
<option name="CONFIG_DEBUG_ESP" type="boolean" value="true"/> <option name="CONFIG_DEBUG_ESP" type="boolean" value="false"/>
<option name="CONFIG_DEBUG_SUN_PARTS" type="boolean" value="false"/>
<option name="CONFIG_SERIAL_PORT" type="integer" value="0"/> <option name="CONFIG_SERIAL_PORT" type="integer" value="0"/>
<option name="CONFIG_SERIAL_SPEED" type="integer" value="115200"/> <option name="CONFIG_SERIAL_SPEED" type="integer" value="115200"/>
@@ -43,13 +44,13 @@
<option name="CONFIG_SUN_PARTS" type="boolean" value="true"/> <option name="CONFIG_SUN_PARTS" type="boolean" value="true"/>
<option name="CONFIG_FS" type="boolean" value="true"/> <option name="CONFIG_FS" type="boolean" value="true"/>
<option name="CONFIG_HFS" type="boolean" value="false"/> <option name="CONFIG_HFS" type="boolean" value="false"/>
<option name="CONFIG_HFSP" type="boolean" value="true"/> <option name="CONFIG_HFSP" type="boolean" value="false"/>
<option name="CONFIG_GRUBFS" type="boolean" value="true"/> <option name="CONFIG_GRUBFS" type="boolean" value="true"/>
<option name="CONFIG_FSYS_EXT2FS" type="boolean" value="true"/> <option name="CONFIG_FSYS_EXT2FS" type="boolean" value="true"/>
<option name="CONFIG_FSYS_FAT" type="boolean" value="false"/> <option name="CONFIG_FSYS_FAT" type="boolean" value="false"/>
<option name="CONFIG_FSYS_JFS" type="boolean" value="false"/> <option name="CONFIG_FSYS_JFS" type="boolean" value="false"/>
<option name="CONFIG_FSYS_MINIX" type="boolean" value="false"/> <option name="CONFIG_FSYS_MINIX" type="boolean" value="false"/>
<option name="CONFIG_FSYS_REISERFS" type="boolean" value="true"/> <option name="CONFIG_FSYS_REISERFS" type="boolean" value="false"/>
<option name="CONFIG_FSYS_XFS" type="boolean" value="false"/> <option name="CONFIG_FSYS_XFS" type="boolean" value="false"/>
<option name="CONFIG_FSYS_UFS" type="boolean" value="true"/> <option name="CONFIG_FSYS_UFS" type="boolean" value="true"/>
<option name="CONFIG_FSYS_ISO9660" type="boolean" value="true"/> <option name="CONFIG_FSYS_ISO9660" type="boolean" value="true"/>

View File

@@ -26,6 +26,8 @@
<option name="CONFIG_DEBUG_INTERPRETER" type="boolean" value="false"/> <option name="CONFIG_DEBUG_INTERPRETER" type="boolean" value="false"/>
<option name="CONFIG_DEBUG_CONSOLE" type="boolean" value="true"/> <option name="CONFIG_DEBUG_CONSOLE" type="boolean" value="true"/>
<option name="CONFIG_DEBUG_CONSOLE_SERIAL" type="boolean" value="true"/> <option name="CONFIG_DEBUG_CONSOLE_SERIAL" type="boolean" value="true"/>
<option name="CONFIG_DEBUG_ESP" type="boolean" value="false"/>
<option name="CONFIG_DEBUG_SUN_PARTS" type="boolean" value="false"/>
<option name="CONFIG_SERIAL_PORT" type="integer" value="0"/> <option name="CONFIG_SERIAL_PORT" type="integer" value="0"/>
<option name="CONFIG_SERIAL_SPEED" type="integer" value="115200"/> <option name="CONFIG_SERIAL_SPEED" type="integer" value="115200"/>
@@ -42,13 +44,13 @@
<option name="CONFIG_SUN_PARTS" type="boolean" value="true"/> <option name="CONFIG_SUN_PARTS" type="boolean" value="true"/>
<option name="CONFIG_FS" type="boolean" value="true"/> <option name="CONFIG_FS" type="boolean" value="true"/>
<option name="CONFIG_HFS" type="boolean" value="false"/> <option name="CONFIG_HFS" type="boolean" value="false"/>
<option name="CONFIG_HFSP" type="boolean" value="true"/> <option name="CONFIG_HFSP" type="boolean" value="false"/>
<option name="CONFIG_GRUBFS" type="boolean" value="true"/> <option name="CONFIG_GRUBFS" type="boolean" value="true"/>
<option name="CONFIG_FSYS_EXT2FS" type="boolean" value="true"/> <option name="CONFIG_FSYS_EXT2FS" type="boolean" value="true"/>
<option name="CONFIG_FSYS_FAT" type="boolean" value="false"/> <option name="CONFIG_FSYS_FAT" type="boolean" value="false"/>
<option name="CONFIG_FSYS_JFS" type="boolean" value="false"/> <option name="CONFIG_FSYS_JFS" type="boolean" value="false"/>
<option name="CONFIG_FSYS_MINIX" type="boolean" value="false"/> <option name="CONFIG_FSYS_MINIX" type="boolean" value="false"/>
<option name="CONFIG_FSYS_REISERFS" type="boolean" value="true"/> <option name="CONFIG_FSYS_REISERFS" type="boolean" value="false"/>
<option name="CONFIG_FSYS_XFS" type="boolean" value="false"/> <option name="CONFIG_FSYS_XFS" type="boolean" value="false"/>
<option name="CONFIG_FSYS_UFS" type="boolean" value="true"/> <option name="CONFIG_FSYS_UFS" type="boolean" value="true"/>
<option name="CONFIG_FSYS_ISO9660" type="boolean" value="true"/> <option name="CONFIG_FSYS_ISO9660" type="boolean" value="true"/>

View File

@@ -35,7 +35,7 @@
} while(0) } while(0)
#define REGISTER_NODE_METHODS( name, path ) do { \ #define REGISTER_NODE_METHODS( name, path ) do { \
char *paths[1]; \ const char *paths[1]; \
\ \
paths[0] = path; \ paths[0] = path; \
bind_node( name##_flags_, name##_size_, \ bind_node( name##_flags_, name##_size_, \
@@ -76,9 +76,9 @@ esp_private_t *global_esp;
DECLARE_UNNAMED_NODE(ob_sd, INSTALL_OPEN, sizeof(sd_private_t *)); DECLARE_UNNAMED_NODE(ob_sd, INSTALL_OPEN, sizeof(sd_private_t *));
DECLARE_UNNAMED_NODE(ob_esp, INSTALL_OPEN, sizeof(esp_private_t *)); DECLARE_UNNAMED_NODE(ob_esp, INSTALL_OPEN, sizeof(esp_private_t *));
#ifdef CONFIG_DEBUG_ESP
static void dump_drive(sd_private_t *drive) static void dump_drive(sd_private_t *drive)
{ {
#ifdef CONFIG_DEBUG_ESP
printk("SCSI DRIVE @%lx:\n", (unsigned long)drive); printk("SCSI DRIVE @%lx:\n", (unsigned long)drive);
printk("id: %d\n", drive->id); printk("id: %d\n", drive->id);
printk("media: %s\n", drive->media_str); printk("media: %s\n", drive->media_str);
@@ -86,8 +86,8 @@ static void dump_drive(sd_private_t *drive)
printk("sectors: %d\n", drive->sectors); printk("sectors: %d\n", drive->sectors);
printk("present: %d\n", drive->present); printk("present: %d\n", drive->present);
printk("bs: %d\n", drive->bs); printk("bs: %d\n", drive->bs);
#endif
} }
#endif
static int static int
do_command(esp_private_t *esp, sd_private_t *sd, int cmdlen, int replylen) do_command(esp_private_t *esp, sd_private_t *sd, int cmdlen, int replylen)

View File

@@ -35,8 +35,8 @@ struct mem cio; /* Current I/O space */
unsigned int va_shift; unsigned int va_shift;
unsigned long *context_table; static unsigned long *context_table;
unsigned long *l1; static unsigned long *l1;
/* /*
* IOMMU parameters * IOMMU parameters
@@ -105,21 +105,20 @@ mem_zalloc(struct mem *t, int size, int align)
* highbase is used for v2p translation. * highbase is used for v2p translation.
*/ */
int int
map_page(unsigned long *pgd, unsigned long va, map_page(unsigned long va, unsigned long epa, int type)
unsigned long epa, int type)
{ {
uint32_t pte; uint32_t pte;
void *p; void *p;
unsigned long pa; unsigned long pa;
pte = pgd[(va >> SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD - 1)]; pte = l1[(va >> SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD - 1)];
if ((pte & SRMMU_ET_MASK) == SRMMU_ET_INVALID) { if ((pte & SRMMU_ET_MASK) == SRMMU_ET_INVALID) {
p = mem_zalloc(&cmem, SRMMU_PTRS_PER_PMD * sizeof(int), p = mem_zalloc(&cmem, SRMMU_PTRS_PER_PMD * sizeof(int),
SRMMU_PTRS_PER_PMD * sizeof(int)); SRMMU_PTRS_PER_PMD * sizeof(int));
if (p == 0) if (p == 0)
goto drop; goto drop;
pte = SRMMU_ET_PTD | ((va2pa((unsigned long)p)) >> 4); pte = SRMMU_ET_PTD | ((va2pa((unsigned long)p)) >> 4);
pgd[(va >> SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD - 1)] = pte; l1[(va >> SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD - 1)] = pte;
/* barrier() */ /* barrier() */
} }
@@ -178,9 +177,9 @@ map_io(unsigned pa, int size)
return va; return va;
mva = (unsigned int) va; mva = (unsigned int) va;
printk("map_io: va 0x%p pa 0x%x off 0x%x npages %d\n", va, pa, off, npages); /* P3 */ //printk("map_io: va 0x%p pa 0x%x off 0x%x npages %d\n", va, pa, off, npages); /* P3 */
while (npages-- != 0) { while (npages-- != 0) {
map_page(l1, mva, pa, 1); map_page(mva, pa, 1);
mva += PAGE_SIZE; mva += PAGE_SIZE;
pa += PAGE_SIZE; pa += PAGE_SIZE;
} }
@@ -215,20 +214,20 @@ init_mmu_swift()
// 1:1 mapping for ROM // 1:1 mapping for ROM
pa = va = (unsigned long)&_start; pa = va = (unsigned long)&_start;
for (; va < (unsigned long)&_data; va += PAGE_SIZE, pa += PAGE_SIZE) { for (; va < (unsigned long)&_data; va += PAGE_SIZE, pa += PAGE_SIZE) {
map_page(l1, va, pa, 0); map_page(va, pa, 0);
} }
// data & bss mapped to end of RAM // data & bss mapped to end of RAM
va = (unsigned long)&_data; va = (unsigned long)&_data;
for (; va < (unsigned long)&_end; va += PAGE_SIZE) { for (; va < (unsigned long)&_end; va += PAGE_SIZE) {
pa = va2pa(va); pa = va2pa(va);
map_page(l1, va, pa, 0); map_page(va, pa, 0);
} }
// 1:1 mapping for RAM // 1:1 mapping for RAM
pa = va = 0; pa = va = 0;
for (; va < LOWMEMSZ; va += PAGE_SIZE, pa += PAGE_SIZE) { for (; va < LOWMEMSZ; va += PAGE_SIZE, pa += PAGE_SIZE) {
map_page(l1, va, pa, 0); map_page(va, pa, 0);
} }
/* /*
@@ -279,7 +278,7 @@ dvma_alloc(int size, unsigned int *pphys)
mva = (unsigned int) va; mva = (unsigned int) va;
mpa = (unsigned int) pa; mpa = (unsigned int) pa;
for (i = 0; i < npages; i++) { for (i = 0; i < npages; i++) {
map_page(l1, mva, mpa, 1); map_page(mva, mpa, 1);
mva += PAGE_SIZE; mva += PAGE_SIZE;
mpa += PAGE_SIZE; mpa += PAGE_SIZE;
} }

View File

@@ -46,7 +46,7 @@ NODE_METHODS(ob_sbus_node) = {
int ob_sbus_init(void) int ob_sbus_init(void)
{ {
printk("Initializing SBus devices...\n"); //printk("Initializing SBus devices...\n");
return 0; return 0;
} }

View File

@@ -124,11 +124,11 @@ static const method_t name##_m[]
name##_m, sizeof(name##_m)/sizeof(method_t) ); \ name##_m, sizeof(name##_m)/sizeof(method_t) ); \
} while(0) } while(0)
extern void bind_node( int flags, int size, char **paths, int npaths, extern void bind_node( int flags, int size, const char * const *paths, int npaths,
method_t *methods, int nmethods ); const method_t *methods, int nmethods );
extern void bind_new_node( int flags, int size, char *name, extern void bind_new_node( int flags, int size, const char *name,
method_t *methods, int nmethods ); const method_t *methods, int nmethods );
#define INSTALL_OPEN 1 /* install trivial open and close methods */ #define INSTALL_OPEN 1 /* install trivial open and close methods */

View File

@@ -34,8 +34,7 @@ struct mem;
void *mem_alloc(struct mem *t, int size, int align); void *mem_alloc(struct mem *t, int size, int align);
void *mem_zalloc(struct mem *t, int size, int align); void *mem_zalloc(struct mem *t, int size, int align);
int map_page(unsigned long *pgd, unsigned long va, int map_page(unsigned long va, unsigned long epa, int type);
unsigned long epa, int type);
void *map_io(unsigned pa, int size); void *map_io(unsigned pa, int size);
void init_mmu_swift(); void init_mmu_swift();
void *dvma_alloc(int size, unsigned int *pphys); void *dvma_alloc(int size, unsigned int *pphys);

View File

@@ -22,7 +22,7 @@ int errno;
void void
qsort( void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void*) ) qsort( void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void*) )
{ {
int worked, i, j; unsigned int worked, i, j;
/* even more inefficient than the glibc variant :-) */ /* even more inefficient than the glibc variant :-) */
do { do {

View File

@@ -431,7 +431,7 @@ call1_func( void )
static void static void
add_methods( int flags, int size, method_t *methods, int nmet ) add_methods( int flags, int size, const method_t *methods, int nmet )
{ {
xt_t xt=0; xt_t xt=0;
int i; int i;
@@ -470,14 +470,14 @@ add_methods( int flags, int size, method_t *methods, int nmet )
} }
void void
bind_node( int flags, int size, char **paths, int npaths, bind_node( int flags, int size, const char * const *paths, int npaths,
method_t *methods, int nmet ) const method_t *methods, int nmet )
{ {
phandle_t save_ph = get_cur_dev(); phandle_t save_ph = get_cur_dev();
int i; int i;
for( i=0; i<npaths; i++ ) { for( i=0; i<npaths; i++ ) {
char *name = paths[i]; const char *name = paths[i];
/* type matching? */ /* type matching? */
if( *name == 'T' ) { if( *name == 'T' ) {
@@ -506,8 +506,8 @@ bind_node( int flags, int size, char **paths, int npaths,
} }
void void
bind_new_node( int flags, int size, char *name, bind_new_node( int flags, int size, const char *name,
method_t *methods, int nmet ) const method_t *methods, int nmet )
{ {
phandle_t save_ph = get_cur_dev(); phandle_t save_ph = get_cur_dev();

View File

@@ -17,6 +17,13 @@
#include "libc/byteorder.h" #include "libc/byteorder.h"
#include "modules.h" #include "modules.h"
#ifdef CONFIG_DEBUG_SUN_PARTS
#define DPRINTF(fmt, args...) \
do { printk(fmt , ##args); } while (0)
#else
#define DPRINTF(fmt, args...)
#endif
typedef struct { typedef struct {
ullong offs; ullong offs;
ullong size; ullong size;
@@ -88,7 +95,7 @@ sunparts_open( sunparts_info_t *di )
struct sun_disklabel *p; struct sun_disklabel *p;
unsigned int i; unsigned int i;
printk("sunparts_open '%s'\n", str ); DPRINTF("sunparts_open '%s'\n", str );
if( str ) { if( str ) {
parnum = atol(str); parnum = atol(str);
@@ -103,7 +110,7 @@ sunparts_open( sunparts_info_t *di )
/* Check Magic */ /* Check Magic */
if (!has_sun_part_magic(buf)) { if (!has_sun_part_magic(buf)) {
printk("sun partition magic not found.\n"); DPRINTF("sun partition magic not found.\n");
RET(0); RET(0);
} }
@@ -111,7 +118,7 @@ sunparts_open( sunparts_info_t *di )
p = (struct sun_disklabel *)buf; p = (struct sun_disklabel *)buf;
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
printk("%c: %d + %d, id %x, flags %x\n", 'a' + i, p->partitions[i].start_cylinder, DPRINTF("%c: %d + %d, id %x, flags %x\n", 'a' + i, p->partitions[i].start_cylinder,
p->partitions[i].num_sectors, p->infos[i].id, p->infos[i].flags); p->partitions[i].num_sectors, p->infos[i].id, p->infos[i].flags);
if (parnum < 0) { if (parnum < 0) {
if (p->partitions[i].num_sectors != 0 && p->infos[i].id != 0) if (p->partitions[i].num_sectors != 0 && p->infos[i].id != 0)
@@ -122,7 +129,7 @@ sunparts_open( sunparts_info_t *di )
__be16_to_cpu(p->ntrks) * __be16_to_cpu(p->nsect); __be16_to_cpu(p->ntrks) * __be16_to_cpu(p->nsect);
di->size = (llong)__be32_to_cpu(p->partitions[parnum].num_sectors) ; di->size = (llong)__be32_to_cpu(p->partitions[parnum].num_sectors) ;
printk("Found Sun partition table, offs %d size %d\n", (int)di->offs, (int)di->size); DPRINTF("Found Sun partition table, offs %d size %d\n", (int)di->offs, (int)di->size);
RET( -1 ); RET( -1 );
} }