]> err.no Git - linux-2.6/commitdiff
[PATCH] powerpc: add all the iSeries virtual devices to the device tree
authorStephen Rothwell <sfr@canb.auug.org.au>
Thu, 27 Apr 2006 07:09:02 +0000 (17:09 +1000)
committerPaul Mackerras <paulus@samba.org>
Sat, 29 Apr 2006 08:01:58 +0000 (18:01 +1000)
We do this by putting them in the flattened device tree at setup time.
This required the flattened device tree blob to be made bigger.

Currenly we don't do anything with these.

Also make a function static.

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/platforms/iseries/setup.c
arch/powerpc/platforms/iseries/vio.c

index 3c51448a1855b866c4bcc86f72c89a68387644e9..4862b8e7c78c20ed99e40cc5e7d2825062b844e2 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/major.h>
 #include <linux/root_dev.h>
 #include <linux/kernel.h>
+#include <linux/if_ether.h>    /* ETH_ALEN */
 
 #include <asm/processor.h>
 #include <asm/machdep.h>
@@ -45,6 +46,7 @@
 #include <asm/cache.h>
 #include <asm/sections.h>
 #include <asm/abs_addr.h>
+#include <asm/iseries/hv_types.h>
 #include <asm/iseries/hv_lp_config.h>
 #include <asm/iseries/hv_call_event.h>
 #include <asm/iseries/hv_call_xm.h>
@@ -710,7 +712,7 @@ define_machine(iseries) {
 };
 
 struct blob {
-       unsigned char data[PAGE_SIZE];
+       unsigned char data[PAGE_SIZE * 2];
        unsigned long next;
 };
 
@@ -911,6 +913,88 @@ void dt_model(struct iseries_flat_dt *dt)
        dt_prop_str(dt, "compatible", "IBM,iSeries");
 }
 
+void dt_vdevices(struct iseries_flat_dt *dt)
+{
+       u32 reg = 0;
+       HvLpIndexMap vlan_map;
+       int i;
+       char buf[32];
+
+       dt_start_node(dt, "vdevice");
+       dt_prop_u32(dt, "#address-cells", 1);
+       dt_prop_u32(dt, "#size-cells", 0);
+
+       snprintf(buf, sizeof(buf), "viocons@%08x", reg);
+       dt_start_node(dt, buf);
+       dt_prop_str(dt, "device_type", "serial");
+       dt_prop_empty(dt, "compatible");
+       dt_prop_u32(dt, "reg", reg);
+       dt_end_node(dt);
+       reg++;
+
+       snprintf(buf, sizeof(buf), "v-scsi@%08x", reg);
+       dt_start_node(dt, buf);
+       dt_prop_str(dt, "device_type", "vscsi");
+       dt_prop_str(dt, "compatible", "IBM,v-scsi");
+       dt_prop_u32(dt, "reg", reg);
+       dt_end_node(dt);
+       reg++;
+
+       vlan_map = HvLpConfig_getVirtualLanIndexMap();
+       for (i = 0; i < HVMAXARCHITECTEDVIRTUALLANS; i++) {
+               unsigned char mac_addr[ETH_ALEN];
+
+               if ((vlan_map & (0x8000 >> i)) == 0)
+                       continue;
+               snprintf(buf, 32, "vlan@%08x", reg + i);
+               dt_start_node(dt, buf);
+               dt_prop_str(dt, "device_type", "vlan");
+               dt_prop_empty(dt, "compatible");
+               dt_prop_u32(dt, "reg", reg + i);
+
+               mac_addr[0] = 0x02;
+               mac_addr[1] = 0x01;
+               mac_addr[2] = 0xff;
+               mac_addr[3] = i;
+               mac_addr[4] = 0xff;
+               mac_addr[5] = HvLpConfig_getLpIndex_outline();
+               dt_prop(dt, "local-mac-address", (char *)mac_addr, ETH_ALEN);
+               dt_prop(dt, "mac-address", (char *)mac_addr, ETH_ALEN);
+
+               dt_end_node(dt);
+       }
+       reg += HVMAXARCHITECTEDVIRTUALLANS;
+
+       for (i = 0; i < HVMAXARCHITECTEDVIRTUALDISKS; i++) {
+               snprintf(buf, 32, "viodasd@%08x", reg + i);
+               dt_start_node(dt, buf);
+               dt_prop_str(dt, "device_type", "viodasd");
+               dt_prop_empty(dt, "compatible");
+               dt_prop_u32(dt, "reg", reg + i);
+               dt_end_node(dt);
+       }
+       reg += HVMAXARCHITECTEDVIRTUALDISKS;
+       for (i = 0; i < HVMAXARCHITECTEDVIRTUALCDROMS; i++) {
+               snprintf(buf, 32, "viocd@%08x", reg + i);
+               dt_start_node(dt, buf);
+               dt_prop_str(dt, "device_type", "viocd");
+               dt_prop_empty(dt, "compatible");
+               dt_prop_u32(dt, "reg", reg + i);
+               dt_end_node(dt);
+       }
+       reg += HVMAXARCHITECTEDVIRTUALCDROMS;
+       for (i = 0; i < HVMAXARCHITECTEDVIRTUALTAPES; i++) {
+               snprintf(buf, 32, "viotape@%08x", reg + i);
+               dt_start_node(dt, buf);
+               dt_prop_str(dt, "device_type", "viotape");
+               dt_prop_empty(dt, "compatible");
+               dt_prop_u32(dt, "reg", reg + i);
+               dt_end_node(dt);
+       }
+
+       dt_end_node(dt);
+}
+
 void build_flat_dt(struct iseries_flat_dt *dt, unsigned long phys_mem_size)
 {
        u64 tmp[2];
@@ -941,6 +1025,8 @@ void build_flat_dt(struct iseries_flat_dt *dt, unsigned long phys_mem_size)
 
        dt_cpus(dt);
 
+       dt_vdevices(dt);
+
        dt_end_node(dt);
 
        dt_push_u32(dt, OF_DT_END);
index ad36ab0639f0496df1f1c1cbbe155c2b26d421f1..22045a2829a98e95e3b435e6760ce7ff10d06bfb 100644 (file)
@@ -71,7 +71,7 @@ static struct vio_dev *__init vio_register_device_iseries(char *type,
        return viodev;
 }
 
-void __init probe_bus_iseries(void)
+static void __init probe_bus_iseries(void)
 {
        HvLpIndexMap vlan_map;
        struct vio_dev *viodev;