aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYinghai Lu <yinghai@kernel.org>2015-05-27 20:23:51 -0400
committerBjorn Helgaas <bhelgaas@google.com>2015-05-29 18:21:45 -0400
commit3a9ad0b4fdcd57f775d3615004c8c64c021a9e7d (patch)
treece73733e771a149737b0c5dcf3c32f10e7d3fb31
parent5ebe6afaf0057ac3eaeb98defd5456894b446d22 (diff)
PCI: Add pci_bus_addr_t
David Ahern reported that d63e2e1f3df9 ("sparc/PCI: Clip bridge windows to fit in upstream windows") fails to boot on sparc/T5-8: pci 0000:06:00.0: reg 0x184: can't handle BAR above 4GB (bus address 0x110204000) The problem is that sparc64 assumed that dma_addr_t only needed to hold DMA addresses, i.e., bus addresses returned via the DMA API (dma_map_single(), etc.), while the PCI core assumed dma_addr_t could hold *any* bus address, including raw BAR values. On sparc64, all DMA addresses fit in 32 bits, so dma_addr_t is a 32-bit type. However, BAR values can be 64 bits wide, so they don't fit in a dma_addr_t. d63e2e1f3df9 added new checking that tripped over this mismatch. Add pci_bus_addr_t, which is wide enough to hold any PCI bus address, including both raw BAR values and DMA addresses. This will be 64 bits on 64-bit platforms and on platforms with a 64-bit dma_addr_t. Then dma_addr_t only needs to be wide enough to hold addresses from the DMA API. [bhelgaas: changelog, bugzilla, Kconfig to ensure pci_bus_addr_t is at least as wide as dma_addr_t, documentation] Fixes: d63e2e1f3df9 ("sparc/PCI: Clip bridge windows to fit in upstream windows") Fixes: 23b13bc76f35 ("PCI: Fail safely if we can't handle BARs larger than 4GB") Link: http://lkml.kernel.org/r/CAE9FiQU1gJY1LYrxs+ma5LCTEEe4xmtjRG0aXJ9K_Tsu+m9Wuw@mail.gmail.com Link: http://lkml.kernel.org/r/1427857069-6789-1-git-send-email-yinghai@kernel.org Link: https://bugzilla.kernel.org/show_bug.cgi?id=96231 Reported-by: David Ahern <david.ahern@oracle.com> Tested-by: David Ahern <david.ahern@oracle.com> Signed-off-by: Yinghai Lu <yinghai@kernel.org> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: David S. Miller <davem@davemloft.net> CC: stable@vger.kernel.org # v3.19+
-rw-r--r--Documentation/DMA-API-HOWTO.txt29
-rw-r--r--Documentation/DMA-API.txt30
-rw-r--r--drivers/pci/Kconfig4
-rw-r--r--drivers/pci/bus.c10
-rw-r--r--drivers/pci/probe.c12
-rw-r--r--include/linux/pci.h12
-rw-r--r--include/linux/types.h12
7 files changed, 66 insertions, 43 deletions
diff --git a/Documentation/DMA-API-HOWTO.txt b/Documentation/DMA-API-HOWTO.txt
index 0f7afb2bb442..aef8cc5a677b 100644
--- a/Documentation/DMA-API-HOWTO.txt
+++ b/Documentation/DMA-API-HOWTO.txt
@@ -25,13 +25,18 @@ physical addresses. These are the addresses in /proc/iomem. The physical
25address is not directly useful to a driver; it must use ioremap() to map 25address is not directly useful to a driver; it must use ioremap() to map
26the space and produce a virtual address. 26the space and produce a virtual address.
27 27
28I/O devices use a third kind of address: a "bus address" or "DMA address". 28I/O devices use a third kind of address: a "bus address". If a device has
29If a device has registers at an MMIO address, or if it performs DMA to read 29registers at an MMIO address, or if it performs DMA to read or write system
30or write system memory, the addresses used by the device are bus addresses. 30memory, the addresses used by the device are bus addresses. In some
31In some systems, bus addresses are identical to CPU physical addresses, but 31systems, bus addresses are identical to CPU physical addresses, but in
32in general they are not. IOMMUs and host bridges can produce arbitrary 32general they are not. IOMMUs and host bridges can produce arbitrary
33mappings between physical and bus addresses. 33mappings between physical and bus addresses.
34 34
35From a device's point of view, DMA uses the bus address space, but it may
36be restricted to a subset of that space. For example, even if a system
37supports 64-bit addresses for main memory and PCI BARs, it may use an IOMMU
38so devices only need to use 32-bit DMA addresses.
39
35Here's a picture and some examples: 40Here's a picture and some examples:
36 41
37 CPU CPU Bus 42 CPU CPU Bus
@@ -72,11 +77,11 @@ can use virtual address X to access the buffer, but the device itself
72cannot because DMA doesn't go through the CPU virtual memory system. 77cannot because DMA doesn't go through the CPU virtual memory system.
73 78
74In some simple systems, the device can do DMA directly to physical address 79In some simple systems, the device can do DMA directly to physical address
75Y. But in many others, there is IOMMU hardware that translates bus 80Y. But in many others, there is IOMMU hardware that translates DMA
76addresses to physical addresses, e.g., it translates Z to Y. This is part 81addresses to physical addresses, e.g., it translates Z to Y. This is part
77of the reason for the DMA API: the driver can give a virtual address X to 82of the reason for the DMA API: the driver can give a virtual address X to
78an interface like dma_map_single(), which sets up any required IOMMU 83an interface like dma_map_single(), which sets up any required IOMMU
79mapping and returns the bus address Z. The driver then tells the device to 84mapping and returns the DMA address Z. The driver then tells the device to
80do DMA to Z, and the IOMMU maps it to the buffer at address Y in system 85do DMA to Z, and the IOMMU maps it to the buffer at address Y in system
81RAM. 86RAM.
82 87
@@ -98,7 +103,7 @@ First of all, you should make sure
98#include <linux/dma-mapping.h> 103#include <linux/dma-mapping.h>
99 104
100is in your driver, which provides the definition of dma_addr_t. This type 105is in your driver, which provides the definition of dma_addr_t. This type
101can hold any valid DMA or bus address for the platform and should be used 106can hold any valid DMA address for the platform and should be used
102everywhere you hold a DMA address returned from the DMA mapping functions. 107everywhere you hold a DMA address returned from the DMA mapping functions.
103 108
104 What memory is DMA'able? 109 What memory is DMA'able?
@@ -316,7 +321,7 @@ There are two types of DMA mappings:
316 Think of "consistent" as "synchronous" or "coherent". 321 Think of "consistent" as "synchronous" or "coherent".
317 322
318 The current default is to return consistent memory in the low 32 323 The current default is to return consistent memory in the low 32
319 bits of the bus space. However, for future compatibility you should 324 bits of the DMA space. However, for future compatibility you should
320 set the consistent mask even if this default is fine for your 325 set the consistent mask even if this default is fine for your
321 driver. 326 driver.
322 327
@@ -403,7 +408,7 @@ dma_alloc_coherent() returns two values: the virtual address which you
403can use to access it from the CPU and dma_handle which you pass to the 408can use to access it from the CPU and dma_handle which you pass to the
404card. 409card.
405 410
406The CPU virtual address and the DMA bus address are both 411The CPU virtual address and the DMA address are both
407guaranteed to be aligned to the smallest PAGE_SIZE order which 412guaranteed to be aligned to the smallest PAGE_SIZE order which
408is greater than or equal to the requested size. This invariant 413is greater than or equal to the requested size. This invariant
409exists (for example) to guarantee that if you allocate a chunk 414exists (for example) to guarantee that if you allocate a chunk
@@ -645,8 +650,8 @@ PLEASE NOTE: The 'nents' argument to the dma_unmap_sg call must be
645 dma_map_sg call. 650 dma_map_sg call.
646 651
647Every dma_map_{single,sg}() call should have its dma_unmap_{single,sg}() 652Every dma_map_{single,sg}() call should have its dma_unmap_{single,sg}()
648counterpart, because the bus address space is a shared resource and 653counterpart, because the DMA address space is a shared resource and
649you could render the machine unusable by consuming all bus addresses. 654you could render the machine unusable by consuming all DMA addresses.
650 655
651If you need to use the same streaming DMA region multiple times and touch 656If you need to use the same streaming DMA region multiple times and touch
652the data in between the DMA transfers, the buffer needs to be synced 657the data in between the DMA transfers, the buffer needs to be synced
diff --git a/Documentation/DMA-API.txt b/Documentation/DMA-API.txt
index 52088408668a..7eba542eff7c 100644
--- a/Documentation/DMA-API.txt
+++ b/Documentation/DMA-API.txt
@@ -18,10 +18,10 @@ Part I - dma_ API
18To get the dma_ API, you must #include <linux/dma-mapping.h>. This 18To get the dma_ API, you must #include <linux/dma-mapping.h>. This
19provides dma_addr_t and the interfaces described below. 19provides dma_addr_t and the interfaces described below.
20 20
21A dma_addr_t can hold any valid DMA or bus address for the platform. It 21A dma_addr_t can hold any valid DMA address for the platform. It can be
22can be given to a device to use as a DMA source or target. A CPU cannot 22given to a device to use as a DMA source or target. A CPU cannot reference
23reference a dma_addr_t directly because there may be translation between 23a dma_addr_t directly because there may be translation between its physical
24its physical address space and the bus address space. 24address space and the DMA address space.
25 25
26Part Ia - Using large DMA-coherent buffers 26Part Ia - Using large DMA-coherent buffers
27------------------------------------------ 27------------------------------------------
@@ -42,7 +42,7 @@ It returns a pointer to the allocated region (in the processor's virtual
42address space) or NULL if the allocation failed. 42address space) or NULL if the allocation failed.
43 43
44It also returns a <dma_handle> which may be cast to an unsigned integer the 44It also returns a <dma_handle> which may be cast to an unsigned integer the
45same width as the bus and given to the device as the bus address base of 45same width as the bus and given to the device as the DMA address base of
46the region. 46the region.
47 47
48Note: consistent memory can be expensive on some platforms, and the 48Note: consistent memory can be expensive on some platforms, and the
@@ -193,7 +193,7 @@ dma_map_single(struct device *dev, void *cpu_addr, size_t size,
193 enum dma_data_direction direction) 193 enum dma_data_direction direction)
194 194
195Maps a piece of processor virtual memory so it can be accessed by the 195Maps a piece of processor virtual memory so it can be accessed by the
196device and returns the bus address of the memory. 196device and returns the DMA address of the memory.
197 197
198The direction for both APIs may be converted freely by casting. 198The direction for both APIs may be converted freely by casting.
199However the dma_ API uses a strongly typed enumerator for its 199However the dma_ API uses a strongly typed enumerator for its
@@ -212,20 +212,20 @@ contiguous piece of memory. For this reason, memory to be mapped by
212this API should be obtained from sources which guarantee it to be 212this API should be obtained from sources which guarantee it to be
213physically contiguous (like kmalloc). 213physically contiguous (like kmalloc).
214 214
215Further, the bus address of the memory must be within the 215Further, the DMA address of the memory must be within the
216dma_mask of the device (the dma_mask is a bit mask of the 216dma_mask of the device (the dma_mask is a bit mask of the
217addressable region for the device, i.e., if the bus address of 217addressable region for the device, i.e., if the DMA address of
218the memory ANDed with the dma_mask is still equal to the bus 218the memory ANDed with the dma_mask is still equal to the DMA
219address, then the device can perform DMA to the memory). To 219address, then the device can perform DMA to the memory). To
220ensure that the memory allocated by kmalloc is within the dma_mask, 220ensure that the memory allocated by kmalloc is within the dma_mask,
221the driver may specify various platform-dependent flags to restrict 221the driver may specify various platform-dependent flags to restrict
222the bus address range of the allocation (e.g., on x86, GFP_DMA 222the DMA address range of the allocation (e.g., on x86, GFP_DMA
223guarantees to be within the first 16MB of available bus addresses, 223guarantees to be within the first 16MB of available DMA addresses,
224as required by ISA devices). 224as required by ISA devices).
225 225
226Note also that the above constraints on physical contiguity and 226Note also that the above constraints on physical contiguity and
227dma_mask may not apply if the platform has an IOMMU (a device which 227dma_mask may not apply if the platform has an IOMMU (a device which
228maps an I/O bus address to a physical memory address). However, to be 228maps an I/O DMA address to a physical memory address). However, to be
229portable, device driver writers may *not* assume that such an IOMMU 229portable, device driver writers may *not* assume that such an IOMMU
230exists. 230exists.
231 231
@@ -296,7 +296,7 @@ reduce current DMA mapping usage or delay and try again later).
296 dma_map_sg(struct device *dev, struct scatterlist *sg, 296 dma_map_sg(struct device *dev, struct scatterlist *sg,
297 int nents, enum dma_data_direction direction) 297 int nents, enum dma_data_direction direction)
298 298
299Returns: the number of bus address segments mapped (this may be shorter 299Returns: the number of DMA address segments mapped (this may be shorter
300than <nents> passed in if some elements of the scatter/gather list are 300than <nents> passed in if some elements of the scatter/gather list are
301physically or virtually adjacent and an IOMMU maps them with a single 301physically or virtually adjacent and an IOMMU maps them with a single
302entry). 302entry).
@@ -340,7 +340,7 @@ must be the same as those and passed in to the scatter/gather mapping
340API. 340API.
341 341
342Note: <nents> must be the number you passed in, *not* the number of 342Note: <nents> must be the number you passed in, *not* the number of
343bus address entries returned. 343DMA address entries returned.
344 344
345void 345void
346dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, 346dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
@@ -507,7 +507,7 @@ it's asked for coherent memory for this device.
507phys_addr is the CPU physical address to which the memory is currently 507phys_addr is the CPU physical address to which the memory is currently
508assigned (this will be ioremapped so the CPU can access the region). 508assigned (this will be ioremapped so the CPU can access the region).
509 509
510device_addr is the bus address the device needs to be programmed 510device_addr is the DMA address the device needs to be programmed
511with to actually address this memory (this will be handed out as the 511with to actually address this memory (this will be handed out as the
512dma_addr_t in dma_alloc_coherent()). 512dma_addr_t in dma_alloc_coherent()).
513 513
diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
index 7a8f1c5e65af..73de4efcbe6e 100644
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -1,6 +1,10 @@
1# 1#
2# PCI configuration 2# PCI configuration
3# 3#
4config PCI_BUS_ADDR_T_64BIT
5 def_bool y if (ARCH_DMA_ADDR_T_64BIT || 64BIT)
6 depends on PCI
7
4config PCI_MSI 8config PCI_MSI
5 bool "Message Signaled Interrupts (MSI and MSI-X)" 9 bool "Message Signaled Interrupts (MSI and MSI-X)"
6 depends on PCI 10 depends on PCI
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c
index 90fa3a78fb7c..6fbd3f2b5992 100644
--- a/drivers/pci/bus.c
+++ b/drivers/pci/bus.c
@@ -92,11 +92,11 @@ void pci_bus_remove_resources(struct pci_bus *bus)
92} 92}
93 93
94static struct pci_bus_region pci_32_bit = {0, 0xffffffffULL}; 94static struct pci_bus_region pci_32_bit = {0, 0xffffffffULL};
95#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT 95#ifdef CONFIG_PCI_BUS_ADDR_T_64BIT
96static struct pci_bus_region pci_64_bit = {0, 96static struct pci_bus_region pci_64_bit = {0,
97 (dma_addr_t) 0xffffffffffffffffULL}; 97 (pci_bus_addr_t) 0xffffffffffffffffULL};
98static struct pci_bus_region pci_high = {(dma_addr_t) 0x100000000ULL, 98static struct pci_bus_region pci_high = {(pci_bus_addr_t) 0x100000000ULL,
99 (dma_addr_t) 0xffffffffffffffffULL}; 99 (pci_bus_addr_t) 0xffffffffffffffffULL};
100#endif 100#endif
101 101
102/* 102/*
@@ -200,7 +200,7 @@ int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
200 resource_size_t), 200 resource_size_t),
201 void *alignf_data) 201 void *alignf_data)
202{ 202{
203#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT 203#ifdef CONFIG_PCI_BUS_ADDR_T_64BIT
204 int rc; 204 int rc;
205 205
206 if (res->flags & IORESOURCE_MEM_64) { 206 if (res->flags & IORESOURCE_MEM_64) {
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 6675a7a1b9fc..c91185721345 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -254,8 +254,8 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
254 } 254 }
255 255
256 if (res->flags & IORESOURCE_MEM_64) { 256 if (res->flags & IORESOURCE_MEM_64) {
257 if ((sizeof(dma_addr_t) < 8 || sizeof(resource_size_t) < 8) && 257 if ((sizeof(pci_bus_addr_t) < 8 || sizeof(resource_size_t) < 8)
258 sz64 > 0x100000000ULL) { 258 && sz64 > 0x100000000ULL) {
259 res->flags |= IORESOURCE_UNSET | IORESOURCE_DISABLED; 259 res->flags |= IORESOURCE_UNSET | IORESOURCE_DISABLED;
260 res->start = 0; 260 res->start = 0;
261 res->end = 0; 261 res->end = 0;
@@ -264,7 +264,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
264 goto out; 264 goto out;
265 } 265 }
266 266
267 if ((sizeof(dma_addr_t) < 8) && l) { 267 if ((sizeof(pci_bus_addr_t) < 8) && l) {
268 /* Above 32-bit boundary; try to reallocate */ 268 /* Above 32-bit boundary; try to reallocate */
269 res->flags |= IORESOURCE_UNSET; 269 res->flags |= IORESOURCE_UNSET;
270 res->start = 0; 270 res->start = 0;
@@ -399,7 +399,7 @@ static void pci_read_bridge_mmio_pref(struct pci_bus *child)
399 struct pci_dev *dev = child->self; 399 struct pci_dev *dev = child->self;
400 u16 mem_base_lo, mem_limit_lo; 400 u16 mem_base_lo, mem_limit_lo;
401 u64 base64, limit64; 401 u64 base64, limit64;
402 dma_addr_t base, limit; 402 pci_bus_addr_t base, limit;
403 struct pci_bus_region region; 403 struct pci_bus_region region;
404 struct resource *res; 404 struct resource *res;
405 405
@@ -426,8 +426,8 @@ static void pci_read_bridge_mmio_pref(struct pci_bus *child)
426 } 426 }
427 } 427 }
428 428
429 base = (dma_addr_t) base64; 429 base = (pci_bus_addr_t) base64;
430 limit = (dma_addr_t) limit64; 430 limit = (pci_bus_addr_t) limit64;
431 431
432 if (base != base64) { 432 if (base != base64) {
433 dev_err(&dev->dev, "can't handle bridge window above 4GB (bus address %#010llx)\n", 433 dev_err(&dev->dev, "can't handle bridge window above 4GB (bus address %#010llx)\n",
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 353db8dc4c6e..956f74bad37a 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -577,9 +577,15 @@ int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn,
577int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn, 577int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn,
578 int reg, int len, u32 val); 578 int reg, int len, u32 val);
579 579
580#ifdef CONFIG_PCI_BUS_ADDR_T_64BIT
581typedef u64 pci_bus_addr_t;
582#else
583typedef u32 pci_bus_addr_t;
584#endif
585
580struct pci_bus_region { 586struct pci_bus_region {
581 dma_addr_t start; 587 pci_bus_addr_t start;
582 dma_addr_t end; 588 pci_bus_addr_t end;
583}; 589};
584 590
585struct pci_dynids { 591struct pci_dynids {
@@ -1128,7 +1134,7 @@ int __must_check pci_bus_alloc_resource(struct pci_bus *bus,
1128 1134
1129int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr); 1135int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr);
1130 1136
1131static inline dma_addr_t pci_bus_address(struct pci_dev *pdev, int bar) 1137static inline pci_bus_addr_t pci_bus_address(struct pci_dev *pdev, int bar)
1132{ 1138{
1133 struct pci_bus_region region; 1139 struct pci_bus_region region;
1134 1140
diff --git a/include/linux/types.h b/include/linux/types.h
index 59698be03490..8715287c3b1f 100644
--- a/include/linux/types.h
+++ b/include/linux/types.h
@@ -139,12 +139,20 @@ typedef unsigned long blkcnt_t;
139 */ 139 */
140#define pgoff_t unsigned long 140#define pgoff_t unsigned long
141 141
142/* A dma_addr_t can hold any valid DMA or bus address for the platform */ 142/*
143 * A dma_addr_t can hold any valid DMA address, i.e., any address returned
144 * by the DMA API.
145 *
146 * If the DMA API only uses 32-bit addresses, dma_addr_t need only be 32
147 * bits wide. Bus addresses, e.g., PCI BARs, may be wider than 32 bits,
148 * but drivers do memory-mapped I/O to ioremapped kernel virtual addresses,
149 * so they don't care about the size of the actual bus addresses.
150 */
143#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT 151#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
144typedef u64 dma_addr_t; 152typedef u64 dma_addr_t;
145#else 153#else
146typedef u32 dma_addr_t; 154typedef u32 dma_addr_t;
147#endif /* dma_addr_t */ 155#endif
148 156
149typedef unsigned __bitwise__ gfp_t; 157typedef unsigned __bitwise__ gfp_t;
150typedef unsigned __bitwise__ fmode_t; 158typedef unsigned __bitwise__ fmode_t;