On Thu, Jan 26, 2023 at 04:11:32PM -0800, Saravana Kannan wrote: > fw_devlink uses DL_FLAG_SYNC_STATE_ONLY device link flag for two > purposes: > > 1. To allow a parent device to proxy its child device's dependency on a > supplier so that the supplier doesn't get its sync_state() callback > before the child device/consumer can be added and probed. In this > usage scenario, we need to ignore cycles for ensure correctness of > sync_state() callbacks. > > 2. When there are dependency cycles in firmware, we don't know which of > those dependencies are valid. So, we have to ignore them all wrt > probe ordering while still making sure the sync_state() callbacks > come correctly. > > However, when detecting dependency cycles, there can be multiple > dependency cycles between two devices that we need to detect. For > example: > > A -> B -> A and A -> C -> B -> A. > > To detect multiple cycles correct, we need to be able to differentiate > DL_FLAG_SYNC_STATE_ONLY device links used for (1) vs (2) above. > > To allow this differentiation, add a DL_FLAG_CYCLE that can be use to > mark use case (2). We can then use the DL_FLAG_CYCLE to decide which > DL_FLAG_SYNC_STATE_ONLY device links to follow when looking for > dependency cycles. ... > +static inline bool device_link_flag_is_sync_state_only(u32 flags) > +{ > + return (flags & ~(DL_FLAG_INFERRED | DL_FLAG_CYCLE)) > + == (DL_FLAG_SYNC_STATE_ONLY | DL_FLAG_MANAGED); Weird indentation, why not return (flags & ~(DL_FLAG_INFERRED | DL_FLAG_CYCLE)) == (DL_FLAG_SYNC_STATE_ONLY | DL_FLAG_MANAGED); ? > +} ... > DL_FLAG_AUTOREMOVE_SUPPLIER | \ > DL_FLAG_AUTOPROBE_CONSUMER | \ > DL_FLAG_SYNC_STATE_ONLY | \ > - DL_FLAG_INFERRED) > + DL_FLAG_INFERRED | \ > + DL_FLAG_CYCLE) You can make less churn by squeezing the new one above the last one. -- With Best Regards, Andy Shevchenko