[U-Boot] [v2 PATCH 00/14] cleanup QEMU fw_cfg code

This patchset cleans the QEMU fw_cfg code:
*) split qfw core and qfw command interface *) split x86 specific operations from qfw core *) move x86 ACPI generation code into qfw core as this can also be used by others like ARM64 *) various cleanups
Changes in v2:
*) make git format-patch detect renames *) add a patch to enable qfw for sandbox_defconfig *) address other trivial review comments
Miao Yan (14): x86: qemu: fix ACPI Kconfig options cmd: qfw: add API to iterate firmware list cmd: qfw: remove qemu_fwcfg_free_files() cmd: qfw: make fwcfg_present and fwcfg_dma_present public x86: qemu: split qfw command interface and qfw core x86: qemu: move x86 specific operations out of qfw core x86: qemu: add comment about qfw register endianness cmd: qfw: rename qemu_fw_cfg.[c|h] to qfw.[c|h] cmd: qfw: do not require default macros when building qfw command cmd: qfw: do not depend on x86 cmd: qfw: bring ACPI generation code into qfw core x86: qemu: rename qemu/acpi_table.c cmd: qfw: rename QEMU_FW_CFG to CMD_QFW config: sandbox: enable qfw and cmd_qfw for testing
arch/x86/Kconfig | 10 +- arch/x86/cpu/mp_init.c | 6 +- arch/x86/cpu/qemu/Makefile | 4 +- arch/x86/cpu/qemu/cpu.c | 2 +- arch/x86/cpu/qemu/e820.c | 43 ++++ arch/x86/cpu/qemu/qemu.c | 50 ++++- arch/x86/lib/Makefile | 2 +- cmd/Kconfig | 4 +- cmd/Makefile | 2 +- cmd/{qemu_fw_cfg.c => qfw.c} | 189 ++--------------- configs/qemu-x86_defconfig | 2 +- configs/sandbox_defconfig | 2 + drivers/misc/Kconfig | 6 + drivers/misc/Makefile | 1 + .../cpu/qemu/acpi_table.c => drivers/misc/qfw.c | 223 +++++++++++++++++---- include/{qemu_fw_cfg.h => qfw.h} | 28 ++- 16 files changed, 336 insertions(+), 238 deletions(-) create mode 100644 arch/x86/cpu/qemu/e820.c rename cmd/{qemu_fw_cfg.c => qfw.c} (54%) rename arch/x86/cpu/qemu/acpi_table.c => drivers/misc/qfw.c (57%) rename include/{qemu_fw_cfg.h => qfw.h} (84%)

CONFIG_GENENRATE_ACPI_TABLE controls the generation of ACPI table which uses U-Boot's built-in methods and CONFIG_QEMU_ACPI_TABLE controls whether to load ACPI table from QEMU's fw_cfg interface.
But with commit "697ec431469ce0a4c2fc2c02d8685d907491af84 x86: qemu: Drop our own ACPI implementation", there is only one way to support ACPI table for QEMU targets which is the fw_cfg interface. Having two Kconfig options for this purpose is not necessary any more, so this patch consolidates the two.
Signed-off-by: Miao Yan yanmiaobest@gmail.com --- Changes in v2: - fix a wrong macro name
arch/x86/Kconfig | 10 +--------- arch/x86/cpu/qemu/Makefile | 2 +- arch/x86/lib/Makefile | 2 +- 3 files changed, 3 insertions(+), 11 deletions(-)
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 4ef27dc..3e360ec 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -436,21 +436,13 @@ config GENERATE_MP_TABLE config GENERATE_ACPI_TABLE bool "Generate an ACPI (Advanced Configuration and Power Interface) table" default n + select CMD_QEMU_FW_CFG if QEMU help The Advanced Configuration and Power Interface (ACPI) specification provides an open standard for device configuration and management by the operating system. It defines platform-independent interfaces for configuration and power management monitoring.
-config QEMU_ACPI_TABLE - bool "Load ACPI table from QEMU fw_cfg interface" - depends on GENERATE_ACPI_TABLE && QEMU - default y - help - By default, U-Boot generates its own ACPI tables. This option, if - enabled, disables U-Boot's version and loads ACPI tables generated - by QEMU. - config GENERATE_SMBIOS_TABLE bool "Generate an SMBIOS (System Management BIOS) table" default y diff --git a/arch/x86/cpu/qemu/Makefile b/arch/x86/cpu/qemu/Makefile index 97b965c..43ee4bd 100644 --- a/arch/x86/cpu/qemu/Makefile +++ b/arch/x86/cpu/qemu/Makefile @@ -8,4 +8,4 @@ ifndef CONFIG_EFI_STUB obj-y += car.o dram.o endif obj-y += cpu.o qemu.o -obj-$(CONFIG_QEMU_ACPI_TABLE) += acpi_table.o +obj-$(CONFIG_GENERATE_ACPI_TABLE) += acpi_table.o diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile index dc90df2..ce5eb82 100644 --- a/arch/x86/lib/Makefile +++ b/arch/x86/lib/Makefile @@ -31,7 +31,7 @@ obj-$(CONFIG_X86_RAMTEST) += ramtest.o obj-y += sfi.o obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += smbios.o obj-y += string.o -ifndef CONFIG_QEMU_ACPI_TABLE +ifndef CONFIG_QEMU obj-$(CONFIG_GENERATE_ACPI_TABLE) += acpi_table.o endif obj-y += tables.o

On Wed, May 18, 2016 at 5:39 PM, Miao Yan yanmiaobest@gmail.com wrote:
CONFIG_GENENRATE_ACPI_TABLE controls the generation of ACPI table which uses U-Boot's built-in methods and CONFIG_QEMU_ACPI_TABLE controls whether to load ACPI table from QEMU's fw_cfg interface.
But with commit "697ec431469ce0a4c2fc2c02d8685d907491af84 x86: qemu: Drop our own ACPI implementation", there is only one way to support ACPI table for QEMU targets which is the fw_cfg interface. Having two Kconfig options for this purpose is not necessary any more, so this patch consolidates the two.
Signed-off-by: Miao Yan yanmiaobest@gmail.com
Changes in v2:
- fix a wrong macro name
arch/x86/Kconfig | 10 +--------- arch/x86/cpu/qemu/Makefile | 2 +- arch/x86/lib/Makefile | 2 +- 3 files changed, 3 insertions(+), 11 deletions(-)
Reviewed-by: Bin Meng bmeng.cn@gmail.com

This patch is part of the refactor work of qfw. It adds 3 APIs to qfw core to iterate firmware list.
Signed-off-by: Miao Yan yanmiaobest@gmail.com Reviewed-by: Bin Meng bmeng.cn@gmail.com --- cmd/qemu_fw_cfg.c | 25 ++++++++++++++++++++++--- include/qemu_fw_cfg.h | 9 +++++++++ 2 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/cmd/qemu_fw_cfg.c b/cmd/qemu_fw_cfg.c index 48ae476..192b7d1 100644 --- a/cmd/qemu_fw_cfg.c +++ b/cmd/qemu_fw_cfg.c @@ -229,10 +229,27 @@ void qemu_fwcfg_free_files(void) } }
+struct fw_file *qemu_fwcfg_file_iter_init(struct fw_cfg_file_iter *iter) +{ + iter->entry = fw_list.next; + return list_entry(iter->entry, struct fw_file, list); +} + +struct fw_file *qemu_fwcfg_file_iter_next(struct fw_cfg_file_iter *iter) +{ + iter->entry = iter->entry->next; + return list_entry(iter->entry, struct fw_file, list); +} + +bool qemu_fwcfg_file_iter_end(struct fw_cfg_file_iter *iter) +{ + return iter->entry == &fw_list; +} + static int qemu_fwcfg_list_firmware(void) { int ret; - struct list_head *entry; + struct fw_cfg_file_iter iter; struct fw_file *file;
/* make sure fw_list is loaded */ @@ -240,8 +257,10 @@ static int qemu_fwcfg_list_firmware(void) if (ret) return ret;
- list_for_each(entry, &fw_list) { - file = list_entry(entry, struct fw_file, list); + + for (file = qemu_fwcfg_file_iter_init(&iter); + !qemu_fwcfg_file_iter_end(&iter); + file = qemu_fwcfg_file_iter_next(&iter)) { printf("%-56s\n", file->cfg.name); }
diff --git a/include/qemu_fw_cfg.h b/include/qemu_fw_cfg.h index e21f150..19d0ba0 100644 --- a/include/qemu_fw_cfg.h +++ b/include/qemu_fw_cfg.h @@ -87,6 +87,10 @@ struct fw_file { struct list_head list; /* list node to link to fw_list */ };
+struct fw_cfg_file_iter { + struct list_head *entry; /* structure to iterate file list */ +}; + struct fw_cfg_dma_access { __be32 control; __be32 length; @@ -159,4 +163,9 @@ void qemu_fwcfg_free_files(void); */ int qemu_fwcfg_online_cpus(void);
+/* helper functions to iterate firmware file list */ +struct fw_file *qemu_fwcfg_file_iter_init(struct fw_cfg_file_iter *iter); +struct fw_file *qemu_fwcfg_file_iter_next(struct fw_cfg_file_iter *iter); +bool qemu_fwcfg_file_iter_end(struct fw_cfg_file_iter *iter); + #endif

This patch is part of the qfw refactor work.
The qemu_fwcfg_free_files() function is only used in error handling in ACPI table generation, let's not make this a core function and move it to the right place.
Signed-off-by: Miao Yan yanmiaobest@gmail.com --- arch/x86/cpu/qemu/acpi_table.c | 13 +++++++++++-- cmd/qemu_fw_cfg.c | 12 ------------ include/qemu_fw_cfg.h | 1 - 3 files changed, 11 insertions(+), 15 deletions(-)
diff --git a/arch/x86/cpu/qemu/acpi_table.c b/arch/x86/cpu/qemu/acpi_table.c index 49381ac..b17fa03 100644 --- a/arch/x86/cpu/qemu/acpi_table.c +++ b/arch/x86/cpu/qemu/acpi_table.c @@ -235,8 +235,17 @@ u32 write_acpi_tables(u32 addr) }
out: - if (ret) - qemu_fwcfg_free_files(); + if (ret) { + struct fw_cfg_file_iter iter; + for (file = qemu_fwcfg_file_iter_init(&iter); + !qemu_fwcfg_file_iter_end(&iter); + file = qemu_fwcfg_file_iter_next(&iter)) { + if (file->addr) { + free((void *)file->addr); + file->addr = 0; + } + } + }
free(table_loader); return addr; diff --git a/cmd/qemu_fw_cfg.c b/cmd/qemu_fw_cfg.c index 192b7d1..9f03ab6 100644 --- a/cmd/qemu_fw_cfg.c +++ b/cmd/qemu_fw_cfg.c @@ -217,18 +217,6 @@ struct fw_file *qemu_fwcfg_find_file(const char *name) return NULL; }
-void qemu_fwcfg_free_files(void) -{ - struct fw_file *file; - struct list_head *list; - - list_for_each(list, &fw_list) { - file = list_entry(list, struct fw_file, list); - if (file->addr) - free((void *)file->addr); - } -} - struct fw_file *qemu_fwcfg_file_iter_init(struct fw_cfg_file_iter *iter) { iter->entry = fw_list.next; diff --git a/include/qemu_fw_cfg.h b/include/qemu_fw_cfg.h index 19d0ba0..986f4b2 100644 --- a/include/qemu_fw_cfg.h +++ b/include/qemu_fw_cfg.h @@ -154,7 +154,6 @@ void qemu_fwcfg_init(void); void qemu_fwcfg_read_entry(uint16_t entry, uint32_t length, void *address); int qemu_fwcfg_read_firmware_list(void); struct fw_file *qemu_fwcfg_find_file(const char *name); -void qemu_fwcfg_free_files(void);
/** * Get system cpu number

On Wed, May 18, 2016 at 5:39 PM, Miao Yan yanmiaobest@gmail.com wrote:
This patch is part of the qfw refactor work.
The qemu_fwcfg_free_files() function is only used in error handling in ACPI table generation, let's not make this a core function and move it to the right place.
Signed-off-by: Miao Yan yanmiaobest@gmail.com
arch/x86/cpu/qemu/acpi_table.c | 13 +++++++++++-- cmd/qemu_fw_cfg.c | 12 ------------ include/qemu_fw_cfg.h | 1 - 3 files changed, 11 insertions(+), 15 deletions(-)
Reviewed-by: Bin Meng bmeng.cn@gmail.com

This patch is part of the qfw refactor work. This patch makes qemu_fwcfg_present() and qemu_fwcfg_dma_present() public functions.
Signed-off-by: Miao Yan yanmiaobest@gmail.com Reviewed-by: Bin Meng bmeng.cn@gmail.com --- cmd/qemu_fw_cfg.c | 37 ++++++++++++++++++++----------------- include/qemu_fw_cfg.h | 3 +++ 2 files changed, 23 insertions(+), 17 deletions(-)
diff --git a/cmd/qemu_fw_cfg.c b/cmd/qemu_fw_cfg.c index 9f03ab6..aab6b1a 100644 --- a/cmd/qemu_fw_cfg.c +++ b/cmd/qemu_fw_cfg.c @@ -62,23 +62,14 @@ static void qemu_fwcfg_read_entry_dma(uint16_t entry, __asm__ __volatile__ ("pause"); }
-static bool qemu_fwcfg_present(void) +bool qemu_fwcfg_present(void) { - uint32_t qemu; - - qemu_fwcfg_read_entry_pio(FW_CFG_SIGNATURE, 4, &qemu); - return be32_to_cpu(qemu) == QEMU_FW_CFG_SIGNATURE; + return fwcfg_present; }
-static bool qemu_fwcfg_dma_present(void) +bool qemu_fwcfg_dma_present(void) { - uint8_t dma_enabled; - - qemu_fwcfg_read_entry_pio(FW_CFG_ID, 1, &dma_enabled); - if (dma_enabled & FW_CFG_DMA_ENABLED) - return true; - - return false; + return fwcfg_dma_present; }
void qemu_fwcfg_read_entry(uint16_t entry, uint32_t length, void *address) @@ -257,9 +248,21 @@ static int qemu_fwcfg_list_firmware(void)
void qemu_fwcfg_init(void) { - fwcfg_present = qemu_fwcfg_present(); - if (fwcfg_present) - fwcfg_dma_present = qemu_fwcfg_dma_present(); + uint32_t qemu; + uint32_t dma_enabled; + + fwcfg_present = false; + fwcfg_dma_present = false; + + qemu_fwcfg_read_entry_pio(FW_CFG_SIGNATURE, 4, &qemu); + if (be32_to_cpu(qemu) == QEMU_FW_CFG_SIGNATURE) + fwcfg_present = true; + + if (fwcfg_present) { + qemu_fwcfg_read_entry_pio(FW_CFG_ID, 1, &dma_enabled); + if (dma_enabled & FW_CFG_DMA_ENABLED) + fwcfg_dma_present = true; + } }
static int qemu_fwcfg_do_list(cmd_tbl_t *cmdtp, int flag, @@ -323,7 +326,7 @@ static int do_qemu_fw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) int ret; cmd_tbl_t *fwcfg_cmd;
- if (!fwcfg_present) { + if (!qemu_fwcfg_present()) { printf("QEMU fw_cfg interface not found\n"); return CMD_RET_USAGE; } diff --git a/include/qemu_fw_cfg.h b/include/qemu_fw_cfg.h index 986f4b2..f718e09 100644 --- a/include/qemu_fw_cfg.h +++ b/include/qemu_fw_cfg.h @@ -167,4 +167,7 @@ struct fw_file *qemu_fwcfg_file_iter_init(struct fw_cfg_file_iter *iter); struct fw_file *qemu_fwcfg_file_iter_next(struct fw_cfg_file_iter *iter); bool qemu_fwcfg_file_iter_end(struct fw_cfg_file_iter *iter);
+bool qemu_fwcfg_present(void); +bool qemu_fwcfg_dma_present(void); + #endif

This patch splits qfw command interface and qfw core function into two files, and introduces a new Kconfig option (CONFIG_QFW). for qfw core.
Now when qfw command interface is enabled, it will automatically select qfw core. This patch also makes the ACPI table generation select CONFIG_QFW.
Signed-off-by: Miao Yan yanmiaobest@gmail.com --- Changes in v2: - do not use #ifdef...#end when including header files - cleanup blank line at the end of file - rename cmd_qfw.c to qfw.c
arch/x86/Kconfig | 2 +- arch/x86/cpu/mp_init.c | 4 +- arch/x86/cpu/qemu/Makefile | 3 +- arch/x86/cpu/qemu/qemu.c | 2 + cmd/Kconfig | 1 + cmd/Makefile | 2 +- cmd/{qemu_fw_cfg.c => qfw.c} | 172 ---------------------------------------- drivers/misc/Kconfig | 6 ++ drivers/misc/Makefile | 1 + drivers/misc/qemu_fw_cfg.c | 184 +++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 200 insertions(+), 177 deletions(-) rename cmd/{qemu_fw_cfg.c => qfw.c} (55%) create mode 100644 drivers/misc/qemu_fw_cfg.c
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 3e360ec..2f63170 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -436,7 +436,7 @@ config GENERATE_MP_TABLE config GENERATE_ACPI_TABLE bool "Generate an ACPI (Advanced Configuration and Power Interface) table" default n - select CMD_QEMU_FW_CFG if QEMU + select QFW if QEMU help The Advanced Configuration and Power Interface (ACPI) specification provides an open standard for device configuration and management diff --git a/arch/x86/cpu/mp_init.c b/arch/x86/cpu/mp_init.c index 13bec7a..c44a286 100644 --- a/arch/x86/cpu/mp_init.c +++ b/arch/x86/cpu/mp_init.c @@ -420,7 +420,7 @@ static int init_bsp(struct udevice **devp) return 0; }
-#ifdef CONFIG_QEMU +#ifdef CONFIG_QFW static int qemu_cpu_fixup(void) { int ret; @@ -496,7 +496,7 @@ int mp_init(struct mp_params *p) if (ret) return ret;
-#ifdef CONFIG_QEMU +#ifdef CONFIG_QFW ret = qemu_cpu_fixup(); if (ret) return ret; diff --git a/arch/x86/cpu/qemu/Makefile b/arch/x86/cpu/qemu/Makefile index 43ee4bd..7c08c3d 100644 --- a/arch/x86/cpu/qemu/Makefile +++ b/arch/x86/cpu/qemu/Makefile @@ -7,5 +7,6 @@ ifndef CONFIG_EFI_STUB obj-y += car.o dram.o endif -obj-y += cpu.o qemu.o +obj-y += qemu.o +obj-$(CONFIG_QFW) += cpu.o obj-$(CONFIG_GENERATE_ACPI_TABLE) += acpi_table.o diff --git a/arch/x86/cpu/qemu/qemu.c b/arch/x86/cpu/qemu/qemu.c index b41e4ec..32a4351 100644 --- a/arch/x86/cpu/qemu/qemu.c +++ b/arch/x86/cpu/qemu/qemu.c @@ -88,7 +88,9 @@ static void qemu_chipset_init(void) enable_pm_ich9(); }
+#ifdef CONFIG_QFW qemu_fwcfg_init(); +#endif }
int arch_cpu_init(void) diff --git a/cmd/Kconfig b/cmd/Kconfig index c0fffe3..08b761f 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -596,6 +596,7 @@ config CMD_SOUND config CMD_QEMU_FW_CFG bool "qfw" depends on X86 + select QFW help This provides access to the QEMU firmware interface. The main feature is to allow easy loading of files passed to qemu-system diff --git a/cmd/Makefile b/cmd/Makefile index f99e67d..0b7f7a2 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -105,7 +105,7 @@ endif obj-y += pcmcia.o obj-$(CONFIG_CMD_PORTIO) += portio.o obj-$(CONFIG_CMD_PXE) += pxe.o -obj-$(CONFIG_CMD_QEMU_FW_CFG) += qemu_fw_cfg.o +obj-$(CONFIG_CMD_QEMU_FW_CFG) += qfw.o obj-$(CONFIG_CMD_READ) += read.o obj-$(CONFIG_CMD_REGINFO) += reginfo.o obj-$(CONFIG_CMD_REISER) += reiser.o diff --git a/cmd/qemu_fw_cfg.c b/cmd/qfw.c similarity index 55% rename from cmd/qemu_fw_cfg.c rename to cmd/qfw.c index aab6b1a..37f1aa6 100644 --- a/cmd/qemu_fw_cfg.c +++ b/cmd/qfw.c @@ -7,90 +7,7 @@ #include <common.h> #include <command.h> #include <errno.h> -#include <malloc.h> #include <qemu_fw_cfg.h> -#include <asm/io.h> -#include <linux/list.h> - -static bool fwcfg_present; -static bool fwcfg_dma_present; - -static LIST_HEAD(fw_list); - -/* Read configuration item using fw_cfg PIO interface */ -static void qemu_fwcfg_read_entry_pio(uint16_t entry, - uint32_t size, void *address) -{ - uint32_t i = 0; - uint8_t *data = address; - - /* - * writting FW_CFG_INVALID will cause read operation to resume at - * last offset, otherwise read will start at offset 0 - */ - if (entry != FW_CFG_INVALID) - outw(entry, FW_CONTROL_PORT); - while (size--) - data[i++] = inb(FW_DATA_PORT); -} - -/* Read configuration item using fw_cfg DMA interface */ -static void qemu_fwcfg_read_entry_dma(uint16_t entry, - uint32_t size, void *address) -{ - struct fw_cfg_dma_access dma; - - dma.length = cpu_to_be32(size); - dma.address = cpu_to_be64((uintptr_t)address); - dma.control = cpu_to_be32(FW_CFG_DMA_READ); - - /* - * writting FW_CFG_INVALID will cause read operation to resume at - * last offset, otherwise read will start at offset 0 - */ - if (entry != FW_CFG_INVALID) - dma.control |= cpu_to_be32(FW_CFG_DMA_SELECT | (entry << 16)); - - barrier(); - - debug("qemu_fwcfg_dma_read_entry: addr %p, length %u control 0x%x\n", - address, size, be32_to_cpu(dma.control)); - - outl(cpu_to_be32((uint32_t)&dma), FW_DMA_PORT_HIGH); - - while (be32_to_cpu(dma.control) & ~FW_CFG_DMA_ERROR) - __asm__ __volatile__ ("pause"); -} - -bool qemu_fwcfg_present(void) -{ - return fwcfg_present; -} - -bool qemu_fwcfg_dma_present(void) -{ - return fwcfg_dma_present; -} - -void qemu_fwcfg_read_entry(uint16_t entry, uint32_t length, void *address) -{ - if (fwcfg_dma_present) - qemu_fwcfg_read_entry_dma(entry, length, address); - else - qemu_fwcfg_read_entry_pio(entry, length, address); -} - -int qemu_fwcfg_online_cpus(void) -{ - uint16_t nb_cpus; - - if (!fwcfg_present) - return -ENODEV; - - qemu_fwcfg_read_entry(FW_CFG_NB_CPUS, 2, &nb_cpus); - - return le16_to_cpu(nb_cpus); -}
/* * This function prepares kernel for zboot. It loads kernel data @@ -155,76 +72,6 @@ static int qemu_fwcfg_setup_kernel(void *load_addr, void *initrd_addr) return 0; }
-int qemu_fwcfg_read_firmware_list(void) -{ - int i; - uint32_t count; - struct fw_file *file; - struct list_head *entry; - - /* don't read it twice */ - if (!list_empty(&fw_list)) - return 0; - - qemu_fwcfg_read_entry(FW_CFG_FILE_DIR, 4, &count); - if (!count) - return 0; - - count = be32_to_cpu(count); - for (i = 0; i < count; i++) { - file = malloc(sizeof(*file)); - if (!file) { - printf("error: allocating resource\n"); - goto err; - } - qemu_fwcfg_read_entry(FW_CFG_INVALID, - sizeof(struct fw_cfg_file), &file->cfg); - file->addr = 0; - list_add_tail(&file->list, &fw_list); - } - - return 0; - -err: - list_for_each(entry, &fw_list) { - file = list_entry(entry, struct fw_file, list); - free(file); - } - - return -ENOMEM; -} - -struct fw_file *qemu_fwcfg_find_file(const char *name) -{ - struct list_head *entry; - struct fw_file *file; - - list_for_each(entry, &fw_list) { - file = list_entry(entry, struct fw_file, list); - if (!strcmp(file->cfg.name, name)) - return file; - } - - return NULL; -} - -struct fw_file *qemu_fwcfg_file_iter_init(struct fw_cfg_file_iter *iter) -{ - iter->entry = fw_list.next; - return list_entry(iter->entry, struct fw_file, list); -} - -struct fw_file *qemu_fwcfg_file_iter_next(struct fw_cfg_file_iter *iter) -{ - iter->entry = iter->entry->next; - return list_entry(iter->entry, struct fw_file, list); -} - -bool qemu_fwcfg_file_iter_end(struct fw_cfg_file_iter *iter) -{ - return iter->entry == &fw_list; -} - static int qemu_fwcfg_list_firmware(void) { int ret; @@ -246,25 +93,6 @@ static int qemu_fwcfg_list_firmware(void) return 0; }
-void qemu_fwcfg_init(void) -{ - uint32_t qemu; - uint32_t dma_enabled; - - fwcfg_present = false; - fwcfg_dma_present = false; - - qemu_fwcfg_read_entry_pio(FW_CFG_SIGNATURE, 4, &qemu); - if (be32_to_cpu(qemu) == QEMU_FW_CFG_SIGNATURE) - fwcfg_present = true; - - if (fwcfg_present) { - qemu_fwcfg_read_entry_pio(FW_CFG_ID, 1, &dma_enabled); - if (dma_enabled & FW_CFG_DMA_ENABLED) - fwcfg_dma_present = true; - } -} - static int qemu_fwcfg_do_list(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index af8667f..fa53700 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -138,4 +138,10 @@ config WINBOND_W83627 legacy UART or other devices in the Winbond Super IO chips on X86 platforms.
+config QFW + bool + help + Hidden option to enable QEMU fw_cfg interface. This will be selected by + either CONFIG_CMD_QEMU_FW_CFG or CONFIG_GENERATE_ACPI_TABLE. + endmenu diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 5969d34..4893086 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -43,3 +43,4 @@ obj-$(CONFIG_PCA9551_LED) += pca9551_led.o obj-$(CONFIG_RESET) += reset-uclass.o obj-$(CONFIG_FSL_DEVICE_DISABLE) += fsl_devdis.o obj-$(CONFIG_WINBOND_W83627) += winbond_w83627.o +obj-$(CONFIG_QFW) += qemu_fw_cfg.o diff --git a/drivers/misc/qemu_fw_cfg.c b/drivers/misc/qemu_fw_cfg.c new file mode 100644 index 0000000..a574bd1 --- /dev/null +++ b/drivers/misc/qemu_fw_cfg.c @@ -0,0 +1,184 @@ +/* + * (C) Copyright 2015 Miao Yan yanmiaobest@gmail.com + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <command.h> +#include <errno.h> +#include <malloc.h> +#include <qemu_fw_cfg.h> +#include <asm/io.h> +#include <linux/list.h> + +static bool fwcfg_present; +static bool fwcfg_dma_present; + +static LIST_HEAD(fw_list); + +/* Read configuration item using fw_cfg PIO interface */ +static void qemu_fwcfg_read_entry_pio(uint16_t entry, + uint32_t size, void *address) +{ + uint32_t i = 0; + uint8_t *data = address; + + /* + * writting FW_CFG_INVALID will cause read operation to resume at + * last offset, otherwise read will start at offset 0 + */ + if (entry != FW_CFG_INVALID) + outw(entry, FW_CONTROL_PORT); + while (size--) + data[i++] = inb(FW_DATA_PORT); +} + +/* Read configuration item using fw_cfg DMA interface */ +static void qemu_fwcfg_read_entry_dma(uint16_t entry, + uint32_t size, void *address) +{ + struct fw_cfg_dma_access dma; + + dma.length = cpu_to_be32(size); + dma.address = cpu_to_be64((uintptr_t)address); + dma.control = cpu_to_be32(FW_CFG_DMA_READ); + + /* + * writting FW_CFG_INVALID will cause read operation to resume at + * last offset, otherwise read will start at offset 0 + */ + if (entry != FW_CFG_INVALID) + dma.control |= cpu_to_be32(FW_CFG_DMA_SELECT | (entry << 16)); + + barrier(); + + debug("qemu_fwcfg_dma_read_entry: addr %p, length %u control 0x%x\n", + address, size, be32_to_cpu(dma.control)); + + outl(cpu_to_be32((uint32_t)&dma), FW_DMA_PORT_HIGH); + + while (be32_to_cpu(dma.control) & ~FW_CFG_DMA_ERROR) + __asm__ __volatile__ ("pause"); +} + +bool qemu_fwcfg_present(void) +{ + return fwcfg_present; +} + +bool qemu_fwcfg_dma_present(void) +{ + return fwcfg_dma_present; +} + +void qemu_fwcfg_read_entry(uint16_t entry, uint32_t length, void *address) +{ + if (fwcfg_dma_present) + qemu_fwcfg_read_entry_dma(entry, length, address); + else + qemu_fwcfg_read_entry_pio(entry, length, address); +} + +int qemu_fwcfg_online_cpus(void) +{ + uint16_t nb_cpus; + + if (!fwcfg_present) + return -ENODEV; + + qemu_fwcfg_read_entry(FW_CFG_NB_CPUS, 2, &nb_cpus); + + return le16_to_cpu(nb_cpus); +} + +int qemu_fwcfg_read_firmware_list(void) +{ + int i; + uint32_t count; + struct fw_file *file; + struct list_head *entry; + + /* don't read it twice */ + if (!list_empty(&fw_list)) + return 0; + + qemu_fwcfg_read_entry(FW_CFG_FILE_DIR, 4, &count); + if (!count) + return 0; + + count = be32_to_cpu(count); + for (i = 0; i < count; i++) { + file = malloc(sizeof(*file)); + if (!file) { + printf("error: allocating resource\n"); + goto err; + } + qemu_fwcfg_read_entry(FW_CFG_INVALID, + sizeof(struct fw_cfg_file), &file->cfg); + file->addr = 0; + list_add_tail(&file->list, &fw_list); + } + + return 0; + +err: + list_for_each(entry, &fw_list) { + file = list_entry(entry, struct fw_file, list); + free(file); + } + + return -ENOMEM; +} + +struct fw_file *qemu_fwcfg_find_file(const char *name) +{ + struct list_head *entry; + struct fw_file *file; + + list_for_each(entry, &fw_list) { + file = list_entry(entry, struct fw_file, list); + if (!strcmp(file->cfg.name, name)) + return file; + } + + return NULL; +} + +struct fw_file *qemu_fwcfg_file_iter_init(struct fw_cfg_file_iter *iter) +{ + iter->entry = fw_list.next; + return list_entry((struct list_head *)iter->entry, + struct fw_file, list); +} + +struct fw_file *qemu_fwcfg_file_iter_next(struct fw_cfg_file_iter *iter) +{ + iter->entry = ((struct list_head *)iter->entry)->next; + return list_entry((struct list_head *)iter->entry, + struct fw_file, list); +} + +bool qemu_fwcfg_file_iter_end(struct fw_cfg_file_iter *iter) +{ + return iter->entry == &fw_list; +} + +void qemu_fwcfg_init(void) +{ + uint32_t qemu; + uint32_t dma_enabled; + + fwcfg_present = false; + fwcfg_dma_present = false; + + qemu_fwcfg_read_entry_pio(FW_CFG_SIGNATURE, 4, &qemu); + if (be32_to_cpu(qemu) == QEMU_FW_CFG_SIGNATURE) + fwcfg_present = true; + + if (fwcfg_present) { + qemu_fwcfg_read_entry_pio(FW_CFG_ID, 1, &dma_enabled); + if (dma_enabled & FW_CFG_DMA_ENABLED) + fwcfg_dma_present = true; + } +}

On Wed, May 18, 2016 at 5:39 PM, Miao Yan yanmiaobest@gmail.com wrote:
This patch splits qfw command interface and qfw core function into two files, and introduces a new Kconfig option (CONFIG_QFW). for
nits: . should be removed
I can fix when applying
qfw core.
Now when qfw command interface is enabled, it will automatically select qfw core. This patch also makes the ACPI table generation select CONFIG_QFW.
Signed-off-by: Miao Yan yanmiaobest@gmail.com
Changes in v2:
- do not use #ifdef...#end when including header files
- cleanup blank line at the end of file
- rename cmd_qfw.c to qfw.c
arch/x86/Kconfig | 2 +- arch/x86/cpu/mp_init.c | 4 +- arch/x86/cpu/qemu/Makefile | 3 +- arch/x86/cpu/qemu/qemu.c | 2 + cmd/Kconfig | 1 + cmd/Makefile | 2 +- cmd/{qemu_fw_cfg.c => qfw.c} | 172 ---------------------------------------- drivers/misc/Kconfig | 6 ++ drivers/misc/Makefile | 1 + drivers/misc/qemu_fw_cfg.c | 184 +++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 200 insertions(+), 177 deletions(-) rename cmd/{qemu_fw_cfg.c => qfw.c} (55%) create mode 100644 drivers/misc/qemu_fw_cfg.c
Reviewed-by: Bin Meng bmeng.cn@gmail.com

The original implementation of qfw includes several x86 specific operations, like directly calling outb/inb and using some inline assembly code which prevents it being ported to other architectures.
This patch adds callback functions and moves those to arch/x86/
Signed-off-by: Miao Yan yanmiaobest@gmail.com Reviewed-by: Bin Meng bmeng.cn@gmail.com --- arch/x86/cpu/qemu/qemu.c | 39 ++++++++++++++++++++++++++++++++++++++- drivers/misc/qemu_fw_cfg.c | 30 +++++++++++++----------------- include/qemu_fw_cfg.h | 15 +++++++++------ 3 files changed, 60 insertions(+), 24 deletions(-)
diff --git a/arch/x86/cpu/qemu/qemu.c b/arch/x86/cpu/qemu/qemu.c index 32a4351..6ff9947 100644 --- a/arch/x86/cpu/qemu/qemu.c +++ b/arch/x86/cpu/qemu/qemu.c @@ -15,6 +15,43 @@
static bool i440fx;
+#ifdef CONFIG_QFW + +#define FW_CONTROL_PORT 0x510 +#define FW_DATA_PORT 0x511 +#define FW_DMA_PORT_LOW 0x514 +#define FW_DMA_PORT_HIGH 0x518 + +static void qemu_x86_fwcfg_read_entry_pio(uint16_t entry, + uint32_t size, void *address) +{ + uint32_t i = 0; + uint8_t *data = address; + + /* + * writting FW_CFG_INVALID will cause read operation to resume at + * last offset, otherwise read will start at offset 0 + */ + if (entry != FW_CFG_INVALID) + outw(entry, FW_CONTROL_PORT); + while (size--) + data[i++] = inb(FW_DATA_PORT); +} + +static void qemu_x86_fwcfg_read_entry_dma(struct fw_cfg_dma_access *dma) +{ + outl(cpu_to_be32((uint32_t)dma), FW_DMA_PORT_HIGH); + + while (be32_to_cpu(dma->control) & ~FW_CFG_DMA_ERROR) + __asm__ __volatile__ ("pause"); +} + +static struct fw_cfg_arch_ops fwcfg_x86_ops = { + .arch_read_pio = qemu_x86_fwcfg_read_entry_pio, + .arch_read_dma = qemu_x86_fwcfg_read_entry_dma +}; +#endif + static void enable_pm_piix(void) { u8 en; @@ -89,7 +126,7 @@ static void qemu_chipset_init(void) }
#ifdef CONFIG_QFW - qemu_fwcfg_init(); + qemu_fwcfg_init(&fwcfg_x86_ops); #endif }
diff --git a/drivers/misc/qemu_fw_cfg.c b/drivers/misc/qemu_fw_cfg.c index a574bd1..0f72549 100644 --- a/drivers/misc/qemu_fw_cfg.c +++ b/drivers/misc/qemu_fw_cfg.c @@ -14,6 +14,7 @@
static bool fwcfg_present; static bool fwcfg_dma_present; +static struct fw_cfg_arch_ops *fwcfg_arch_ops;
static LIST_HEAD(fw_list);
@@ -21,17 +22,10 @@ static LIST_HEAD(fw_list); static void qemu_fwcfg_read_entry_pio(uint16_t entry, uint32_t size, void *address) { - uint32_t i = 0; - uint8_t *data = address; + debug("qemu_fwcfg_read_entry_pio: entry 0x%x, size %u address %p\n", + entry, size, address);
- /* - * writting FW_CFG_INVALID will cause read operation to resume at - * last offset, otherwise read will start at offset 0 - */ - if (entry != FW_CFG_INVALID) - outw(entry, FW_CONTROL_PORT); - while (size--) - data[i++] = inb(FW_DATA_PORT); + return fwcfg_arch_ops->arch_read_pio(entry, size, address); }
/* Read configuration item using fw_cfg DMA interface */ @@ -53,13 +47,10 @@ static void qemu_fwcfg_read_entry_dma(uint16_t entry,
barrier();
- debug("qemu_fwcfg_dma_read_entry: addr %p, length %u control 0x%x\n", - address, size, be32_to_cpu(dma.control)); - - outl(cpu_to_be32((uint32_t)&dma), FW_DMA_PORT_HIGH); + debug("qemu_fwcfg_read_entry_dma: entry 0x%x, size %u address %p, control 0x%x\n", + entry, size, address, be32_to_cpu(dma.control));
- while (be32_to_cpu(dma.control) & ~FW_CFG_DMA_ERROR) - __asm__ __volatile__ ("pause"); + fwcfg_arch_ops->arch_read_dma(&dma); }
bool qemu_fwcfg_present(void) @@ -164,13 +155,18 @@ bool qemu_fwcfg_file_iter_end(struct fw_cfg_file_iter *iter) return iter->entry == &fw_list; }
-void qemu_fwcfg_init(void) +void qemu_fwcfg_init(struct fw_cfg_arch_ops *ops) { uint32_t qemu; uint32_t dma_enabled;
fwcfg_present = false; fwcfg_dma_present = false; + fwcfg_arch_ops = NULL; + + if (!ops || !ops->arch_read_pio || !ops->arch_read_dma) + return; + fwcfg_arch_ops = ops;
qemu_fwcfg_read_entry_pio(FW_CFG_SIGNATURE, 4, &qemu); if (be32_to_cpu(qemu) == QEMU_FW_CFG_SIGNATURE) diff --git a/include/qemu_fw_cfg.h b/include/qemu_fw_cfg.h index f718e09..b0b3b59 100644 --- a/include/qemu_fw_cfg.h +++ b/include/qemu_fw_cfg.h @@ -7,11 +7,6 @@ #ifndef __FW_CFG__ #define __FW_CFG__
-#define FW_CONTROL_PORT 0x510 -#define FW_DATA_PORT 0x511 -#define FW_DMA_PORT_LOW 0x514 -#define FW_DMA_PORT_HIGH 0x518 - #include <linux/list.h>
enum qemu_fwcfg_items { @@ -97,6 +92,12 @@ struct fw_cfg_dma_access { __be64 address; };
+struct fw_cfg_arch_ops { + void (*arch_read_pio)(uint16_t selector, uint32_t size, + void *address); + void (*arch_read_dma)(struct fw_cfg_dma_access *dma); +}; + struct bios_linker_entry { __le32 command; union { @@ -148,8 +149,10 @@ struct bios_linker_entry {
/** * Initialize QEMU fw_cfg interface + * + * @ops: arch specific read operations */ -void qemu_fwcfg_init(void); +void qemu_fwcfg_init(struct fw_cfg_arch_ops *ops);
void qemu_fwcfg_read_entry(uint16_t entry, uint32_t length, void *address); int qemu_fwcfg_read_firmware_list(void);

This patch adds some comments about qfw register endianness for clarity.
Signed-off-by: Miao Yan yanmiaobest@gmail.com Reviewed-by: Bin Meng bmeng.cn@gmail.com --- arch/x86/cpu/qemu/qemu.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/arch/x86/cpu/qemu/qemu.c b/arch/x86/cpu/qemu/qemu.c index 6ff9947..c29add3 100644 --- a/arch/x86/cpu/qemu/qemu.c +++ b/arch/x86/cpu/qemu/qemu.c @@ -17,6 +17,7 @@ static bool i440fx;
#ifdef CONFIG_QFW
+/* on x86, the qfw registers are all IO ports */ #define FW_CONTROL_PORT 0x510 #define FW_DATA_PORT 0x511 #define FW_DMA_PORT_LOW 0x514 @@ -31,15 +32,21 @@ static void qemu_x86_fwcfg_read_entry_pio(uint16_t entry, /* * writting FW_CFG_INVALID will cause read operation to resume at * last offset, otherwise read will start at offset 0 + * + * Note: on platform where the control register is IO port, the + * endianness is little endian. */ if (entry != FW_CFG_INVALID) - outw(entry, FW_CONTROL_PORT); + outw(cpu_to_le16(entry), FW_CONTROL_PORT); + + /* the endianness of data register is string-preserving */ while (size--) data[i++] = inb(FW_DATA_PORT); }
static void qemu_x86_fwcfg_read_entry_dma(struct fw_cfg_dma_access *dma) { + /* the DMA address register is big endian */ outl(cpu_to_be32((uint32_t)dma), FW_DMA_PORT_HIGH);
while (be32_to_cpu(dma->control) & ~FW_CFG_DMA_ERROR)

Make file names aligned with CONFIG_QFW
Signed-off-by: Miao Yan yanmiaobest@gmail.com --- arch/x86/cpu/mp_init.c | 2 +- arch/x86/cpu/qemu/acpi_table.c | 2 +- arch/x86/cpu/qemu/cpu.c | 2 +- arch/x86/cpu/qemu/qemu.c | 2 +- cmd/qfw.c | 2 +- drivers/misc/Makefile | 2 +- drivers/misc/{qemu_fw_cfg.c => qfw.c} | 2 +- include/{qemu_fw_cfg.h => qfw.h} | 0 8 files changed, 7 insertions(+), 7 deletions(-) rename drivers/misc/{qemu_fw_cfg.c => qfw.c} (99%) rename include/{qemu_fw_cfg.h => qfw.h} (100%)
diff --git a/arch/x86/cpu/mp_init.c b/arch/x86/cpu/mp_init.c index c44a286..8207274 100644 --- a/arch/x86/cpu/mp_init.c +++ b/arch/x86/cpu/mp_init.c @@ -11,7 +11,7 @@ #include <dm.h> #include <errno.h> #include <malloc.h> -#include <qemu_fw_cfg.h> +#include <qfw.h> #include <asm/atomic.h> #include <asm/cpu.h> #include <asm/interrupt.h> diff --git a/arch/x86/cpu/qemu/acpi_table.c b/arch/x86/cpu/qemu/acpi_table.c index b17fa03..5bb1756 100644 --- a/arch/x86/cpu/qemu/acpi_table.c +++ b/arch/x86/cpu/qemu/acpi_table.c @@ -8,7 +8,7 @@ #include <command.h> #include <errno.h> #include <malloc.h> -#include <qemu_fw_cfg.h> +#include <qfw.h> #include <asm/io.h> #include <asm/tables.h> #include <asm/e820.h> diff --git a/arch/x86/cpu/qemu/cpu.c b/arch/x86/cpu/qemu/cpu.c index 4d2989a..b1a965e 100644 --- a/arch/x86/cpu/qemu/cpu.c +++ b/arch/x86/cpu/qemu/cpu.c @@ -8,7 +8,7 @@ #include <cpu.h> #include <dm.h> #include <errno.h> -#include <qemu_fw_cfg.h> +#include <qfw.h> #include <asm/cpu.h>
DECLARE_GLOBAL_DATA_PTR; diff --git a/arch/x86/cpu/qemu/qemu.c b/arch/x86/cpu/qemu/qemu.c index c29add3..680e558 100644 --- a/arch/x86/cpu/qemu/qemu.c +++ b/arch/x86/cpu/qemu/qemu.c @@ -6,7 +6,7 @@
#include <common.h> #include <pci.h> -#include <qemu_fw_cfg.h> +#include <qfw.h> #include <asm/irq.h> #include <asm/post.h> #include <asm/processor.h> diff --git a/cmd/qfw.c b/cmd/qfw.c index 37f1aa6..c6730bf 100644 --- a/cmd/qfw.c +++ b/cmd/qfw.c @@ -7,7 +7,7 @@ #include <common.h> #include <command.h> #include <errno.h> -#include <qemu_fw_cfg.h> +#include <qfw.h>
/* * This function prepares kernel for zboot. It loads kernel data diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 4893086..98704f2 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -43,4 +43,4 @@ obj-$(CONFIG_PCA9551_LED) += pca9551_led.o obj-$(CONFIG_RESET) += reset-uclass.o obj-$(CONFIG_FSL_DEVICE_DISABLE) += fsl_devdis.o obj-$(CONFIG_WINBOND_W83627) += winbond_w83627.o -obj-$(CONFIG_QFW) += qemu_fw_cfg.o +obj-$(CONFIG_QFW) += qfw.o diff --git a/drivers/misc/qemu_fw_cfg.c b/drivers/misc/qfw.c similarity index 99% rename from drivers/misc/qemu_fw_cfg.c rename to drivers/misc/qfw.c index 0f72549..59d9376 100644 --- a/drivers/misc/qemu_fw_cfg.c +++ b/drivers/misc/qfw.c @@ -8,7 +8,7 @@ #include <command.h> #include <errno.h> #include <malloc.h> -#include <qemu_fw_cfg.h> +#include <qfw.h> #include <asm/io.h> #include <linux/list.h>
diff --git a/include/qemu_fw_cfg.h b/include/qfw.h similarity index 100% rename from include/qemu_fw_cfg.h rename to include/qfw.h

On Wed, May 18, 2016 at 5:39 PM, Miao Yan yanmiaobest@gmail.com wrote:
Make file names aligned with CONFIG_QFW
Signed-off-by: Miao Yan yanmiaobest@gmail.com
arch/x86/cpu/mp_init.c | 2 +- arch/x86/cpu/qemu/acpi_table.c | 2 +- arch/x86/cpu/qemu/cpu.c | 2 +- arch/x86/cpu/qemu/qemu.c | 2 +- cmd/qfw.c | 2 +- drivers/misc/Makefile | 2 +- drivers/misc/{qemu_fw_cfg.c => qfw.c} | 2 +- include/{qemu_fw_cfg.h => qfw.h} | 0 8 files changed, 7 insertions(+), 7 deletions(-) rename drivers/misc/{qemu_fw_cfg.c => qfw.c} (99%) rename include/{qemu_fw_cfg.h => qfw.h} (100%)
Reviewed-by: Bin Meng bmeng.cn@gmail.com

The qfw command interface makes use of CONFIG_LOADADDR and CONFIG_RAMDISKADDR to setup kernel. But not all boards have these macro, which causes build problem on those platforms.
This patch fixes this issue.
Signed-off-by: Miao Yan yanmiaobest@gmail.com Reviewed-by: Bin Meng bmeng.cn@gmail.com --- Changes in v2: - fix commit message
cmd/qfw.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/cmd/qfw.c b/cmd/qfw.c index c6730bf..12436ec 100644 --- a/cmd/qfw.c +++ b/cmd/qfw.c @@ -126,12 +126,20 @@ static int qemu_fwcfg_do_load(cmd_tbl_t *cmdtp, int flag, env = getenv("loadaddr"); load_addr = env ? (void *)simple_strtoul(env, NULL, 16) : +#ifdef CONFIG_LOADADDR (void *)CONFIG_LOADADDR; +#else + NULL; +#endif
env = getenv("ramdiskaddr"); initrd_addr = env ? (void *)simple_strtoul(env, NULL, 16) : +#ifdef CONFIG_RAMDISK_ADDR (void *)CONFIG_RAMDISK_ADDR; +#else + NULL; +#endif
if (argc == 2) { load_addr = (void *)simple_strtoul(argv[0], NULL, 16); @@ -140,6 +148,11 @@ static int qemu_fwcfg_do_load(cmd_tbl_t *cmdtp, int flag, load_addr = (void *)simple_strtoul(argv[0], NULL, 16); }
+ if (!load_addr || !initrd_addr) { + printf("missing load or initrd address\n"); + return CMD_RET_FAILURE; + } + return qemu_fwcfg_setup_kernel(load_addr, initrd_addr); }

The qfw command interface used to depend on X86, this patch removes this restriction so it can be built for sandbox for testing. For normal usage, it can only be used with CONFIG_QEMU.
Signed-off-by: Miao Yan yanmiaobest@gmail.com Reviewed-by: Bin Meng bmeng.cn@gmail.com --- cmd/Kconfig | 1 - 1 file changed, 1 deletion(-)
diff --git a/cmd/Kconfig b/cmd/Kconfig index 08b761f..01870cb 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -595,7 +595,6 @@ config CMD_SOUND
config CMD_QEMU_FW_CFG bool "qfw" - depends on X86 select QFW help This provides access to the QEMU firmware interface. The main

Loading ACPI table from QEMU's fw_cfg interface is not x86 specific (ARM64 may also make use of it). So move the code to common place.
Signed-off-by: Miao Yan yanmiaobest@gmail.com Reviewed-by: Bin Meng bmeng.cn@gmail.com --- arch/x86/cpu/qemu/acpi_table.c | 209 ----------------------------------------- drivers/misc/qfw.c | 206 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 206 insertions(+), 209 deletions(-)
diff --git a/arch/x86/cpu/qemu/acpi_table.c b/arch/x86/cpu/qemu/acpi_table.c index 5bb1756..63853e4 100644 --- a/arch/x86/cpu/qemu/acpi_table.c +++ b/arch/x86/cpu/qemu/acpi_table.c @@ -5,139 +5,7 @@ */
#include <common.h> -#include <command.h> -#include <errno.h> -#include <malloc.h> -#include <qfw.h> -#include <asm/io.h> -#include <asm/tables.h> #include <asm/e820.h> -#include <linux/list.h> -#include <memalign.h> - -/* - * This function allocates memory for ACPI tables - * - * @entry : BIOS linker command entry which tells where to allocate memory - * (either high memory or low memory) - * @addr : The address that should be used for low memory allcation. If the - * memory allocation request is 'ZONE_HIGH' then this parameter will - * be ignored. - * @return: 0 on success, or negative value on failure - */ -static int bios_linker_allocate(struct bios_linker_entry *entry, u32 *addr) -{ - uint32_t size, align; - struct fw_file *file; - unsigned long aligned_addr; - - align = le32_to_cpu(entry->alloc.align); - /* align must be power of 2 */ - if (align & (align - 1)) { - printf("error: wrong alignment %u\n", align); - return -EINVAL; - } - - file = qemu_fwcfg_find_file(entry->alloc.file); - if (!file) { - printf("error: can't find file %s\n", entry->alloc.file); - return -ENOENT; - } - - size = be32_to_cpu(file->cfg.size); - - /* - * ZONE_HIGH means we need to allocate from high memory, since - * malloc space is already at the end of RAM, so we directly use it. - * If allocation zone is ZONE_FSEG, then we use the 'addr' passed - * in which is low memory - */ - if (entry->alloc.zone == BIOS_LINKER_LOADER_ALLOC_ZONE_HIGH) { - aligned_addr = (unsigned long)memalign(align, size); - if (!aligned_addr) { - printf("error: allocating resource\n"); - return -ENOMEM; - } - } else if (entry->alloc.zone == BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG) { - aligned_addr = ALIGN(*addr, align); - } else { - printf("error: invalid allocation zone\n"); - return -EINVAL; - } - - debug("bios_linker_allocate: allocate file %s, size %u, zone %d, align %u, addr 0x%lx\n", - file->cfg.name, size, entry->alloc.zone, align, aligned_addr); - - qemu_fwcfg_read_entry(be16_to_cpu(file->cfg.select), - size, (void *)aligned_addr); - file->addr = aligned_addr; - - /* adjust address for low memory allocation */ - if (entry->alloc.zone == BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG) - *addr = (aligned_addr + size); - - return 0; -} - -/* - * This function patches ACPI tables previously loaded - * by bios_linker_allocate() - * - * @entry : BIOS linker command entry which tells how to patch - * ACPI tables - * @return: 0 on success, or negative value on failure - */ -static int bios_linker_add_pointer(struct bios_linker_entry *entry) -{ - struct fw_file *dest, *src; - uint32_t offset = le32_to_cpu(entry->pointer.offset); - uint64_t pointer = 0; - - dest = qemu_fwcfg_find_file(entry->pointer.dest_file); - if (!dest || !dest->addr) - return -ENOENT; - src = qemu_fwcfg_find_file(entry->pointer.src_file); - if (!src || !src->addr) - return -ENOENT; - - debug("bios_linker_add_pointer: dest->addr 0x%lx, src->addr 0x%lx, offset 0x%x size %u, 0x%llx\n", - dest->addr, src->addr, offset, entry->pointer.size, pointer); - - memcpy(&pointer, (char *)dest->addr + offset, entry->pointer.size); - pointer = le64_to_cpu(pointer); - pointer += (unsigned long)src->addr; - pointer = cpu_to_le64(pointer); - memcpy((char *)dest->addr + offset, &pointer, entry->pointer.size); - - return 0; -} - -/* - * This function updates checksum fields of ACPI tables previously loaded - * by bios_linker_allocate() - * - * @entry : BIOS linker command entry which tells where to update ACPI table - * checksums - * @return: 0 on success, or negative value on failure - */ -static int bios_linker_add_checksum(struct bios_linker_entry *entry) -{ - struct fw_file *file; - uint8_t *data, cksum = 0; - uint8_t *cksum_start; - - file = qemu_fwcfg_find_file(entry->cksum.file); - if (!file || !file->addr) - return -ENOENT; - - data = (uint8_t *)(file->addr + le32_to_cpu(entry->cksum.offset)); - cksum_start = (uint8_t *)(file->addr + le32_to_cpu(entry->cksum.start)); - cksum = table_compute_checksum(cksum_start, - le32_to_cpu(entry->cksum.length)); - *data = cksum; - - return 0; -}
unsigned install_e820_map(unsigned max_entries, struct e820entry *entries) { @@ -173,80 +41,3 @@ unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
return 6; } - -/* This function loads and patches ACPI tables provided by QEMU */ -u32 write_acpi_tables(u32 addr) -{ - int i, ret = 0; - struct fw_file *file; - struct bios_linker_entry *table_loader; - struct bios_linker_entry *entry; - uint32_t size; - - /* make sure fw_list is loaded */ - ret = qemu_fwcfg_read_firmware_list(); - if (ret) { - printf("error: can't read firmware file list\n"); - return addr; - } - - file = qemu_fwcfg_find_file("etc/table-loader"); - if (!file) { - printf("error: can't find etc/table-loader\n"); - return addr; - } - - size = be32_to_cpu(file->cfg.size); - if ((size % sizeof(*entry)) != 0) { - printf("error: table-loader maybe corrupted\n"); - return addr; - } - - table_loader = malloc(size); - if (!table_loader) { - printf("error: no memory for table-loader\n"); - return addr; - } - - qemu_fwcfg_read_entry(be16_to_cpu(file->cfg.select), - size, table_loader); - - for (i = 0; i < (size / sizeof(*entry)); i++) { - entry = table_loader + i; - switch (le32_to_cpu(entry->command)) { - case BIOS_LINKER_LOADER_COMMAND_ALLOCATE: - ret = bios_linker_allocate(entry, &addr); - if (ret) - goto out; - break; - case BIOS_LINKER_LOADER_COMMAND_ADD_POINTER: - ret = bios_linker_add_pointer(entry); - if (ret) - goto out; - break; - case BIOS_LINKER_LOADER_COMMAND_ADD_CHECKSUM: - ret = bios_linker_add_checksum(entry); - if (ret) - goto out; - break; - default: - break; - } - } - -out: - if (ret) { - struct fw_cfg_file_iter iter; - for (file = qemu_fwcfg_file_iter_init(&iter); - !qemu_fwcfg_file_iter_end(&iter); - file = qemu_fwcfg_file_iter_next(&iter)) { - if (file->addr) { - free((void *)file->addr); - file->addr = 0; - } - } - } - - free(table_loader); - return addr; -} diff --git a/drivers/misc/qfw.c b/drivers/misc/qfw.c index 59d9376..d43d1d3 100644 --- a/drivers/misc/qfw.c +++ b/drivers/misc/qfw.c @@ -10,6 +10,9 @@ #include <malloc.h> #include <qfw.h> #include <asm/io.h> +#ifdef CONFIG_GENERATE_ACPI_TABLE +#include <asm/tables.h> +#endif #include <linux/list.h>
static bool fwcfg_present; @@ -18,6 +21,209 @@ static struct fw_cfg_arch_ops *fwcfg_arch_ops;
static LIST_HEAD(fw_list);
+#ifdef CONFIG_GENERATE_ACPI_TABLE +/* + * This function allocates memory for ACPI tables + * + * @entry : BIOS linker command entry which tells where to allocate memory + * (either high memory or low memory) + * @addr : The address that should be used for low memory allcation. If the + * memory allocation request is 'ZONE_HIGH' then this parameter will + * be ignored. + * @return: 0 on success, or negative value on failure + */ +static int bios_linker_allocate(struct bios_linker_entry *entry, u32 *addr) +{ + uint32_t size, align; + struct fw_file *file; + unsigned long aligned_addr; + + align = le32_to_cpu(entry->alloc.align); + /* align must be power of 2 */ + if (align & (align - 1)) { + printf("error: wrong alignment %u\n", align); + return -EINVAL; + } + + file = qemu_fwcfg_find_file(entry->alloc.file); + if (!file) { + printf("error: can't find file %s\n", entry->alloc.file); + return -ENOENT; + } + + size = be32_to_cpu(file->cfg.size); + + /* + * ZONE_HIGH means we need to allocate from high memory, since + * malloc space is already at the end of RAM, so we directly use it. + * If allocation zone is ZONE_FSEG, then we use the 'addr' passed + * in which is low memory + */ + if (entry->alloc.zone == BIOS_LINKER_LOADER_ALLOC_ZONE_HIGH) { + aligned_addr = (unsigned long)memalign(align, size); + if (!aligned_addr) { + printf("error: allocating resource\n"); + return -ENOMEM; + } + } else if (entry->alloc.zone == BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG) { + aligned_addr = ALIGN(*addr, align); + } else { + printf("error: invalid allocation zone\n"); + return -EINVAL; + } + + debug("bios_linker_allocate: allocate file %s, size %u, zone %d, align %u, addr 0x%lx\n", + file->cfg.name, size, entry->alloc.zone, align, aligned_addr); + + qemu_fwcfg_read_entry(be16_to_cpu(file->cfg.select), + size, (void *)aligned_addr); + file->addr = aligned_addr; + + /* adjust address for low memory allocation */ + if (entry->alloc.zone == BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG) + *addr = (aligned_addr + size); + + return 0; +} + +/* + * This function patches ACPI tables previously loaded + * by bios_linker_allocate() + * + * @entry : BIOS linker command entry which tells how to patch + * ACPI tables + * @return: 0 on success, or negative value on failure + */ +static int bios_linker_add_pointer(struct bios_linker_entry *entry) +{ + struct fw_file *dest, *src; + uint32_t offset = le32_to_cpu(entry->pointer.offset); + uint64_t pointer = 0; + + dest = qemu_fwcfg_find_file(entry->pointer.dest_file); + if (!dest || !dest->addr) + return -ENOENT; + src = qemu_fwcfg_find_file(entry->pointer.src_file); + if (!src || !src->addr) + return -ENOENT; + + debug("bios_linker_add_pointer: dest->addr 0x%lx, src->addr 0x%lx, offset 0x%x size %u, 0x%llx\n", + dest->addr, src->addr, offset, entry->pointer.size, pointer); + + memcpy(&pointer, (char *)dest->addr + offset, entry->pointer.size); + pointer = le64_to_cpu(pointer); + pointer += (unsigned long)src->addr; + pointer = cpu_to_le64(pointer); + memcpy((char *)dest->addr + offset, &pointer, entry->pointer.size); + + return 0; +} + +/* + * This function updates checksum fields of ACPI tables previously loaded + * by bios_linker_allocate() + * + * @entry : BIOS linker command entry which tells where to update ACPI table + * checksums + * @return: 0 on success, or negative value on failure + */ +static int bios_linker_add_checksum(struct bios_linker_entry *entry) +{ + struct fw_file *file; + uint8_t *data, cksum = 0; + uint8_t *cksum_start; + + file = qemu_fwcfg_find_file(entry->cksum.file); + if (!file || !file->addr) + return -ENOENT; + + data = (uint8_t *)(file->addr + le32_to_cpu(entry->cksum.offset)); + cksum_start = (uint8_t *)(file->addr + le32_to_cpu(entry->cksum.start)); + cksum = table_compute_checksum(cksum_start, + le32_to_cpu(entry->cksum.length)); + *data = cksum; + + return 0; +} + +/* This function loads and patches ACPI tables provided by QEMU */ +u32 write_acpi_tables(u32 addr) +{ + int i, ret = 0; + struct fw_file *file; + struct bios_linker_entry *table_loader; + struct bios_linker_entry *entry; + uint32_t size; + + /* make sure fw_list is loaded */ + ret = qemu_fwcfg_read_firmware_list(); + if (ret) { + printf("error: can't read firmware file list\n"); + return addr; + } + + file = qemu_fwcfg_find_file("etc/table-loader"); + if (!file) { + printf("error: can't find etc/table-loader\n"); + return addr; + } + + size = be32_to_cpu(file->cfg.size); + if ((size % sizeof(*entry)) != 0) { + printf("error: table-loader maybe corrupted\n"); + return addr; + } + + table_loader = malloc(size); + if (!table_loader) { + printf("error: no memory for table-loader\n"); + return addr; + } + + qemu_fwcfg_read_entry(be16_to_cpu(file->cfg.select), + size, table_loader); + + for (i = 0; i < (size / sizeof(*entry)); i++) { + entry = table_loader + i; + switch (le32_to_cpu(entry->command)) { + case BIOS_LINKER_LOADER_COMMAND_ALLOCATE: + ret = bios_linker_allocate(entry, &addr); + if (ret) + goto out; + break; + case BIOS_LINKER_LOADER_COMMAND_ADD_POINTER: + ret = bios_linker_add_pointer(entry); + if (ret) + goto out; + break; + case BIOS_LINKER_LOADER_COMMAND_ADD_CHECKSUM: + ret = bios_linker_add_checksum(entry); + if (ret) + goto out; + break; + default: + break; + } + } + +out: + if (ret) { + struct fw_cfg_file_iter iter; + for (file = qemu_fwcfg_file_iter_init(&iter); + !qemu_fwcfg_file_iter_end(&iter); + file = qemu_fwcfg_file_iter_next(&iter)) { + if (file->addr) { + free((void *)file->addr); + file->addr = 0; + } + } + } + + free(table_loader); + return addr; +} +#endif + /* Read configuration item using fw_cfg PIO interface */ static void qemu_fwcfg_read_entry_pio(uint16_t entry, uint32_t size, void *address)

On Wed, May 18, 2016 at 5:39 PM, Miao Yan yanmiaobest@gmail.com wrote:
Loading ACPI table from QEMU's fw_cfg interface is not x86 specific (ARM64 may also make use of it). So move the code to common place.
Signed-off-by: Miao Yan yanmiaobest@gmail.com Reviewed-by: Bin Meng bmeng.cn@gmail.com
arch/x86/cpu/qemu/acpi_table.c | 209 ----------------------------------------- drivers/misc/qfw.c | 206 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 206 insertions(+), 209 deletions(-)
Reviewed-by: Bin Meng bmeng.cn@gmail.com

Rename qemu/acpi_table.c to qemu/e820.c, because ACPI stuff is moved to qfw core, this file only contains code for installing e820 table.
Signed-off-by: Miao Yan yanmiaobest@gmail.com --- arch/x86/cpu/qemu/Makefile | 3 +-- arch/x86/cpu/qemu/{acpi_table.c => e820.c} | 0 2 files changed, 1 insertion(+), 2 deletions(-) rename arch/x86/cpu/qemu/{acpi_table.c => e820.c} (100%)
diff --git a/arch/x86/cpu/qemu/Makefile b/arch/x86/cpu/qemu/Makefile index 7c08c3d..a080c5e 100644 --- a/arch/x86/cpu/qemu/Makefile +++ b/arch/x86/cpu/qemu/Makefile @@ -8,5 +8,4 @@ ifndef CONFIG_EFI_STUB obj-y += car.o dram.o endif obj-y += qemu.o -obj-$(CONFIG_QFW) += cpu.o -obj-$(CONFIG_GENERATE_ACPI_TABLE) += acpi_table.o +obj-$(CONFIG_QFW) += cpu.o e820.o diff --git a/arch/x86/cpu/qemu/acpi_table.c b/arch/x86/cpu/qemu/e820.c similarity index 100% rename from arch/x86/cpu/qemu/acpi_table.c rename to arch/x86/cpu/qemu/e820.c

On Wed, May 18, 2016 at 5:39 PM, Miao Yan yanmiaobest@gmail.com wrote:
Rename qemu/acpi_table.c to qemu/e820.c, because ACPI stuff is moved to qfw core, this file only contains code for installing e820 table.
Signed-off-by: Miao Yan yanmiaobest@gmail.com
arch/x86/cpu/qemu/Makefile | 3 +-- arch/x86/cpu/qemu/{acpi_table.c => e820.c} | 0 2 files changed, 1 insertion(+), 2 deletions(-) rename arch/x86/cpu/qemu/{acpi_table.c => e820.c} (100%)
Reviewed-by: Bin Meng bmeng.cn@gmail.com

Align macro names with the rest of qfw code
Signed-off-by: Miao Yan yanmiaobest@gmai.com --- cmd/Kconfig | 2 +- cmd/Makefile | 2 +- configs/qemu-x86_defconfig | 2 +- drivers/misc/Kconfig | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/cmd/Kconfig b/cmd/Kconfig index 01870cb..d51645c 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -593,7 +593,7 @@ config CMD_SOUND sound init - set up sound system sound play - play a sound
-config CMD_QEMU_FW_CFG +config CMD_QFW bool "qfw" select QFW help diff --git a/cmd/Makefile b/cmd/Makefile index 0b7f7a2..1bbd14f 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -105,7 +105,7 @@ endif obj-y += pcmcia.o obj-$(CONFIG_CMD_PORTIO) += portio.o obj-$(CONFIG_CMD_PXE) += pxe.o -obj-$(CONFIG_CMD_QEMU_FW_CFG) += qfw.o +obj-$(CONFIG_CMD_QFW) += qfw.o obj-$(CONFIG_CMD_READ) += read.o obj-$(CONFIG_CMD_REGINFO) += reginfo.o obj-$(CONFIG_CMD_REISER) += reiser.o diff --git a/configs/qemu-x86_defconfig b/configs/qemu-x86_defconfig index a813e5b..45bb3ec 100644 --- a/configs/qemu-x86_defconfig +++ b/configs/qemu-x86_defconfig @@ -20,7 +20,7 @@ CONFIG_CMD_DHCP=y # CONFIG_CMD_NFS is not set CONFIG_CMD_PING=y CONFIG_CMD_TIME=y -CONFIG_CMD_QEMU_FW_CFG=y +CONFIG_CMD_QFW=y CONFIG_CMD_BOOTSTAGE=y CONFIG_CMD_EXT2=y CONFIG_CMD_EXT4=y diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index fa53700..c40f6b5 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -142,6 +142,6 @@ config QFW bool help Hidden option to enable QEMU fw_cfg interface. This will be selected by - either CONFIG_CMD_QEMU_FW_CFG or CONFIG_GENERATE_ACPI_TABLE. + either CONFIG_CMD_QFW or CONFIG_GENERATE_ACPI_TABLE.
endmenu

Hi Miao,
the title should say: CMD_QEMU_FW_CFG
I can fix this when applying.
On Wed, May 18, 2016 at 5:39 PM, Miao Yan yanmiaobest@gmail.com wrote:
Align macro names with the rest of qfw code
and I believe it's better to squash this commit into patch#8 in this series, as they both rename QEMU_FW_CFG to QFW.
Signed-off-by: Miao Yan yanmiaobest@gmai.com
cmd/Kconfig | 2 +- cmd/Makefile | 2 +- configs/qemu-x86_defconfig | 2 +- drivers/misc/Kconfig | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-)
Reviewed-by: Bin Meng bmeng.cn@gmail.com
[snip]
Regards, Bin

Hi Bin,
2016-05-19 17:08 GMT+08:00 Bin Meng bmeng.cn@gmail.com:
Hi Miao,
the title should say: CMD_QEMU_FW_CFG
I can fix this when applying.
On Wed, May 18, 2016 at 5:39 PM, Miao Yan yanmiaobest@gmail.com wrote:
Align macro names with the rest of qfw code
and I believe it's better to squash this commit into patch#8 in this series, as they both rename QEMU_FW_CFG to QFW.
Thanks. Do I need a v3 ?
Thanks, Miao
Signed-off-by: Miao Yan yanmiaobest@gmai.com
cmd/Kconfig | 2 +- cmd/Makefile | 2 +- configs/qemu-x86_defconfig | 2 +- drivers/misc/Kconfig | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-)
Reviewed-by: Bin Meng bmeng.cn@gmail.com
[snip]
Regards, Bin

Hi Miao,
On Fri, May 20, 2016 at 10:07 AM, Miao Yan yanmiaobest@gmail.com wrote:
Hi Bin,
2016-05-19 17:08 GMT+08:00 Bin Meng bmeng.cn@gmail.com:
Hi Miao,
the title should say: CMD_QEMU_FW_CFG
I can fix this when applying.
On Wed, May 18, 2016 at 5:39 PM, Miao Yan yanmiaobest@gmail.com wrote:
Align macro names with the rest of qfw code
and I believe it's better to squash this commit into patch#8 in this series, as they both rename QEMU_FW_CFG to QFW.
Thanks. Do I need a v3 ?
If you have time, let's do a v3 which saves my time. Sorry :(
Regards, Bin

2016-05-20 10:30 GMT+08:00 Bin Meng bmeng.cn@gmail.com:
Hi Miao,
On Fri, May 20, 2016 at 10:07 AM, Miao Yan yanmiaobest@gmail.com wrote:
Hi Bin,
2016-05-19 17:08 GMT+08:00 Bin Meng bmeng.cn@gmail.com:
Hi Miao,
the title should say: CMD_QEMU_FW_CFG
I can fix this when applying.
On Wed, May 18, 2016 at 5:39 PM, Miao Yan yanmiaobest@gmail.com wrote:
Align macro names with the rest of qfw code
and I believe it's better to squash this commit into patch#8 in this series, as they both rename QEMU_FW_CFG to QFW.
Thanks. Do I need a v3 ?
If you have time, let's do a v3 which saves my time. Sorry :(
OK, no problem.
Miao
Regards, Bin

This patch enables qfw and cmd_qfw on sandbox for build coverage test
Signed-off-by: Miao Yan yanmiaobest@gmail.com --- configs/sandbox_defconfig | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index afdf4a3..f19308d 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -167,3 +167,5 @@ CONFIG_UNIT_TEST=y CONFIG_UT_TIME=y CONFIG_UT_DM=y CONFIG_UT_ENV=y +CONFIG_QFW=y +CONFIG_CMD_QFW=y

Hi Miao,
On Wed, May 18, 2016 at 5:40 PM, Miao Yan yanmiaobest@gmail.com wrote:
This patch enables qfw and cmd_qfw on sandbox for build coverage test
Signed-off-by: Miao Yan yanmiaobest@gmail.com
configs/sandbox_defconfig | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index afdf4a3..f19308d 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -167,3 +167,5 @@ CONFIG_UNIT_TEST=y CONFIG_UT_TIME=y CONFIG_UT_DM=y CONFIG_UT_ENV=y +CONFIG_QFW=y
+CONFIG_CMD_QFW=y
Please do a 'make savedefconfig' and check the Kconfig options.
Regards, Bin

Hi Bin,
2016-05-19 17:08 GMT+08:00 Bin Meng bmeng.cn@gmail.com:
Hi Miao,
On Wed, May 18, 2016 at 5:40 PM, Miao Yan yanmiaobest@gmail.com wrote:
This patch enables qfw and cmd_qfw on sandbox for build coverage test
Signed-off-by: Miao Yan yanmiaobest@gmail.com
configs/sandbox_defconfig | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index afdf4a3..f19308d 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -167,3 +167,5 @@ CONFIG_UNIT_TEST=y CONFIG_UT_TIME=y CONFIG_UT_DM=y CONFIG_UT_ENV=y +CONFIG_QFW=y
+CONFIG_CMD_QFW=y
Please do a 'make savedefconfig' and check the Kconfig options.
I did a 'make savedefconfig' and there was a file generated 'defconfig' but with zero content. So what am I supposed to check ? Did you find something wrong with this one ?
Thanks, Miao
Regards, Bin

Hi Miao,
On Fri, May 20, 2016 at 10:06 AM, Miao Yan yanmiaobest@gmail.com wrote:
Hi Bin,
2016-05-19 17:08 GMT+08:00 Bin Meng bmeng.cn@gmail.com:
Hi Miao,
On Wed, May 18, 2016 at 5:40 PM, Miao Yan yanmiaobest@gmail.com wrote:
This patch enables qfw and cmd_qfw on sandbox for build coverage test
Signed-off-by: Miao Yan yanmiaobest@gmail.com
configs/sandbox_defconfig | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index afdf4a3..f19308d 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -167,3 +167,5 @@ CONFIG_UNIT_TEST=y CONFIG_UT_TIME=y CONFIG_UT_DM=y CONFIG_UT_ENV=y +CONFIG_QFW=y
+CONFIG_CMD_QFW=y
Please do a 'make savedefconfig' and check the Kconfig options.
I did a 'make savedefconfig' and there was a file generated 'defconfig' but with zero content. So what am I supposed to check ? Did you find something wrong with this one ?
We need make sure the option order is correct in a defconfig file.
We can do it like this:
$ make sandbox_defconfig $ make savedefconfig
Then check the difference between our updated sandbox_defconfig and defconfig files.
Regards, Bin

Hi Bin,
2016-05-20 10:29 GMT+08:00 Bin Meng bmeng.cn@gmail.com:
Hi Miao,
On Fri, May 20, 2016 at 10:06 AM, Miao Yan yanmiaobest@gmail.com wrote:
Hi Bin,
2016-05-19 17:08 GMT+08:00 Bin Meng bmeng.cn@gmail.com:
Hi Miao,
On Wed, May 18, 2016 at 5:40 PM, Miao Yan yanmiaobest@gmail.com wrote:
This patch enables qfw and cmd_qfw on sandbox for build coverage test
Signed-off-by: Miao Yan yanmiaobest@gmail.com
configs/sandbox_defconfig | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index afdf4a3..f19308d 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -167,3 +167,5 @@ CONFIG_UNIT_TEST=y CONFIG_UT_TIME=y CONFIG_UT_DM=y CONFIG_UT_ENV=y +CONFIG_QFW=y
+CONFIG_CMD_QFW=y
Please do a 'make savedefconfig' and check the Kconfig options.
I did a 'make savedefconfig' and there was a file generated 'defconfig' but with zero content. So what am I supposed to check ? Did you find something wrong with this one ?
We need make sure the option order is correct in a defconfig file.
Can you elaborate on this, what're the rules to add new config in sandbox_defconfig ? Is is based on the order in kconfig file ?
We can do it like this:
$ make sandbox_defconfig $ make savedefconfig
Then check the difference between our updated sandbox_defconfig and defconfig files.
And they are supposed to be identical ?
Thanks, Miao
Regards, Bin

Hi Miao,
On Fri, May 20, 2016 at 2:58 PM, Miao Yan yanmiaobest@gmail.com wrote:
Hi Bin,
2016-05-20 10:29 GMT+08:00 Bin Meng bmeng.cn@gmail.com:
Hi Miao,
On Fri, May 20, 2016 at 10:06 AM, Miao Yan yanmiaobest@gmail.com wrote:
Hi Bin,
2016-05-19 17:08 GMT+08:00 Bin Meng bmeng.cn@gmail.com:
Hi Miao,
On Wed, May 18, 2016 at 5:40 PM, Miao Yan yanmiaobest@gmail.com wrote:
This patch enables qfw and cmd_qfw on sandbox for build coverage test
Signed-off-by: Miao Yan yanmiaobest@gmail.com
configs/sandbox_defconfig | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index afdf4a3..f19308d 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -167,3 +167,5 @@ CONFIG_UNIT_TEST=y CONFIG_UT_TIME=y CONFIG_UT_DM=y CONFIG_UT_ENV=y +CONFIG_QFW=y
+CONFIG_CMD_QFW=y
Please do a 'make savedefconfig' and check the Kconfig options.
I did a 'make savedefconfig' and there was a file generated 'defconfig' but with zero content. So what am I supposed to check ? Did you find something wrong with this one ?
We need make sure the option order is correct in a defconfig file.
Can you elaborate on this, what're the rules to add new config in sandbox_defconfig ? Is is based on the order in kconfig file ?
Yes, we should add new config in defconfig files according to their order in Kconfig files.
We can do it like this:
$ make sandbox_defconfig $ make savedefconfig
Then check the difference between our updated sandbox_defconfig and defconfig files.
And they are supposed to be identical ?
The one generated by 'make savedefconfig' is supposed to have the correct order, and without any redundant options.
Regards, Bin
participants (2)
-
Bin Meng
-
Miao Yan