[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