mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
dm: Add dm_remove_devices_active() for ordered device removal
This replaces dm_remove_devices_flags() calls in all boot implementations to ensure non vital devices are consistently removed first. All boot implementation except arch/arm/lib/bootm.c currently just call dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL). This can result in crashes when dependencies between devices exists. The driver model's design document describes DM_FLAG_VITAL as "indicates that the device is 'vital' to the operation of other devices". Device removal at boot should follow this. Instead of adding dm_remove_devices_flags() with (DM_REMOVE_ACTIVE_ALL | DM_REMOVE_NON_VITAL) everywhere add dm_remove_devices_active() which does this. Fixes a NULL pointer deref in the apple dart IOMMU driver during EFI boot. The xhci-pci (driver which depends on the IOMMU to work) removes its mapping on removal. This explodes when the IOMMU device was removed first. dm_remove_devices_flags() is kept since it is used for testing of device_remove() calls in dm. Signed-off-by: Janne Grunau <j@jannau.net>
This commit is contained in:
@@ -167,8 +167,18 @@ int dm_uninit(void);
|
||||
* Return: 0 if OK, -ve on error
|
||||
*/
|
||||
int dm_remove_devices_flags(uint flags);
|
||||
|
||||
/**
|
||||
* dm_remove_devices_active - Call remove function of all active drivers heeding
|
||||
* device dependencies as far as know, i.e. removing
|
||||
* devices marked with DM_FLAG_VITAL last.
|
||||
*
|
||||
* All active devices will be removed
|
||||
*/
|
||||
void dm_remove_devices_active(void);
|
||||
#else
|
||||
static inline int dm_remove_devices_flags(uint flags) { return 0; }
|
||||
static inline void dm_remove_devices_active(void) { }
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user