Author: blueswirl Date: 2009-01-09 22:00:38 +0100 (Fri, 09 Jan 2009) New Revision: 376
Modified: openbios-devel/arch/sparc64/build.xml openbios-devel/arch/sparc64/console.c openbios-devel/arch/sparc64/init.fs openbios-devel/arch/sparc64/openbios.c openbios-devel/arch/sparc64/tree.fs openbios-devel/config/examples/cross-sparc64_config.xml openbios-devel/config/examples/sparc64_config.xml openbios-devel/include/sparc64/io.h Log: Enable Sparc64 PCI probing, use probed display but not IDE
Modified: openbios-devel/arch/sparc64/build.xml =================================================================== --- openbios-devel/arch/sparc64/build.xml 2009-01-09 20:58:23 UTC (rev 375) +++ openbios-devel/arch/sparc64/build.xml 2009-01-09 21:00:38 UTC (rev 376) @@ -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="libdrivers.a"/> + <!-- Needs to be after drivers to avoid missing symbols --> <external-object source="libmodules.a"/> - <external-object source="libdrivers.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="libdrivers.a"/> + <!-- Needs to be after drivers to avoid missing symbols --> <external-object source="libmodules.a"/> - <external-object source="libdrivers.a"/> <external-object source="liblibc.a"/> <external-object source="libfs.a"/> <external-object source="libgcc.a"/>
Modified: openbios-devel/arch/sparc64/console.c =================================================================== --- openbios-devel/arch/sparc64/console.c 2009-01-09 20:58:23 UTC (rev 375) +++ openbios-devel/arch/sparc64/console.c 2009-01-09 21:00:38 UTC (rev 376) @@ -122,141 +122,6 @@ * 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,9 +238,7 @@ last_key = 0; return tmp; } -#endif
- /* ****************************************************************** * common functions, implementing simple concurrent console * ****************************************************************** */ @@ -385,9 +248,6 @@ #ifdef CONFIG_DEBUG_CONSOLE_SERIAL serial_putchar(c); #endif -#ifdef CONFIG_DEBUG_CONSOLE_VGA - video_putchar(c); -#endif return c; }
@@ -422,9 +282,6 @@ #ifdef CONFIG_DEBUG_CONSOLE_SERIAL serial_cls(); #endif -#ifdef CONFIG_DEBUG_CONSOLE_VGA - video_cls(); -#endif }
#endif // CONFIG_DEBUG_CONSOLE
Modified: openbios-devel/arch/sparc64/init.fs =================================================================== --- openbios-devel/arch/sparc64/init.fs 2009-01-09 20:58:23 UTC (rev 375) +++ openbios-devel/arch/sparc64/init.fs 2009-01-09 21:00:38 UTC (rev 376) @@ -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
Modified: openbios-devel/arch/sparc64/openbios.c =================================================================== --- openbios-devel/arch/sparc64/openbios.c 2009-01-09 20:58:23 UTC (rev 375) +++ openbios-devel/arch/sparc64/openbios.c 2009-01-09 21:00:38 UTC (rev 376) @@ -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 @@ 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 @@ { 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 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,18 +480,34 @@ 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(); printk("OpenBIOS for Sparc64\n");
Modified: openbios-devel/arch/sparc64/tree.fs =================================================================== --- openbios-devel/arch/sparc64/tree.fs 2009-01-09 20:58:23 UTC (rev 375) +++ openbios-devel/arch/sparc64/tree.fs 2009-01-09 21:00:38 UTC (rev 376) @@ -33,54 +33,16 @@ " /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
Modified: openbios-devel/config/examples/cross-sparc64_config.xml =================================================================== --- openbios-devel/config/examples/cross-sparc64_config.xml 2009-01-09 20:58:23 UTC (rev 375) +++ openbios-devel/config/examples/cross-sparc64_config.xml 2009-01-09 21:00:38 UTC (rev 376) @@ -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"/>
Modified: openbios-devel/config/examples/sparc64_config.xml =================================================================== --- openbios-devel/config/examples/sparc64_config.xml 2009-01-09 20:58:23 UTC (rev 375) +++ openbios-devel/config/examples/sparc64_config.xml 2009-01-09 21:00:38 UTC (rev 376) @@ -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"/>
Modified: openbios-devel/include/sparc64/io.h =================================================================== --- openbios-devel/include/sparc64/io.h 2009-01-09 20:58:23 UTC (rev 375) +++ openbios-devel/include/sparc64/io.h 2009-01-09 21:00:38 UTC (rev 376) @@ -33,9 +33,7 @@
#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 @@ * 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.