From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6C993C38142 for ; Sat, 28 Jan 2023 22:02:53 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 0545785778; Sat, 28 Jan 2023 23:01:58 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="Kg3UsnSV"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 1A0FE8574F; Sat, 28 Jan 2023 23:01:33 +0100 (CET) Received: from mail-il1-x130.google.com (mail-il1-x130.google.com [IPv6:2607:f8b0:4864:20::130]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id AC71C8575F for ; Sat, 28 Jan 2023 23:01:23 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-il1-x130.google.com with SMTP id g16so3764576ilr.1 for ; Sat, 28 Jan 2023 14:01:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lBkGnCrWMPUa1mxO3iWpLpjkDldyA2oJLq5TPXy+zio=; b=Kg3UsnSViETXfslbRBqAbfZWELKz20LVV5ghWCwjytD3curru7oJnYvKHKN9Gpp9Dt gSz6bhYWeCMo0ICZqOVQwzFkjnEpwRBQLCHgARmDKhyJgLAc+mUTlxlFszyotL+ct5eo DPQflTj6SBYsigSnPWMNHrbDSnvsW92u5hJMw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lBkGnCrWMPUa1mxO3iWpLpjkDldyA2oJLq5TPXy+zio=; b=aX9lLjulcdrUXc4RXQ0RzIhXzvIUWMeL7QaskQ0lJ9dSRAWQcLzMxj67MLJUypqJz1 R7CQ7oH7iFxCefNmAywAfU21e02Gi3OhwPawNr/IwaB5i/Lwje4QACKLv66Obwr0/NWv M2XctGoSVNHoGUf5Ibt4IzmZTVtjRLV3wPJntSV6eEmILe4G3ZaJZ4zs+NQBl2mOZ+CJ Nag2NolDNXEtmOWq2sshHMaXOm6Eb0Nt0By+WPvC2+e/HEAyB/yNwxtSV81qahu/dFOw 8llxkz/PPhJmekHKR3dzcuXHV4wOVUvdpfqtSPBMrLttiB6OWGiqccGNVWYBFF97fDhJ s1EA== X-Gm-Message-State: AO0yUKUXmsn8ZzL/ILFv4U5JFFkuLRQ7WoNIscO9HOmqU10BXn3ivsG9 igHgu8AUvZpuu8tkIQ71VorKrgE4nhiPRfFZ X-Google-Smtp-Source: AK7set9h8sWxYIlbPSHhmZ5E98SpMZLst/Dor/ebjGS4RxwBEcfFFKoP7kMaAW5cKVieDkb/vn7Tww== X-Received: by 2002:a05:6e02:20c8:b0:310:baa0:4b14 with SMTP id 8-20020a056e0220c800b00310baa04b14mr7211707ilq.30.1674943272884; Sat, 28 Jan 2023 14:01:12 -0800 (PST) Received: from sjg1.roam.corp.google.com (c-73-14-173-85.hsd1.co.comcast.net. [73.14.173.85]) by smtp.gmail.com with ESMTPSA id f15-20020a056e0212af00b0030f1be2e051sm2525521ilr.39.2023.01.28.14.01.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 28 Jan 2023 14:01:12 -0800 (PST) From: Simon Glass To: U-Boot Mailing List Cc: Tom Rini , Albert Aribaud , Ilias Apalodimas , Simon Glass , Andre Przywara , =?UTF-8?q?Pierre-Cl=C3=A9ment=20Tosi?= Subject: [PATCH 08/13] qemu: Move qfw kernel setup into a common file Date: Sat, 28 Jan 2023 15:00:23 -0700 Message-Id: <20230128220028.53575-9-sjg@chromium.org> X-Mailer: git-send-email 2.39.1.456.gfc5497dd1b-goog In-Reply-To: <20230128220028.53575-1-sjg@chromium.org> References: <20230128220028.53575-1-sjg@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean This is currently in the cmd/ file but we want to call it from a driver. Move it into a common place. Tidy up the header-file order while we are here. Signed-off-by: Simon Glass --- cmd/qfw.c | 69 +-------------------------------------------------- common/qfw.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++- include/qfw.h | 13 ++++++++++ 3 files changed, 79 insertions(+), 69 deletions(-) diff --git a/cmd/qfw.c b/cmd/qfw.c index 8837911d99f..ae3c6a7a84e 100644 --- a/cmd/qfw.c +++ b/cmd/qfw.c @@ -7,78 +7,11 @@ #include #include #include -#include #include #include static struct udevice *qfw_dev; -/* - * This function prepares kernel for zboot. It loads kernel data - * to 'load_addr', initrd to 'initrd_addr' and kernel command - * line using qemu fw_cfg interface. - */ -int qemu_fwcfg_cmd_setup_kernel(ulong load_addr, ulong initrd_addr) -{ - char *data_addr; - uint32_t setup_size, kernel_size, cmdline_size, initrd_size; - - qfw_read_entry(qfw_dev, FW_CFG_SETUP_SIZE, 4, &setup_size); - qfw_read_entry(qfw_dev, FW_CFG_KERNEL_SIZE, 4, &kernel_size); - - if (!kernel_size) { - printf("fatal: no kernel available\n"); - return -ENOENT; - } - - data_addr = map_sysmem(load_addr, 0); - if (setup_size) { - qfw_read_entry(qfw_dev, FW_CFG_SETUP_DATA, - le32_to_cpu(setup_size), data_addr); - data_addr += le32_to_cpu(setup_size); - } - - qfw_read_entry(qfw_dev, FW_CFG_KERNEL_DATA, - le32_to_cpu(kernel_size), data_addr); - data_addr += le32_to_cpu(kernel_size); - env_set_hex("filesize", le32_to_cpu(kernel_size)); - - data_addr = map_sysmem(initrd_addr, 0); - qfw_read_entry(qfw_dev, FW_CFG_INITRD_SIZE, 4, &initrd_size); - if (!initrd_size) { - printf("warning: no initrd available\n"); - } else { - qfw_read_entry(qfw_dev, FW_CFG_INITRD_DATA, - le32_to_cpu(initrd_size), data_addr); - data_addr += le32_to_cpu(initrd_size); - env_set_hex("filesize", le32_to_cpu(initrd_size)); - } - - qfw_read_entry(qfw_dev, FW_CFG_CMDLINE_SIZE, 4, &cmdline_size); - if (cmdline_size) { - qfw_read_entry(qfw_dev, FW_CFG_CMDLINE_DATA, - le32_to_cpu(cmdline_size), data_addr); - /* - * if kernel cmdline only contains '\0', (e.g. no -append - * when invoking qemu), do not update bootargs - */ - if (*data_addr) { - if (env_set("bootargs", data_addr) < 0) - printf("warning: unable to change bootargs\n"); - } - } - - printf("loading kernel to address %lx size %x", load_addr, - le32_to_cpu(kernel_size)); - if (initrd_size) - printf(" initrd %lx size %x\n", initrd_addr, - le32_to_cpu(initrd_size)); - else - printf("\n"); - - return 0; -} - static int qemu_fwcfg_cmd_list_firmware(void) { int ret; @@ -148,7 +81,7 @@ static int qemu_fwcfg_do_load(struct cmd_tbl *cmdtp, int flag, return CMD_RET_FAILURE; } - return qemu_fwcfg_cmd_setup_kernel(load_addr, initrd_addr); + return qemu_fwcfg_setup_kernel(qfw_dev, load_addr, initrd_addr); } static struct cmd_tbl fwcfg_commands[] = { diff --git a/common/qfw.c b/common/qfw.c index 90cbb8c5dd4..45e87d3ae28 100644 --- a/common/qfw.c +++ b/common/qfw.c @@ -5,9 +5,11 @@ */ #include -#include +#include +#include #include #include +#include int qfw_get_dev(struct udevice **devp) { @@ -102,3 +104,65 @@ bool qfw_file_iter_end(struct fw_cfg_file_iter *iter) { return iter->entry == iter->end; } + +int qemu_fwcfg_setup_kernel(struct udevice *qfw_dev, ulong load_addr, + ulong initrd_addr) +{ + char *data_addr; + u32 setup_size, kernel_size, cmdline_size, initrd_size; + + qfw_read_entry(qfw_dev, FW_CFG_SETUP_SIZE, 4, &setup_size); + qfw_read_entry(qfw_dev, FW_CFG_KERNEL_SIZE, 4, &kernel_size); + + if (!kernel_size) { + printf("fatal: no kernel available\n"); + return -ENOENT; + } + + data_addr = map_sysmem(load_addr, 0); + if (setup_size) { + qfw_read_entry(qfw_dev, FW_CFG_SETUP_DATA, + le32_to_cpu(setup_size), data_addr); + data_addr += le32_to_cpu(setup_size); + } + + qfw_read_entry(qfw_dev, FW_CFG_KERNEL_DATA, + le32_to_cpu(kernel_size), data_addr); + data_addr += le32_to_cpu(kernel_size); + env_set_hex("filesize", le32_to_cpu(kernel_size)); + + data_addr = map_sysmem(initrd_addr, 0); + qfw_read_entry(qfw_dev, FW_CFG_INITRD_SIZE, 4, &initrd_size); + if (!initrd_size) { + printf("warning: no initrd available\n"); + } else { + qfw_read_entry(qfw_dev, FW_CFG_INITRD_DATA, + le32_to_cpu(initrd_size), data_addr); + data_addr += le32_to_cpu(initrd_size); + env_set_hex("filesize", le32_to_cpu(initrd_size)); + } + + qfw_read_entry(qfw_dev, FW_CFG_CMDLINE_SIZE, 4, &cmdline_size); + if (cmdline_size) { + qfw_read_entry(qfw_dev, FW_CFG_CMDLINE_DATA, + le32_to_cpu(cmdline_size), data_addr); + /* + * if kernel cmdline only contains '\0', (e.g. no -append + * when invoking qemu), do not update bootargs + */ + if (*data_addr) { + if (env_set("bootargs", data_addr) < 0) + printf("warning: unable to change bootargs\n"); + } + } + + printf("loading kernel to address %lx size %x", load_addr, + le32_to_cpu(kernel_size)); + if (initrd_size) + printf(" initrd %lx size %x\n", initrd_addr, + le32_to_cpu(initrd_size)); + else + printf("\n"); + + return 0; +} diff --git a/include/qfw.h b/include/qfw.h index 7ca132e66a2..42798fea7db 100644 --- a/include/qfw.h +++ b/include/qfw.h @@ -316,4 +316,17 @@ bool qfw_file_iter_end(struct fw_cfg_file_iter *iter); */ int qemu_cpu_fixup(void); +/* + * qemu_fwcfg_setup_kernel() - Prepare the kernel for zboot + * + * Loads kernel data to 'load_addr', initrd to 'initrd_addr' and kernel command + * line using qemu fw_cfg interface + * + * @load_addr: Load address for kernel + * @initrd_addr: Load address for ramdisk + * @return 0 if OK, -ENOENT if no kernel + */ +int qemu_fwcfg_setup_kernel(struct udevice *qfw_dev, ulong load_addr, + ulong initrd_addr); + #endif -- 2.39.1.456.gfc5497dd1b-goog