Skip to content

Commit 8cb63b7

Browse files
Sebastian OttMartin Schwidefsky
authored andcommitted
s390/pci_dma: simplify dma address calculation
Simplify the code we use to calculate dma addresses by putting everything related in a dma_alloc_address function. Also provide a dma_free_address counterpart. Signed-off-by: Sebastian Ott <[email protected]> Reviewed-by: Gerald Schaefer <[email protected]> Signed-off-by: Martin Schwidefsky <[email protected]>
1 parent 3b13f1f commit 8cb63b7

File tree

1 file changed

+18
-19
lines changed

1 file changed

+18
-19
lines changed

arch/s390/pci/pci_dma.c

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -230,34 +230,36 @@ static unsigned long __dma_alloc_iommu(struct device *dev,
230230
boundary_size, 0);
231231
}
232232

233-
static unsigned long dma_alloc_iommu(struct device *dev, int size)
233+
static dma_addr_t dma_alloc_address(struct device *dev, int size)
234234
{
235235
struct zpci_dev *zdev = to_zpci(to_pci_dev(dev));
236236
unsigned long offset, flags;
237-
int wrap = 0;
238237

239238
spin_lock_irqsave(&zdev->iommu_bitmap_lock, flags);
240239
offset = __dma_alloc_iommu(dev, zdev->next_bit, size);
241240
if (offset == -1) {
242241
/* wrap-around */
243242
offset = __dma_alloc_iommu(dev, 0, size);
244-
wrap = 1;
245-
}
246-
247-
if (offset != -1) {
248-
zdev->next_bit = offset + size;
249-
if (!zdev->tlb_refresh && !s390_iommu_strict && wrap)
243+
if (offset == -1) {
244+
spin_unlock_irqrestore(&zdev->iommu_bitmap_lock, flags);
245+
return DMA_ERROR_CODE;
246+
}
247+
if (!zdev->tlb_refresh && !s390_iommu_strict)
250248
/* global flush after wrap-around with lazy unmap */
251249
zpci_refresh_global(zdev);
252250
}
251+
zdev->next_bit = offset + size;
253252
spin_unlock_irqrestore(&zdev->iommu_bitmap_lock, flags);
254-
return offset;
253+
254+
return zdev->start_dma + offset * PAGE_SIZE;
255255
}
256256

257-
static void dma_free_iommu(struct device *dev, unsigned long offset, int size)
257+
static void dma_free_address(struct device *dev, dma_addr_t dma_addr, int size)
258258
{
259259
struct zpci_dev *zdev = to_zpci(to_pci_dev(dev));
260-
unsigned long flags;
260+
unsigned long flags, offset;
261+
262+
offset = (dma_addr - zdev->start_dma) >> PAGE_SHIFT;
261263

262264
spin_lock_irqsave(&zdev->iommu_bitmap_lock, flags);
263265
if (!zdev->iommu_bitmap)
@@ -289,23 +291,22 @@ static dma_addr_t s390_dma_map_pages(struct device *dev, struct page *page,
289291
unsigned long attrs)
290292
{
291293
struct zpci_dev *zdev = to_zpci(to_pci_dev(dev));
292-
unsigned long nr_pages, iommu_page_index;
293294
unsigned long pa = page_to_phys(page) + offset;
294295
int flags = ZPCI_PTE_VALID;
296+
unsigned long nr_pages;
295297
dma_addr_t dma_addr;
296298
int ret;
297299

298300
/* This rounds up number of pages based on size and offset */
299301
nr_pages = iommu_num_pages(pa, size, PAGE_SIZE);
300-
iommu_page_index = dma_alloc_iommu(dev, nr_pages);
301-
if (iommu_page_index == -1) {
302+
dma_addr = dma_alloc_address(dev, nr_pages);
303+
if (dma_addr == DMA_ERROR_CODE) {
302304
ret = -ENOSPC;
303305
goto out_err;
304306
}
305307

306308
/* Use rounded up size */
307309
size = nr_pages * PAGE_SIZE;
308-
dma_addr = zdev->start_dma + iommu_page_index * PAGE_SIZE;
309310

310311
if (direction == DMA_NONE || direction == DMA_TO_DEVICE)
311312
flags |= ZPCI_TABLE_PROTECTED;
@@ -318,7 +319,7 @@ static dma_addr_t s390_dma_map_pages(struct device *dev, struct page *page,
318319
return dma_addr + (offset & ~PAGE_MASK);
319320

320321
out_free:
321-
dma_free_iommu(dev, iommu_page_index, nr_pages);
322+
dma_free_address(dev, dma_addr, nr_pages);
322323
out_err:
323324
zpci_err("map error:\n");
324325
zpci_err_dma(ret, pa);
@@ -330,7 +331,6 @@ static void s390_dma_unmap_pages(struct device *dev, dma_addr_t dma_addr,
330331
unsigned long attrs)
331332
{
332333
struct zpci_dev *zdev = to_zpci(to_pci_dev(dev));
333-
unsigned long iommu_page_index;
334334
int npages, ret;
335335

336336
npages = iommu_num_pages(dma_addr, size, PAGE_SIZE);
@@ -344,8 +344,7 @@ static void s390_dma_unmap_pages(struct device *dev, dma_addr_t dma_addr,
344344
}
345345

346346
atomic64_add(npages, &zdev->unmapped_pages);
347-
iommu_page_index = (dma_addr - zdev->start_dma) >> PAGE_SHIFT;
348-
dma_free_iommu(dev, iommu_page_index, npages);
347+
dma_free_address(dev, dma_addr, npages);
349348
}
350349

351350
static void *s390_dma_alloc(struct device *dev, size_t size,

0 commit comments

Comments
 (0)