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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * eisa.c - provide support for EISA adapters in PA-RISC machines
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version
  7.  * 2 of the License, or (at your option) any later version.
  8.  *
  9.  * Copyright (c) 2001 Matthew Wilcox for Hewlett Packard
  10.  * Copyright (c) 2001 Daniel Engstrom <5116@telia.com>
  11.  *
  12.  * There are two distinct EISA adapters.  Mongoose is found in machines
  13.  * before the 712; then the Wax ASIC is used.  To complicate matters, the
  14.  * Wax ASIC also includes a PS/2 and RS-232 controller, but those are
  15.  * dealt with elsewhere; this file is concerned only with the EISA portions
  16.  * of Wax.
  17.  * 
  18.  * 
  19.  * HINT:
  20.  * -----
  21.  * To allow an ISA card to work properly in the EISA slot you need to
  22.  * set an edge trigger level. This may be done on the palo command line 
  23.  * by adding the kernel parameter "eisa_irq_edge=n,n2,[...]]", with 
  24.  * n and n2 as the irq levels you want to use.
  25.  * 
  26.  * Example: "eisa_irq_edge=10,11" allows ISA cards to operate at 
  27.  * irq levels 10 and 11.
  28.  */
  29. #include <linux/init.h>
  30. #include <linux/ioport.h>
  31. #include <linux/irq.h>
  32. #include <linux/kernel.h>
  33. #include <linux/module.h>
  34. #include <linux/pci.h>
  35. #include <linux/sched.h>
  36. #include <linux/spinlock.h>
  37. #include <asm/byteorder.h>
  38. #include <asm/gsc.h>
  39. #include <asm/hardware.h>
  40. #include <asm/processor.h>
  41. #include <asm/delay.h>
  42. #include <asm/eisa_bus.h>
  43. #if 0
  44. #define EISA_DBG(msg, arg... ) printk(KERN_DEBUG "eisa: " msg , ## arg )
  45. #else
  46. #define EISA_DBG(msg, arg... )  
  47. #endif
  48. #define SNAKES_EEPROM_BASE_ADDR 0xF0810400
  49. #define MIRAGE_EEPROM_BASE_ADDR 0xF00C0400
  50. static spinlock_t eisa_irq_lock = SPIN_LOCK_UNLOCKED;
  51. /* We can only have one EISA adapter in the system because neither
  52.  * implementation can be flexed.
  53.  */
  54. static struct eisa_ba {
  55. struct pci_hba_data hba;
  56. unsigned long eeprom_addr;
  57. } eisa_dev;
  58. /* Port ops */
  59. static inline unsigned long eisa_permute(unsigned short port)
  60. {
  61. if (port & 0x300) {
  62. return 0xfc000000 | ((port & 0xfc00) >> 6)
  63. | ((port & 0x3f8) << 9) | (port & 7);
  64. } else {
  65. return 0xfc000000 | port;
  66. }
  67. }
  68. unsigned char eisa_in8(unsigned short port)
  69. {
  70. if (EISA_bus)
  71. return gsc_readb(eisa_permute(port));
  72. return 0xff;
  73. }
  74. unsigned short eisa_in16(unsigned short port)
  75. {
  76. if (EISA_bus)
  77. return le16_to_cpu(gsc_readw(eisa_permute(port)));
  78. return 0xffff;
  79. }
  80. unsigned int eisa_in32(unsigned short port)
  81. {
  82. if (EISA_bus)
  83. return le32_to_cpu(gsc_readl(eisa_permute(port)));
  84. return 0xffffffff;
  85. }
  86. void eisa_out8(unsigned char data, unsigned short port)
  87. {
  88. if (EISA_bus)
  89. gsc_writeb(data, eisa_permute(port));
  90. }
  91. void eisa_out16(unsigned short data, unsigned short port)
  92. {
  93. if (EISA_bus)
  94. gsc_writew(cpu_to_le16(data), eisa_permute(port));
  95. }
  96. void eisa_out32(unsigned int data, unsigned short port)
  97. {
  98. if (EISA_bus)
  99. gsc_writel(cpu_to_le32(data), eisa_permute(port));
  100. }
  101. /* Interrupt handling */
  102. /* cached interrupt mask registers */
  103. static int master_mask;
  104. static int slave_mask;
  105. /* the trig level can be set with the
  106.  * eisa_irq_edge=n,n,n commandline parameter 
  107.  * We should really read this from the EEPROM 
  108.  * in the furure. 
  109.  */
  110. /* irq 13,8,2,1,0 must be edge */
  111. static unsigned int eisa_irq_level; /* default to edge triggered */
  112. /* called by free irq */
  113. static void eisa_disable_irq(void *irq_dev, int irq)
  114. {
  115. unsigned long flags;
  116. EISA_DBG("disable irq %dn", irq);
  117. /* just mask for now */
  118. spin_lock_irqsave(&eisa_irq_lock, flags);
  119.         if (irq & 8) {
  120. slave_mask |= (1 << (irq&7));
  121. eisa_out8(slave_mask, 0xa1);
  122. } else {
  123. master_mask |= (1 << (irq&7));
  124. eisa_out8(master_mask, 0x21);
  125. }
  126. spin_unlock_irqrestore(&eisa_irq_lock, flags);
  127. EISA_DBG("pic0 mask %02xn", eisa_in8(0x21));
  128. EISA_DBG("pic1 mask %02xn", eisa_in8(0xa1));
  129. }
  130. /* called by request irq */
  131. static void eisa_enable_irq(void *irq_dev, int irq)
  132. {
  133. unsigned long flags;
  134. EISA_DBG("enable irq %dn", irq);
  135. spin_lock_irqsave(&eisa_irq_lock, flags);
  136.         if (irq & 8) {
  137. slave_mask &= ~(1 << (irq&7));
  138. eisa_out8(slave_mask, 0xa1);
  139. } else {
  140. master_mask &= ~(1 << (irq&7));
  141. eisa_out8(master_mask, 0x21);
  142. }
  143. spin_unlock_irqrestore(&eisa_irq_lock, flags);
  144. EISA_DBG("pic0 mask %02xn", eisa_in8(0x21));
  145. EISA_DBG("pic1 mask %02xn", eisa_in8(0xa1));
  146. }
  147. static void eisa_mask_irq(void *irq_dev, int irq)
  148. {
  149. unsigned long flags;
  150. EISA_DBG("mask irq %dn", irq);
  151.         /* mask irq */
  152. spin_lock_irqsave(&eisa_irq_lock, flags);
  153. if (irq & 8) {
  154. slave_mask |= (1 << (irq&7));
  155. eisa_out8(slave_mask, 0xa1);
  156. } else {
  157. master_mask |= (1 << (irq&7));
  158. eisa_out8(master_mask, 0x21);
  159. }
  160. spin_unlock_irqrestore(&eisa_irq_lock, flags);
  161. }
  162. static void eisa_unmask_irq(void *irq_dev, int irq)
  163. {
  164. unsigned long flags;
  165. EISA_DBG("unmask irq %dn", irq);
  166.         
  167. /* unmask */
  168. spin_lock_irqsave(&eisa_irq_lock, flags);
  169. if (irq & 8) {
  170. slave_mask &= ~(1 << (irq&7));
  171. eisa_out8(slave_mask, 0xa1);
  172. } else {
  173. master_mask &= ~(1 << (irq&7));
  174. eisa_out8(master_mask, 0x21);
  175. }
  176. spin_unlock_irqrestore(&eisa_irq_lock, flags);
  177. }
  178. static struct irqaction action[IRQ_PER_REGION];
  179. /* EISA needs to be fixed at IRQ region #0 (EISA_IRQ_REGION) */
  180. static struct irq_region eisa_irq_region = {
  181. ops: { eisa_disable_irq, eisa_enable_irq, eisa_mask_irq, eisa_unmask_irq },
  182. data: { name: "EISA", irqbase: 0 },
  183. action: action,
  184. };
  185. static void eisa_irq(int _, void *intr_dev, struct pt_regs *regs)
  186. {
  187. extern void do_irq(struct irqaction *a, int i, struct pt_regs *p);
  188. int irq = gsc_readb(0xfc01f000); /* EISA supports 16 irqs */
  189. unsigned long flags;
  190.         
  191. spin_lock_irqsave(&eisa_irq_lock, flags);
  192. /* read IRR command */
  193. eisa_out8(0x0a, 0x20);
  194. eisa_out8(0x0a, 0xa0);
  195. EISA_DBG("irq IAR %02x 8259-1 irr %02x 8259-2 irr %02xn",
  196.    irq, eisa_in8(0x20), eisa_in8(0xa0));
  197.    
  198. /* read ISR command */
  199. eisa_out8(0x0a, 0x20);
  200. eisa_out8(0x0a, 0xa0);
  201. EISA_DBG("irq 8259-1 isr %02x imr %02x 8259-2 isr %02x imr %02xn",
  202.  eisa_in8(0x20), eisa_in8(0x21), eisa_in8(0xa0), eisa_in8(0xa1));
  203. irq &= 0xf;
  204. /* mask irq and write eoi */
  205. if (irq & 8) {
  206. slave_mask |= (1 << (irq&7));
  207. eisa_out8(slave_mask, 0xa1);
  208. eisa_out8(0x60 | (irq&7),0xa0);/* 'Specific EOI' to slave */
  209. eisa_out8(0x62,0x20); /* 'Specific EOI' to master-IRQ2 */
  210. } else {
  211. master_mask |= (1 << (irq&7));
  212. eisa_out8(master_mask, 0x21);
  213. eisa_out8(0x60|irq,0x20); /* 'Specific EOI' to master */
  214. }
  215. spin_unlock_irqrestore(&eisa_irq_lock, flags);
  216.    
  217. do_irq(&eisa_irq_region.action[irq], EISA_IRQ_REGION + irq, regs);
  218.    
  219. spin_lock_irqsave(&eisa_irq_lock, flags);
  220. /* unmask */
  221.         if (irq & 8) {
  222. slave_mask &= ~(1 << (irq&7));
  223. eisa_out8(slave_mask, 0xa1);
  224. } else {
  225. master_mask &= ~(1 << (irq&7));
  226. eisa_out8(master_mask, 0x21);
  227. }
  228. spin_unlock_irqrestore(&eisa_irq_lock, flags);
  229. }
  230. static void dummy_irq2_handler(int _, void *dev, struct pt_regs *regs)
  231. {
  232. printk(KERN_ALERT "eisa: uhh, irq2?n");
  233. }
  234. static void init_eisa_pic(void)
  235. {
  236. unsigned long flags;
  237. spin_lock_irqsave(&eisa_irq_lock, flags);
  238. eisa_out8(0xff, 0x21); /* mask during init */
  239. eisa_out8(0xff, 0xa1); /* mask during init */
  240. /* master pic */
  241. eisa_out8(0x11,0x20); /* ICW1 */   
  242. eisa_out8(0x00,0x21); /* ICW2 */   
  243. eisa_out8(0x04,0x21); /* ICW3 */   
  244. eisa_out8(0x01,0x21); /* ICW4 */   
  245. eisa_out8(0x40,0x20); /* OCW2 */   
  246. /* slave pic */
  247. eisa_out8(0x11,0xa0); /* ICW1 */   
  248. eisa_out8(0x08,0xa1); /* ICW2 */   
  249.         eisa_out8(0x02,0xa1); /* ICW3 */   
  250. eisa_out8(0x01,0xa1); /* ICW4 */   
  251. eisa_out8(0x40,0xa0); /* OCW2 */   
  252.         
  253. udelay(100);
  254. slave_mask = 0xff; 
  255. master_mask = 0xfb; 
  256. eisa_out8(slave_mask, 0xa1); /* OCW1 */
  257. eisa_out8(master_mask, 0x21); /* OCW1 */
  258. /* setup trig level */
  259. EISA_DBG("EISA edge/level %04xn", eisa_irq_level);
  260. eisa_out8(eisa_irq_level&0xff, 0x4d0); /* Set all irq's to edge  */
  261. eisa_out8((eisa_irq_level >> 8) & 0xff, 0x4d1); 
  262. EISA_DBG("pic0 mask %02xn", eisa_in8(0x21));
  263. EISA_DBG("pic1 mask %02xn", eisa_in8(0xa1));
  264. EISA_DBG("pic0 edge/level %02xn", eisa_in8(0x4d0));
  265. EISA_DBG("pic1 edge/level %02xn", eisa_in8(0x4d1));
  266. spin_unlock_irqrestore(&eisa_irq_lock, flags);
  267. }
  268. /* Device initialisation */
  269. #define is_mongoose(dev) (dev->id.sversion == 0x00076)
  270. static int __devinit eisa_probe(struct parisc_device *dev)
  271. {
  272. int result;
  273. char *name = is_mongoose(dev) ? "Mongoose" : "Wax";
  274. printk(KERN_INFO "%s EISA Adapter found at 0x%08lxn", 
  275. name, dev->hpa);
  276. eisa_dev.hba.dev = dev;
  277. eisa_dev.hba.iommu = ccio_get_iommu(dev);
  278. eisa_dev.hba.lmmio_space.name = "EISA";
  279. eisa_dev.hba.lmmio_space.start = (unsigned long) 0xfffffffffc000000;
  280. eisa_dev.hba.lmmio_space.end = (unsigned long) 0xffffffffffbfffff;
  281. eisa_dev.hba.lmmio_space.flags = IORESOURCE_MEM;
  282. result = ccio_request_resource(dev, &eisa_dev.hba.lmmio_space);
  283. if (result < 0) {
  284. printk(KERN_ERR "EISA: failed to claim EISA Bus address space!n");
  285. return result;
  286. }
  287. eisa_dev.hba.io_space.name = "EISA";
  288. eisa_dev.hba.io_space.start = 0;
  289. eisa_dev.hba.io_space.end = 0xffff;
  290. eisa_dev.hba.lmmio_space.flags = IORESOURCE_IO;
  291. result = request_resource(&ioport_resource, &eisa_dev.hba.io_space);
  292. if (result < 0) {
  293. printk(KERN_ERR "EISA: failed to claim EISA Bus port space!n");
  294. return result;
  295. }
  296. pcibios_register_hba(&eisa_dev.hba);
  297. result = request_irq(dev->irq, eisa_irq, SA_SHIRQ, "EISA", NULL);
  298. if (result) {
  299. printk(KERN_ERR "EISA: request_irq failed!n");
  300. return result;
  301. }
  302. /* Reserve IRQ2 */
  303. action[2].handler = dummy_irq2_handler;
  304. action[2].name = "cascade";
  305. eisa_irq_region.data.dev = dev;
  306. irq_region[0] = &eisa_irq_region;
  307. EISA_bus = 1;
  308. if (dev->num_addrs) {
  309. /* newer firmware hand out the eeprom address */
  310. eisa_dev.eeprom_addr = dev->addr[0];
  311. } else {
  312. /* old firmware, need to figure out the box */
  313. if (is_mongoose(dev)) {
  314. eisa_dev.eeprom_addr = SNAKES_EEPROM_BASE_ADDR;
  315. } else {
  316. eisa_dev.eeprom_addr = MIRAGE_EEPROM_BASE_ADDR;
  317. }
  318. }
  319. eisa_eeprom_init(eisa_dev.eeprom_addr);
  320. eisa_enumerator(eisa_dev.eeprom_addr, &eisa_dev.hba.io_space, &eisa_dev.hba.lmmio_space);
  321. init_eisa_pic();
  322. return 0;
  323. }
  324. static struct parisc_device_id __devinitdata eisa_tbl[] = {
  325. { HPHW_BA, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00076 }, /* Mongoose */
  326. { HPHW_BA, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00090 }, /* Wax EISA */
  327. { 0, }
  328. };
  329. MODULE_DEVICE_TABLE(parisc, eisa_tbl);
  330. static struct parisc_driver eisa_driver = {
  331. name: "EISA Bus Adapter",
  332. id_table: eisa_tbl,
  333. probe: eisa_probe,
  334. };
  335. void __init eisa_init(void)
  336. {
  337. register_parisc_driver(&eisa_driver);
  338. }
  339. static unsigned int eisa_irq_configured;
  340. void eisa_make_irq_level(int num)
  341. {
  342. if (eisa_irq_configured& (1<<num)) {
  343. printk(KERN_WARNING
  344.        "IRQ %d polarity configured twice (last to level)n", 
  345.        num);
  346. }
  347. eisa_irq_level |= (1<<num); /* set the corresponding bit */
  348. eisa_irq_configured |= (1<<num); /* set the corresponding bit */
  349. }
  350. void eisa_make_irq_edge(int num)
  351. {
  352. if (eisa_irq_configured& (1<<num)) {
  353. printk(KERN_WARNING 
  354.        "IRQ %d polarity configured twice (last to edge)n",
  355.        num);
  356. }
  357. eisa_irq_level &= ~(1<<num); /* clear the corresponding bit */
  358. eisa_irq_configured |= (1<<num); /* set the corresponding bit */
  359. }
  360. static int __init eisa_irq_setup(char *str)
  361. {
  362. char *cur = str;
  363. int val;
  364. EISA_DBG("IRQ setupn");
  365. while (cur != NULL) {
  366. char *pe;
  367. val = (int) simple_strtoul(cur, &pe, 0);
  368. if (val > 15 || val < 0) {
  369. printk(KERN_ERR "eisa: EISA irq value are 0-15n");
  370. continue;
  371. }
  372. if (val == 2) { 
  373. val = 9;
  374. }
  375. eisa_make_irq_edge(val); /* clear the corresponding bit */
  376. EISA_DBG("setting IRQ %d to edge-triggered moden", val);
  377. if ((cur = strchr(cur, ','))) {
  378. cur++;
  379. } else {
  380. break;
  381. }
  382. }
  383. return 1;
  384. }
  385. __setup("eisa_irq_edge=", eisa_irq_setup);