mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-30 18:05:48 +01:00 
			
		
		
		
	bootstd: Add a system bootdev for strange boot methods
Some boot methods don't act on a single bootdev but instead do their own thing. An example is EFI bootmgr which scan various devices using its own logic. Add a bootdev to handle this. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		| @@ -19,7 +19,7 @@ obj-y += image.o image-board.o | ||||
| obj-$(CONFIG_ANDROID_AB) += android_ab.o | ||||
| obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o image-android-dt.o | ||||
|  | ||||
| obj-$(CONFIG_$(SPL_TPL_)BOOTSTD) += bootdev-uclass.o | ||||
| obj-$(CONFIG_$(SPL_TPL_)BOOTSTD) += bootdev-uclass.o system_bootdev.o | ||||
| obj-$(CONFIG_$(SPL_TPL_)BOOTSTD) += bootflow.o | ||||
| obj-$(CONFIG_$(SPL_TPL_)BOOTSTD) += bootmeth-uclass.o | ||||
| obj-$(CONFIG_$(SPL_TPL_)BOOTSTD) += bootstd-uclass.o | ||||
|   | ||||
| @@ -150,6 +150,12 @@ int dm_scan_other(bool pre_reloc_only) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* Create the system bootdev too */ | ||||
| 	ret = device_bind_driver(bootstd, "system_bootdev", "system-bootdev", | ||||
| 				 &dev); | ||||
| 	if (ret) | ||||
| 		return log_msg_ret("sys", ret); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										66
									
								
								boot/system_bootdev.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								boot/system_bootdev.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0+ | ||||
| /* | ||||
|  * Bootdevice for system, used for bootmeths not tied to any partition device | ||||
|  * | ||||
|  * Copyright 2021 Google LLC | ||||
|  * Written by Simon Glass <sjg@chromium.org> | ||||
|  */ | ||||
|  | ||||
| #define LOG_CATEGORY UCLASS_BOOTSTD | ||||
|  | ||||
| #include <common.h> | ||||
| #include <bootdev.h> | ||||
| #include <bootflow.h> | ||||
| #include <bootmeth.h> | ||||
| #include <command.h> | ||||
| #include <distro.h> | ||||
| #include <dm.h> | ||||
| #include <log.h> | ||||
| #include <net.h> | ||||
|  | ||||
| static int system_get_bootflow(struct udevice *dev, struct bootflow_iter *iter, | ||||
| 			       struct bootflow *bflow) | ||||
| { | ||||
| 	int ret; | ||||
|  | ||||
| 	/* Must be an bootstd device */ | ||||
| 	ret = bootflow_iter_uses_system(iter); | ||||
| 	if (ret) | ||||
| 		return log_msg_ret("net", ret); | ||||
|  | ||||
| 	ret = bootmeth_check(bflow->method, iter); | ||||
| 	if (ret) | ||||
| 		return log_msg_ret("check", ret); | ||||
|  | ||||
| 	ret = bootmeth_read_bootflow(bflow->method, bflow); | ||||
| 	if (ret) | ||||
| 		return log_msg_ret("method", ret); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int system_bootdev_bind(struct udevice *dev) | ||||
| { | ||||
| 	struct bootdev_uc_plat *ucp = dev_get_uclass_plat(dev); | ||||
|  | ||||
| 	ucp->prio = BOOTDEVP_6_SYSTEM; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| struct bootdev_ops system_bootdev_ops = { | ||||
| 	.get_bootflow	= system_get_bootflow, | ||||
| }; | ||||
|  | ||||
| static const struct udevice_id system_bootdev_ids[] = { | ||||
| 	{ .compatible = "u-boot,bootdev-system" }, | ||||
| 	{ } | ||||
| }; | ||||
|  | ||||
| U_BOOT_DRIVER(system_bootdev) = { | ||||
| 	.name		= "system_bootdev", | ||||
| 	.id		= UCLASS_BOOTDEV, | ||||
| 	.ops		= &system_bootdev_ops, | ||||
| 	.bind		= system_bootdev_bind, | ||||
| 	.of_match	= system_bootdev_ids, | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user