aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2008-03-25 17:44:18 -0400
committerPaul Mackerras <paulus@samba.org>2008-03-25 17:44:18 -0400
commit54f53f2b94feb72622bec7a8563fc487d9f97720 (patch)
treeab0c4e1dcadd25a00fa7a4febf41bc43b864cf73 /lib
parentf61fb8a52cdf8b9b6a6badde84aefe58cb35d315 (diff)
parenta4083c9271e0a697278e089f2c0b9a95363ada0a (diff)
Merge branch 'linux-2.6'
Diffstat (limited to 'lib')
-rw-r--r--lib/devres.c25
-rw-r--r--lib/iomap.c2
-rw-r--r--lib/swiotlb.c30
3 files changed, 42 insertions, 15 deletions
diff --git a/lib/devres.c b/lib/devres.c
index b1d336ce7f3d..edc27a5d1b73 100644
--- a/lib/devres.c
+++ b/lib/devres.c
@@ -298,6 +298,31 @@ int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name)
298EXPORT_SYMBOL(pcim_iomap_regions); 298EXPORT_SYMBOL(pcim_iomap_regions);
299 299
300/** 300/**
301 * pcim_iomap_regions_request_all - Request all BARs and iomap specified ones
302 * @pdev: PCI device to map IO resources for
303 * @mask: Mask of BARs to iomap
304 * @name: Name used when requesting regions
305 *
306 * Request all PCI BARs and iomap regions specified by @mask.
307 */
308int pcim_iomap_regions_request_all(struct pci_dev *pdev, u16 mask,
309 const char *name)
310{
311 int request_mask = ((1 << 6) - 1) & ~mask;
312 int rc;
313
314 rc = pci_request_selected_regions(pdev, request_mask, name);
315 if (rc)
316 return rc;
317
318 rc = pcim_iomap_regions(pdev, mask, name);
319 if (rc)
320 pci_release_selected_regions(pdev, request_mask);
321 return rc;
322}
323EXPORT_SYMBOL(pcim_iomap_regions_request_all);
324
325/**
301 * pcim_iounmap_regions - Unmap and release PCI BARs 326 * pcim_iounmap_regions - Unmap and release PCI BARs
302 * @pdev: PCI device to map IO resources for 327 * @pdev: PCI device to map IO resources for
303 * @mask: Mask of BARs to unmap and release 328 * @mask: Mask of BARs to unmap and release
diff --git a/lib/iomap.c b/lib/iomap.c
index db004a9ff509..dd6ca48fe6b0 100644
--- a/lib/iomap.c
+++ b/lib/iomap.c
@@ -256,7 +256,7 @@ EXPORT_SYMBOL(ioport_unmap);
256 * */ 256 * */
257void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) 257void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
258{ 258{
259 unsigned long start = pci_resource_start(dev, bar); 259 resource_size_t start = pci_resource_start(dev, bar);
260 unsigned long len = pci_resource_len(dev, bar); 260 unsigned long len = pci_resource_len(dev, bar);
261 unsigned long flags = pci_resource_flags(dev, bar); 261 unsigned long flags = pci_resource_flags(dev, bar);
262 262
diff --git a/lib/swiotlb.c b/lib/swiotlb.c
index 4bb5a11e18a2..025922807e6e 100644
--- a/lib/swiotlb.c
+++ b/lib/swiotlb.c
@@ -310,7 +310,9 @@ map_single(struct device *hwdev, char *buffer, size_t size, int dir)
310 start_dma_addr = virt_to_bus(io_tlb_start) & mask; 310 start_dma_addr = virt_to_bus(io_tlb_start) & mask;
311 311
312 offset_slots = ALIGN(start_dma_addr, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT; 312 offset_slots = ALIGN(start_dma_addr, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT;
313 max_slots = ALIGN(mask + 1, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT; 313 max_slots = mask + 1
314 ? ALIGN(mask + 1, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT
315 : 1UL << (BITS_PER_LONG - IO_TLB_SHIFT);
314 316
315 /* 317 /*
316 * For mappings greater than a page, we limit the stride (and 318 * For mappings greater than a page, we limit the stride (and
@@ -333,16 +335,18 @@ map_single(struct device *hwdev, char *buffer, size_t size, int dir)
333 index = ALIGN(io_tlb_index, stride); 335 index = ALIGN(io_tlb_index, stride);
334 if (index >= io_tlb_nslabs) 336 if (index >= io_tlb_nslabs)
335 index = 0; 337 index = 0;
336
337 while (is_span_boundary(index, nslots, offset_slots,
338 max_slots)) {
339 index += stride;
340 if (index >= io_tlb_nslabs)
341 index = 0;
342 }
343 wrap = index; 338 wrap = index;
344 339
345 do { 340 do {
341 while (is_span_boundary(index, nslots, offset_slots,
342 max_slots)) {
343 index += stride;
344 if (index >= io_tlb_nslabs)
345 index = 0;
346 if (index == wrap)
347 goto not_found;
348 }
349
346 /* 350 /*
347 * If we find a slot that indicates we have 'nslots' 351 * If we find a slot that indicates we have 'nslots'
348 * number of contiguous buffers, we allocate the 352 * number of contiguous buffers, we allocate the
@@ -367,14 +371,12 @@ map_single(struct device *hwdev, char *buffer, size_t size, int dir)
367 371
368 goto found; 372 goto found;
369 } 373 }
370 do { 374 index += stride;
371 index += stride; 375 if (index >= io_tlb_nslabs)
372 if (index >= io_tlb_nslabs) 376 index = 0;
373 index = 0;
374 } while (is_span_boundary(index, nslots, offset_slots,
375 max_slots));
376 } while (index != wrap); 377 } while (index != wrap);
377 378
379 not_found:
378 spin_unlock_irqrestore(&io_tlb_lock, flags); 380 spin_unlock_irqrestore(&io_tlb_lock, flags);
379 return NULL; 381 return NULL;
380 } 382 }