Commit fcacc8a6 authored by Martin Oliveira's avatar Martin Oliveira Committed by Christoph Hellwig

x86/amd_gart: return error code from gart_map_sg()

The .map_sg() op now expects an error code instead of zero on failure.

So make __dma_map_cont() return a valid errno (which is then propagated
to gart_map_sg() via dma_map_cont()) and return it in case of failure.

Also, return -EINVAL in case of invalid nents.
Signed-off-by: default avatarMartin Oliveira <martin.oliveira@eideticom.com>
Signed-off-by: default avatarLogan Gunthorpe <logang@deltatee.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Niklas Schnelle <schnelle@linux.ibm.com>
Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 2c647ebe
...@@ -331,7 +331,7 @@ static int __dma_map_cont(struct device *dev, struct scatterlist *start, ...@@ -331,7 +331,7 @@ static int __dma_map_cont(struct device *dev, struct scatterlist *start,
int i; int i;
if (iommu_start == -1) if (iommu_start == -1)
return -1; return -ENOMEM;
for_each_sg(start, s, nelems, i) { for_each_sg(start, s, nelems, i) {
unsigned long pages, addr; unsigned long pages, addr;
...@@ -380,13 +380,13 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents, ...@@ -380,13 +380,13 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
enum dma_data_direction dir, unsigned long attrs) enum dma_data_direction dir, unsigned long attrs)
{ {
struct scatterlist *s, *ps, *start_sg, *sgmap; struct scatterlist *s, *ps, *start_sg, *sgmap;
int need = 0, nextneed, i, out, start; int need = 0, nextneed, i, out, start, ret;
unsigned long pages = 0; unsigned long pages = 0;
unsigned int seg_size; unsigned int seg_size;
unsigned int max_seg_size; unsigned int max_seg_size;
if (nents == 0) if (nents == 0)
return 0; return -EINVAL;
out = 0; out = 0;
start = 0; start = 0;
...@@ -414,8 +414,9 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents, ...@@ -414,8 +414,9 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
if (!iommu_merge || !nextneed || !need || s->offset || if (!iommu_merge || !nextneed || !need || s->offset ||
(s->length + seg_size > max_seg_size) || (s->length + seg_size > max_seg_size) ||
(ps->offset + ps->length) % PAGE_SIZE) { (ps->offset + ps->length) % PAGE_SIZE) {
if (dma_map_cont(dev, start_sg, i - start, ret = dma_map_cont(dev, start_sg, i - start,
sgmap, pages, need) < 0) sgmap, pages, need);
if (ret < 0)
goto error; goto error;
out++; out++;
...@@ -432,7 +433,8 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents, ...@@ -432,7 +433,8 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
pages += iommu_num_pages(s->offset, s->length, PAGE_SIZE); pages += iommu_num_pages(s->offset, s->length, PAGE_SIZE);
ps = s; ps = s;
} }
if (dma_map_cont(dev, start_sg, i - start, sgmap, pages, need) < 0) ret = dma_map_cont(dev, start_sg, i - start, sgmap, pages, need);
if (ret < 0)
goto error; goto error;
out++; out++;
flush_gart(); flush_gart();
...@@ -458,7 +460,7 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents, ...@@ -458,7 +460,7 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
iommu_full(dev, pages << PAGE_SHIFT, dir); iommu_full(dev, pages << PAGE_SHIFT, dir);
for_each_sg(sg, s, nents, i) for_each_sg(sg, s, nents, i)
s->dma_address = DMA_MAPPING_ERROR; s->dma_address = DMA_MAPPING_ERROR;
return 0; return ret;
} }
/* allocate and map a coherent mapping */ /* allocate and map a coherent mapping */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment