From: Joerg Roedel <joro@8bytes.org>
To: Bjorn Helgaas <helgaas@kernel.org>
Cc: David Woodhouse <dwmw2@infradead.org>,
rwright@hpe.com, iommu@lists.linux-foundation.org,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: possible dmar_init_reserved_ranges() error
Date: Thu, 22 Dec 2016 17:27:14 +0100 [thread overview]
Message-ID: <20161222162713.GF17255@8bytes.org> (raw)
In-Reply-To: <20161219212044.GA21774@bhelgaas-glaptop.roam.corp.google.com>
Hi Bjorn,
On Mon, Dec 19, 2016 at 03:20:44PM -0600, Bjorn Helgaas wrote:
> I have some questions about dmar_init_reserved_ranges(). On systems
> where CPU physical address space is not identity-mapped to PCI bus
> address space, e.g., where the PCI host bridge windows have _TRA
> offsets, I'm not sure we're doing the right thing.
>
> Assume we have a PCI host bridge with _TRA that maps CPU addresses
> 0x80000000-0x9fffffff to PCI bus addresses 0x00000000-0x1fffffff, with
> two PCI devices below it:
>
> PCI host bridge domain 0000 [bus 00-3f]
> PCI host bridge window [mem 0x80000000-0x9fffffff] (bus 0x00000000-0x1fffffff]
> 00:00.0: BAR 0 [mem 0x80000000-0x8ffffffff] (0x00000000-0x0fffffff on bus)
> 00:01.0: BAR 0 [mem 0x90000000-0x9ffffffff] (0x10000000-0x1fffffff on bus)
>
> The IOMMU init code in dmar_init_reserved_ranges() reserves the PCI
> MMIO space for all devices:
>
> pci_iommu_init()
> intel_iommu_init()
> dmar_init_reserved_ranges()
> reserve_iova(0x80000000-0x8ffffffff)
> reserve_iova(0x90000000-0x9ffffffff)
>
> This looks odd because we're reserving CPU physical addresses, but
> the IOVA space contains *PCI bus* addresses. On most x86 systems they
> would be the same, but not on all.
Interesting, I wasn't aware of that. Looks like we are not doing the
right thing in dmar_init_reserved_ranges(). How is that handled without
an IOMMU, when the bus-addresses overlap with ram addresses?
> Assume the driver for 00:00.0 maps a page of main memory for DMA. It
> may receive a dma_addr_t of 0x10000000:
>
> 00:00.0: intel_map_page() returns dma_addr_t 0x10000000
> 00:00.0: issues DMA to 0x10000000
>
> What happens here? The DMA access should go to main memory. In
> conventional PCI it would be a peer-to-peer access to device 00:01.0.
> Is there enough PCIe smarts (ACS or something?) to do otherwise?
If there is a bridge doing ACS between the devices, the IOMMU will see
the request and re-map it to its RAM address.
> The dmar_init_reserved_ranges() comment says "Reserve all PCI MMIO to
> avoid peer-to-peer access." Without _TRA, CPU addresses and PCI bus
> addresses would be identical, and I think these reserve_iova() calls
> *would* prevent this situation. So maybe we're just missing a
> pcibios_resource_to_bus() here?
I'll have a look, the AMD IOMMU driver implements this too, so it needs
also be fixed there. Do you know which x86 systems are configured like
this?
Joerg
next prev parent reply other threads:[~2016-12-22 16:27 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-19 21:20 possible dmar_init_reserved_ranges() error Bjorn Helgaas
2016-12-22 16:27 ` Joerg Roedel [this message]
2016-12-22 20:28 ` Bjorn Helgaas
2016-12-22 23:32 ` Raj, Ashok
2016-12-22 23:45 ` Raj, Ashok
2016-12-23 0:48 ` Bjorn Helgaas
2016-12-23 10:35 ` Joerg Roedel
2016-12-27 23:44 ` Bjorn Helgaas
2016-12-28 3:21 ` Raj, Ashok
2017-01-04 14:39 ` Joerg Roedel
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=20161222162713.GF17255@8bytes.org \
--to=joro@8bytes.org \
--cc=dwmw2@infradead.org \
--cc=helgaas@kernel.org \
--cc=iommu@lists.linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=rwright@hpe.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).