| #include "config.h" |
| #include "libopenbios/bindings.h" |
| #include "libc/byteorder.h" |
| #include "libopenbios/ofmem.h" |
| #define NO_QEMU_PROTOS |
| #include "arch/common/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) |
| { |
| uint64_t buf; |
| |
| fw_cfg_read(cmd, (char *)&buf, sizeof(uint64_t)); |
| |
| return __le64_to_cpu(buf); |
| } |
| |
| uint32_t |
| fw_cfg_read_i32(uint16_t cmd) |
| { |
| uint32_t buf; |
| |
| fw_cfg_read(cmd, (char *)&buf, sizeof(uint32_t)); |
| |
| return __le32_to_cpu(buf); |
| } |
| |
| uint16_t |
| fw_cfg_read_i16(uint16_t cmd) |
| { |
| uint16_t buf; |
| |
| fw_cfg_read(cmd, (char *)&buf, sizeof(uint16_t)); |
| |
| return __le16_to_cpu(buf); |
| } |
| |
| void |
| fw_cfg_init(void) |
| { |
| #if defined(CONFIG_SPARC32) |
| fw_cfg_cmd = (void *)ofmem_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 |
| } |