Bläddra i källkod

[PATCH] powerpc: add all the iSeries virtual devices to the device tree

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>
Stephen Rothwell 19 år sedan
förälder
incheckning
95a1ca6cd8
2 ändrade filer med 88 tillägg och 2 borttagningar
  1. 87 1
      arch/powerpc/platforms/iseries/setup.c
  2. 1 1
      arch/powerpc/platforms/iseries/vio.c

+ 87 - 1
arch/powerpc/platforms/iseries/setup.c

@@ -28,6 +28,7 @@
 #include <linux/major.h>
 #include <linux/major.h>
 #include <linux/root_dev.h>
 #include <linux/root_dev.h>
 #include <linux/kernel.h>
 #include <linux/kernel.h>
+#include <linux/if_ether.h>	/* ETH_ALEN */
 
 
 #include <asm/processor.h>
 #include <asm/processor.h>
 #include <asm/machdep.h>
 #include <asm/machdep.h>
@@ -45,6 +46,7 @@
 #include <asm/cache.h>
 #include <asm/cache.h>
 #include <asm/sections.h>
 #include <asm/sections.h>
 #include <asm/abs_addr.h>
 #include <asm/abs_addr.h>
+#include <asm/iseries/hv_types.h>
 #include <asm/iseries/hv_lp_config.h>
 #include <asm/iseries/hv_lp_config.h>
 #include <asm/iseries/hv_call_event.h>
 #include <asm/iseries/hv_call_event.h>
 #include <asm/iseries/hv_call_xm.h>
 #include <asm/iseries/hv_call_xm.h>
@@ -710,7 +712,7 @@ define_machine(iseries) {
 };
 };
 
 
 struct blob {
 struct blob {
-	unsigned char data[PAGE_SIZE];
+	unsigned char data[PAGE_SIZE * 2];
 	unsigned long next;
 	unsigned long next;
 };
 };
 
 
@@ -911,6 +913,88 @@ void dt_model(struct iseries_flat_dt *dt)
 	dt_prop_str(dt, "compatible", "IBM,iSeries");
 	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)
 void build_flat_dt(struct iseries_flat_dt *dt, unsigned long phys_mem_size)
 {
 {
 	u64 tmp[2];
 	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_cpus(dt);
 
 
+	dt_vdevices(dt);
+
 	dt_end_node(dt);
 	dt_end_node(dt);
 
 
 	dt_push_u32(dt, OF_DT_END);
 	dt_push_u32(dt, OF_DT_END);

+ 1 - 1
arch/powerpc/platforms/iseries/vio.c

@@ -71,7 +71,7 @@ static struct vio_dev *__init vio_register_device_iseries(char *type,
 	return viodev;
 	return viodev;
 }
 }
 
 
-void __init probe_bus_iseries(void)
+static void __init probe_bus_iseries(void)
 {
 {
 	HvLpIndexMap vlan_map;
 	HvLpIndexMap vlan_map;
 	struct vio_dev *viodev;
 	struct vio_dev *viodev;