On Thu, Jul 10, 2014 at 5:53 PM, Stephen Boyd <[email protected]> wrote:
> On 07/10, Rob Clark wrote:
>> So, in it's current form, this is superficially a copy of msm_iommu
>> plus DT conversion. But the pre-DT IOMMU driver had fairly different
>> structure.. ie. psuedo root device, with IOMMU devices hanging off
>> that, and context devices hanging off that. The context devices were
>> what the client device would attach (which was also somewhat non-
>> standard.. see msm_iommu_get_ctx()).
>>
>> I couldn't really think of some sane way to refactor this and add DT
>> while at the same time keeping compatibility with the old pre-DT msm
>> stuff. So I copied to a new driver.
>>
>> It was pointed out that nothing upstream actually *used* the msm_iommu
>> driver. So if no one objects to dropping pre-DT support, then I could
>> do some patch rejuggling + sed to make this replace the old driver
>> instead.
>
> +1
>
>> +
>> +// TODO any good reason for global lock vs per-iommu lock?
>> +DEFINE_SPINLOCK(qcom_iommu_lock);
>
> static?
oh, yes.. ofc
I do wonder if we might want to make locking a bit more fine grained
to reduce contention (but, otoh, the gpu driver isn't going to contend
with itself, and other drivers probably aren't taxing the iommu quite
so hard). But I guess it would be ok to leave that as a future
optimization.
>
>> +static LIST_HEAD(qcom_iommu_devices);
>> +
>> +/* Note that a single iommu_domain can, for devices sitting behind
>> + * more than one IOMMU (ie. one per AXI interface) will have more
>> + * than one iommu in the iommu_list. But all are programmed to
>> + * point at the same pagetables so from client device perspective
>> + * they act as a single IOMMU.
>> + */
>> +struct qcom_domain_priv {
>> + unsigned long *pgtable;
>> + struct list_head iommu_list; /* list of attached 'struct qcom_iommu'
>> */
>> +};
>> +
>> +static int __enable_clocks(struct qcom_iommu *iommu)
>> +{
>> + int ret;
>> +
>> + ret = clk_prepare_enable(iommu->pclk);
>
> Looks like __enable_clocks() is called from within a spinlock
> sometimes. Please move the prepare call outside of any atomic
> sections and also enable CONFIG_PROVE_LOCKING and/or
> CONFIG_DEBUG_ATOMIC_SLEEP to find such problems.
good point. I haven't gotten around to running this against a debug
kernel. It is only at the 'just barely works now' stage, I just
wanted to send for early feedback on the approach. (Mainly to make
sure no one screams bloody murder about dropping pre-DT support from
old driver.)
BR,
-R
>> + if (ret)
>> + goto fail;
>> +
>> + if (iommu->clk) {
>> + ret = clk_prepare_enable(iommu->clk);
>> + if (ret)
>> + clk_disable_unprepare(iommu->pclk);
>> + }
>> +fail:
>> + return ret;
>> +}
>> +
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> hosted by The Linux Foundation
--
To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html