|
|
1.1 root 1: #include "config.h"
2: #include "libopenbios/bindings.h"
3: #include "libc/byteorder.h"
4: #include "libopenbios/ofmem.h"
5: #define NO_QEMU_PROTOS
6: #include "arch/common/fw_cfg.h"
7:
8: #if !defined(CONFIG_SPARC64)
9: static volatile uint16_t *fw_cfg_cmd;
10: static volatile uint8_t *fw_cfg_data;
11:
12: void
13: fw_cfg_read(uint16_t cmd, char *buf, unsigned int nbytes)
14: {
15: unsigned int i;
16:
17: *fw_cfg_cmd = cmd;
18: for (i = 0; i < nbytes; i++)
19: buf[i] = *fw_cfg_data;
20: }
21: #else
22: // XXX depends on PCI bus location, should be removed
23: void
24: fw_cfg_read(uint16_t cmd, char *buf, unsigned int nbytes)
25: {
26: unsigned int i;
27:
28: outw(cmd, CONFIG_FW_CFG_ADDR);
29: for (i = 0; i < nbytes; i++)
30: buf[i] = inb(CONFIG_FW_CFG_ADDR + 1);
31: }
32: #endif
33:
34: uint64_t
35: fw_cfg_read_i64(uint16_t cmd)
36: {
37: uint64_t buf;
38:
39: fw_cfg_read(cmd, (char *)&buf, sizeof(uint64_t));
40:
41: return __le64_to_cpu(buf);
42: }
43:
44: uint32_t
45: fw_cfg_read_i32(uint16_t cmd)
46: {
47: uint32_t buf;
48:
49: fw_cfg_read(cmd, (char *)&buf, sizeof(uint32_t));
50:
51: return __le32_to_cpu(buf);
52: }
53:
54: uint16_t
55: fw_cfg_read_i16(uint16_t cmd)
56: {
57: uint16_t buf;
58:
59: fw_cfg_read(cmd, (char *)&buf, sizeof(uint16_t));
60:
61: return __le16_to_cpu(buf);
62: }
63:
64: void
65: fw_cfg_init(void)
66: {
67: #if defined(CONFIG_SPARC32)
68: fw_cfg_cmd = (void *)ofmem_map_io(CONFIG_FW_CFG_ADDR, 2);
69: fw_cfg_data = (uint8_t *)fw_cfg_cmd + 2;
70: #elif defined(CONFIG_SPARC64)
71: // Nothing for the port version
72: #elif defined(CONFIG_PPC)
73: fw_cfg_cmd = (void *)CONFIG_FW_CFG_ADDR;
74: fw_cfg_data = (void *)(CONFIG_FW_CFG_ADDR + 2);
75: #endif
76: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.