Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 86653
b: refs/heads/master
c: da40451
h: refs/heads/master
i:
  86651: d32e594
v: v3
  • Loading branch information
Michael Ellerman authored and Arnd Bergmann committed Mar 3, 2008
1 parent 6802a8a commit 564bfc9
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 16 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: 225d49050f9b6506f2f9df6b40e591ee93939d11
refs/heads/master: da40451bba23b51eaca4170a095891646ce72104
37 changes: 22 additions & 15 deletions trunk/arch/powerpc/platforms/cell/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -882,38 +882,45 @@ static void cell_dma_dev_setup_fixed(struct device *dev)
dev_dbg(dev, "iommu: fixed addr = %lx\n", addr);
}

static void insert_16M_pte(unsigned long addr, unsigned long *ptab,
unsigned long base_pte)
{
unsigned long segment, offset;

segment = addr >> IO_SEGMENT_SHIFT;
offset = (addr >> 24) - (segment << IO_PAGENO_BITS(24));
ptab = ptab + (segment * (1 << 12) / sizeof(unsigned long));

pr_debug("iommu: addr %lx ptab %p segment %lx offset %lx\n",
addr, ptab, segment, offset);

ptab[offset] = base_pte | (__pa(addr) & IOPTE_RPN_Mask);
}

static void cell_iommu_setup_fixed_ptab(struct cbe_iommu *iommu,
struct device_node *np, unsigned long dbase, unsigned long dsize,
unsigned long fbase, unsigned long fsize)
{
int i;
unsigned long base_pte, uaddr, *io_pte, *ptab;
unsigned long base_pte, uaddr, ioaddr, *ptab;

ptab = cell_iommu_alloc_ptab(iommu, fbase, fsize, dbase, dsize,
IOMMU_PAGE_SHIFT);
ptab = cell_iommu_alloc_ptab(iommu, fbase, fsize, dbase, dsize, 24);

dma_iommu_fixed_base = fbase;

/* convert from bytes into page table indices */
dbase = dbase >> IOMMU_PAGE_SHIFT;
dsize = dsize >> IOMMU_PAGE_SHIFT;
fbase = fbase >> IOMMU_PAGE_SHIFT;
fsize = fsize >> IOMMU_PAGE_SHIFT;

pr_debug("iommu: mapping 0x%lx pages from 0x%lx\n", fsize, fbase);

io_pte = ptab;
base_pte = IOPTE_PP_W | IOPTE_PP_R | IOPTE_M | IOPTE_SO_RW
| (cell_iommu_get_ioid(np) & IOPTE_IOID_Mask);

uaddr = 0;
for (i = fbase; i < fbase + fsize; i++, uaddr += IOMMU_PAGE_SIZE) {
for (uaddr = 0; uaddr < fsize; uaddr += (1 << 24)) {
/* Don't touch the dynamic region */
if (i >= dbase && i < (dbase + dsize)) {
ioaddr = uaddr + fbase;
if (ioaddr >= dbase && ioaddr < (dbase + dsize)) {
pr_debug("iommu: fixed/dynamic overlap, skipping\n");
continue;
}
io_pte[i - fbase] = base_pte | (__pa(uaddr) & IOPTE_RPN_Mask);

insert_16M_pte(uaddr, ptab, base_pte);
}

mb();
Expand Down

0 comments on commit 564bfc9

Please sign in to comment.