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 + *