2 * libqos fw_cfg support
4 * Copyright IBM, Corp. 2012-2013
5 * Copyright (C) 2013 Red Hat Inc.
8 * Anthony Liguori <aliguori@us.ibm.com>
9 * Markus Armbruster <armbru@redhat.com>
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.
15 #include "qemu/osdep.h"
16 #include "libqos/fw_cfg.h"
18 #include "qemu/bswap.h"
20 void qfw_cfg_select(QFWCFG
*fw_cfg
, uint16_t key
)
22 fw_cfg
->select(fw_cfg
, key
);
25 void qfw_cfg_read_data(QFWCFG
*fw_cfg
, void *data
, size_t len
)
27 fw_cfg
->read(fw_cfg
, data
, len
);
30 void qfw_cfg_get(QFWCFG
*fw_cfg
, uint16_t key
, void *data
, size_t len
)
32 qfw_cfg_select(fw_cfg
, key
);
33 qfw_cfg_read_data(fw_cfg
, data
, len
);
36 uint16_t qfw_cfg_get_u16(QFWCFG
*fw_cfg
, uint16_t key
)
39 qfw_cfg_get(fw_cfg
, key
, &value
, sizeof(value
));
40 return le16_to_cpu(value
);
43 uint32_t qfw_cfg_get_u32(QFWCFG
*fw_cfg
, uint16_t key
)
46 qfw_cfg_get(fw_cfg
, key
, &value
, sizeof(value
));
47 return le32_to_cpu(value
);
50 uint64_t qfw_cfg_get_u64(QFWCFG
*fw_cfg
, uint16_t key
)
53 qfw_cfg_get(fw_cfg
, key
, &value
, sizeof(value
));
54 return le64_to_cpu(value
);
57 static void mm_fw_cfg_select(QFWCFG
*fw_cfg
, uint16_t key
)
59 writew(fw_cfg
->base
, key
);
62 static void mm_fw_cfg_read(QFWCFG
*fw_cfg
, void *data
, size_t len
)
67 for (i
= 0; i
< len
; i
++) {
68 ptr
[i
] = readb(fw_cfg
->base
+ 2);
72 QFWCFG
*mm_fw_cfg_init(uint64_t base
)
74 QFWCFG
*fw_cfg
= g_malloc0(sizeof(*fw_cfg
));
77 fw_cfg
->select
= mm_fw_cfg_select
;
78 fw_cfg
->read
= mm_fw_cfg_read
;
83 static void io_fw_cfg_select(QFWCFG
*fw_cfg
, uint16_t key
)
85 outw(fw_cfg
->base
, key
);
88 static void io_fw_cfg_read(QFWCFG
*fw_cfg
, void *data
, size_t len
)
93 for (i
= 0; i
< len
; i
++) {
94 ptr
[i
] = inb(fw_cfg
->base
+ 1);
98 QFWCFG
*io_fw_cfg_init(uint16_t base
)
100 QFWCFG
*fw_cfg
= g_malloc0(sizeof(*fw_cfg
));
103 fw_cfg
->select
= io_fw_cfg_select
;
104 fw_cfg
->read
= io_fw_cfg_read
;