diff mbox

[U-Boot,2/7] x86: qemu: add a cpu uclass driver for qemu target

Message ID 1451294312-53901-3-git-send-email-yanmiaobest@gmail.com
State Superseded
Delegated to: Bin Meng
Headers show

Commit Message

Miao Yan Dec. 28, 2015, 9:18 a.m. UTC
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: <yanmiaobest@gmail.com>
---
 arch/x86/cpu/qemu/Makefile       |  2 +-
 arch/x86/cpu/qemu/cpu.c          | 58 ++++++++++++++++++++++++++++++++++++++++
 arch/x86/dts/qemu-x86_i440fx.dts |  4 +--
 arch/x86/dts/qemu-x86_q35.dts    |  4 +--
 4 files changed, 63 insertions(+), 5 deletions(-)
 create mode 100644 arch/x86/cpu/qemu/cpu.c

Comments

Bin Meng Dec. 29, 2015, 6:19 a.m. UTC | #1
Hi Miao,

On Mon, Dec 28, 2015 at 5:18 PM, Miao Yan <yanmiaobest@gmail.com> wrote:
> 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: <yanmiaobest@gmail.com>
> ---
>  arch/x86/cpu/qemu/Makefile       |  2 +-
>  arch/x86/cpu/qemu/cpu.c          | 58 ++++++++++++++++++++++++++++++++++++++++
>  arch/x86/dts/qemu-x86_i440fx.dts |  4 +--
>  arch/x86/dts/qemu-x86_q35.dts    |  4 +--
>  4 files changed, 63 insertions(+), 5 deletions(-)
>  create mode 100644 arch/x86/cpu/qemu/cpu.c
>
> diff --git a/arch/x86/cpu/qemu/Makefile b/arch/x86/cpu/qemu/Makefile
> index ad424ec..027a12f 100644
> --- a/arch/x86/cpu/qemu/Makefile
> +++ b/arch/x86/cpu/qemu/Makefile
> @@ -7,5 +7,5 @@
>  ifndef CONFIG_EFI_STUB
>  obj-y += car.o dram.o
>  endif
> -obj-y += qemu.o fw_cfg.o
> +obj-y += qemu.o fw_cfg.o cpu.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
> index 0000000..9d95518
> --- /dev/null
> +++ b/arch/x86/cpu/qemu/cpu.c
> @@ -0,0 +1,58 @@
> +/*
> + * 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 "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)
> +{
> +       int num = (int)qemu_fwcfg_online_cpus();
> +       return num;

Can we just 'return qemu_fwcfg_online_cpus()' here?

> +}
> +
> +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,
> +};
> diff --git a/arch/x86/dts/qemu-x86_i440fx.dts b/arch/x86/dts/qemu-x86_i440fx.dts
> index 8da7e52..8c9d35a 100644
> --- a/arch/x86/dts/qemu-x86_i440fx.dts
> +++ b/arch/x86/dts/qemu-x86_i440fx.dts
> @@ -31,14 +31,14 @@
>
>                 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>;
>                 };
> diff --git a/arch/x86/dts/qemu-x86_q35.dts b/arch/x86/dts/qemu-x86_q35.dts
> index df30c89..c980f45 100644
> --- a/arch/x86/dts/qemu-x86_q35.dts
> +++ b/arch/x86/dts/qemu-x86_q35.dts
> @@ -42,14 +42,14 @@
>
>                 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>;
>                 };
> --

Other than that:
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>

Regards,
Bin
diff mbox

Patch

diff --git a/arch/x86/cpu/qemu/Makefile b/arch/x86/cpu/qemu/Makefile
index ad424ec..027a12f 100644
--- a/arch/x86/cpu/qemu/Makefile
+++ b/arch/x86/cpu/qemu/Makefile
@@ -7,5 +7,5 @@ 
 ifndef CONFIG_EFI_STUB
 obj-y += car.o dram.o
 endif
-obj-y += qemu.o fw_cfg.o
+obj-y += qemu.o fw_cfg.o cpu.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
index 0000000..9d95518
--- /dev/null
+++ b/arch/x86/cpu/qemu/cpu.c
@@ -0,0 +1,58 @@ 
+/*
+ * 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 "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)
+{
+	int num = (int)qemu_fwcfg_online_cpus();
+	return num;
+}
+
+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,
+};
diff --git a/arch/x86/dts/qemu-x86_i440fx.dts b/arch/x86/dts/qemu-x86_i440fx.dts
index 8da7e52..8c9d35a 100644
--- a/arch/x86/dts/qemu-x86_i440fx.dts
+++ b/arch/x86/dts/qemu-x86_i440fx.dts
@@ -31,14 +31,14 @@ 
 
 		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>;
 		};
diff --git a/arch/x86/dts/qemu-x86_q35.dts b/arch/x86/dts/qemu-x86_q35.dts
index df30c89..c980f45 100644
--- a/arch/x86/dts/qemu-x86_q35.dts
+++ b/arch/x86/dts/qemu-x86_q35.dts
@@ -42,14 +42,14 @@ 
 
 		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>;
 		};