Message ID | 1430505138-2877-7-git-send-email-wdavis@nvidia.com |
---|---|
State | Changes Requested |
Headers | show |
On Fri, May 01, 2015 at 01:32:18PM -0500, wdavis@nvidia.com wrote: > From: Will Davis <wdavis@nvidia.com> > > Simply pass through the physical address as the DMA address. > > Signed-off-by: Will Davis <wdavis@nvidia.com> > Reviewed-by: Terence Ripperda <tripperda@nvidia.com> > Reviewed-by: John Hubbard <jhubbard@nvidia.com> > --- > arch/x86/kernel/pci-nommu.c | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > diff --git a/arch/x86/kernel/pci-nommu.c b/arch/x86/kernel/pci-nommu.c > index da15918..6e9e66d 100644 > --- a/arch/x86/kernel/pci-nommu.c > +++ b/arch/x86/kernel/pci-nommu.c > @@ -38,6 +38,22 @@ static dma_addr_t nommu_map_page(struct device *dev, struct page *page, > return bus; > } > > +static dma_addr_t nommu_map_resource(struct device *dev, struct resource *res, > + unsigned long offset, size_t size, > + enum dma_data_direction dir, > + struct dma_attrs *attrs) > +{ > + dma_addr_t bus = res->start + offset; "res->start" is the CPU physical address, not the bus address. There is a pci_bus_address() interface to get the bus address. On many, but not all, x86 platforms the CPU physical address is identical to the PCI bus address. > + > + WARN_ON(size == 0); > + > + if (!check_addr("map_resource", dev, bus, size)) > + return DMA_ERROR_CODE; > + flush_write_buffers(); > + return bus; > +} > + > + > /* Map a set of buffers described by scatterlist in streaming > * mode for DMA. This is the scatter-gather version of the > * above pci_map_single interface. Here the scatter gather list > @@ -93,6 +109,7 @@ struct dma_map_ops nommu_dma_ops = { > .free = dma_generic_free_coherent, > .map_sg = nommu_map_sg, > .map_page = nommu_map_page, > + .map_resource = nommu_map_resource, > .sync_single_for_device = nommu_sync_single_for_device, > .sync_sg_for_device = nommu_sync_sg_for_device, > .is_phys = 1, > -- > 2.3.7 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-pci" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> -----Original Message----- > From: Bjorn Helgaas [mailto:bhelgaas@google.com] > Sent: Thursday, May 7, 2015 10:08 AM > To: William Davis > Cc: joro@8bytes.org; iommu@lists.linux-foundation.org; linux- > pci@vger.kernel.org; Terence Ripperda; John Hubbard; jglisse@redhat.com > Subject: Re: [PATCH 6/6] x86: add pci-nommu implementation of map_resource > > On Fri, May 01, 2015 at 01:32:18PM -0500, wdavis@nvidia.com wrote: > > From: Will Davis <wdavis@nvidia.com> > > > > diff --git a/arch/x86/kernel/pci-nommu.c b/arch/x86/kernel/pci-nommu.c > > index da15918..6e9e66d 100644 > > --- a/arch/x86/kernel/pci-nommu.c > > +++ b/arch/x86/kernel/pci-nommu.c > > @@ -38,6 +38,22 @@ static dma_addr_t nommu_map_page(struct device *dev, > struct page *page, > > return bus; > > } > > > > +static dma_addr_t nommu_map_resource(struct device *dev, struct resource > *res, > > + unsigned long offset, size_t size, > > + enum dma_data_direction dir, > > + struct dma_attrs *attrs) > > +{ > > + dma_addr_t bus = res->start + offset; > > "res->start" is the CPU physical address, not the bus address. There is a > pci_bus_address() interface to get the bus address. > > On many, but not all, x86 platforms the CPU physical address is identical > to the PCI bus address. > Thanks for pointing that out. Since we already have the resource here (and not the BAR index), I'll use pcibios_resource_to_bus(), as pci_bus_address() does. Thanks, Will -- nvpublic -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/x86/kernel/pci-nommu.c b/arch/x86/kernel/pci-nommu.c index da15918..6e9e66d 100644 --- a/arch/x86/kernel/pci-nommu.c +++ b/arch/x86/kernel/pci-nommu.c @@ -38,6 +38,22 @@ static dma_addr_t nommu_map_page(struct device *dev, struct page *page, return bus; } +static dma_addr_t nommu_map_resource(struct device *dev, struct resource *res, + unsigned long offset, size_t size, + enum dma_data_direction dir, + struct dma_attrs *attrs) +{ + dma_addr_t bus = res->start + offset; + + WARN_ON(size == 0); + + if (!check_addr("map_resource", dev, bus, size)) + return DMA_ERROR_CODE; + flush_write_buffers(); + return bus; +} + + /* Map a set of buffers described by scatterlist in streaming * mode for DMA. This is the scatter-gather version of the * above pci_map_single interface. Here the scatter gather list @@ -93,6 +109,7 @@ struct dma_map_ops nommu_dma_ops = { .free = dma_generic_free_coherent, .map_sg = nommu_map_sg, .map_page = nommu_map_page, + .map_resource = nommu_map_resource, .sync_single_for_device = nommu_sync_single_for_device, .sync_sg_for_device = nommu_sync_sg_for_device, .is_phys = 1,