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