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:
Janne Grunau
2024-11-23 22:44:05 +01:00
committed by Tom Rini
parent 544a76bac3
commit dabaa4ae32
7 changed files with 73 additions and 7 deletions

View File

@@ -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
/**