Enable Sparc64 PCI probing, use probed display but not IDE

git-svn-id: svn://coreboot.org/openbios/openbios-devel@376 f158a5a8-5612-0410-a976-696ce0be7e32
This commit is contained in:
Blue Swirl
2009-01-09 21:00:38 +00:00
parent bc7a813d71
commit 0c3877f095
8 changed files with 58 additions and 237 deletions

View File

@@ -41,8 +41,9 @@
<external-object source="target/arch/sparc64/entry.o"/>
<external-object source="libsparc64.a"/>
<external-object source="libbootstrap.a"/>
<external-object source="libmodules.a"/>
<external-object source="libdrivers.a"/>
<!-- Needs to be after drivers to avoid missing symbols -->
<external-object source="libmodules.a"/>
<external-object source="liblibc.a"/>
<external-object source="libfs.a"/>
<external-object source="libgcc.a"/>
@@ -78,8 +79,9 @@
<external-object source="target/arch/sparc64/builtin.o"/>
<external-object source="libsparc64.a"/>
<external-object source="libbootstrap.a"/>
<external-object source="libmodules.a"/>
<external-object source="libdrivers.a"/>
<!-- Needs to be after drivers to avoid missing symbols -->
<external-object source="libmodules.a"/>
<external-object source="liblibc.a"/>
<external-object source="libfs.a"/>
<external-object source="libgcc.a"/>

View File

@@ -122,141 +122,6 @@ static void serial_cls(void)
* simple polling video/keyboard console functions
* ****************************************************************** */
#ifdef CONFIG_DEBUG_CONSOLE_VGA
/* raw vga text mode */
#define COLUMNS 80 /* The number of columns. */
#define LINES 25 /* The number of lines. */
#define ATTRIBUTE 7 /* The attribute of an character. */
#define APB_MEM_BASE 0x1ff00000000ULL
#define VGA_BASE (APB_MEM_BASE + 0x4a0000ULL) /* Beginning of video memory address. */
#define TEXT_BASE (VGA_BASE + 0x18000ULL) /* The text memory address. */
/* VGA Index and Data Registers */
#define VGA_REG_INDEX 0x03D4 /* VGA index register */
#define VGA_REG_DATA 0x03D5 /* VGA data register */
#define VGA_IDX_CURMSL 0x09 /* cursor maximum scan line */
#define VGA_IDX_CURSTART 0x0A /* cursor start */
#define VGA_IDX_CUREND 0x0B /* cursor end */
#define VGA_IDX_CURLO 0x0F /* cursor position (low 8 bits) */
#define VGA_IDX_CURHI 0x0E /* cursor position (high 8 bits) */
/* Save the X and Y position. */
static int xpos, ypos;
/* Point to the video memory. */
static unsigned char *video = (unsigned char *) TEXT_BASE;
static void video_initcursor(void)
{
u8 val;
outb(VGA_IDX_CURMSL, VGA_REG_INDEX);
val = inb(VGA_REG_DATA) & 0x1f; /* maximum scan line -1 */
outb(VGA_IDX_CURSTART, VGA_REG_INDEX);
outb(0, VGA_REG_DATA);
outb(VGA_IDX_CUREND, VGA_REG_INDEX);
outb(val, VGA_REG_DATA);
}
static void video_poscursor(unsigned int x, unsigned int y)
{
unsigned short pos;
/* Calculate new cursor position as a function of x and y */
pos = (y * COLUMNS) + x;
/* Output the new position to VGA card */
outb(VGA_IDX_CURLO, VGA_REG_INDEX); /* output low 8 bits */
outb((u8) (pos), VGA_REG_DATA);
outb(VGA_IDX_CURHI, VGA_REG_INDEX); /* output high 8 bits */
outb((u8) (pos >> 8), VGA_REG_DATA);
};
static void video_newline(void)
{
xpos = 0;
if (ypos < LINES - 1) {
ypos++;
} else {
int i;
memmove((void *) video, (void *) (video + 2 * COLUMNS),
(LINES - 1) * COLUMNS * 2);
for (i = ((LINES - 1) * 2 * COLUMNS);
i < 2 * COLUMNS * LINES;) {
video[i++] = 0;
video[i++] = ATTRIBUTE;
}
}
}
/* Put the character C on the screen. */
static void video_putchar(int c)
{
int p=1;
if (c == '\n' || c == '\r') {
video_newline();
return;
}
if (c == '\b') {
if (xpos) xpos--;
c=' ';
p=0;
}
if (xpos >= COLUMNS)
video_newline();
*(video + (xpos + ypos * COLUMNS) * 2) = c & 0xFF;
*(video + (xpos + ypos * COLUMNS) * 2 + 1) = ATTRIBUTE;
if (p)
xpos++;
video_poscursor(xpos, ypos);
}
static void video_cls(void)
{
int i;
for (i = 0; i < 2 * COLUMNS * LINES;) {
video[i++] = 0;
video[i++] = ATTRIBUTE;
}
xpos = 0;
ypos = 0;
video_initcursor();
video_poscursor(xpos, ypos);
}
void video_init(void)
{
video=(unsigned char *)TEXT_BASE;
#ifdef CONFIG_DRIVER_VGA
vga_load_regs();
vga_font_load((unsigned char *)VGA_BASE, fontdata_8x16,
FONT_HEIGHT_8X16, 256);
vga_set_amode();
#endif
}
/*
* keyboard driver
*/
@@ -373,8 +238,6 @@ static unsigned char keyboard_readdata(void)
last_key = 0;
return tmp;
}
#endif
/* ******************************************************************
* common functions, implementing simple concurrent console
@@ -384,9 +247,6 @@ int putchar(int c)
{
#ifdef CONFIG_DEBUG_CONSOLE_SERIAL
serial_putchar(c);
#endif
#ifdef CONFIG_DEBUG_CONSOLE_VGA
video_putchar(c);
#endif
return c;
}
@@ -422,9 +282,6 @@ void cls(void)
#ifdef CONFIG_DEBUG_CONSOLE_SERIAL
serial_cls();
#endif
#ifdef CONFIG_DEBUG_CONSOLE_VGA
video_cls();
#endif
}
#endif // CONFIG_DEBUG_CONSOLE

View File

@@ -36,12 +36,12 @@
; SYSTEM-initializer
\ use the tty interface if available
:noname
" /builtin/console" find-dev if drop
" /builtin/console" " input-device" $setenv
" /builtin/console" " output-device" $setenv
: activate-tty-interface
" /packages/terminal-emulator" find-dev if drop
" keyboard" " input-device" $setenv
" screen" " output-device" $setenv
then
; SYSTEM-initializer
;
:noname
" keyboard" input

View File

@@ -34,7 +34,6 @@
#define NVRAM_DATA 0x77
#define APB_SPECIAL_BASE 0x1fe00000000ULL
#define PCI_CONFIG (APB_SPECIAL_BASE + 0x1000000ULL)
#define APB_MEM_BASE 0x1ff00000000ULL
#define MEMORY_SIZE (512*1024) /* 512K ram for hosted system */
@@ -64,11 +63,18 @@ struct hwdef {
static const struct hwdef hwdefs[] = {
{
.pci = {
.cfg_addr = PCI_CONFIG,
.cfg_data = 0,
.name = "SUNW,sabre",
.vendor_id = 0x108e,
.device_id = 0xa000,
.cfg_addr = APB_SPECIAL_BASE + 0x1000000ULL,
.cfg_data = APB_MEM_BASE,
.cfg_base = 0x80000000ULL,
.cfg_len = 0,
.irqs = { 1, 2, 3, 4 },
.mem_base = APB_MEM_BASE + 0x400000ULL,
.mem_len = 0x10000000,
.io_base = APB_SPECIAL_BASE + 0x2000000ULL,
.io_len = 0x10000,
.irqs = { 0, 1, 2, 3 },
},
.machine_id_low = 0,
.machine_id_high = 255,
@@ -243,7 +249,7 @@ fw_cfg_read(uint16_t cmd, char *buf, unsigned int nbytes)
{
unsigned int i;
outw(__cpu_to_le16(cmd), BIOS_CFG_CMD);
outw(cmd, BIOS_CFG_CMD);
for (i = 0; i < nbytes; i++)
buf[i] = inb(BIOS_CFG_DATA);
}
@@ -457,36 +463,16 @@ static void init_memory(void)
static void
arch_init( void )
{
unsigned int i;
uint16_t machine_id;
const struct hwdef *hwdef = NULL;
machine_id = fw_cfg_read_i16(FW_CFG_MACHINE_ID);
for (i = 0; i < sizeof(hwdefs) / sizeof(struct hwdef); i++) {
if (hwdefs[i].machine_id_low <= machine_id &&
hwdefs[i].machine_id_high >= machine_id) {
hwdef = &hwdefs[i];
break;
}
}
if (!hwdef)
for(;;); // Internal inconsistency, hang
modules_init();
#ifdef CONFIG_DRIVER_PCI
//ob_pci_init();
#endif
#ifdef CONFIG_DRIVER_IDE
// XXX use PCI IDE
setup_timers();
ob_ide_init("/pci/isa", 0x1f0, 0x3f4, 0x170, 0x374);
#ifdef CONFIG_DRIVER_PCI
ob_pci_init();
#endif
#ifdef CONFIG_DRIVER_FLOPPY
ob_floppy_init();
#endif
#ifdef CONFIG_DEBUG_CONSOLE_VIDEO
init_video();
#endif
nvconf_init();
ob_su_init(0x1fe02000000ULL, 0x3f8ULL, 0);
@@ -494,17 +480,33 @@ arch_init( void )
device_end();
bind_func("platform-boot", boot );
printk("\n"); // XXX needed for boot, why?
}
unsigned long isa_io_base;
int openbios(void)
{
unsigned int i;
uint16_t machine_id;
const struct hwdef *hwdef = NULL;
for (i = 0; i < sizeof(hwdefs) / sizeof(struct hwdef); i++) {
isa_io_base = hwdefs[i].pci.io_base;
machine_id = fw_cfg_read_i16(FW_CFG_MACHINE_ID);
if (hwdefs[i].machine_id_low <= machine_id &&
hwdefs[i].machine_id_high >= machine_id) {
hwdef = &hwdefs[i];
arch = &hwdefs[i].pci;
break;
}
}
if (!hwdef)
for(;;); // Internal inconsistency, hang
#ifdef CONFIG_DEBUG_CONSOLE
#ifdef CONFIG_DEBUG_CONSOLE_SERIAL
uart_init(CONFIG_SERIAL_PORT, CONFIG_SERIAL_SPEED);
#endif
#ifdef CONFIG_DEBUG_CONSOLE_VGA
video_init();
#endif
/* Clear the screen. */
cls();

View File

@@ -33,54 +33,16 @@ finish-device
" /openprom" find-device
" OBP 3.10.24 1999/01/01 01:01" encode-string " version" property
device-end
\ we only implement DD and DD,F
: encode-unit-pci ( phys.lo phy.mid phys.hi -- str len )
nip nip ff00 and 8 >> dup 3 >>
swap 7 and
( ddddd fff )
?dup if
pocket tohexstr
" ," pocket tmpstrcat
else
0 0 pocket tmpstrcpy
then
>r
rot pocket tohexstr r> tmpstrcat drop
;
dev /
\ simple pci bus node
new-device
" pci" device-name
3 encode-int " #address-cells" property
2 encode-int " #size-cells" property
0 encode-int 0 encode-int encode+ " bus-range" property
" pci" encode-string " device_type" property
external
: open ( cr ." opening PCI" cr ) true ;
: close ;
: decode-unit 0 decode-unit-pci-bus ;
: encode-unit encode-unit-pci ;
finish-device
device-end
dev /pci
\ simple isa bus node
new-device
" isa" device-name
" isa" device-type
2 encode-int " #address-cells" property
1 encode-int " #size-cells" property
external
: open true ;
: close ;
finish-device

View File

@@ -35,8 +35,8 @@
<!-- Module Configuration -->
<option name="CONFIG_CMDLINE" type="boolean" value="true"/>
<option name="CONFIG_DEBLOCKER" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X8" type="boolean" value="false"/>
<option name="CONFIG_FONT_8X16" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X8" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X16" type="boolean" value="false"/>
<!-- Filesystem Configuration -->
<option name="CONFIG_DISK_LABEL" type="boolean" value="true"/>
@@ -67,7 +67,7 @@
<!-- Drivers -->
<option name="CONFIG_DRIVER_PCI" type="boolean" value="true"/>
<option name="CONFIG_DEBUG_PCI" type="boolean" value="true"/>
<option name="CONFIG_DEBUG_PCI" type="boolean" value="false"/>
<option name="CONFIG_DRIVER_IDE" type="boolean" value="true"/>
<option name="CONFIG_IDE_NUM_CHANNELS" type="integer" value="4"/>
<option name="CONFIG_DEBUG_IDE" type="boolean" value="false"/>

View File

@@ -35,8 +35,8 @@
<!-- Module Configuration -->
<option name="CONFIG_CMDLINE" type="boolean" value="true"/>
<option name="CONFIG_DEBLOCKER" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X8" type="boolean" value="false"/>
<option name="CONFIG_FONT_8X16" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X8" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X16" type="boolean" value="false"/>
<!-- Filesystem Configuration -->
<option name="CONFIG_DISK_LABEL" type="boolean" value="true"/>
@@ -67,7 +67,7 @@
<!-- Drivers -->
<option name="CONFIG_DRIVER_PCI" type="boolean" value="true"/>
<option name="CONFIG_DEBUG_PCI" type="boolean" value="true"/>
<option name="CONFIG_DEBUG_PCI" type="boolean" value="false"/>
<option name="CONFIG_DRIVER_IDE" type="boolean" value="true"/>
<option name="CONFIG_IDE_NUM_CHANNELS" type="integer" value="4"/>
<option name="CONFIG_DEBUG_IDE" type="boolean" value="false"/>

View File

@@ -33,9 +33,7 @@ pa2va(unsigned long pa)
#ifndef BOOTSTRAP
#ifndef _IO_BASE
#define _IO_BASE 0x1fe02000000ULL
#endif
extern unsigned long isa_io_base;
/*
* The insw/outsw/insl/outsl macros don't do byte-swapping.
@@ -43,15 +41,15 @@ pa2va(unsigned long pa)
* are arrays of bytes, and byte-swapping is not appropriate in
* that case. - paulus
*/
#define insw(port, buf, ns) _insw_ns((uint16_t *)((port)+_IO_BASE), (buf), (ns))
#define outsw(port, buf, ns) _outsw_ns((uint16_t *)((port)+_IO_BASE), (buf), (ns))
#define insw(port, buf, ns) _insw_ns((uint16_t *)((port)+isa_io_base), (buf), (ns))
#define outsw(port, buf, ns) _outsw_ns((uint16_t *)((port)+isa_io_base), (buf), (ns))
#define inb(port) in_8((uint8_t *)((port)+_IO_BASE))
#define outb(val, port) out_8((uint8_t *)((port)+_IO_BASE), (val))
#define inw(port) in_le16((uint16_t *)((port)+_IO_BASE))
#define outw(val, port) out_le16((uint16_t *)((port)+_IO_BASE), (val))
#define inl(port) in_le32((uint32_t *)((port)+_IO_BASE))
#define outl(val, port) out_le32((uint32_t *)((port)+_IO_BASE), (val))
#define inb(port) in_8((uint8_t *)((port)+isa_io_base))
#define outb(val, port) out_8((uint8_t *)((port)+isa_io_base), (val))
#define inw(port) in_be16((uint16_t *)((port)+isa_io_base))
#define outw(val, port) out_be16((uint16_t *)((port)+isa_io_base), (val))
#define inl(port) in_be32((uint32_t *)((port)+isa_io_base))
#define outl(val, port) out_be32((uint32_t *)((port)+isa_io_base), (val))
/*
* 8, 16 and 32 bit, big and little endian I/O operations, with barrier.