1 // SPDX-License-Identifier: GPL-2.0-only
3 * SGI IOC3 master driver and IRQ demuxer
6 * Heavily based on similar work by:
11 #include <linux/errno.h>
12 #include <linux/module.h>
13 #include <linux/pci.h>
14 #include <linux/dma-mapping.h>
15 #include <linux/interrupt.h>
16 #include <linux/spinlock.h>
17 #include <linux/delay.h>
18 #include <linux/ioc3.h>
19 #include <linux/rwsem.h>
20 #include <linux/slab.h>
22 #define IOC3_PCI_SIZE 0x100000
24 static LIST_HEAD(ioc3_devices);
25 static int ioc3_counter;
26 static DECLARE_RWSEM(ioc3_devices_rwsem);
28 static struct ioc3_submodule *ioc3_submodules[IOC3_MAX_SUBMODULES];
29 static struct ioc3_submodule *ioc3_ethernet;
30 static DEFINE_RWLOCK(ioc3_submodules_lock);
32 /* NIC probing code */
34 #define GPCR_MLAN_EN 0x00200000 /* enable MCR to pin 8 */
36 static inline unsigned mcr_pack(unsigned pulse, unsigned sample)
38 return (pulse << 10) | (sample << 2);
41 static int nic_wait(struct ioc3_driver_data *idd)
46 mcr = readl(&idd->vma->mcr);
52 static int nic_reset(struct ioc3_driver_data *idd)
57 local_irq_save(flags);
58 writel(mcr_pack(500, 65), &idd->vma->mcr);
59 presence = nic_wait(idd);
60 local_irq_restore(flags);
67 static int nic_read_bit(struct ioc3_driver_data *idd)
72 local_irq_save(flags);
73 writel(mcr_pack(6, 13), &idd->vma->mcr);
74 result = nic_wait(idd);
75 local_irq_restore(flags);
82 static void nic_write_bit(struct ioc3_driver_data *idd, int bit)
85 writel(mcr_pack(6, 110), &idd->vma->mcr);
87 writel(mcr_pack(80, 30), &idd->vma->mcr);
92 static unsigned nic_read_byte(struct ioc3_driver_data *idd)
97 for (i = 0; i < 8; i++)
98 result = (result >> 1) | (nic_read_bit(idd) << 7);
103 static void nic_write_byte(struct ioc3_driver_data *idd, int byte)
107 for (i = 8; i; i--) {
111 nic_write_bit(idd, bit);
116 nic_find(struct ioc3_driver_data *idd, int *last, unsigned long addr)
118 int a, b, index, disc;
123 nic_write_byte(idd, 0xF0);
125 /* Algorithm from ``Book of iButton Standards''. */
126 for (index = 0, disc = 0; index < 64; index++) {
127 a = nic_read_bit(idd);
128 b = nic_read_bit(idd);
131 printk(KERN_WARNING "IOC3 NIC search failed.\n");
137 if (index == *last) {
138 addr |= 1UL << index;
139 } else if (index > *last) {
140 addr &= ~(1UL << index);
142 } else if ((addr & (1UL << index)) == 0)
144 nic_write_bit(idd, (addr>>index)&1);
148 addr |= 1UL << index;
150 addr &= ~(1UL << index);
151 nic_write_bit(idd, a);
159 static void nic_addr(struct ioc3_driver_data *idd, unsigned long addr)
164 nic_write_byte(idd, 0xF0);
165 for (index = 0; index < 64; index++) {
168 nic_write_bit(idd, (addr>>index)&1);
172 static void crc16_byte(unsigned int *crc, unsigned char db)
178 if((db^(*crc>>16)) & 1)
185 static unsigned int crc16_area(unsigned char *dbs, int size, unsigned int crc)
188 crc16_byte(&crc, *(dbs++));
192 static void crc8_byte(unsigned int *crc, unsigned char db)
206 static unsigned int crc8_addr(unsigned long addr)
209 unsigned int crc = 0x00;
212 crc8_byte(&crc, addr>>(i<<3));
217 read_redir_page(struct ioc3_driver_data *idd, unsigned long addr, int page,
218 unsigned char *redir, unsigned char *data)
222 while(redir[page] != 0xFF) {
223 page = redir[page]^0xFF;
226 printk(KERN_ERR "IOC3: NIC circular redirection\n");
233 nic_write_byte(idd, 0xF0);
234 nic_write_byte(idd, (page << 5) & 0xE0);
235 nic_write_byte(idd, (page >> 3) & 0x1F);
237 data[i] = nic_read_byte(idd);
238 if(crc16_area(data, 0x20, 0x0000) == 0x800d)
242 printk(KERN_ERR "IOC3: CRC error in data page\n");
248 read_redir_map(struct ioc3_driver_data *idd, unsigned long addr,
249 unsigned char *redir)
251 int i,j,loops = 3,crc_ok;
257 nic_write_byte(idd, 0xAA);
258 nic_write_byte(idd, 0x00);
259 nic_write_byte(idd, 0x01);
262 redir[i+j] = nic_read_byte(idd);
263 crc = crc16_area(redir+i, 8, (i==0)?0x8707:0x0000);
264 crc16_byte(&crc, nic_read_byte(idd));
265 crc16_byte(&crc, nic_read_byte(idd));
273 printk(KERN_ERR "IOC3: CRC error in redirection page\n");
278 static void read_nic(struct ioc3_driver_data *idd, unsigned long addr)
280 unsigned char redir[64];
281 unsigned char data[64],part[32];
284 /* read redirections */
285 read_redir_map(idd, addr, redir);
286 /* read data pages */
287 read_redir_page(idd, addr, 0, redir, data);
288 read_redir_page(idd, addr, 1, redir, data+32);
289 /* assemble the part # */
292 if(data[i+11] != ' ')
293 part[j++] = data[i+11];
295 if(data[i+32] != ' ')
296 part[j++] = data[i+32];
298 /* skip Octane power supplies */
299 if(!strncmp(part, "060-0035-", 9))
301 if(!strncmp(part, "060-0038-", 9))
303 strcpy(idd->nic_part, part);
304 /* assemble the serial # */
308 idd->nic_serial[j++] = data[i+1];
309 idd->nic_serial[j] = 0;
312 static void read_mac(struct ioc3_driver_data *idd, unsigned long addr)
315 unsigned char data[13];
319 nic_write_byte(idd, 0xF0);
320 nic_write_byte(idd, 0x00);
321 nic_write_byte(idd, 0x00);
324 data[i] = nic_read_byte(idd);
325 if(crc16_area(data, 13, 0x0000) == 0x800d) {
327 idd->nic_mac[10-i] = data[i];
332 printk(KERN_ERR "IOC3: CRC error in MAC address\n");
334 idd->nic_mac[i] = 0x00;
337 static void probe_nic(struct ioc3_driver_data *idd)
339 int save = 0, loops = 3;
340 unsigned long first, addr;
342 writel(GPCR_MLAN_EN, &idd->vma->gpcr_s);
345 idd->nic_part[0] = 0;
346 idd->nic_serial[0] = 0;
347 addr = first = nic_find(idd, &save, 0);
354 switch(addr & 0xFF) {
365 addr = nic_find(idd, &save, addr);
371 printk(KERN_ERR "IOC3: CRC error in NIC address\n");
376 static void write_ireg(struct ioc3_driver_data *idd, uint32_t val, int which)
380 spin_lock_irqsave(&idd->ir_lock, flags);
383 writel(val, &idd->vma->sio_ies);
386 writel(val, &idd->vma->sio_iec);
389 spin_unlock_irqrestore(&idd->ir_lock, flags);
391 static inline uint32_t get_pending_intrs(struct ioc3_driver_data *idd)
396 spin_lock_irqsave(&idd->ir_lock, flag);
397 intrs = readl(&idd->vma->sio_ir);
398 intrs &= readl(&idd->vma->sio_ies);
399 spin_unlock_irqrestore(&idd->ir_lock, flag);
403 static irqreturn_t ioc3_intr_io(int irq, void *arg)
406 struct ioc3_driver_data *idd = arg;
408 unsigned int pending;
410 read_lock_irqsave(&ioc3_submodules_lock, flags);
412 if(idd->dual_irq && readb(&idd->vma->eisr)) {
413 /* send Ethernet IRQ to the driver */
414 if(ioc3_ethernet && idd->active[ioc3_ethernet->id] &&
415 ioc3_ethernet->intr) {
416 handled = handled && !ioc3_ethernet->intr(ioc3_ethernet,
420 pending = get_pending_intrs(idd); /* look at the IO IRQs */
422 for(id=0;id<IOC3_MAX_SUBMODULES;id++) {
423 if(idd->active[id] && ioc3_submodules[id]
424 && (pending & ioc3_submodules[id]->irq_mask)
425 && ioc3_submodules[id]->intr) {
426 write_ireg(idd, ioc3_submodules[id]->irq_mask,
428 if(!ioc3_submodules[id]->intr(ioc3_submodules[id],
429 idd, pending & ioc3_submodules[id]->irq_mask))
430 pending &= ~ioc3_submodules[id]->irq_mask;
431 if (ioc3_submodules[id]->reset_mask)
432 write_ireg(idd, ioc3_submodules[id]->irq_mask,
436 read_unlock_irqrestore(&ioc3_submodules_lock, flags);
439 "IOC3: Pending IRQs 0x%08x discarded and disabled\n",pending);
440 write_ireg(idd, pending, IOC3_W_IEC);
443 return handled?IRQ_HANDLED:IRQ_NONE;
446 static irqreturn_t ioc3_intr_eth(int irq, void *arg)
449 struct ioc3_driver_data *idd = (struct ioc3_driver_data *)arg;
454 read_lock_irqsave(&ioc3_submodules_lock, flags);
455 if(ioc3_ethernet && idd->active[ioc3_ethernet->id]
456 && ioc3_ethernet->intr)
457 handled = handled && !ioc3_ethernet->intr(ioc3_ethernet, idd, 0);
458 read_unlock_irqrestore(&ioc3_submodules_lock, flags);
459 return handled?IRQ_HANDLED:IRQ_NONE;
462 void ioc3_enable(struct ioc3_submodule *is,
463 struct ioc3_driver_data *idd, unsigned int irqs)
465 write_ireg(idd, irqs & is->irq_mask, IOC3_W_IES);
468 void ioc3_ack(struct ioc3_submodule *is, struct ioc3_driver_data *idd,
471 writel(irqs & is->irq_mask, &idd->vma->sio_ir);
474 void ioc3_disable(struct ioc3_submodule *is,
475 struct ioc3_driver_data *idd, unsigned int irqs)
477 write_ireg(idd, irqs & is->irq_mask, IOC3_W_IEC);
480 void ioc3_gpcr_set(struct ioc3_driver_data *idd, unsigned int val)
483 spin_lock_irqsave(&idd->gpio_lock, flags);
484 writel(val, &idd->vma->gpcr_s);
485 spin_unlock_irqrestore(&idd->gpio_lock, flags);
488 /* Keep it simple, stupid! */
489 static int find_slot(void **tab, int max)
498 /* Register an IOC3 submodule */
499 int ioc3_register_submodule(struct ioc3_submodule *is)
501 struct ioc3_driver_data *idd;
505 write_lock_irqsave(&ioc3_submodules_lock, flags);
506 alloc_id = find_slot((void **)ioc3_submodules, IOC3_MAX_SUBMODULES);
508 ioc3_submodules[alloc_id] = is;
510 if(ioc3_ethernet==NULL)
514 "IOC3 Ethernet module already registered!\n");
517 write_unlock_irqrestore(&ioc3_submodules_lock, flags);
520 printk(KERN_WARNING "Increase IOC3_MAX_SUBMODULES!\n");
526 /* Initialize submodule for each IOC3 */
530 down_read(&ioc3_devices_rwsem);
531 list_for_each_entry(idd, &ioc3_devices, list) {
532 /* set to 1 for IRQs in probe */
533 idd->active[alloc_id] = 1;
534 idd->active[alloc_id] = !is->probe(is, idd);
536 up_read(&ioc3_devices_rwsem);
541 /* Unregister an IOC3 submodule */
542 void ioc3_unregister_submodule(struct ioc3_submodule *is)
544 struct ioc3_driver_data *idd;
547 write_lock_irqsave(&ioc3_submodules_lock, flags);
548 if(ioc3_submodules[is->id]==is)
549 ioc3_submodules[is->id]=NULL;
552 "IOC3 submodule %s has wrong ID.\n",is->name);
553 if(ioc3_ethernet==is)
554 ioc3_ethernet = NULL;
555 write_unlock_irqrestore(&ioc3_submodules_lock, flags);
557 /* Remove submodule for each IOC3 */
558 down_read(&ioc3_devices_rwsem);
559 list_for_each_entry(idd, &ioc3_devices, list)
560 if(idd->active[is->id]) {
562 if(is->remove(is, idd))
564 "%s: IOC3 submodule %s remove failed "
566 __func__, module_name(is->owner),
567 pci_name(idd->pdev));
568 idd->active[is->id] = 0;
570 write_ireg(idd, is->irq_mask, IOC3_W_IEC);
572 up_read(&ioc3_devices_rwsem);
575 /*********************
576 * Device management *
577 *********************/
579 static char *ioc3_class_names[] = { "unknown", "IP27 BaseIO", "IP30 system",
580 "MENET 1/2/3", "MENET 4", "CADduo", "Altix Serial" };
582 static int ioc3_class(struct ioc3_driver_data *idd)
584 int res = IOC3_CLASS_NONE;
585 /* NIC-based logic */
586 if(!strncmp(idd->nic_part, "030-0891-", 9))
587 res = IOC3_CLASS_BASE_IP30;
588 if(!strncmp(idd->nic_part, "030-1155-", 9))
589 res = IOC3_CLASS_CADDUO;
590 if(!strncmp(idd->nic_part, "030-1657-", 9))
591 res = IOC3_CLASS_SERIAL;
592 if(!strncmp(idd->nic_part, "030-1664-", 9))
593 res = IOC3_CLASS_SERIAL;
594 /* total random heuristics */
595 #ifdef CONFIG_SGI_IP27
596 if(!idd->nic_part[0])
597 res = IOC3_CLASS_BASE_IP27;
599 /* print educational message */
600 printk(KERN_INFO "IOC3 part: [%s], serial: [%s] => class %s\n",
601 idd->nic_part, idd->nic_serial, ioc3_class_names[res]);
604 /* Adds a new instance of an IOC3 card */
605 static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
607 struct ioc3_driver_data *idd;
611 /* Enable IOC3 and take ownership of it */
612 if ((ret = pci_enable_device(pdev))) {
614 "%s: Failed to enable IOC3 device for pci_dev %s.\n",
615 __func__, pci_name(pdev));
618 pci_set_master(pdev);
621 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
623 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
625 printk(KERN_WARNING "%s: Unable to obtain 64 bit DMA "
626 "for consistent allocations\n",
632 /* Set up per-IOC3 data */
633 idd = kzalloc(sizeof(struct ioc3_driver_data), GFP_KERNEL);
636 "%s: Failed to allocate IOC3 data for pci_dev %s.\n",
637 __func__, pci_name(pdev));
641 spin_lock_init(&idd->ir_lock);
642 spin_lock_init(&idd->gpio_lock);
645 /* Map all IOC3 registers. These are shared between subdevices
646 * so the main IOC3 module manages them.
648 idd->pma = pci_resource_start(pdev, 0);
651 "%s: Unable to find IOC3 resource "
653 __func__, pci_name(pdev));
657 if (!request_mem_region(idd->pma, IOC3_PCI_SIZE, "ioc3")) {
659 "%s: Unable to request IOC3 region "
661 __func__, pci_name(pdev));
665 idd->vma = ioremap(idd->pma, IOC3_PCI_SIZE);
668 "%s: Unable to remap IOC3 region "
670 __func__, pci_name(pdev));
672 goto out_misc_region;
675 /* Track PCI-device specific data */
676 pci_set_drvdata(pdev, idd);
677 down_write(&ioc3_devices_rwsem);
678 list_add_tail(&idd->list, &ioc3_devices);
679 idd->id = ioc3_counter++;
680 up_write(&ioc3_devices_rwsem);
682 idd->gpdr_shadow = readl(&idd->vma->gpdr);
684 /* Read IOC3 NIC contents */
687 /* Detect IOC3 class */
688 idd->class = ioc3_class(idd);
690 /* Initialize IOC3 */
691 pci_read_config_dword(pdev, PCI_COMMAND, &pcmd);
692 pci_write_config_dword(pdev, PCI_COMMAND,
693 pcmd | PCI_COMMAND_MEMORY |
694 PCI_COMMAND_PARITY | PCI_COMMAND_SERR |
695 PCI_SCR_DROP_MODE_EN);
697 write_ireg(idd, ~0, IOC3_W_IEC);
698 writel(~0, &idd->vma->sio_ir);
701 if(idd->class == IOC3_CLASS_BASE_IP30
702 || idd->class == IOC3_CLASS_BASE_IP27) {
703 writel(0, &idd->vma->eier);
704 writel(~0, &idd->vma->eisr);
707 if (!request_irq(pdev->irq, ioc3_intr_eth, IRQF_SHARED,
708 "ioc3-eth", (void *)idd)) {
709 idd->irq_eth = pdev->irq;
712 "%s : request_irq fails for IRQ 0x%x\n ",
713 __func__, pdev->irq);
715 if (!request_irq(pdev->irq+2, ioc3_intr_io, IRQF_SHARED,
716 "ioc3-io", (void *)idd)) {
717 idd->irq_io = pdev->irq+2;
720 "%s : request_irq fails for IRQ 0x%x\n ",
721 __func__, pdev->irq+2);
724 if (!request_irq(pdev->irq, ioc3_intr_io, IRQF_SHARED,
725 "ioc3", (void *)idd)) {
726 idd->irq_io = pdev->irq;
729 "%s : request_irq fails for IRQ 0x%x\n ",
730 __func__, pdev->irq);
734 /* Add this IOC3 to all submodules */
735 for(id=0;id<IOC3_MAX_SUBMODULES;id++)
736 if(ioc3_submodules[id] && ioc3_submodules[id]->probe) {
738 idd->active[id] = !ioc3_submodules[id]->probe
739 (ioc3_submodules[id], idd);
742 printk(KERN_INFO "IOC3 Master Driver loaded for %s\n", pci_name(pdev));
747 release_mem_region(idd->pma, IOC3_PCI_SIZE);
751 pci_disable_device(pdev);
756 /* Removes a particular instance of an IOC3 card. */
757 static void ioc3_remove(struct pci_dev *pdev)
760 struct ioc3_driver_data *idd;
762 idd = pci_get_drvdata(pdev);
764 /* Remove this IOC3 from all submodules */
765 for(id=0;id<IOC3_MAX_SUBMODULES;id++)
766 if(idd->active[id]) {
767 if(ioc3_submodules[id] && ioc3_submodules[id]->remove)
768 if(ioc3_submodules[id]->remove(ioc3_submodules[id],
771 "%s: IOC3 submodule 0x%s remove failed "
774 module_name(ioc3_submodules[id]->owner),
779 /* Clear and disable all IRQs */
780 write_ireg(idd, ~0, IOC3_W_IEC);
781 writel(~0, &idd->vma->sio_ir);
783 /* Release resources */
784 free_irq(idd->irq_io, (void *)idd);
786 free_irq(idd->irq_eth, (void *)idd);
788 release_mem_region(idd->pma, IOC3_PCI_SIZE);
790 /* Disable IOC3 and relinquish */
791 pci_disable_device(pdev);
793 /* Remove and free driver data */
794 down_write(&ioc3_devices_rwsem);
795 list_del(&idd->list);
796 up_write(&ioc3_devices_rwsem);
800 static struct pci_device_id ioc3_id_table[] = {
801 {PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC3, PCI_ANY_ID, PCI_ANY_ID},
805 static struct pci_driver ioc3_driver = {
807 .id_table = ioc3_id_table,
809 .remove = ioc3_remove,
812 MODULE_DEVICE_TABLE(pci, ioc3_id_table);
814 /*********************
815 * Module management *
816 *********************/
819 static int __init ioc3_init(void)
821 if (ia64_platform_is("sn2"))
822 return pci_register_driver(&ioc3_driver);
827 static void __exit ioc3_exit(void)
829 pci_unregister_driver(&ioc3_driver);
832 module_init(ioc3_init);
833 module_exit(ioc3_exit);
836 MODULE_DESCRIPTION("PCI driver for SGI IOC3");
837 MODULE_LICENSE("GPL");
839 EXPORT_SYMBOL_GPL(ioc3_register_submodule);
840 EXPORT_SYMBOL_GPL(ioc3_unregister_submodule);
841 EXPORT_SYMBOL_GPL(ioc3_ack);
842 EXPORT_SYMBOL_GPL(ioc3_gpcr_set);
843 EXPORT_SYMBOL_GPL(ioc3_disable);
844 EXPORT_SYMBOL_GPL(ioc3_enable);