Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers: remove the SGI SN2 IOC4 base support

The IOC4 is a multi-function chip seen on SGI SN2 and some SGI MIPS
systems. This removes the base driver, which while not having an SN2
Kconfig dependency was only for sub-drivers that had one.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lkml.kernel.org/r/20190813072514.23299-15-hch@lst.de
Signed-off-by: Tony Luck <tony.luck@intel.com>

authored by

Christoph Hellwig and committed by
Tony Luck
f7bc6e42 c9fa9c32

-752
-49
Documentation/driver-api/sgi-ioc4.rst
··· 1 - ==================================== 2 - SGI IOC4 PCI (multi function) device 3 - ==================================== 4 - 5 - The SGI IOC4 PCI device is a bit of a strange beast, so some notes on 6 - it are in order. 7 - 8 - First, even though the IOC4 performs multiple functions, such as an 9 - IDE controller, a serial controller, a PS/2 keyboard/mouse controller, 10 - and an external interrupt mechanism, it's not implemented as a 11 - multifunction device. The consequence of this from a software 12 - standpoint is that all these functions share a single IRQ, and 13 - they can't all register to own the same PCI device ID. To make 14 - matters a bit worse, some of the register blocks (and even registers 15 - themselves) present in IOC4 are mixed-purpose between these several 16 - functions, meaning that there's no clear "owning" device driver. 17 - 18 - The solution is to organize the IOC4 driver into several independent 19 - drivers, "ioc4", "sgiioc4", and "ioc4_serial". Note that there is no 20 - PS/2 controller driver as this functionality has never been wired up 21 - on a shipping IO card. 22 - 23 - ioc4 24 - ==== 25 - This is the core (or shim) driver for IOC4. It is responsible for 26 - initializing the basic functionality of the chip, and allocating 27 - the PCI resources that are shared between the IOC4 functions. 28 - 29 - This driver also provides registration functions that the other 30 - IOC4 drivers can call to make their presence known. Each driver 31 - needs to provide a probe and remove function, which are invoked 32 - by the core driver at appropriate times. The interface of these 33 - IOC4 function probe and remove operations isn't precisely the same 34 - as PCI device probe and remove operations, but is logically the 35 - same operation. 36 - 37 - sgiioc4 38 - ======= 39 - This is the IDE driver for IOC4. Its name isn't very descriptive 40 - simply for historical reasons (it used to be the only IOC4 driver 41 - component). There's not much to say about it other than it hooks 42 - up to the ioc4 driver via the appropriate registration, probe, and 43 - remove functions. 44 - 45 - ioc4_serial 46 - =========== 47 - This is the serial driver for IOC4. There's not much to say about it 48 - other than it hooks up to the ioc4 driver via the appropriate registration, 49 - probe, and remove functions.
-1
arch/ia64/configs/generic_defconfig
··· 44 44 CONFIG_BLK_DEV_CRYPTOLOOP=m 45 45 CONFIG_BLK_DEV_NBD=m 46 46 CONFIG_BLK_DEV_RAM=y 47 - CONFIG_SGI_IOC4=y 48 47 CONFIG_SGI_XP=m 49 48 CONFIG_IDE=y 50 49 CONFIG_BLK_DEV_IDECD=y
-1
arch/ia64/configs/gensparse_defconfig
··· 36 36 CONFIG_BLK_DEV_CRYPTOLOOP=m 37 37 CONFIG_BLK_DEV_NBD=m 38 38 CONFIG_BLK_DEV_RAM=y 39 - CONFIG_SGI_IOC4=y 40 39 CONFIG_IDE=y 41 40 CONFIG_BLK_DEV_IDECD=y 42 41 CONFIG_IDE_GENERIC=y
-1
arch/mips/configs/bigsur_defconfig
··· 103 103 CONFIG_BLK_DEV_LOOP=m 104 104 CONFIG_BLK_DEV_CRYPTOLOOP=m 105 105 CONFIG_BLK_DEV_NBD=m 106 - CONFIG_SGI_IOC4=m 107 106 CONFIG_EEPROM_LEGACY=y 108 107 CONFIG_EEPROM_MAX6875=y 109 108 CONFIG_IDE=y
-1
arch/mips/configs/ip32_defconfig
··· 46 46 CONFIG_BLK_DEV_LOOP=m 47 47 CONFIG_BLK_DEV_CRYPTOLOOP=m 48 48 CONFIG_BLK_DEV_NBD=m 49 - CONFIG_SGI_IOC4=y 50 49 CONFIG_RAID_ATTRS=y 51 50 CONFIG_SCSI=y 52 51 CONFIG_BLK_DEV_SD=y
-1
arch/mips/configs/markeins_defconfig
··· 117 117 CONFIG_MTD_PHYSMAP=y 118 118 CONFIG_BLK_DEV_LOOP=m 119 119 CONFIG_BLK_DEV_CRYPTOLOOP=m 120 - CONFIG_SGI_IOC4=m 121 120 CONFIG_SCSI=m 122 121 # CONFIG_SCSI_PROC_FS is not set 123 122 CONFIG_BLK_DEV_SD=m
-1
arch/mips/configs/rm200_defconfig
··· 198 198 CONFIG_BLK_DEV_RAM=m 199 199 CONFIG_CDROM_PKTCDVD=m 200 200 CONFIG_ATA_OVER_ETH=m 201 - CONFIG_SGI_IOC4=m 202 201 CONFIG_RAID_ATTRS=m 203 202 CONFIG_SCSI=y 204 203 CONFIG_BLK_DEV_SD=y
-1
arch/mips/configs/sb1250_swarm_defconfig
··· 49 49 CONFIG_BLK_DEV_RAM_SIZE=9220 50 50 CONFIG_CDROM_PKTCDVD=m 51 51 CONFIG_ATA_OVER_ETH=m 52 - CONFIG_SGI_IOC4=m 53 52 CONFIG_IDE=y 54 53 CONFIG_BLK_DEV_IDECD=y 55 54 CONFIG_BLK_DEV_IDETAPE=y
-12
drivers/misc/Kconfig
··· 126 126 an Intel Atom (non-netbook) mobile device containing a MIPI 127 127 P1149.7 standard implementation. 128 128 129 - config SGI_IOC4 130 - tristate "SGI IOC4 Base IO support" 131 - depends on PCI 132 - ---help--- 133 - This option enables basic support for the IOC4 chip on certain 134 - SGI IO controller cards (IO9, IO10, and PCI-RT). This option 135 - does not enable any specific functions on such a card, but provides 136 - necessary infrastructure for other drivers to utilize. 137 - 138 - If you have an SGI Altix with an IOC4-based card say Y. 139 - Otherwise say N. 140 - 141 129 config TIFM_CORE 142 130 tristate "TI Flash Media interface support" 143 131 depends on PCI
-1
drivers/misc/Makefile
··· 21 21 obj-$(CONFIG_QCOM_FASTRPC) += fastrpc.o 22 22 obj-$(CONFIG_SENSORS_BH1770) += bh1770glc.o 23 23 obj-$(CONFIG_SENSORS_APDS990X) += apds990x.o 24 - obj-$(CONFIG_SGI_IOC4) += ioc4.o 25 24 obj-$(CONFIG_ENCLOSURE_SERVICES) += enclosure.o 26 25 obj-$(CONFIG_KGDB_TESTS) += kgdbts.o 27 26 obj-$(CONFIG_SGI_XP) += sgi-xp/
-498
drivers/misc/ioc4.c
··· 1 - /* 2 - * This file is subject to the terms and conditions of the GNU General Public 3 - * License. See the file "COPYING" in the main directory of this archive 4 - * for more details. 5 - * 6 - * Copyright (C) 2005-2006 Silicon Graphics, Inc. All Rights Reserved. 7 - */ 8 - 9 - /* This file contains the master driver module for use by SGI IOC4 subdrivers. 10 - * 11 - * It allocates any resources shared between multiple subdevices, and 12 - * provides accessor functions (where needed) and the like for those 13 - * resources. It also provides a mechanism for the subdevice modules 14 - * to support loading and unloading. 15 - * 16 - * Non-shared resources (e.g. external interrupt A_INT_OUT register page 17 - * alias, serial port and UART registers) are handled by the subdevice 18 - * modules themselves. 19 - * 20 - * This is all necessary because IOC4 is not implemented as a multi-function 21 - * PCI device, but an amalgamation of disparate registers for several 22 - * types of device (ATA, serial, external interrupts). The normal 23 - * resource management in the kernel doesn't have quite the right interfaces 24 - * to handle this situation (e.g. multiple modules can't claim the same 25 - * PCI ID), thus this IOC4 master module. 26 - */ 27 - 28 - #include <linux/errno.h> 29 - #include <linux/module.h> 30 - #include <linux/pci.h> 31 - #include <linux/ioc4.h> 32 - #include <linux/ktime.h> 33 - #include <linux/slab.h> 34 - #include <linux/mutex.h> 35 - #include <linux/time.h> 36 - #include <asm/io.h> 37 - 38 - /*************** 39 - * Definitions * 40 - ***************/ 41 - 42 - /* Tweakable values */ 43 - 44 - /* PCI bus speed detection/calibration */ 45 - #define IOC4_CALIBRATE_COUNT 63 /* Calibration cycle period */ 46 - #define IOC4_CALIBRATE_CYCLES 256 /* Average over this many cycles */ 47 - #define IOC4_CALIBRATE_DISCARD 2 /* Discard first few cycles */ 48 - #define IOC4_CALIBRATE_LOW_MHZ 25 /* Lower bound on bus speed sanity */ 49 - #define IOC4_CALIBRATE_HIGH_MHZ 75 /* Upper bound on bus speed sanity */ 50 - #define IOC4_CALIBRATE_DEFAULT_MHZ 66 /* Assumed if sanity check fails */ 51 - 52 - /************************ 53 - * Submodule management * 54 - ************************/ 55 - 56 - static DEFINE_MUTEX(ioc4_mutex); 57 - 58 - static LIST_HEAD(ioc4_devices); 59 - static LIST_HEAD(ioc4_submodules); 60 - 61 - /* Register an IOC4 submodule */ 62 - int 63 - ioc4_register_submodule(struct ioc4_submodule *is) 64 - { 65 - struct ioc4_driver_data *idd; 66 - 67 - mutex_lock(&ioc4_mutex); 68 - list_add(&is->is_list, &ioc4_submodules); 69 - 70 - /* Initialize submodule for each IOC4 */ 71 - if (!is->is_probe) 72 - goto out; 73 - 74 - list_for_each_entry(idd, &ioc4_devices, idd_list) { 75 - if (is->is_probe(idd)) { 76 - printk(KERN_WARNING 77 - "%s: IOC4 submodule %s probe failed " 78 - "for pci_dev %s", 79 - __func__, module_name(is->is_owner), 80 - pci_name(idd->idd_pdev)); 81 - } 82 - } 83 - out: 84 - mutex_unlock(&ioc4_mutex); 85 - return 0; 86 - } 87 - 88 - /* Unregister an IOC4 submodule */ 89 - void 90 - ioc4_unregister_submodule(struct ioc4_submodule *is) 91 - { 92 - struct ioc4_driver_data *idd; 93 - 94 - mutex_lock(&ioc4_mutex); 95 - list_del(&is->is_list); 96 - 97 - /* Remove submodule for each IOC4 */ 98 - if (!is->is_remove) 99 - goto out; 100 - 101 - list_for_each_entry(idd, &ioc4_devices, idd_list) { 102 - if (is->is_remove(idd)) { 103 - printk(KERN_WARNING 104 - "%s: IOC4 submodule %s remove failed " 105 - "for pci_dev %s.\n", 106 - __func__, module_name(is->is_owner), 107 - pci_name(idd->idd_pdev)); 108 - } 109 - } 110 - out: 111 - mutex_unlock(&ioc4_mutex); 112 - } 113 - 114 - /********************* 115 - * Device management * 116 - *********************/ 117 - 118 - #define IOC4_CALIBRATE_LOW_LIMIT \ 119 - (1000*IOC4_EXTINT_COUNT_DIVISOR/IOC4_CALIBRATE_LOW_MHZ) 120 - #define IOC4_CALIBRATE_HIGH_LIMIT \ 121 - (1000*IOC4_EXTINT_COUNT_DIVISOR/IOC4_CALIBRATE_HIGH_MHZ) 122 - #define IOC4_CALIBRATE_DEFAULT \ 123 - (1000*IOC4_EXTINT_COUNT_DIVISOR/IOC4_CALIBRATE_DEFAULT_MHZ) 124 - 125 - #define IOC4_CALIBRATE_END \ 126 - (IOC4_CALIBRATE_CYCLES + IOC4_CALIBRATE_DISCARD) 127 - 128 - #define IOC4_INT_OUT_MODE_TOGGLE 0x7 /* Toggle INT_OUT every COUNT+1 ticks */ 129 - 130 - /* Determines external interrupt output clock period of the PCI bus an 131 - * IOC4 is attached to. This value can be used to determine the PCI 132 - * bus speed. 133 - * 134 - * IOC4 has a design feature that various internal timers are derived from 135 - * the PCI bus clock. This causes IOC4 device drivers to need to take the 136 - * bus speed into account when setting various register values (e.g. INT_OUT 137 - * register COUNT field, UART divisors, etc). Since this information is 138 - * needed by several subdrivers, it is determined by the main IOC4 driver, 139 - * even though the following code utilizes external interrupt registers 140 - * to perform the speed calculation. 141 - */ 142 - static void 143 - ioc4_clock_calibrate(struct ioc4_driver_data *idd) 144 - { 145 - union ioc4_int_out int_out; 146 - union ioc4_gpcr gpcr; 147 - unsigned int state, last_state; 148 - uint64_t start, end, period; 149 - unsigned int count; 150 - 151 - /* Enable output */ 152 - gpcr.raw = 0; 153 - gpcr.fields.dir = IOC4_GPCR_DIR_0; 154 - gpcr.fields.int_out_en = 1; 155 - writel(gpcr.raw, &idd->idd_misc_regs->gpcr_s.raw); 156 - 157 - /* Reset to power-on state */ 158 - writel(0, &idd->idd_misc_regs->int_out.raw); 159 - 160 - /* Set up square wave */ 161 - int_out.raw = 0; 162 - int_out.fields.count = IOC4_CALIBRATE_COUNT; 163 - int_out.fields.mode = IOC4_INT_OUT_MODE_TOGGLE; 164 - int_out.fields.diag = 0; 165 - writel(int_out.raw, &idd->idd_misc_regs->int_out.raw); 166 - 167 - /* Check square wave period averaged over some number of cycles */ 168 - start = ktime_get_ns(); 169 - state = 1; /* make sure the first read isn't a rising edge */ 170 - for (count = 0; count <= IOC4_CALIBRATE_END; count++) { 171 - do { /* wait for a rising edge */ 172 - last_state = state; 173 - int_out.raw = readl(&idd->idd_misc_regs->int_out.raw); 174 - state = int_out.fields.int_out; 175 - } while (last_state || !state); 176 - 177 - /* discard the first few cycles */ 178 - if (count == IOC4_CALIBRATE_DISCARD) 179 - start = ktime_get_ns(); 180 - } 181 - end = ktime_get_ns(); 182 - 183 - /* Calculation rearranged to preserve intermediate precision. 184 - * Logically: 185 - * 1. "end - start" gives us the measurement period over all 186 - * the square wave cycles. 187 - * 2. Divide by number of square wave cycles to get the period 188 - * of a square wave cycle. 189 - * 3. Divide by 2*(int_out.fields.count+1), which is the formula 190 - * by which the IOC4 generates the square wave, to get the 191 - * period of an IOC4 INT_OUT count. 192 - */ 193 - period = (end - start) / 194 - (IOC4_CALIBRATE_CYCLES * 2 * (IOC4_CALIBRATE_COUNT + 1)); 195 - 196 - /* Bounds check the result. */ 197 - if (period > IOC4_CALIBRATE_LOW_LIMIT || 198 - period < IOC4_CALIBRATE_HIGH_LIMIT) { 199 - printk(KERN_INFO 200 - "IOC4 %s: Clock calibration failed. Assuming" 201 - "PCI clock is %d ns.\n", 202 - pci_name(idd->idd_pdev), 203 - IOC4_CALIBRATE_DEFAULT / IOC4_EXTINT_COUNT_DIVISOR); 204 - period = IOC4_CALIBRATE_DEFAULT; 205 - } else { 206 - u64 ns = period; 207 - 208 - do_div(ns, IOC4_EXTINT_COUNT_DIVISOR); 209 - printk(KERN_DEBUG 210 - "IOC4 %s: PCI clock is %llu ns.\n", 211 - pci_name(idd->idd_pdev), (unsigned long long)ns); 212 - } 213 - 214 - /* Remember results. We store the extint clock period rather 215 - * than the PCI clock period so that greater precision is 216 - * retained. Divide by IOC4_EXTINT_COUNT_DIVISOR to get 217 - * PCI clock period. 218 - */ 219 - idd->count_period = period; 220 - } 221 - 222 - /* There are three variants of IOC4 cards: IO9, IO10, and PCI-RT. 223 - * Each brings out different combinations of IOC4 signals, thus. 224 - * the IOC4 subdrivers need to know to which we're attached. 225 - * 226 - * We look for the presence of a SCSI (IO9) or SATA (IO10) controller 227 - * on the same PCI bus at slot number 3 to differentiate IO9 from IO10. 228 - * If neither is present, it's a PCI-RT. 229 - */ 230 - static unsigned int 231 - ioc4_variant(struct ioc4_driver_data *idd) 232 - { 233 - struct pci_dev *pdev = NULL; 234 - int found = 0; 235 - 236 - /* IO9: Look for a QLogic ISP 12160 at the same bus and slot 3. */ 237 - do { 238 - pdev = pci_get_device(PCI_VENDOR_ID_QLOGIC, 239 - PCI_DEVICE_ID_QLOGIC_ISP12160, pdev); 240 - if (pdev && 241 - idd->idd_pdev->bus->number == pdev->bus->number && 242 - 3 == PCI_SLOT(pdev->devfn)) 243 - found = 1; 244 - } while (pdev && !found); 245 - if (NULL != pdev) { 246 - pci_dev_put(pdev); 247 - return IOC4_VARIANT_IO9; 248 - } 249 - 250 - /* IO10: Look for a Vitesse VSC 7174 at the same bus and slot 3. */ 251 - pdev = NULL; 252 - do { 253 - pdev = pci_get_device(PCI_VENDOR_ID_VITESSE, 254 - PCI_DEVICE_ID_VITESSE_VSC7174, pdev); 255 - if (pdev && 256 - idd->idd_pdev->bus->number == pdev->bus->number && 257 - 3 == PCI_SLOT(pdev->devfn)) 258 - found = 1; 259 - } while (pdev && !found); 260 - if (NULL != pdev) { 261 - pci_dev_put(pdev); 262 - return IOC4_VARIANT_IO10; 263 - } 264 - 265 - /* PCI-RT: No SCSI/SATA controller will be present */ 266 - return IOC4_VARIANT_PCI_RT; 267 - } 268 - 269 - static void 270 - ioc4_load_modules(struct work_struct *work) 271 - { 272 - request_module("sgiioc4"); 273 - } 274 - 275 - static DECLARE_WORK(ioc4_load_modules_work, ioc4_load_modules); 276 - 277 - /* Adds a new instance of an IOC4 card */ 278 - static int 279 - ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) 280 - { 281 - struct ioc4_driver_data *idd; 282 - struct ioc4_submodule *is; 283 - uint32_t pcmd; 284 - int ret; 285 - 286 - /* Enable IOC4 and take ownership of it */ 287 - if ((ret = pci_enable_device(pdev))) { 288 - printk(KERN_WARNING 289 - "%s: Failed to enable IOC4 device for pci_dev %s.\n", 290 - __func__, pci_name(pdev)); 291 - goto out; 292 - } 293 - pci_set_master(pdev); 294 - 295 - /* Set up per-IOC4 data */ 296 - idd = kmalloc(sizeof(struct ioc4_driver_data), GFP_KERNEL); 297 - if (!idd) { 298 - printk(KERN_WARNING 299 - "%s: Failed to allocate IOC4 data for pci_dev %s.\n", 300 - __func__, pci_name(pdev)); 301 - ret = -ENODEV; 302 - goto out_idd; 303 - } 304 - idd->idd_pdev = pdev; 305 - idd->idd_pci_id = pci_id; 306 - 307 - /* Map IOC4 misc registers. These are shared between subdevices 308 - * so the main IOC4 module manages them. 309 - */ 310 - idd->idd_bar0 = pci_resource_start(idd->idd_pdev, 0); 311 - if (!idd->idd_bar0) { 312 - printk(KERN_WARNING 313 - "%s: Unable to find IOC4 misc resource " 314 - "for pci_dev %s.\n", 315 - __func__, pci_name(idd->idd_pdev)); 316 - ret = -ENODEV; 317 - goto out_pci; 318 - } 319 - if (!request_mem_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs), 320 - "ioc4_misc")) { 321 - printk(KERN_WARNING 322 - "%s: Unable to request IOC4 misc region " 323 - "for pci_dev %s.\n", 324 - __func__, pci_name(idd->idd_pdev)); 325 - ret = -ENODEV; 326 - goto out_pci; 327 - } 328 - idd->idd_misc_regs = ioremap(idd->idd_bar0, 329 - sizeof(struct ioc4_misc_regs)); 330 - if (!idd->idd_misc_regs) { 331 - printk(KERN_WARNING 332 - "%s: Unable to remap IOC4 misc region " 333 - "for pci_dev %s.\n", 334 - __func__, pci_name(idd->idd_pdev)); 335 - ret = -ENODEV; 336 - goto out_misc_region; 337 - } 338 - 339 - /* Failsafe portion of per-IOC4 initialization */ 340 - 341 - /* Detect card variant */ 342 - idd->idd_variant = ioc4_variant(idd); 343 - printk(KERN_INFO "IOC4 %s: %s card detected.\n", pci_name(pdev), 344 - idd->idd_variant == IOC4_VARIANT_IO9 ? "IO9" : 345 - idd->idd_variant == IOC4_VARIANT_PCI_RT ? "PCI-RT" : 346 - idd->idd_variant == IOC4_VARIANT_IO10 ? "IO10" : "unknown"); 347 - 348 - /* Initialize IOC4 */ 349 - pci_read_config_dword(idd->idd_pdev, PCI_COMMAND, &pcmd); 350 - pci_write_config_dword(idd->idd_pdev, PCI_COMMAND, 351 - pcmd | PCI_COMMAND_PARITY | PCI_COMMAND_SERR); 352 - 353 - /* Determine PCI clock */ 354 - ioc4_clock_calibrate(idd); 355 - 356 - /* Disable/clear all interrupts. Need to do this here lest 357 - * one submodule request the shared IOC4 IRQ, but interrupt 358 - * is generated by a different subdevice. 359 - */ 360 - /* Disable */ 361 - writel(~0, &idd->idd_misc_regs->other_iec.raw); 362 - writel(~0, &idd->idd_misc_regs->sio_iec); 363 - /* Clear (i.e. acknowledge) */ 364 - writel(~0, &idd->idd_misc_regs->other_ir.raw); 365 - writel(~0, &idd->idd_misc_regs->sio_ir); 366 - 367 - /* Track PCI-device specific data */ 368 - idd->idd_serial_data = NULL; 369 - pci_set_drvdata(idd->idd_pdev, idd); 370 - 371 - mutex_lock(&ioc4_mutex); 372 - list_add_tail(&idd->idd_list, &ioc4_devices); 373 - 374 - /* Add this IOC4 to all submodules */ 375 - list_for_each_entry(is, &ioc4_submodules, is_list) { 376 - if (is->is_probe && is->is_probe(idd)) { 377 - printk(KERN_WARNING 378 - "%s: IOC4 submodule 0x%s probe failed " 379 - "for pci_dev %s.\n", 380 - __func__, module_name(is->is_owner), 381 - pci_name(idd->idd_pdev)); 382 - } 383 - } 384 - mutex_unlock(&ioc4_mutex); 385 - 386 - /* Request sgiioc4 IDE driver on boards that bring that functionality 387 - * off of IOC4. The root filesystem may be hosted on a drive connected 388 - * to IOC4, so we need to make sure the sgiioc4 driver is loaded as it 389 - * won't be picked up by modprobes due to the ioc4 module owning the 390 - * PCI device. 391 - */ 392 - if (idd->idd_variant != IOC4_VARIANT_PCI_RT) { 393 - /* Request the module from a work procedure as the modprobe 394 - * goes out to a userland helper and that will hang if done 395 - * directly from ioc4_probe(). 396 - */ 397 - printk(KERN_INFO "IOC4 loading sgiioc4 submodule\n"); 398 - schedule_work(&ioc4_load_modules_work); 399 - } 400 - 401 - return 0; 402 - 403 - out_misc_region: 404 - release_mem_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs)); 405 - out_pci: 406 - kfree(idd); 407 - out_idd: 408 - pci_disable_device(pdev); 409 - out: 410 - return ret; 411 - } 412 - 413 - /* Removes a particular instance of an IOC4 card. */ 414 - static void 415 - ioc4_remove(struct pci_dev *pdev) 416 - { 417 - struct ioc4_submodule *is; 418 - struct ioc4_driver_data *idd; 419 - 420 - idd = pci_get_drvdata(pdev); 421 - 422 - /* Remove this IOC4 from all submodules */ 423 - mutex_lock(&ioc4_mutex); 424 - list_for_each_entry(is, &ioc4_submodules, is_list) { 425 - if (is->is_remove && is->is_remove(idd)) { 426 - printk(KERN_WARNING 427 - "%s: IOC4 submodule 0x%s remove failed " 428 - "for pci_dev %s.\n", 429 - __func__, module_name(is->is_owner), 430 - pci_name(idd->idd_pdev)); 431 - } 432 - } 433 - mutex_unlock(&ioc4_mutex); 434 - 435 - /* Release resources */ 436 - iounmap(idd->idd_misc_regs); 437 - if (!idd->idd_bar0) { 438 - printk(KERN_WARNING 439 - "%s: Unable to get IOC4 misc mapping for pci_dev %s. " 440 - "Device removal may be incomplete.\n", 441 - __func__, pci_name(idd->idd_pdev)); 442 - } 443 - release_mem_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs)); 444 - 445 - /* Disable IOC4 and relinquish */ 446 - pci_disable_device(pdev); 447 - 448 - /* Remove and free driver data */ 449 - mutex_lock(&ioc4_mutex); 450 - list_del(&idd->idd_list); 451 - mutex_unlock(&ioc4_mutex); 452 - kfree(idd); 453 - } 454 - 455 - static const struct pci_device_id ioc4_id_table[] = { 456 - {PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC4, PCI_ANY_ID, 457 - PCI_ANY_ID, 0x0b4000, 0xFFFFFF}, 458 - {0} 459 - }; 460 - 461 - static struct pci_driver ioc4_driver = { 462 - .name = "IOC4", 463 - .id_table = ioc4_id_table, 464 - .probe = ioc4_probe, 465 - .remove = ioc4_remove, 466 - }; 467 - 468 - MODULE_DEVICE_TABLE(pci, ioc4_id_table); 469 - 470 - /********************* 471 - * Module management * 472 - *********************/ 473 - 474 - /* Module load */ 475 - static int __init 476 - ioc4_init(void) 477 - { 478 - return pci_register_driver(&ioc4_driver); 479 - } 480 - 481 - /* Module unload */ 482 - static void __exit 483 - ioc4_exit(void) 484 - { 485 - /* Ensure ioc4_load_modules() has completed before exiting */ 486 - flush_work(&ioc4_load_modules_work); 487 - pci_unregister_driver(&ioc4_driver); 488 - } 489 - 490 - module_init(ioc4_init); 491 - module_exit(ioc4_exit); 492 - 493 - MODULE_AUTHOR("Brent Casavant - Silicon Graphics, Inc. <bcasavan@sgi.com>"); 494 - MODULE_DESCRIPTION("PCI driver master module for SGI IOC4 Base-IO Card"); 495 - MODULE_LICENSE("GPL"); 496 - 497 - EXPORT_SYMBOL(ioc4_register_submodule); 498 - EXPORT_SYMBOL(ioc4_unregister_submodule);
-184
include/linux/ioc4.h
··· 1 - /* 2 - * This file is subject to the terms and conditions of the GNU General Public 3 - * License. See the file "COPYING" in the main directory of this archive 4 - * for more details. 5 - * 6 - * Copyright (c) 2005 Silicon Graphics, Inc. All Rights Reserved. 7 - */ 8 - 9 - #ifndef _LINUX_IOC4_H 10 - #define _LINUX_IOC4_H 11 - 12 - #include <linux/interrupt.h> 13 - 14 - /*************** 15 - * Definitions * 16 - ***************/ 17 - 18 - /* Miscellaneous values inherent to hardware */ 19 - 20 - #define IOC4_EXTINT_COUNT_DIVISOR 520 /* PCI clocks per COUNT tick */ 21 - 22 - /*********************************** 23 - * Structures needed by subdrivers * 24 - ***********************************/ 25 - 26 - /* This structure fully describes the IOC4 miscellaneous registers which 27 - * appear at bar[0]+0x00000 through bar[0]+0x0005c. The corresponding 28 - * PCI resource is managed by the main IOC4 driver because it contains 29 - * registers of interest to many different IOC4 subdrivers. 30 - */ 31 - struct ioc4_misc_regs { 32 - /* Miscellaneous IOC4 registers */ 33 - union ioc4_pci_err_addr_l { 34 - uint32_t raw; 35 - struct { 36 - uint32_t valid:1; /* Address captured */ 37 - uint32_t master_id:4; /* Unit causing error 38 - * 0/1: Serial port 0 TX/RX 39 - * 2/3: Serial port 1 TX/RX 40 - * 4/5: Serial port 2 TX/RX 41 - * 6/7: Serial port 3 TX/RX 42 - * 8: ATA/ATAPI 43 - * 9-15: Undefined 44 - */ 45 - uint32_t mul_err:1; /* Multiple errors occurred */ 46 - uint32_t addr:26; /* Bits 31-6 of error addr */ 47 - } fields; 48 - } pci_err_addr_l; 49 - uint32_t pci_err_addr_h; /* Bits 63-32 of error addr */ 50 - union ioc4_sio_int { 51 - uint32_t raw; 52 - struct { 53 - uint8_t tx_mt:1; /* TX ring buffer empty */ 54 - uint8_t rx_full:1; /* RX ring buffer full */ 55 - uint8_t rx_high:1; /* RX high-water exceeded */ 56 - uint8_t rx_timer:1; /* RX timer has triggered */ 57 - uint8_t delta_dcd:1; /* DELTA_DCD seen */ 58 - uint8_t delta_cts:1; /* DELTA_CTS seen */ 59 - uint8_t intr_pass:1; /* Interrupt pass-through */ 60 - uint8_t tx_explicit:1; /* TX, MCW, or delay complete */ 61 - } fields[4]; 62 - } sio_ir; /* Serial interrupt state */ 63 - union ioc4_other_int { 64 - uint32_t raw; 65 - struct { 66 - uint32_t ata_int:1; /* ATA port passthru */ 67 - uint32_t ata_memerr:1; /* ATA halted by mem error */ 68 - uint32_t memerr:4; /* Serial halted by mem err */ 69 - uint32_t kbd_int:1; /* kbd/mouse intr asserted */ 70 - uint32_t reserved:16; /* zero */ 71 - uint32_t rt_int:1; /* INT_OUT section latch */ 72 - uint32_t gen_int:8; /* Intr. from generic pins */ 73 - } fields; 74 - } other_ir; /* Other interrupt state */ 75 - union ioc4_sio_int sio_ies; /* Serial interrupt enable set */ 76 - union ioc4_other_int other_ies; /* Other interrupt enable set */ 77 - union ioc4_sio_int sio_iec; /* Serial interrupt enable clear */ 78 - union ioc4_other_int other_iec; /* Other interrupt enable clear */ 79 - union ioc4_sio_cr { 80 - uint32_t raw; 81 - struct { 82 - uint32_t cmd_pulse:4; /* Bytebus strobe width */ 83 - uint32_t arb_diag:3; /* PCI bus requester */ 84 - uint32_t sio_diag_idle:1; /* Active ser req? */ 85 - uint32_t ata_diag_idle:1; /* Active ATA req? */ 86 - uint32_t ata_diag_active:1; /* ATA req is winner */ 87 - uint32_t reserved:22; /* zero */ 88 - } fields; 89 - } sio_cr; 90 - uint32_t unused1; 91 - union ioc4_int_out { 92 - uint32_t raw; 93 - struct { 94 - uint32_t count:16; /* Period control */ 95 - uint32_t mode:3; /* Output signal shape */ 96 - uint32_t reserved:11; /* zero */ 97 - uint32_t diag:1; /* Timebase control */ 98 - uint32_t int_out:1; /* Current value */ 99 - } fields; 100 - } int_out; /* External interrupt output control */ 101 - uint32_t unused2; 102 - union ioc4_gpcr { 103 - uint32_t raw; 104 - struct { 105 - uint32_t dir:8; /* Pin direction */ 106 - uint32_t edge:8; /* Edge/level mode */ 107 - uint32_t reserved1:4; /* zero */ 108 - uint32_t int_out_en:1; /* INT_OUT enable */ 109 - uint32_t reserved2:11; /* zero */ 110 - } fields; 111 - } gpcr_s; /* Generic PIO control set */ 112 - union ioc4_gpcr gpcr_c; /* Generic PIO control clear */ 113 - union ioc4_gpdr { 114 - uint32_t raw; 115 - struct { 116 - uint32_t gen_pin:8; /* State of pins */ 117 - uint32_t reserved:24; 118 - } fields; 119 - } gpdr; /* Generic PIO data */ 120 - uint32_t unused3; 121 - union ioc4_gppr { 122 - uint32_t raw; 123 - struct { 124 - uint32_t gen_pin:1; /* Single pin state */ 125 - uint32_t reserved:31; 126 - } fields; 127 - } gppr[8]; /* Generic PIO pins */ 128 - }; 129 - 130 - /* Masks for GPCR DIR pins */ 131 - #define IOC4_GPCR_DIR_0 0x01 /* External interrupt output */ 132 - #define IOC4_GPCR_DIR_1 0x02 /* External interrupt input */ 133 - #define IOC4_GPCR_DIR_2 0x04 134 - #define IOC4_GPCR_DIR_3 0x08 /* Keyboard/mouse presence */ 135 - #define IOC4_GPCR_DIR_4 0x10 /* Ser. port 0 xcvr select (0=232, 1=422) */ 136 - #define IOC4_GPCR_DIR_5 0x20 /* Ser. port 1 xcvr select (0=232, 1=422) */ 137 - #define IOC4_GPCR_DIR_6 0x40 /* Ser. port 2 xcvr select (0=232, 1=422) */ 138 - #define IOC4_GPCR_DIR_7 0x80 /* Ser. port 3 xcvr select (0=232, 1=422) */ 139 - 140 - /* Masks for GPCR EDGE pins */ 141 - #define IOC4_GPCR_EDGE_0 0x01 142 - #define IOC4_GPCR_EDGE_1 0x02 /* External interrupt input */ 143 - #define IOC4_GPCR_EDGE_2 0x04 144 - #define IOC4_GPCR_EDGE_3 0x08 145 - #define IOC4_GPCR_EDGE_4 0x10 146 - #define IOC4_GPCR_EDGE_5 0x20 147 - #define IOC4_GPCR_EDGE_6 0x40 148 - #define IOC4_GPCR_EDGE_7 0x80 149 - 150 - #define IOC4_VARIANT_IO9 0x0900 151 - #define IOC4_VARIANT_PCI_RT 0x0901 152 - #define IOC4_VARIANT_IO10 0x1000 153 - 154 - /* One of these per IOC4 */ 155 - struct ioc4_driver_data { 156 - struct list_head idd_list; 157 - unsigned long idd_bar0; 158 - struct pci_dev *idd_pdev; 159 - const struct pci_device_id *idd_pci_id; 160 - struct ioc4_misc_regs __iomem *idd_misc_regs; 161 - unsigned long count_period; 162 - void *idd_serial_data; 163 - unsigned int idd_variant; 164 - }; 165 - 166 - /* One per submodule */ 167 - struct ioc4_submodule { 168 - struct list_head is_list; 169 - char *is_name; 170 - struct module *is_owner; 171 - int (*is_probe) (struct ioc4_driver_data *); 172 - int (*is_remove) (struct ioc4_driver_data *); 173 - }; 174 - 175 - #define IOC4_NUM_CARDS 8 /* max cards per partition */ 176 - 177 - /********************************** 178 - * Functions needed by submodules * 179 - **********************************/ 180 - 181 - extern int ioc4_register_submodule(struct ioc4_submodule *); 182 - extern void ioc4_unregister_submodule(struct ioc4_submodule *); 183 - 184 - #endif /* _LINUX_IOC4_H */
-1
include/linux/pci_ids.h
··· 1070 1070 #define PCI_VENDOR_ID_SGI 0x10a9 1071 1071 #define PCI_DEVICE_ID_SGI_IOC3 0x0003 1072 1072 #define PCI_DEVICE_ID_SGI_LITHIUM 0x1002 1073 - #define PCI_DEVICE_ID_SGI_IOC4 0x100a 1074 1073 1075 1074 #define PCI_VENDOR_ID_WINBOND 0x10ad 1076 1075 #define PCI_DEVICE_ID_WINBOND_82C105 0x0105