]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
x86: qemu: add a cpu uclass driver for qemu target
authorMiao Yan <yanmiaobest@gmail.com>
Thu, 7 Jan 2016 09:32:01 +0000 (01:32 -0800)
committerBin Meng <bmeng.cn@gmail.com>
Wed, 13 Jan 2016 04:20:15 +0000 (12:20 +0800)
Add a cpu uclass driver for qemu. Previously, the qemu target gets cpu
number from board dts files, which are manually created at compile time.
This does not scale when more cpus are assigned to guest as the dts files
must be modified as well.

This patch adds a cpu uclass driver for qemu targets to directly read
online cpu number from firmware.

Signed-off-by: Miao Yan <yanmiaobest@gmail.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Tested-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/cpu/qemu/Makefile
arch/x86/cpu/qemu/cpu.c [new file with mode: 0644]
arch/x86/dts/qemu-x86_i440fx.dts
arch/x86/dts/qemu-x86_q35.dts

index d613798da13a1ab57cefcf71fd5fa9cc684fb95d..176ea54ae4ef831b6d5b93661ab67d99e837503a 100644 (file)
@@ -7,5 +7,5 @@
 ifndef CONFIG_EFI_STUB
 obj-y += car.o dram.o
 endif
-obj-y += fw_cfg.o qemu.o
+obj-y += cpu.o fw_cfg.o qemu.o
 obj-$(CONFIG_GENERATE_ACPI_TABLE) += acpi.o dsdt.o
diff --git a/arch/x86/cpu/qemu/cpu.c b/arch/x86/cpu/qemu/cpu.c
new file mode 100644 (file)
index 0000000..a4bf53d
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015, Miao Yan <yanmiaobest@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <cpu.h>
+#include <dm.h>
+#include <errno.h>
+#include <asm/cpu.h>
+#include <asm/fw_cfg.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int cpu_qemu_bind(struct udevice *dev)
+{
+       struct cpu_platdata *plat = dev_get_parent_platdata(dev);
+
+       plat->cpu_id = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+                                     "intel,apic-id", -1);
+
+       return 0;
+}
+
+int cpu_qemu_get_desc(struct udevice *dev, char *buf, int size)
+{
+       if (size < CPU_MAX_NAME_LEN)
+               return -ENOSPC;
+
+       cpu_get_name(buf);
+
+       return 0;
+}
+
+static int cpu_qemu_get_count(struct udevice *dev)
+{
+       return qemu_fwcfg_online_cpus();
+}
+
+static const struct cpu_ops cpu_qemu_ops = {
+       .get_desc       = cpu_qemu_get_desc,
+       .get_count      = cpu_qemu_get_count,
+};
+
+static const struct udevice_id cpu_qemu_ids[] = {
+       { .compatible = "cpu-qemu" },
+       { }
+};
+
+U_BOOT_DRIVER(cpu_qemu_drv) = {
+       .name           = "cpu_qemu",
+       .id             = UCLASS_CPU,
+       .of_match       = cpu_qemu_ids,
+       .bind           = cpu_qemu_bind,
+       .ops            = &cpu_qemu_ops,
+};
index 8a062294798ed17b0a9da2413c9f9d596555ed16..433220475dcf3794776c08df12d6ed5c33635598 100644 (file)
 
                cpu@0 {
                        device_type = "cpu";
-                       compatible = "cpu-x86";
+                       compatible = "cpu-qemu";
                        reg = <0>;
                        intel,apic-id = <0>;
                };
 
                cpu@1 {
                        device_type = "cpu";
-                       compatible = "cpu-x86";
+                       compatible = "cpu-qemu";
                        reg = <1>;
                        intel,apic-id = <1>;
                };
index 0b685c8b799f0de0913eeee5b72a4a74b1d91c94..3e2cfac5031393e30fdad0962037001e831b8833 100644 (file)
 
                cpu@0 {
                        device_type = "cpu";
-                       compatible = "cpu-x86";
+                       compatible = "cpu-qemu";
                        reg = <0>;
                        intel,apic-id = <0>;
                };
 
                cpu@1 {
                        device_type = "cpu";
-                       compatible = "cpu-x86";
+                       compatible = "cpu-qemu";
                        reg = <1>;
                        intel,apic-id = <1>;
                };