[OpenBIOS] r176 - in openbios-devel: arch/sparc32 arch/sparc64 drivers include/openbios

svn at openbios.org svn at openbios.org
Wed Nov 14 20:25:44 CET 2007


Author: blueswirl
Date: 2007-11-14 20:25:43 +0100 (Wed, 14 Nov 2007)
New Revision: 176

Added:
   openbios-devel/include/openbios/firmware_abi.h
Modified:
   openbios-devel/arch/sparc32/entry.S
   openbios-devel/arch/sparc64/boot.c
   openbios-devel/arch/sparc64/boot.h
   openbios-devel/arch/sparc64/entry.S
   openbios-devel/arch/sparc64/openbios.c
   openbios-devel/arch/sparc64/sys_info.c
   openbios-devel/drivers/obio.c
   openbios-devel/drivers/obio.h
Log:
Update OHW interface to version 3.
Use common ABI description file with Qemu for both Sparc32 and Sparc64.
Remove private definitions and magic constants.


Modified: openbios-devel/arch/sparc32/entry.S
===================================================================
--- openbios-devel/arch/sparc32/entry.S	2007-11-11 18:02:11 UTC (rev 175)
+++ openbios-devel/arch/sparc32/entry.S	2007-11-14 19:25:43 UTC (rev 176)
@@ -10,6 +10,8 @@
 #include "psr.h"
 #include "asi.h"
 #include "asm/crs.h"
+#define __ASSEMBLY__
+#include "openbios/firmware_abi.h"
 
 #define PHYS_JJ_EEPROM	0x71200000  /* [2000] MK48T08 */
 #define PHYS_JJ_INTR0	0x71E00000  /* CPU0 interrupt control registers */
@@ -17,8 +19,6 @@
 #define PHYS_SS10_EEPROM	0xf1200000
 #define PHYS_SS10_INTR0 	0xf1400000
 
-#define SUN_MACHINE_ID 0x1fd9
-
 #define WRITE_PAUSE    nop; nop; nop; /* Have to do this after %wim/%psr chg */
 
         .globl	entry, _entry
@@ -56,12 +56,17 @@
 
         ! Ok, this is SS-5
         mov     0x80, %y
+        ! Find architecture specific part
+        set     PHYS_JJ_EEPROM + OHW_ARCH_PTR, %g1
+        lduha   [%g1] ASI_M_BYPASS, %g2
+        set     PHYS_JJ_EEPROM, %g1
+        add     %g1, %g2, %g3
         ! Check if this not the first SMP CPU, if so, bypass PROM entirely
-        set     PHYS_JJ_EEPROM + 0x2E, %g1
+        add     %g3, SPARC_SMP_VALID, %g1
         lduba   [%g1] ASI_M_BYPASS, %g2
         stba    %g0, [%g1] ASI_M_BYPASS
-        set	PHYS_JJ_EEPROM + 0x30, %g1
-        lda	[%g1] ASI_M_BYPASS, %g1
+        set	PHYS_JJ_EEPROM + OHW_RAM_SIZE, %g1
+        ldda	[%g1] ASI_M_BYPASS, %g0
         tst     %g2
         bz      first_cpu
          nop
@@ -73,17 +78,17 @@
         sta     %g1, [%g2] ASI_M_BYPASS         ! clear softints
         add     %g2, 4, %g2
         sta     %g0, [%g2] ASI_M_BYPASS         ! clear softints
-        set     PHYS_JJ_EEPROM + 0x3C, %g1
+        add     %g3, SPARC_SMP_CTXTBL, %g1
         lda     [%g1] ASI_M_BYPASS, %g2
         sta     %g0, [%g1] ASI_M_BYPASS
         set     AC_M_CTPR, %g1
         sta     %g2, [%g1] ASI_M_MMUREGS        ! set ctx table ptr
-        set     PHYS_JJ_EEPROM + 0x40, %g1
+        add     %g3, SPARC_SMP_CTX, %g1
         lda     [%g1] ASI_M_BYPASS, %g2
         sta     %g0, [%g1] ASI_M_BYPASS
         set     AC_M_CXR, %g1
         sta     %g2, [%g1] ASI_M_MMUREGS        ! set context
-        set     PHYS_JJ_EEPROM + 0x38, %g1
+        add     %g3, SPARC_SMP_ENTRY, %g1
         lda     [%g1] ASI_M_BYPASS, %g2
         sta     %g0, [%g1] ASI_M_BYPASS
         set     1, %g1
@@ -113,15 +118,20 @@
         bne     bad_nvram
         
         ! Ok, this is SS-10 or SS-600MP
-        ! Check if this not the first SMP CPU, if so, bypass PROM entirely
-        set     PHYS_SS10_EEPROM + SUN_MACHINE_ID, %g1
+        set     PHYS_SS10_EEPROM + SPARC_MACHINE_ID, %g1
         lduba   [%g1] ASI_M_CTL, %g2
         mov     %g2, %y
-        set     PHYS_SS10_EEPROM + 0x2E, %g1
+        ! Find architecture specific part
+        set     PHYS_SS10_EEPROM + OHW_ARCH_PTR, %g1
+        lduha   [%g1] ASI_M_CTL, %g2
+        set     PHYS_SS10_EEPROM, %g1
+        add     %g1, %g2, %g3
+        ! Check if this not the first SMP CPU, if so, bypass PROM entirely
+        add     %g3, SPARC_SMP_VALID, %g1
         lduba   [%g1] ASI_M_CTL, %g2
         stba    %g0, [%g2] ASI_M_CTL
-        set	PHYS_SS10_EEPROM + 0x30, %g1
-        lda	[%g1] ASI_M_CTL, %g1
+        set     PHYS_SS10_EEPROM + OHW_RAM_SIZE, %g1
+        ldda	[%g1] ASI_M_CTL, %g0
         tst     %g2
         bz      first_cpu
          nop
@@ -132,17 +142,17 @@
         sta     %g1, [%g2] ASI_M_CTL         ! clear softints
         add     %g2, 4, %g2
         sta     %g0, [%g2] ASI_M_CTL         ! clear softints
-        set     PHYS_SS10_EEPROM + 0x3C, %g1
+        add     %g3, SPARC_SMP_CTXTBL, %g1
         lda     [%g1] ASI_M_CTL, %g2
         sta     %g0, [%g1] ASI_M_CTL
         set     AC_M_CTPR, %g1
         sta     %g2, [%g1] ASI_M_MMUREGS        ! set ctx table ptr
-        set     PHYS_JJ_EEPROM + 0x40, %g1
+        add     %g3, SPARC_SMP_CTX, %g1
         lda     [%g1] ASI_M_CTL, %g2
         sta     %g0, [%g1] ASI_M_CTL
         set     AC_M_CXR, %g1
         sta     %g2, [%g1] ASI_M_MMUREGS        ! set context
-        set     PHYS_SS10_EEPROM + 0x38, %g1
+        add     %g3, SPARC_SMP_ENTRY, %g1
         lda     [%g1] ASI_M_CTL, %g2
         sta     %g0, [%g1] ASI_M_CTL
         set     1, %g1

Modified: openbios-devel/arch/sparc64/boot.c
===================================================================
--- openbios-devel/arch/sparc64/boot.c	2007-11-11 18:02:11 UTC (rev 175)
+++ openbios-devel/arch/sparc64/boot.c	2007-11-14 19:25:43 UTC (rev 176)
@@ -16,10 +16,10 @@
 void boot(void);
 
 struct sys_info sys_info;                                                       
-uint32_t kernel_image;
-uint32_t kernel_size;
-uint32_t cmdline;
-uint32_t cmdline_size;
+uint64_t kernel_image;
+uint64_t kernel_size;
+uint64_t cmdline;
+uint64_t cmdline_size;
 char boot_device;
 
 void boot(void)

Modified: openbios-devel/arch/sparc64/boot.h
===================================================================
--- openbios-devel/arch/sparc64/boot.h	2007-11-11 18:02:11 UTC (rev 175)
+++ openbios-devel/arch/sparc64/boot.h	2007-11-14 19:25:43 UTC (rev 176)
@@ -12,3 +12,9 @@
 
 unsigned int start_elf(unsigned long entry_point, unsigned long param);
 
+extern uint64_t kernel_image;
+extern uint64_t kernel_size;
+extern uint64_t cmdline;
+extern uint64_t cmdline_size;
+extern char boot_device;
+extern struct sys_info sys_info;

Modified: openbios-devel/arch/sparc64/entry.S
===================================================================
--- openbios-devel/arch/sparc64/entry.S	2007-11-11 18:02:11 UTC (rev 175)
+++ openbios-devel/arch/sparc64/entry.S	2007-11-14 19:25:43 UTC (rev 176)
@@ -11,6 +11,8 @@
 #include "asi.h"
 #include "pstate.h"
 #include "lsu.h"
+#define __ASSEMBLY__
+#include "openbios/firmware_abi.h"
 
 #define PROM_ADDR 0x1fff0000000
 
@@ -49,7 +51,7 @@
 
         ! Get memory size from NVRAM
         setx    0x1fe02000074, %g2, %g5
-        mov     0x30, %g2
+        mov     OHW_RAM_SIZE, %g2
         stba    %g2, [%g5] ASI_PHYS_BYPASS_EC_E
         add     %g5, 1, %g1
         stba    %g0, [%g1] ASI_PHYS_BYPASS_EC_E
@@ -72,6 +74,30 @@
         inc     %g2
         stba    %g2, [%g5] ASI_PHYS_BYPASS_EC_E
 	lduba	[%g1] ASI_PHYS_BYPASS_EC_E, %g3
+        or      %g3, %g4, %g4
+
+        sll     %g4, 8, %g4
+        inc     %g2
+        stba    %g2, [%g5] ASI_PHYS_BYPASS_EC_E
+	lduba	[%g1] ASI_PHYS_BYPASS_EC_E, %g3
+        or      %g3, %g4, %g4
+
+        sll     %g4, 8, %g4
+        inc     %g2
+        stba    %g2, [%g5] ASI_PHYS_BYPASS_EC_E
+	lduba	[%g1] ASI_PHYS_BYPASS_EC_E, %g3
+        or      %g3, %g4, %g4
+
+        sll     %g4, 8, %g4
+        inc     %g2
+        stba    %g2, [%g5] ASI_PHYS_BYPASS_EC_E
+	lduba	[%g1] ASI_PHYS_BYPASS_EC_E, %g3
+        or      %g3, %g4, %g4
+
+        sll     %g4, 8, %g4
+        inc     %g2
+        stba    %g2, [%g5] ASI_PHYS_BYPASS_EC_E
+	lduba	[%g1] ASI_PHYS_BYPASS_EC_E, %g3
         or      %g3, %g4, %g1
 	! %g1 contains end of memory
         

Modified: openbios-devel/arch/sparc64/openbios.c
===================================================================
--- openbios-devel/arch/sparc64/openbios.c	2007-11-11 18:02:11 UTC (rev 175)
+++ openbios-devel/arch/sparc64/openbios.c	2007-11-14 19:25:43 UTC (rev 176)
@@ -15,6 +15,8 @@
 #include "openbios/stack.h"
 #include "sys_info.h"
 #include "openbios.h"
+#include "openbios/firmware_abi.h"
+#include "boot.h"
 
 void boot(void);
 
@@ -23,35 +25,10 @@
 // XXX
 #define NVRAM_SIZE       0x2000
 #define NVRAM_IDPROM     0x1fd0
-#define NVRAM_OB_OFFSET  256
-#define NVRAM_OB_SIZE    ((NVRAM_IDPROM - NVRAM_OB_OFFSET) & ~15)
+#define NVRAM_OB_START   (sizeof(ohwcfg_v3_t) + sizeof(struct sparc_arch_cfg))
+#define NVRAM_OB_SIZE    ((NVRAM_IDPROM - NVRAM_OB_START) & ~15)
 
-static struct qemu_nvram_v1 {
-    char id_string[16];
-    uint32_t version;
-    uint32_t nvram_size; // not used in Sun4m
-    char unused1[8];
-    char arch[12];
-    char curr_cpu;
-    char smp_cpus;
-    char unused2;
-    char nographic;
-    uint32_t ram_size;
-    char boot_device;
-    char unused3[3];
-    uint32_t kernel_image;
-    uint32_t kernel_size;
-    uint32_t cmdline;
-    uint32_t cmdline_size;
-    uint32_t initrd_image;
-    uint32_t initrd_size;
-    uint32_t nvram_image;
-    uint16_t width;
-    uint16_t height;
-    uint16_t depth;
-    char unused4[158];
-    uint16_t crc;
-} nv_info;
+ohwcfg_v3_t nv_info;
 
 #define OBIO_CMDLINE_MAX 256
 static char obio_cmdline[OBIO_CMDLINE_MAX];
@@ -148,38 +125,44 @@
     unsigned char *nvptr = &nv_info;
     uint32_t size;
     struct cpudef *cpu;
-    extern uint32_t kernel_image;
-    extern uint32_t kernel_size;
-    extern uint32_t cmdline;
-    extern uint32_t cmdline_size;
-    extern char boot_device;
 
-    for (i = 0; i < sizeof(struct qemu_nvram_v1); i++) {
+    for (i = 0; i < sizeof(ohwcfg_v3_t); i++) {
         outb(i & 0xff, 0x74);
         outb(i  >> 8, 0x75);
         *nvptr++ = inb(0x77);
     }
 
+    printk("Nvram id %s, version %d\n", nv_info.struct_ident,
+           nv_info.struct_version);
+    if (strcmp(nv_info.struct_ident, "QEMU_BIOS") ||
+        nv_info.struct_version != 3 ||
+        OHW_compute_crc(&nv_info, 0x00, 0xF8) != nv_info.crc) {
+        printk("Unknown nvram, freezing!\n");
+        for (;;);
+    }
+
     kernel_image = nv_info.kernel_image;
     kernel_size = nv_info.kernel_size;
     size = nv_info.cmdline_size;
     if (size > OBIO_CMDLINE_MAX - 1)
         size = OBIO_CMDLINE_MAX - 1;
-    memcpy(obio_cmdline, nv_info.cmdline, size);
+    memcpy(obio_cmdline, (void *)nv_info.cmdline, size);
     obio_cmdline[size] = '\0';
     cmdline = obio_cmdline;
     cmdline_size = size;
+    boot_device = nv_info.boot_devices[0];
+
     printk("kernel addr %x size %x\n", kernel_image, kernel_size);
     if (size)
         printk("kernel cmdline %s\n", obio_cmdline);
 
     for (i = 0; i < NVRAM_OB_SIZE; i++) {
-        outb((i + NVRAM_OB_OFFSET) & 0xff, 0x74);
-        outb((i + NVRAM_OB_OFFSET) >> 8, 0x75);
+        outb((i + NVRAM_OB_START) & 0xff, 0x74);
+        outb((i + NVRAM_OB_START) >> 8, 0x75);
         data[i] = inb(0x77);
     }
 
-    printk("CPUs: %x", nv_info.smp_cpus);
+    printk("CPUs: %x", nv_info.nb_cpus);
     cpu = id_cpu();
     printk(" x %s\n", cpu->name);
 }
@@ -189,8 +172,8 @@
     unsigned short i;
 
     for (i = 0; i < NVRAM_OB_SIZE; i++) {
-        outb((i + NVRAM_OB_OFFSET) & 0xff, 0x74);
-        outb((i + NVRAM_OB_OFFSET) >> 8, 0x75);
+        outb((i + NVRAM_OB_START) & 0xff, 0x74);
+        outb((i + NVRAM_OB_START) >> 8, 0x75);
         outb(data[i], 0x77);
     }
 }
@@ -250,8 +233,6 @@
 
 int openbios(void)
 {
-	extern struct sys_info sys_info;
-
 #ifdef CONFIG_DEBUG_CONSOLE
 #ifdef CONFIG_DEBUG_CONSOLE_SERIAL
 	uart_init(CONFIG_SERIAL_PORT, CONFIG_SERIAL_SPEED);

Modified: openbios-devel/arch/sparc64/sys_info.c
===================================================================
--- openbios-devel/arch/sparc64/sys_info.c	2007-11-11 18:02:11 UTC (rev 175)
+++ openbios-devel/arch/sparc64/sys_info.c	2007-11-14 19:25:43 UTC (rev 176)
@@ -11,8 +11,8 @@
 #define debug(x...) 
 #endif
 
-unsigned long qemu_mem_size;
-unsigned long va_shift;
+uint64_t qemu_mem_size;
+uint64_t va_shift;
 
 void collect_multiboot_info(struct sys_info *);
 

Modified: openbios-devel/drivers/obio.c
===================================================================
--- openbios-devel/drivers/obio.c	2007-11-11 18:02:11 UTC (rev 175)
+++ openbios-devel/drivers/obio.c	2007-11-14 19:25:43 UTC (rev 176)
@@ -19,6 +19,7 @@
 #include "openbios/drivers.h"
 #include "openbios/nvram.h"
 #include "obio.h"
+#include "openbios/firmware_abi.h"
 
 #define REGISTER_NAMED_NODE( name, path )   do { \
 	     bind_new_node( name##_flags_, name##_size_, \
@@ -289,26 +290,27 @@
 }
 
 static unsigned char *nvram;
-struct qemu_nvram_v1 nv_info;
+ohwcfg_v3_t nv_info;
 
+#define NVRAM_OB_START   (sizeof(ohwcfg_v3_t) + sizeof(struct sparc_arch_cfg))
+#define NVRAM_OB_SIZE    ((NVRAM_IDPROM - NVRAM_OB_START) & ~15)
+
 void
 arch_nvram_get(char *data)
 {
-    memcpy(data, &nvram[sizeof(struct qemu_nvram_v1)],
-           NVRAM_IDPROM - sizeof(struct qemu_nvram_v1));
+    memcpy(data, &nvram[NVRAM_OB_START], NVRAM_OB_SIZE);
 }
 
 void
 arch_nvram_put(char *data)
 {
-    memcpy(&nvram[sizeof(struct qemu_nvram_v1)], data,
-           NVRAM_IDPROM - sizeof(struct qemu_nvram_v1));
+    memcpy(&nvram[NVRAM_OB_START], data, NVRAM_OB_SIZE);
 }
 
 int
 arch_nvram_size(void)
 {
-    return (NVRAM_IDPROM - sizeof(struct qemu_nvram_v1)) & ~15;
+    return NVRAM_OB_SIZE;
 }
 
 static void mb86904_init(void)
@@ -684,6 +686,7 @@
     uint32_t size;
     unsigned int machine_id;
     struct cpudef *cpu;
+    ohwcfg_v3_t *header;
 
     ob_new_obio_device("eeprom", NULL);
 
@@ -696,9 +699,11 @@
     
     memcpy(&nv_info, nvram, sizeof(nv_info));
     machine_id = (unsigned int)nvram[0x1fd9] & 0xff;
-    printk("Nvram id %s, version %d, machine id 0x%2.2x\n", nv_info.id_string,
-           nv_info.version, machine_id);
-    if (strcmp(nv_info.id_string, "QEMU_BIOS") || nv_info.version != 1) {
+    printk("Nvram id %s, version %d, machine id 0x%2.2x\n",
+           nv_info.struct_ident, nv_info.struct_version, machine_id);
+    if (strcmp(nv_info.struct_ident, "QEMU_BIOS") ||
+        nv_info.struct_version != 3 ||
+        OHW_compute_crc(&nv_info, 0x00, 0xF8) != nv_info.crc) {
         printk("Unknown nvram, freezing!\n");
         for (;;);
     }
@@ -712,12 +717,13 @@
     obio_cmdline[size] = '\0';
     cmdline = obio_cmdline;
     cmdline_size = size;
-    ((struct qemu_nvram_v1 *)nvram)->kernel_image = 0;
-    ((struct qemu_nvram_v1 *)nvram)->kernel_size = 0;
-    ((struct qemu_nvram_v1 *)nvram)->cmdline_size = 0;
+    header = (ohwcfg_v3_t *)nvram;
+    header->kernel_image = 0;
+    header->kernel_size = 0;
+    header->cmdline_size = 0;
 
-    boot_device = nv_info.boot_device;
-    nographic = nv_info.nographic;
+    boot_device = nv_info.boot_devices[0];
+    nographic = nv_info.graphic_flags & OHW_GF_NOGRAPHICS;
     graphic_depth = nv_info.depth;
 
     push_str("mk48t08");
@@ -779,10 +785,10 @@
         for (;;);
     }
     // Add cpus
-    printk("CPUs: %x", nv_info.smp_cpus);
+    printk("CPUs: %x", nv_info.nb_cpus);
     cpu = id_cpu();
     printk(" x %s\n", cpu->name);
-    for (i = 0; i < (unsigned int)nv_info.smp_cpus; i++) {
+    for (i = 0; i < (unsigned int)nv_info.nb_cpus; i++) {
         push_str("/");
         fword("find-device");
 
@@ -1091,13 +1097,17 @@
 int
 start_cpu(unsigned int pc, unsigned int context_ptr, unsigned int context, int cpu)
 {
+    ohwcfg_v3_t *header = (ohwcfg_v3_t *)nvram;
+    struct sparc_arch_cfg *sparc_header;
+
     if (!cpu)
         return -1;
 
-    *(uint32_t *)&nvram[0x38] = pc;
-    *(uint32_t *)&nvram[0x3c] = context_ptr;
-    *(uint32_t *)&nvram[0x40] = context;
-    nvram[0x2e] = cpu & 0xff;
+    sparc_header = &nvram[header->nvram_arch_ptr];
+    sparc_header->smp_entry = pc;
+    sparc_header->smp_ctxtbl = context_ptr;
+    sparc_header->smp_ctx = context;
+    sparc_header->valid = 1;
 
     intregs->cpu_intregs[cpu].set = SUN4M_SOFT_INT(14);
 

Modified: openbios-devel/drivers/obio.h
===================================================================
--- openbios-devel/drivers/obio.h	2007-11-11 18:02:11 UTC (rev 175)
+++ openbios-devel/drivers/obio.h	2007-11-14 19:25:43 UTC (rev 176)
@@ -34,33 +34,6 @@
 
 #define SLAVIO_SIZE      0x01000000
 
-struct qemu_nvram_v1 {
-    char id_string[16];
-    uint32_t version;
-    uint32_t nvram_size; // not used in Sun4m
-    char unused1[8];
-    char arch[12];
-    char curr_cpu;
-    char smp_cpus;
-    char unused2;
-    char nographic;
-    uint32_t ram_size;
-    char boot_device;
-    char unused3[3];
-    uint32_t kernel_image;
-    uint32_t kernel_size;
-    uint32_t cmdline;
-    uint32_t cmdline_size;
-    uint32_t initrd_image;
-    uint32_t initrd_size;
-    uint32_t nvram_image;
-    uint16_t width;
-    uint16_t height;
-    uint16_t depth;
-    char unused4[158];
-    uint16_t crc;
-};
-
 #define SUN4M_NCPUS      16
 #define PAGE_SIZE        4096
 

Added: openbios-devel/include/openbios/firmware_abi.h
===================================================================
--- openbios-devel/include/openbios/firmware_abi.h	                        (rev 0)
+++ openbios-devel/include/openbios/firmware_abi.h	2007-11-14 19:25:43 UTC (rev 176)
@@ -0,0 +1,198 @@
+#ifndef FIRMWARE_ABI_H
+#define FIRMWARE_ABI_H
+
+#ifndef __ASSEMBLY__
+/* Open Hack'Ware NVRAM configuration structure */
+
+/* Version 3 */
+typedef struct ohwcfg_v3_t ohwcfg_v3_t;
+struct ohwcfg_v3_t {
+    /* 0x00: structure identifier                    */
+    uint8_t  struct_ident[0x10];
+    /* 0x10: structure version and NVRAM description */
+    uint32_t struct_version;
+    uint16_t nvram_size;
+    uint16_t pad0;
+    uint16_t nvram_arch_ptr;
+    uint16_t nvram_arch_size;
+    uint16_t nvram_arch_crc;
+    uint8_t  pad1[0x02];
+    /* 0x20: host architecture                       */
+    uint8_t  arch[0x10];
+    /* 0x30: RAM/ROM description                     */
+    uint64_t RAM0_base;
+    uint64_t RAM0_size;
+    uint64_t RAM1_base;
+    uint64_t RAM1_size;
+    uint64_t RAM2_base;
+    uint64_t RAM2_size;
+    uint64_t RAM3_base;
+    uint64_t RAM3_size;
+    uint64_t ROM_base;
+    uint64_t ROM_size;
+    /* 0x80: Kernel description                      */
+    uint64_t kernel_image;
+    uint64_t kernel_size;
+    /* 0x90: Kernel command line                     */
+    uint64_t cmdline;
+    uint64_t cmdline_size;
+    /* 0xA0: Kernel boot image                       */
+    uint64_t initrd_image;
+    uint64_t initrd_size;
+    /* 0xB0: NVRAM image                             */
+    uint64_t NVRAM_image;
+    uint8_t  pad2[8];
+    /* 0xC0: graphic configuration                   */
+    uint16_t width;
+    uint16_t height;
+    uint16_t depth;
+    uint16_t graphic_flags;
+    /* 0xC8: CPUs description                        */
+    uint8_t  nb_cpus;
+    uint8_t  boot_cpu;
+    uint8_t  nboot_devices;
+    uint8_t  pad3[5];
+    /* 0xD0: boot devices                            */
+    uint8_t  boot_devices[0x10];
+    /* 0xE0                                          */
+    uint8_t  pad4[0x1C]; /* 28 */
+    /* 0xFC: checksum                                */
+    uint16_t crc;
+    uint8_t  pad5[0x02];
+} __attribute__ (( packed ));
+
+#define OHW_GF_NOGRAPHICS 0x0001
+
+static inline uint16_t
+OHW_crc_update (uint16_t prev, uint16_t value)
+{
+    uint16_t tmp;
+    uint16_t pd, pd1, pd2;
+
+    tmp = prev >> 8;
+    pd = prev ^ value;
+    pd1 = pd & 0x000F;
+    pd2 = ((pd >> 4) & 0x000F) ^ pd1;
+    tmp ^= (pd1 << 3) | (pd1 << 8);
+    tmp ^= pd2 | (pd2 << 7) | (pd2 << 12);
+
+    return tmp;
+}
+
+static inline uint16_t
+OHW_compute_crc (ohwcfg_v3_t *header, uint32_t start, uint32_t count)
+{
+    uint32_t i;
+    uint16_t crc = 0xFFFF;
+    uint8_t *ptr = (uint8_t *)header;
+    int odd;
+
+    odd = count & 1;
+    count &= ~1;
+    for (i = 0; i != count; i++) {
+        crc = OHW_crc_update(crc, (ptr[start + i] << 8) | ptr[start + i + 1]);
+    }
+    if (odd) {
+        crc = OHW_crc_update(crc, ptr[start + i] << 8);
+    }
+
+    return crc;
+}
+
+/* Sparc32 runtime NVRAM structure for SMP CPU boot */
+struct sparc_arch_cfg {
+    uint32_t smp_ctx;
+    uint32_t smp_ctxtbl;
+    uint32_t smp_entry;
+    uint8_t valid;
+    uint8_t unused[51];
+};
+
+/* OpenBIOS NVRAM partition */
+struct OpenBIOS_nvpart_v1 {
+    uint8_t signature;
+    uint8_t checksum;
+    uint16_t len; // BE, length divided by 16
+    char name[12];
+};
+
+#define OPENBIOS_PART_SYSTEM 0x70
+#define OPENBIOS_PART_FREE 0x7f
+
+static inline void
+OpenBIOS_finish_partition(struct OpenBIOS_nvpart_v1 *header, uint32_t size)
+{
+    unsigned int i, sum;
+    uint8_t *tmpptr;
+
+    // Length divided by 16
+    header->len = cpu_to_be16(size >> 4);
+
+    // Checksum
+    tmpptr = (uint8_t *)header;
+    sum = *tmpptr;
+    for (i = 0; i < 14; i++) {
+        sum += tmpptr[2 + i];
+        sum = (sum + ((sum & 0xff00) >> 8)) & 0xff;
+    }
+    header->checksum = sum & 0xff;
+}
+
+static inline uint32_t
+OpenBIOS_set_var(uint8_t *nvram, uint32_t addr, const unsigned char *str)
+{
+    uint32_t len;
+
+    len = strlen(str) + 1;
+    memcpy(&nvram[addr], str, len);
+
+    return addr + len;
+}
+
+/* Sun IDPROM structure at the end of NVRAM */
+struct Sun_nvram {
+    uint8_t type;
+    uint8_t machine_id;
+    uint8_t macaddr[6];
+    uint8_t unused[7];
+    uint8_t checksum;
+};
+
+static inline void
+Sun_init_header(struct Sun_nvram *header, const uint8_t *macaddr, int machine_id)
+{
+    uint8_t tmp, *tmpptr;
+    unsigned int i;
+
+    header->type = 1;
+    header->machine_id = machine_id & 0xff;
+    memcpy(&header->macaddr, macaddr, 6);
+    /* Calculate checksum */
+    tmp = 0;
+    tmpptr = (uint8_t *)header;
+    for (i = 0; i < 15; i++)
+        tmp ^= tmpptr[i];
+
+    header->checksum = tmp;
+}
+
+#else /* __ASSEMBLY__ */
+
+/* Structure offsets for asm use */
+
+/* Open Hack'Ware NVRAM configuration structure */
+#define OHW_ARCH_PTR   0x18
+#define OHW_RAM_SIZE   0x38
+#define OHW_BOOT_CPU   0xC9
+
+/* Sparc32 runtime NVRAM structure for SMP CPU boot */
+#define SPARC_SMP_CTX    0x0
+#define SPARC_SMP_CTXTBL 0x4
+#define SPARC_SMP_ENTRY  0x8
+#define SPARC_SMP_VALID  0xc
+
+/* Sun IDPROM structure at the end of NVRAM */
+#define SPARC_MACHINE_ID 0x1fd9
+
+#endif /* __ASSEMBLY__ */
+#endif /* FIRMWARE_ABI_H */


Property changes on: openbios-devel/include/openbios/firmware_abi.h
___________________________________________________________________
Name: svn:executable
   + *




More information about the OpenBIOS mailing list