summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorDavid S. Miller <davem@sunset.davemloft.net>2006-02-15 22:25:27 -0800
committerDavid S. Miller <davem@sunset.davemloft.net>2006-03-20 01:13:10 -0800
commite7a0453ef82c1433a35ab82d874296fff68f3639 (patch)
tree0dd18e3742bb838f7351a20186ea3a820d038231 /arch
parentdb33f9bc09aaf68db7866374f9219c676787b4a2 (diff)
downloadblackbird-op-linux-e7a0453ef82c1433a35ab82d874296fff68f3639.tar.gz
blackbird-op-linux-e7a0453ef82c1433a35ab82d874296fff68f3639.zip
[SPARC64] PCI: Size TSB correctly on SUN4V.
Forgot to multiply by 8 * 1024, oops. Correct the size constant when the virtual-dma arena is 2GB in size, it should bet 256 not 128. Finally, log some info about the TSB at probe time. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch')
-rw-r--r--arch/sparc64/kernel/pci_sun4v.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/arch/sparc64/kernel/pci_sun4v.c b/arch/sparc64/kernel/pci_sun4v.c
index 13b611db0583..902d07c714fb 100644
--- a/arch/sparc64/kernel/pci_sun4v.c
+++ b/arch/sparc64/kernel/pci_sun4v.c
@@ -102,6 +102,7 @@ static void *pci_4v_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr
first_page = __get_free_pages(GFP_ATOMIC, order);
if (first_page == 0UL)
return NULL;
+
memset((char *)first_page, 0, PAGE_SIZE << order);
pcp = pdev->sysdata;
@@ -805,11 +806,11 @@ static void pbm_register_toplevel_resources(struct pci_controller_info *p,
&pbm->mem_space);
}
-static void probe_existing_entries(struct pci_pbm_info *pbm,
- struct pci_iommu *iommu)
+static unsigned long probe_existing_entries(struct pci_pbm_info *pbm,
+ struct pci_iommu *iommu)
{
struct pci_iommu_arena *arena = &iommu->arena;
- unsigned long i;
+ unsigned long i, cnt = 0;
u32 devhandle;
devhandle = pbm->devhandle;
@@ -819,9 +820,13 @@ static void probe_existing_entries(struct pci_pbm_info *pbm,
ret = pci_sun4v_iommu_getmap(devhandle,
HV_PCI_TSBID(0, i),
&io_attrs, &ra);
- if (ret == HV_EOK)
+ if (ret == HV_EOK) {
+ cnt++;
__set_bit(i, arena->map);
+ }
}
+
+ return cnt;
}
static void pci_sun4v_iommu_init(struct pci_pbm_info *pbm)
@@ -853,7 +858,7 @@ static void pci_sun4v_iommu_init(struct pci_pbm_info *pbm)
case 0x80000000:
dma_mask |= 0x7fffffff;
- tsbsize = 128;
+ tsbsize = 256;
break;
default:
@@ -861,6 +866,8 @@ static void pci_sun4v_iommu_init(struct pci_pbm_info *pbm)
prom_halt();
};
+ tsbsize *= (8 * 1024);
+
num_tsb_entries = tsbsize / sizeof(iopte_t);
dma_offset = vdma[0];
@@ -882,7 +889,10 @@ static void pci_sun4v_iommu_init(struct pci_pbm_info *pbm)
memset(iommu->arena.map, 0, sz);
iommu->arena.limit = num_tsb_entries;
- probe_existing_entries(pbm, iommu);
+ sz = probe_existing_entries(pbm, iommu);
+
+ printk("%s: TSB entries [%lu], existing mapings [%lu]\n",
+ pbm->name, num_tsb_entries, sz);
}
static void pci_sun4v_get_bus_range(struct pci_pbm_info *pbm)
OpenPOWER on IntegriCloud