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