Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 41347917 authored by Michael Ellerman's avatar Michael Ellerman Committed by Paul Mackerras
Browse files

[POWERPC] Add support to cell_iommu_setup_page_tables() for multiple windows



Add support to cell_iommu_setup_page_tables() for handling two windows,
the dynamic window and the fixed window.  A fixed window size of 0
indicates that there is no fixed window at all.

Currently there are no callers who pass a non-zero fixed window, but the
upcoming fixed IOMMU mapping patch will change that.

Signed-off-by: default avatarMichael Ellerman <michael@ellerman.id.au>
Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 86865771
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -307,14 +307,19 @@ static int cell_iommu_find_ioc(int nid, unsigned long *base)
}

static void cell_iommu_setup_page_tables(struct cbe_iommu *iommu,
					 unsigned long base, unsigned long size)
				unsigned long dbase, unsigned long dsize,
				unsigned long fbase, unsigned long fsize)
{
	struct page *page;
	int i;
	unsigned long reg, segments, pages_per_segment, ptab_size, stab_size,
		      n_pte_pages;
		      n_pte_pages, base;

	base = dbase;
	if (fsize != 0)
		base = min(fbase, dbase);

	segments = size >> IO_SEGMENT_SHIFT;
	segments = max(dbase + dsize, fbase + fsize) >> IO_SEGMENT_SHIFT;
	pages_per_segment = 1ull << IO_PAGENO_BITS;

	pr_debug("%s: iommu[%d]: segments: %lu, pages per segment: %lu\n",
@@ -366,7 +371,7 @@ static void cell_iommu_setup_page_tables(struct cbe_iommu *iommu,
	}

	pr_debug("Setting up IOMMU stab:\n");
	for (i = 0; i * (1ul << IO_SEGMENT_SHIFT) < size; i++) {
	for (i = base >> IO_SEGMENT_SHIFT; i < segments; i++) {
		iommu->stab[i] = reg |
			(__pa(iommu->ptab) + n_pte_pages * IOMMU_PAGE_SIZE * i);
		pr_debug("\t[%d] 0x%016lx\n", i, iommu->stab[i]);
@@ -417,7 +422,7 @@ static void cell_iommu_enable_hardware(struct cbe_iommu *iommu)
static void cell_iommu_setup_hardware(struct cbe_iommu *iommu,
	unsigned long base, unsigned long size)
{
	cell_iommu_setup_page_tables(iommu, base, size);
	cell_iommu_setup_page_tables(iommu, base, size, 0, 0);
	cell_iommu_enable_hardware(iommu);
}