Author: blueswirl Date: 2009-01-31 09:49:16 +0100 (Sat, 31 Jan 2009) New Revision: 432
Added: openbios-devel/drivers/fw_cfg.c Modified: openbios-devel/arch/ppc/qemu/init.c openbios-devel/arch/sparc32/entry.S openbios-devel/arch/sparc64/entry.S openbios-devel/arch/sparc64/openbios.c openbios-devel/config/examples/cross-ppc_config.xml openbios-devel/config/examples/cross-sparc32_config.xml openbios-devel/config/examples/cross-sparc64_config.xml openbios-devel/config/examples/ppc_config.xml openbios-devel/config/examples/sparc32_config.xml openbios-devel/config/examples/sparc64_config.xml openbios-devel/drivers/build.xml openbios-devel/drivers/obio.c openbios-devel/include/openbios/fw_cfg.h Log: Refactor QEMU firmware confguration device handling (based on patch by Aurelien Jarno)
Modified: openbios-devel/arch/ppc/qemu/init.c =================================================================== --- openbios-devel/arch/ppc/qemu/init.c 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/arch/ppc/qemu/init.c 2009-01-31 08:49:16 UTC (rev 432) @@ -33,8 +33,6 @@ #define NO_QEMU_PROTOS #include "openbios/fw_cfg.h"
-#define CFG_ADDR 0xf0000510 - #define UUID_FMT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
struct cpudef { @@ -95,39 +93,6 @@ }; uint32_t isa_io_base;
-static volatile uint16_t *fw_cfg_cmd = (void *)CFG_ADDR; -static volatile uint8_t *fw_cfg_data = (void *)(CFG_ADDR + 2); - -static void -fw_cfg_read(uint16_t cmd, char *buf, unsigned int nbytes) -{ - unsigned int i; - - *fw_cfg_cmd = cmd; - for (i = 0; i < nbytes; i++) - buf[i] = *fw_cfg_data; -} - -static uint32_t -fw_cfg_read_i32(uint16_t cmd) -{ - char buf[sizeof(uint32_t)]; - - fw_cfg_read(cmd, buf, sizeof(uint32_t)); - - return __le32_to_cpu(*(uint32_t *)buf); -} - -static uint16_t -fw_cfg_read_i16(uint16_t cmd) -{ - char buf[sizeof(uint16_t)]; - - fw_cfg_read(cmd, buf, sizeof(uint16_t)); - - return __le16_to_cpu(*(uint16_t *)buf); -} - void entry( void ) { @@ -136,6 +101,8 @@
arch = &known_arch[ARCH_HEATHROW];
+ fw_cfg_init(); + fw_cfg_read(FW_CFG_SIGNATURE, buf, 4); buf[4] = '\0'; if (strncmp(buf, "QEMU", 4) == 0) {
Modified: openbios-devel/arch/sparc32/entry.S =================================================================== --- openbios-devel/arch/sparc32/entry.S 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/arch/sparc32/entry.S 2009-01-31 08:49:16 UTC (rev 432) @@ -11,6 +11,7 @@ #include "asm/asi.h" #include "asm/crs.h" #define NO_QEMU_PROTOS +#define NO_OPENBIOS_PROTOS #include "openbios/fw_cfg.h"
#define CFG_ADDR 0x00000510
Modified: openbios-devel/arch/sparc64/entry.S =================================================================== --- openbios-devel/arch/sparc64/entry.S 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/arch/sparc64/entry.S 2009-01-31 08:49:16 UTC (rev 432) @@ -12,6 +12,7 @@ #include "pstate.h" #include "lsu.h" #define NO_QEMU_PROTOS +#define NO_OPENBIOS_PROTOS #include "openbios/fw_cfg.h"
#define PROM_ADDR 0x1fff0000000
Modified: openbios-devel/arch/sparc64/openbios.c =================================================================== --- openbios-devel/arch/sparc64/openbios.c 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/arch/sparc64/openbios.c 2009-01-31 08:49:16 UTC (rev 432) @@ -24,9 +24,6 @@ #include "openbios/fw_cfg.h" #include "video_subr.h"
-#define BIOS_CFG_CMD 0x510 -#define BIOS_CFG_DATA 0x511 - #define UUID_FMT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
#define NVRAM_ADDR_LO 0x74 @@ -244,46 +241,6 @@ for (;;); }
-static void -fw_cfg_read(uint16_t cmd, char *buf, unsigned int nbytes) -{ - unsigned int i; - - outw(cmd, BIOS_CFG_CMD); - for (i = 0; i < nbytes; i++) - buf[i] = inb(BIOS_CFG_DATA); -} - -static uint64_t -fw_cfg_read_i64(uint16_t cmd) -{ - char buf[sizeof(uint64_t)]; - - fw_cfg_read(cmd, buf, sizeof(uint64_t)); - - return __le64_to_cpu(*(uint64_t *)buf); -} - -static uint32_t -fw_cfg_read_i32(uint16_t cmd) -{ - char buf[sizeof(uint32_t)]; - - fw_cfg_read(cmd, buf, sizeof(uint32_t)); - - return __le32_to_cpu(*(uint32_t *)buf); -} - -static uint16_t -fw_cfg_read_i16(uint16_t cmd) -{ - char buf[sizeof(uint16_t)]; - - fw_cfg_read(cmd, buf, sizeof(uint16_t)); - - return __le16_to_cpu(*(uint16_t *)buf); -} - static uint8_t nvram_read_byte(uint16_t offset) { outb(offset & 0xff, NVRAM_ADDR_LO); @@ -330,6 +287,8 @@
nvram_read(0, (char *)&nv_info, sizeof(ohwcfg_v3_t));
+ fw_cfg_init(); + fw_cfg_read(FW_CFG_SIGNATURE, buf, 4); buf[4] = '\0';
Modified: openbios-devel/config/examples/cross-ppc_config.xml =================================================================== --- openbios-devel/config/examples/cross-ppc_config.xml 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/config/examples/cross-ppc_config.xml 2009-01-31 08:49:16 UTC (rev 432) @@ -75,5 +75,6 @@ <option name="CONFIG_DRIVER_VGA" type="boolean" value="true"/> <option name="CONFIG_DRIVER_MACIO" type="boolean" value="true"/> <option name="CONFIG_DRIVER_ESCC" type="boolean" value="true"/> - + <option name="CONFIG_DRIVER_FW_CFG" type="boolean" value="true"/> + <option name="CONFIG_FW_CFG_ADDR" type="integer" value="0xf0000510"/> </config>
Modified: openbios-devel/config/examples/cross-sparc32_config.xml =================================================================== --- openbios-devel/config/examples/cross-sparc32_config.xml 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/config/examples/cross-sparc32_config.xml 2009-01-31 08:49:16 UTC (rev 432) @@ -76,5 +76,6 @@ <option name="CONFIG_DEBUG_FLOPPY" type="boolean" value="false"/> <option name="CONFIG_DRIVER_ESCC" type="boolean" value="true"/> <option name="CONFIG_DRIVER_ESCC_SUN" type="boolean" value="true"/> - + <option name="CONFIG_DRIVER_FW_CFG" type="boolean" value="true"/> + <option name="CONFIG_FW_CFG_ADDR" type="integer" value="0xd00000510ULL"/> </config>
Modified: openbios-devel/config/examples/cross-sparc64_config.xml =================================================================== --- openbios-devel/config/examples/cross-sparc64_config.xml 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/config/examples/cross-sparc64_config.xml 2009-01-31 08:49:16 UTC (rev 432) @@ -77,5 +77,6 @@ <option name="CONFIG_DRIVER_EBUS" type="boolean" value="true"/> <option name="CONFIG_DRIVER_PC_KBD" type="boolean" value="true"/> <option name="CONFIG_DRIVER_PC_SERIAL" type="boolean" value="true"/> - + <option name="CONFIG_DRIVER_FW_CFG" type="boolean" value="true"/> + <option name="CONFIG_FW_CFG_ADDR" type="integer" value="0x510"/> </config>
Modified: openbios-devel/config/examples/ppc_config.xml =================================================================== --- openbios-devel/config/examples/ppc_config.xml 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/config/examples/ppc_config.xml 2009-01-31 08:49:16 UTC (rev 432) @@ -75,5 +75,6 @@ <option name="CONFIG_DRIVER_VGA" type="boolean" value="true"/> <option name="CONFIG_DRIVER_MACIO" type="boolean" value="true"/> <option name="CONFIG_DRIVER_ESCC" type="boolean" value="true"/> - + <option name="CONFIG_DRIVER_FW_CFG" type="boolean" value="true"/> + <option name="CONFIG_FW_CFG_ADDR" type="integer" value="0xf0000510"/> </config>
Modified: openbios-devel/config/examples/sparc32_config.xml =================================================================== --- openbios-devel/config/examples/sparc32_config.xml 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/config/examples/sparc32_config.xml 2009-01-31 08:49:16 UTC (rev 432) @@ -76,5 +76,6 @@ <option name="CONFIG_DEBUG_FLOPPY" type="boolean" value="false"/> <option name="CONFIG_DRIVER_ESCC" type="boolean" value="true"/> <option name="CONFIG_DRIVER_ESCC_SUN" type="boolean" value="true"/> - + <option name="CONFIG_DRIVER_FW_CFG" type="boolean" value="true"/> + <option name="CONFIG_FW_CFG_ADDR" type="integer" value="0xd00000510ULL"/> </config>
Modified: openbios-devel/config/examples/sparc64_config.xml =================================================================== --- openbios-devel/config/examples/sparc64_config.xml 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/config/examples/sparc64_config.xml 2009-01-31 08:49:16 UTC (rev 432) @@ -77,5 +77,6 @@ <option name="CONFIG_DRIVER_EBUS" type="boolean" value="true"/> <option name="CONFIG_DRIVER_PC_KBD" type="boolean" value="true"/> <option name="CONFIG_DRIVER_PC_SERIAL" type="boolean" value="true"/> - + <option name="CONFIG_DRIVER_FW_CFG" type="boolean" value="true"/> + <option name="CONFIG_FW_CFG_ADDR" type="integer" value="0x510"/> </config>
Modified: openbios-devel/drivers/build.xml =================================================================== --- openbios-devel/drivers/build.xml 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/drivers/build.xml 2009-01-31 08:49:16 UTC (rev 432) @@ -22,6 +22,7 @@ <object source="pc_kbd.c" condition="DRIVER_PC_KBD"/> <object source="pc_serial.c" condition="DRIVER_PC_SERIAL"/> <object source="escc.c" condition="DRIVER_ESCC"/> + <object source="fw_cfg.c" condition="DRIVER_FW_CFG"/> </library>
<dictionary name="openbios" target="forth">
Added: openbios-devel/drivers/fw_cfg.c =================================================================== --- openbios-devel/drivers/fw_cfg.c (rev 0) +++ openbios-devel/drivers/fw_cfg.c 2009-01-31 08:49:16 UTC (rev 432) @@ -0,0 +1,76 @@ +#include "openbios/config.h" +#include "openbios/bindings.h" +#include "libc/byteorder.h" +#include "ofmem.h" +#define NO_QEMU_PROTOS +#include "openbios/fw_cfg.h" + +#if !defined(CONFIG_SPARC64) +static volatile uint16_t *fw_cfg_cmd; +static volatile uint8_t *fw_cfg_data; + +void +fw_cfg_read(uint16_t cmd, char *buf, unsigned int nbytes) +{ + unsigned int i; + + *fw_cfg_cmd = cmd; + for (i = 0; i < nbytes; i++) + buf[i] = *fw_cfg_data; +} +#else +// XXX depends on PCI bus location, should be removed +void +fw_cfg_read(uint16_t cmd, char *buf, unsigned int nbytes) +{ + unsigned int i; + + outw(cmd, CONFIG_FW_CFG_ADDR); + for (i = 0; i < nbytes; i++) + buf[i] = inb(CONFIG_FW_CFG_ADDR + 1); +} +#endif + +uint64_t +fw_cfg_read_i64(uint16_t cmd) +{ + char buf[sizeof(uint64_t)]; + + fw_cfg_read(cmd, buf, sizeof(uint64_t)); + + return __le64_to_cpu(*(uint64_t *)buf); +} + +uint32_t +fw_cfg_read_i32(uint16_t cmd) +{ + char buf[sizeof(uint32_t)]; + + fw_cfg_read(cmd, buf, sizeof(uint32_t)); + + return __le32_to_cpu(*(uint32_t *)buf); +} + +uint16_t +fw_cfg_read_i16(uint16_t cmd) +{ + char buf[sizeof(uint16_t)]; + + fw_cfg_read(cmd, buf, sizeof(uint16_t)); + + return __le16_to_cpu(*(uint16_t *)buf); +} + +void +fw_cfg_init(void) +{ +#if defined(CONFIG_SPARC32) + fw_cfg_cmd = (void *)map_io(CONFIG_FW_CFG_ADDR, 2); + fw_cfg_data = (uint8_t *)fw_cfg_cmd + 2; +#elif defined(CONFIG_SPARC64) + // Nothing for the port version +#elif defined(CONFIG_PPC) + fw_cfg_cmd = (void *)CONFIG_FW_CFG_ADDR; + fw_cfg_data = (void *)(CONFIG_FW_CFG_ADDR + 2); +#endif +}
Modified: openbios-devel/drivers/obio.c =================================================================== --- openbios-devel/drivers/obio.c 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/drivers/obio.c 2009-01-31 08:49:16 UTC (rev 432) @@ -646,39 +646,6 @@ for (;;); }
-static volatile uint16_t *fw_cfg_cmd; -static volatile uint8_t *fw_cfg_data; - -static void -fw_cfg_read(uint16_t cmd, char *buf, unsigned int nbytes) -{ - unsigned int i; - - *fw_cfg_cmd = cmd; - for (i = 0; i < nbytes; i++) - buf[i] = *fw_cfg_data; -} - -static uint32_t -fw_cfg_read_i32(uint16_t cmd) -{ - char buf[sizeof(uint32_t)]; - - fw_cfg_read(cmd, buf, sizeof(uint32_t)); - - return __le32_to_cpu(*(uint32_t *)buf); -} - -static uint16_t -fw_cfg_read_i16(uint16_t cmd) -{ - char buf[sizeof(uint16_t)]; - - fw_cfg_read(cmd, buf, sizeof(uint16_t)); - - return __le16_to_cpu(*(uint16_t *)buf); -} - static uint8_t qemu_uuid[16];
static void @@ -710,8 +677,7 @@
fword("finish-device");
- fw_cfg_cmd = map_io(CFG_ADDR, CFG_SIZE); - fw_cfg_data = (uint8_t *)fw_cfg_cmd + 2; + fw_cfg_init();
fw_cfg_read(FW_CFG_SIGNATURE, buf, 4); buf[4] = '\0';
Modified: openbios-devel/include/openbios/fw_cfg.h =================================================================== --- openbios-devel/include/openbios/fw_cfg.h 2009-01-30 07:44:48 UTC (rev 431) +++ openbios-devel/include/openbios/fw_cfg.h 2009-01-31 08:49:16 UTC (rev 432) @@ -30,4 +30,12 @@
#endif /* NO_QEMU_PROTOS */
+#ifndef NO_OPENBIOS_PROTOS +void fw_cfg_read(uint16_t cmd, char *buf, unsigned int nbytes); +uint64_t fw_cfg_read_i64(uint16_t cmd); +uint32_t fw_cfg_read_i32(uint16_t cmd); +uint16_t fw_cfg_read_i16(uint16_t cmd); +void fw_cfg_init(void); +#endif /* NO_OPENBIOS_PROTOS */ + #endif