Messages in this thread | | | Subject | Re: [PATCH v8 4/5] iommu/arm-smmu: Add the device_link between masters and smmu | From | Robin Murphy <> | Date | Fri, 9 Mar 2018 12:34:42 +0000 |
| |
On 09/03/18 07:11, Vivek Gautam wrote: > On Thu, Mar 8, 2018 at 10:29 AM, Vivek Gautam > <vivek.gautam@codeaurora.org> wrote: >> On Wed, Mar 7, 2018 at 6:17 PM, Robin Murphy <robin.murphy@arm.com> wrote: >>> On 02/03/18 10:10, Vivek Gautam wrote: >>>> >>>> From: Sricharan R <sricharan@codeaurora.org> >>>> >>>> Finally add the device link between the master device and >>>> smmu, so that the smmu gets runtime enabled/disabled only when the >>>> master needs it. This is done from add_device callback which gets >>>> called once when the master is added to the smmu. >>>> >>>> Signed-off-by: Sricharan R <sricharan@codeaurora.org> >>>> Signed-off-by: Vivek Gautam <vivek.gautam@codeaurora.org> >>>> --- >>>> drivers/iommu/arm-smmu.c | 21 +++++++++++++++++++++ >>>> 1 file changed, 21 insertions(+) >>>> >>>> diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c >>>> index 3d6a1875431f..bb1ea82c1003 100644 >>>> --- a/drivers/iommu/arm-smmu.c >>>> +++ b/drivers/iommu/arm-smmu.c >>>> @@ -217,6 +217,9 @@ struct arm_smmu_device { >>>> /* IOMMU core code handle */ >>>> struct iommu_device iommu; >>>> + >>>> + /* runtime PM link to master */ >>>> + struct device_link *link; >>> >>> >>> Just the one? > > we will either have to count all the devices that are present on the > iommu bus, or > maintain a list to which all the links can be added. > But to add the list, we will have to initialize a LIST_HEAD in struct > device_link > as well. > > Or, I think we don't even need to maintain a pointer to link with smmu. > In arm_smmu_remove_device(), we can find out the correct link, and delete it. > > list_for_each_entry(link, &dev->links.suppliers, c_node) > if (link->supplier == smmu->dev); > device_link_del(link); > > Should that be fine? > > Rafael, does the above snippet looks right to you? Context: smmu->dev > is the supplier, and dev is the consumer. We want to find the link, > and delete it.
Actually, looking at the existing code, it seems like device_link_add() will in fact look up and return any existing link between a given supplier and consumer - is that intentional API behaviour that users may rely on to avoid keeping track of explicit link pointers? (or conversely, might it be reasonable to factor out a device_link_find() function?)
Robin.
| |