aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc64/kernel/pci_sabre.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@ultra5.davemloft.net>2007-03-04 15:53:19 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2007-04-26 04:55:10 -0400
commit01f94c4a6ced476ce69b895426fc29bfc48c69bd (patch)
tree68866108644a1e90ae7688d2e35cb8462ab6a07c /arch/sparc64/kernel/pci_sabre.c
parenta378fd0ee8ea6af5dafd0ab3d634f22b926b5ac4 (diff)
[SPARC64]: Fix sabre pci controllers with new probing scheme.
The SIMBA APB bridge is strange, it is a PCI bridge but it lacks some standard OF properties, in particular it lacks a 'ranges' property. What you have to do is read the IO and MEM range registers in the APB bridge to determine the ranges handled by each bridge. So fill in the bus resources by doing that. Since we now handle this quirk in the generic PCI and OF device probing layers, we can flat out eliminate all of that code from the sabre pci controller driver. In fact we can thus eliminate completely another quirk of the sabre driver. It tried to make the two APB bridges look like PBMs but that makes zero sense now (and it's questionable whether it ever made sense). So now just use pbm_A and probe the whole PCI hierarchy using that as the root. This simplification allows many future cleanups to occur. Also, I've found yet another quirk that needs to be worked around while testing this. You can't use the 'class-code' OF firmware property, especially for IDE controllers. We have to read the value out of PCI config space or else we'll see the value the device was showing before it was programmed into native mode. I'm starting to think it might be wise to just read all of the values out of PCI config space instead of using the OF properties. :-/ Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/pci_sabre.c')
-rw-r--r--arch/sparc64/kernel/pci_sabre.c340
1 files changed, 62 insertions, 278 deletions
diff --git a/arch/sparc64/kernel/pci_sabre.c b/arch/sparc64/kernel/pci_sabre.c
index bbf624517508..f4e346092a53 100644
--- a/arch/sparc64/kernel/pci_sabre.c
+++ b/arch/sparc64/kernel/pci_sabre.c
@@ -254,9 +254,6 @@ static int __sabre_out_of_range(struct pci_pbm_info *pbm,
254 return 0; 254 return 0;
255 255
256 return ((pbm->parent == 0) || 256 return ((pbm->parent == 0) ||
257 ((pbm == &pbm->parent->pbm_B) &&
258 (bus == pbm->pci_first_busno) &&
259 PCI_SLOT(devfn) > 8) ||
260 ((pbm == &pbm->parent->pbm_A) && 257 ((pbm == &pbm->parent->pbm_A) &&
261 (bus == pbm->pci_first_busno) && 258 (bus == pbm->pci_first_busno) &&
262 PCI_SLOT(devfn) > 8)); 259 PCI_SLOT(devfn) > 8));
@@ -800,12 +797,10 @@ static irqreturn_t sabre_pcierr_intr(int irq, void *dev_id)
800 if (error_bits & (SABRE_PIOAFSR_PTA | SABRE_PIOAFSR_STA)) { 797 if (error_bits & (SABRE_PIOAFSR_PTA | SABRE_PIOAFSR_STA)) {
801 sabre_check_iommu_error(p, afsr, afar); 798 sabre_check_iommu_error(p, afsr, afar);
802 pci_scan_for_target_abort(p, &p->pbm_A, p->pbm_A.pci_bus); 799 pci_scan_for_target_abort(p, &p->pbm_A, p->pbm_A.pci_bus);
803 pci_scan_for_target_abort(p, &p->pbm_B, p->pbm_B.pci_bus);
804 } 800 }
805 if (error_bits & (SABRE_PIOAFSR_PMA | SABRE_PIOAFSR_SMA)) { 801 if (error_bits & (SABRE_PIOAFSR_PMA | SABRE_PIOAFSR_SMA))
806 pci_scan_for_master_abort(p, &p->pbm_A, p->pbm_A.pci_bus); 802 pci_scan_for_master_abort(p, &p->pbm_A, p->pbm_A.pci_bus);
807 pci_scan_for_master_abort(p, &p->pbm_B, p->pbm_B.pci_bus); 803
808 }
809 /* For excessive retries, SABRE/PBM will abort the device 804 /* For excessive retries, SABRE/PBM will abort the device
810 * and there is no way to specifically check for excessive 805 * and there is no way to specifically check for excessive
811 * retries in the config space status registers. So what 806 * retries in the config space status registers. So what
@@ -813,10 +808,8 @@ static irqreturn_t sabre_pcierr_intr(int irq, void *dev_id)
813 * abort events. 808 * abort events.
814 */ 809 */
815 810
816 if (error_bits & (SABRE_PIOAFSR_PPERR | SABRE_PIOAFSR_SPERR)) { 811 if (error_bits & (SABRE_PIOAFSR_PPERR | SABRE_PIOAFSR_SPERR))
817 pci_scan_for_parity_error(p, &p->pbm_A, p->pbm_A.pci_bus); 812 pci_scan_for_parity_error(p, &p->pbm_A, p->pbm_A.pci_bus);
818 pci_scan_for_parity_error(p, &p->pbm_B, p->pbm_B.pci_bus);
819 }
820 813
821 return IRQ_HANDLED; 814 return IRQ_HANDLED;
822} 815}
@@ -935,44 +928,33 @@ static void apb_init(struct pci_controller_info *p, struct pci_bus *sabre_bus)
935 struct pci_dev *pdev; 928 struct pci_dev *pdev;
936 929
937 list_for_each_entry(pdev, &sabre_bus->devices, bus_list) { 930 list_for_each_entry(pdev, &sabre_bus->devices, bus_list) {
938
939 if (pdev->vendor == PCI_VENDOR_ID_SUN && 931 if (pdev->vendor == PCI_VENDOR_ID_SUN &&
940 pdev->device == PCI_DEVICE_ID_SUN_SIMBA) { 932 pdev->device == PCI_DEVICE_ID_SUN_SIMBA) {
941 u32 word32;
942 u16 word16; 933 u16 word16;
943 934
944 sabre_read_pci_cfg(pdev->bus, pdev->devfn, 935 pci_read_config_word(pdev, PCI_COMMAND, &word16);
945 PCI_COMMAND, 2, &word32);
946 word16 = (u16) word32;
947 word16 |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY | 936 word16 |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY |
948 PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | 937 PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY |
949 PCI_COMMAND_IO; 938 PCI_COMMAND_IO;
950 word32 = (u32) word16; 939 pci_write_config_word(pdev, PCI_COMMAND, word16);
951 sabre_write_pci_cfg(pdev->bus, pdev->devfn,
952 PCI_COMMAND, 2, word32);
953 940
954 /* Status register bits are "write 1 to clear". */ 941 /* Status register bits are "write 1 to clear". */
955 sabre_write_pci_cfg(pdev->bus, pdev->devfn, 942 pci_write_config_word(pdev, PCI_STATUS, 0xffff);
956 PCI_STATUS, 2, 0xffff); 943 pci_write_config_word(pdev, PCI_SEC_STATUS, 0xffff);
957 sabre_write_pci_cfg(pdev->bus, pdev->devfn,
958 PCI_SEC_STATUS, 2, 0xffff);
959 944
960 /* Use a primary/seconday latency timer value 945 /* Use a primary/seconday latency timer value
961 * of 64. 946 * of 64.
962 */ 947 */
963 sabre_write_pci_cfg(pdev->bus, pdev->devfn, 948 pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 64);
964 PCI_LATENCY_TIMER, 1, 64); 949 pci_write_config_byte(pdev, PCI_SEC_LATENCY_TIMER, 64);
965 sabre_write_pci_cfg(pdev->bus, pdev->devfn,
966 PCI_SEC_LATENCY_TIMER, 1, 64);
967 950
968 /* Enable reporting/forwarding of master aborts, 951 /* Enable reporting/forwarding of master aborts,
969 * parity, and SERR. 952 * parity, and SERR.
970 */ 953 */
971 sabre_write_pci_cfg(pdev->bus, pdev->devfn, 954 pci_write_config_byte(pdev, PCI_BRIDGE_CONTROL,
972 PCI_BRIDGE_CONTROL, 1, 955 (PCI_BRIDGE_CTL_PARITY |
973 (PCI_BRIDGE_CTL_PARITY | 956 PCI_BRIDGE_CTL_SERR |
974 PCI_BRIDGE_CTL_SERR | 957 PCI_BRIDGE_CTL_MASTER_ABORT));
975 PCI_BRIDGE_CTL_MASTER_ABORT));
976 } 958 }
977 } 959 }
978} 960}
@@ -980,16 +962,13 @@ static void apb_init(struct pci_controller_info *p, struct pci_bus *sabre_bus)
980static void sabre_scan_bus(struct pci_controller_info *p) 962static void sabre_scan_bus(struct pci_controller_info *p)
981{ 963{
982 static int once; 964 static int once;
983 struct pci_bus *sabre_bus, *pbus; 965 struct pci_bus *pbus;
984 struct pci_pbm_info *pbm;
985 int sabres_scanned;
986 966
987 /* The APB bridge speaks to the Sabre host PCI bridge 967 /* The APB bridge speaks to the Sabre host PCI bridge
988 * at 66Mhz, but the front side of APB runs at 33Mhz 968 * at 66Mhz, but the front side of APB runs at 33Mhz
989 * for both segments. 969 * for both segments.
990 */ 970 */
991 p->pbm_A.is_66mhz_capable = 0; 971 p->pbm_A.is_66mhz_capable = 0;
992 p->pbm_B.is_66mhz_capable = 0;
993 972
994 /* This driver has not been verified to handle 973 /* This driver has not been verified to handle
995 * multiple SABREs yet, so trap this. 974 * multiple SABREs yet, so trap this.
@@ -1003,36 +982,13 @@ static void sabre_scan_bus(struct pci_controller_info *p)
1003 } 982 }
1004 once++; 983 once++;
1005 984
1006 sabre_bus = pci_scan_one_pbm(&p->pbm_A); 985 pbus = pci_scan_one_pbm(&p->pbm_A);
1007 if (!sabre_bus) 986 if (!pbus)
1008 return; 987 return;
1009 988
1010 sabre_root_bus = sabre_bus; 989 sabre_root_bus = pbus;
1011
1012 apb_init(p, sabre_bus);
1013
1014 sabres_scanned = 0;
1015 990
1016 list_for_each_entry(pbus, &sabre_bus->children, node) { 991 apb_init(p, pbus);
1017
1018 if (pbus->number == p->pbm_A.pci_first_busno) {
1019 pbm = &p->pbm_A;
1020 } else if (pbus->number == p->pbm_B.pci_first_busno) {
1021 pbm = &p->pbm_B;
1022 } else
1023 continue;
1024
1025 sabres_scanned++;
1026 pbus->sysdata = pbm;
1027 pbm->pci_bus = pbus;
1028 }
1029
1030 if (!sabres_scanned) {
1031 /* Hummingbird, no APBs. */
1032 pbm = &p->pbm_A;
1033 sabre_bus->sysdata = pbm;
1034 pbm->pci_bus = sabre_bus;
1035 }
1036 992
1037 sabre_register_error_handlers(p); 993 sabre_register_error_handlers(p);
1038} 994}
@@ -1089,213 +1045,54 @@ static void sabre_iommu_init(struct pci_controller_info *p,
1089 sabre_write(p->pbm_A.controller_regs + SABRE_IOMMU_CONTROL, control); 1045 sabre_write(p->pbm_A.controller_regs + SABRE_IOMMU_CONTROL, control);
1090} 1046}
1091 1047
1092static void pbm_register_toplevel_resources(struct pci_controller_info *p, 1048static void sabre_pbm_init(struct pci_controller_info *p, struct device_node *dp, u32 dma_start, u32 dma_end)
1093 struct pci_pbm_info *pbm)
1094{ 1049{
1095 char *name = pbm->name; 1050 struct pci_pbm_info *pbm;
1096 unsigned long ibase = p->pbm_A.controller_regs + SABRE_IOSPACE; 1051 struct resource *rp;
1097 unsigned long mbase = p->pbm_A.controller_regs + SABRE_MEMSPACE; 1052
1098 unsigned int devfn; 1053 pbm = &p->pbm_A;
1099 unsigned long first, last, i; 1054 pbm->name = dp->full_name;
1100 u8 *addr, map; 1055 printk("%s: SABRE PCI Bus Module\n", pbm->name);
1101 1056
1102 sprintf(name, "SABRE%d PBM%c", 1057 pbm->chip_type = PBM_CHIP_TYPE_SABRE;
1103 p->index, 1058 pbm->parent = p;
1104 (pbm == &p->pbm_A ? 'A' : 'B')); 1059 pbm->prom_node = dp;
1105 pbm->io_space.name = pbm->mem_space.name = name; 1060 pbm->pci_first_slot = 1;
1106 1061 pbm->pci_first_busno = p->pci_first_busno;
1107 devfn = PCI_DEVFN(1, (pbm == &p->pbm_A) ? 0 : 1); 1062 pbm->pci_last_busno = p->pci_last_busno;
1108 addr = sabre_pci_config_mkaddr(pbm, 0, devfn, APB_IO_ADDRESS_MAP); 1063
1109 map = 0; 1064 pbm->io_space.name = pbm->mem_space.name = pbm->name;
1110 pci_config_read8(addr, &map); 1065
1111 1066 pbm->io_space.start = p->pbm_A.controller_regs + SABRE_IOSPACE;
1112 first = 8; 1067 pbm->io_space.end = pbm->io_space.start + (1UL << 24) - 1UL;
1113 last = 0;
1114 for (i = 0; i < 8; i++) {
1115 if ((map & (1 << i)) != 0) {
1116 if (first > i)
1117 first = i;
1118 if (last < i)
1119 last = i;
1120 }
1121 }
1122 pbm->io_space.start = ibase + (first << 21UL);
1123 pbm->io_space.end = ibase + (last << 21UL) + ((1 << 21UL) - 1);
1124 pbm->io_space.flags = IORESOURCE_IO; 1068 pbm->io_space.flags = IORESOURCE_IO;
1125 1069
1126 addr = sabre_pci_config_mkaddr(pbm, 0, devfn, APB_MEM_ADDRESS_MAP); 1070 pbm->mem_space.start = (p->pbm_A.controller_regs + SABRE_MEMSPACE);
1127 map = 0; 1071 pbm->mem_space.end = (pbm->mem_space.start + ((1UL << 32UL) - 1UL));
1128 pci_config_read8(addr, &map);
1129
1130 first = 8;
1131 last = 0;
1132 for (i = 0; i < 8; i++) {
1133 if ((map & (1 << i)) != 0) {
1134 if (first > i)
1135 first = i;
1136 if (last < i)
1137 last = i;
1138 }
1139 }
1140 pbm->mem_space.start = mbase + (first << 29UL);
1141 pbm->mem_space.end = mbase + (last << 29UL) + ((1 << 29UL) - 1);
1142 pbm->mem_space.flags = IORESOURCE_MEM; 1072 pbm->mem_space.flags = IORESOURCE_MEM;
1143 1073
1144 if (request_resource(&ioport_resource, &pbm->io_space) < 0) { 1074 if (request_resource(&ioport_resource, &pbm->io_space) < 0) {
1145 prom_printf("Cannot register PBM-%c's IO space.\n", 1075 prom_printf("Cannot register Sabre's IO space.\n");
1146 (pbm == &p->pbm_A ? 'A' : 'B'));
1147 prom_halt(); 1076 prom_halt();
1148 } 1077 }
1149 if (request_resource(&iomem_resource, &pbm->mem_space) < 0) { 1078 if (request_resource(&iomem_resource, &pbm->mem_space) < 0) {
1150 prom_printf("Cannot register PBM-%c's MEM space.\n", 1079 prom_printf("Cannot register Sabre's MEM space.\n");
1151 (pbm == &p->pbm_A ? 'A' : 'B'));
1152 prom_halt(); 1080 prom_halt();
1153 } 1081 }
1154 1082
1155 /* Register legacy regions if this PBM covers that area. */ 1083 rp = kmalloc(sizeof(*rp), GFP_KERNEL);
1156 if (pbm->io_space.start == ibase && 1084 if (!rp) {
1157 pbm->mem_space.start == mbase) 1085 prom_printf("Cannot allocate IOMMU resource.\n");
1158 pci_register_legacy_regions(&pbm->io_space, 1086 prom_halt();
1159 &pbm->mem_space);
1160}
1161
1162static void sabre_pbm_init(struct pci_controller_info *p, struct device_node *dp, u32 dma_start, u32 dma_end)
1163{
1164 struct pci_pbm_info *pbm;
1165 struct device_node *node;
1166 struct property *prop;
1167 u32 *busrange;
1168 int len, simbas_found;
1169
1170 simbas_found = 0;
1171 node = dp->child;
1172 while (node != NULL) {
1173 if (strcmp(node->name, "pci"))
1174 goto next_pci;
1175
1176 prop = of_find_property(node, "model", NULL);
1177 if (!prop || strncmp(prop->value, "SUNW,simba", prop->length))
1178 goto next_pci;
1179
1180 simbas_found++;
1181
1182 prop = of_find_property(node, "bus-range", NULL);
1183 busrange = prop->value;
1184 if (busrange[0] == 1)
1185 pbm = &p->pbm_B;
1186 else
1187 pbm = &p->pbm_A;
1188
1189 pbm->name = node->full_name;
1190 printk("%s: SABRE PCI Bus Module\n", pbm->name);
1191
1192 pbm->chip_type = PBM_CHIP_TYPE_SABRE;
1193 pbm->parent = p;
1194 pbm->prom_node = node;
1195 pbm->pci_first_slot = 1;
1196 pbm->pci_first_busno = busrange[0];
1197 pbm->pci_last_busno = busrange[1];
1198
1199 prop = of_find_property(node, "ranges", &len);
1200 if (prop) {
1201 pbm->pbm_ranges = prop->value;
1202 pbm->num_pbm_ranges =
1203 (len / sizeof(struct linux_prom_pci_ranges));
1204 } else {
1205 pbm->num_pbm_ranges = 0;
1206 }
1207
1208 prop = of_find_property(node, "interrupt-map", &len);
1209 if (prop) {
1210 pbm->pbm_intmap = prop->value;
1211 pbm->num_pbm_intmap =
1212 (len / sizeof(struct linux_prom_pci_intmap));
1213
1214 prop = of_find_property(node, "interrupt-map-mask",
1215 NULL);
1216 pbm->pbm_intmask = prop->value;
1217 } else {
1218 pbm->num_pbm_intmap = 0;
1219 }
1220
1221 pbm_register_toplevel_resources(p, pbm);
1222
1223 next_pci:
1224 node = node->sibling;
1225 }
1226 if (simbas_found == 0) {
1227 struct resource *rp;
1228
1229 /* No APBs underneath, probably this is a hummingbird
1230 * system.
1231 */
1232 pbm = &p->pbm_A;
1233 pbm->parent = p;
1234 pbm->prom_node = dp;
1235 pbm->pci_first_busno = p->pci_first_busno;
1236 pbm->pci_last_busno = p->pci_last_busno;
1237
1238 prop = of_find_property(dp, "ranges", &len);
1239 if (prop) {
1240 pbm->pbm_ranges = prop->value;
1241 pbm->num_pbm_ranges =
1242 (len / sizeof(struct linux_prom_pci_ranges));
1243 } else {
1244 pbm->num_pbm_ranges = 0;
1245 }
1246
1247 prop = of_find_property(dp, "interrupt-map", &len);
1248 if (prop) {
1249 pbm->pbm_intmap = prop->value;
1250 pbm->num_pbm_intmap =
1251 (len / sizeof(struct linux_prom_pci_intmap));
1252
1253 prop = of_find_property(dp, "interrupt-map-mask",
1254 NULL);
1255 pbm->pbm_intmask = prop->value;
1256 } else {
1257 pbm->num_pbm_intmap = 0;
1258 }
1259
1260 pbm->name = dp->full_name;
1261 printk("%s: SABRE PCI Bus Module\n", pbm->name);
1262
1263 pbm->io_space.name = pbm->mem_space.name = pbm->name;
1264
1265 /* Hack up top-level resources. */
1266 pbm->io_space.start = p->pbm_A.controller_regs + SABRE_IOSPACE;
1267 pbm->io_space.end = pbm->io_space.start + (1UL << 24) - 1UL;
1268 pbm->io_space.flags = IORESOURCE_IO;
1269
1270 pbm->mem_space.start =
1271 (p->pbm_A.controller_regs + SABRE_MEMSPACE);
1272 pbm->mem_space.end =
1273 (pbm->mem_space.start + ((1UL << 32UL) - 1UL));
1274 pbm->mem_space.flags = IORESOURCE_MEM;
1275
1276 if (request_resource(&ioport_resource, &pbm->io_space) < 0) {
1277 prom_printf("Cannot register Hummingbird's IO space.\n");
1278 prom_halt();
1279 }
1280 if (request_resource(&iomem_resource, &pbm->mem_space) < 0) {
1281 prom_printf("Cannot register Hummingbird's MEM space.\n");
1282 prom_halt();
1283 }
1284
1285 rp = kmalloc(sizeof(*rp), GFP_KERNEL);
1286 if (!rp) {
1287 prom_printf("Cannot allocate IOMMU resource.\n");
1288 prom_halt();
1289 }
1290 rp->name = "IOMMU";
1291 rp->start = pbm->mem_space.start + (unsigned long) dma_start;
1292 rp->end = pbm->mem_space.start + (unsigned long) dma_end - 1UL;
1293 rp->flags = IORESOURCE_BUSY;
1294 request_resource(&pbm->mem_space, rp);
1295
1296 pci_register_legacy_regions(&pbm->io_space,
1297 &pbm->mem_space);
1298 } 1087 }
1088 rp->name = "IOMMU";
1089 rp->start = pbm->mem_space.start + (unsigned long) dma_start;
1090 rp->end = pbm->mem_space.start + (unsigned long) dma_end - 1UL;
1091 rp->flags = IORESOURCE_BUSY;
1092 request_resource(&pbm->mem_space, rp);
1093
1094 pci_register_legacy_regions(&pbm->io_space,
1095 &pbm->mem_space);
1299} 1096}
1300 1097
1301void sabre_init(struct device_node *dp, char *model_name) 1098void sabre_init(struct device_node *dp, char *model_name)
@@ -1303,7 +1100,6 @@ void sabre_init(struct device_node *dp, char *model_name)
1303 struct linux_prom64_registers *pr_regs; 1100 struct linux_prom64_registers *pr_regs;
1304 struct pci_controller_info *p; 1101 struct pci_controller_info *p;
1305 struct pci_iommu *iommu; 1102 struct pci_iommu *iommu;
1306 struct property *prop;
1307 int tsbsize; 1103 int tsbsize;
1308 u32 *busrange; 1104 u32 *busrange;
1309 u32 *vdma; 1105 u32 *vdma;
@@ -1314,13 +1110,9 @@ void sabre_init(struct device_node *dp, char *model_name)
1314 if (!strcmp(model_name, "pci108e,a001")) 1110 if (!strcmp(model_name, "pci108e,a001"))
1315 hummingbird_p = 1; 1111 hummingbird_p = 1;
1316 else if (!strcmp(model_name, "SUNW,sabre")) { 1112 else if (!strcmp(model_name, "SUNW,sabre")) {
1317 prop = of_find_property(dp, "compatible", NULL); 1113 const char *compat = of_get_property(dp, "compatible", NULL);
1318 if (prop) { 1114 if (compat && !strcmp(compat, "pci108e,a001"))
1319 const char *compat = prop->value; 1115 hummingbird_p = 1;
1320
1321 if (!strcmp(compat, "pci108e,a001"))
1322 hummingbird_p = 1;
1323 }
1324 if (!hummingbird_p) { 1116 if (!hummingbird_p) {
1325 struct device_node *dp; 1117 struct device_node *dp;
1326 1118
@@ -1344,18 +1136,14 @@ void sabre_init(struct device_node *dp, char *model_name)
1344 prom_printf("SABRE: Error, kmalloc(pci_iommu) failed.\n"); 1136 prom_printf("SABRE: Error, kmalloc(pci_iommu) failed.\n");
1345 prom_halt(); 1137 prom_halt();
1346 } 1138 }
1347 p->pbm_A.iommu = p->pbm_B.iommu = iommu; 1139 p->pbm_A.iommu = iommu;
1348 1140
1349 upa_portid = 0xff; 1141 upa_portid = of_getintprop_default(dp, "upa-portid", 0xff);
1350 prop = of_find_property(dp, "upa-portid", NULL);
1351 if (prop)
1352 upa_portid = *(u32 *) prop->value;
1353 1142
1354 p->next = pci_controller_root; 1143 p->next = pci_controller_root;
1355 pci_controller_root = p; 1144 pci_controller_root = p;
1356 1145
1357 p->pbm_A.portid = upa_portid; 1146 p->pbm_A.portid = upa_portid;
1358 p->pbm_B.portid = upa_portid;
1359 p->index = pci_num_controllers++; 1147 p->index = pci_num_controllers++;
1360 p->pbms_same_domain = 1; 1148 p->pbms_same_domain = 1;
1361 p->scan_bus = sabre_scan_bus; 1149 p->scan_bus = sabre_scan_bus;
@@ -1367,14 +1155,12 @@ void sabre_init(struct device_node *dp, char *model_name)
1367 * Map in SABRE register set and report the presence of this SABRE. 1155 * Map in SABRE register set and report the presence of this SABRE.
1368 */ 1156 */
1369 1157
1370 prop = of_find_property(dp, "reg", NULL); 1158 pr_regs = of_get_property(dp, "reg", NULL);
1371 pr_regs = prop->value;
1372 1159
1373 /* 1160 /*
1374 * First REG in property is base of entire SABRE register space. 1161 * First REG in property is base of entire SABRE register space.
1375 */ 1162 */
1376 p->pbm_A.controller_regs = pr_regs[0].phys_addr; 1163 p->pbm_A.controller_regs = pr_regs[0].phys_addr;
1377 p->pbm_B.controller_regs = pr_regs[0].phys_addr;
1378 1164
1379 /* Clear interrupts */ 1165 /* Clear interrupts */
1380 1166
@@ -1392,11 +1178,10 @@ void sabre_init(struct device_node *dp, char *model_name)
1392 SABRE_PCICTRL_ARBPARK | SABRE_PCICTRL_AEN)); 1178 SABRE_PCICTRL_ARBPARK | SABRE_PCICTRL_AEN));
1393 1179
1394 /* Now map in PCI config space for entire SABRE. */ 1180 /* Now map in PCI config space for entire SABRE. */
1395 p->pbm_A.config_space = p->pbm_B.config_space = 1181 p->pbm_A.config_space =
1396 (p->pbm_A.controller_regs + SABRE_CONFIGSPACE); 1182 (p->pbm_A.controller_regs + SABRE_CONFIGSPACE);
1397 1183
1398 prop = of_find_property(dp, "virtual-dma", NULL); 1184 vdma = of_get_property(dp, "virtual-dma", NULL);
1399 vdma = prop->value;
1400 1185
1401 dma_mask = vdma[0]; 1186 dma_mask = vdma[0];
1402 switch(vdma[1]) { 1187 switch(vdma[1]) {
@@ -1420,8 +1205,7 @@ void sabre_init(struct device_node *dp, char *model_name)
1420 1205
1421 sabre_iommu_init(p, tsbsize, vdma[0], dma_mask); 1206 sabre_iommu_init(p, tsbsize, vdma[0], dma_mask);
1422 1207
1423 prop = of_find_property(dp, "bus-range", NULL); 1208 busrange = of_get_property(dp, "bus-range", NULL);
1424 busrange = prop->value;
1425 p->pci_first_busno = busrange[0]; 1209 p->pci_first_busno = busrange[0];
1426 p->pci_last_busno = busrange[1]; 1210 p->pci_last_busno = busrange[1];
1427 1211