Commit bc606f3c authored by David S. Miller's avatar David S. Miller

[SPARC64]: Minor cleanups to schizo pci controller driver.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1e8a8cc5
...@@ -1229,21 +1229,8 @@ static void pbm_config_busmastering(struct pci_pbm_info *pbm) ...@@ -1229,21 +1229,8 @@ static void pbm_config_busmastering(struct pci_pbm_info *pbm)
pci_config_write8(addr, 64); pci_config_write8(addr, 64);
} }
static void pbm_scan_bus(struct pci_controller_info *p, static void schizo_scan_bus(struct pci_controller_info *p)
struct pci_pbm_info *pbm)
{
pbm->pci_bus = pci_scan_one_pbm(pbm);
}
static void __schizo_scan_bus(struct pci_controller_info *p,
int chip_type)
{ {
if (!p->pbm_B.prom_node || !p->pbm_A.prom_node) {
printk("PCI: Only one PCI bus module of controller found.\n");
printk("PCI: Ignoring entire controller.\n");
return;
}
pbm_config_busmastering(&p->pbm_B); pbm_config_busmastering(&p->pbm_B);
p->pbm_B.is_66mhz_capable = p->pbm_B.is_66mhz_capable =
(of_find_property(p->pbm_B.prom_node, "66mhz-capable", NULL) (of_find_property(p->pbm_B.prom_node, "66mhz-capable", NULL)
...@@ -1252,28 +1239,19 @@ static void __schizo_scan_bus(struct pci_controller_info *p, ...@@ -1252,28 +1239,19 @@ static void __schizo_scan_bus(struct pci_controller_info *p,
p->pbm_A.is_66mhz_capable = p->pbm_A.is_66mhz_capable =
(of_find_property(p->pbm_A.prom_node, "66mhz-capable", NULL) (of_find_property(p->pbm_A.prom_node, "66mhz-capable", NULL)
!= NULL); != NULL);
pbm_scan_bus(p, &p->pbm_B);
pbm_scan_bus(p, &p->pbm_A); p->pbm_B.pci_bus = pci_scan_one_pbm(&p->pbm_B);
p->pbm_A.pci_bus = pci_scan_one_pbm(&p->pbm_A);
/* After the PCI bus scan is complete, we can register /* After the PCI bus scan is complete, we can register
* the error interrupt handlers. * the error interrupt handlers.
*/ */
if (chip_type == PBM_CHIP_TYPE_TOMATILLO) if (p->pbm_B.chip_type == PBM_CHIP_TYPE_TOMATILLO)
tomatillo_register_error_handlers(p); tomatillo_register_error_handlers(p);
else else
schizo_register_error_handlers(p); schizo_register_error_handlers(p);
} }
static void schizo_scan_bus(struct pci_controller_info *p)
{
__schizo_scan_bus(p, PBM_CHIP_TYPE_SCHIZO);
}
static void tomatillo_scan_bus(struct pci_controller_info *p)
{
__schizo_scan_bus(p, PBM_CHIP_TYPE_TOMATILLO);
}
static void schizo_base_address_update(struct pci_dev *pdev, int resource) static void schizo_base_address_update(struct pci_dev *pdev, int resource)
{ {
struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller; struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller;
...@@ -1633,7 +1611,6 @@ static void schizo_pbm_init(struct pci_controller_info *p, ...@@ -1633,7 +1611,6 @@ static void schizo_pbm_init(struct pci_controller_info *p,
int chip_type) int chip_type)
{ {
struct linux_prom64_registers *regs; struct linux_prom64_registers *regs;
struct property *prop;
unsigned int *busrange; unsigned int *busrange;
struct pci_pbm_info *pbm; struct pci_pbm_info *pbm;
const char *chipset_name; const char *chipset_name;
...@@ -1667,11 +1644,9 @@ static void schizo_pbm_init(struct pci_controller_info *p, ...@@ -1667,11 +1644,9 @@ static void schizo_pbm_init(struct pci_controller_info *p,
* 3) PBM PCI config space * 3) PBM PCI config space
* 4) Ichip regs * 4) Ichip regs
*/ */
prop = of_find_property(dp, "reg", NULL); regs = of_get_property(dp, "reg", NULL);
regs = prop->value;
is_pbm_a = ((regs[0].phys_addr & 0x00700000) == 0x00600000); is_pbm_a = ((regs[0].phys_addr & 0x00700000) == 0x00600000);
if (is_pbm_a) if (is_pbm_a)
pbm = &p->pbm_A; pbm = &p->pbm_A;
else else
...@@ -1683,14 +1658,8 @@ static void schizo_pbm_init(struct pci_controller_info *p, ...@@ -1683,14 +1658,8 @@ static void schizo_pbm_init(struct pci_controller_info *p,
pbm->pci_first_slot = 1; pbm->pci_first_slot = 1;
pbm->chip_type = chip_type; pbm->chip_type = chip_type;
pbm->chip_version = 0; pbm->chip_version = of_getintprop_default(dp, "version#", 0);
prop = of_find_property(dp, "version#", NULL); pbm->chip_revision = of_getintprop_default(dp, "module-version#", 0);
if (prop)
pbm->chip_version = *(int *) prop->value;
pbm->chip_revision = 0;
prop = of_find_property(dp, "module-revision#", NULL);
if (prop)
pbm->chip_revision = *(int *) prop->value;
pbm->pbm_regs = regs[0].phys_addr; pbm->pbm_regs = regs[0].phys_addr;
pbm->controller_regs = regs[1].phys_addr - 0x10000UL; pbm->controller_regs = regs[1].phys_addr - 0x10000UL;
...@@ -1701,40 +1670,31 @@ static void schizo_pbm_init(struct pci_controller_info *p, ...@@ -1701,40 +1670,31 @@ static void schizo_pbm_init(struct pci_controller_info *p,
pbm->name = dp->full_name; pbm->name = dp->full_name;
printk("%s: %s PCI Bus Module ver[%x:%x]\n", printk("%s: %s PCI Bus Module ver[%x:%x]\n",
pbm->name, pbm->name, chipset_name,
(chip_type == PBM_CHIP_TYPE_TOMATILLO ?
"TOMATILLO" : "SCHIZO"),
pbm->chip_version, pbm->chip_revision); pbm->chip_version, pbm->chip_revision);
schizo_pbm_hw_init(pbm); schizo_pbm_hw_init(pbm);
prop = of_find_property(dp, "ranges", &len); pbm->pbm_ranges = of_get_property(dp, "ranges", &len);
pbm->pbm_ranges = prop->value;
pbm->num_pbm_ranges = pbm->num_pbm_ranges =
(len / sizeof(struct linux_prom_pci_ranges)); (len / sizeof(struct linux_prom_pci_ranges));
schizo_determine_mem_io_space(pbm); schizo_determine_mem_io_space(pbm);
pbm_register_toplevel_resources(p, pbm); pbm_register_toplevel_resources(p, pbm);
prop = of_find_property(dp, "interrupt-map", &len); pbm->pbm_intmap = of_get_property(dp, "interrupt-map", &len);
if (prop) { if (pbm->pbm_intmap) {
pbm->pbm_intmap = prop->value;
pbm->num_pbm_intmap = pbm->num_pbm_intmap =
(len / sizeof(struct linux_prom_pci_intmap)); (len / sizeof(struct linux_prom_pci_intmap));
pbm->pbm_intmask =
prop = of_find_property(dp, "interrupt-map-mask", NULL); of_get_property(dp, "interrupt-map-mask", NULL);
pbm->pbm_intmask = prop->value;
} else {
pbm->num_pbm_intmap = 0;
} }
prop = of_find_property(dp, "ino-bitmap", NULL); ino_bitmap = of_get_property(dp, "ino-bitmap", NULL);
ino_bitmap = prop->value;
pbm->ino_bitmap = (((u64)ino_bitmap[1] << 32UL) | pbm->ino_bitmap = (((u64)ino_bitmap[1] << 32UL) |
((u64)ino_bitmap[0] << 0UL)); ((u64)ino_bitmap[0] << 0UL));
prop = of_find_property(dp, "bus-range", NULL); busrange = of_get_property(dp, "bus-range", NULL);
busrange = prop->value;
pbm->pci_first_busno = busrange[0]; pbm->pci_first_busno = busrange[0];
pbm->pci_last_busno = busrange[1]; pbm->pci_last_busno = busrange[1];
...@@ -1756,14 +1716,9 @@ static void __schizo_init(struct device_node *dp, char *model_name, int chip_typ ...@@ -1756,14 +1716,9 @@ static void __schizo_init(struct device_node *dp, char *model_name, int chip_typ
{ {
struct pci_controller_info *p; struct pci_controller_info *p;
struct pci_iommu *iommu; struct pci_iommu *iommu;
struct property *prop;
int is_pbm_a;
u32 portid; u32 portid;
portid = 0xff; portid = of_getintprop_default(dp, "portid", 0xff);
prop = of_find_property(dp, "portid", NULL);
if (prop)
portid = *(u32 *) prop->value;
for (p = pci_controller_root; p; p = p->next) { for (p = pci_controller_root; p; p = p->next) {
struct pci_pbm_info *pbm; struct pci_pbm_info *pbm;
...@@ -1776,40 +1731,32 @@ static void __schizo_init(struct device_node *dp, char *model_name, int chip_typ ...@@ -1776,40 +1731,32 @@ static void __schizo_init(struct device_node *dp, char *model_name, int chip_typ
&p->pbm_B); &p->pbm_B);
if (portid_compare(pbm->portid, portid, chip_type)) { if (portid_compare(pbm->portid, portid, chip_type)) {
is_pbm_a = (p->pbm_A.prom_node == NULL);
schizo_pbm_init(p, dp, portid, chip_type); schizo_pbm_init(p, dp, portid, chip_type);
return; return;
} }
} }
p = kzalloc(sizeof(struct pci_controller_info), GFP_ATOMIC); p = kzalloc(sizeof(struct pci_controller_info), GFP_ATOMIC);
if (!p) { if (!p)
prom_printf("SCHIZO: Fatal memory allocation error.\n"); goto memfail;
prom_halt();
}
iommu = kzalloc(sizeof(struct pci_iommu), GFP_ATOMIC); iommu = kzalloc(sizeof(struct pci_iommu), GFP_ATOMIC);
if (!iommu) { if (!iommu)
prom_printf("SCHIZO: Fatal memory allocation error.\n"); goto memfail;
prom_halt();
}
p->pbm_A.iommu = iommu; p->pbm_A.iommu = iommu;
iommu = kzalloc(sizeof(struct pci_iommu), GFP_ATOMIC); iommu = kzalloc(sizeof(struct pci_iommu), GFP_ATOMIC);
if (!iommu) { if (!iommu)
prom_printf("SCHIZO: Fatal memory allocation error.\n"); goto memfail;
prom_halt();
}
p->pbm_B.iommu = iommu; p->pbm_B.iommu = iommu;
p->next = pci_controller_root; p->next = pci_controller_root;
pci_controller_root = p; pci_controller_root = p;
p->index = pci_num_controllers++; p->index = pci_num_controllers++;
p->pbms_same_domain = 0; p->scan_bus = schizo_scan_bus;
p->scan_bus = (chip_type == PBM_CHIP_TYPE_TOMATILLO ?
tomatillo_scan_bus :
schizo_scan_bus);
p->base_address_update = schizo_base_address_update; p->base_address_update = schizo_base_address_update;
p->resource_adjust = schizo_resource_adjust; p->resource_adjust = schizo_resource_adjust;
p->pci_ops = &schizo_ops; p->pci_ops = &schizo_ops;
...@@ -1818,6 +1765,11 @@ static void __schizo_init(struct device_node *dp, char *model_name, int chip_typ ...@@ -1818,6 +1765,11 @@ static void __schizo_init(struct device_node *dp, char *model_name, int chip_typ
pci_memspace_mask = 0x7fffffffUL; pci_memspace_mask = 0x7fffffffUL;
schizo_pbm_init(p, dp, portid, chip_type); schizo_pbm_init(p, dp, portid, chip_type);
return;
memfail:
prom_printf("SCHIZO: Fatal memory allocation error.\n");
prom_halt();
} }
void schizo_init(struct device_node *dp, char *model_name) void schizo_init(struct device_node *dp, char *model_name)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment