Signed-off-by: Vasilis Liaskovitis vasilis.liaskovitis@profitbricks.com --- vl.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 51 insertions(+), 0 deletions(-)
diff --git a/vl.c b/vl.c index a3ab384..8406933 100644 --- a/vl.c +++ b/vl.c @@ -169,6 +169,7 @@ int main(int argc, char **argv)
#include "ui/qemu-spice.h" #include "qapi/string-input-visitor.h" +#include "hw/dimm.h"
//#define DEBUG_NET //#define DEBUG_SLIRP @@ -249,6 +250,7 @@ static QTAILQ_HEAD(, FWBootEntry) fw_boot_order = int nb_numa_nodes; uint64_t node_mem[MAX_NODES]; unsigned long *node_cpumask[MAX_NODES]; +int nb_hp_dimms;
uint8_t qemu_uuid[16];
@@ -2065,6 +2067,50 @@ static int chardev_init_func(QemuOpts *opts, void *opaque) return 0; }
+static int dimmcfg_init_func(QemuOpts *opts, void *opaque) +{ + const char *driver; + const char *id; + uint64_t node, size; + uint32_t populated; + const char *buf, *busbuf; + + /* DimmDevice configuration needs to be known in order to initialize chipset + * with correct memory and pci ranges. But all devices are created after + * chipset / machine initialization. In * order to avoid this problem, we + * parse dimm information earlier into dimmcfg structs. */ + + driver = qemu_opt_get(opts, "driver"); + if (!strcmp(driver, "dimm")) { + + id = qemu_opts_id(opts); + buf = qemu_opt_get(opts, "size"); + parse_option_size("size", buf, &size, NULL); + buf = qemu_opt_get(opts, "node"); + parse_option_number("node", buf, &node, NULL); + busbuf = qemu_opt_get(opts, "bus"); + buf = qemu_opt_get(opts, "populated"); + if (!buf) { + populated = 0; + } else { + populated = strcmp(buf, "on") ? 0 : 1; + } + + dimm_config_create((char *)id, size, busbuf ? busbuf : "membus.0", + node, nb_hp_dimms, populated); + + /* if !populated, we just keep the config. The real device + * will be created in the future with a normal device_add + * command. */ + if (!populated) { + qemu_opts_del(opts); + } + nb_hp_dimms++; + } + + return 0; +} + #ifdef CONFIG_VIRTFS static int fsdev_init_func(QemuOpts *opts, void *opaque) { @@ -3859,6 +3905,11 @@ int main(int argc, char **argv, char **envp) } qemu_add_globals();
+ /* init generic devices */ + if (qemu_opts_foreach(qemu_find_opts("device"), + dimmcfg_init_func, NULL, 1) != 0) { + exit(1); + } qdev_machine_init();
QEMUMachineInitArgs args = { .ram_size = ram_size,