On 9/18/26 07:22, Vandhiadevan Karunamoorthy wrote:
qcom_geni_fw_initialise() runs once, at EVT_LAST_STAGE_INIT, and reads
GENI SE firmware from a dedicated storage partition into memory for
its children to pick up during their own probe(). If that partition
does not exist yet at that point (e.g. first boot, before fastboot has
flashed it), it finds nothing to load and does not retry later. A
later SPI-NOR probe cannot recover from that on its own, since the
SPI driver's probe() only re-reads firmware already cached by
qcom_geni_fw_initialise(); it does not re-read storage itself.

Override the fastboot_oem_spi_nor_reinit() hook to re-run
qcom_geni_fw_initialise(), so that "fastboot oem spi-nor-init" can
pick up firmware that has been flashed since boot before probing
the SPI-NOR device.

Rather than adding yet another opaque "call a magic function" API, could we instead fire an event when a block device appears, passing in it's partition info.

Maybe I'm missing something else here, but why don't you just reset the board after flashing the qupv3 fw for the first time??

Thanks and regards,

Signed-off-by: Vandhiadevan Karunamoorthy 
<[email protected]>
---
  drivers/misc/qcom_geni.c | 15 +++++++++++++++
  1 file changed, 15 insertions(+)

diff --git a/drivers/misc/qcom_geni.c b/drivers/misc/qcom_geni.c
index a62ae6a2478..d14d74e4216 100644
--- a/drivers/misc/qcom_geni.c
+++ b/drivers/misc/qcom_geni.c
@@ -13,6 +13,7 @@
  #include <dm/device-internal.h>
  #include <dm/lists.h>
  #include <elf.h>
+#include <fastboot.h>
  #include <linux/bitops.h>
  #include <linux/delay.h>
  #include <linux/io.h>
@@ -565,6 +566,20 @@ static int qcom_geni_fw_initialise(void)
EVENT_SPY_SIMPLE(EVT_LAST_STAGE_INIT, qcom_geni_fw_initialise); +/*
+ * qcom_geni_fw_initialise() only runs once, at EVT_LAST_STAGE_INIT. If the
+ * firmware partition does not exist yet at that point (e.g. first boot,
+ * before fastboot has flashed it), it silently finds nothing to load. A
+ * later SPI-NOR probe cannot recover from that on its own, since its
+ * probe() only re-reads firmware already cached by qcom_geni_fw_initialise();
+ * it does not re-read storage. Re-running it here lets the SPI-NOR device
+ * pick up firmware that has since been flashed.
+ */
+int fastboot_oem_spi_nor_reinit(void)
+{
+       return qcom_geni_fw_initialise();
+}
+
  static const struct udevice_id geni_ids[] = {
        { .compatible = "qcom,geni-se-qup" },
        {}


Reply via email to