Lines Matching +full:pdc +full:- +full:global
6 ** (c) Copyright 1999,2000 Hewlett-Packard Company
24 ** The different between Built-in Dino and Card-Mode
27 ** Linux drivers can only use Card-Mode Dino if pci devices I/O port
35 ** 2001-06-14 : Clement Moyroud (moyroudc@esiee.fr)
36 ** - added support for the integrated RS232.
56 #include <asm/pdc.h>
72 ** Config accessor functions only pass in the 8-bit bus number
73 ** and not the 8-bit "PCI Segment" number. Each Dino will be
85 #define is_card_dino(id) ((id)->hw_type == HPHW_A_DMA)
86 #define is_cujo(id) ((id)->hversion == 0x682)
125 #define DINO_IRQS 11 /* bits 0-10 are architected */
138 /* #define xxx 0x080 - bit 7 is "default" */
139 /* #define xxx 0x100 - bit 8 not used */
140 /* #define xxx 0x200 - bit 9 not used */
145 struct pci_hba_data hba; /* 'C' inheritance - must be first */
150 int global_irq[DINO_LOCAL_IRQS]; /* map IMR bit to global irq */
163 /* Check if PCI device is behind a Card-mode Dino. */
168 dino_dev = DINO_DEV(parisc_walk_tree(dev->bus->bridge)); in pci_dev_is_behind_card_dino()
169 return is_card_dino(&dino_dev->hba.dev->id); in pci_dev_is_behind_card_dino()
180 * tries to keep a global bus count total so that when we discover an
188 struct dino_device *d = DINO_DEV(parisc_walk_tree(bus->bridge)); in dino_cfg_read()
189 u32 local_bus = (bus->parent == NULL) ? 0 : bus->busn_res.start; in dino_cfg_read()
191 void __iomem *base_addr = d->hba.base_addr; in dino_cfg_read()
196 spin_lock_irqsave(&d->dinosaur_pen, flags); in dino_cfg_read()
210 spin_unlock_irqrestore(&d->dinosaur_pen, flags); in dino_cfg_read()
223 struct dino_device *d = DINO_DEV(parisc_walk_tree(bus->bridge)); in dino_cfg_write()
224 u32 local_bus = (bus->parent == NULL) ? 0 : bus->busn_res.start; in dino_cfg_write()
226 void __iomem *base_addr = d->hba.base_addr; in dino_cfg_write()
231 spin_lock_irqsave(&d->dinosaur_pen, flags); in dino_cfg_write()
248 spin_unlock_irqrestore(&d->dinosaur_pen, flags); in dino_cfg_write()
272 spin_lock_irqsave(&(DINO_DEV(d)->dinosaur_pen), flags); \
274 __raw_writel((u32) addr, d->base_addr + DINO_PCI_ADDR); \
276 v = read##type(d->base_addr+DINO_IO_DATA+(addr&mask)); \
277 spin_unlock_irqrestore(&(DINO_DEV(d)->dinosaur_pen), flags); \
289 spin_lock_irqsave(&(DINO_DEV(d)->dinosaur_pen), flags); \
291 __raw_writel((u32) addr, d->base_addr + DINO_PCI_ADDR); \
293 write##type(val, d->base_addr+DINO_IO_DATA+(addr&mask)); \
294 spin_unlock_irqrestore(&(DINO_DEV(d)->dinosaur_pen), flags); \
313 int local_irq = gsc_find_local_irq(d->irq, dino_dev->global_irq, DINO_LOCAL_IRQS); in dino_mask_irq()
315 DBG(KERN_WARNING "%s(0x%px, %d)\n", __func__, dino_dev, d->irq); in dino_mask_irq()
318 dino_dev->imr &= ~(DINO_MASK_IRQ(local_irq)); in dino_mask_irq()
319 __raw_writel(dino_dev->imr, dino_dev->hba.base_addr+DINO_IMR); in dino_mask_irq()
325 int local_irq = gsc_find_local_irq(d->irq, dino_dev->global_irq, DINO_LOCAL_IRQS); in dino_unmask_irq()
328 DBG(KERN_WARNING "%s(0x%px, %d)\n", __func__, dino_dev, d->irq); in dino_unmask_irq()
336 __raw_readl(dino_dev->hba.base_addr+DINO_IPR); in dino_unmask_irq()
339 dino_dev->imr |= DINO_MASK_IRQ(local_irq); /* used in dino_isr() */ in dino_unmask_irq()
340 __raw_writel( dino_dev->imr, dino_dev->hba.base_addr+DINO_IMR); in dino_unmask_irq()
351 tmp = __raw_readl(dino_dev->hba.base_addr+DINO_ILR); in dino_unmask_irq()
355 gsc_writel(dino_dev->txn_data, dino_dev->txn_addr); in dino_unmask_irq()
360 .name = "GSC-PCI",
380 dino_dev->dino_irr0 = in dino_isr()
382 mask = __raw_readl(dino_dev->hba.base_addr+DINO_IRR0) & DINO_IRR_MASK; in dino_isr()
390 int irq = dino_dev->global_irq[local_irq]; in dino_isr()
404 mask = __raw_readl(dino_dev->hba.base_addr+DINO_ILR) & dino_dev->imr; in dino_isr()
406 if (--ilr_loop > 0) in dino_isr()
409 dino_dev->hba.base_addr, mask); in dino_isr()
422 dino->global_irq[local_irq] = irq; in dino_assign_irq()
430 switch (dev->id.sversion) { in dino_choose_irq()
437 dino_assign_irq(dino, irq, &dev->irq); in dino_choose_irq()
443 …* (the irqs are off-by-one, not sure yet if this is a cirrus, dino-hardware or dino-driver problem…
447 u8 new_irq = dev->irq - 1; in quirk_cirrus_cardbus()
449 pci_name(dev), dev->irq, new_irq); in quirk_cirrus_cardbus()
450 dev->irq = new_irq; in quirk_cirrus_cardbus()
461 pr_warn("%s: HP HSC-PCI Cards with card-mode Dino not yet supported.\n", in pci_fixup_tulip()
464 memset(&dev->resource[0], 0, sizeof(dev->resource[0])); in pci_fixup_tulip()
465 memset(&dev->resource[1], 0, sizeof(dev->resource[1])); in pci_fixup_tulip()
477 * dino_card_setup - Set up the memory space for a Dino in card mode.
488 struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->bridge)); in dino_card_setup()
493 res = &dino_dev->hba.lmmio_space; in dino_card_setup()
494 res->flags = IORESOURCE_MEM; in dino_card_setup()
496 dev_name(bus->bridge)); in dino_card_setup()
497 res->name = kmalloc(size+1, GFP_KERNEL); in dino_card_setup()
498 if(res->name) in dino_card_setup()
499 strcpy((char *)res->name, name); in dino_card_setup()
501 res->name = dino_dev->hba.lmmio_space.name; in dino_card_setup()
504 if (ccio_allocate_resource(dino_dev->hba.dev, res, _8MB, in dino_card_setup()
510 dev_name(bus->bridge)); in dino_card_setup()
512 list_for_each_entry_safe(dev, tmp, &bus->devices, bus_list) { in dino_card_setup()
513 list_del(&dev->bus_list); in dino_card_setup()
518 bus->resource[1] = res; in dino_card_setup()
519 bus->resource[0] = &(dino_dev->hba.io_space); in dino_card_setup()
523 if (res->start == F_EXTEND(0xf0000000UL | (i * _8MB))) in dino_card_setup()
527 i, res->start, base_addr + DINO_IO_ADDR_EN); in dino_card_setup()
537 ** REVISIT: card-mode PCI-PCI expansion chassis do exist. in dino_card_fixup()
541 if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { in dino_card_fixup()
542 panic("Card-Mode Dino: PCI-PCI Bridge not supported\n"); in dino_card_fixup()
549 dino_cfg_write(dev->bus, dev->devfn, in dino_card_fixup()
553 ** Program INT_LINE for card-mode devices. in dino_card_fixup()
558 ** "-1" converts INTA-D (1-4) to PCIINTA-D (0-3) range. in dino_card_fixup()
559 ** The additional "-1" adjusts for skewing the IRQ<->slot. in dino_card_fixup()
561 dino_cfg_read(dev->bus, dev->devfn, PCI_INTERRUPT_PIN, 1, &irq_pin); in dino_card_fixup()
562 dev->irq = pci_swizzle_interrupt_pin(dev, irq_pin) - 1; in dino_card_fixup()
567 dino_cfg_write(dev->bus, dev->devfn, PCI_INTERRUPT_LINE, 1, dev->irq); in dino_card_fixup()
578 struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->bridge)); in dino_fixup_bus()
581 __func__, bus, bus->busn_res.start, in dino_fixup_bus()
582 bus->bridge->platform_data); in dino_fixup_bus()
584 /* Firmware doesn't set up card-mode dino, so we have to */ in dino_fixup_bus()
585 if (is_card_dino(&dino_dev->hba.dev->id)) { in dino_fixup_bus()
586 dino_card_setup(bus, dino_dev->hba.base_addr); in dino_fixup_bus()
587 } else if (bus->parent) { in dino_fixup_bus()
594 if((bus->self->resource[i].flags & in dino_fixup_bus()
598 if(bus->self->resource[i].flags & IORESOURCE_MEM) { in dino_fixup_bus()
601 * is the alignment and start-end is in dino_fixup_bus()
605 …bus->self->resource[i].end = bus->self->resource[i].end - bus->self->resource[i].start + DINO_BRID… in dino_fixup_bus()
606 bus->self->resource[i].start = DINO_BRIDGE_ALIGN; in dino_fixup_bus()
611 dev_name(&bus->self->dev), i, in dino_fixup_bus()
612 &bus->self->resource[i]); in dino_fixup_bus()
613 WARN_ON(pci_assign_resource(bus->self, i)); in dino_fixup_bus()
615 dev_name(&bus->self->dev), i, in dino_fixup_bus()
616 &bus->self->resource[i]); in dino_fixup_bus()
621 list_for_each_entry(dev, &bus->devices, bus_list) { in dino_fixup_bus()
622 if (is_card_dino(&dino_dev->hba.dev->id)) in dino_fixup_bus()
629 if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { in dino_fixup_bus()
637 dev->resource[PCI_ROM_RESOURCE].flags = 0; in dino_fixup_bus()
639 if(dev->irq == 255) { in dino_fixup_bus()
647 * pin<->interrupt line mapping varies by bus in dino_fixup_bus()
652 dino_cfg_read(dev->bus, dev->devfn, in dino_fixup_bus()
654 irq_pin = pci_swizzle_interrupt_pin(dev, irq_pin) - 1; in dino_fixup_bus()
657 dino_cfg_write(dev->bus, dev->devfn, in dino_fixup_bus()
659 dino_assign_irq(dino_dev, irq_pin, &dev->irq); in dino_fixup_bus()
661 dev->irq = 65535; in dino_fixup_bus()
666 dino_assign_irq(dino_dev, dev->irq, &dev->irq); in dino_fixup_bus()
687 status = __raw_readl(dino_dev->hba.base_addr+DINO_IO_STATUS); in dino_card_init()
690 dino_dev->hba.base_addr+DINO_IO_COMMAND); in dino_card_init()
694 __raw_writel(0x00000000, dino_dev->hba.base_addr+DINO_GMASK); in dino_card_init()
695 __raw_writel(0x00000001, dino_dev->hba.base_addr+DINO_IO_FBB_EN); in dino_card_init()
696 __raw_writel(0x00000000, dino_dev->hba.base_addr+DINO_ICR); in dino_card_init()
699 /* REVISIT - should be a runtime check (eg if (CPU_IS_PCX_L) ...) */ in dino_card_init()
701 ** PCX-L processors don't support XQL like Dino wants it. in dino_card_init()
702 ** PCX-L2 ignore XQL signal and it doesn't matter. in dino_card_init()
706 __raw_writel( brdg_feat, dino_dev->hba.base_addr+DINO_BRDG_FEAT); in dino_card_init()
713 __raw_writel(0x00000000, dino_dev->hba.base_addr+DINO_IO_ADDR_EN); in dino_card_init()
715 __raw_writel(0x00000000, dino_dev->hba.base_addr+DINO_DAMODE); in dino_card_init()
716 __raw_writel(0x00222222, dino_dev->hba.base_addr+DINO_PCIROR); in dino_card_init()
717 __raw_writel(0x00222222, dino_dev->hba.base_addr+DINO_PCIWOR); in dino_card_init()
719 __raw_writel(0x00000040, dino_dev->hba.base_addr+DINO_MLTIM); in dino_card_init()
720 __raw_writel(0x00000080, dino_dev->hba.base_addr+DINO_IO_CONTROL); in dino_card_init()
721 __raw_writel(0x0000008c, dino_dev->hba.base_addr+DINO_TLTIM); in dino_card_init()
724 __raw_writel(0x0000007e, dino_dev->hba.base_addr+DINO_PAMR); in dino_card_init()
725 __raw_writel(0x0000007f, dino_dev->hba.base_addr+DINO_PAPR); in dino_card_init()
726 __raw_writel(0x00000000, dino_dev->hba.base_addr+DINO_PAMR); in dino_card_init()
733 __raw_writel(0x0000004f, dino_dev->hba.base_addr+DINO_PCICMD); in dino_card_init()
736 ** to recover from the #RESET being de-asserted. in dino_card_init()
738 ** This short-cut speeds up booting significantly. in dino_card_init()
750 * Decoding IO_ADDR_EN only works for Built-in Dino in dino_bridge_init()
751 * since PDC has already initialized this. in dino_bridge_init()
754 io_addr = __raw_readl(dino_dev->hba.base_addr + DINO_IO_ADDR_EN); in dino_bridge_init()
757 return -ENODEV; in dino_bridge_init()
760 res = &dino_dev->hba.lmmio_space; in dino_bridge_init()
768 end = start + 8 * 1024 * 1024 - 1; in dino_bridge_init()
770 DBG("DINO RANGE %d is at 0x%lx-0x%lx\n", count, in dino_bridge_init()
773 if(prevres && prevres->end + 1 == start) { in dino_bridge_init()
774 prevres->end = end; in dino_bridge_init()
777 …printk(KERN_ERR "%s is out of resource windows for range %d (0x%lx-0x%lx)\n", name, count, start, … in dino_bridge_init()
781 res->start = start; in dino_bridge_init()
782 res->end = end; in dino_bridge_init()
783 res->flags = IORESOURCE_MEM; in dino_bridge_init()
784 res->name = kmalloc(64, GFP_KERNEL); in dino_bridge_init()
785 if(res->name) in dino_bridge_init()
786 snprintf((char *)res->name, 64, "%s LMMIO %d", in dino_bridge_init()
793 res = &dino_dev->hba.lmmio_space; in dino_bridge_init()
799 result = ccio_request_resource(dino_dev->hba.dev, &res[i]); in dino_bridge_init()
817 pcibios_register_hba(&dino_dev->hba); in dino_common_init()
826 ** still only has 11 IRQ input lines - just map some of them in dino_common_init()
829 dev->irq = gsc_alloc_irq(&gsc_irq); in dino_common_init()
830 dino_dev->txn_addr = gsc_irq.txn_addr; in dino_common_init()
831 dino_dev->txn_data = gsc_irq.txn_data; in dino_common_init()
838 if (dev->irq < 0) { in dino_common_init()
843 status = request_irq(dev->irq, dino_isr, 0, name, dino_dev); in dino_common_init()
850 /* Support the serial port which is sometimes attached on built-in in dino_common_init()
861 __raw_writel(eim, dino_dev->hba.base_addr+DINO_IAR0); in dino_common_init()
867 __raw_readl(dino_dev->hba.base_addr+DINO_IRR0); in dino_common_init()
870 res = &dino_dev->hba.io_space; in dino_common_init()
871 if (!is_cujo(&dev->id)) { in dino_common_init()
872 res->name = "Dino I/O Port"; in dino_common_init()
874 res->name = "Cujo I/O Port"; in dino_common_init()
876 res->start = HBA_PORT_BASE(dino_dev->hba.hba_num); in dino_common_init()
877 res->end = res->start + (HBA_PORT_SPACE_SIZE - 1); in dino_common_init()
878 res->flags = IORESOURCE_IO; /* do not mark it busy ! */ in dino_common_init()
882 name, (unsigned long)res->start, (unsigned long)res->end, in dino_common_init()
883 dino_dev->hba.base_addr); in dino_common_init()
911 ** If so, initialize the chip appropriately (card-mode vs bridge mode).
922 unsigned long hpa = dev->hpa.start; in dino_probe()
926 if (is_card_dino(&dev->id)) { in dino_probe()
929 if (!is_cujo(&dev->id)) { in dino_probe()
930 if (dev->id.hversion_rev < 4) { in dino_probe()
931 version = dino_vers[dev->id.hversion_rev]; in dino_probe()
936 if (dev->id.hversion_rev < 2) { in dino_probe()
937 version = cujo_vers[dev->id.hversion_rev]; in dino_probe()
951 if (is_cujo && dev->id.hversion_rev == 1) { in dino_probe()
962 } else if (!is_cujo && !is_card_dino(&dev->id) && in dino_probe()
963 dev->id.hversion_rev < 3) { in dino_probe()
966 "data corruption. See Service Note Numbers: A4190A-01, A4191A-01.\n" in dino_probe()
969 dev->id.hversion_rev); in dino_probe()
977 printk("dino_init_chip - couldn't alloc dino_device\n"); in dino_probe()
981 dino_dev->hba.dev = dev; in dino_probe()
982 dino_dev->hba.base_addr = ioremap_nocache(hpa, 4096); in dino_probe()
983 dino_dev->hba.lmmio_space_offset = PCI_F_EXTEND; in dino_probe()
984 spin_lock_init(&dino_dev->dinosaur_pen); in dino_probe()
985 dino_dev->hba.iommu = ccio_get_iommu(dev); in dino_probe()
987 if (is_card_dino(&dev->id)) { in dino_probe()
996 dev->dev.platform_data = dino_dev; in dino_probe()
998 pci_add_resource_offset(&resources, &dino_dev->hba.io_space, in dino_probe()
999 HBA_PORT_BASE(dino_dev->hba.hba_num)); in dino_probe()
1000 if (dino_dev->hba.lmmio_space.flags) in dino_probe()
1001 pci_add_resource_offset(&resources, &dino_dev->hba.lmmio_space, in dino_probe()
1002 dino_dev->hba.lmmio_space_offset); in dino_probe()
1003 if (dino_dev->hba.elmmio_space.flags) in dino_probe()
1004 pci_add_resource_offset(&resources, &dino_dev->hba.elmmio_space, in dino_probe()
1005 dino_dev->hba.lmmio_space_offset); in dino_probe()
1006 if (dino_dev->hba.gmmio_space.flags) in dino_probe()
1007 pci_add_resource(&resources, &dino_dev->hba.gmmio_space); in dino_probe()
1009 dino_dev->hba.bus_num.start = dino_current_bus; in dino_probe()
1010 dino_dev->hba.bus_num.end = 255; in dino_probe()
1011 dino_dev->hba.bus_num.flags = IORESOURCE_BUS; in dino_probe()
1012 pci_add_resource(&resources, &dino_dev->hba.bus_num); in dino_probe()
1017 dino_dev->hba.hba_bus = bus = pci_create_root_bus(&dev->dev, in dino_probe()
1021 dev_name(&dev->dev), dino_current_bus); in dino_probe()
1032 * if it isn't, this global bus number count will fail in dino_probe()
1043 * Unfortunately, the J2240 PDC reports the wrong hversion for the first
1044 * Dino, so we have to test for Dino, Cujo and Dino-in-a-J2240.
1045 * For card-mode Dino, most machines report an sversion of 9D. But 715
1050 { HPHW_A_DMA, HVERSION_REV_ANY_ID, 0x004, 0x0009D },/* Card-mode Dino */
1052 { HPHW_BRIDGE, HVERSION_REV_ANY_ID, 0x680, 0xa }, /* Bridge-mode Dino */
1053 { HPHW_BRIDGE, HVERSION_REV_ANY_ID, 0x682, 0xa }, /* Bridge-mode Cujo */