]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
spl: Add callbacks to invalidate cached devices
authorSean Anderson <seanga2@gmail.com>
Sat, 14 Oct 2023 20:47:54 +0000 (16:47 -0400)
committerTom Rini <trini@konsulko.com>
Wed, 18 Oct 2023 00:50:52 +0000 (20:50 -0400)
Several SPL functions try to avoid performing initialization twice by
caching devices. This is fine for regular boot, but does not work with
UNIT_TEST, since all devices are torn down after each test. Add some
functions to invalidate the caches which can be called before testing these
load methods.

Signed-off-by: Sean Anderson <seanga2@gmail.com>
common/spl/spl_fat.c
common/spl/spl_mmc.c
include/spl.h

index c6e2526ade12f34b8b8826dd59c5ad16f45805df..b7b6a7794fd39d65ef7de2e0f0ac0ef3411be13e 100644 (file)
 
 static int fat_registered;
 
+void spl_fat_force_reregister(void)
+{
+       fat_registered = 0;
+}
+
 static int spl_register_fat_device(struct blk_desc *block_dev, int partition)
 {
        int err = 0;
index 67c7ae34a58550b41b7d0b1918f112b15a5e66e5..03a081fa47e042c1cfee00e53adf947ed70aa903 100644 (file)
@@ -403,13 +403,19 @@ static int spl_mmc_get_mmc_devnum(struct mmc *mmc)
        return block_dev->devnum;
 }
 
+static struct mmc *mmc;
+
+void spl_mmc_clear_cache(void)
+{
+       mmc = NULL;
+}
+
 int spl_mmc_load(struct spl_image_info *spl_image,
                 struct spl_boot_device *bootdev,
                 const char *filename,
                 int raw_part,
                 unsigned long raw_sect)
 {
-       static struct mmc *mmc;
        u32 boot_mode;
        int err = 0;
        __maybe_unused int part = 0;
index 1d416b4c9296cb0354b6044ae21b01fdbb681dc0..03a4a83eb2497dba806d543c0f8715539d7fc3aa 100644 (file)
@@ -674,6 +674,18 @@ static inline const char *spl_loader_name(const struct spl_image_loader *loader)
 #endif
 
 /* SPL FAT image functions */
+
+/**
+ * spl_fat_force_reregister() - Force reregistration of FAT block devices
+ *
+ * To avoid repeatedly looking up block devices, spl_load_image_fat keeps track
+ * of whether it has already registered a block device. This is fine for most
+ * cases, but when running unit tests all devices are removed and recreated
+ * in-between tests. This function will force re-registration of any block
+ * devices, ensuring that we don't try to use an invalid block device.
+ */
+void spl_fat_force_reregister(void);
+
 int spl_load_image_fat(struct spl_image_info *spl_image,
                       struct spl_boot_device *bootdev,
                       struct blk_desc *block_dev, int partition,
@@ -753,6 +765,16 @@ bool spl_was_boot_source(void);
  */
 int spl_dfu_cmd(int usbctrl, char *dfu_alt_info, char *interface, char *devstr);
 
+/**
+ * spl_mmc_clear_cache() - Clear cached MMC devices
+ *
+ * To avoid reinitializing MMCs, spl_mmc_load caches the most-recently-used MMC
+ * device. This is fine for most cases, but when running unit tests all devices
+ * are removed and recreated in-between tests. This function will clear any
+ * cached state, ensuring that we don't try to use an invalid MMC.
+ */
+void spl_mmc_clear_cache(void);
+
 int spl_mmc_load_image(struct spl_image_info *spl_image,
                       struct spl_boot_device *bootdev);