From: Robin Murphy <robin.murphy@arm.com>
To: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
Marc Zyngier <marc.zyngier@arm.com>
Cc: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>,
sudeep.holla@arm.com, will.deacon@arm.com, joro@8bytes.org,
mark.rutland@arm.com, robh@kernel.org,
gabriele.paoloni@huawei.com, john.garry@huawei.com,
iommu@lists.linux-foundation.org,
linux-arm-kernel@lists.infradead.org, linux-acpi@vger.kernel.org,
devicetree@vger.kernel.org, devel@acpica.org,
linuxarm@huawei.com, wangzhou1@hisilicon.com,
guohanjun@huawei.com
Subject: Re: [PATCH v8 3/5] iommu/of: Add msi address regions reservation helper
Date: Thu, 5 Oct 2017 12:07:26 +0100 [thread overview]
Message-ID: <5c80f292-dc5d-a1c6-d7a0-df2a84cc77d1@arm.com> (raw)
In-Reply-To: <20171004135007.GA12327@red-moon>
On 04/10/17 14:50, Lorenzo Pieralisi wrote:
> On Wed, Oct 04, 2017 at 12:22:04PM +0100, Marc Zyngier wrote:
>> On 27/09/17 14:32, Shameer Kolothum wrote:
>>> From: John Garry <john.garry@huawei.com>
>>>
>>> On some platforms msi-controller address regions have to be excluded
>>> from normal IOVA allocation in that they are detected and decoded in
>>> a HW specific way by system components and so they cannot be considered
>>> normal IOVA address space.
>>>
>>> Add a helper function that retrieves msi address regions through device
>>> tree msi mapping, so that these regions will not be translated by IOMMU
>>> and will be excluded from IOVA allocations.
>>>
>>> Signed-off-by: John Garry <john.garry@huawei.com>
>>> [Shameer: Modified msi-parent retrieval logic]
>>> Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
>>> ---
>>> drivers/iommu/of_iommu.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++
>>> include/linux/of_iommu.h | 10 +++++
>>> 2 files changed, 105 insertions(+)
>>>
>>> diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
>>> index e60e3db..ffd7fb7 100644
>>> --- a/drivers/iommu/of_iommu.c
>>> +++ b/drivers/iommu/of_iommu.c
>>> @@ -21,6 +21,7 @@
>>> #include <linux/iommu.h>
>>> #include <linux/limits.h>
>>> #include <linux/of.h>
>>> +#include <linux/of_address.h>
>>> #include <linux/of_iommu.h>
>>> #include <linux/of_pci.h>
>>> #include <linux/slab.h>
>>> @@ -138,6 +139,14 @@ static int of_iommu_xlate(struct device *dev,
>>> return ops->of_xlate(dev, iommu_spec);
>>> }
>>>
>>> +static int __get_pci_rid(struct pci_dev *pdev, u16 alias, void *data)
>>> +{
>>> + u32 *rid = data;
>>> +
>>> + *rid = alias;
>>> + return 0;
>>> +}
>>> +
>>> struct of_pci_iommu_alias_info {
>>> struct device *dev;
>>> struct device_node *np;
>>> @@ -163,6 +172,73 @@ static int of_pci_iommu_init(struct pci_dev *pdev, u16 alias, void *data)
>>> return info->np == pdev->bus->dev.of_node;
>>> }
>>>
>>> +static int of_iommu_alloc_resv_region(struct device_node *np,
>>> + struct list_head *head)
>>> +{
>>> + int prot = IOMMU_WRITE | IOMMU_NOEXEC | IOMMU_MMIO;
>>> + struct iommu_resv_region *region;
>>> + struct resource res;
>>> + int err;
>>> +
>>> + err = of_address_to_resource(np, 0, &res);
>>
>> What is the rational for registering the first region only? Surely you
>> can have more than one region in an MSI controller (yes, your particular
>> case is the ITS which has only one, but we're trying to do something
>> generic here).
>>
>> Another issue I have with this code is that it inserts all of the ITS
>> MMIO in the RESV_MSI range. As long as we don't generate any page tables
>> for this, we're fine. But if we ever change this, we'll end-up with the
>> ITS programming interface being exposed to a device, which wouldn't be
>> acceptable.
>>
>> Why can't we have some generic property instead, that would describe the
>> actual ranges that cannot be translated? That way, no random insertion
>> of a random range, and relatively future proof.
Indeed. Furthermore, IORT has the advantage of being limited to a few
distinct device types and SBSA-compliant system topologies, so the
ITS-chasing is reasonable there (modulo only reserving GITS_TRANSLATER).
The scope of DT covers more embedded things as well like PCI host
controllers with internal MSI doorbells, and potentially even
direct-mapped memory regions for things like bootloader framebuffers to
prevent display glitches - a generic address/size/flags description of a
region could work for just about everything.
> IORT code has the same issue (ie it reserves all ITS regions) and I do
> not know where a property can be added to describe those ranges (IORT
> specs ? I'd rather not) in ACPI other than the IORT tables entries
> themselves.
>
>> I'm not sure where to declare it (PCIe node? IOMMU node?), but it'd feel
>> like a much nicer and simpler solution to this problem.
>
> It could be but if we throw ACPI into the picture we have to knock
> together Hisilicon specific namespace bindings to handle this and
> quickly.
As above I'm happy with the ITS-specific solution for ACPI given the
limits of IORT. What I had in mind for DT was something tied in with the
generic IOMMU bindings. Something like this is probably easiest to
handle, but does rather spread the information around:
pci {
...
iommu-map = <0 0 &iommu1 0x10000>;
iommu-reserved-ranges = <0x12340000 0x1000 IOMMU_MSI>,
<0x34560000 0x1000 IOMMU_MSI>;
};
display {
...
iommus = <&iommu1 0x20000>;
/* simplefb region */
iommu-reserved-ranges = <0x80080000 0x80000 IOMMU_DIRECT>,
};
Alternatively, something inspired by reserved-memory might perhaps be
conceptually neater, at the risk of being more complicated:
iommu1: iommu@acbd0000 {
...
#iommu-cells = <1>;
iommu-reserved-ranges {
#address-cells = <1>;
#size-cells = <1>;
its0_resv: msi@12340000 {
compatible = "iommu-msi-region";
reg = <0x12340000 0x1000>;
};
its1_resv: msi@34560000 {
compatible = "iommu-msi-region";
reg = <0x34560000 0x1000>;
};
fb_resv: direct@12340000 {
compatible = "iommu-direct-region";
reg = <0x80080000 0x80000>;
};
};
};
DT folks - any opinions?
Robin.
next prev parent reply other threads:[~2017-10-05 11:07 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-27 13:32 [PATCH v8 0/5] iommu/smmu-v3: Workaround for hisilicon 161010801 erratum(reserve HW MSI) Shameer Kolothum
2017-09-27 13:32 ` [PATCH v8 1/5] Doc: iommu/arm-smmu-v3: Add workaround for HiSilicon erratum 161010801 Shameer Kolothum
2017-10-05 22:24 ` Rob Herring
2017-09-27 13:32 ` [PATCH v8 3/5] iommu/of: Add msi address regions reservation helper Shameer Kolothum
[not found] ` <20170927133241.21036-4-shameerali.kolothum.thodi-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2017-10-04 11:22 ` Marc Zyngier
[not found] ` <f3146f49-6004-7a15-866b-653e3ea54856-5wv7dgnIgG8@public.gmane.org>
2017-10-04 13:50 ` Lorenzo Pieralisi
2017-10-05 11:07 ` Robin Murphy [this message]
[not found] ` <5c80f292-dc5d-a1c6-d7a0-df2a84cc77d1-5wv7dgnIgG8@public.gmane.org>
2017-10-05 11:57 ` Will Deacon
[not found] ` <20171005115719.GC11088-5wv7dgnIgG8@public.gmane.org>
2017-10-05 12:55 ` Robin Murphy
2017-10-05 12:37 ` John Garry
[not found] ` <d525f112-fb20-d14b-bea0-6547c8b933dd-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2017-10-05 12:44 ` Robin Murphy
2017-10-05 13:08 ` John Garry
[not found] ` <82272c18-717d-bbaf-b8c3-61785af496bd-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2017-10-05 14:05 ` Robin Murphy
2017-10-04 17:07 ` Shameerali Kolothum Thodi
2017-09-27 13:32 ` [PATCH v8 4/5] iommu/dma: Add a helper function to reserve HW MSI address regions for IOMMU drivers Shameer Kolothum
2017-09-27 13:32 ` [PATCH v8 5/5] iommu/arm-smmu-v3:Enable ACPI based HiSilicon erratum 161010801 Shameer Kolothum
[not found] ` <20170927133241.21036-1-shameerali.kolothum.thodi-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2017-09-27 13:32 ` [PATCH v8 2/5] ACPI/IORT: Add msi address regions reservation helper Shameer Kolothum
[not found] ` <20170927133241.21036-3-shameerali.kolothum.thodi-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2017-10-04 14:17 ` Marc Zyngier
[not found] ` <001729e8-7b34-0bb4-8af6-8af100661906-5wv7dgnIgG8@public.gmane.org>
2017-10-06 10:17 ` Shameerali Kolothum Thodi
2017-10-04 10:03 ` [PATCH v8 0/5] iommu/smmu-v3: Workaround for hisilicon 161010801 erratum(reserve HW MSI) Shameerali Kolothum Thodi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5c80f292-dc5d-a1c6-d7a0-df2a84cc77d1@arm.com \
--to=robin.murphy@arm.com \
--cc=devel@acpica.org \
--cc=devicetree@vger.kernel.org \
--cc=gabriele.paoloni@huawei.com \
--cc=guohanjun@huawei.com \
--cc=iommu@lists.linux-foundation.org \
--cc=john.garry@huawei.com \
--cc=joro@8bytes.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linuxarm@huawei.com \
--cc=lorenzo.pieralisi@arm.com \
--cc=marc.zyngier@arm.com \
--cc=mark.rutland@arm.com \
--cc=robh@kernel.org \
--cc=shameerali.kolothum.thodi@huawei.com \
--cc=sudeep.holla@arm.com \
--cc=wangzhou1@hisilicon.com \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).