These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / tests / libqos / fw_cfg.c
1 /*
2  * libqos fw_cfg support
3  *
4  * Copyright IBM, Corp. 2012-2013
5  * Copyright (C) 2013 Red Hat Inc.
6  *
7  * Authors:
8  *  Anthony Liguori   <aliguori@us.ibm.com>
9  *  Markus Armbruster <armbru@redhat.com>
10  *
11  * This work is licensed under the terms of the GNU GPL, version 2 or later.
12  * See the COPYING file in the top-level directory.
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
21 void qfw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
22 {
23     fw_cfg->select(fw_cfg, key);
24 }
25
26 void qfw_cfg_read_data(QFWCFG *fw_cfg, void *data, size_t len)
27 {
28     fw_cfg->read(fw_cfg, data, len);
29 }
30
31 void 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
37 uint16_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
44 uint32_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
51 uint64_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
58 static void mm_fw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
59 {
60     writew(fw_cfg->base, key);
61 }
62
63 static 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
73 QFWCFG *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
84 static void io_fw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
85 {
86     outw(fw_cfg->base, key);
87 }
88
89 static 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
99 QFWCFG *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 }