summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openhackware/src/nvram.c
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/openhackware/src/nvram.c')
-rw-r--r--qemu/roms/openhackware/src/nvram.c450
1 files changed, 0 insertions, 450 deletions
diff --git a/qemu/roms/openhackware/src/nvram.c b/qemu/roms/openhackware/src/nvram.c
deleted file mode 100644
index c78a0797e..000000000
--- a/qemu/roms/openhackware/src/nvram.c
+++ /dev/null
@@ -1,450 +0,0 @@
-/*
- * <nvram.c>
- *
- * Open Hack'Ware BIOS NVRAM management routines.
- *
- * Copyright (c) 2004-2005 Jocelyn Mayer
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License V2
- * as published by the Free Software Foundation
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include "bios.h"
-
-#define NVRAM_MAX_SIZE 0x2000
-#define NVRAM_IO_BASE 0x0074
-
-struct nvram_t {
- uint16_t io_base;
- uint16_t size;
-};
-
-/* NVRAM access */
-static void NVRAM_set_byte (nvram_t *nvram, uint32_t addr, uint8_t value)
-{
- NVRAM_write(nvram, addr, value);
-}
-
-static uint8_t NVRAM_get_byte (nvram_t *nvram, uint16_t addr)
-{
- return NVRAM_read(nvram, addr);
-}
-
-static void NVRAM_set_word (nvram_t *nvram, uint16_t addr, uint16_t value)
-{
- NVRAM_write(nvram, addr, value >> 8);
- NVRAM_write(nvram, addr + 1, value);
-}
-
-static uint16_t NVRAM_get_word (nvram_t *nvram, uint16_t addr)
-{
- uint16_t tmp;
-
- tmp = NVRAM_read(nvram, addr) << 8;
- tmp |= NVRAM_read(nvram, addr + 1);
-
- return tmp;
-}
-
-static void NVRAM_set_lword (nvram_t *nvram, uint16_t addr, uint32_t value)
-{
- NVRAM_write(nvram, addr, value >> 24);
- NVRAM_write(nvram, addr + 1, value >> 16);
- NVRAM_write(nvram, addr + 2, value >> 8);
- NVRAM_write(nvram, addr + 3, value);
-}
-
-static uint32_t NVRAM_get_lword (nvram_t *nvram, uint16_t addr)
-{
- uint32_t tmp;
-
- tmp = NVRAM_read(nvram, addr) << 24;
- tmp |= NVRAM_read(nvram, addr + 1) << 16;
- tmp |= NVRAM_read(nvram, addr + 2) << 8;
- tmp |= NVRAM_read(nvram, addr + 3);
-
- return tmp;
-}
-
-static void NVRAM_set_string (nvram_t *nvram, uint32_t addr,
- const unsigned char *str, uint32_t max)
-{
- uint32_t i;
-
- for (i = 0; i < max && str[i] != '\0'; i++) {
- NVRAM_write(nvram, addr + i, str[i]);
- }
- NVRAM_write(nvram, addr + i, '\0');
-}
-
-static int NVRAM_get_string (nvram_t *nvram, uint8_t *dst,
- uint16_t addr, int max)
-{
- int i;
-
- memset(dst, 0, max);
- for (i = 0; i < max; i++) {
- dst[i] = NVRAM_get_byte(nvram, addr + i);
- if (dst[i] == '\0')
- break;
- }
-
- return i;
-}
-
-static uint16_t NVRAM_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 uint16_t NVRAM_compute_crc (nvram_t *nvram,
- uint32_t start, uint32_t count)
-{
- uint32_t i;
- uint16_t crc = 0xFFFF;
- int odd;
-
- odd = count & 1;
- count &= ~1;
- for (i = 0; i != count; i++) {
- crc = NVRAM_crc_update(crc, NVRAM_get_word(nvram, start + i));
- }
- if (odd) {
- crc = NVRAM_crc_update(crc, NVRAM_get_byte(nvram, start + i) << 8);
- }
-
- return crc;
-}
-
-/* Format NVRAM for PREP target */
-static int NVRAM_prep_format (nvram_t *nvram)
-{
-#define NVRAM_PREP_OSAREA_SIZE 512
-#define NVRAM_PREP_CONFSIZE 1024
- uint16_t crc;
-
- /* NVRAM header */
- /* 0x00: NVRAM size in kB */
- NVRAM_set_word(nvram, 0x00, nvram->size >> 10);
- /* 0x02: NVRAM version */
- NVRAM_set_byte(nvram, 0x02, 0x01);
- /* 0x03: NVRAM revision */
- NVRAM_set_byte(nvram, 0x03, 0x01);
- /* 0x08: last OS */
- NVRAM_set_byte(nvram, 0x08, 0x00); /* Unknown */
- /* 0x09: endian */
- NVRAM_set_byte(nvram, 0x09, 'B'); /* Big-endian */
- /* 0x0A: OSArea usage */
- NVRAM_set_byte(nvram, 0x0A, 0x00); /* Empty */
- /* 0x0B: PM mode */
- NVRAM_set_byte(nvram, 0x0B, 0x00); /* Normal */
- /* Restart block description record */
- /* 0x0C: restart block version */
- NVRAM_set_word(nvram, 0x0C, 0x01);
- /* 0x0E: restart block revision */
- NVRAM_set_word(nvram, 0x0E, 0x01);
- /* 0x20: restart address */
- NVRAM_set_lword(nvram, 0x20, 0x00);
- /* 0x24: save area address */
- NVRAM_set_lword(nvram, 0x24, 0x00);
- /* 0x28: save area length */
- NVRAM_set_lword(nvram, 0x28, 0x00);
- /* 0x1C: checksum of restart block */
- crc = NVRAM_compute_crc(nvram, 0x0C, 32);
- NVRAM_set_word(nvram, 0x1C, crc);
-
- /* Security section */
- /* Set all to zero */
- /* 0xC4: pointer to global environment area */
- NVRAM_set_lword(nvram, 0xC4, 0x0100);
- /* 0xC8: size of global environment area */
- NVRAM_set_lword(nvram, 0xC8, nvram->size - NVRAM_PREP_OSAREA_SIZE -
- NVRAM_PREP_CONFSIZE - 0x0100);
- /* 0xD4: pointer to configuration area */
- NVRAM_set_lword(nvram, 0xD4, nvram->size - NVRAM_PREP_CONFSIZE);
- /* 0xD8: size of configuration area */
- NVRAM_set_lword(nvram, 0xD8, NVRAM_PREP_CONFSIZE);
- /* 0xE8: pointer to OS specific area */
- NVRAM_set_lword(nvram, 0xE8, nvram->size - NVRAM_PREP_CONFSIZE
- - NVRAM_PREP_OSAREA_SIZE);
- /* 0xD8: size of OS specific area */
- NVRAM_set_lword(nvram, 0xEC, NVRAM_PREP_OSAREA_SIZE);
-
- /* Configuration area */
-
- /* 0x04: checksum 0 => OS area */
- crc = NVRAM_compute_crc(nvram, 0x00, nvram->size - NVRAM_PREP_CONFSIZE -
- NVRAM_PREP_OSAREA_SIZE);
- NVRAM_set_word(nvram, 0x04, crc);
- /* 0x06: checksum of config area */
- crc = NVRAM_compute_crc(nvram, nvram->size - NVRAM_PREP_CONFSIZE,
- NVRAM_PREP_CONFSIZE);
- NVRAM_set_word(nvram, 0x06, crc);
-
- return 0;
-}
-
-static uint8_t NVRAM_chrp_chksum (nvram_t *nvram, uint16_t pos)
-{
- uint16_t sum, end;
-
- end = pos + 0x10;
- sum = NVRAM_get_byte(nvram, pos);
- for (pos += 2; pos < end; pos++) {
- sum += NVRAM_get_byte(nvram, pos);
- }
- while (sum > 0xFF) {
- sum = (sum & 0xFF) + (sum >> 8);
- }
-
- return sum;
-}
-
-static int NVRAM_chrp_format (unused nvram_t *nvram)
-{
- uint8_t chksum;
-
- /* Mark NVRAM as free */
- NVRAM_set_byte(nvram, 0x00, 0x5A);
- NVRAM_set_byte(nvram, 0x01, 0x00);
- NVRAM_set_word(nvram, 0x02, 0x2000);
- NVRAM_set_string(nvram, 0x04, "wwwwwwwwwwww", 12);
- chksum = NVRAM_chrp_chksum(nvram, 0x00);
- NVRAM_set_byte(nvram, 0x01, chksum);
-
- return 0;
-}
-
-#if 0
-static uint16_t NVRAM_mac99_chksum (nvram_t *nvram,
- uint16_t start, uint16_t len)
- int cnt;
- u32 low, high;
-
- buffer += CORE99_ADLER_START;
- low = 1;
- high = 0;
- for (cnt=0; cnt<(NVRAM_SIZE-CORE99_ADLER_START); cnt++) {
- if ((cnt % 5000) == 0) {
- high %= 65521UL;
- high %= 65521UL;
- }
- low += buffer[cnt];
- high += low;
- }
- low %= 65521UL;
- high %= 65521UL;
-
- return (high << 16) | low;
-{
- uint16_t pos;
- uint8_t tmp, sum;
-
- sum = 0;
- for (pos = start; pos < (start + len); pos++) {
- tmp = sum + NVRAM_get_byte(nvram, pos);
- if (tmp < sum)
- tmp++;
- sum = tmp;
- }
-
- return sum;
-}
-#endif
-
-static int NVRAM_mac99_format (nvram_t *nvram)
-{
- uint8_t chksum;
-
- /* Mark NVRAM as free */
- NVRAM_set_byte(nvram, 0x00, 0x5A);
- NVRAM_set_byte(nvram, 0x01, 0x00);
- NVRAM_set_word(nvram, 0x02, 0x2000);
- NVRAM_set_string(nvram, 0x04, "wwwwwwwwwwww", 12);
- chksum = NVRAM_chrp_chksum(nvram, 0x00);
- NVRAM_set_byte(nvram, 0x01, chksum);
-
- return 0;
-}
-
-static int NVRAM_pop_format (unused nvram_t *nvram)
-{
- /* TODO */
- return -1;
-}
-
-/* Interface */
-uint8_t NVRAM_read (nvram_t *nvram, uint32_t addr)
-{
- outb(nvram->io_base + 0x00, addr);
- outb(nvram->io_base + 0x01, addr >> 8);
-
- return inb(NVRAM_IO_BASE + 0x03);
-}
-
-void NVRAM_write (nvram_t *nvram, uint32_t addr, uint8_t value)
-{
- outb(nvram->io_base + 0x00, addr);
- outb(nvram->io_base + 0x01, addr >> 8);
- outb(nvram->io_base + 0x03, value);
-}
-
-uint16_t NVRAM_get_size (nvram_t *nvram)
-{
- return nvram->size;
-}
-
-int NVRAM_format (nvram_t *nvram)
-{
- int ret;
-
- {
- uint16_t pos;
-
- for (pos = 0; pos < nvram->size; pos += 4)
- NVRAM_set_lword(nvram, pos, 0);
- }
- switch (arch) {
- case ARCH_PREP:
- ret = NVRAM_prep_format(nvram);
- break;
- case ARCH_CHRP:
- ret = NVRAM_chrp_format(nvram);
- break;
- case ARCH_MAC99:
- case ARCH_HEATHROW: /* XXX: may be incorrect */
- ret = NVRAM_mac99_format(nvram);
- break;
- case ARCH_POP:
- ret = NVRAM_pop_format(nvram);
- break;
- default:
- ret = -1;
- break;
- }
-
- return ret;
-}
-
-/* HACK... */
-extern int vga_width, vga_height, vga_depth;
-
-static nvram_t global_nvram;
-
-nvram_t *NVRAM_get_config (uint32_t *RAM_size, int *boot_device,
- void **boot_image, uint32_t *boot_size,
- void **cmdline, uint32_t *cmdline_size,
- void **ramdisk, uint32_t *ramdisk_size)
-{
- unsigned char sign[16];
- nvram_t *nvram;
- uint32_t lword;
- uint16_t NVRAM_size, crc;
- uint8_t byte;
-
-#if 0
- nvram = malloc(sizeof(nvram_t));
- if (nvram == NULL)
- return NULL;
-#else
- nvram = &global_nvram;
-#endif
- nvram->io_base = NVRAM_IO_BASE;
- /* Pre-initialised NVRAM is not supported any more */
- if (NVRAM_get_string(nvram, sign, 0x00, 0x10) <= 0 ||
- strcmp(sign, "QEMU_BIOS") != 0) {
- ERROR("Wrong NVRAM signature %s\n", sign);
- return NULL;
- }
- /* Check structure version */
- lword = NVRAM_get_lword(nvram, 0x10);
- if (lword != 0x00000002) {
- ERROR("Wrong NVRAM structure version: %0x\n", lword);
- return NULL;
- }
- /* Check CRC */
- crc = NVRAM_compute_crc(nvram, 0x00, 0xF8);
- if (NVRAM_get_word(nvram, 0xFC) != crc) {
- ERROR("Invalid NVRAM structure CRC: %0x <=> %0x\n", crc,
- NVRAM_get_word(nvram, 0xFC));
- return NULL;
- }
- NVRAM_size = NVRAM_get_word(nvram, 0x14);
- if ((NVRAM_size & 0x100) != 0x00 || NVRAM_size < 0x400 ||
- NVRAM_size > 0x2000) {
- ERROR("Invalid NVRAM size: %d\n", NVRAM_size);
- return NULL;
- }
- nvram->size = NVRAM_size;
- if (NVRAM_get_string(nvram, sign, 0x20, 0x10) < 0) {
- ERROR("Unable to get architecture from NVRAM\n");
- return NULL;
- }
- if (strcmp(sign, "PREP") == 0) {
- arch = ARCH_PREP;
- } else if (strcmp(sign, "CHRP") == 0) {
- arch = ARCH_CHRP;
- } else if (strcmp(sign, "MAC99") == 0) {
- arch = ARCH_MAC99;
- } else if (strcmp(sign, "POP") == 0) {
- arch = ARCH_POP;
- } else if (strcmp(sign, "HEATHROW") == 0) {
- arch = ARCH_HEATHROW;
- } else {
- ERROR("Unknown PPC architecture: '%s'\n", sign);
- return NULL;
- }
- lword = NVRAM_get_lword(nvram, 0x30);
- *RAM_size = lword;
- byte = NVRAM_get_byte(nvram, 0x34);
- *boot_device = byte;
- /* Preloaded boot image */
- lword = NVRAM_get_lword(nvram, 0x38);
- *boot_image = (void *)lword;
- lword = NVRAM_get_lword(nvram, 0x3C);
- *boot_size = lword;
- /* Preloaded cmdline */
- lword = NVRAM_get_lword(nvram, 0x40);
- *cmdline = (void *)lword;
- lword = NVRAM_get_lword(nvram, 0x44);
- *cmdline_size = lword;
- /* Preloaded RAM disk */
- lword = NVRAM_get_lword(nvram, 0x48);
- *ramdisk = (void *)lword;
- lword = NVRAM_get_lword(nvram, 0x4C);
- *ramdisk_size = lword;
- /* Preloaded NVRAM image */
- lword = NVRAM_get_lword(nvram, 0x50);
- /* Display init geometry */
- lword = NVRAM_get_word(nvram, 0x54);
- vga_width = lword;
- lword = NVRAM_get_word(nvram, 0x56);
- vga_height = lword;
- lword = NVRAM_get_word(nvram, 0x58);
- vga_depth = lword;
- /* TODO: write it into NVRAM */
-
- return nvram;
-}