1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include "qemu/osdep.h"
16#include <glib.h>
17#include "libqos/fw_cfg.h"
18#include "libqtest.h"
19#include "qemu/bswap.h"
20
21void qfw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
22{
23 fw_cfg->select(fw_cfg, key);
24}
25
26void qfw_cfg_read_data(QFWCFG *fw_cfg, void *data, size_t len)
27{
28 fw_cfg->read(fw_cfg, data, len);
29}
30
31void qfw_cfg_get(QFWCFG *fw_cfg, uint16_t key, void *data, size_t len)
32{
33 qfw_cfg_select(fw_cfg, key);
34 qfw_cfg_read_data(fw_cfg, data, len);
35}
36
37uint16_t qfw_cfg_get_u16(QFWCFG *fw_cfg, uint16_t key)
38{
39 uint16_t value;
40 qfw_cfg_get(fw_cfg, key, &value, sizeof(value));
41 return le16_to_cpu(value);
42}
43
44uint32_t qfw_cfg_get_u32(QFWCFG *fw_cfg, uint16_t key)
45{
46 uint32_t value;
47 qfw_cfg_get(fw_cfg, key, &value, sizeof(value));
48 return le32_to_cpu(value);
49}
50
51uint64_t qfw_cfg_get_u64(QFWCFG *fw_cfg, uint16_t key)
52{
53 uint64_t value;
54 qfw_cfg_get(fw_cfg, key, &value, sizeof(value));
55 return le64_to_cpu(value);
56}
57
58static void mm_fw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
59{
60 writew(fw_cfg->base, key);
61}
62
63static void mm_fw_cfg_read(QFWCFG *fw_cfg, void *data, size_t len)
64{
65 uint8_t *ptr = data;
66 int i;
67
68 for (i = 0; i < len; i++) {
69 ptr[i] = readb(fw_cfg->base + 2);
70 }
71}
72
73QFWCFG *mm_fw_cfg_init(uint64_t base)
74{
75 QFWCFG *fw_cfg = g_malloc0(sizeof(*fw_cfg));
76
77 fw_cfg->base = base;
78 fw_cfg->select = mm_fw_cfg_select;
79 fw_cfg->read = mm_fw_cfg_read;
80
81 return fw_cfg;
82}
83
84static void io_fw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
85{
86 outw(fw_cfg->base, key);
87}
88
89static void io_fw_cfg_read(QFWCFG *fw_cfg, void *data, size_t len)
90{
91 uint8_t *ptr = data;
92 int i;
93
94 for (i = 0; i < len; i++) {
95 ptr[i] = inb(fw_cfg->base + 1);
96 }
97}
98
99QFWCFG *io_fw_cfg_init(uint16_t base)
100{
101 QFWCFG *fw_cfg = g_malloc0(sizeof(*fw_cfg));
102
103 fw_cfg->base = base;
104 fw_cfg->select = io_fw_cfg_select;
105 fw_cfg->read = io_fw_cfg_read;
106
107 return fw_cfg;
108}
109