summaryrefslogtreecommitdiff
path: root/drivers/core
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2021-08-01 12:05:23 -0600
committerSimon Glass <sjg@chromium.org>2021-08-08 11:27:27 -0600
commit1e9ced28f18ed75bef96df08e47baad27dd51829 (patch)
tree68281ced12e3fb983c8e8acff3e0a73b9424c1af /drivers/core
parentb18b38f2ae3f54b906e0f2ab86789d9dd0110ed2 (diff)
downloadu-boot-1e9ced28f18ed75bef96df08e47baad27dd51829.tar.gz
u-boot-1e9ced28f18ed75bef96df08e47baad27dd51829.tar.bz2
u-boot-1e9ced28f18ed75bef96df08e47baad27dd51829.zip
dm: core: Don't allow uclass use before ready
At present it is possible to call uclass_get() before driver model is inited. In fact this happens on x86 boards which use Intel FSPv1, since mrccache_get_region() tries to get the SPI flash device very early during init. This has always been undefined behaviour. Previously it generally worked, i.e. returned an error code without crashing, because gd->uclass_root_s is zeroed and the uclass can be added despite driver model not being ready, due to the way lists are implemented. With the change to use a gd->uclass_root pointer, this no-longer works. For example, it causes a hang on minnowmax. Fix this by adding a check that driver model is ready when uclass_get() is called. This function is called in the process of locating any device, so it is a good place to add the check. This fixes booting on minnowmax. Signed-off-by: Simon Glass <sjg@chromium.org> Fixes: 8a715530bb1 ("dm: core: Allow the uclass list to move")
Diffstat (limited to 'drivers/core')
-rw-r--r--drivers/core/uclass.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c
index 117d35ac49..3146dfd032 100644
--- a/drivers/core/uclass.c
+++ b/drivers/core/uclass.c
@@ -146,6 +146,9 @@ int uclass_get(enum uclass_id id, struct uclass **ucp)
{
struct uclass *uc;
+ /* Immediately fail if driver model is not set up */
+ if (!gd->uclass_root)
+ return -EDEADLK;
*ucp = NULL;
uc = uclass_find(id);
if (!uc) {