[PATCH] 64bit resource: change resource core to use resource_size_t
[linux-2.6.git] / arch / sparc / kernel / ioport.c
index 00cf411..79d1771 100644 (file)
@@ -39,6 +39,8 @@
 #include <asm/io.h>
 #include <asm/vaddrs.h>
 #include <asm/oplib.h>
+#include <asm/prom.h>
+#include <asm/sbus.h>
 #include <asm/page.h>
 #include <asm/pgalloc.h>
 #include <asm/dma.h>
@@ -206,7 +208,7 @@ _sparc_ioremap(struct resource *res, u32 bus, u32 pa, int sz)
        pa &= PAGE_MASK;
        sparc_mapiorange(bus, pa, res->start, res->end - res->start + 1);
 
-       return (void __iomem *) (res->start + offset);
+       return (void __iomem *)(unsigned long)(res->start + offset);
 }
 
 /*
@@ -323,7 +325,7 @@ void *sbus_alloc_consistent(struct sbus_dev *sdev, long len, u32 *dma_addrp)
                res->name = sdev->prom_name;
        }
 
-       return (void *)res->start;
+       return (void *)(unsigned long)res->start;
 
 err_noiommu:
        release_resource(res);
@@ -458,6 +460,89 @@ void sbus_dma_sync_sg_for_device(struct sbus_dev *sdev, struct scatterlist *sg,
 {
        printk("sbus_dma_sync_sg_for_device: not implemented yet\n");
 }
+
+/* Support code for sbus_init().  */
+/*
+ * XXX This functions appears to be a distorted version of
+ * prom_sbus_ranges_init(), with all sun4d stuff cut away.
+ * Ask DaveM what is going on here, how is sun4d supposed to work... XXX
+ */
+/* added back sun4d patch from Thomas Bogendoerfer - should be OK (crn) */
+void __init sbus_arch_bus_ranges_init(struct device_node *pn, struct sbus_bus *sbus)
+{
+       int parent_node = pn->node;
+
+       if (sparc_cpu_model == sun4d) {
+               struct linux_prom_ranges iounit_ranges[PROMREG_MAX];
+               int num_iounit_ranges, len;
+
+               len = prom_getproperty(parent_node, "ranges",
+                                      (char *) iounit_ranges,
+                                      sizeof (iounit_ranges));
+               if (len != -1) {
+                       num_iounit_ranges =
+                               (len / sizeof(struct linux_prom_ranges));
+                       prom_adjust_ranges(sbus->sbus_ranges,
+                                          sbus->num_sbus_ranges,
+                                          iounit_ranges, num_iounit_ranges);
+               }
+       }
+}
+
+void __init sbus_setup_iommu(struct sbus_bus *sbus, struct device_node *dp)
+{
+       struct device_node *parent = dp->parent;
+
+       if (sparc_cpu_model != sun4d &&
+           parent != NULL &&
+           !strcmp(parent->name, "iommu")) {
+               extern void iommu_init(int iommu_node, struct sbus_bus *sbus);
+
+               iommu_init(parent->node, sbus);
+       }
+
+       if (sparc_cpu_model == sun4d) {
+               extern void iounit_init(int sbi_node, int iounit_node,
+                                       struct sbus_bus *sbus);
+
+               iounit_init(dp->node, parent->node, sbus);
+       }
+}
+
+void __init sbus_setup_arch_props(struct sbus_bus *sbus, struct device_node *dp)
+{
+       if (sparc_cpu_model == sun4d) {
+               struct device_node *parent = dp->parent;
+
+               sbus->devid = of_getintprop_default(parent, "device-id", 0);
+               sbus->board = of_getintprop_default(parent, "board#", 0);
+       }
+}
+
+int __init sbus_arch_preinit(void)
+{
+       extern void register_proc_sparc_ioport(void);
+
+       register_proc_sparc_ioport();
+
+#ifdef CONFIG_SUN4
+       {
+               extern void sun4_dvma_init(void);
+               sun4_dvma_init();
+       }
+       return 1;
+#else
+       return 0;
+#endif
+}
+
+void __init sbus_arch_postinit(void)
+{
+       if (sparc_cpu_model == sun4d) {
+               extern void sun4d_init_sbi_irq(void);
+               sun4d_init_sbi_irq();
+       }
+}
 #endif /* CONFIG_SBUS */
 
 #ifdef CONFIG_PCI
@@ -734,7 +819,9 @@ _sparc_io_get_info(char *buf, char **start, off_t fpos, int length, int *eof,
                if (p + 32 >= e)        /* Better than nothing */
                        break;
                if ((nm = r->name) == 0) nm = "???";
-               p += sprintf(p, "%08lx-%08lx: %s\n", r->start, r->end, nm);
+               p += sprintf(p, "%016llx-%016llx: %s\n",
+                               (unsigned long long)r->start,
+                               (unsigned long long)r->end, nm);
        }
 
        return p-buf;