From patchwork Tue Mar 10 21:31:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Niek Linnenbank X-Patchwork-Id: 1252449 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=J0FlkszR; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48cT6Q3cPYz9sPR for ; Wed, 11 Mar 2020 08:40:46 +1100 (AEDT) Received: from localhost ([::1]:40844 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jBmcG-0005sT-EI for incoming@patchwork.ozlabs.org; Tue, 10 Mar 2020 17:40:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53358) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jBmUB-0000jo-Gx for qemu-devel@nongnu.org; Tue, 10 Mar 2020 17:32:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jBmU9-0008Gq-Sk for qemu-devel@nongnu.org; Tue, 10 Mar 2020 17:32:23 -0400 Received: from mail-wr1-x441.google.com ([2a00:1450:4864:20::441]:36208) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jBmU9-0008Ex-LK; Tue, 10 Mar 2020 17:32:21 -0400 Received: by mail-wr1-x441.google.com with SMTP id s5so13871132wrg.3; Tue, 10 Mar 2020 14:32:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=KeVWgG0tQOdDh3sW6tFRRQGle6mis16f8XBbusoV4Zo=; b=J0FlkszRBqG4Mi7AM0T0DXUxaa6JqVLMAvgdSHOYPFdyaFue0H296OMmcvagtHYs5E 6MJXhfCIzeqOhAf+IcG3ppIEJZWmMEWdjUr1kakj1illr4XBzoOTBzMGUK7bglpc1HPy YCt+7RT+b+fc7ZCNRaeuHqvl643tsVTz86pCPhsZtftOXkUv5QXrfJXP6MuDjBZooxNe Yt/c3/29psLZOHnzTSh8DxLvIbR1jVIs1vlh0MgCw25srPy2HGty3LTwbtriCD1YYyvb ETe6pBBAoHLskIrkIFcf4xp5YHdOtxH6VCLYjel0QVXXkiV+kuCaOfuDjcWp5WThDV70 t4Wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=KeVWgG0tQOdDh3sW6tFRRQGle6mis16f8XBbusoV4Zo=; b=PP9d6KUg4MChAu3CZprHzrL0js2I2AUg4Wd0VqtNO2H/BqHS39RTATdxc/PPn03Tta +MVsNpb0v1WeVLwmTZXFLwHqvNa9W8XjtFjvvOBoWhKAV99a9ueU7snmGElB9ZK/g0g/ GosLpWjSU+5DkkP3Gg/Eeq6WvD6Mlx1oRluS8jMPQnoymaFM+w1m0RUyAKcU26FC9KvN dEi5tAKkjZSGrc5o1O0TNiPUIrSSaxBlaLbg75HhRSkaRAyyVmTStYCPe9XXwnJn+Kjd zdo+B2NAkxS1Pw396D1N6smmOj2DqMtT0LKhl6AhzOni0uzfjeGtQE0oeyuUYkzMKNXc zuCQ== X-Gm-Message-State: ANhLgQ3to0LClskX2wDIUuAjPCNMJsNEmcphD7BWX2PEp7hJjM9fqkpC NlVRBJTnlALYYB3ifR5cZATr8B4O X-Google-Smtp-Source: ADFU+vuxMCRRA2eEHeDV86z9zH9ilJcQiYikHNesEwPucmHY6h6eu2BbNV2c3aHL7tCEWtOkKNchJg== X-Received: by 2002:adf:ed09:: with SMTP id a9mr13275215wro.307.1583875940220; Tue, 10 Mar 2020 14:32:20 -0700 (PDT) Received: from pavilion.home ([2a02:a456:6be8:1:8edc:d4ff:fe8b:18b7]) by smtp.gmail.com with ESMTPSA id 2sm32803580wrf.79.2020.03.10.14.32.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2020 14:32:19 -0700 (PDT) From: Niek Linnenbank To: qemu-devel@nongnu.org Subject: [PATCH v7 10/18] hw/arm/allwinner-h3: add Boot ROM support Date: Tue, 10 Mar 2020 22:31:55 +0100 Message-Id: <20200310213203.18730-11-nieklinnenbank@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200310213203.18730-1-nieklinnenbank@gmail.com> References: <20200310213203.18730-1-nieklinnenbank@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::441 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, alex.bennee@linaro.org, jasowang@redhat.com, b.galvani@gmail.com, Niek Linnenbank , qemu-arm@nongnu.org, imammedo@redhat.com, philmd@redhat.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" A real Allwinner H3 SoC contains a Boot ROM which is the first code that runs right after the SoC is powered on. The Boot ROM is responsible for loading user code (e.g. a bootloader) from any of the supported external devices and writing the downloaded code to internal SRAM. After loading the SoC begins executing the code written to SRAM. This commits adds emulation of the Boot ROM firmware setup functionality by loading user code from SD card in the A1 SRAM. While the A1 SRAM is 64KiB, we limit the size to 32KiB because the real H3 Boot ROM also rejects sizes larger than 32KiB. For reference, this behaviour is documented by the Linux Sunxi project wiki at: https://linux-sunxi.org/BROM#U-Boot_SPL_limitations Signed-off-by: Niek Linnenbank Reviewed-by: Alex Bennée --- include/hw/arm/allwinner-h3.h | 21 +++++++++++++++++++++ hw/arm/allwinner-h3.c | 18 ++++++++++++++++++ hw/arm/orangepi.c | 5 +++++ 3 files changed, 44 insertions(+) diff --git a/include/hw/arm/allwinner-h3.h b/include/hw/arm/allwinner-h3.h index f9b9a02373..d338003724 100644 --- a/include/hw/arm/allwinner-h3.h +++ b/include/hw/arm/allwinner-h3.h @@ -46,6 +46,7 @@ #include "hw/sd/allwinner-sdhost.h" #include "hw/net/allwinner-sun8i-emac.h" #include "target/arm/cpu.h" +#include "sysemu/block-backend.h" /** * Allwinner H3 device list @@ -129,4 +130,24 @@ typedef struct AwH3State { MemoryRegion sram_c; } AwH3State; +/** + * Emulate Boot ROM firmware setup functionality. + * + * A real Allwinner H3 SoC contains a Boot ROM + * which is the first code that runs right after + * the SoC is powered on. The Boot ROM is responsible + * for loading user code (e.g. a bootloader) from any + * of the supported external devices and writing the + * downloaded code to internal SRAM. After loading the SoC + * begins executing the code written to SRAM. + * + * This function emulates the Boot ROM by copying 32 KiB + * of data from the given block device and writes it to + * the start of the first internal SRAM memory. + * + * @s: Allwinner H3 state object pointer + * @blk: Block backend device object pointer + */ +void allwinner_h3_bootrom_setup(AwH3State *s, BlockBackend *blk); + #endif /* HW_ARM_ALLWINNER_H3_H */ diff --git a/hw/arm/allwinner-h3.c b/hw/arm/allwinner-h3.c index d1245d2b01..56b5c563a8 100644 --- a/hw/arm/allwinner-h3.c +++ b/hw/arm/allwinner-h3.c @@ -29,6 +29,7 @@ #include "hw/char/serial.h" #include "hw/misc/unimp.h" #include "hw/usb/hcd-ehci.h" +#include "hw/loader.h" #include "sysemu/sysemu.h" #include "hw/arm/allwinner-h3.h" @@ -170,6 +171,23 @@ enum { AW_H3_GIC_NUM_SPI = 128 }; +void allwinner_h3_bootrom_setup(AwH3State *s, BlockBackend *blk) +{ + const int64_t rom_size = 32 * KiB; + uint8_t *buffer = g_new0(uint8_t, rom_size); + + if (blk_pread(blk, 8 * KiB, buffer, rom_size) < 0) { + error_setg(&error_fatal, "%s: failed to read BlockBackend data", + __func__); + return; + } + + rom_add_blob("allwinner-h3.bootrom", buffer, rom_size, + rom_size, s->memmap[AW_H3_SRAM_A1], + NULL, NULL, NULL, NULL, false); + g_free(buffer); +} + static void allwinner_h3_init(Object *obj) { AwH3State *s = AW_H3(obj); diff --git a/hw/arm/orangepi.c b/hw/arm/orangepi.c index 4299c59b8a..1c32d2898f 100644 --- a/hw/arm/orangepi.c +++ b/hw/arm/orangepi.c @@ -98,6 +98,11 @@ static void orangepi_init(MachineState *machine) memory_region_add_subregion(get_system_memory(), h3->memmap[AW_H3_SDRAM], machine->ram); + /* Load target kernel or start using BootROM */ + if (!machine->kernel_filename && blk_is_available(blk)) { + /* Use Boot ROM to copy data from SD card to SRAM */ + allwinner_h3_bootrom_setup(h3, blk); + } orangepi_binfo.loader_start = h3->memmap[AW_H3_SDRAM]; orangepi_binfo.ram_size = machine->ram_size; arm_load_kernel(ARM_CPU(first_cpu), machine, &orangepi_binfo);