Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / drivers / fw_cfg.c
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 }