i2o_pci.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:8k
源码类别:

嵌入式Linux

开发平台:

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.  */
  19. #include <linux/config.h>
  20. #include <linux/module.h>
  21. #include <linux/kernel.h>
  22. #include <linux/pci.h>
  23. #include <linux/i2o.h>
  24. #include <linux/errno.h>
  25. #include <linux/init.h>
  26. #include <linux/slab.h>
  27. #include <asm/io.h>
  28. #ifdef CONFIG_MTRR
  29. #include <asm/mtrr.h>
  30. #endif // CONFIG_MTRR
  31. #ifdef MODULE
  32. /*
  33.  * Core function table
  34.  * See <include/linux/i2o.h> for an explanation
  35.  */
  36. static struct i2o_core_func_table *core;
  37. /* Core attach function */
  38. extern int i2o_pci_core_attach(struct i2o_core_func_table *);
  39. extern void i2o_pci_core_detach(void);
  40. #endif /* MODULE */
  41. /*
  42.  * Free bus specific resources
  43.  */
  44. static void i2o_pci_dispose(struct i2o_controller *c)
  45. {
  46. I2O_IRQ_WRITE32(c,0xFFFFFFFF);
  47. if(c->bus.pci.irq > 0)
  48. free_irq(c->bus.pci.irq, c);
  49. iounmap(((u8 *)c->post_port)-0x40);
  50. #ifdef CONFIG_MTRR
  51. if(c->bus.pci.mtrr_reg0 > 0)
  52. mtrr_del(c->bus.pci.mtrr_reg0, 0, 0);
  53. if(c->bus.pci.mtrr_reg1 > 0)
  54. mtrr_del(c->bus.pci.mtrr_reg1, 0, 0);
  55. #endif
  56. }
  57. /*
  58.  * No real bus specific handling yet (note that later we will
  59.  * need to 'steal' PCI devices on i960 mainboards)
  60.  */
  61.  
  62. static int i2o_pci_bind(struct i2o_controller *c, struct i2o_device *dev)
  63. {
  64. MOD_INC_USE_COUNT;
  65. return 0;
  66. }
  67. static int i2o_pci_unbind(struct i2o_controller *c, struct i2o_device *dev)
  68. {
  69. MOD_DEC_USE_COUNT;
  70. return 0;
  71. }
  72. /*
  73.  * Bus specific enable/disable functions
  74.  */
  75. static void i2o_pci_enable(struct i2o_controller *c)
  76. {
  77. I2O_IRQ_WRITE32(c, 0);
  78. c->enabled = 1;
  79. }
  80. static void i2o_pci_disable(struct i2o_controller *c)
  81. {
  82. I2O_IRQ_WRITE32(c, 0xFFFFFFFF);
  83. c->enabled = 0;
  84. }
  85. /*
  86.  * Bus specific interrupt handler
  87.  */
  88.  
  89. static void i2o_pci_interrupt(int irq, void *dev_id, struct pt_regs *r)
  90. {
  91. struct i2o_controller *c = dev_id;
  92. #ifdef MODULE
  93. core->run_queue(c);
  94. #else
  95. i2o_run_queue(c);
  96. #endif /* MODULE */
  97. }
  98. /*
  99.  * Install a PCI (or in theory AGP) i2o controller
  100.  *
  101.  * TODO: Add support for polled controllers
  102.  */
  103. int __init i2o_pci_install(struct pci_dev *dev)
  104. {
  105. struct i2o_controller *c=kmalloc(sizeof(struct i2o_controller),
  106. GFP_KERNEL);
  107. u8 *mem;
  108. u32 memptr = 0;
  109. u32 size;
  110. int i;
  111. if(c==NULL)
  112. {
  113. printk(KERN_ERR "i2o: Insufficient memory to add controller.n");
  114. return -ENOMEM;
  115. }
  116. memset(c, 0, sizeof(*c));
  117. for(i=0; i<6; i++)
  118. {
  119. /* Skip I/O spaces */
  120. if(!(pci_resource_flags(dev, i) & IORESOURCE_IO))
  121. {
  122. memptr = pci_resource_start(dev, i);
  123. break;
  124. }
  125. }
  126. if(i==6)
  127. {
  128. printk(KERN_ERR "i2o: I2O controller has no memory regions defined.n");
  129. kfree(c);
  130. return -EINVAL;
  131. }
  132. size = dev->resource[i].end-dev->resource[i].start+1;
  133. /* Map the I2O controller */
  134. printk(KERN_INFO "i2o: PCI I2O controller at 0x%08X size=%dn", memptr, size);
  135. mem = ioremap(memptr, size);
  136. if(mem==NULL)
  137. {
  138. printk(KERN_ERR "i2o: Unable to map controller.n");
  139. kfree(c);
  140. return -EINVAL;
  141. }
  142. c->bus.pci.irq = -1;
  143. c->bus.pci.queue_buggy = 0;
  144. c->bus.pci.dpt = 0;
  145. c->bus.pci.short_req = 0;
  146. c->pdev = dev;
  147. c->irq_mask = (u32 *)(mem+0x34);
  148. c->post_port = (u32 *)(mem+0x40);
  149. c->reply_port = (u32 *)(mem+0x44);
  150. c->mem_phys = memptr;
  151. c->mem_offset = (u32)mem;
  152. c->destructor = i2o_pci_dispose;
  153. c->bind = i2o_pci_bind;
  154. c->unbind = i2o_pci_unbind;
  155. c->bus_enable = i2o_pci_enable;
  156. c->bus_disable = i2o_pci_disable;
  157. c->type = I2O_TYPE_PCI;
  158. /*
  159.  * Cards that fall apart if you hit them with large I/O
  160.  * loads...
  161.  */
  162.  
  163. if(dev->vendor == PCI_VENDOR_ID_NCR && dev->device == 0x0630)
  164. {
  165. c->bus.pci.short_req=1;
  166. printk(KERN_INFO "I2O: Symbios FC920 workarounds activated.n");
  167. }
  168. if(dev->subsystem_vendor == PCI_VENDOR_ID_PROMISE)
  169. {
  170. c->bus.pci.queue_buggy=1;
  171. if (dev->subsystem_device == 0x0000) /* SX6000 ???? */
  172. c->bus.pci.queue_buggy=2;
  173. printk(KERN_INFO "I2O: Promise workarounds activated.n");
  174. }
  175. /*
  176.  * Cards that go bananas if you quiesce them before you reset
  177.  * them
  178.  */
  179.  
  180. if(dev->vendor == PCI_VENDOR_ID_DPT)
  181. c->bus.pci.dpt=1;
  182. /* 
  183.  * Enable Write Combining MTRR for IOP's memory region
  184.  */
  185. #ifdef CONFIG_MTRR
  186. c->bus.pci.mtrr_reg0 =
  187. mtrr_add(c->mem_phys, size, MTRR_TYPE_WRCOMB, 1);
  188. /*
  189. * If it is an INTEL i960 I/O processor then set the first 64K to Uncacheable
  190. * since the region contains the Messaging unit which shouldn't be cached.
  191. */
  192. c->bus.pci.mtrr_reg1 = -1;
  193. if(dev->vendor == PCI_VENDOR_ID_INTEL || dev->vendor == PCI_VENDOR_ID_DPT)
  194. {
  195. printk(KERN_INFO "I2O: MTRR workaround for Intel i960 processorn"); 
  196. c->bus.pci.mtrr_reg1 = mtrr_add(c->mem_phys, 65536, MTRR_TYPE_UNCACHABLE, 1);
  197. if(c->bus.pci.mtrr_reg1< 0)
  198. {
  199. printk(KERN_INFO "i2o_pci: Error in setting MTRR_TYPE_UNCACHABLEn");
  200. mtrr_del(c->bus.pci.mtrr_reg0, c->mem_phys, size);
  201. c->bus.pci.mtrr_reg0 = -1;
  202. }
  203. }
  204. #endif
  205. I2O_IRQ_WRITE32(c,0xFFFFFFFF);
  206. #ifdef MODULE
  207. i = core->install(c);
  208. #else
  209. i = i2o_install_controller(c);
  210. #endif /* MODULE */
  211. if(i<0)
  212. {
  213. printk(KERN_ERR "i2o: Unable to install controller.n");
  214. kfree(c);
  215. iounmap(mem);
  216. return i;
  217. }
  218. c->bus.pci.irq = dev->irq;
  219. if(c->bus.pci.irq)
  220. {
  221. i=request_irq(dev->irq, i2o_pci_interrupt, SA_SHIRQ,
  222. c->name, c);
  223. if(i<0)
  224. {
  225. printk(KERN_ERR "%s: unable to allocate interrupt %d.n",
  226. c->name, dev->irq);
  227. c->bus.pci.irq = -1;
  228. #ifdef MODULE
  229. core->delete(c);
  230. #else
  231. i2o_delete_controller(c);
  232. #endif /* MODULE */
  233. iounmap(mem);
  234. return -EBUSY;
  235. }
  236. }
  237. printk(KERN_INFO "%s: Installed at IRQ%dn", c->name, dev->irq);
  238. I2O_IRQ_WRITE32(c,0x0);
  239. c->enabled = 1;
  240. return 0;
  241. }
  242. int __init i2o_pci_scan(void)
  243. {
  244. struct pci_dev *dev;
  245. int count=0;
  246. printk(KERN_INFO "i2o: Checking for PCI I2O controllers...n");
  247. pci_for_each_dev(dev)
  248. {
  249. if((dev->class>>8)!=PCI_CLASS_INTELLIGENT_I2O)
  250. continue;
  251. if(dev->vendor == PCI_VENDOR_ID_DPT)
  252. {
  253. if(dev->device == 0xA501 || dev->device == 0xA511)
  254. {
  255. printk(KERN_INFO "i2o: Skipping Adaptec/DPT I2O raid with preferred native driver.n");
  256. continue;
  257. }
  258. }
  259. if((dev->class&0xFF)>1)
  260. {
  261. printk(KERN_INFO "i2o: I2O Controller found but does not support I2O 1.5 (skipping).n");
  262. continue;
  263. }
  264. if (pci_enable_device(dev))
  265. continue;
  266. printk(KERN_INFO "i2o: I2O controller on bus %d at %d.n",
  267. dev->bus->number, dev->devfn);
  268. pci_set_master(dev);
  269. if(i2o_pci_install(dev)==0)
  270. count++;
  271. }
  272. if(count)
  273. printk(KERN_INFO "i2o: %d I2O controller%s found and installed.n", count,
  274. count==1?"":"s");
  275. return count?count:-ENODEV;
  276. }
  277. #ifdef I2O_HOTPLUG_SUPPORT
  278. /*
  279.  * Activate a newly found PCI I2O controller
  280.  * Not used now, but will be needed in future for
  281.  * hot plug PCI support
  282.  */
  283. static void i2o_pci_activate(i2o_controller * c)
  284. {
  285. int i=0;
  286. struct i2o_controller *c;
  287. if(c->type == I2O_TYPE_PCI)
  288. {
  289. I2O_IRQ_WRITE32(c,0);
  290. #ifdef MODULE
  291. if(core->activate(c))
  292. #else
  293. if(i2o_activate_controller(c))
  294. #endif /* MODULE */
  295. {
  296. printk("%s: Failed to initialize.n", c->name);
  297. #ifdef MODULE
  298. core->unlock(c);
  299. core->delete(c);
  300. #else
  301. i2o_unlock_controller(c);
  302. i2o_delete_controller(c);
  303. #endif
  304. continue;
  305. }
  306. }
  307. }
  308. #endif // I2O_HOTPLUG_SUPPORT
  309. #ifdef MODULE
  310. int i2o_pci_core_attach(struct i2o_core_func_table *table)
  311. {
  312. MOD_INC_USE_COUNT;
  313. core = table;
  314. return i2o_pci_scan();
  315. }
  316. void i2o_pci_core_detach(void)
  317. {
  318. core = NULL;
  319. MOD_DEC_USE_COUNT;
  320. }
  321. int init_module(void)
  322. {
  323. printk(KERN_INFO "Linux I2O PCI support (c) 1999 Red Hat Software.n");
  324. core = NULL;
  325.   return 0;
  326.  
  327. }
  328. void cleanup_module(void)
  329. {
  330. }
  331. EXPORT_SYMBOL(i2o_pci_core_attach);
  332. EXPORT_SYMBOL(i2o_pci_core_detach);
  333. MODULE_AUTHOR("Red Hat Software");
  334. MODULE_DESCRIPTION("I2O PCI Interface");
  335. MODULE_LICENSE("GPL");
  336. #else
  337. void __init i2o_pci_init(void)
  338. {
  339. printk(KERN_INFO "Linux I2O PCI support (c) 1999 Red Hat Software.n");
  340. i2o_pci_scan();
  341. }
  342. #endif