i2o_pci.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:9k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Find I2O capable controllers on the PCI bus, and register/install
  3.  * them with the I2O layer
  4.  *
  5.  * (C) Copyright 1999   Red Hat Software
  6.  *
  7.  * Written by Alan Cox, Building Number Three Ltd
  8.  *  Modified by Deepak Saxena <deepak@plexity.net>
  9.  *  Modified by Boji T Kannanthanam <boji.t.kannanthanam@intel.com>
  10.  *
  11.  * This program is free software; you can redistribute it and/or
  12.  * modify it under the terms of the GNU General Public License
  13.  *  as published by the Free Software Foundation; either version
  14.  * 2 of the License, or (at your option) any later version.
  15.  *
  16.  * TODO:
  17.  * Support polled I2O PCI controllers. 
  18.  * 2.4 hotplug support
  19.  * Finish verifying 64bit/bigendian clean
  20.  */
  21. #include <linux/config.h>
  22. #include <linux/module.h>
  23. #include <linux/kernel.h>
  24. #include <linux/pci.h>
  25. #include <linux/i2o.h>
  26. #include <linux/errno.h>
  27. #include <linux/init.h>
  28. #include <linux/slab.h>
  29. #include <asm/io.h>
  30. #ifdef CONFIG_MTRR
  31. #include <asm/mtrr.h>
  32. #endif // CONFIG_MTRR
  33. static int dpt = 0;
  34. extern void i2o_sys_init(void);
  35. /**
  36.  * i2o_pci_dispose - Free bus specific resources
  37.  * @c: I2O controller
  38.  *
  39.  * Disable interrupts and then free interrupt, I/O and mtrr resources 
  40.  * used by this controller. Called by the I2O core on unload.
  41.  */
  42.  
  43. static void i2o_pci_dispose(struct i2o_controller *c)
  44. {
  45. I2O_IRQ_WRITE32(c,0xFFFFFFFF);
  46. if(c->bus.pci.irq > 0)
  47. free_irq(c->bus.pci.irq, c);
  48. iounmap(((u8 *)c->post_port)-0x40);
  49. #ifdef CONFIG_MTRR
  50. if(c->bus.pci.mtrr_reg0 > 0)
  51. mtrr_del(c->bus.pci.mtrr_reg0, 0, 0);
  52. if(c->bus.pci.mtrr_reg1 > 0)
  53. mtrr_del(c->bus.pci.mtrr_reg1, 0, 0);
  54. #endif
  55. }
  56. /**
  57.  * i2o_pci_bind - Bind controller and devices
  58.  * @c: i2o controller
  59.  * @dev: i2o device
  60.  *
  61.  * Bind a device driver to a controller. In the case of PCI all we need to do
  62.  * is module housekeeping.
  63.  */
  64.  
  65. static int i2o_pci_bind(struct i2o_controller *c, struct i2o_device *dev)
  66. {
  67. MOD_INC_USE_COUNT;
  68. return 0;
  69. }
  70. /**
  71.  * i2o_pci_unbind - Bind controller and devices
  72.  * @c: i2o controller
  73.  * @dev: i2o device
  74.  *
  75.  * Unbind a device driver from a controller. In the case of PCI all we need to do
  76.  * is module housekeeping.
  77.  */
  78.  
  79. static int i2o_pci_unbind(struct i2o_controller *c, struct i2o_device *dev)
  80. {
  81. MOD_DEC_USE_COUNT;
  82. return 0;
  83. }
  84. /**
  85.  * i2o_pci_enable - Enable controller
  86.  * @c: controller
  87.  *
  88.  * Called by the I2O core code in order to enable bus specific
  89.  * resources for this controller. In our case that means unmasking the 
  90.  * interrupt line.
  91.  */
  92. static void i2o_pci_enable(struct i2o_controller *c)
  93. {
  94. I2O_IRQ_WRITE32(c, 0);
  95. c->enabled = 1;
  96. }
  97. /**
  98.  * i2o_pci_disable - Enable controller
  99.  * @c: controller
  100.  *
  101.  * Called by the I2O core code in order to enable bus specific
  102.  * resources for this controller. In our case that means masking the 
  103.  * interrupt line.
  104.  */
  105. static void i2o_pci_disable(struct i2o_controller *c)
  106. {
  107. I2O_IRQ_WRITE32(c, 0xFFFFFFFF);
  108. c->enabled = 0;
  109. }
  110. /**
  111.  * i2o_pci_interrupt - Bus specific interrupt handler
  112.  * @irq: interrupt line
  113.  * @dev_id: cookie
  114.  *
  115.  * Handle an interrupt from a PCI based I2O controller. This turns out
  116.  * to be rather simple. We keep the controller pointer in the cookie.
  117.  */
  118.  
  119. static void i2o_pci_interrupt(int irq, void *dev_id, struct pt_regs *r)
  120. {
  121. struct i2o_controller *c = dev_id;
  122. i2o_run_queue(c);
  123. }
  124. /**
  125.  * i2o_pci_install - Install a PCI i2o controller
  126.  * @dev: PCI device of the I2O controller
  127.  *
  128.  * Install a PCI (or in theory AGP) i2o controller. Devices are
  129.  * initialized, configured and registered with the i2o core subsystem. Be
  130.  * very careful with ordering. There may be pending interrupts.
  131.  *
  132.  * To Do: Add support for polled controllers
  133.  */
  134. int __init i2o_pci_install(struct pci_dev *dev)
  135. {
  136. struct i2o_controller *c=kmalloc(sizeof(struct i2o_controller),
  137. GFP_KERNEL);
  138. unsigned long mem;
  139. u32 memptr = 0;
  140. u32 size;
  141. int i;
  142. if(c==NULL)
  143. {
  144. printk(KERN_ERR "i2o: Insufficient memory to add controller.n");
  145. return -ENOMEM;
  146. }
  147. memset(c, 0, sizeof(*c));
  148. for(i=0; i<6; i++)
  149. {
  150. /* Skip I/O spaces */
  151. if(!(pci_resource_flags(dev, i) & IORESOURCE_IO))
  152. {
  153. memptr = pci_resource_start(dev, i);
  154. break;
  155. }
  156. }
  157. if(i==6)
  158. {
  159. printk(KERN_ERR "i2o: I2O controller has no memory regions defined.n");
  160. kfree(c);
  161. return -EINVAL;
  162. }
  163. size = dev->resource[i].end-dev->resource[i].start+1;
  164. /* Map the I2O controller */
  165. printk(KERN_INFO "i2o: PCI I2O controller at 0x%08X size=%dn", memptr, size);
  166. mem = (unsigned long)ioremap(memptr, size);
  167. if(mem==0)
  168. {
  169. printk(KERN_ERR "i2o: Unable to map controller.n");
  170. kfree(c);
  171. return -EINVAL;
  172. }
  173. c->bus.pci.irq = -1;
  174. c->bus.pci.dpt = 0;
  175. c->bus.pci.short_req = 0;
  176. c->pdev = dev;
  177. c->irq_mask = mem+0x34;
  178. c->post_port = mem+0x40;
  179. c->reply_port = mem+0x44;
  180. c->mem_phys = memptr;
  181. c->mem_offset = mem;
  182. c->destructor = i2o_pci_dispose;
  183. c->bind = i2o_pci_bind;
  184. c->unbind = i2o_pci_unbind;
  185. c->bus_enable = i2o_pci_enable;
  186. c->bus_disable = i2o_pci_disable;
  187. c->type = I2O_TYPE_PCI;
  188. /*
  189.  * Cards that fall apart if you hit them with large I/O
  190.  * loads...
  191.  */
  192.  
  193. if(dev->vendor == PCI_VENDOR_ID_NCR && dev->device == 0x0630)
  194. {
  195. c->bus.pci.short_req = 1;
  196. printk(KERN_INFO "I2O: Symbios FC920 workarounds activated.n");
  197. }
  198. if(dev->subsystem_vendor == PCI_VENDOR_ID_PROMISE)
  199. {
  200. c->bus.pci.promise = 1;
  201. printk(KERN_INFO "I2O: Promise workarounds activated.n");
  202. }
  203. /*
  204.  * Cards that go bananas if you quiesce them before you reset
  205.  * them
  206.  */
  207.  
  208. if(dev->vendor == PCI_VENDOR_ID_DPT)
  209. c->bus.pci.dpt=1;
  210. /* 
  211.  * Enable Write Combining MTRR for IOP's memory region
  212.  */
  213. #ifdef CONFIG_MTRR
  214. c->bus.pci.mtrr_reg0 =
  215. mtrr_add(c->mem_phys, size, MTRR_TYPE_WRCOMB, 1);
  216. /*
  217.  * If it is an INTEL i960 I/O processor then set the first 64K to
  218.  * Uncacheable since the region contains the Messaging unit which
  219.  * shouldn't be cached.
  220.  */
  221. c->bus.pci.mtrr_reg1 = -1;
  222. if(dev->vendor == PCI_VENDOR_ID_INTEL || dev->vendor == PCI_VENDOR_ID_DPT)
  223. {
  224. printk(KERN_INFO "I2O: MTRR workaround for Intel i960 processorn"); 
  225. c->bus.pci.mtrr_reg1 = mtrr_add(c->mem_phys, 65536, MTRR_TYPE_UNCACHABLE, 1);
  226. if(c->bus.pci.mtrr_reg1< 0)
  227. {
  228. printk(KERN_INFO "i2o_pci: Error in setting MTRR_TYPE_UNCACHABLEn");
  229. mtrr_del(c->bus.pci.mtrr_reg0, c->mem_phys, size);
  230. c->bus.pci.mtrr_reg0 = -1;
  231. }
  232. }
  233. #endif
  234. I2O_IRQ_WRITE32(c,0xFFFFFFFF);
  235. i = i2o_install_controller(c);
  236. if(i<0)
  237. {
  238. printk(KERN_ERR "i2o: Unable to install controller.n");
  239. kfree(c);
  240. iounmap((void *)mem);
  241. return i;
  242. }
  243. c->bus.pci.irq = dev->irq;
  244. if(c->bus.pci.irq)
  245. {
  246. i=request_irq(dev->irq, i2o_pci_interrupt, SA_SHIRQ,
  247. c->name, c);
  248. if(i<0)
  249. {
  250. printk(KERN_ERR "%s: unable to allocate interrupt %d.n",
  251. c->name, dev->irq);
  252. c->bus.pci.irq = -1;
  253. i2o_delete_controller(c);
  254. iounmap((void *)mem);
  255. return -EBUSY;
  256. }
  257. }
  258. printk(KERN_INFO "%s: Installed at IRQ%dn", c->name, dev->irq);
  259. I2O_IRQ_WRITE32(c,0x0);
  260. c->enabled = 1;
  261. return 0;
  262. }
  263. /**
  264.  * i2o_pci_scan - Scan the pci bus for controllers
  265.  *
  266.  * Scan the PCI devices on the system looking for any device which is a 
  267.  * memory of the Intelligent, I2O class. We attempt to set up each such device
  268.  * and register it with the core.
  269.  *
  270.  * Returns the number of controllers registered
  271.  */
  272.  
  273. int __init i2o_pci_scan(void)
  274. {
  275. struct pci_dev *dev;
  276. int count=0;
  277. printk(KERN_INFO "i2o: Checking for PCI I2O controllers...n");
  278. pci_for_each_dev(dev)
  279. {
  280. if((dev->class>>8)!=PCI_CLASS_INTELLIGENT_I2O)
  281. continue;
  282. if(dev->vendor == PCI_VENDOR_ID_DPT && !dpt)
  283. {
  284. if(dev->device == 0xA501 || dev->device == 0xA511)
  285. {
  286. printk(KERN_INFO "i2o: Skipping Adaptec/DPT I2O raid with preferred native driver.n");
  287. continue;
  288. }
  289. }
  290. if((dev->class&0xFF)>1)
  291. {
  292. printk(KERN_INFO "i2o: I2O Controller found but does not support I2O 1.5 (skipping).n");
  293. continue;
  294. }
  295. if (pci_enable_device(dev))
  296. continue;
  297. printk(KERN_INFO "i2o: I2O controller on bus %d at %d.n",
  298. dev->bus->number, dev->devfn);
  299. if(pci_set_dma_mask(dev, 0xffffffff))
  300. {
  301. printk(KERN_WARNING "I2O controller on bus %d at %d : No suitable DMA availablen", dev->bus->number, dev->devfn);
  302.   continue;
  303. }
  304. pci_set_master(dev);
  305. if(i2o_pci_install(dev)==0)
  306. count++;
  307. }
  308. if(count)
  309. printk(KERN_INFO "i2o: %d I2O controller%s found and installed.n", count,
  310. count==1?"":"s");
  311. return count?count:-ENODEV;
  312. }
  313. /**
  314.  * i2o_pci_core_attach - PCI initialisation for I2O
  315.  *
  316.  * Find any I2O controllers and if present initialise them and bring up
  317.  * the I2O subsystem.
  318.  *
  319.  * Returns 0 on success or an error code
  320.  */
  321.  
  322. static int i2o_pci_core_attach(void)
  323. {
  324. printk(KERN_INFO "Linux I2O PCI support (c) 1999 Red Hat Software.n");
  325. if(i2o_pci_scan()>0)
  326. {
  327. i2o_sys_init();
  328. return 0;
  329. }
  330. return -ENODEV;
  331. }
  332. /**
  333.  * i2o_pci_core_detach - PCI unload for I2O
  334.  *
  335.  * Free up any resources not released when the controllers themselves were
  336.  * shutdown and unbound from the bus and drivers
  337.  */
  338.  
  339. static void i2o_pci_core_detach(void)
  340. {
  341. }
  342. MODULE_AUTHOR("Red Hat Software");
  343. MODULE_DESCRIPTION("I2O PCI Interface");
  344. MODULE_LICENSE("GPL");
  345. MODULE_PARM(dpt, "i");
  346. MODULE_PARM_DESC(dpt, "Set this if you want to drive DPT cards normally handled by dpt_i2o");
  347. module_init(i2o_pci_core_attach);
  348. module_exit(i2o_pci_core_detach);
  349.