OpenCores
URL https://opencores.org/ocsvn/pcie_ds_dma/pcie_ds_dma/trunk

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [soft/] [linux/] [driver/] [pexdrv/] [ioctlrw.c] - Blame information for rev 7

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
 
2
#include <linux/kernel.h>
3
#define __NO_VERSION__
4
#include <linux/module.h>
5
#include <linux/types.h>
6
#include <linux/ioport.h>
7
#include <linux/pci.h>
8
#include <linux/pagemap.h>
9
#include <linux/interrupt.h>
10
#include <linux/proc_fs.h>
11
//#include <linux/atomic.h>
12
#include <asm/io.h>
13
 
14
#include "pexmodule.h"
15
#include "pexioctl.h"
16
#include "hardware.h"
17
#include "ambpexregs.h"
18 6 v.karak
#include "brd_info.h"
19 2 dsmv
 
20
//--------------------------------------------------------------------
21
 
22
int ioctl_board_info(struct pex_device *brd, unsigned long arg)
23
{
24
    struct board_info bi;
25
    int error = 0;
26
 
27
    down(&brd->m_BoardSem);
28
 
29
    dbg_msg(dbg_trace, "%s(): get board information\n", __FUNCTION__);
30
 
31
    memset(&bi, 0, sizeof(struct board_info));
32
 
33
    bi.PhysAddress[0] = brd->m_BAR0.physical_address;
34
    bi.VirtAddress[0] = brd->m_BAR0.virtual_address;
35
    bi.Size[0] = brd->m_BAR0.size;
36
 
37
    bi.PhysAddress[1] = brd->m_BAR1.physical_address;
38
    bi.VirtAddress[1] = brd->m_BAR1.virtual_address;
39
    bi.Size[1] = brd->m_BAR1.size;
40
 
41
    bi.InterruptLevel = 0;
42
    bi.InterruptVector = brd->m_Interrupt;
43
    bi.vendor_id = brd->m_pci->vendor;
44
    bi.device_id = brd->m_pci->device;
45
 
46
    if(copy_to_user((void*)arg, &bi, sizeof(struct board_info))) {
47
        err_msg(err_trace, "%s(): Error copy board info to user space\n", __FUNCTION__);
48
        error = -EINVAL;
49
    }
50
 
51
    up(&brd->m_BoardSem);
52
 
53
    return error;
54
}
55
 
56
//--------------------------------------------------------------------
57
 
58
int ioctl_memory_alloc(struct pex_device *brd, unsigned long arg)
59
{
60
    struct memory_block mb = {0};
61
    dma_addr_t dma_handle = {0};
62
    int error = 0;
63
    int i = 0;
64
 
65
    down(&brd->m_BoardSem);
66
 
67
    if(copy_from_user((void*)&mb, (void*)arg, sizeof(struct memory_block))) {
68
        err_msg(err_trace, "%s(): Error copy block descriptor from user space\n", __FUNCTION__);
69
        error = -EINVAL;
70
        goto do_exit;
71
    }
72
 
73
    if(mb.size == 0) {
74
        err_msg(err_trace, "%s(): Invalid block size.\n", __FUNCTION__);
75
        goto do_exit;
76
    }
77
 
78
    mb.virt = allocate_memory_block(brd, mb.size, &dma_handle);
79
        if(!mb.virt) {
80
            err_msg(err_trace, "%s(): Error allocate block %d.\n", __FUNCTION__, i);
81
            error = -ENOMEM;
82
            goto do_exit;
83
        }
84
        mb.phys = dma_handle;
85
 
86
    if(copy_to_user((void*)arg, &mb, sizeof(struct memory_block))) {
87
        err_msg(err_trace, "%s(): Error copy block descriptor to user space\n", __FUNCTION__);
88
        error = -EINVAL;
89
    }
90
 
91
do_exit:
92
    up(&brd->m_BoardSem);
93
 
94
    return error;
95
}
96
 
97
//--------------------------------------------------------------------
98
 
99
int ioctl_memory_free(struct pex_device *brd, unsigned long arg)
100
{
101
    struct memory_block mb = {0};
102
    int error = 0;
103
    int i = 0;
104
 
105
    down(&brd->m_BoardSem);
106
 
107
    if(copy_from_user((void*)&mb, (void*)arg, sizeof(struct memory_block))) {
108
        err_msg(err_trace, "%s(): Error copy block descriptor from user space\n", __FUNCTION__);
109
        error = -EINVAL;
110
        goto do_exit;
111
    }
112
 
113
    if(mb.size == 0 || mb.phys == 0 || mb.virt == 0) {
114
        err_msg(err_trace, "%s(): Invalid block parameters.\n", __FUNCTION__);
115
        goto do_exit;
116
    }
117
 
118
    error = free_memory_block(brd, mb);
119
    if(error < 0) {
120
        err_msg(err_trace, "%s(): Error free block %d.\n", __FUNCTION__, i);
121
        goto do_exit;
122
    }
123
 
124
do_exit:
125
    up(&brd->m_BoardSem);
126
 
127
    return error;
128
}
129
 
130
//--------------------------------------------------------------------
131
 
132
int ioctl_stub_alloc(struct pex_device *brd, unsigned long arg)
133
{
134
/*
135
    struct stub_descriptor stub = {0};
136
    struct dma_channel *dma = NULL;
137
    void *cpu_addr = NULL;
138
    dma_addr_t dma_handle = {0};
139
    int locked = 0;
140
    int error = -EINVAL;
141
 
142
    down(&brd->m_BoardSem);
143
 
144
    if(copy_from_user((void*)&stub, (void*)arg, sizeof(struct stub_descriptor))) {
145
        err_msg(err_trace, "%s(): Error copy stub descriptor from user space\n", __FUNCTION__);
146
        error = -EINVAL;
147
        goto do_exit;
148
    }
149
 
150
    if(stub.dma_channel >= MAX_NUMBER_OF_DMACHANNELS) {
151
        err_msg(err_trace, "%s(): Invalid DMA channel number.\n", __FUNCTION__);
152
        error = -EINVAL;
153
        goto do_exit;
154
    }
155
 
156
    dma = &brd->m_DMA[stub.dma_channel];
157
 
158
    spin_lock(&dma->m_MemListLock);
159
 
160
    cpu_addr = dma_alloc_coherent(&dma->m_pci->dev, PAGE_SIZE, &dma_handle, GFP_KERNEL);
161
    if(!cpu_addr) {
162
        err_msg(err_trace, "%s(): Error allocate physical memory for stub.\n", __FUNCTION__);
163
        error = -ENOMEM;
164
        goto do_unlock;
165
    }
166
 
167
    dma->m_MemStub.dma_handle = dma_handle;
168
    dma->m_MemStub.cpu_addr = cpu_addr;
169
    dma->m_MemStub.size = PAGE_SIZE;
170
 
171
    stub.stub.phys = dma_handle;
172
    stub.stub.size = PAGE_SIZE;
173
    stub.stub.virt = NULL;
174
 
175
    locked = lock_pages(dma->m_MemStub.cpu_addr, dma->m_MemStub.size);
176
 
177
    dbg_msg(dbg_trace, "%s(): PA = 0x%zx, VA = %p, SZ = 0x%zx, PAGES = %d\n",
178
            __FUNCTION__, (size_t)dma->m_MemStub.dma_handle, dma->m_MemStub.cpu_addr, dma->m_MemStub.size, locked );
179
 
180
    if(copy_to_user((void*)arg, &stub, sizeof(struct stub_descriptor))) {
181
        err_msg(err_trace, "%s(): Error copy stub descriptor to user space\n", __FUNCTION__);
182
        error = -EINVAL;
183
        goto do_free_mem;
184
    }
185
 
186
    spin_unlock(&dma->m_MemListLock);
187
 
188
    return 0;
189
 
190
do_free_mem:
191
    dma_free_coherent(&dma->m_pci->dev, PAGE_SIZE, cpu_addr, dma_handle);
192
 
193
do_unlock:
194
    spin_unlock(&dma->m_MemListLock);
195
 
196
do_exit:
197
    up(&brd->m_BoardSem);
198
 
199
    return error;
200
*/
201
    return -ENOSYS;
202
}
203
 
204
//--------------------------------------------------------------------
205
 
206
int ioctl_stub_free(struct pex_device *brd, unsigned long arg)
207
{
208
    down(&brd->m_BoardSem);
209
 
210
    dbg_msg(err_trace, "%s(): ioctl not implemented.\n", __FUNCTION__);
211
 
212
    up(&brd->m_BoardSem);
213
 
214
    return -ENOSYS;
215
}
216
 
217
//--------------------------------------------------------------------
218
 
219
int ioctl_set_mem(struct pex_device *brd, unsigned long arg)
220
{
221
    int error = 0;
222
    u32 i = 0;
223
    u32 AdmNumber = 0;
224
    u32 TetrNumber = 0;
225
    u32 Address = 0;
226
    u32 tmpSize = 0;
227
    struct CDmaChannel *dma = NULL;
228
    AMB_MEM_DMA_CHANNEL MemDscr = {0};
229
    PAMB_MEM_DMA_CHANNEL pKernMemDscr = NULL;
230
    PAMB_MEM_DMA_CHANNEL pUserMemDscr = &MemDscr;
231
 
232
    down(&brd->m_BoardSem);
233
 
234
    dbg_msg(dbg_trace, "%s(): Started\n", __FUNCTION__);
235
 
236
    if( copy_from_user((void *)pUserMemDscr, (void *)arg, sizeof(AMB_MEM_DMA_CHANNEL))) {
237
        err_msg(err_trace, "%s(): Error copy descriptor from user space\n", __FUNCTION__);
238
        error = -EFAULT;
239
        goto do_exit;
240
    }
241
 
242
    tmpSize = sizeof(AMB_MEM_DMA_CHANNEL)+(pUserMemDscr->BlockCnt-1)*sizeof(void*);
243
 
244
    pKernMemDscr = kzalloc(tmpSize, GFP_KERNEL);
245
    if(!pKernMemDscr) {
246
        err_msg(err_trace, "%s(): Error allocate descriptor in kernel space\n", __FUNCTION__);
247
        error = -ENOMEM;
248
        goto do_free_mem;
249
    }
250
 
251
    memcpy(pKernMemDscr, pUserMemDscr, tmpSize);
252
 
253
    if(pKernMemDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS) {
254
        err_msg(err_trace, "%s(): Invalid DMA channel number\n", __FUNCTION__);
255
        error = -EINVAL;
256
        goto do_free_mem;
257
    }
258
 
259
    if(!(brd->m_DmaChanMask & (1 << pKernMemDscr->DmaChanNum))) {
260
        err_msg(err_trace, "%s(): Invalid stream number\n", __FUNCTION__);
261
        error = -EINVAL;
262
        goto do_free_mem;
263
    }
264
 
265
    i = pKernMemDscr->DmaChanNum;
266
    dma = brd->m_DmaChannel[i];
267
 
268
    dbg_msg(dbg_trace, "%s(): 1\n", __FUNCTION__);
269
 
270
    error = SetDmaDirection(dma, pKernMemDscr->Direction);
271
    if(error != 0) {
272
        err_msg(err_trace, "%s(): Error in SetDmaDirection()\n", __FUNCTION__);
273
        error = -EINVAL;
274
        goto do_free_mem;
275
    }
276
 
277
    dbg_msg(dbg_trace, "%s(): 2\n", __FUNCTION__);
278
 
279
    Adjust(dma,0);
280
 
281
    dbg_msg(dbg_trace, "%s(): 3\n", __FUNCTION__);
282
 
283
    pKernMemDscr->BlockSize = (pKernMemDscr->BlockSize >> 12) << 12;
284
    if(!pKernMemDscr->BlockSize) {
285
        err_msg(err_trace, "%s(): BlockSize is zero\n", __FUNCTION__);
286
        error = -EINVAL;
287
        goto do_free_mem;
288
    }
289
 
290
    AdmNumber = pKernMemDscr->LocalAddr >> 16;
291
    TetrNumber = pKernMemDscr->LocalAddr & 0xff;
292
    Address = AdmNumber*ADM_SIZE + TetrNumber*TETRAD_SIZE + TRDadr_DATA*REG_SIZE;
293
 
294
    SetDmaLocalAddress(dma, Address);
295
    SetAdmTetr(dma, AdmNumber, TetrNumber);
296
    error = SetDmaMode(brd, i, AdmNumber, TetrNumber);
297
 
298
    dbg_msg(dbg_trace, "%s(): 4\n", __FUNCTION__);
299
 
300
    error = RequestMemory( dma, pKernMemDscr->pBlock, pKernMemDscr->BlockSize,
301
                            (u32*)&pKernMemDscr->BlockCnt, &pKernMemDscr->pStub, pKernMemDscr->MemType );
302
    if(error < 0) {
303
        err_msg(err_trace, "%s(): Error in RequestMemory()\n", __FUNCTION__);
304
        error = -ENOMEM;
305
        goto do_free_mem;
306
    }
307
 
308
    dbg_msg(dbg_trace, "%s(): 5\n", __FUNCTION__);
309
 
310
    if(copy_to_user((void*)arg, (void*)pKernMemDscr, tmpSize)) {
311
        err_msg(err_trace, "%s(): Error copy descriptor to user space\n", __FUNCTION__);
312
        error = -EFAULT;
313
    }
314
 
315
do_free_mem:
316
    kfree(pKernMemDscr);
317
 
318
do_exit:
319
    up(&brd->m_BoardSem);
320
 
321
    return error;
322
}
323
 
324
//--------------------------------------------------------------------
325
 
326
int ioctl_free_mem(struct pex_device *brd, size_t arg)
327
{
328
    u32 i = 0;
329
    int error = 0;
330
    AMB_MEM_DMA_CHANNEL MemDscr = {0};
331
    PAMB_MEM_DMA_CHANNEL pMemDscr = &MemDscr;
332
 
333
    down(&brd->m_BoardSem);
334
 
335
    if( copy_from_user((void *)pMemDscr, (void *)arg, sizeof(AMB_MEM_DMA_CHANNEL))) {
336
        err_msg(err_trace, "%s(): Error copy descriptor from user space\n", __FUNCTION__);
337
        error = -EFAULT;
338
        goto do_exit;
339
    }
340
 
341
    if(pMemDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS) {
342
        err_msg(err_trace, "%s(): Invalid DMA channel number\n", __FUNCTION__);
343
        error = -EINVAL;
344
        goto do_exit;
345
    }
346
 
347
    i = pMemDscr->DmaChanNum;
348
    ReleaseMemory(brd->m_DmaChannel[i]);
349
 
350
    if(copy_to_user (( void *)arg, (void *)&MemDscr, sizeof(AMB_MEM_DMA_CHANNEL) + (pMemDscr->BlockCnt - 1) * sizeof(void*) )) {
351
        err_msg(err_trace, "%s(): Error copy descriptor to user space\n", __FUNCTION__);
352
        error = -EFAULT;
353
        goto do_exit;
354
    }
355
 
356
do_exit:
357
    up(&brd->m_BoardSem);
358
 
359
    return error;
360
}
361
 
362
//--------------------------------------------------------------------
363
 
364
int ioctl_start_mem(struct pex_device *brd, size_t arg)
365
{
366
    int Status = -EINVAL;
367
    AMB_START_DMA_CHANNEL StartDscr;
368
    PAMB_START_DMA_CHANNEL pStartDscr = &StartDscr;
369
 
370
    down(&brd->m_BoardSem);
371
 
372
    if( copy_from_user((void *)&StartDscr, (void *)arg, sizeof(AMB_START_DMA_CHANNEL))) {
373
        err_msg(err_trace, "%s(): Error copy data from userspace\n", __FUNCTION__ );
374
        up(&brd->m_BoardSem);
375
        return -EFAULT;
376
    }
377
 
378
    if(pStartDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS) {
379
        printk("<0>%s(): too large stream number\n", __FUNCTION__);
380
        up(&brd->m_BoardSem);
381
        return -EINVAL;
382
    }
383
 
384
    if(!(brd->m_DmaChanMask & (1 << pStartDscr->DmaChanNum))) {
385
        printk("<0>%s(): invalid stream number\n", __FUNCTION__);
386
        up(&brd->m_BoardSem);
387
        return -EINVAL;
388
    }
389
 
390
    Status = StartDmaTransfer(brd->m_DmaChannel[pStartDscr->DmaChanNum], pStartDscr->IsCycling);
391
    Status = HwStartDmaTransfer(brd, pStartDscr->DmaChanNum);
392
 
393
    up(&brd->m_BoardSem);
394
 
395
    return Status;
396
}
397
 
398
//--------------------------------------------------------------------
399
 
400
int ioctl_stop_mem(struct pex_device *brd, size_t arg)
401
{
402
    int Status = -EINVAL;
403
    u32 i;
404
    AMB_STATE_DMA_CHANNEL StopDscr;
405
    PAMB_STATE_DMA_CHANNEL pStopDscr = &StopDscr;
406
 
407
    down(&brd->m_BoardSem);
408
 
409
    // get the user buffer
410
    if( copy_from_user((void *)&StopDscr, (void *)arg, sizeof(AMB_STATE_DMA_CHANNEL))) {
411
        err_msg(err_trace, "%s(): Error copy data from userspace\n", __FUNCTION__ );
412
        up(&brd->m_BoardSem);
413
        return -EFAULT;
414
    }
415
 
416
    //printk("<0>IoctlStopMem: Entered.\n");
417
 
418
    if(pStopDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS)
419
    {
420
        printk("<0>IoctlStopMem: too large stream number\n");
421
        up(&brd->m_BoardSem);
422
        return -EINVAL;
423
    }
424
 
425
    i = pStopDscr->DmaChanNum;
426
    if(pStopDscr->Timeout)
427
        Status = WaitBlockEndEvent(brd->m_DmaChannel[i], pStopDscr->Timeout);
428
    else
429
        Status = 0;
430
    /*
431
        PIRP CurrentIrp = m_DmaChannel[i].GetQueueIrp();
432
        if(CurrentIrp)
433
                CancelIrp(CurrentIrp, WambpIrpCancelCallback);
434
*/
435
    HwCompleteDmaTransfer(brd, i);
436
    //FreezeState(brd->m_DmaChannel[i]);
437
    GetState( brd->m_DmaChannel[i], (u32*)&pStopDscr->BlockNum,
438
              (u32*)&pStopDscr->BlockCntTotal, (u32*)&pStopDscr->OffsetInBlock,
439
              (u32*)&pStopDscr->DmaChanState);
440
 
441
    if(copy_to_user (( void *)arg, (void *)&StopDscr, sizeof(AMB_STATE_DMA_CHANNEL))) {
442
        err_msg(err_trace, "%s(): Error copy data to userspace\n", __FUNCTION__ );
443
        up(&brd->m_BoardSem);
444
        return -EFAULT;
445
    }
446
 
447
    up(&brd->m_BoardSem);
448
 
449
    return Status;
450
}
451
 
452
//--------------------------------------------------------------------
453
 
454
int ioctl_state_mem(struct pex_device *brd, size_t arg)
455
{
456
    int Status = -EINVAL;
457
    u32 i=0;
458
    AMB_STATE_DMA_CHANNEL StateDscr;
459
    PAMB_STATE_DMA_CHANNEL pStateDscr = &StateDscr;
460
 
461
    down(&brd->m_BoardSem);
462
 
463
    // get the user buffer
464
    if( copy_from_user((void *)&StateDscr, (void *)arg, sizeof(AMB_STATE_DMA_CHANNEL))) {
465
        err_msg(err_trace, "%s(): Error copy data from userspace\n", __FUNCTION__ );
466
        up(&brd->m_BoardSem);
467
        return -EFAULT;
468
    }
469
 
470
    //printk("<0>IoctlStateMem: Entered.\n");
471
 
472
    if(pStateDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS)
473
    {
474
        printk("<0>IoctlStateMem: too large stream number\n");
475
        up(&brd->m_BoardSem);
476
        return -EINVAL;
477
    }
478
 
479
    i = pStateDscr->DmaChanNum;
480
    if(pStateDscr->Timeout)
481
        Status = WaitBlockEndEvent(brd->m_DmaChannel[i], pStateDscr->Timeout);
482
    else
483
        Status = 0;
484
 
485
    //FreezeState(brd->m_DmaChannel[i]);
486
    GetState(brd->m_DmaChannel[i],      (u32*)&pStateDscr->BlockNum,
487
             (u32*)&pStateDscr->BlockCntTotal,
488
             (u32*)&pStateDscr->OffsetInBlock,
489
             (u32*)&pStateDscr->DmaChanState);
490
 
491
    if(copy_to_user (( void *)arg, (void *)&StateDscr, sizeof(AMB_STATE_DMA_CHANNEL))) {
492
        err_msg(err_trace, "%s(): Error copy data to userspace\n", __FUNCTION__ );
493
        up(&brd->m_BoardSem);
494
        return -EFAULT;
495
    }
496
 
497
    up(&brd->m_BoardSem);
498
 
499
    return Status;
500
}
501
 
502
//--------------------------------------------------------------------
503
 
504
int ioctl_set_dir_mem(struct pex_device *brd, size_t arg)
505
{
506
    int Status = -EINVAL;
507
    u32 i;
508
    AMB_SET_DMA_CHANNEL MemDscr;
509
    PAMB_SET_DMA_CHANNEL pMemDscr = &MemDscr;
510
 
511
    //printk("<0>IoctlSetDirMem: Entered.\n");
512
    down(&brd->m_BoardSem);
513
 
514
    // get the user buffer
515
    if( copy_from_user((void *)&MemDscr, (void *)arg, sizeof(AMB_SET_DMA_CHANNEL))) {
516
        err_msg(err_trace, "%s(): Error copy data from userspace\n", __FUNCTION__ );
517
        up(&brd->m_BoardSem);
518
        return -EFAULT;
519
    }
520
 
521
    if(pMemDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS)
522
    {
523
        printk("<0>IoctlSetDirMem: too large stream number\n");
524
        up(&brd->m_BoardSem);
525
        return -EINVAL;
526
    }
527
 
528
    i = pMemDscr->DmaChanNum;
529
    Status = SetDmaDirection(brd->m_DmaChannel[i], pMemDscr->Param);
530
 
531
    up(&brd->m_BoardSem);
532
 
533
    return Status;
534
}
535
 
536
//--------------------------------------------------------------------
537
 
538
int ioctl_set_src_mem(struct pex_device *brd, size_t arg)
539
{
540
    int Status = -EINVAL;
541
    u32 i;
542
    u32 AdmNumber = 0;
543
    u32 TetrNumber = 0;
544
    u32 Address = 0;
545
    AMB_SET_DMA_CHANNEL MemDscr;
546
    PAMB_SET_DMA_CHANNEL pMemDscr = &MemDscr;
547
 
548
    down(&brd->m_BoardSem);
549
 
550
    // get the user buffer
551
    if( copy_from_user((void *)&MemDscr, (void *)arg, sizeof(AMB_SET_DMA_CHANNEL))) {
552
        err_msg(err_trace, "%s(): Error copy data from userspace\n", __FUNCTION__ );
553
        up(&brd->m_BoardSem);
554
        return -EFAULT;
555
    }
556
 
557
    if(pMemDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS)
558
    {
559
        printk("<0>IoctlSetSrcMem: too large stream number\n");
560
        up(&brd->m_BoardSem);
561
        return -EINVAL;
562
    }
563
 
564
    i = pMemDscr->DmaChanNum;
565
    AdmNumber = pMemDscr->Param >> 16;
566
    TetrNumber = pMemDscr->Param & 0xff;
567
    Address = AdmNumber * ADM_SIZE + TetrNumber * TETRAD_SIZE + TRDadr_DATA * REG_SIZE;
568
    SetDmaLocalAddress(brd->m_DmaChannel[i], Address);
569
    SetAdmTetr(brd->m_DmaChannel[i], AdmNumber, TetrNumber);
570
    Status = SetDmaMode(brd, i, AdmNumber, TetrNumber);
571
 
572
    up(&brd->m_BoardSem);
573
 
574
    return Status;
575
}
576
 
577
//--------------------------------------------------------------------
578
 
579
int ioctl_set_drq_mem(struct pex_device *brd, size_t arg)
580
{
581
    int Status = -EINVAL;
582
    u32 i;
583
    u32 AdmNum = 0;
584
    u32 TetrNum = 0;
585
    AMB_SET_DMA_CHANNEL MemDscr;
586
    PAMB_SET_DMA_CHANNEL pMemDscr = &MemDscr;
587
 
588
    down(&brd->m_BoardSem);
589
 
590
    //printk("<0>IoctlSetSrcMem: Entered.\n");
591
 
592
    // get the user buffer
593
    if( copy_from_user((void *)&MemDscr, (void *)arg, sizeof(AMB_SET_DMA_CHANNEL))) {
594
        err_msg(err_trace, "%s(): Error copy data from userspace\n", __FUNCTION__ );
595
        up(&brd->m_BoardSem);
596
        return -EFAULT;
597
    }
598
 
599
    if(pMemDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS)
600
    {
601
        printk("<0>IoctlSetDrqMem: too large stream number\n");
602
        up(&brd->m_BoardSem);
603
        return -EINVAL;
604
    }
605
 
606
    i = pMemDscr->DmaChanNum;
607
    AdmNum = GetAdmNum( brd->m_DmaChannel[i] );
608
    TetrNum = GetTetrNum( brd->m_DmaChannel[i] );
609
    Status = SetDrqFlag( brd, AdmNum, TetrNum, pMemDscr->Param );
610
 
611
    up(&brd->m_BoardSem);
612
 
613
    return Status;
614
}
615
 
616
//--------------------------------------------------------------------
617
 
618
int ioctl_adjust(struct pex_device *brd, size_t arg)
619
{
620
    u32 i;
621
    AMB_SET_DMA_CHANNEL MemDscr;
622
    PAMB_SET_DMA_CHANNEL pMemDscr = &MemDscr;
623
 
624
    down(&brd->m_BoardSem);
625
 
626
    //printk("<0>%s()\n", __FUNCTION__);
627
 
628
    if( copy_from_user((void *)&MemDscr, (void *)arg, sizeof(AMB_SET_DMA_CHANNEL))) {
629
        err_msg(err_trace, "%s(): Error copy data from userspace\n", __FUNCTION__ );
630
        up(&brd->m_BoardSem);
631
        return -EFAULT;
632
    }
633
 
634
    if(pMemDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS)
635
    {
636
        printk("<0>IoctlSetDrqMem: too large stream number\n");
637
        up(&brd->m_BoardSem);
638
        return -EINVAL;
639
    }
640
    if(!(brd->m_DmaChanMask & (1 << pMemDscr->DmaChanNum)))
641
    {
642
        printk("<0>%s(): invalid stream number\n", __FUNCTION__);
643
        up(&brd->m_BoardSem);
644
        return -EINVAL;
645
    }
646
 
647
    i = pMemDscr->DmaChanNum;
648
    Adjust(brd->m_DmaChannel[i], pMemDscr->Param);
649
 
650
    up(&brd->m_BoardSem);
651
 
652
    return 0;
653
}
654
 
655
//--------------------------------------------------------------------
656
 
657
int ioctl_done(struct pex_device *brd, size_t arg)
658
{
659
    int Status = -EINVAL;
660
    u32 i;
661
    u32 done_flag;
662
    AMB_SET_DMA_CHANNEL MemDscr;
663
    PAMB_SET_DMA_CHANNEL pMemDscr = &MemDscr;
664
 
665
    down(&brd->m_BoardSem);
666
 
667
    //printk("<0>%s()\n", __FUNCTION__);
668
 
669
    // get the user buffer
670
    if( copy_from_user((void *)&MemDscr, (void *)arg, sizeof(AMB_SET_DMA_CHANNEL))) {
671
        err_msg(err_trace, "%s(): Error copy data from userspace\n", __FUNCTION__ );
672
        up(&brd->m_BoardSem);
673
        return -EFAULT;
674
    }
675
 
676
    if(pMemDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS)
677
    {
678
        printk("<0>IoctlSetDrqMem: too large stream number\n");
679
        up(&brd->m_BoardSem);
680
        return -EINVAL;
681
    }
682
    if(!(brd->m_DmaChanMask & (1 << pMemDscr->DmaChanNum)))
683
    {
684
        printk("<0>%s(): invalid stream number\n", __FUNCTION__);
685
        up(&brd->m_BoardSem);
686
        return -EINVAL;
687
    }
688
 
689
    i = pMemDscr->DmaChanNum;
690
    done_flag = SetDoneBlock(brd->m_DmaChannel[i], pMemDscr->Param);
691
    if(done_flag)
692
        Status = Done(brd, i);
693
 
694
    up(&brd->m_BoardSem);
695
 
696
    return 0;
697
}
698
 
699
//--------------------------------------------------------------------
700
 
701
int ioctl_reset_fifo(struct pex_device *brd, size_t arg)
702
{
703
    int Status = -EINVAL;
704
    AMB_SET_DMA_CHANNEL MemDscr;
705
    PAMB_SET_DMA_CHANNEL pMemDscr = &MemDscr;
706
 
707
    down(&brd->m_BoardSem);
708
 
709
    // get the user buffer
710
    if( copy_from_user((void *)&MemDscr, (void *)arg, sizeof(AMB_SET_DMA_CHANNEL))) {
711
        err_msg(err_trace, "%s(): Error copy data from userspace\n", __FUNCTION__ );
712
        up(&brd->m_BoardSem);
713
        return -EFAULT;
714
    }
715
 
716
    if(pMemDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS)
717
    {
718
        printk("<0>%s(): too large stream number\n", __FUNCTION__);
719
        up(&brd->m_BoardSem);
720
        return -EINVAL;
721
    }
722
    if(!(brd->m_DmaChanMask & (1 << pMemDscr->DmaChanNum)))
723
    {
724
        printk("<0>%s(): invalid stream number\n", __FUNCTION__);
725
        up(&brd->m_BoardSem);
726
        return -EINVAL;
727
    }
728
 
729
    Status = ResetFifo(brd, pMemDscr->DmaChanNum);
730
 
731
    up(&brd->m_BoardSem);
732
 
733
    return Status;
734
}
735
 
736
//--------------------------------------------------------------------
737
 
738
int ioctl_get_dma_channel_info(struct pex_device *brd, size_t arg)
739
{
740
    AMB_GET_DMA_INFO DmaInfo = {0};
741
 
742
    down(&brd->m_BoardSem);
743
 
744
    // get the user buffer
745
    if( copy_from_user((void *)&DmaInfo, (void *)arg, sizeof(AMB_GET_DMA_INFO))) {
746
        err_msg(err_trace, "%s(): Error copy data from userspace\n", __FUNCTION__ );
747
        up(&brd->m_BoardSem);
748
        return -EFAULT;
749
    }
750
 
751
    if(DmaInfo.DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS)
752
    {
753
        printk("<0>%s(): too large stream number\n", __FUNCTION__);
754
        up(&brd->m_BoardSem);
755
        return -EINVAL;
756
    }
757
    if(!(brd->m_DmaChanMask & (1 << DmaInfo.DmaChanNum)))
758
    {
759
        printk("<0>%s(): invalid stream number\n", __FUNCTION__);
760
        up(&brd->m_BoardSem);
761
        return -EINVAL;
762
    }
763
 
764
    DmaInfo.Direction = brd->m_DmaDir[DmaInfo.DmaChanNum];
765
    DmaInfo.FifoSize = brd->m_DmaFifoSize[DmaInfo.DmaChanNum];
766
    DmaInfo.MaxDmaSize = brd->m_MaxDmaSize[DmaInfo.DmaChanNum];
767
 
768
    if(copy_to_user (( void *)arg, (void *)&DmaInfo, sizeof(AMB_GET_DMA_INFO))) {
769
                err_msg(err_trace, "%s(): Error copy data to userspace\n", __FUNCTION__ );
770
        up(&brd->m_BoardSem);
771
        return -EFAULT;
772
    }
773
 
774
    up(&brd->m_BoardSem);
775
 
776
    return 0;
777
}
778
 
779
//--------------------------------------------------------------------
780
 
781
int ioctl_wait_dma_buffer(struct pex_device *brd, size_t arg)
782
{
783
    int Status = -EINVAL;
784
    u32 i=0;
785
    AMB_STATE_DMA_CHANNEL StateDscr;
786
    PAMB_STATE_DMA_CHANNEL pStateDscr = &StateDscr;
787
 
788
    down ( &brd->m_BoardSem );
789
 
790
    // get the user buffer
791
    if( copy_from_user((void *)&StateDscr, (void *)arg, sizeof(AMB_STATE_DMA_CHANNEL))) {
792
                err_msg(err_trace, "%s(): Error copy data from userspace\n", __FUNCTION__ );
793
        up(&brd->m_BoardSem);
794
        return -EFAULT;
795
    }
796
 
797
    //printk("<0>%s(): DMA %d\n", __FUNCTION__, pStateDscr->DmaChanNum);
798
 
799
    if(pStateDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS)
800
    {
801
        printk("<0>%s(): too large stream number\n", __FUNCTION__);
802
        up(&brd->m_BoardSem);
803
        return -EINVAL;
804
    }
805
 
806
    i = pStateDscr->DmaChanNum;
807
 
808
    Status = WaitBufferEndEvent(brd->m_DmaChannel[i], pStateDscr->Timeout);
809
 
810
    GetState(brd->m_DmaChannel[i],      (u32*)&pStateDscr->BlockNum,
811
             (u32*)&pStateDscr->BlockCntTotal,
812
             (u32*)&pStateDscr->OffsetInBlock,
813
             (u32*)&pStateDscr->DmaChanState);
814
 
815
    if(copy_to_user (( void *)arg, (void *)&StateDscr, sizeof(AMB_STATE_DMA_CHANNEL))) {
816
                err_msg(err_trace, "%s(): Error copy data to userspace\n", __FUNCTION__ );
817
        up(&brd->m_BoardSem);
818
        return -EFAULT;
819
    }
820
 
821
    up(&brd->m_BoardSem);
822
 
823
    return Status;
824
}
825
 
826
//--------------------------------------------------------------------
827
 
828
int ioctl_wait_dma_block(struct pex_device *brd, size_t arg)
829
{
830
    int Status = -EINVAL;
831
    u32 i=0;
832
    AMB_STATE_DMA_CHANNEL StateDscr;
833
    PAMB_STATE_DMA_CHANNEL pStateDscr = &StateDscr;
834
 
835
    down ( &brd->m_BoardSem );
836
 
837
    // get the user buffer
838
    if( copy_from_user((void *)&StateDscr, (void *)arg, sizeof(AMB_STATE_DMA_CHANNEL))) {
839
        err_msg(err_trace, "%s(): Error copy data from userspace\n", __FUNCTION__ );
840
        up(&brd->m_BoardSem);
841
        return -EFAULT;
842
    }
843
 
844
    printk("<0>%s(): DMA %d\n", __FUNCTION__, pStateDscr->DmaChanNum);
845
 
846
    if(pStateDscr->DmaChanNum >= MAX_NUMBER_OF_DMACHANNELS)
847
    {
848
        printk("<0>%s(): too large stream number\n", __FUNCTION__);
849
        up(&brd->m_BoardSem);
850
        return -EINVAL;
851
    }
852
 
853
    i = pStateDscr->DmaChanNum;
854
 
855
    Status = WaitBlockEndEvent(brd->m_DmaChannel[i], pStateDscr->Timeout);
856
 
857
    GetState(brd->m_DmaChannel[i],      (u32*)&pStateDscr->BlockNum,
858
             (u32*)&pStateDscr->BlockCntTotal,
859
             (u32*)&pStateDscr->OffsetInBlock,
860
             (u32*)&pStateDscr->DmaChanState);
861
 
862
    if(copy_to_user (( void *)arg, (void *)&StateDscr, sizeof(AMB_STATE_DMA_CHANNEL))) {
863
        err_msg(err_trace, "%s(): Error copy data to userspace\n", __FUNCTION__ );
864
        up(&brd->m_BoardSem);
865
        return -EFAULT;
866
    }
867
 
868
    up(&brd->m_BoardSem);
869
 
870
    return Status;
871
}
872
 
873
//--------------------------------------------------------------------
874
 
875
 
876
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.