diff options
Diffstat (limited to 'arch/powerpc/platforms/iseries/setup.c')
-rw-r--r-- | arch/powerpc/platforms/iseries/setup.c | 88 |
1 files changed, 87 insertions, 1 deletions
diff --git a/arch/powerpc/platforms/iseries/setup.c b/arch/powerpc/platforms/iseries/setup.c index 3c51448a1855..4862b8e7c78c 100644 --- a/arch/powerpc/platforms/iseries/setup.c +++ b/arch/powerpc/platforms/iseries/setup.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/major.h> | 28 | #include <linux/major.h> |
29 | #include <linux/root_dev.h> | 29 | #include <linux/root_dev.h> |
30 | #include <linux/kernel.h> | 30 | #include <linux/kernel.h> |
31 | #include <linux/if_ether.h> /* ETH_ALEN */ | ||
31 | 32 | ||
32 | #include <asm/processor.h> | 33 | #include <asm/processor.h> |
33 | #include <asm/machdep.h> | 34 | #include <asm/machdep.h> |
@@ -45,6 +46,7 @@ | |||
45 | #include <asm/cache.h> | 46 | #include <asm/cache.h> |
46 | #include <asm/sections.h> | 47 | #include <asm/sections.h> |
47 | #include <asm/abs_addr.h> | 48 | #include <asm/abs_addr.h> |
49 | #include <asm/iseries/hv_types.h> | ||
48 | #include <asm/iseries/hv_lp_config.h> | 50 | #include <asm/iseries/hv_lp_config.h> |
49 | #include <asm/iseries/hv_call_event.h> | 51 | #include <asm/iseries/hv_call_event.h> |
50 | #include <asm/iseries/hv_call_xm.h> | 52 | #include <asm/iseries/hv_call_xm.h> |
@@ -710,7 +712,7 @@ define_machine(iseries) { | |||
710 | }; | 712 | }; |
711 | 713 | ||
712 | struct blob { | 714 | struct blob { |
713 | unsigned char data[PAGE_SIZE]; | 715 | unsigned char data[PAGE_SIZE * 2]; |
714 | unsigned long next; | 716 | unsigned long next; |
715 | }; | 717 | }; |
716 | 718 | ||
@@ -911,6 +913,88 @@ void dt_model(struct iseries_flat_dt *dt) | |||
911 | dt_prop_str(dt, "compatible", "IBM,iSeries"); | 913 | dt_prop_str(dt, "compatible", "IBM,iSeries"); |
912 | } | 914 | } |
913 | 915 | ||
916 | void dt_vdevices(struct iseries_flat_dt *dt) | ||
917 | { | ||
918 | u32 reg = 0; | ||
919 | HvLpIndexMap vlan_map; | ||
920 | int i; | ||
921 | char buf[32]; | ||
922 | |||
923 | dt_start_node(dt, "vdevice"); | ||
924 | dt_prop_u32(dt, "#address-cells", 1); | ||
925 | dt_prop_u32(dt, "#size-cells", 0); | ||
926 | |||
927 | snprintf(buf, sizeof(buf), "viocons@%08x", reg); | ||
928 | dt_start_node(dt, buf); | ||
929 | dt_prop_str(dt, "device_type", "serial"); | ||
930 | dt_prop_empty(dt, "compatible"); | ||
931 | dt_prop_u32(dt, "reg", reg); | ||
932 | dt_end_node(dt); | ||
933 | reg++; | ||
934 | |||
935 | snprintf(buf, sizeof(buf), "v-scsi@%08x", reg); | ||
936 | dt_start_node(dt, buf); | ||
937 | dt_prop_str(dt, "device_type", "vscsi"); | ||
938 | dt_prop_str(dt, "compatible", "IBM,v-scsi"); | ||
939 | dt_prop_u32(dt, "reg", reg); | ||
940 | dt_end_node(dt); | ||
941 | reg++; | ||
942 | |||
943 | vlan_map = HvLpConfig_getVirtualLanIndexMap(); | ||
944 | for (i = 0; i < HVMAXARCHITECTEDVIRTUALLANS; i++) { | ||
945 | unsigned char mac_addr[ETH_ALEN]; | ||
946 | |||
947 | if ((vlan_map & (0x8000 >> i)) == 0) | ||
948 | continue; | ||
949 | snprintf(buf, 32, "vlan@%08x", reg + i); | ||
950 | dt_start_node(dt, buf); | ||
951 | dt_prop_str(dt, "device_type", "vlan"); | ||
952 | dt_prop_empty(dt, "compatible"); | ||
953 | dt_prop_u32(dt, "reg", reg + i); | ||
954 | |||
955 | mac_addr[0] = 0x02; | ||
956 | mac_addr[1] = 0x01; | ||
957 | mac_addr[2] = 0xff; | ||
958 | mac_addr[3] = i; | ||
959 | mac_addr[4] = 0xff; | ||
960 | mac_addr[5] = HvLpConfig_getLpIndex_outline(); | ||
961 | dt_prop(dt, "local-mac-address", (char *)mac_addr, ETH_ALEN); | ||
962 | dt_prop(dt, "mac-address", (char *)mac_addr, ETH_ALEN); | ||
963 | |||
964 | dt_end_node(dt); | ||
965 | } | ||
966 | reg += HVMAXARCHITECTEDVIRTUALLANS; | ||
967 | |||
968 | for (i = 0; i < HVMAXARCHITECTEDVIRTUALDISKS; i++) { | ||
969 | snprintf(buf, 32, "viodasd@%08x", reg + i); | ||
970 | dt_start_node(dt, buf); | ||
971 | dt_prop_str(dt, "device_type", "viodasd"); | ||
972 | dt_prop_empty(dt, "compatible"); | ||
973 | dt_prop_u32(dt, "reg", reg + i); | ||
974 | dt_end_node(dt); | ||
975 | } | ||
976 | reg += HVMAXARCHITECTEDVIRTUALDISKS; | ||
977 | for (i = 0; i < HVMAXARCHITECTEDVIRTUALCDROMS; i++) { | ||
978 | snprintf(buf, 32, "viocd@%08x", reg + i); | ||
979 | dt_start_node(dt, buf); | ||
980 | dt_prop_str(dt, "device_type", "viocd"); | ||
981 | dt_prop_empty(dt, "compatible"); | ||
982 | dt_prop_u32(dt, "reg", reg + i); | ||
983 | dt_end_node(dt); | ||
984 | } | ||
985 | reg += HVMAXARCHITECTEDVIRTUALCDROMS; | ||
986 | for (i = 0; i < HVMAXARCHITECTEDVIRTUALTAPES; i++) { | ||
987 | snprintf(buf, 32, "viotape@%08x", reg + i); | ||
988 | dt_start_node(dt, buf); | ||
989 | dt_prop_str(dt, "device_type", "viotape"); | ||
990 | dt_prop_empty(dt, "compatible"); | ||
991 | dt_prop_u32(dt, "reg", reg + i); | ||
992 | dt_end_node(dt); | ||
993 | } | ||
994 | |||
995 | dt_end_node(dt); | ||
996 | } | ||
997 | |||
914 | void build_flat_dt(struct iseries_flat_dt *dt, unsigned long phys_mem_size) | 998 | void build_flat_dt(struct iseries_flat_dt *dt, unsigned long phys_mem_size) |
915 | { | 999 | { |
916 | u64 tmp[2]; | 1000 | u64 tmp[2]; |
@@ -941,6 +1025,8 @@ void build_flat_dt(struct iseries_flat_dt *dt, unsigned long phys_mem_size) | |||
941 | 1025 | ||
942 | dt_cpus(dt); | 1026 | dt_cpus(dt); |
943 | 1027 | ||
1028 | dt_vdevices(dt); | ||
1029 | |||
944 | dt_end_node(dt); | 1030 | dt_end_node(dt); |
945 | 1031 | ||
946 | dt_push_u32(dt, OF_DT_END); | 1032 | dt_push_u32(dt, OF_DT_END); |