[U-Boot] [PATCH 2/7] x86: qemu: add a cpu uclass driver for qemu target
Bin Meng
bmeng.cn at gmail.com
Tue Dec 29 07:19:09 CET 2015
Hi Miao,
On Mon, Dec 28, 2015 at 5:18 PM, Miao Yan <yanmiaobest at 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 at 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 at 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 at 0 {
> device_type = "cpu";
> - compatible = "cpu-x86";
> + compatible = "cpu-qemu";
> reg = <0>;
> intel,apic-id = <0>;
> };
>
> cpu at 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 at 0 {
> device_type = "cpu";
> - compatible = "cpu-x86";
> + compatible = "cpu-qemu";
> reg = <0>;
> intel,apic-id = <0>;
> };
>
> cpu at 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 at gmail.com>
Regards,
Bin
More information about the U-Boot
mailing list