initial import of openbios--main--1.0--patch-26

git-svn-id: svn://coreboot.org/openbios/openbios-devel@1 f158a5a8-5612-0410-a976-696ce0be7e32
This commit is contained in:
Stefan Reinauer
2006-04-26 15:08:19 +00:00
commit 5c9eb9b45b
522 changed files with 83237 additions and 0 deletions

47
arch/ppc/pearpc/console.c Normal file
View File

@@ -0,0 +1,47 @@
/*
* <console.c>
*
* Simple text console
*
* Copyright (C) 2005 Stefan Reinauer <stepan@openbios.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation
*
*/
#include "openbios/config.h"
#include "openbios/bindings.h"
#include "libc/diskio.h"
#include "ofmem.h"
#include "pearpc/pearpc.h"
typedef struct osi_fb_info {
unsigned long mphys;
int rb, w, h, depth;
} osi_fb_info_t;
int PearPC_GetFBInfo( osi_fb_info_t *fb )
{
fb->w=1024;
fb->h=768;
fb->depth=15;
fb->rb=2048;
fb->mphys=0x84000000;
return 0;
}
#define openbios_GetFBInfo(x) PearPC_GetFBInfo(x)
#include "../../../modules/video.c"
#include "../../../modules/console.c"

137
arch/ppc/pearpc/init.c Normal file
View File

@@ -0,0 +1,137 @@
/*
* Creation Date: <2004/08/28 18:38:22 greg>
* Time-stamp: <2004/08/28 18:38:22 greg>
*
* <init.c>
*
* Initialization for pearpc
*
* Copyright (C) 2004 Greg Watson
* Copyright (C) 2005 Stefan Reinauer
*
* based on mol/init.c:
*
* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Samuel & David Rydh
* (samuel@ibrium.se, dary@lindesign.se)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation
*
*/
#include "openbios/config.h"
#include "openbios/bindings.h"
#include "openbios/nvram.h"
#include "pearpc/pearpc.h"
#include "ofmem.h"
#include "openbios-version.h"
extern void unexpected_excep( int vector );
extern void ob_ide_init( void );
extern void ob_pci_init( void );
extern void ob_adb_init( void );
extern void setup_timers( void );
#if 0
int
get_bool_res( const char *res )
{
char buf[8], *p;
p = BootHGetStrRes( res, buf, sizeof(buf) );
if( !p )
return -1;
if( !strcasecmp(p,"true") || !strcasecmp(p,"yes") || !strcasecmp(p,"1") )
return 1;
return 0;
}
#endif
void
unexpected_excep( int vector )
{
printk("openbios panic: Unexpected exception %x\n", vector );
for( ;; )
;
}
void
entry( void )
{
printk("\n");
printk("=============================================================\n");
printk("OpenBIOS %s [%s]\n", OPENBIOS_RELEASE, OPENBIOS_BUILD_DATE );
ofmem_init();
initialize_forth();
/* won't return */
printk("of_startup returned!\n");
for( ;; )
;
}
static void
setenv( char *env, char *value )
{
push_str( value );
push_str( env );
fword("$setenv");
}
void
arch_of_init( void )
{
#if USE_RTAS
phandle_t ph;
#endif
int autoboot;
devtree_init();
nvram_init();
modules_init();
#ifdef CONFIG_DRIVER_PCI
ob_pci_init();
#endif
#ifdef CONFIG_DRIVER_IDE
setup_timers();
ob_ide_init();
#endif
#ifdef CONFIG_DRIVER_ADB
ob_adb_init();
#endif
node_methods_init();
init_video();
#if USE_RTAS
if( !(ph=find_dev("/rtas")) )
printk("Warning: No /rtas node\n");
else {
ulong size = 0x1000;
while( size < (ulong)of_rtas_end - (ulong)of_rtas_start )
size *= 2;
set_property( ph, "rtas-size", (char*)&size, sizeof(size) );
}
#endif
#if 0
/* tweak boot settings */
autoboot = !!get_bool_res("autoboot");
#endif
autoboot = 0;
if( !autoboot )
printk("Autobooting disabled - dropping into OpenFirmware\n");
setenv("auto-boot?", autoboot ? "true" : "false" );
setenv("boot-command", "pearpcboot");
#if 0
if( get_bool_res("tty-interface") == 1 )
#endif
fword("activate-tty-interface");
/* hack */
device_end();
bind_func("pearpcboot", boot );
}

17
arch/ppc/pearpc/kernel.c Normal file
View File

@@ -0,0 +1,17 @@
/*
* Creation Date: <2004/08/28 18:03:25 stepan>
* Time-stamp: <2004/08/28 18:03:25 stepan>
*
* <pearpc/kernel.c>
*
* Copyright (C) 2005 Stefan Reinauer
*
* 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 "pearpc-dict.h"
#include "../kernel.c"

145
arch/ppc/pearpc/main.c Normal file
View File

@@ -0,0 +1,145 @@
/*
* Creation Date: <2004/08/28 18:38:22 greg>
* Time-stamp: <2004/08/28 18:38:22 greg>
*
* <main.c>
*
* Copyright (C) 2004 Greg Watson
*
* Based on MOL specific code which is
* Copyright (C) 2002, 2003, 2004 Samuel Rydh (samuel@ibrium.se)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation
*
*/
#include "openbios/config.h"
#include "openbios/bindings.h"
#include "openbios/elfload.h"
#include "openbios/nvram.h"
#include "libc/diskio.h"
#include "libc/vsprintf.h"
#include "pearpc/pearpc.h"
#include "ofmem.h"
static void
transfer_control_to_elf( ulong entry )
{
extern void call_elf( ulong entry );
printk("Starting ELF image at 0x%08lX\n", entry);
call_elf( 0x400000 );
//call_elf( entry );
fatal_error("call_elf returned unexpectedly\n");
}
static int
load_elf_rom( ulong *entry, int fd )
{
int i, lszz_offs, elf_offs;
char buf[128], *addr;
Elf_ehdr ehdr;
Elf_phdr *phdr;
size_t s;
printk("Loading '%s'\n", get_file_path(fd));
/* the ELF-image (usually) starts at offset 0x4000 */
if( (elf_offs=find_elf(fd)) < 0 ) {
printk("----> %s is not an ELF image\n", buf );
exit(1);
}
if( !(phdr=elf_readhdrs(fd, elf_offs, &ehdr)) )
fatal_error("elf_readhdrs failed\n");
*entry = ehdr.e_entry;
/* load segments. Compressed ROM-image assumed to be located immediately
* after the last segment */
lszz_offs = elf_offs;
for( i=0; i<ehdr.e_phnum; i++ ) {
/* p_memsz, p_flags */
s = MIN( phdr[i].p_filesz, phdr[i].p_memsz );
seek_io( fd, elf_offs + phdr[i].p_offset );
/* printk("filesz: %08lX memsz: %08lX p_offset: %08lX p_vaddr %08lX\n",
phdr[i].p_filesz, phdr[i].p_memsz, phdr[i].p_offset,
phdr[i].p_vaddr ); */
if( phdr[i].p_vaddr != phdr[i].p_paddr )
printk("WARNING: ELF segment virtual addr != physical addr\n");
lszz_offs = MAX( lszz_offs, elf_offs + phdr[i].p_offset + phdr[i].p_filesz );
if( !s )
continue;
if( ofmem_claim( phdr[i].p_vaddr, phdr[i].p_memsz, 0 ) == -1 )
fatal_error("Claim failed!\n");
addr = (char*)phdr[i].p_vaddr;
if( read_io(fd, addr, s) != s )
fatal_error("read failed\n");
#if 0
/* patch CODE segment */
if( *entry >= phdr[i].p_vaddr && *entry < phdr[i].p_vaddr + s ) {
patch_newworld_rom( (char*)phdr[i].p_vaddr, s );
newworld_timer_hack( (char*)phdr[i].p_vaddr, s );
}
#endif
flush_icache_range( addr, addr+s );
/*printk("ELF ROM-section loaded at %08lX (size %08lX)\n",
(ulong)phdr[i].p_vaddr, (ulong)phdr[i].p_memsz );*/
}
free( phdr );
return lszz_offs;
}
static void
encode_bootpath( const char *spec, const char *args )
{
phandle_t chosen_ph = find_dev("/chosen");
set_property( chosen_ph, "bootpath", spec, strlen(spec)+1 );
set_property( chosen_ph, "bootargs", args, strlen(args)+1 );
}
/************************************************************************/
/* pearpc booting */
/************************************************************************/
static void
pearpc_startup( void )
{
const char *paths[] = { "hd:0,\\zImage.chrp", NULL };
const char *args[] = { "root=/dev/hda2 console=ttyS0,115200", NULL };
ulong entry;
int i, fd;
for( i=0; paths[i]; i++ ) {
if( (fd=open_io(paths[i])) == -1 )
continue;
(void) load_elf_rom( &entry, fd );
close_io( fd );
encode_bootpath( paths[i], args[i] );
update_nvram();
transfer_control_to_elf( entry );
/* won't come here */
}
printk("*** Boot failure! No secondary bootloader specified ***\n");
}
/************************************************************************/
/* entry */
/************************************************************************/
void
boot( void )
{
fword("update-chosen");
pearpc_startup();
}

335
arch/ppc/pearpc/methods.c Normal file
View File

@@ -0,0 +1,335 @@
/*
* Creation Date: <2004/08/28 18:38:22 greg>
* Time-stamp: <2004/08/28 18:38:22 greg>
*
* <methods.c>
*
* Misc device node methods
*
* Copyright (C) 2004 Greg Watson
*
* Based on MOL specific code which is
*
* Copyright (C) 2003, 2004 Samuel Rydh (samuel@ibrium.se)
*
* 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 "openbios/config.h"
#include "openbios/bindings.h"
#include "libc/string.h"
#include "pearpc/pearpc.h"
#include "ofmem.h"
/************************************************************************/
/* RTAS (run-time abstraction services) */
/************************************************************************/
#ifdef USE_RTAS
DECLARE_NODE( rtas, INSTALL_OPEN, 0, "+/rtas" );
/* ( physbase -- rtas_callback ) */
static void
rtas_instantiate( void )
{
int physbase = POP();
int s=0x1000, size = (int)of_rtas_end - (int)of_rtas_start;
ulong virt;
while( s < size )
s += 0x1000;
virt = ofmem_claim_virt( 0, s, 0x1000 );
ofmem_map( physbase, virt, s, -1 );
memcpy( (char*)virt, of_rtas_start, size );
printk("RTAS instantiated at %08x\n", physbase );
flush_icache_range( (char*)virt, (char*)virt + size );
PUSH( physbase );
}
NODE_METHODS( rtas ) = {
{ "instantiate", rtas_instantiate },
{ "instantiate-rtas", rtas_instantiate },
};
#endif
/************************************************************************/
/* stdout */
/************************************************************************/
DECLARE_NODE( video_stdout, INSTALL_OPEN, 0, "Tdisplay" );
/* ( addr len -- actual ) */
static void
stdout_write( void )
{
int len = POP();
char *addr = (char*)POP();
char *s = malloc( len + 1 );
strncpy_nopad( s, addr, len );
s[len]=0;
printk( "%s", s );
//vfd_draw_str( s );
console_draw_str( s );
free( s );
PUSH( len );
}
NODE_METHODS( video_stdout ) = {
{ "write", stdout_write },
};
/************************************************************************/
/* tty */
/************************************************************************/
DECLARE_NODE( tty, INSTALL_OPEN, 0, "/packages/terminal-emulator" );
/* ( addr len -- actual ) */
static void
tty_read( void )
{
int ch, len = POP();
char *p = (char*)POP();
int ret=0;
if( len > 0 ) {
ret = 1;
ch = getchar();
if( ch >= 0 ) {
*p = ch;
} else {
ret = 0;
}
}
PUSH( ret );
}
/* ( addr len -- actual ) */
static void
tty_write( void )
{
int i, len = POP();
char *p = (char*)POP();
for( i=0; i<len; i++ )
putchar( *p++ );
RET( len );
}
NODE_METHODS( tty ) = {
{ "read", tty_read },
{ "write", tty_write },
};
/************************************************************************/
/* client interface 'quiesce' */
/************************************************************************/
DECLARE_NODE( ciface, 0, 0, "/packages/client-iface" );
/* ( -- ) */
static void
ciface_quiesce( ulong args[], ulong ret[] )
{
#if 0
ulong msr;
/* This seems to be the correct thing to do - but I'm not sure */
asm volatile("mfmsr %0" : "=r" (msr) : );
msr &= ~(MSR_IR | MSR_DR);
asm volatile("mtmsr %0" :: "r" (msr) );
#endif
printk("=============================================================\n\n");
}
/* ( -- ms ) */
static void
ciface_milliseconds( ulong args[], ulong ret[] )
{
extern unsigned long get_timer_freq();
static ulong mticks=0, usecs=0;
ulong t;
asm volatile("mftb %0" : "=r" (t) : );
if( mticks )
usecs += get_timer_freq() / 1000000 * ( t-mticks );
mticks = t;
PUSH( usecs/1000 );
}
NODE_METHODS( ciface ) = {
{ "quiesce", ciface_quiesce },
{ "milliseconds", ciface_milliseconds },
};
/************************************************************************/
/* MMU/memory methods */
/************************************************************************/
DECLARE_NODE( memory, INSTALL_OPEN, 0, "/memory" );
DECLARE_NODE( mmu, INSTALL_OPEN, 0, "/cpu@0" );
DECLARE_NODE( mmu_ciface, 0, 0, "/packages/client-iface" );
/* ( phys size align --- base ) */
static void
mem_claim( void )
{
int align = POP();
int size = POP();
int phys = POP();
int ret = ofmem_claim_phys( phys, size, align );
if( ret == -1 ) {
printk("MEM: claim failure\n");
throw( -13 );
return;
}
PUSH( ret );
}
/* ( phys size --- ) */
static void
mem_release( void )
{
POP(); POP();
}
/* ( phys size align --- base ) */
static void
mmu_claim( void )
{
int align = POP();
int size = POP();
int phys = POP();
int ret = ofmem_claim_virt( phys, size, align );
if( ret == -1 ) {
printk("MMU: CLAIM failure\n");
throw( -13 );
return;
}
PUSH( ret );
}
/* ( phys size --- ) */
static void
mmu_release( void )
{
POP(); POP();
}
/* ( phys virt size mode -- [ret???] ) */
static void
mmu_map( void )
{
int mode = POP();
int size = POP();
int virt = POP();
int phys = POP();
int ret;
/* printk("mmu_map: %x %x %x %x\n", phys, virt, size, mode ); */
ret = ofmem_map( phys, virt, size, mode );
if( ret ) {
printk("MMU: map failure\n");
throw( -13 );
return;
}
}
/* ( virt size -- ) */
static void
mmu_unmap( void )
{
POP(); POP();
}
/* ( virt -- false | phys mode true ) */
static void
mmu_translate( void )
{
ulong mode;
int virt = POP();
int phys = ofmem_translate( virt, &mode );
if( phys == -1 ) {
PUSH( 0 );
} else {
PUSH( phys );
PUSH( (int)mode );
PUSH( -1 );
}
}
/* ( virt size align -- baseaddr|-1 ) */
static void
ciface_claim( void )
{
int align = POP();
int size = POP();
int virt = POP();
int ret = ofmem_claim( virt, size, align );
/* printk("ciface_claim: %08x %08x %x\n", virt, size, align ); */
PUSH( ret );
}
/* ( virt size -- ) */
static void
ciface_release( void )
{
POP();
POP();
}
NODE_METHODS( memory ) = {
{ "claim", mem_claim },
{ "release", mem_release },
};
NODE_METHODS( mmu ) = {
{ "claim", mmu_claim },
{ "release", mmu_release },
{ "map", mmu_map },
{ "unmap", mmu_unmap },
{ "translate", mmu_translate },
};
NODE_METHODS( mmu_ciface ) = {
{ "claim", ciface_claim },
{ "release", ciface_release },
};
/************************************************************************/
/* init */
/************************************************************************/
void
node_methods_init( void )
{
#ifdef USE_RTAS
REGISTER_NODE( rtas );
#endif
REGISTER_NODE( video_stdout );
REGISTER_NODE( ciface );
REGISTER_NODE( memory );
REGISTER_NODE( mmu );
REGISTER_NODE( mmu_ciface );
REGISTER_NODE( tty );
}

206
arch/ppc/pearpc/pearpc.c Normal file
View File

@@ -0,0 +1,206 @@
/*
* Creation Date: <2004/08/28 18:38:22 greg>
* Time-stamp: <2004/08/28 18:38:22 greg>
*
* <pearpc.c>
*
* Copyright (C) 2004, Greg Watson
*
* derived from mol.c
*
* Copyright (C) 2003, 2004 Samuel Rydh (samuel@ibrium.se)
*
* 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 "openbios/config.h"
#include "openbios/kernel.h"
#include "openbios/nvram.h"
#include "libc/vsprintf.h"
#include "libc/string.h"
#include "pearpc/pearpc.h"
#include <stdarg.h>
#define UART_BASE 0x3f8
// FIXME
unsigned long virt_offset = 0;
void
exit( int status )
{
for (;;);
}
void
fatal_error( const char *err )
{
printk("Fatal error: %s\n", err );
exit(0);
}
void
panic( const char *err )
{
printk("Panic: %s\n", err );
exit(0);
/* won't come here... this keeps the gcc happy */
for( ;; )
;
}
/************************************************************************/
/* print using OSI interface */
/************************************************************************/
static int do_indent;
int
printk( const char *fmt, ... )
{
char *p, buf[1024]; /* XXX: no buffer overflow protection... */
va_list args;
int i;
va_start(args, fmt);
i=vsprintf(buf,fmt,args);
va_end(args);
for( p=buf; *p; p++ ) {
if( *p == '\n' )
do_indent = 0;
if( do_indent++ == 1 ) {
putchar( '>' );
putchar( '>' );
putchar( ' ' );
}
putchar( *p );
}
return i;
}
/************************************************************************/
/* TTY iface */
/************************************************************************/
static int ttychar = -1;
static int
tty_avail( void )
{
return 1;
}
static int
tty_putchar( int c )
{
if( tty_avail() ) {
while (!(inb(UART_BASE + 0x05) & 0x20))
;
outb(c, UART_BASE);
while (!(inb(UART_BASE + 0x05) & 0x40))
;
}
return c;
}
int
availchar( void )
{
if( !tty_avail() )
return 0;
if( ttychar < 0 )
ttychar = inb(UART_BASE);
return (ttychar >= 0);
}
int
getchar( void )
{
int ch;
if( !tty_avail() )
return 0;
if( ttychar < 0 )
return inb(UART_BASE);
ch = ttychar;
ttychar = -1;
return ch;
}
int
putchar( int c )
{
if (c == '\n')
tty_putchar('\r');
return tty_putchar(c);
}
/************************************************************************/
/* briQ specific stuff */
/************************************************************************/
#define IO_NVRAM_PA_START 0x80860000
#define IO_NVRAM_PA_END 0x80880000
static char *nvram=(char *)IO_NVRAM_PA_START;
void
dump_nvram(void)
{
static char hexdigit[] = "0123456789abcdef";
int i;
for (i = 0; i < 16*4; i++)
{
printk ("%c", hexdigit[nvram[i<<4] >> 4]);
printk ("%c", hexdigit[nvram[i<<4] % 16]);
if (!((i + 1) % 16))
{
printk ("\n");
}
else
{
printk (" ");
}
}
}
int
arch_nvram_size( void )
{
return (IO_NVRAM_PA_END-IO_NVRAM_PA_START)>>4;
}
void
arch_nvram_put( char *buf )
{
int i;
for (i=0; i<(IO_NVRAM_PA_END-IO_NVRAM_PA_START)>>4; i++)
nvram[i<<4]=buf[i];
// memcpy(nvram, buf, IO_NVRAM_PA_END-IO_NVRAM_PA_START);
printk("new nvram:\n");
dump_nvram();
}
void
arch_nvram_get( char *buf )
{
int i;
for (i=0; i<(IO_NVRAM_PA_END-IO_NVRAM_PA_START)>>4; i++)
buf[i]=nvram[i<<4];
//memcpy(buf, nvram, IO_NVRAM_PA_END-IO_NVRAM_PA_START);
printk("current nvram:\n");
dump_nvram();
}

116
arch/ppc/pearpc/pearpc.fs Normal file
View File

@@ -0,0 +1,116 @@
\ pearpc specific initialization code
\
\ Copyright (C) 2005 Stefan Reinauer
\
\ This program is free software; you can redistribute it and/or
\ modify it under the terms of the GNU General Public License
\ as published by the Free Software Foundation
\
\ -------------------------------------------------------------------------
\ initialization
\ -------------------------------------------------------------------------
: make-openable ( path )
find-dev if
begin ?dup while
\ install trivial open and close methods
dup active-package! is-open
parent
repeat
then
;
: preopen ( chosen-str node-path )
2dup make-openable
" /chosen" find-device
open-dev ?dup if
encode-int 2swap property
else
2drop
then
;
\ preopen device nodes (and store the ihandles under /chosen)
:noname
" rtc" " /pci/isa/rtc" preopen
" memory" " /memory" preopen
" mmu" " /cpu@0" preopen
\ " stdout" " /packages/terminal-emulator" preopen
" stdout" " /pci/pci6666,6666" preopen
" stdin" " /pci/via-cuda/adb" preopen
; SYSTEM-initializer
\ -------------------------------------------------------------------------
\ device tree fixing
\ -------------------------------------------------------------------------
\ add decode-address methods
: (make-decodable) ( phandle -- )
dup " #address-cells" rot get-package-property 0= if
decode-int nip nip
over " decode-unit" rot find-method if 2drop else
( save phandle ncells )
over active-package!
case
1 of ['] parse-hex " decode-unit" is-xt-func endof
3 of
" bus-range" active-package get-package-property 0= if
decode-int nip nip
['] encode-unit-pci " encode-unit" is-xt-func
" decode-unit" is-func-begin
['] (lit) , ,
['] decode-unit-pci-bus ,
is-func-end
then
endof
endcase
then
then
drop
;
: init-pearpc-tree ( -- )
active-package
iterate-tree-begin
begin ?dup while
dup (make-decodable)
iterate-tree
repeat
active-package!
;
\ use the tty interface if available
: activate-tty-interface
" /packages/terminal-emulator" find-dev if drop
" /pci/via-cuda/adb" " input-device" $setenv
" /pci/pci6666,6666" " output-device" $setenv
then
;
:noname
" keyboard" input
; CONSOLE-IN-initializer
\ -------------------------------------------------------------------------
\ pre-booting
\ -------------------------------------------------------------------------
: update-chosen
" /chosen" find-device
stdin @ encode-int " stdin" property
stdout @ encode-int " stdout" property
" /pci/isa/interrupt-controller" find-dev if encode-int " interrupt-controller" property then
device-end
;

26
arch/ppc/pearpc/pearpc.h Normal file
View File

@@ -0,0 +1,26 @@
/*
* Creation Date: <2004/08/28 17:50:12 stepan>
* Time-stamp: <2004/08/28 17:50:12 stepan>
*
* <pearpc.h>
*
* Copyright (C) 2005 Stefan Reinauer
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2
*
*/
#ifndef _H_PEARPC
#define _H_PEARPC
/* vfd.c */
extern int vfd_draw_str( const char *str );
extern void vfd_close( void );
extern int console_draw_str( const char *str );
#include "kernel.h"
#endif /* _H_PEARPC */

23
arch/ppc/pearpc/tree.c Normal file
View File

@@ -0,0 +1,23 @@
/*
* Creation Date: <2004/08/28 18:38:22 greg>
* Time-stamp: <2004/08/28 18:38:22 greg>
*
* <tree.c>
*
* device tree setup
*
* Copyright (C) 2004 Greg Watson
*
* 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 "openbios/config.h"
#include "openbios/bindings.h"
void devtree_init( void )
{
fword("init-pearpc-tree");
}

247
arch/ppc/pearpc/tree.fs Normal file
View File

@@ -0,0 +1,247 @@
\ PearPC specific initialization code
\
\ Copyright (C) 2005 Stefan Reinauer
\
\ This program is free software; you can redistribute it and/or
\ modify it under the terms of the GNU General Public License
\ as published by the Free Software Foundation
\
\ -------------------------------------------------------------
\ device-tree
\ -------------------------------------------------------------
" /" find-device
" chrp" device-type
" OpenSource,PEARPC" model
h# 80000000 encode-int " isa-io-base" property
1 encode-int " #interrupt-cells" property
1 encode-int " #size-cells" property
new-device
" memory" device-name
" memory" device-type
0 encode-int h# 1E00000 encode-int encode+
h# 2000000 encode-int encode+ h# 40000000 encode-int encode+
" available" property
0 h# 40000000 reg
external
: open true ;
: close ;
finish-device
new-device
" cpu" device-name
" cpu" device-type
" " encode-string " translations" property
0 encode-phys h# 8000000 encode-int encode+ " available" property
d# 32 encode-int " d-cache-block-size" property
8 encode-int " d-cache-sets" property
d# 32768 encode-int " d-cache-size" property
d# 32 encode-int " i-cache-block-size" property
8 encode-int " i-cache-sets" property
d# 32768 encode-int " i-cache-size" property
" " encode-string " cache-unified" property
2 encode-int " i-tlb-sets" property
d# 128 encode-int " i-tlb-size" property
2 encode-int " d-tlb-sets" property
d# 128 encode-int " d-tlb-size" property
" " encode-string " tlb-split" property
2 encode-int " tlb-sets" property
d# 256 encode-int " tlb-size" property
" " encode-string " performance-monitor" property
" " encode-string " graphics" property
4 encode-int " reservation-granule-size" property
d# 25000000 encode-int " timebase-frequency" property
d# 300000000 encode-int " clock-frequency" property
d# 66000000 encode-int " bus-frequency" property
h# 88201 encode-int " cpu-version" property
0 encode-int " reg" property
finish-device
" /pci" find-device
h# 01000000 encode-int 0 encode-int encode+ 0 encode-int encode+
h# 80000000 encode-int encode+ 0 encode-int encode+
h# 01000000 encode-int encode+
h# 02000000 encode-int encode+ 0 encode-int encode+ 0 encode-int encode+
h# C0000000 encode-int encode+ 0 encode-int encode+
h# 08000000 encode-int encode+
" ranges" property
" IBM,CPC710" model
h# FF5F7700 encode-int " 8259-interrupt-acknowledge" property
h# 0000F800 encode-int 0 encode-int encode+ 0 encode-int encode+
7 encode-int encode+
" interrupt-map-mask" property
1 encode-int " #interrupt-cells" property
h# 80000000 encode-int " system-dma-base" property
d# 33333333 encode-int " clock-frequency" property
" " encode-string " primary-bridge" property
0 encode-int " pci-bridge-number" property
h# FEC00000 encode-int h# 100000 encode-int encode+ " reg" property
0 encode-int 0 encode-int encode+ " bus-range" property
new-device
" ide" device-name
" ide" device-type
" WINBOND,82C553" model
h# 28 encode-int " max-latency" property
h# 2 encode-int " min-grant" property
h# 1 encode-int " devsel-speed" property
h# 0 encode-int " subsystem-vendor-id" property
h# 0 encode-int " subsystem-id" property
h# 1018A encode-int " class-code" property
h# 5 encode-int " revision-id" property
h# 105 encode-int " device-id" property
h# 10AD encode-int " vendor-id" property
h# 1003110 encode-int 0 encode-int encode+ h# 10020 encode-int encode+
h# 10 encode-int encode+ 0 encode-int encode+
h# 1003114 encode-int 0 encode-int encode+ h# 10030 encode-int encode+
h# 4 encode-int encode+ 0 encode-int encode+
h# 1003118 encode-int 0 encode-int encode+ h# 10040 encode-int encode+
h# 10 encode-int encode+ 0 encode-int encode+
h# 100311C encode-int 0 encode-int encode+ h# 10034 encode-int encode+
h# 4 encode-int encode+ 0 encode-int encode+
h# 1003120 encode-int 0 encode-int encode+ h# 10050 encode-int encode+
h# 10 encode-int encode+ 0 encode-int encode+
h# 1003124 encode-int 0 encode-int encode+ h# 10060 encode-int encode+
h# 10 encode-int encode+ 0 encode-int encode+
" assigned-addresses" property
h# 3100 encode-int 0 encode-int encode+ 0 encode-int encode+
0 encode-int encode+ 0 encode-int encode+
h# 1003110 encode-int 0 encode-int encode+ h# 0 encode-int encode+
h# 10 encode-int encode+ 0 encode-int encode+
h# 1003114 encode-int 0 encode-int encode+ h# 0 encode-int encode+
h# 4 encode-int encode+ 0 encode-int encode+
h# 1003118 encode-int 0 encode-int encode+ h# 0 encode-int encode+
h# 10 encode-int encode+ 0 encode-int encode+
h# 100311C encode-int 0 encode-int encode+ h# 0 encode-int encode+
h# 4 encode-int encode+ 0 encode-int encode+
h# 1003120 encode-int 0 encode-int encode+ h# 0 encode-int encode+
h# 10 encode-int encode+ 0 encode-int encode+
h# 1003124 encode-int 0 encode-int encode+ h# 0 encode-int encode+
h# 10 encode-int encode+ 0 encode-int encode+
" reg" property
finish-device
new-device
" ethernet" device-name
" network" device-type
" AMD,79C973" model
h# 3800 encode-int 0 encode-int encode+ 0 encode-int encode+
0 encode-int encode+ 0 encode-int encode+
" reg" property
finish-device
" /pci/isa" find-device
0 0 " assigned-addresses" property
0 0 " ranges" property
0 encode-int " slot-names" property
d# 8333333 encode-int " clock-frequency" property
0 encode-int " eisa-slots" property
2 encode-int " #interrupt-cells" property
" W83C553F" encode-string " compatible" property
" WINBOND,82C553" model
0 encode-int " max-latency" property
0 encode-int " min-grant" property
1 encode-int " devsel-speed" property
0 encode-int " subsystem-vendor-id" property
0 encode-int " subsystem-id" property
h# 60100 encode-int " class-code" property
h# 10 encode-int " revision-id" property
h# 565 encode-int " device-id" property
h# 10AD encode-int " vendor-id" property
h# 3000 encode-int 0 encode-int encode+ 0 encode-int encode+
0 encode-int encode+ 0 encode-int encode+ " reg" property
new-device
" rtc" device-name
" rtc" device-type
" DS17285S" model
" MC146818" encode-string
" DS17285S" encode-string encode+
" pnpPNP,b00" encode-string encode+ " compatible" property
8 encode-int 0 encode-int encode+ " interrupts" property
h# 70 encode-int 1 encode-int encode+
2 encode-int encode+ " reg" property
finish-device
new-device
" interrupt-controller" device-name
" interrupt-controller" device-type
" 8259" model
" " encode-string " interrupt-controller" property
2 encode-int " #interrupt-cells" property
1 encode-int
2 encode-int encode+
3 encode-int encode+
6 encode-int encode+
" reserved-interrupts" property
" 8259" encode-string
" chrp,iic" encode-string encode+
" compatible" property
h# 20 encode-int 1 encode-int encode+
2 encode-int encode+ " reg" property
finish-device
new-device
" serial" device-name
" serial" device-type
" no" encode-string " ctsrts" property
" no" encode-string " xon" property
" no" encode-string " parity" property
d# 115200 encode-int " bps" property
1 encode-int " stop-bits" property
8 encode-int " data-bits" property
h# 70800 encode-int " divisor" property
h# 708000 encode-int " clock-frequency" property
4 encode-int 0 encode-int encode+ " interrupts" property
h# 3F8 encode-int 1 encode-int encode+
8 encode-int encode+ " reg" property
finish-device
" /pci" find-device
" /pci/isa/interrupt-controller" find-dev if
encode-int " interrupt-parent" property
then
h# 3800 encode-int 0 encode-int encode+
0 encode-int encode+ 1 encode-int encode+
" /pci/isa/interrupt-controller" find-dev if
encode-int encode+
then
h# 0C encode-int encode+ 1 encode-int encode+
" interrupt-map" property
" /pci/isa" find-device
" /pci/isa/interrupt-controller" find-dev if
encode-int " interrupt-parent" property
then
\ -------------------------------------------------------------
\ /packages
\ -------------------------------------------------------------
" /packages" find-device
" packages" device-name
external
\ allow packages to be opened with open-dev
: open true ;
: close ;
\ /packages/terminal-emulator
new-device
" terminal-emulator" device-name
external
: open true ;
: close ;
\ : write ( addr len -- actual )
\ dup -rot type
\ ;
finish-device
\ -------------------------------------------------------------
\ The END
\ -------------------------------------------------------------
device-end

42
arch/ppc/pearpc/vfd.c Normal file
View File

@@ -0,0 +1,42 @@
/*
* Creation Date: <2004/08/28 17:29:43 greg>
* Time-stamp: <2004/08/28 17:29:43 greg>
*
* <vfd.c>
*
* Simple text console
*
* Copyright (C) 2004 Greg Watson
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation
*
*/
#include "openbios/config.h"
#include "openbios/bindings.h"
#include "pearpc/pearpc.h"
static int vfd_is_open;
static int
vfd_init( void )
{
vfd_is_open = 1;
return 0;
}
void
vfd_close( void )
{
}
int
vfd_draw_str( const char *str )
{
if (!vfd_is_open)
vfd_init();
return 0;
}