Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 112616
b: refs/heads/master
c: 832a90c
h: refs/heads/master
v: v3
  • Loading branch information
Joerg Roedel authored and Ingo Molnar committed Sep 19, 2008
1 parent 668d87e commit 0a7b110
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: bbd001c73cb92aa8f779ae44bb89d8a5dee74ad5
refs/heads/master: 832a90c30485117d65180cc9a8d9869c1b158570
29 changes: 22 additions & 7 deletions trunk/arch/x86/kernel/amd_iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -483,9 +483,10 @@ static unsigned long dma_mask_to_pages(unsigned long mask)
static unsigned long dma_ops_alloc_addresses(struct device *dev,
struct dma_ops_domain *dom,
unsigned int pages,
unsigned long align_mask)
unsigned long align_mask,
u64 dma_mask)
{
unsigned long limit = dma_mask_to_pages(*dev->dma_mask);
unsigned long limit = dma_mask_to_pages(dma_mask);
unsigned long address;
unsigned long size = dom->aperture_size >> PAGE_SHIFT;
unsigned long boundary_size;
Expand Down Expand Up @@ -919,7 +920,8 @@ static dma_addr_t __map_single(struct device *dev,
phys_addr_t paddr,
size_t size,
int dir,
bool align)
bool align,
u64 dma_mask)
{
dma_addr_t offset = paddr & ~PAGE_MASK;
dma_addr_t address, start;
Expand All @@ -933,7 +935,8 @@ static dma_addr_t __map_single(struct device *dev,
if (align)
align_mask = (1UL << get_order(size)) - 1;

address = dma_ops_alloc_addresses(dev, dma_dom, pages, align_mask);
address = dma_ops_alloc_addresses(dev, dma_dom, pages, align_mask,
dma_mask);
if (unlikely(address == bad_dma_address))
goto out;

Expand Down Expand Up @@ -997,18 +1000,22 @@ static dma_addr_t map_single(struct device *dev, phys_addr_t paddr,
struct protection_domain *domain;
u16 devid;
dma_addr_t addr;
u64 dma_mask;

if (!check_device(dev))
return bad_dma_address;

dma_mask = *dev->dma_mask;

get_device_resources(dev, &iommu, &domain, &devid);

if (iommu == NULL || domain == NULL)
/* device not handled by any AMD IOMMU */
return (dma_addr_t)paddr;

spin_lock_irqsave(&domain->lock, flags);
addr = __map_single(dev, iommu, domain->priv, paddr, size, dir, false);
addr = __map_single(dev, iommu, domain->priv, paddr, size, dir, false,
dma_mask);
if (addr == bad_dma_address)
goto out;

Expand Down Expand Up @@ -1080,10 +1087,13 @@ static int map_sg(struct device *dev, struct scatterlist *sglist,
struct scatterlist *s;
phys_addr_t paddr;
int mapped_elems = 0;
u64 dma_mask;

if (!check_device(dev))
return 0;

dma_mask = *dev->dma_mask;

get_device_resources(dev, &iommu, &domain, &devid);

if (!iommu || !domain)
Expand All @@ -1095,7 +1105,8 @@ static int map_sg(struct device *dev, struct scatterlist *sglist,
paddr = sg_phys(s);

s->dma_address = __map_single(dev, iommu, domain->priv,
paddr, s->length, dir, false);
paddr, s->length, dir, false,
dma_mask);

if (s->dma_address) {
s->dma_length = s->length;
Expand Down Expand Up @@ -1168,6 +1179,7 @@ static void *alloc_coherent(struct device *dev, size_t size,
struct protection_domain *domain;
u16 devid;
phys_addr_t paddr;
u64 dma_mask = dev->coherent_dma_mask;

if (!check_device(dev))
return NULL;
Expand All @@ -1187,10 +1199,13 @@ static void *alloc_coherent(struct device *dev, size_t size,
return virt_addr;
}

if (!dma_mask)
dma_mask = *dev->dma_mask;

spin_lock_irqsave(&domain->lock, flags);

*dma_addr = __map_single(dev, iommu, domain->priv, paddr,
size, DMA_BIDIRECTIONAL, true);
size, DMA_BIDIRECTIONAL, true, dma_mask);

if (*dma_addr == bad_dma_address) {
free_pages((unsigned long)virt_addr, get_order(size));
Expand Down

0 comments on commit 0a7b110

Please sign in to comment.