19
19
#include <linux/fsldma.h>
20
20
#include <linux/interrupt.h>
21
21
#include <linux/highmem.h>
22
+ #include <linux/vmalloc.h>
22
23
#include <linux/kernel.h>
23
24
#include <linux/module.h>
24
25
#include <linux/mutex.h>
30
31
#include <linux/fs.h>
31
32
#include <linux/io.h>
32
33
33
- #include <media/videobuf-dma-sg.h>
34
-
35
34
/* MPC8349EMDS specific get_immrbase() */
36
35
#include <sysdev/fsl_soc.h>
37
36
@@ -67,14 +66,79 @@ struct fpga_dev {
67
66
/* FPGA Bitfile */
68
67
struct mutex lock ;
69
68
70
- struct videobuf_dmabuf vb ;
71
- bool vb_allocated ;
69
+ void * vaddr ;
70
+ struct scatterlist * sglist ;
71
+ int sglen ;
72
+ int nr_pages ;
73
+ bool buf_allocated ;
72
74
73
75
/* max size and written bytes */
74
76
size_t fw_size ;
75
77
size_t bytes ;
76
78
};
77
79
80
+ static int fpga_dma_init (struct fpga_dev * priv , int nr_pages )
81
+ {
82
+ struct page * pg ;
83
+ int i ;
84
+
85
+ priv -> vaddr = vmalloc_32 (nr_pages << PAGE_SHIFT );
86
+ if (NULL == priv -> vaddr ) {
87
+ pr_debug ("vmalloc_32(%d pages) failed\n" , nr_pages );
88
+ return - ENOMEM ;
89
+ }
90
+
91
+ pr_debug ("vmalloc is at addr 0x%08lx, size=%d\n" ,
92
+ (unsigned long )priv -> vaddr ,
93
+ nr_pages << PAGE_SHIFT );
94
+
95
+ memset (priv -> vaddr , 0 , nr_pages << PAGE_SHIFT );
96
+ priv -> nr_pages = nr_pages ;
97
+
98
+ priv -> sglist = vzalloc (priv -> nr_pages * sizeof (* priv -> sglist ));
99
+ if (NULL == priv -> sglist )
100
+ goto vzalloc_err ;
101
+
102
+ sg_init_table (priv -> sglist , priv -> nr_pages );
103
+ for (i = 0 ; i < priv -> nr_pages ; i ++ ) {
104
+ pg = vmalloc_to_page (priv -> vaddr + i * PAGE_SIZE );
105
+ if (NULL == pg )
106
+ goto vmalloc_to_page_err ;
107
+ sg_set_page (& priv -> sglist [i ], pg , PAGE_SIZE , 0 );
108
+ }
109
+ return 0 ;
110
+
111
+ vmalloc_to_page_err :
112
+ vfree (priv -> sglist );
113
+ priv -> sglist = NULL ;
114
+ vzalloc_err :
115
+ vfree (priv -> vaddr );
116
+ priv -> vaddr = NULL ;
117
+ return - ENOMEM ;
118
+ }
119
+
120
+ static int fpga_dma_map (struct fpga_dev * priv )
121
+ {
122
+ priv -> sglen = dma_map_sg (priv -> dev , priv -> sglist ,
123
+ priv -> nr_pages , DMA_TO_DEVICE );
124
+
125
+ if (0 == priv -> sglen ) {
126
+ pr_warn ("%s: dma_map_sg failed\n" , __func__ );
127
+ return - ENOMEM ;
128
+ }
129
+ return 0 ;
130
+ }
131
+
132
+ static int fpga_dma_unmap (struct fpga_dev * priv )
133
+ {
134
+ if (!priv -> sglen )
135
+ return 0 ;
136
+
137
+ dma_unmap_sg (priv -> dev , priv -> sglist , priv -> sglen , DMA_TO_DEVICE );
138
+ priv -> sglen = 0 ;
139
+ return 0 ;
140
+ }
141
+
78
142
/*
79
143
* FPGA Bitfile Helpers
80
144
*/
@@ -87,8 +151,9 @@ struct fpga_dev {
87
151
*/
88
152
static void fpga_drop_firmware_data (struct fpga_dev * priv )
89
153
{
90
- videobuf_dma_free (& priv -> vb );
91
- priv -> vb_allocated = false;
154
+ vfree (priv -> sglist );
155
+ vfree (priv -> vaddr );
156
+ priv -> buf_allocated = false;
92
157
priv -> bytes = 0 ;
93
158
}
94
159
@@ -427,7 +492,7 @@ static noinline int fpga_program_cpu(struct fpga_dev *priv)
427
492
dev_dbg (priv -> dev , "enabled the controller\n" );
428
493
429
494
/* Write each chunk of the FPGA bitfile to FPGA programmer */
430
- ret = fpga_program_block (priv , priv -> vb . vaddr , priv -> bytes );
495
+ ret = fpga_program_block (priv , priv -> vaddr , priv -> bytes );
431
496
if (ret )
432
497
goto out_disable_controller ;
433
498
@@ -463,7 +528,6 @@ static noinline int fpga_program_cpu(struct fpga_dev *priv)
463
528
*/
464
529
static noinline int fpga_program_dma (struct fpga_dev * priv )
465
530
{
466
- struct videobuf_dmabuf * vb = & priv -> vb ;
467
531
struct dma_chan * chan = priv -> chan ;
468
532
struct dma_async_tx_descriptor * tx ;
469
533
size_t num_pages , len , avail = 0 ;
@@ -505,7 +569,7 @@ static noinline int fpga_program_dma(struct fpga_dev *priv)
505
569
}
506
570
507
571
/* Map the buffer for DMA */
508
- ret = videobuf_dma_map (priv -> dev , & priv -> vb );
572
+ ret = fpga_dma_map (priv );
509
573
if (ret ) {
510
574
dev_err (priv -> dev , "Unable to map buffer for DMA\n" );
511
575
goto out_free_table ;
@@ -534,7 +598,7 @@ static noinline int fpga_program_dma(struct fpga_dev *priv)
534
598
/* setup and submit the DMA transaction */
535
599
536
600
tx = dmaengine_prep_dma_sg (chan , table .sgl , num_pages ,
537
- vb -> sglist , vb -> sglen , 0 );
601
+ priv -> sglist , priv -> sglen , 0 );
538
602
if (!tx ) {
539
603
dev_err (priv -> dev , "Unable to prep DMA transaction\n" );
540
604
ret = - ENOMEM ;
@@ -572,7 +636,7 @@ static noinline int fpga_program_dma(struct fpga_dev *priv)
572
636
out_disable_controller :
573
637
fpga_programmer_disable (priv );
574
638
out_dma_unmap :
575
- videobuf_dma_unmap (priv -> dev , vb );
639
+ fpga_dma_unmap (priv );
576
640
out_free_table :
577
641
sg_free_table (& table );
578
642
out_return :
@@ -702,20 +766,20 @@ static int fpga_open(struct inode *inode, struct file *filp)
702
766
priv -> bytes = 0 ;
703
767
704
768
/* Check if we have already allocated a buffer */
705
- if (priv -> vb_allocated )
769
+ if (priv -> buf_allocated )
706
770
return 0 ;
707
771
708
772
/* Allocate a buffer to hold enough data for the bitfile */
709
773
nr_pages = DIV_ROUND_UP (priv -> fw_size , PAGE_SIZE );
710
- ret = videobuf_dma_init_kernel ( & priv -> vb , DMA_TO_DEVICE , nr_pages );
774
+ ret = fpga_dma_init ( priv , nr_pages );
711
775
if (ret ) {
712
776
dev_err (priv -> dev , "unable to allocate data buffer\n" );
713
777
mutex_unlock (& priv -> lock );
714
778
kref_put (& priv -> ref , fpga_dev_remove );
715
779
return ret ;
716
780
}
717
781
718
- priv -> vb_allocated = true;
782
+ priv -> buf_allocated = true;
719
783
return 0 ;
720
784
}
721
785
@@ -738,7 +802,7 @@ static ssize_t fpga_write(struct file *filp, const char __user *buf,
738
802
return - ENOSPC ;
739
803
740
804
count = min_t (size_t , priv -> fw_size - priv -> bytes , count );
741
- if (copy_from_user (priv -> vb . vaddr + priv -> bytes , buf , count ))
805
+ if (copy_from_user (priv -> vaddr + priv -> bytes , buf , count ))
742
806
return - EFAULT ;
743
807
744
808
priv -> bytes += count ;
@@ -750,7 +814,7 @@ static ssize_t fpga_read(struct file *filp, char __user *buf, size_t count,
750
814
{
751
815
struct fpga_dev * priv = filp -> private_data ;
752
816
return simple_read_from_buffer (buf , count , f_pos ,
753
- priv -> vb . vaddr , priv -> bytes );
817
+ priv -> vaddr , priv -> bytes );
754
818
}
755
819
756
820
static loff_t fpga_llseek (struct file * filp , loff_t offset , int origin )
@@ -952,7 +1016,6 @@ static int fpga_of_probe(struct platform_device *op)
952
1016
priv -> dev = & op -> dev ;
953
1017
mutex_init (& priv -> lock );
954
1018
init_completion (& priv -> completion );
955
- videobuf_dma_init (& priv -> vb );
956
1019
957
1020
dev_set_drvdata (priv -> dev , priv );
958
1021
dma_cap_zero (mask );
0 commit comments