mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	driver core: Add device link support for INFERRED flag
This flag can never be added to a device link that already exists and doesn't have the flag set. It can only be added when a device link is created for the first time or it can be maintained if the device link already has the it set. This flag will be used for marking device links created ONLY by inferring dependencies from data and NOT from explicit action by device drivers/frameworks. This will be useful in the future when we need to deal with cycles in dependencies inferred from firmware. Signed-off-by: Saravana Kannan <saravanak@google.com> Link: https://lore.kernel.org/r/20201218031703.3053753-3-saravanak@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									fb88c9a3e2
								
							
						
					
					
						commit
						4b9bbb29ba
					
				
					 2 changed files with 13 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -229,7 +229,8 @@ int device_is_dependent(struct device *dev, void *target)
 | 
			
		|||
		return ret;
 | 
			
		||||
 | 
			
		||||
	list_for_each_entry(link, &dev->links.consumers, s_node) {
 | 
			
		||||
		if (link->flags == (DL_FLAG_SYNC_STATE_ONLY | DL_FLAG_MANAGED))
 | 
			
		||||
		if ((link->flags & ~DL_FLAG_INFERRED) ==
 | 
			
		||||
		    (DL_FLAG_SYNC_STATE_ONLY | DL_FLAG_MANAGED))
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		if (link->consumer == target)
 | 
			
		||||
| 
						 | 
				
			
			@ -302,7 +303,8 @@ static int device_reorder_to_tail(struct device *dev, void *not_used)
 | 
			
		|||
 | 
			
		||||
	device_for_each_child(dev, NULL, device_reorder_to_tail);
 | 
			
		||||
	list_for_each_entry(link, &dev->links.consumers, s_node) {
 | 
			
		||||
		if (link->flags == (DL_FLAG_SYNC_STATE_ONLY | DL_FLAG_MANAGED))
 | 
			
		||||
		if ((link->flags & ~DL_FLAG_INFERRED) ==
 | 
			
		||||
		    (DL_FLAG_SYNC_STATE_ONLY | DL_FLAG_MANAGED))
 | 
			
		||||
			continue;
 | 
			
		||||
		device_reorder_to_tail(link->consumer, NULL);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -546,7 +548,8 @@ postcore_initcall(devlink_class_init);
 | 
			
		|||
#define DL_MANAGED_LINK_FLAGS (DL_FLAG_AUTOREMOVE_CONSUMER | \
 | 
			
		||||
			       DL_FLAG_AUTOREMOVE_SUPPLIER | \
 | 
			
		||||
			       DL_FLAG_AUTOPROBE_CONSUMER  | \
 | 
			
		||||
			       DL_FLAG_SYNC_STATE_ONLY)
 | 
			
		||||
			       DL_FLAG_SYNC_STATE_ONLY | \
 | 
			
		||||
			       DL_FLAG_INFERRED)
 | 
			
		||||
 | 
			
		||||
#define DL_ADD_VALID_FLAGS (DL_MANAGED_LINK_FLAGS | DL_FLAG_STATELESS | \
 | 
			
		||||
			    DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE)
 | 
			
		||||
| 
						 | 
				
			
			@ -615,7 +618,7 @@ struct device_link *device_link_add(struct device *consumer,
 | 
			
		|||
	if (!consumer || !supplier || flags & ~DL_ADD_VALID_FLAGS ||
 | 
			
		||||
	    (flags & DL_FLAG_STATELESS && flags & DL_MANAGED_LINK_FLAGS) ||
 | 
			
		||||
	    (flags & DL_FLAG_SYNC_STATE_ONLY &&
 | 
			
		||||
	     flags != DL_FLAG_SYNC_STATE_ONLY) ||
 | 
			
		||||
	     (flags & ~DL_FLAG_INFERRED) != DL_FLAG_SYNC_STATE_ONLY) ||
 | 
			
		||||
	    (flags & DL_FLAG_AUTOPROBE_CONSUMER &&
 | 
			
		||||
	     flags & (DL_FLAG_AUTOREMOVE_CONSUMER |
 | 
			
		||||
		      DL_FLAG_AUTOREMOVE_SUPPLIER)))
 | 
			
		||||
| 
						 | 
				
			
			@ -671,6 +674,10 @@ struct device_link *device_link_add(struct device *consumer,
 | 
			
		|||
		if (link->consumer != consumer)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		if (link->flags & DL_FLAG_INFERRED &&
 | 
			
		||||
		    !(flags & DL_FLAG_INFERRED))
 | 
			
		||||
			link->flags &= ~DL_FLAG_INFERRED;
 | 
			
		||||
 | 
			
		||||
		if (flags & DL_FLAG_PM_RUNTIME) {
 | 
			
		||||
			if (!(link->flags & DL_FLAG_PM_RUNTIME)) {
 | 
			
		||||
				pm_runtime_new_link(consumer);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -323,6 +323,7 @@ enum device_link_state {
 | 
			
		|||
 * AUTOPROBE_CONSUMER: Probe consumer driver automatically after supplier binds.
 | 
			
		||||
 * MANAGED: The core tracks presence of supplier/consumer drivers (internal).
 | 
			
		||||
 * SYNC_STATE_ONLY: Link only affects sync_state() behavior.
 | 
			
		||||
 * INFERRED: Inferred from data (eg: firmware) and not from driver actions.
 | 
			
		||||
 */
 | 
			
		||||
#define DL_FLAG_STATELESS		BIT(0)
 | 
			
		||||
#define DL_FLAG_AUTOREMOVE_CONSUMER	BIT(1)
 | 
			
		||||
| 
						 | 
				
			
			@ -332,6 +333,7 @@ enum device_link_state {
 | 
			
		|||
#define DL_FLAG_AUTOPROBE_CONSUMER	BIT(5)
 | 
			
		||||
#define DL_FLAG_MANAGED			BIT(6)
 | 
			
		||||
#define DL_FLAG_SYNC_STATE_ONLY		BIT(7)
 | 
			
		||||
#define DL_FLAG_INFERRED		BIT(8)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * enum dl_dev_state - Device driver presence tracking information.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue