This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / arch / ppc64 / kernel / vio.c
index ed20451..48c4b0a 100644 (file)
@@ -521,7 +521,24 @@ static struct iommu_table * vio_build_iommu_table(struct vio_dev *dev)
 
        newTceTable = (struct iommu_table *) kmalloc(sizeof(struct iommu_table), GFP_KERNEL);
 
-       size = ((dma_window[4] >> PAGE_SHIFT) << 3) >> PAGE_SHIFT;
+       /* RPA docs say that #address-cells is always 1 for virtual
+               devices, but some older boxes' OF returns 2.  This should
+               be removed by GA, unless there is legacy OFs that still
+               have 2 for #address-cells */
+       size = ((dma_window[1+vio_num_address_cells] >> PAGE_SHIFT) << 3)
+               >> PAGE_SHIFT;
+
+       /* This is just an ugly kludge. Remove as soon as the OF for all
+       machines actually follow the spec and encodes the offset field
+       as phys-encode (that is, #address-cells wide)*/
+       if (dma_window_property_size == 12) {
+               size = ((dma_window[1] >> PAGE_SHIFT) << 3) >> PAGE_SHIFT;
+       } else if (dma_window_property_size == 20) {
+               size = ((dma_window[4] >> PAGE_SHIFT) << 3) >> PAGE_SHIFT;
+       } else {
+               printk(KERN_WARNING "vio_build_iommu_table: Invalid size of ibm,my-dma-window=%i, using 0x80 for size\n", dma_window_property_size);
+               size = 0x80;
+       }
 
        /*  There should be some code to extract the phys-encoded offset
                using prom_n_addr_cells(). However, according to a comment