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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * video1394.c - video driver for OHCI 1394 boards
  3.  * Copyright (C)1999,2000 Sebastien Rougeaux <sebastien.rougeaux@anu.edu.au>
  4.  *                        Peter Schlaile <udbz@rz.uni-karlsruhe.de>
  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 as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software Foundation,
  18.  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  19.  */
  20. #include <linux/config.h>
  21. #include <linux/kernel.h>
  22. #include <linux/list.h>
  23. #include <linux/slab.h>
  24. #include <linux/interrupt.h>
  25. #include <linux/wait.h>
  26. #include <linux/errno.h>
  27. #include <linux/module.h>
  28. #include <linux/init.h>
  29. #include <linux/pci.h>
  30. #include <linux/fs.h>
  31. #include <linux/poll.h>
  32. #include <linux/smp_lock.h>
  33. #include <asm/byteorder.h>
  34. #include <asm/atomic.h>
  35. #include <asm/io.h>
  36. #include <asm/uaccess.h>
  37. #include <linux/proc_fs.h>
  38. #include <linux/tqueue.h>
  39. #include <linux/delay.h>
  40. #include <linux/devfs_fs_kernel.h>
  41. #include <asm/pgtable.h>
  42. #include <asm/page.h>
  43. #include <linux/sched.h>
  44. #include <asm/segment.h>
  45. #include <linux/types.h>
  46. #include <linux/wrapper.h>
  47. #include <linux/vmalloc.h>
  48. #include <linux/timex.h>
  49. #include <linux/mm.h>
  50. #include "ieee1394.h"
  51. #include "ieee1394_types.h"
  52. #include "hosts.h"
  53. #include "ieee1394_core.h"
  54. #include "highlevel.h"
  55. #include "video1394.h"
  56. #include "ohci1394.h"
  57. #define VIDEO1394_MAJOR 172
  58. #define ISO_CHANNELS 64
  59. #define ISO_RECEIVE 0
  60. #define ISO_TRANSMIT 1
  61. #ifndef virt_to_page
  62. #define virt_to_page(x) MAP_NR(x)
  63. #endif
  64. #ifndef vmalloc_32
  65. #define vmalloc_32(x) vmalloc(x)
  66. #endif
  67. struct it_dma_prg {
  68. struct dma_cmd begin;
  69. quadlet_t data[4];
  70. struct dma_cmd end;
  71. quadlet_t pad[4]; /* FIXME: quick hack for memory alignment */
  72. };
  73. struct dma_iso_ctx {
  74. struct ti_ohci *ohci;
  75. int ctx;
  76. int channel;
  77. int last_buffer;
  78. int * next_buffer;  /* For ISO Transmit of video packets
  79.        to write the correct SYT field
  80.        into the next block */
  81. unsigned int num_desc;
  82. unsigned int buf_size;
  83. unsigned int frame_size;
  84. unsigned int packet_size;
  85. unsigned int left_size;
  86. unsigned int nb_cmd;
  87. unsigned char *buf;
  88.         struct dma_cmd **ir_prg;
  89. struct it_dma_prg **it_prg;
  90. unsigned int *buffer_status;
  91.         struct timeval *buffer_time; /* time when the buffer was received */
  92. unsigned int *last_used_cmd; /* For ISO Transmit with 
  93. variable sized packets only ! */
  94. int ctrlClear;
  95. int ctrlSet;
  96. int cmdPtr;
  97. int ctxMatch;
  98. wait_queue_head_t waitq;
  99. spinlock_t lock;
  100. unsigned int syt_offset;
  101. int flags;
  102. };
  103. struct video_card {
  104. struct ti_ohci *ohci;
  105. struct list_head list;
  106. int id;
  107. devfs_handle_t devfs;
  108. struct dma_iso_ctx **ir_context;
  109. struct dma_iso_ctx **it_context;
  110. struct dma_iso_ctx *current_ctx;
  111. };
  112. #ifdef CONFIG_IEEE1394_VERBOSEDEBUG
  113. #define VIDEO1394_DEBUG
  114. #endif
  115. #ifdef DBGMSG
  116. #undef DBGMSG
  117. #endif
  118. #ifdef VIDEO1394_DEBUG
  119. #define DBGMSG(card, fmt, args...) 
  120. printk(KERN_INFO "video1394_%d: " fmt "n" , card , ## args)
  121. #else
  122. #define DBGMSG(card, fmt, args...)
  123. #endif
  124. /* print general (card independent) information */
  125. #define PRINT_G(level, fmt, args...) 
  126. printk(level "video1394: " fmt "n" , ## args)
  127. /* print card specific information */
  128. #define PRINT(level, card, fmt, args...) 
  129. printk(level "video1394_%d: " fmt "n" , card , ## args)
  130. static void irq_handler(int card, quadlet_t isoRecvIntEvent, 
  131.  quadlet_t isoXmitIntEvent);
  132. static LIST_HEAD(video1394_cards);
  133. static spinlock_t video1394_cards_lock = SPIN_LOCK_UNLOCKED;
  134. static devfs_handle_t devfs_handle;
  135. static struct hpsb_highlevel *hl_handle = NULL;
  136. static struct video_template video_tmpl = { irq_handler };
  137. /* Code taken from bttv.c */
  138. /*******************************/
  139. /* Memory management functions */
  140. /*******************************/
  141. #define MDEBUG(x) do { } while(0) /* Debug memory management */
  142. /* [DaveM] I've recoded most of this so that:
  143.  * 1) It's easier to tell what is happening
  144.  * 2) It's more portable, especially for translating things
  145.  *    out of vmalloc mapped areas in the kernel.
  146.  * 3) Less unnecessary translations happen.
  147.  *
  148.  * The code used to assume that the kernel vmalloc mappings
  149.  * existed in the page tables of every process, this is simply
  150.  * not guaranteed.  We now use pgd_offset_k which is the
  151.  * defined way to get at the kernel page tables.
  152.  */
  153. /* Given PGD from the address space's page table, return the kernel
  154.  * virtual mapping of the physical memory mapped at ADR.
  155.  */
  156. static inline unsigned long uvirt_to_kva(pgd_t *pgd, unsigned long adr)
  157. {
  158.         unsigned long ret = 0UL;
  159. pmd_t *pmd;
  160. pte_t *ptep, pte;
  161.   
  162. if (!pgd_none(*pgd)) {
  163.                 pmd = pmd_offset(pgd, adr);
  164.                 if (!pmd_none(*pmd)) {
  165.                         ptep = pte_offset(pmd, adr);
  166.                         pte = *ptep;
  167.                         if(pte_present(pte)) {
  168. ret = (unsigned long) 
  169. page_address(pte_page(pte));
  170.                                 ret |= (adr & (PAGE_SIZE - 1));
  171. }
  172.                 }
  173.         }
  174.         MDEBUG(printk("uv2kva(%lx-->%lx)", adr, ret));
  175. return ret;
  176. }
  177. static inline unsigned long uvirt_to_bus(unsigned long adr) 
  178. {
  179.         unsigned long kva, ret;
  180.         kva = uvirt_to_kva(pgd_offset(current->mm, adr), adr);
  181. ret = virt_to_bus((void *)kva);
  182.         MDEBUG(printk("uv2b(%lx-->%lx)", adr, ret));
  183.         return ret;
  184. }
  185. static inline unsigned long kvirt_to_bus(unsigned long adr) 
  186. {
  187.         unsigned long va, kva, ret;
  188.         va = VMALLOC_VMADDR(adr);
  189.         kva = uvirt_to_kva(pgd_offset_k(va), va);
  190. ret = virt_to_bus((void *)kva);
  191.         MDEBUG(printk("kv2b(%lx-->%lx)", adr, ret));
  192.         return ret;
  193. }
  194. /* Here we want the physical address of the memory.
  195.  * This is used when initializing the contents of the
  196.  * area and marking the pages as reserved.
  197.  */
  198. static inline unsigned long kvirt_to_pa(unsigned long adr) 
  199. {
  200.         unsigned long va, kva, ret;
  201.         va = VMALLOC_VMADDR(adr);
  202.         kva = uvirt_to_kva(pgd_offset_k(va), va);
  203. ret = __pa(kva);
  204.         MDEBUG(printk("kv2pa(%lx-->%lx)", adr, ret));
  205.         return ret;
  206. }
  207. static void * rvmalloc(unsigned long size)
  208. {
  209. void * mem;
  210. unsigned long adr, page;
  211.         
  212. mem=vmalloc_32(size);
  213. if (mem) 
  214. {
  215. memset(mem, 0, size); /* Clear the ram out, 
  216.  no junk to the user */
  217.         adr=(unsigned long) mem;
  218. while (size > 0) 
  219.                 {
  220.                 page = kvirt_to_pa(adr);
  221. mem_map_reserve(virt_to_page(__va(page)));
  222. adr+=PAGE_SIZE;
  223. size-=PAGE_SIZE;
  224. }
  225. }
  226. return mem;
  227. }
  228. static void rvfree(void * mem, unsigned long size)
  229. {
  230.         unsigned long adr, page;
  231.         
  232. if (mem) 
  233. {
  234.         adr=(unsigned long) mem;
  235. while (size > 0) 
  236.                 {
  237.                 page = kvirt_to_pa(adr);
  238. mem_map_unreserve(virt_to_page(__va(page)));
  239. adr+=PAGE_SIZE;
  240. size-=PAGE_SIZE;
  241. }
  242. vfree(mem);
  243. }
  244. }
  245. /* End of code taken from bttv.c */
  246. static int free_dma_iso_ctx(struct dma_iso_ctx **d)
  247. {
  248. int i;
  249. struct ti_ohci *ohci;
  250. if ((*d)==NULL) return -1;
  251. ohci = (struct ti_ohci *)(*d)->ohci;
  252. DBGMSG(ohci->id, "Freeing dma_iso_ctx %d", (*d)->ctx);
  253. ohci1394_stop_context(ohci, (*d)->ctrlClear, NULL);
  254. if ((*d)->buf) rvfree((void *)(*d)->buf, 
  255.       (*d)->num_desc * (*d)->buf_size);
  256. if ((*d)->ir_prg) {
  257. for (i=0;i<(*d)->num_desc;i++) 
  258. if ((*d)->ir_prg[i]) kfree((*d)->ir_prg[i]);
  259. kfree((*d)->ir_prg);
  260. }
  261. if ((*d)->it_prg) {
  262. for (i=0;i<(*d)->num_desc;i++) 
  263. if ((*d)->it_prg[i]) kfree((*d)->it_prg[i]);
  264. kfree((*d)->it_prg);
  265. }
  266. if ((*d)->buffer_status)
  267. kfree((*d)->buffer_status);
  268. if ((*d)->buffer_time)
  269. kfree((*d)->buffer_time);
  270. if ((*d)->last_used_cmd)
  271. kfree((*d)->last_used_cmd);
  272. if ((*d)->next_buffer)
  273. kfree((*d)->next_buffer);
  274. kfree(*d);
  275. *d = NULL;
  276. return 0;
  277. }
  278. static struct dma_iso_ctx *
  279. alloc_dma_iso_ctx(struct ti_ohci *ohci, int type, int ctx, int num_desc,
  280.   int buf_size, int channel, unsigned int packet_size)
  281. {
  282. struct dma_iso_ctx *d=NULL;
  283. int i;
  284. d = (struct dma_iso_ctx *)kmalloc(sizeof(struct dma_iso_ctx), 
  285.   GFP_KERNEL);
  286. if (d==NULL) {
  287. PRINT(KERN_ERR, ohci->id, "Failed to allocate dma_iso_ctx");
  288. return NULL;
  289. }
  290. memset(d, 0, sizeof(struct dma_iso_ctx));
  291. d->ohci = (void *)ohci;
  292. d->ctx = ctx;
  293. d->channel = channel;
  294. d->num_desc = num_desc;
  295. d->frame_size = buf_size;
  296. if (buf_size%PAGE_SIZE) 
  297. d->buf_size = buf_size + PAGE_SIZE - (buf_size%PAGE_SIZE);
  298. else
  299. d->buf_size = buf_size;
  300. d->last_buffer = -1;
  301. d->buf = NULL;
  302. d->ir_prg = NULL;
  303. init_waitqueue_head(&d->waitq);
  304. d->buf = rvmalloc(d->num_desc * d->buf_size);
  305. if (d->buf == NULL) {
  306. PRINT(KERN_ERR, ohci->id, "Failed to allocate dma buffer");
  307. free_dma_iso_ctx(&d);
  308. return NULL;
  309. }
  310. memset(d->buf, 0, d->num_desc * d->buf_size);
  311. if (type == ISO_RECEIVE) {
  312. d->ctrlSet = OHCI1394_IsoRcvContextControlSet+32*d->ctx;
  313. d->ctrlClear = OHCI1394_IsoRcvContextControlClear+32*d->ctx;
  314. d->cmdPtr = OHCI1394_IsoRcvCommandPtr+32*d->ctx;
  315. d->ctxMatch = OHCI1394_IsoRcvContextMatch+32*d->ctx;
  316. d->ir_prg = kmalloc(d->num_desc * sizeof(struct dma_cmd *), 
  317.     GFP_KERNEL);
  318. if (d->ir_prg == NULL) {
  319. PRINT(KERN_ERR, ohci->id, 
  320.       "Failed to allocate dma ir prg");
  321. free_dma_iso_ctx(&d);
  322. return NULL;
  323. }
  324. memset(d->ir_prg, 0, d->num_desc * sizeof(struct dma_cmd *));
  325. d->nb_cmd = d->buf_size / PAGE_SIZE + 1;
  326. d->left_size = (d->frame_size % PAGE_SIZE) ?
  327. d->frame_size % PAGE_SIZE : PAGE_SIZE;
  328. for (i=0;i<d->num_desc;i++) {
  329. d->ir_prg[i] = kmalloc(d->nb_cmd * 
  330.        sizeof(struct dma_cmd), 
  331.        GFP_KERNEL);
  332. if (d->ir_prg[i] == NULL) {
  333. PRINT(KERN_ERR, ohci->id, 
  334.       "Failed to allocate dma ir prg");
  335. free_dma_iso_ctx(&d);
  336. return NULL;
  337. }
  338. }
  339. }
  340. else {  /* ISO_TRANSMIT */
  341. d->ctrlSet = OHCI1394_IsoXmitContextControlSet+16*d->ctx;
  342. d->ctrlClear = OHCI1394_IsoXmitContextControlClear+16*d->ctx;
  343. d->cmdPtr = OHCI1394_IsoXmitCommandPtr+16*d->ctx;
  344. d->it_prg = kmalloc(d->num_desc * sizeof(struct it_dma_prg *), 
  345.     GFP_KERNEL);
  346. if (d->it_prg == NULL) {
  347. PRINT(KERN_ERR, ohci->id, 
  348.       "Failed to allocate dma it prg");
  349. free_dma_iso_ctx(&d);
  350. return NULL;
  351. }
  352. memset(d->it_prg, 0, d->num_desc*sizeof(struct it_dma_prg *));
  353. d->packet_size = packet_size;
  354. if (PAGE_SIZE % packet_size || packet_size>4096) {
  355. PRINT(KERN_ERR, ohci->id, 
  356.       "Packet size %d (page_size: %ld) "
  357.       "not yet supportedn",
  358.       packet_size, PAGE_SIZE);
  359. free_dma_iso_ctx(&d);
  360. return NULL;
  361. }
  362. d->nb_cmd = d->frame_size / d->packet_size;
  363. if (d->frame_size % d->packet_size) {
  364. d->nb_cmd++;
  365. d->left_size = d->frame_size % d->packet_size;
  366. }
  367. else
  368. d->left_size = d->packet_size;
  369. for (i=0;i<d->num_desc;i++) {
  370. d->it_prg[i] = kmalloc(d->nb_cmd * 
  371.        sizeof(struct it_dma_prg), 
  372.        GFP_KERNEL);
  373. if (d->it_prg[i] == NULL) {
  374. PRINT(KERN_ERR, ohci->id, 
  375.       "Failed to allocate dma it prg");
  376. free_dma_iso_ctx(&d);
  377. return NULL;
  378. }
  379. }
  380. }
  381. d->buffer_status = kmalloc(d->num_desc * sizeof(unsigned int),
  382.    GFP_KERNEL);
  383. d->buffer_time = kmalloc(d->num_desc * sizeof(struct timeval),
  384.    GFP_KERNEL);
  385. d->last_used_cmd = kmalloc(d->num_desc * sizeof(unsigned int),
  386.    GFP_KERNEL);
  387. d->next_buffer = kmalloc(d->num_desc * sizeof(int),
  388.  GFP_KERNEL);
  389. if (d->buffer_status == NULL) {
  390. PRINT(KERN_ERR, ohci->id, "Failed to allocate buffer_status");
  391. free_dma_iso_ctx(&d);
  392. return NULL;
  393. }
  394. if (d->buffer_time == NULL) {
  395. PRINT(KERN_ERR, ohci->id, "Failed to allocate buffer_time");
  396. free_dma_iso_ctx(&d);
  397. return NULL;
  398. }
  399. if (d->last_used_cmd == NULL) {
  400. PRINT(KERN_ERR, ohci->id, "Failed to allocate last_used_cmd");
  401. free_dma_iso_ctx(&d);
  402. return NULL;
  403. }
  404. if (d->next_buffer == NULL) {
  405. PRINT(KERN_ERR, ohci->id, "Failed to allocate next_buffer");
  406. free_dma_iso_ctx(&d);
  407. return NULL;
  408. }
  409. memset(d->buffer_status, 0, d->num_desc * sizeof(unsigned int));
  410. memset(d->buffer_time, 0, d->num_desc * sizeof(struct timeval));
  411. memset(d->last_used_cmd, 0, d->num_desc * sizeof(unsigned int));
  412. memset(d->next_buffer, -1, d->num_desc * sizeof(int));
  413.         spin_lock_init(&d->lock);
  414. PRINT(KERN_INFO, ohci->id, "Iso %s DMA: %d buffers "
  415.       "of size %d allocated for a frame size %d, each with %d prgs",
  416.       (type==ISO_RECEIVE) ? "receive" : "transmit",
  417.       d->num_desc, d->buf_size, d->frame_size, d->nb_cmd);
  418. return d;
  419. }
  420. static void reset_ir_status(struct dma_iso_ctx *d, int n)
  421. {
  422. int i;
  423. d->ir_prg[n][0].status = 4;
  424. d->ir_prg[n][1].status = PAGE_SIZE-4;
  425. for (i=2;i<d->nb_cmd-1;i++)
  426. d->ir_prg[n][i].status = PAGE_SIZE;
  427. d->ir_prg[n][i].status = d->left_size;
  428. }
  429. static void initialize_dma_ir_prg(struct dma_iso_ctx *d, int n, int flags)
  430. {
  431. struct dma_cmd *ir_prg = d->ir_prg[n];
  432. unsigned long buf = (unsigned long)d->buf+n*d->buf_size;
  433. int i;
  434. /* the first descriptor will read only 4 bytes */
  435. ir_prg[0].control = DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE |
  436. DMA_CTL_BRANCH | 4;
  437. /* set the sync flag */
  438. if (flags & VIDEO1394_SYNC_FRAMES)
  439. ir_prg[0].control |= DMA_CTL_WAIT;
  440. ir_prg[0].address = kvirt_to_bus(buf);
  441. ir_prg[0].branchAddress =  (virt_to_bus(&(ir_prg[1].control)) 
  442.     & 0xfffffff0) | 0x1;
  443. /* the second descriptor will read PAGE_SIZE-4 bytes */
  444. ir_prg[1].control = DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE |
  445. DMA_CTL_BRANCH | (PAGE_SIZE-4);
  446. ir_prg[1].address = kvirt_to_bus(buf+4);
  447. ir_prg[1].branchAddress =  (virt_to_bus(&(ir_prg[2].control)) 
  448.     & 0xfffffff0) | 0x1;
  449. for (i=2;i<d->nb_cmd-1;i++) {
  450. ir_prg[i].control = DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE | 
  451. DMA_CTL_BRANCH | PAGE_SIZE;
  452. ir_prg[i].address = kvirt_to_bus(buf+(i-1)*PAGE_SIZE);
  453. ir_prg[i].branchAddress =  
  454. (virt_to_bus(&(ir_prg[i+1].control)) 
  455.  & 0xfffffff0) | 0x1;
  456. }
  457. /* the last descriptor will generate an interrupt */
  458. ir_prg[i].control = DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE | 
  459. DMA_CTL_IRQ | DMA_CTL_BRANCH | d->left_size;
  460. ir_prg[i].address = kvirt_to_bus(buf+(i-1)*PAGE_SIZE);
  461. }
  462. static void initialize_dma_ir_ctx(struct dma_iso_ctx *d, int tag, int flags)
  463. {
  464. struct ti_ohci *ohci = (struct ti_ohci *)d->ohci;
  465. int i;
  466. d->flags = flags;
  467. ohci1394_stop_context(ohci, d->ctrlClear, NULL);
  468. for (i=0;i<d->num_desc;i++) {
  469. initialize_dma_ir_prg(d, i, flags);
  470. reset_ir_status(d, i);
  471. }
  472. /* reset the ctrl register */
  473. reg_write(ohci, d->ctrlClear, 0xf0000000);
  474. /* Set bufferFill */
  475. reg_write(ohci, d->ctrlSet, 0x80000000);
  476. /* Set isoch header */
  477. if (flags & VIDEO1394_INCLUDE_ISO_HEADERS) 
  478. reg_write(ohci, d->ctrlSet, 0x40000000);
  479. /* Set the context match register to match on all tags, 
  480.    sync for sync tag, and listen to d->channel */
  481. reg_write(ohci, d->ctxMatch, 0xf0000000|((tag&0xf)<<8)|d->channel);
  482. /* Set up isoRecvIntMask to generate interrupts */
  483. reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, 1<<d->ctx);
  484. }
  485. /* find which context is listening to this channel */
  486. int ir_ctx_listening(struct video_card *video, int channel)
  487. {
  488. int i;
  489. struct ti_ohci *ohci = video->ohci;
  490. for (i=0;i<ohci->nb_iso_rcv_ctx-1;i++) 
  491. if (video->ir_context[i]) {
  492. if (video->ir_context[i]->channel==channel)
  493. return i;
  494. }
  495. PRINT(KERN_ERR, ohci->id, "No iso context is listening to channel %d",
  496.       channel);
  497. return -1;
  498. }
  499. int it_ctx_talking(struct video_card *video, int channel)
  500. {
  501. int i;
  502. struct ti_ohci *ohci = video->ohci;
  503. for (i=0;i<ohci->nb_iso_xmit_ctx;i++) 
  504. if (video->it_context[i]) {
  505. if (video->it_context[i]->channel==channel)
  506. return i;
  507. }
  508. PRINT(KERN_ERR, ohci->id, "No iso context is talking to channel %d",
  509.       channel);
  510. return -1;
  511. }
  512. int wakeup_dma_ir_ctx(struct ti_ohci *ohci, struct dma_iso_ctx *d) 
  513. {
  514. int i;
  515. if (d==NULL) {
  516. PRINT(KERN_ERR, ohci->id, "Iso receive event received but "
  517.       "context not allocated");
  518. return -EFAULT;
  519. }
  520. spin_lock(&d->lock);
  521. for (i=0;i<d->num_desc;i++) {
  522. if (d->ir_prg[i][d->nb_cmd-1].status & 0xFFFF0000) {
  523. reset_ir_status(d, i);
  524. d->buffer_status[i] = VIDEO1394_BUFFER_READY;
  525. do_gettimeofday(&d->buffer_time[i]);
  526. }
  527. }
  528. spin_unlock(&d->lock);
  529. if (waitqueue_active(&d->waitq)) wake_up_interruptible(&d->waitq);
  530. return 0;
  531. }
  532. static inline void put_timestamp(struct ti_ohci *ohci, struct dma_iso_ctx * d,
  533.  int n)
  534. {
  535. unsigned char* buf = d->buf + n * d->buf_size;
  536. u32 cycleTimer;
  537. u32 timeStamp;
  538. if (n == -1) {
  539.   return;
  540. }
  541. cycleTimer = reg_read(ohci, OHCI1394_IsochronousCycleTimer);
  542. timeStamp = ((cycleTimer & 0x0fff) + d->syt_offset); /* 11059 = 450 us */
  543. timeStamp = (timeStamp % 3072 + ((timeStamp / 3072) << 12)
  544. + (cycleTimer & 0xf000)) & 0xffff;
  545. buf[6] = timeStamp >> 8; 
  546. buf[7] = timeStamp & 0xff; 
  547.     /* if first packet is empty packet, then put timestamp into the next full one too */
  548.     if ( (d->it_prg[n][0].data[1] >>16) == 0x008) {
  549.         buf += d->packet_size;
  550.      buf[6] = timeStamp >> 8;
  551.     buf[7] = timeStamp & 0xff;
  552. }
  553.     /* do the next buffer frame too in case of irq latency */
  554. n = d->next_buffer[n];
  555. if (n == -1) {
  556.   return;
  557. }
  558. buf = d->buf + n * d->buf_size;
  559. timeStamp += (d->last_used_cmd[n] << 12) & 0xffff;
  560. buf[6] = timeStamp >> 8;
  561. buf[7] = timeStamp & 0xff;
  562.     /* if first packet is empty packet, then put timestamp into the next full one too */
  563.     if ( (d->it_prg[n][0].data[1] >>16) == 0x008) {
  564.         buf += d->packet_size;
  565.      buf[6] = timeStamp >> 8;
  566.     buf[7] = timeStamp & 0xff;
  567. }
  568. #if 0
  569. printk("curr: %d, next: %d, cycleTimer: %08x timeStamp: %08xn",
  570.        curr, n, cycleTimer, timeStamp);
  571. #endif
  572. }
  573. int wakeup_dma_it_ctx(struct ti_ohci *ohci, struct dma_iso_ctx *d) 
  574. {
  575. int i;
  576. if (d==NULL) {
  577. PRINT(KERN_ERR, ohci->id, "Iso transmit event received but "
  578.       "context not allocated");
  579. return -EFAULT;
  580. }
  581. spin_lock(&d->lock);
  582. for (i=0;i<d->num_desc;i++) {
  583. if (d->it_prg[i][d->last_used_cmd[i]].end.status& 0xFFFF0000) {
  584. int next = d->next_buffer[i];
  585. put_timestamp(ohci, d, next);
  586. d->it_prg[i][d->last_used_cmd[i]].end.status = 0;
  587. d->buffer_status[i] = VIDEO1394_BUFFER_READY;
  588. }
  589. }
  590. spin_unlock(&d->lock);
  591. if (waitqueue_active(&d->waitq)) wake_up_interruptible(&d->waitq);
  592. return 0;
  593. }
  594. static void initialize_dma_it_prg(struct dma_iso_ctx *d, int n, int sync_tag)
  595. {
  596. struct it_dma_prg *it_prg = d->it_prg[n];
  597. unsigned long buf = (unsigned long)d->buf+n*d->buf_size;
  598. int i;
  599. d->last_used_cmd[n] = d->nb_cmd - 1;
  600. for (i=0;i<d->nb_cmd;i++) {
  601.  
  602. it_prg[i].begin.control = DMA_CTL_OUTPUT_MORE |
  603. DMA_CTL_IMMEDIATE | 8 ;
  604. it_prg[i].begin.address = 0;
  605. it_prg[i].begin.status = 0;
  606. it_prg[i].data[0] = 
  607. (SPEED_100 << 16) 
  608. | (/* tag */ 1 << 14)
  609. | (d->channel << 8) 
  610. | (TCODE_ISO_DATA << 4);
  611. if (i==0) it_prg[i].data[0] |= sync_tag;
  612. it_prg[i].data[1] = d->packet_size << 16;
  613. it_prg[i].data[2] = 0;
  614. it_prg[i].data[3] = 0;
  615. it_prg[i].end.control = DMA_CTL_OUTPUT_LAST | DMA_CTL_BRANCH;
  616. it_prg[i].end.address =
  617. kvirt_to_bus(buf+i*d->packet_size);
  618. if (i<d->nb_cmd-1) {
  619. it_prg[i].end.control |= d->packet_size;
  620. it_prg[i].begin.branchAddress = 
  621. (virt_to_bus(&(it_prg[i+1].begin.control)) 
  622.  & 0xfffffff0) | 0x3;
  623. it_prg[i].end.branchAddress = 
  624. (virt_to_bus(&(it_prg[i+1].begin.control)) 
  625.  & 0xfffffff0) | 0x3;
  626. }
  627. else {
  628. /* the last prg generates an interrupt */
  629. it_prg[i].end.control |= DMA_CTL_UPDATE | 
  630. DMA_CTL_IRQ | d->left_size;
  631. /* the last prg doesn't branch */
  632. it_prg[i].begin.branchAddress = 0;
  633. it_prg[i].end.branchAddress = 0;
  634. }
  635. it_prg[i].end.status = 0;
  636. #if 0
  637. printk("%d:%d: %08x-%08x ctrl %08x brch %08x d0 %08x d1 %08xn",n,i,
  638.        virt_to_bus(&(it_prg[i].begin.control)),
  639.        virt_to_bus(&(it_prg[i].end.control)),
  640.        it_prg[i].end.control,
  641.        it_prg[i].end.branchAddress,
  642.        it_prg[i].data[0], it_prg[i].data[1]);
  643. #endif
  644. }
  645. }
  646. static void initialize_dma_it_prg_var_packet_queue(
  647. struct dma_iso_ctx *d, int n, unsigned int * packet_sizes,
  648. struct ti_ohci *ohci)
  649. {
  650. struct it_dma_prg *it_prg = d->it_prg[n];
  651. int i;
  652. #if 0
  653. if (n != -1) {
  654. put_timestamp(ohci, d, n);
  655. }
  656. #endif
  657. d->last_used_cmd[n] = d->nb_cmd - 1;
  658. for (i = 0; i < d->nb_cmd; i++) {
  659. unsigned int size;
  660. if (packet_sizes[i] > d->packet_size) {
  661. size = d->packet_size;
  662. } else {
  663. size = packet_sizes[i];
  664. }
  665. it_prg[i].data[1] = size << 16; 
  666. it_prg[i].end.control = DMA_CTL_OUTPUT_LAST | DMA_CTL_BRANCH;
  667. if (i < d->nb_cmd-1 && packet_sizes[i+1] != 0) {
  668. it_prg[i].end.control |= size;
  669. it_prg[i].begin.branchAddress = 
  670. (virt_to_bus(&(it_prg[i+1].begin.control)) 
  671.  & 0xfffffff0) | 0x3;
  672. it_prg[i].end.branchAddress = 
  673. (virt_to_bus(&(it_prg[i+1].begin.control)) 
  674.  & 0xfffffff0) | 0x3;
  675. } else {
  676. /* the last prg generates an interrupt */
  677. it_prg[i].end.control |= DMA_CTL_UPDATE | 
  678. DMA_CTL_IRQ | size;
  679. /* the last prg doesn't branch */
  680. it_prg[i].begin.branchAddress = 0;
  681. it_prg[i].end.branchAddress = 0;
  682. d->last_used_cmd[n] = i;
  683. break;
  684. }
  685. }
  686. }
  687. static void initialize_dma_it_ctx(struct dma_iso_ctx *d, int sync_tag,
  688.   unsigned int syt_offset, int flags)
  689. {
  690. struct ti_ohci *ohci = (struct ti_ohci *)d->ohci;
  691. int i;
  692. d->flags = flags;
  693. d->syt_offset = (syt_offset == 0 ? 11000 : syt_offset);
  694. ohci1394_stop_context(ohci, d->ctrlClear, NULL);
  695. for (i=0;i<d->num_desc;i++)
  696. initialize_dma_it_prg(d, i, sync_tag);
  697. /* Set up isoRecvIntMask to generate interrupts */
  698. reg_write(ohci, OHCI1394_IsoXmitIntMaskSet, 1<<d->ctx);
  699. }
  700. static int do_iso_mmap(struct ti_ohci *ohci, struct dma_iso_ctx *d, 
  701.        const char *adr, unsigned long size)
  702. {
  703.         unsigned long start=(unsigned long) adr;
  704.         unsigned long page,pos;
  705.         if (size>d->num_desc * d->buf_size) {
  706. PRINT(KERN_ERR, ohci->id, 
  707.       "iso context %d buf size is different from mmap size", 
  708.       d->ctx);
  709.                 return -EINVAL;
  710. }
  711.         if (!d->buf) {
  712. PRINT(KERN_ERR, ohci->id, 
  713.       "iso context %d is not allocated", d->ctx);
  714. return -EINVAL;
  715. }
  716.         pos=(unsigned long) d->buf;
  717.         while (size > 0) {
  718.                 page = kvirt_to_pa(pos);
  719.                 if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED))
  720.                         return -EAGAIN;
  721.                 start+=PAGE_SIZE;
  722.                 pos+=PAGE_SIZE;
  723.                 size-=PAGE_SIZE;
  724.         }
  725.         return 0;
  726. }
  727. static int video1394_ioctl(struct inode *inode, struct file *file,
  728.    unsigned int cmd, unsigned long arg)
  729. {
  730. struct video_card *video = NULL;
  731. struct ti_ohci *ohci = NULL;
  732. unsigned long flags;
  733. struct list_head *lh;
  734. spin_lock_irqsave(&video1394_cards_lock, flags);
  735. if (!list_empty(&video1394_cards)) {
  736. struct video_card *p;
  737. list_for_each(lh, &video1394_cards) {
  738. p = list_entry(lh, struct video_card, list);
  739. if (p->id == MINOR(inode->i_rdev)) {
  740. video = p;
  741. ohci = video->ohci;
  742. break;
  743. }
  744. }
  745. }
  746. spin_unlock_irqrestore(&video1394_cards_lock, flags);
  747. if (video == NULL) {
  748. PRINT_G(KERN_ERR, __FUNCTION__": Unknown video card for minor %d", MINOR(inode->i_rdev));
  749. return -EFAULT;
  750. }
  751. switch(cmd)
  752. {
  753. case VIDEO1394_LISTEN_CHANNEL:
  754. case VIDEO1394_TALK_CHANNEL:
  755. {
  756. struct video1394_mmap v;
  757. u64 mask;
  758. int i;
  759. if(copy_from_user(&v, (void *)arg, sizeof(v)))
  760. return -EFAULT;
  761. /* if channel < 0, find lowest available one */
  762. if (v.channel < 0) {
  763.     mask = (u64)0x1;
  764.     for (i=0; i<ISO_CHANNELS; i++) {
  765. if (!(ohci->ISO_channel_usage & mask)) {
  766.     v.channel = i;
  767.     PRINT(KERN_INFO, ohci->id, "Found free channel %dn", i);
  768.     break;
  769. }
  770. mask = mask << 1;
  771.     }
  772. }
  773.     
  774. if (v.channel<0 || v.channel>(ISO_CHANNELS-1)) {
  775. PRINT(KERN_ERR, ohci->id, 
  776.       "Iso channel %d out of bounds", v.channel);
  777. return -EFAULT;
  778. }
  779. mask = (u64)0x1<<v.channel;
  780. printk("mask: %08X%08X usage: %08X%08Xn",
  781.        (u32)(mask>>32),(u32)(mask&0xffffffff),
  782.        (u32)(ohci->ISO_channel_usage>>32),
  783.        (u32)(ohci->ISO_channel_usage&0xffffffff));
  784. if (ohci->ISO_channel_usage & mask) {
  785. PRINT(KERN_ERR, ohci->id, 
  786.       "Channel %d is already taken", v.channel);
  787. return -EFAULT;
  788. }
  789. ohci->ISO_channel_usage |= mask;
  790. if (v.buf_size<=0) {
  791. PRINT(KERN_ERR, ohci->id,
  792.       "Invalid %d length buffer requested",v.buf_size);
  793. return -EFAULT;
  794. }
  795. if (v.nb_buffers<=0) {
  796. PRINT(KERN_ERR, ohci->id,
  797.       "Invalid %d buffers requested",v.nb_buffers);
  798. return -EFAULT;
  799. }
  800. if (v.nb_buffers * v.buf_size > VIDEO1394_MAX_SIZE) {
  801. PRINT(KERN_ERR, ohci->id, 
  802.       "%d buffers of size %d bytes is too big", 
  803.       v.nb_buffers, v.buf_size);
  804. return -EFAULT;
  805. }
  806. if (cmd == VIDEO1394_LISTEN_CHANNEL) {
  807. /* find a free iso receive context */
  808. for (i=0;i<ohci->nb_iso_rcv_ctx-1;i++) 
  809. if (video->ir_context[i]==NULL) break;
  810.     
  811. if (i==(ohci->nb_iso_rcv_ctx-1)) {
  812. PRINT(KERN_ERR, ohci->id, 
  813.       "No iso context available");
  814. return -EFAULT;
  815. }
  816. video->ir_context[i] = 
  817. alloc_dma_iso_ctx(ohci, ISO_RECEIVE, i+1, 
  818.   v.nb_buffers, v.buf_size, 
  819.   v.channel, 0);
  820. if (video->ir_context[i] == NULL) {
  821. PRINT(KERN_ERR, ohci->id, 
  822.       "Couldn't allocate ir context");
  823. return -EFAULT;
  824. }
  825. initialize_dma_ir_ctx(video->ir_context[i], 
  826.       v.sync_tag, v.flags);
  827. video->current_ctx = video->ir_context[i];
  828. v.buf_size = video->ir_context[i]->buf_size;
  829. PRINT(KERN_INFO, ohci->id, 
  830.       "iso context %d listen on channel %d", i+1, 
  831.       v.channel);
  832. }
  833. else {
  834. /* find a free iso transmit context */
  835. for (i=0;i<ohci->nb_iso_xmit_ctx;i++) 
  836. if (video->it_context[i]==NULL) break;
  837.     
  838. if (i==ohci->nb_iso_xmit_ctx) {
  839. PRINT(KERN_ERR, ohci->id, 
  840.       "No iso context available");
  841. return -EFAULT;
  842. }
  843. video->it_context[i] = 
  844. alloc_dma_iso_ctx(ohci, ISO_TRANSMIT, i, 
  845.   v.nb_buffers, v.buf_size, 
  846.   v.channel, v.packet_size);
  847. if (video->it_context[i] == NULL) {
  848. PRINT(KERN_ERR, ohci->id, 
  849.       "Couldn't allocate it context");
  850. return -EFAULT;
  851. }
  852. initialize_dma_it_ctx(video->it_context[i], 
  853.       v.sync_tag, v.syt_offset, v.flags);
  854. video->current_ctx = video->it_context[i];
  855. v.buf_size = video->it_context[i]->buf_size;
  856. PRINT(KERN_INFO, ohci->id, 
  857.       "Iso context %d talk on channel %d", i, 
  858.       v.channel);
  859. }
  860. if(copy_to_user((void *)arg, &v, sizeof(v)))
  861. return -EFAULT;
  862. return 0;
  863. }
  864. case VIDEO1394_UNLISTEN_CHANNEL: 
  865. case VIDEO1394_UNTALK_CHANNEL:
  866. {
  867. int channel;
  868. u64 mask;
  869. int i;
  870. if(copy_from_user(&channel, (void *)arg, sizeof(int)))
  871. return -EFAULT;
  872. if (channel<0 || channel>(ISO_CHANNELS-1)) {
  873. PRINT(KERN_ERR, ohci->id, 
  874.       "Iso channel %d out of bound", channel);
  875. return -EFAULT;
  876. }
  877. mask = (u64)0x1<<channel;
  878. if (!(ohci->ISO_channel_usage & mask)) {
  879. PRINT(KERN_ERR, ohci->id, 
  880.       "Channel %d is not being used", channel);
  881. return -EFAULT;
  882. }
  883. ohci->ISO_channel_usage &= ~mask;
  884. if (cmd == VIDEO1394_UNLISTEN_CHANNEL) {
  885. i = ir_ctx_listening(video, channel);
  886. if (i<0) return -EFAULT;
  887. free_dma_iso_ctx(&video->ir_context[i]);
  888. PRINT(KERN_INFO, ohci->id, 
  889.       "Iso context %d stop listening on channel %d", 
  890.       i+1, channel);
  891. }
  892. else {
  893. i = it_ctx_talking(video, channel);
  894. if (i<0) return -EFAULT;
  895. free_dma_iso_ctx(&video->it_context[i]);
  896. PRINT(KERN_INFO, ohci->id, 
  897.       "Iso context %d stop talking on channel %d", 
  898.       i, channel);
  899. }
  900. return 0;
  901. }
  902. case VIDEO1394_LISTEN_QUEUE_BUFFER:
  903. {
  904. struct video1394_wait v;
  905. struct dma_iso_ctx *d;
  906. int i;
  907. if(copy_from_user(&v, (void *)arg, sizeof(v)))
  908. return -EFAULT;
  909. i = ir_ctx_listening(video, v.channel);
  910. if (i<0) return -EFAULT;
  911. d = video->ir_context[i];
  912. if ((v.buffer<0) || (v.buffer>d->num_desc)) {
  913. PRINT(KERN_ERR, ohci->id, 
  914.       "Buffer %d out of range",v.buffer);
  915. return -EFAULT;
  916. }
  917. spin_lock_irqsave(&d->lock,flags);
  918. if (d->buffer_status[v.buffer]==VIDEO1394_BUFFER_QUEUED) {
  919. PRINT(KERN_ERR, ohci->id, 
  920.       "Buffer %d is already used",v.buffer);
  921. spin_unlock_irqrestore(&d->lock,flags);
  922. return -EFAULT;
  923. }
  924. d->buffer_status[v.buffer]=VIDEO1394_BUFFER_QUEUED;
  925. if (d->last_buffer>=0) 
  926. d->ir_prg[d->last_buffer][d->nb_cmd-1].branchAddress = 
  927. (virt_to_bus(&(d->ir_prg[v.buffer][0].control)) 
  928.  & 0xfffffff0) | 0x1;
  929. d->last_buffer = v.buffer;
  930. d->ir_prg[d->last_buffer][d->nb_cmd-1].branchAddress = 0;
  931. spin_unlock_irqrestore(&d->lock,flags);
  932. if (!(reg_read(ohci, d->ctrlSet) & 0x8000)) 
  933. {
  934. DBGMSG(ohci->id, "Starting iso DMA ctx=%d",d->ctx);
  935. /* Tell the controller where the first program is */
  936. reg_write(ohci, d->cmdPtr, 
  937.   virt_to_bus(&(d->ir_prg[v.buffer][0]))|0x1);
  938. /* Run IR context */
  939. reg_write(ohci, d->ctrlSet, 0x8000);
  940. }
  941. else {
  942. /* Wake up dma context if necessary */
  943. if (!(reg_read(ohci, d->ctrlSet) & 0x400)) {
  944. PRINT(KERN_INFO, ohci->id, 
  945.       "Waking up iso dma ctx=%d", d->ctx);
  946. reg_write(ohci, d->ctrlSet, 0x1000);
  947. }
  948. }
  949. return 0;
  950. }
  951. case VIDEO1394_LISTEN_WAIT_BUFFER:
  952. case VIDEO1394_LISTEN_POLL_BUFFER:
  953. {
  954. struct video1394_wait v;
  955. struct dma_iso_ctx *d;
  956. int i;
  957. if(copy_from_user(&v, (void *)arg, sizeof(v)))
  958. return -EFAULT;
  959. i = ir_ctx_listening(video, v.channel);
  960. if (i<0) return -EFAULT;
  961. d = video->ir_context[i];
  962. if ((v.buffer<0) || (v.buffer>d->num_desc)) {
  963. PRINT(KERN_ERR, ohci->id, 
  964.       "Buffer %d out of range",v.buffer);
  965. return -EFAULT;
  966. }
  967. /*
  968.  * I change the way it works so that it returns 
  969.  * the last received frame.
  970.  */
  971. spin_lock_irqsave(&d->lock, flags);
  972. switch(d->buffer_status[v.buffer]) {
  973. case VIDEO1394_BUFFER_READY:
  974. d->buffer_status[v.buffer]=VIDEO1394_BUFFER_FREE;
  975. break;
  976. case VIDEO1394_BUFFER_QUEUED:
  977. if (cmd == VIDEO1394_LISTEN_POLL_BUFFER) {
  978.     /* for polling, return error code EINTR */
  979.     spin_unlock_irqrestore(&d->lock, flags);
  980.     return -EINTR;
  981. }
  982. #if 1
  983. while(d->buffer_status[v.buffer]!=
  984.       VIDEO1394_BUFFER_READY) {
  985. spin_unlock_irqrestore(&d->lock, flags);
  986. interruptible_sleep_on(&d->waitq);
  987. spin_lock_irqsave(&d->lock, flags);
  988. if(signal_pending(current)) {
  989. spin_unlock_irqrestore(&d->lock,flags);
  990. return -EINTR;
  991. }
  992. }
  993. #else
  994. if (wait_event_interruptible(d->waitq, 
  995.      d->buffer_status[v.buffer]
  996.      == VIDEO1394_BUFFER_READY)
  997.     == -ERESTARTSYS)
  998. return -EINTR;
  999. #endif
  1000. d->buffer_status[v.buffer]=VIDEO1394_BUFFER_FREE;
  1001. break;
  1002. default:
  1003. PRINT(KERN_ERR, ohci->id, 
  1004.       "Buffer %d is not queued",v.buffer);
  1005. spin_unlock_irqrestore(&d->lock, flags);
  1006. return -EFAULT;
  1007. }
  1008. /* set time of buffer */
  1009. v.filltime = d->buffer_time[v.buffer];
  1010. // printk("Buffer %d time %dn", v.buffer, (d->buffer_time[v.buffer]).tv_usec);
  1011. /*
  1012.  * Look ahead to see how many more buffers have been received
  1013.  */
  1014. i=0;
  1015. while (d->buffer_status[(v.buffer+1)%d->num_desc]==
  1016.        VIDEO1394_BUFFER_READY) {
  1017. v.buffer=(v.buffer+1)%d->num_desc;
  1018. i++;
  1019. }
  1020. spin_unlock_irqrestore(&d->lock, flags);
  1021. v.buffer=i;
  1022. if(copy_to_user((void *)arg, &v, sizeof(v)))
  1023. return -EFAULT;
  1024. return 0;
  1025. }
  1026. case VIDEO1394_TALK_QUEUE_BUFFER:
  1027. {
  1028. struct video1394_wait v;
  1029. struct video1394_queue_variable qv;
  1030. struct dma_iso_ctx *d;
  1031. int i;
  1032. if(copy_from_user(&v, (void *)arg, sizeof(v)))
  1033. return -EFAULT;
  1034. i = it_ctx_talking(video, v.channel);
  1035. if (i<0) return -EFAULT;
  1036. d = video->it_context[i];
  1037. if ((v.buffer<0) || (v.buffer>d->num_desc)) {
  1038. PRINT(KERN_ERR, ohci->id, 
  1039.       "Buffer %d out of range",v.buffer);
  1040. return -EFAULT;
  1041. }
  1042. if (d->flags & VIDEO1394_VARIABLE_PACKET_SIZE) {
  1043. if (copy_from_user(&qv, (void *)arg, sizeof(qv))) 
  1044. return -EFAULT;
  1045. if (!access_ok(VERIFY_READ, qv.packet_sizes, 
  1046.        d->nb_cmd * sizeof(unsigned int))) {
  1047. return -EFAULT;
  1048. }
  1049. }
  1050. spin_lock_irqsave(&d->lock,flags);
  1051. if (d->buffer_status[v.buffer]!=VIDEO1394_BUFFER_FREE) {
  1052. PRINT(KERN_ERR, ohci->id, 
  1053.       "Buffer %d is already used",v.buffer);
  1054. spin_unlock_irqrestore(&d->lock,flags);
  1055. return -EFAULT;
  1056. }
  1057. if (d->flags & VIDEO1394_VARIABLE_PACKET_SIZE) {
  1058. initialize_dma_it_prg_var_packet_queue(
  1059. d, v.buffer, qv.packet_sizes,
  1060. ohci);
  1061. }
  1062. d->buffer_status[v.buffer]=VIDEO1394_BUFFER_QUEUED;
  1063. if (d->last_buffer>=0) {
  1064. d->it_prg[d->last_buffer]
  1065. [ d->last_used_cmd[d->last_buffer]
  1066. ].end.branchAddress = 
  1067. (virt_to_bus(&(d->it_prg[v.buffer][0].begin.control)) 
  1068.  & 0xfffffff0) | 0x3;
  1069. d->it_prg[d->last_buffer]
  1070. [d->last_used_cmd[d->last_buffer]
  1071. ].begin.branchAddress = 
  1072. (virt_to_bus(&(d->it_prg[v.buffer][0].begin.control)) 
  1073.  & 0xfffffff0) | 0x3;
  1074. d->next_buffer[d->last_buffer] = v.buffer;
  1075. }
  1076. d->last_buffer = v.buffer;
  1077. d->next_buffer[d->last_buffer] = -1;
  1078. d->it_prg[d->last_buffer][d->last_used_cmd[d->last_buffer]].end.branchAddress = 0;
  1079. spin_unlock_irqrestore(&d->lock,flags);
  1080. if (!(reg_read(ohci, d->ctrlSet) & 0x8000)) 
  1081. {
  1082. DBGMSG(ohci->id, "Starting iso transmit DMA ctx=%d",
  1083.        d->ctx);
  1084. put_timestamp(ohci, d, d->last_buffer);
  1085. /* Tell the controller where the first program is */
  1086. reg_write(ohci, d->cmdPtr, 
  1087.   virt_to_bus(&(d->it_prg[v.buffer][0]))|0x3);
  1088. /* Run IT context */
  1089. reg_write(ohci, d->ctrlSet, 0x8000);
  1090. }
  1091. else {
  1092. /* Wake up dma context if necessary */
  1093. if (!(reg_read(ohci, d->ctrlSet) & 0x400)) {
  1094. PRINT(KERN_INFO, ohci->id, 
  1095.       "Waking up iso transmit dma ctx=%d", 
  1096.       d->ctx);
  1097. put_timestamp(ohci, d, d->last_buffer);
  1098. reg_write(ohci, d->ctrlSet, 0x1000);
  1099. }
  1100. }
  1101. return 0;
  1102. }
  1103. case VIDEO1394_TALK_WAIT_BUFFER:
  1104. {
  1105. struct video1394_wait v;
  1106. struct dma_iso_ctx *d;
  1107. int i;
  1108. if(copy_from_user(&v, (void *)arg, sizeof(v)))
  1109. return -EFAULT;
  1110. i = it_ctx_talking(video, v.channel);
  1111. if (i<0) return -EFAULT;
  1112. d = video->it_context[i];
  1113. if ((v.buffer<0) || (v.buffer>d->num_desc)) {
  1114. PRINT(KERN_ERR, ohci->id, 
  1115.       "Buffer %d out of range",v.buffer);
  1116. return -EFAULT;
  1117. }
  1118. switch(d->buffer_status[v.buffer]) {
  1119. case VIDEO1394_BUFFER_READY:
  1120. d->buffer_status[v.buffer]=VIDEO1394_BUFFER_FREE;
  1121. return 0;
  1122. case VIDEO1394_BUFFER_QUEUED:
  1123. #if 1
  1124. while(d->buffer_status[v.buffer]!=
  1125.       VIDEO1394_BUFFER_READY) {
  1126. interruptible_sleep_on(&d->waitq);
  1127. if(signal_pending(current)) return -EINTR;
  1128. }
  1129. #else
  1130. if (wait_event_interruptible(d->waitq, 
  1131.      d->buffer_status[v.buffer]
  1132.      == VIDEO1394_BUFFER_READY)
  1133.     == -ERESTARTSYS)
  1134. return -EINTR;
  1135. #endif
  1136. d->buffer_status[v.buffer]=VIDEO1394_BUFFER_FREE;
  1137. return 0;
  1138. default:
  1139. PRINT(KERN_ERR, ohci->id, 
  1140.       "Buffer %d is not queued",v.buffer);
  1141. return -EFAULT;
  1142. }
  1143. }
  1144. default:
  1145. return -EINVAL;
  1146. }
  1147. }
  1148. /*
  1149.  * This maps the vmalloced and reserved buffer to user space.
  1150.  *
  1151.  *  FIXME: 
  1152.  *  - PAGE_READONLY should suffice!?
  1153.  *  - remap_page_range is kind of inefficient for page by page remapping.
  1154.  *    But e.g. pte_alloc() does not work in modules ... :-(
  1155.  */
  1156. int video1394_mmap(struct file *file, struct vm_area_struct *vma)
  1157. {
  1158. struct video_card *video = NULL;
  1159. struct ti_ohci *ohci;
  1160. int res = -EINVAL;
  1161. unsigned long flags;
  1162. struct list_head *lh;
  1163.         spin_lock_irqsave(&video1394_cards_lock, flags);
  1164.         if (!list_empty(&video1394_cards)) {
  1165. struct video_card *p;
  1166. list_for_each(lh, &video1394_cards) {
  1167. p = list_entry(lh, struct video_card, list);
  1168. if (p->id == MINOR(file->f_dentry->d_inode->i_rdev)) {
  1169. video = p;
  1170. break;
  1171. }
  1172.                 }
  1173.         }
  1174.         spin_unlock_irqrestore(&video1394_cards_lock, flags);
  1175. if (video == NULL) {
  1176. PRINT_G(KERN_ERR, __FUNCTION__": Unknown video card for minor %d",
  1177. MINOR(file->f_dentry->d_inode->i_rdev));
  1178. return -EFAULT;
  1179. }
  1180. lock_kernel();
  1181. ohci = video->ohci;
  1182. if (video->current_ctx == NULL) {
  1183. PRINT(KERN_ERR, ohci->id, "Current iso context not set");
  1184. } else
  1185. res = do_iso_mmap(ohci, video->current_ctx, 
  1186.    (char *)vma->vm_start, 
  1187.    (unsigned long)(vma->vm_end-vma->vm_start));
  1188. unlock_kernel();
  1189. return res;
  1190. }
  1191. static int video1394_open(struct inode *inode, struct file *file)
  1192. {
  1193. int i = MINOR(inode->i_rdev);
  1194. unsigned long flags;
  1195. struct video_card *video = NULL;
  1196. struct list_head *lh;
  1197. spin_lock_irqsave(&video1394_cards_lock, flags);
  1198. if (!list_empty(&video1394_cards)) {
  1199. struct video_card *p;
  1200. list_for_each(lh, &video1394_cards) {
  1201. p = list_entry(lh, struct video_card, list);
  1202. if (p->id == i) {
  1203. video = p;
  1204. break;
  1205. }
  1206. }
  1207. }
  1208. spin_unlock_irqrestore(&video1394_cards_lock, flags);
  1209.         if (video == NULL)
  1210.                 return -EIO;
  1211. V22_COMPAT_MOD_INC_USE_COUNT;
  1212. return 0;
  1213. }
  1214. static int video1394_release(struct inode *inode, struct file *file)
  1215. {
  1216. struct video_card *video = NULL;
  1217. struct ti_ohci *ohci;
  1218. u64 mask;
  1219. int i;
  1220. unsigned long flags;
  1221. struct list_head *lh;
  1222.         spin_lock_irqsave(&video1394_cards_lock, flags);
  1223.         if (!list_empty(&video1394_cards)) {
  1224. struct video_card *p;
  1225. list_for_each(lh, &video1394_cards) {
  1226. p = list_entry(lh, struct video_card, list);
  1227. if (p->id == MINOR(inode->i_rdev)) {
  1228. video = p;
  1229. break;
  1230. }
  1231. }
  1232. }
  1233.         spin_unlock_irqrestore(&video1394_cards_lock, flags);
  1234. if (video == NULL) {
  1235. PRINT_G(KERN_ERR, __FUNCTION__": Unknown device for minor %d",
  1236. MINOR(inode->i_rdev));
  1237. return 1;
  1238. }
  1239. ohci = video->ohci;
  1240. lock_kernel();
  1241. for (i=0;i<ohci->nb_iso_rcv_ctx-1;i++) 
  1242. if (video->ir_context[i]) {
  1243. mask = (u64)0x1<<video->ir_context[i]->channel;
  1244. if (!(ohci->ISO_channel_usage & mask))
  1245. PRINT(KERN_ERR, ohci->id, 
  1246.       "Channel %d is not being used", 
  1247.       video->ir_context[i]->channel);
  1248. else
  1249. ohci->ISO_channel_usage &= ~mask;
  1250. PRINT(KERN_INFO, ohci->id, 
  1251.       "Iso receive context %d stop listening "
  1252.       "on channel %d", i+1, 
  1253.       video->ir_context[i]->channel);
  1254. free_dma_iso_ctx(&video->ir_context[i]);
  1255. }
  1256. for (i=0;i<ohci->nb_iso_xmit_ctx;i++) 
  1257. if (video->it_context[i]) {
  1258. mask = (u64)0x1<<video->it_context[i]->channel;
  1259. if (!(ohci->ISO_channel_usage & mask))
  1260. PRINT(KERN_ERR, ohci->id, 
  1261.       "Channel %d is not being used", 
  1262.       video->it_context[i]->channel);
  1263. else
  1264. ohci->ISO_channel_usage &= ~mask;
  1265. PRINT(KERN_INFO, ohci->id, 
  1266.       "Iso transmit context %d stop talking "
  1267.       "on channel %d", i+1, 
  1268.       video->it_context[i]->channel);
  1269. free_dma_iso_ctx(&video->it_context[i]);
  1270. }
  1271. V22_COMPAT_MOD_DEC_USE_COUNT;
  1272. unlock_kernel();
  1273. return 0;
  1274. }
  1275. static void irq_handler(int card, quadlet_t isoRecvIntEvent, 
  1276.  quadlet_t isoXmitIntEvent)
  1277. {
  1278. int i;
  1279. unsigned long flags;
  1280. struct video_card *video = NULL;
  1281. struct list_head *lh;
  1282. spin_lock_irqsave(&video1394_cards_lock, flags);
  1283. if (!list_empty(&video1394_cards)) {
  1284. struct video_card *p;
  1285. list_for_each(lh, &video1394_cards) {
  1286. p = list_entry(lh, struct video_card, list);
  1287. if (p->id == card) {
  1288. video = p;
  1289. break;
  1290. }
  1291.                 }
  1292.         }
  1293.         spin_unlock_irqrestore(&video1394_cards_lock, flags);
  1294. if (video == NULL) {
  1295. PRINT_G(KERN_ERR, __FUNCTION__": Unknown card number %d!!",
  1296. card);
  1297. return;
  1298. }
  1299. DBGMSG(card, "Iso event Recv: %08x Xmit: %08x",
  1300.        isoRecvIntEvent, isoXmitIntEvent);
  1301. for (i=0;i<video->ohci->nb_iso_rcv_ctx-1;i++)
  1302. if (isoRecvIntEvent & (1<<(i+1))) 
  1303. wakeup_dma_ir_ctx(video->ohci,
  1304.   video->ir_context[i]);
  1305. for (i=0;i<video->ohci->nb_iso_xmit_ctx;i++)
  1306. if (isoXmitIntEvent & (1<<i)) 
  1307. wakeup_dma_it_ctx(video->ohci,
  1308.   video->it_context[i]);
  1309. }
  1310. static struct file_operations video1394_fops=
  1311. {
  1312.         OWNER_THIS_MODULE
  1313. ioctl: video1394_ioctl,
  1314. mmap: video1394_mmap,
  1315. open: video1394_open,
  1316. release: video1394_release
  1317. };
  1318. static int video1394_init(struct ti_ohci *ohci)
  1319. {
  1320. struct video_card *video = kmalloc(sizeof(struct video_card), GFP_KERNEL);
  1321. unsigned long flags;
  1322. char name[16];
  1323. if (video == NULL) {
  1324. PRINT(KERN_ERR, ohci->id, "Cannot allocate video_card");
  1325. return -1;
  1326. }
  1327. memset(video, 0, sizeof(struct video_card));
  1328. spin_lock_irqsave(&video1394_cards_lock, flags);
  1329. INIT_LIST_HEAD(&video->list);
  1330. list_add_tail(&video->list, &video1394_cards);
  1331. spin_unlock_irqrestore(&video1394_cards_lock, flags);
  1332. if (ohci1394_register_video(ohci, &video_tmpl)<0) {
  1333. PRINT(KERN_ERR, ohci->id, "Register_video failed");
  1334. return -1;
  1335. }
  1336. video->id = ohci->id;
  1337. video->ohci = ohci;
  1338. /* Iso receive dma contexts */
  1339. video->ir_context = (struct dma_iso_ctx **)
  1340. kmalloc((ohci->nb_iso_rcv_ctx-1)*
  1341. sizeof(struct dma_iso_ctx *), GFP_KERNEL);
  1342. if (video->ir_context) 
  1343. memset(video->ir_context, 0,
  1344.        (ohci->nb_iso_rcv_ctx-1)*sizeof(struct dma_iso_ctx *));
  1345. else {
  1346. PRINT(KERN_ERR, ohci->id, "Cannot allocate ir_context");
  1347. return -1;
  1348. }
  1349. /* Iso transmit dma contexts */
  1350. video->it_context = (struct dma_iso_ctx **)
  1351. kmalloc(ohci->nb_iso_xmit_ctx *
  1352. sizeof(struct dma_iso_ctx *), GFP_KERNEL);
  1353. if (video->it_context) 
  1354. memset(video->it_context, 0,
  1355.        ohci->nb_iso_xmit_ctx * sizeof(struct dma_iso_ctx *));
  1356. else {
  1357. PRINT(KERN_ERR, ohci->id, "Cannot allocate it_context");
  1358. return -1;
  1359. }
  1360. sprintf(name, "%d", video->id);
  1361. video->devfs = devfs_register(devfs_handle, name,
  1362.       DEVFS_FL_AUTO_OWNER,
  1363.       VIDEO1394_MAJOR, 0,
  1364.       S_IFCHR | S_IRUSR | S_IWUSR,
  1365.       &video1394_fops, NULL);
  1366. return 0;
  1367. }
  1368. /* Must be called under spinlock */
  1369. static void remove_card(struct video_card *video)
  1370. {
  1371. int i;
  1372. ohci1394_unregister_video(video->ohci, &video_tmpl);
  1373. devfs_unregister(video->devfs);
  1374. /* Free the iso receive contexts */
  1375. if (video->ir_context) {
  1376. for (i=0;i<video->ohci->nb_iso_rcv_ctx-1;i++) {
  1377. free_dma_iso_ctx(&video->ir_context[i]);
  1378. }
  1379. kfree(video->ir_context);
  1380. }
  1381. /* Free the iso transmit contexts */
  1382. if (video->it_context) {
  1383. for (i=0;i<video->ohci->nb_iso_xmit_ctx;i++) {
  1384. free_dma_iso_ctx(&video->it_context[i]);
  1385. }
  1386. kfree(video->it_context);
  1387. }
  1388. list_del(&video->list);
  1389. kfree(video);
  1390. }
  1391. static void video1394_remove_host (struct hpsb_host *host)
  1392. {
  1393. struct ti_ohci *ohci;
  1394. unsigned long flags;
  1395. struct list_head *lh, *next;
  1396. struct video_card *p;
  1397. /* We only work with the OHCI-1394 driver */
  1398. if (strcmp(host->template->name, OHCI1394_DRIVER_NAME))
  1399. return;
  1400. ohci = (struct ti_ohci *)host->hostdata;
  1401.         spin_lock_irqsave(&video1394_cards_lock, flags);
  1402. list_for_each_safe(lh, next, &video1394_cards) {
  1403. p = list_entry(lh, struct video_card, list);
  1404. if (p->ohci == ohci) {
  1405. remove_card(p);
  1406. break;
  1407. }
  1408. }
  1409. spin_unlock_irqrestore(&video1394_cards_lock, flags);
  1410. return;
  1411. }
  1412. static void video1394_add_host (struct hpsb_host *host)
  1413. {
  1414. struct ti_ohci *ohci;
  1415. /* We only work with the OHCI-1394 driver */
  1416. if (strcmp(host->template->name, OHCI1394_DRIVER_NAME))
  1417. return;
  1418. ohci = (struct ti_ohci *)host->hostdata;
  1419. video1394_init(ohci);
  1420. return;
  1421. }
  1422. static struct hpsb_highlevel_ops hl_ops = {
  1423. add_host: video1394_add_host,
  1424. remove_host: video1394_remove_host,
  1425. };
  1426. MODULE_AUTHOR("Sebastien Rougeaux <sebastien.rougeaux@anu.edu.au>");
  1427. MODULE_DESCRIPTION("driver for digital video on OHCI board");
  1428. MODULE_SUPPORTED_DEVICE(VIDEO1394_DRIVER_NAME);
  1429. MODULE_LICENSE("GPL");
  1430. static void __exit video1394_exit_module (void)
  1431. {
  1432. hpsb_unregister_highlevel (hl_handle);
  1433. devfs_unregister(devfs_handle);
  1434. devfs_unregister_chrdev(VIDEO1394_MAJOR, VIDEO1394_DRIVER_NAME);
  1435. PRINT_G(KERN_INFO, "Removed " VIDEO1394_DRIVER_NAME " module");
  1436. }
  1437. static int __init video1394_init_module (void)
  1438. {
  1439. if (devfs_register_chrdev(VIDEO1394_MAJOR, VIDEO1394_DRIVER_NAME,
  1440. &video1394_fops)) {
  1441. PRINT_G(KERN_ERR, "video1394: unable to get major %dn",
  1442. VIDEO1394_MAJOR);
  1443. return -EIO;
  1444. }
  1445. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
  1446. devfs_handle = devfs_mk_dir(NULL, VIDEO1394_DRIVER_NAME,
  1447. strlen(VIDEO1394_DRIVER_NAME), NULL);
  1448. #else
  1449. devfs_handle = devfs_mk_dir(NULL, VIDEO1394_DRIVER_NAME, NULL);
  1450. #endif
  1451. hl_handle = hpsb_register_highlevel (VIDEO1394_DRIVER_NAME, &hl_ops);
  1452. if (hl_handle == NULL) {
  1453. PRINT_G(KERN_ERR, "No more memory for drivern");
  1454. devfs_unregister(devfs_handle);
  1455. devfs_unregister_chrdev(VIDEO1394_MAJOR, VIDEO1394_DRIVER_NAME);
  1456. return -ENOMEM;
  1457. }
  1458. PRINT_G(KERN_INFO, "Installed " VIDEO1394_DRIVER_NAME " module");
  1459. return 0;
  1460. }
  1461. module_init(video1394_init_module);
  1462. module_exit(video1394_exit_module);