From: "Philippe Mathieu-Daudé" <philippe.mathieu.daude@gmail.com>
To: qemu-devel@nongnu.org
Cc: "Cédric Le Goater" <clg@kaod.org>,
"Bin Meng" <bin.meng@windriver.com>,
qemu-block@nongnu.org, "Joel Stanley" <joel@jms.id.au>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
"Sai Pavan Boddu" <sai.pavan.boddu@xilinx.com>
Subject: [PATCH v2 23/25] hw/sd: Support boot area in emmc image
Date: Mon, 30 May 2022 21:38:14 +0200 [thread overview]
Message-ID: <20220530193816.45841-24-philippe.mathieu.daude@gmail.com> (raw)
In-Reply-To: <20220530193816.45841-1-philippe.mathieu.daude@gmail.com>
From: Joel Stanley <joel@jms.id.au>
This assumes a specially constructued image:
dd if=/dev/zero of=mmc-bootarea.img count=2 bs=1M
dd if=u-boot-spl.bin of=mmc-bootarea.img conv=notrunc
dd if=u-boot.bin of=mmc-bootarea.img conv=notrunc count=64 bs=1K
cat mmc-bootarea.img obmc-phosphor-image.wic > mmc.img
truncate --size 16GB mmc.img
truncate --size 128MB mmc-bootarea.img
For now this still requires a mtd image to load the SPL:
qemu-system-arm -M tacoma-bmc -nographic \
-global driver=sd-card,property=emmc,value=true \
-drive file=mmc.img,if=sd,index=2 \
-drive file=mmc-bootarea.img,if=mtd,format=raw
Signed-off-by: Joel Stanley <joel@jms.id.au>
[clg: - definition renames
- Introduced bootpart_offset
- Introduced sd_boot_capacity_bytes() helper (Philippe) ]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 39 +++++++++++++++++++++++++++++++++++++++
include/hw/sd/sd.h | 1 +
2 files changed, 40 insertions(+)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 6722003cda..05e77f128f 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -659,6 +659,12 @@ static inline uint64_t sd_addr_to_wpnum(uint64_t addr)
return addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
}
+
+static unsigned sd_boot_capacity_bytes(SDState *sd)
+{
+ return sd->ext_csd[EXT_CSD_BOOT_MULT] << 17;
+}
+
static void sd_reset(DeviceState *dev)
{
SDState *sd = SD_CARD(dev);
@@ -857,9 +863,40 @@ void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
qemu_set_irq(insert, sd->blk ? blk_is_inserted(sd->blk) : 0);
}
+/*
+ * This requires a disk image that has two boot partitions inserted at the
+ * beginning of it. The size of the boot partitions are configured in the
+ * ext_csd structure, which is hardcoded in qemu. They are currently set to
+ * 1MB each.
+ */
+static uint32_t sd_emmc_bootpart_offset(SDState *sd)
+{
+ unsigned int access = sd->ext_csd[EXT_CSD_PART_CONFIG] &
+ EXT_CSD_PART_CONFIG_ACC_MASK;
+ unsigned int boot_capacity = sd_boot_capacity_bytes(sd);
+
+ switch (access) {
+ case EXT_CSD_PART_CONFIG_ACC_DEFAULT:
+ return boot_capacity * 2;
+ case EXT_CSD_PART_CONFIG_ACC_BOOT0:
+ return 0;
+ case EXT_CSD_PART_CONFIG_ACC_BOOT0 + 1:
+ return boot_capacity * 1;
+ default:
+ g_assert_not_reached();
+ }
+}
+
+static uint32_t sd_bootpart_offset(SDState *sd)
+{
+ SDCardClass *sc = SD_CARD_GET_CLASS(sd);
+ return sc->bootpart_offset ? sc->bootpart_offset(sd) : 0;
+}
+
static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
{
trace_sdcard_read_block(addr, len);
+ addr += sd_bootpart_offset(sd);
if (!sd->blk || blk_pread(sd->blk, addr, sd->data, len) < 0) {
fprintf(stderr, "sd_blk_read: read error on host side\n");
}
@@ -868,6 +905,7 @@ static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
{
trace_sdcard_write_block(addr, len);
+ addr += sd_bootpart_offset(sd);
if (!sd->blk || blk_pwrite(sd->blk, addr, sd->data, len, 0) < 0) {
fprintf(stderr, "sd_blk_write: write error on host side\n");
}
@@ -2564,6 +2602,7 @@ static void emmc_class_init(ObjectClass *klass, void *data)
dc->realize = emmc_realize;
sc->proto = &sd_proto_emmc;
sc->set_csd = sd_emmc_set_csd;
+ sc->bootpart_offset = sd_emmc_bootpart_offset;
}
static const TypeInfo emmc_info = {
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index 8a0f2e75da..36d3cba08e 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -130,6 +130,7 @@ struct SDCardClass {
const struct SDProto *proto;
void (*set_csd)(SDState *sd, uint64_t size);
+ uint32_t (*bootpart_offset)(SDState *sd);
};
#define TYPE_SD_BUS "sd-bus"
--
2.36.1
next prev parent reply other threads:[~2022-05-30 20:03 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-30 19:37 [PATCH v2 00/25] hw/sd: Rework models for eMMC support Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 01/25] hw/sd/sdcard: Return ILLEGAL for CMD19/CMD23 prior SD spec v3.01 Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 02/25] hw/sd: When card is in wrong state, log which state it is Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 03/25] hw/sd: When card is in wrong state, log which spec version is used Philippe Mathieu-Daudé
2022-05-31 8:01 ` Cédric Le Goater
2022-05-30 19:37 ` [PATCH v2 04/25] hw/sd: Move proto_name to SDProto structure Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 05/25] hw/sd: Introduce sd_cmd_handler type Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 06/25] hw/sd: Add sd_cmd_illegal() handler Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 07/25] hw/sd: Add sd_cmd_unimplemented() handler Philippe Mathieu-Daudé
2022-05-30 19:37 ` [PATCH v2 08/25] hw/sd: Add sd_cmd_GO_IDLE_STATE() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 09/25] hw/sd: Add sd_cmd_SEND_OP_CMD() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 10/25] hw/sd: Add sd_cmd_ALL_SEND_CID() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 11/25] hw/sd: Add sd_cmd_SEND_RELATIVE_ADDR() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 12/25] hw/sd: Add sd_cmd_SEND_TUNING_BLOCK() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 13/25] hw/sd: Add sd_cmd_SET_BLOCK_COUNT() handler Philippe Mathieu-Daudé
2022-05-31 8:02 ` Cédric Le Goater
2022-05-30 19:38 ` [PATCH v2 14/25] hw/sd: Basis for eMMC support Philippe Mathieu-Daudé
2022-05-31 7:54 ` Philippe Mathieu-Daudé via
2022-05-31 8:50 ` Cédric Le Goater
2022-05-31 9:05 ` Cédric Le Goater
2022-05-30 19:38 ` [PATCH v2 15/25] hw/sd: Add sd_emmc_cmd_SEND_OP_CMD() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 16/25] hw/sd: Add sd_emmc_cmd_ALL_SEND_CID() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 17/25] hw/sd: Add sd_emmc_cmd_SEND_RELATIVE_ADDR() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 18/25] hw/sd: Add sd_emmc_cmd_APP_CMD() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 19/25] hw/sd: add sd_emmc_cmd_SEND_TUNING_BLOCK() handler Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 20/25] hw/sd: Add CMD21 tuning sequence Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 21/25] hw/sd: Add mmc switch function support Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 22/25] hw/sd: Add sd_emmc_cmd_SEND_EXT_CSD() handler Philippe Mathieu-Daudé
2022-05-31 8:48 ` Cédric Le Goater
2022-05-30 19:38 ` Philippe Mathieu-Daudé [this message]
2022-05-30 19:38 ` [PATCH v2 24/25] hw/sd: Subtract bootarea size from blk Philippe Mathieu-Daudé
2022-05-30 19:38 ` [PATCH v2 25/25] hw/sd: Add boot config support Philippe Mathieu-Daudé
2022-05-31 6:31 ` [PATCH v2 00/25] hw/sd: Rework models for eMMC support Cédric Le Goater
2022-05-31 7:56 ` Philippe Mathieu-Daudé via
2022-05-31 7:58 ` Philippe Mathieu-Daudé via
2022-05-31 9:19 ` Cédric Le Goater
2022-05-31 19:07 ` Philippe Mathieu-Daudé via
2022-06-01 5:50 ` Cédric Le Goater
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220530193816.45841-24-philippe.mathieu.daude@gmail.com \
--to=philippe.mathieu.daude@gmail.com \
--cc=bin.meng@windriver.com \
--cc=clg@kaod.org \
--cc=f4bug@amsat.org \
--cc=joel@jms.id.au \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=sai.pavan.boddu@xilinx.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).