mirror of
https://gitlab.com/qemu-project/openbios.git
synced 2024-02-13 08:34:06 +08:00
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:
@@ -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"/>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user