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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/kernel/ecard.c
  3.  *
  4.  *  Copyright 1995-2001 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  *
  10.  *  Find all installed expansion cards, and handle interrupts from them.
  11.  *
  12.  *  Created from information from Acorns RiscOS3 PRMs
  13.  *
  14.  *  08-Dec-1996 RMK Added code for the 9'th expansion card - the ether
  15.  * podule slot.
  16.  *  06-May-1997 RMK Added blacklist for cards whose loader doesn't work.
  17.  *  12-Sep-1997 RMK Created new handling of interrupt enables/disables
  18.  * - cards can now register their own routine to control
  19.  * interrupts (recommended).
  20.  *  29-Sep-1997 RMK Expansion card interrupt hardware not being re-enabled
  21.  * on reset from Linux. (Caused cards not to respond
  22.  * under RiscOS without hard reset).
  23.  *  15-Feb-1998 RMK Added DMA support
  24.  *  12-Sep-1998 RMK Added EASI support
  25.  *  10-Jan-1999 RMK Run loaders in a simulated RISC OS environment.
  26.  *  17-Apr-1999 RMK Support for EASI Type C cycles.
  27.  */
  28. #define ECARD_C
  29. #include <linux/config.h>
  30. #include <linux/module.h>
  31. #include <linux/kernel.h>
  32. #include <linux/types.h>
  33. #include <linux/sched.h>
  34. #include <linux/interrupt.h>
  35. #include <linux/reboot.h>
  36. #include <linux/mm.h>
  37. #include <linux/slab.h>
  38. #include <linux/proc_fs.h>
  39. #include <linux/notifier.h>
  40. #include <linux/init.h>
  41. #include <asm/dma.h>
  42. #include <asm/ecard.h>
  43. #include <asm/hardware.h>
  44. #include <asm/io.h>
  45. #include <asm/irq.h>
  46. #include <asm/pgalloc.h>
  47. #include <asm/mmu_context.h>
  48. #include <asm/mach/irq.h>
  49. #ifndef CONFIG_ARCH_RPC
  50. #define HAVE_EXPMASK
  51. #endif
  52. enum req {
  53. req_readbytes,
  54. req_reset_all
  55. };
  56. struct ecard_request {
  57. enum req req;
  58. ecard_t *ec;
  59. unsigned int address;
  60. unsigned int length;
  61. unsigned int use_loader;
  62. void *buffer;
  63. };
  64. struct expcard_blacklist {
  65. unsigned short  manufacturer;
  66. unsigned short  product;
  67. const char *type;
  68. };
  69. static ecard_t *cards;
  70. static ecard_t *slot_to_expcard[MAX_ECARDS];
  71. static unsigned int ectcr;
  72. #ifdef HAS_EXPMASK
  73. static unsigned int have_expmask;
  74. #endif
  75. /* List of descriptions of cards which don't have an extended
  76.  * identification, or chunk directories containing a description.
  77.  */
  78. static struct expcard_blacklist __initdata blacklist[] = {
  79. { MANU_ACORN, PROD_ACORN_ETHER1, "Acorn Ether1" }
  80. };
  81. asmlinkage extern int
  82. ecard_loader_reset(volatile unsigned char *pa, loader_t loader);
  83. asmlinkage extern int
  84. ecard_loader_read(int off, volatile unsigned char *pa, loader_t loader);
  85. extern int setup_arm_irq(int, struct irqaction *);
  86. extern void do_ecard_IRQ(int, struct pt_regs *);
  87. static void
  88. ecard_irq_noexpmask(int intr_no, void *dev_id, struct pt_regs *regs);
  89. static struct irqaction irqexpansioncard = {
  90. ecard_irq_noexpmask, SA_INTERRUPT, 0, "expansion cards", NULL, NULL
  91. };
  92. static inline unsigned short
  93. ecard_getu16(unsigned char *v)
  94. {
  95. return v[0] | v[1] << 8;
  96. }
  97. static inline signed long
  98. ecard_gets24(unsigned char *v)
  99. {
  100. return v[0] | v[1] << 8 | v[2] << 16 | ((v[2] & 0x80) ? 0xff000000 : 0);
  101. }
  102. static inline ecard_t *
  103. slot_to_ecard(unsigned int slot)
  104. {
  105. return slot < MAX_ECARDS ? slot_to_expcard[slot] : NULL;
  106. }
  107. /* ===================== Expansion card daemon ======================== */
  108. /*
  109.  * Since the loader programs on the expansion cards need to be run
  110.  * in a specific environment, create a separate task with this
  111.  * environment up, and pass requests to this task as and when we
  112.  * need to.
  113.  *
  114.  * This should allow 99% of loaders to be called from Linux.
  115.  *
  116.  * From a security standpoint, we trust the card vendors.  This
  117.  * may be a misplaced trust.
  118.  */
  119. #define BUS_ADDR(x) ((((unsigned long)(x)) << 2) + IO_BASE)
  120. #define POD_INT_ADDR(x) ((volatile unsigned char *)
  121.  ((BUS_ADDR((x)) - IO_BASE) + IO_START))
  122. static inline void ecard_task_reset(void)
  123. {
  124. ecard_t *ec;
  125. for (ec = cards; ec; ec = ec->next)
  126. if (ec->loader)
  127. ecard_loader_reset(POD_INT_ADDR(ec->podaddr),
  128.    ec->loader);
  129. }
  130. static void
  131. ecard_task_readbytes(struct ecard_request *req)
  132. {
  133. unsigned char *buf = (unsigned char *)req->buffer;
  134. volatile unsigned char *base_addr =
  135. (volatile unsigned char *)POD_INT_ADDR(req->ec->podaddr);
  136. unsigned int len = req->length;
  137. unsigned int off = req->address;
  138. if (req->ec->slot_no == 8) {
  139. /*
  140.  * The card maintains an index which increments the address
  141.  * into a 4096-byte page on each access.  We need to keep
  142.  * track of the counter.
  143.  */
  144. static unsigned int index;
  145. unsigned int page;
  146. page = (off >> 12) * 4;
  147. if (page > 256 * 4)
  148. return;
  149. off &= 4095;
  150. /*
  151.  * If we are reading offset 0, or our current index is
  152.  * greater than the offset, reset the hardware index counter.
  153.  */
  154. if (off == 0 || index > off) {
  155. *base_addr = 0;
  156. index = 0;
  157. }
  158. /*
  159.  * Increment the hardware index counter until we get to the
  160.  * required offset.  The read bytes are discarded.
  161.  */
  162. while (index < off) {
  163. unsigned char byte;
  164. byte = base_addr[page];
  165. index += 1;
  166. }
  167. while (len--) {
  168. *buf++ = base_addr[page];
  169. index += 1;
  170. }
  171. } else {
  172. if (!req->use_loader || !req->ec->loader) {
  173. off *= 4;
  174. while (len--) {
  175. *buf++ = base_addr[off];
  176. off += 4;
  177. }
  178. } else {
  179. while(len--) {
  180. /*
  181.  * The following is required by some
  182.  * expansion card loader programs.
  183.  */
  184. *(unsigned long *)0x108 = 0;
  185. *buf++ = ecard_loader_read(off++, base_addr,
  186.    req->ec->loader);
  187. }
  188. }
  189. }
  190. }
  191. static void ecard_do_request(struct ecard_request *req)
  192. {
  193. switch (req->req) {
  194. case req_readbytes:
  195. ecard_task_readbytes(req);
  196. break;
  197. case req_reset_all:
  198. ecard_task_reset();
  199. break;
  200. }
  201. }
  202. #ifdef CONFIG_CPU_32
  203. #include <linux/completion.h>
  204. static pid_t ecard_pid;
  205. static wait_queue_head_t ecard_wait;
  206. static struct ecard_request *ecard_req;
  207. static DECLARE_COMPLETION(ecard_completion);
  208. /*
  209.  * Set up the expansion card daemon's page tables.
  210.  */
  211. static void ecard_init_pgtables(struct mm_struct *mm)
  212. {
  213. /* We want to set up the page tables for the following mapping:
  214.  *  Virtual Physical
  215.  *  0x03000000 0x03000000
  216.  *  0x03010000 unmapped
  217.  *  0x03210000 0x03210000
  218.  *  0x03400000 unmapped
  219.  *  0x08000000 0x08000000
  220.  *  0x10000000 unmapped
  221.  *
  222.  * FIXME: we don't follow this 100% yet.
  223.  */
  224. pgd_t *src_pgd, *dst_pgd;
  225. unsigned int dst_addr = IO_START;
  226. src_pgd = pgd_offset(mm, IO_BASE);
  227. dst_pgd = pgd_offset(mm, dst_addr);
  228. while (dst_addr < IO_START + IO_SIZE) {
  229. *dst_pgd++ = *src_pgd++;
  230. dst_addr += PGDIR_SIZE;
  231. }
  232. dst_addr = EASI_START;
  233. src_pgd = pgd_offset(mm, EASI_BASE);
  234. dst_pgd = pgd_offset(mm, dst_addr);
  235. while (dst_addr < EASI_START + EASI_SIZE) {
  236. *dst_pgd++ = *src_pgd++;
  237. dst_addr += PGDIR_SIZE;
  238. }
  239. flush_tlb_range(mm, IO_START, IO_START + IO_SIZE);
  240. flush_tlb_range(mm, EASI_START, EASI_START + EASI_SIZE);
  241. }
  242. static int ecard_init_mm(void)
  243. {
  244. struct mm_struct * mm = mm_alloc();
  245. struct mm_struct *active_mm = current->active_mm;
  246. if (!mm)
  247. return -ENOMEM;
  248. current->mm = mm;
  249. current->active_mm = mm;
  250. activate_mm(active_mm, mm);
  251. mmdrop(active_mm);
  252. ecard_init_pgtables(mm);
  253. return 0;
  254. }
  255. static int
  256. ecard_task(void * unused)
  257. {
  258. struct task_struct *tsk = current;
  259. /*
  260.  * We don't want /any/ signals, not even SIGKILL
  261.  */
  262. sigfillset(&tsk->blocked);
  263. sigemptyset(&tsk->pending.signal);
  264. recalc_sigpending(tsk);
  265. strcpy(tsk->comm, "kecardd");
  266. daemonize();
  267. /*
  268.  * Allocate a mm.  We're not a lazy-TLB kernel task since we need
  269.  * to set page table entries where the user space would be.  Note
  270.  * that this also creates the page tables.  Failure is not an
  271.  * option here.
  272.  */
  273. if (ecard_init_mm())
  274. panic("kecardd: unable to alloc mmn");
  275. while (1) {
  276. struct ecard_request *req;
  277. do {
  278. req = xchg(&ecard_req, NULL);
  279. if (req == NULL) {
  280. sigemptyset(&tsk->pending.signal);
  281. interruptible_sleep_on(&ecard_wait);
  282. }
  283. } while (req == NULL);
  284. ecard_do_request(req);
  285. complete(&ecard_completion);
  286. }
  287. }
  288. /*
  289.  * Wake the expansion card daemon to action our request.
  290.  *
  291.  * FIXME: The test here is not sufficient to detect if the
  292.  * kcardd is running.
  293.  */
  294. static void
  295. ecard_call(struct ecard_request *req)
  296. {
  297. /*
  298.  * Make sure we have a context that is able to sleep.
  299.  */
  300. if (current == &init_task || in_interrupt())
  301. BUG();
  302. if (ecard_pid <= 0)
  303. ecard_pid = kernel_thread(ecard_task, NULL,
  304. CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
  305. ecard_req = req;
  306. wake_up(&ecard_wait);
  307. /*
  308.  * Now wait for kecardd to run.
  309.  */
  310. wait_for_completion(&ecard_completion);
  311. }
  312. #else
  313. /*
  314.  * On 26-bit processors, we don't need the kcardd thread to access the
  315.  * expansion card loaders.  We do it directly.
  316.  */
  317. #define ecard_call(req) ecard_do_request(req)
  318. #endif
  319. /* ======================= Mid-level card control ===================== */
  320. /*
  321.  * This function is responsible for resetting the expansion cards to a
  322.  * sensible state immediately prior to rebooting the system.  This function
  323.  * has process state (keventd), so we can sleep.
  324.  *
  325.  * Possible "val" values here:
  326.  *  SYS_RESTART   -  restarting system
  327.  *  SYS_HALT      - halting system
  328.  *  SYS_POWER_OFF - powering down system
  329.  *
  330.  * We ignore all calls, unless it is a SYS_RESTART call - power down/halts
  331.  * will be followed by a SYS_RESTART if ctrl-alt-del is pressed again.
  332.  */
  333. static int ecard_reboot(struct notifier_block *me, unsigned long val, void *v)
  334. {
  335. struct ecard_request req;
  336. if (val != SYS_RESTART)
  337. return 0;
  338. /*
  339.  * Disable the expansion card interrupt
  340.  */
  341. disable_irq(IRQ_EXPANSIONCARD);
  342. /*
  343.  * If we have any expansion card loader code which will handle
  344.  * the reset for us, call it now.
  345.  */
  346. req.req = req_reset_all;
  347. ecard_call(&req);
  348. /*
  349.  * Disable the expansion card interrupt again, just to be sure.
  350.  */
  351. disable_irq(IRQ_EXPANSIONCARD);
  352. /*
  353.  * Finally, reset the expansion card interrupt mask to
  354.  * all enable (RISC OS doesn't set this)
  355.  */
  356. #ifdef HAS_EXPMASK
  357. have_expmask = ~0;
  358. __raw_writeb(have_expmask, EXPMASK_ENABLE);
  359. #endif
  360. return 0;
  361. }
  362. static struct notifier_block ecard_reboot_notifier = {
  363. notifier_call: ecard_reboot,
  364. };
  365. static void
  366. ecard_readbytes(void *addr, ecard_t *ec, int off, int len, int useld)
  367. {
  368. struct ecard_request req;
  369. req.req = req_readbytes;
  370. req.ec = ec;
  371. req.address = off;
  372. req.length = len;
  373. req.use_loader = useld;
  374. req.buffer = addr;
  375. ecard_call(&req);
  376. }
  377. int ecard_readchunk(struct in_chunk_dir *cd, ecard_t *ec, int id, int num)
  378. {
  379. struct ex_chunk_dir excd;
  380. int index = 16;
  381. int useld = 0;
  382. if (!ec->cid.cd)
  383. return 0;
  384. while(1) {
  385. ecard_readbytes(&excd, ec, index, 8, useld);
  386. index += 8;
  387. if (c_id(&excd) == 0) {
  388. if (!useld && ec->loader) {
  389. useld = 1;
  390. index = 0;
  391. continue;
  392. }
  393. return 0;
  394. }
  395. if (c_id(&excd) == 0xf0) { /* link */
  396. index = c_start(&excd);
  397. continue;
  398. }
  399. if (c_id(&excd) == 0x80) { /* loader */
  400. if (!ec->loader) {
  401. ec->loader = (loader_t)kmalloc(c_len(&excd),
  402.        GFP_KERNEL);
  403. if (ec->loader)
  404. ecard_readbytes(ec->loader, ec,
  405. (int)c_start(&excd),
  406. c_len(&excd), useld);
  407. else
  408. return 0;
  409. }
  410. continue;
  411. }
  412. if (c_id(&excd) == id && num-- == 0)
  413. break;
  414. }
  415. if (c_id(&excd) & 0x80) {
  416. switch (c_id(&excd) & 0x70) {
  417. case 0x70:
  418. ecard_readbytes((unsigned char *)excd.d.string, ec,
  419. (int)c_start(&excd), c_len(&excd),
  420. useld);
  421. break;
  422. case 0x00:
  423. break;
  424. }
  425. }
  426. cd->start_offset = c_start(&excd);
  427. memcpy(cd->d.string, excd.d.string, 256);
  428. return 1;
  429. }
  430. /* ======================= Interrupt control ============================ */
  431. static void ecard_def_irq_enable(ecard_t *ec, int irqnr)
  432. {
  433. #ifdef HAS_EXPMASK
  434. if (irqnr < 4 && have_expmask) {
  435. have_expmask |= 1 << irqnr;
  436. __raw_writeb(have_expmask, EXPMASK_ENABLE);
  437. }
  438. #endif
  439. }
  440. static void ecard_def_irq_disable(ecard_t *ec, int irqnr)
  441. {
  442. #ifdef HAS_EXPMASK
  443. if (irqnr < 4 && have_expmask) {
  444. have_expmask &= ~(1 << irqnr);
  445. __raw_writeb(have_expmask, EXPMASK_ENABLE);
  446. }
  447. #endif
  448. }
  449. static int ecard_def_irq_pending(ecard_t *ec)
  450. {
  451. return !ec->irqmask || ec->irqaddr[0] & ec->irqmask;
  452. }
  453. static void ecard_def_fiq_enable(ecard_t *ec, int fiqnr)
  454. {
  455. panic("ecard_def_fiq_enable called - impossible");
  456. }
  457. static void ecard_def_fiq_disable(ecard_t *ec, int fiqnr)
  458. {
  459. panic("ecard_def_fiq_disable called - impossible");
  460. }
  461. static int ecard_def_fiq_pending(ecard_t *ec)
  462. {
  463. return !ec->fiqmask || ec->fiqaddr[0] & ec->fiqmask;
  464. }
  465. static expansioncard_ops_t ecard_default_ops = {
  466. ecard_def_irq_enable,
  467. ecard_def_irq_disable,
  468. ecard_def_irq_pending,
  469. ecard_def_fiq_enable,
  470. ecard_def_fiq_disable,
  471. ecard_def_fiq_pending
  472. };
  473. /*
  474.  * Enable and disable interrupts from expansion cards.
  475.  * (interrupts are disabled for these functions).
  476.  *
  477.  * They are not meant to be called directly, but via enable/disable_irq.
  478.  */
  479. static void ecard_enableirq(unsigned int irqnr)
  480. {
  481. ecard_t *ec = slot_to_ecard(irqnr - 32);
  482. if (ec) {
  483. if (!ec->ops)
  484. ec->ops = &ecard_default_ops;
  485. if (ec->claimed && ec->ops->irqenable)
  486. ec->ops->irqenable(ec, irqnr);
  487. else
  488. printk(KERN_ERR "ecard: rejecting request to "
  489. "enable IRQs for %dn", irqnr);
  490. }
  491. }
  492. static void ecard_disableirq(unsigned int irqnr)
  493. {
  494. ecard_t *ec = slot_to_ecard(irqnr - 32);
  495. if (ec) {
  496. if (!ec->ops)
  497. ec->ops = &ecard_default_ops;
  498. if (ec->ops && ec->ops->irqdisable)
  499. ec->ops->irqdisable(ec, irqnr);
  500. }
  501. }
  502. void ecard_enablefiq(unsigned int fiqnr)
  503. {
  504. ecard_t *ec = slot_to_ecard(fiqnr);
  505. if (ec) {
  506. if (!ec->ops)
  507. ec->ops = &ecard_default_ops;
  508. if (ec->claimed && ec->ops->fiqenable)
  509. ec->ops->fiqenable(ec, fiqnr);
  510. else
  511. printk(KERN_ERR "ecard: rejecting request to "
  512. "enable FIQs for %dn", fiqnr);
  513. }
  514. }
  515. void ecard_disablefiq(unsigned int fiqnr)
  516. {
  517. ecard_t *ec = slot_to_ecard(fiqnr);
  518. if (ec) {
  519. if (!ec->ops)
  520. ec->ops = &ecard_default_ops;
  521. if (ec->ops->fiqdisable)
  522. ec->ops->fiqdisable(ec, fiqnr);
  523. }
  524. }
  525. static void
  526. ecard_dump_irq_state(ecard_t *ec)
  527. {
  528. printk("  %d: %sclaimed, ",
  529.        ec->slot_no,
  530.        ec->claimed ? "" : "not ");
  531. if (ec->ops && ec->ops->irqpending &&
  532.     ec->ops != &ecard_default_ops)
  533. printk("irq %spendingn",
  534.        ec->ops->irqpending(ec) ? "" : "not ");
  535. else
  536. printk("irqaddr %p, mask = %02X, status = %02Xn",
  537.        ec->irqaddr, ec->irqmask, *ec->irqaddr);
  538. }
  539. static void
  540. ecard_check_lockup(void)
  541. {
  542. static int last, lockup;
  543. ecard_t *ec;
  544. /*
  545.  * If the timer interrupt has not run since the last million
  546.  * unrecognised expansion card interrupts, then there is
  547.  * something seriously wrong.  Disable the expansion card
  548.  * interrupts so at least we can continue.
  549.  *
  550.  * Maybe we ought to start a timer to re-enable them some time
  551.  * later?
  552.  */
  553. if (last == jiffies) {
  554. lockup += 1;
  555. if (lockup > 1000000) {
  556. printk(KERN_ERR "nInterrupt lockup detected - "
  557.        "disabling all expansion card interruptsn");
  558. disable_irq(IRQ_EXPANSIONCARD);
  559. printk("Expansion card IRQ state:n");
  560. for (ec = cards; ec; ec = ec->next)
  561. ecard_dump_irq_state(ec);
  562. }
  563. } else
  564. lockup = 0;
  565. /*
  566.  * If we did not recognise the source of this interrupt,
  567.  * warn the user, but don't flood the user with these messages.
  568.  */
  569. if (!last || time_after(jiffies, last + 5*HZ)) {
  570. last = jiffies;
  571. printk(KERN_WARNING "Unrecognised interrupt from backplanen");
  572. }
  573. }
  574. static void
  575. ecard_irq_noexpmask(int intr_no, void *dev_id, struct pt_regs *regs)
  576. {
  577. ecard_t *ec;
  578. int called = 0;
  579. for (ec = cards; ec; ec = ec->next) {
  580. int pending;
  581. if (!ec->claimed || ec->irq == NO_IRQ || ec->slot_no == 8)
  582. continue;
  583. if (ec->ops && ec->ops->irqpending)
  584. pending = ec->ops->irqpending(ec);
  585. else
  586. pending = ecard_default_ops.irqpending(ec);
  587. if (pending) {
  588. do_ecard_IRQ(ec->irq, regs);
  589. called ++;
  590. }
  591. }
  592. cli();
  593. if (called == 0)
  594. ecard_check_lockup();
  595. }
  596. #ifdef HAS_EXPMASK
  597. static unsigned char priority_masks[] =
  598. {
  599. 0xf0, 0xf1, 0xf3, 0xf7, 0xff, 0xff, 0xff, 0xff
  600. };
  601. static unsigned char first_set[] =
  602. {
  603. 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00,
  604. 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00
  605. };
  606. static void
  607. ecard_irq_expmask(int intr_no, void *dev_id, struct pt_regs *regs)
  608. {
  609. const unsigned int statusmask = 15;
  610. unsigned int status;
  611. status = __raw_readb(EXPMASK_STATUS) & statusmask;
  612. if (status) {
  613. unsigned int slot;
  614. ecard_t *ec;
  615. again:
  616. slot = first_set[status];
  617. ec = slot_to_ecard(slot);
  618. if (ec->claimed) {
  619. unsigned int oldexpmask;
  620. /*
  621.  * this ugly code is so that we can operate a
  622.  * prioritorising system:
  623.  *
  624.  * Card 0  highest priority
  625.  * Card 1
  626.  * Card 2
  627.  * Card 3 lowest priority
  628.  *
  629.  * Serial cards should go in 0/1, ethernet/scsi in 2/3
  630.  * otherwise you will lose serial data at high speeds!
  631.  */
  632. oldexpmask = have_expmask;
  633. have_expmask &= priority_masks[slot];
  634. __raw_writeb(have_expmask, EXPMASK_ENABLE);
  635. sti();
  636. do_ecard_IRQ(ec->irq, regs);
  637. cli();
  638. have_expmask = oldexpmask;
  639. __raw_writeb(have_expmask, EXPMASK_ENABLE);
  640. status = __raw_readb(EXPMASK_STATUS) & statusmask;
  641. if (status)
  642. goto again;
  643. } else {
  644. printk(KERN_WARNING "card%d: interrupt from unclaimed "
  645.        "card???n", slot);
  646. have_expmask &= ~(1 << slot);
  647. __raw_writeb(have_expmask, EXPMASK_ENABLE);
  648. }
  649. } else
  650. printk(KERN_WARNING "Wild interrupt from backplane (masks)n");
  651. }
  652. static void __init
  653. ecard_probeirqhw(void)
  654. {
  655. ecard_t *ec;
  656. int found;
  657. __raw_writeb(0x00, EXPMASK_ENABLE);
  658. __raw_writeb(0xff, EXPMASK_STATUS);
  659. found = (__raw_readb(EXPMASK_STATUS) & 15) == 0;
  660. __raw_writeb(0xff, EXPMASK_ENABLE);
  661. if (!found)
  662. return;
  663. printk(KERN_DEBUG "Expansion card interrupt "
  664.        "management hardware foundn");
  665. irqexpansioncard.handler = ecard_irq_expmask;
  666. /* for each card present, set a bit to '1' */
  667. have_expmask = 0x80000000;
  668. for (ec = cards; ec; ec = ec->next)
  669. have_expmask |= 1 << ec->slot_no;
  670. __raw_writeb(have_expmask, EXPMASK_ENABLE);
  671. }
  672. #else
  673. #define ecard_probeirqhw()
  674. #endif
  675. #ifndef IO_EC_MEMC8_BASE
  676. #define IO_EC_MEMC8_BASE 0
  677. #endif
  678. unsigned int ecard_address(ecard_t *ec, card_type_t type, card_speed_t speed)
  679. {
  680. unsigned long address = 0;
  681. int slot = ec->slot_no;
  682. if (ec->slot_no == 8)
  683. return IO_EC_MEMC8_BASE;
  684. ectcr &= ~(1 << slot);
  685. switch (type) {
  686. case ECARD_MEMC:
  687. if (slot < 4)
  688. address = IO_EC_MEMC_BASE + (slot << 12);
  689. break;
  690. case ECARD_IOC:
  691. if (slot < 4)
  692. address = IO_EC_IOC_BASE + (slot << 12);
  693. #ifdef IO_EC_IOC4_BASE
  694. else
  695. address = IO_EC_IOC4_BASE + ((slot - 4) << 12);
  696. #endif
  697. if (address)
  698. address +=  speed << 17;
  699. break;
  700. #ifdef IO_EC_EASI_BASE
  701. case ECARD_EASI:
  702. address = IO_EC_EASI_BASE + (slot << 22);
  703. if (speed == ECARD_FAST)
  704. ectcr |= 1 << slot;
  705. break;
  706. #endif
  707. default:
  708. break;
  709. }
  710. #ifdef IOMD_ECTCR
  711. iomd_writeb(ectcr, IOMD_ECTCR);
  712. #endif
  713. return address;
  714. }
  715. static int ecard_prints(char *buffer, ecard_t *ec)
  716. {
  717. char *start = buffer;
  718. buffer += sprintf(buffer, "  %d: %s ", ec->slot_no,
  719.   ec->type == ECARD_EASI ? "EASI" : "    ");
  720. if (ec->cid.id == 0) {
  721. struct in_chunk_dir incd;
  722. buffer += sprintf(buffer, "[%04X:%04X] ",
  723. ec->cid.manufacturer, ec->cid.product);
  724. if (!ec->card_desc && ec->cid.cd &&
  725.     ecard_readchunk(&incd, ec, 0xf5, 0)) {
  726. ec->card_desc = kmalloc(strlen(incd.d.string)+1, GFP_KERNEL);
  727. if (ec->card_desc)
  728. strcpy((char *)ec->card_desc, incd.d.string);
  729. }
  730. buffer += sprintf(buffer, "%sn", ec->card_desc ? ec->card_desc : "*unknown*");
  731. } else
  732. buffer += sprintf(buffer, "Simple card %dn", ec->cid.id);
  733. return buffer - start;
  734. }
  735. static int get_ecard_dev_info(char *buf, char **start, off_t pos, int count)
  736. {
  737. ecard_t *ec = cards;
  738. off_t at = 0;
  739. int len, cnt;
  740. cnt = 0;
  741. while (ec && count > cnt) {
  742. len = ecard_prints(buf, ec);
  743. at += len;
  744. if (at >= pos) {
  745. if (!*start) {
  746. *start = buf + (pos - (at - len));
  747. cnt = at - pos;
  748. } else
  749. cnt += len;
  750. buf += len;
  751. }
  752. ec = ec->next;
  753. }
  754. return (count > cnt) ? cnt : count;
  755. }
  756. static struct proc_dir_entry *proc_bus_ecard_dir = NULL;
  757. static void ecard_proc_init(void)
  758. {
  759. proc_bus_ecard_dir = proc_mkdir("ecard", proc_bus);
  760. create_proc_info_entry("devices", 0, proc_bus_ecard_dir,
  761. get_ecard_dev_info);
  762. }
  763. /*
  764.  * Probe for an expansion card.
  765.  *
  766.  * If bit 1 of the first byte of the card is set, then the
  767.  * card does not exist.
  768.  */
  769. static int __init
  770. ecard_probe(int slot, card_type_t type)
  771. {
  772. ecard_t **ecp;
  773. ecard_t *ec;
  774. struct ex_ecid cid;
  775. int i, rc = -ENOMEM;
  776. ec = kmalloc(sizeof(ecard_t), GFP_KERNEL);
  777. if (!ec)
  778. goto nomem;
  779. memset(ec, 0, sizeof(ecard_t));
  780. ec->slot_no = slot;
  781. ec->type = type;
  782. ec->irq = NO_IRQ;
  783. ec->fiq = NO_IRQ;
  784. ec->dma = NO_DMA;
  785. ec->card_desc = NULL;
  786. ec->ops = &ecard_default_ops;
  787. rc = -ENODEV;
  788. if ((ec->podaddr = ecard_address(ec, type, ECARD_SYNC)) == 0)
  789. goto nodev;
  790. cid.r_zero = 1;
  791. ecard_readbytes(&cid, ec, 0, 16, 0);
  792. if (cid.r_zero)
  793. goto nodev;
  794. ec->cid.id = cid.r_id;
  795. ec->cid.cd = cid.r_cd;
  796. ec->cid.is = cid.r_is;
  797. ec->cid.w = cid.r_w;
  798. ec->cid.manufacturer = ecard_getu16(cid.r_manu);
  799. ec->cid.product = ecard_getu16(cid.r_prod);
  800. ec->cid.country = cid.r_country;
  801. ec->cid.irqmask = cid.r_irqmask;
  802. ec->cid.irqoff  = ecard_gets24(cid.r_irqoff);
  803. ec->cid.fiqmask = cid.r_fiqmask;
  804. ec->cid.fiqoff  = ecard_gets24(cid.r_fiqoff);
  805. ec->fiqaddr =
  806. ec->irqaddr = (unsigned char *)ioaddr(ec->podaddr);
  807. if (ec->cid.is) {
  808. ec->irqmask = ec->cid.irqmask;
  809. ec->irqaddr += ec->cid.irqoff;
  810. ec->fiqmask = ec->cid.fiqmask;
  811. ec->fiqaddr += ec->cid.fiqoff;
  812. } else {
  813. ec->irqmask = 1;
  814. ec->fiqmask = 4;
  815. }
  816. for (i = 0; i < sizeof(blacklist) / sizeof(*blacklist); i++)
  817. if (blacklist[i].manufacturer == ec->cid.manufacturer &&
  818.     blacklist[i].product == ec->cid.product) {
  819. ec->card_desc = blacklist[i].type;
  820. break;
  821. }
  822. ec->irq = 32 + slot;
  823. #ifdef IO_EC_MEMC8_BASE
  824. if (slot == 8)
  825. ec->irq = 11;
  826. #endif
  827. /*
  828.  * hook the interrupt handlers
  829.  */
  830. if (ec->irq != 0 && ec->irq >= 32) {
  831. irq_desc[ec->irq].mask_ack = ecard_disableirq;
  832. irq_desc[ec->irq].mask     = ecard_disableirq;
  833. irq_desc[ec->irq].unmask   = ecard_enableirq;
  834. irq_desc[ec->irq].valid    = 1;
  835. }
  836. #ifdef CONFIG_ARCH_RPC
  837. /* On RiscPC, only first two slots have DMA capability */
  838. if (slot < 2)
  839. ec->dma = 2 + slot;
  840. #endif
  841. for (ecp = &cards; *ecp; ecp = &(*ecp)->next);
  842. *ecp = ec;
  843. slot_to_expcard[slot] = ec;
  844. return 0;
  845. nodev:
  846. kfree(ec);
  847. nomem:
  848. return rc;
  849. }
  850. static ecard_t *finding_pos;
  851. void ecard_startfind(void)
  852. {
  853. finding_pos = NULL;
  854. }
  855. ecard_t *ecard_find(int cid, const card_ids *cids)
  856. {
  857. if (!finding_pos)
  858. finding_pos = cards;
  859. else
  860. finding_pos = finding_pos->next;
  861. for (; finding_pos; finding_pos = finding_pos->next) {
  862. if (finding_pos->claimed)
  863. continue;
  864. if (!cids) {
  865. if ((finding_pos->cid.id ^ cid) == 0)
  866. break;
  867. } else {
  868. unsigned int manufacturer, product;
  869. int i;
  870. manufacturer = finding_pos->cid.manufacturer;
  871. product = finding_pos->cid.product;
  872. for (i = 0; cids[i].manufacturer != 65535; i++)
  873. if (manufacturer == cids[i].manufacturer &&
  874.     product == cids[i].product)
  875. break;
  876. if (cids[i].manufacturer != 65535)
  877. break;
  878. }
  879. }
  880. return finding_pos;
  881. }
  882. static void __init ecard_free_all(void)
  883. {
  884. ecard_t *ec, *ecn;
  885. for (ec = cards; ec; ec = ecn) {
  886. ecn = ec->next;
  887. kfree(ec);
  888. }
  889. cards = NULL;
  890. memset(slot_to_expcard, 0, sizeof(slot_to_expcard));
  891. }
  892. /*
  893.  * Initialise the expansion card system.
  894.  * Locate all hardware - interrupt management and
  895.  * actual cards.
  896.  */
  897. void __init ecard_init(void)
  898. {
  899. int slot;
  900. /*
  901.  * Register our reboot notifier
  902.  */
  903. register_reboot_notifier(&ecard_reboot_notifier);
  904. #ifdef CONFIG_CPU_32
  905. init_waitqueue_head(&ecard_wait);
  906. #endif
  907. printk("Probing expansion cardsn");
  908. for (slot = 0; slot < 8; slot ++) {
  909. if (ecard_probe(slot, ECARD_EASI) == -ENODEV)
  910. ecard_probe(slot, ECARD_IOC);
  911. }
  912. #ifdef IO_EC_MEMC8_BASE
  913. ecard_probe(8, ECARD_IOC);
  914. #endif
  915. ecard_probeirqhw();
  916. if (setup_arm_irq(IRQ_EXPANSIONCARD, &irqexpansioncard)) {
  917. printk(KERN_ERR "Unable to claim IRQ%d for expansion cardsn",
  918.        IRQ_EXPANSIONCARD);
  919. ecard_free_all();
  920. }
  921. ecard_proc_init();
  922. }
  923. EXPORT_SYMBOL(ecard_startfind);
  924. EXPORT_SYMBOL(ecard_find);
  925. EXPORT_SYMBOL(ecard_readchunk);
  926. EXPORT_SYMBOL(ecard_address);