| rev |
line source |
|
nengel@2
|
1 #include <spu_mfcio.h>
|
|
nengel@2
|
2 #include "h264_dma.h"
|
|
nengel@2
|
3
|
|
nengel@2
|
4 DECLARE_ALIGNED_16(dma_list_elem_t, put_list_buf[2*(52+26+26)]);
|
|
nengel@2
|
5 dma_list_elem_t* put_list;
|
|
nengel@2
|
6
|
|
nengel@2
|
7 DECLARE_ALIGNED_16(dma_list_elem_t, get_list_buf[16*(4+5 + 2*3)]);
|
|
nengel@2
|
8 dma_list_elem_t* get_list;
|
|
nengel@2
|
9
|
|
nengel@2
|
10 inline void spu_dma_get(void *ls, unsigned ea, int size, int tag){
|
|
nengel@2
|
11 mfc_get(ls, ea, size, tag, 0, 0);
|
|
nengel@2
|
12 }
|
|
nengel@2
|
13
|
|
nengel@2
|
14 inline void spu_dma_put(void *ls, unsigned ea, int size, int tag){
|
|
nengel@2
|
15 mfc_put(ls, ea, size, tag, 0, 0);
|
|
nengel@2
|
16 }
|
|
nengel@2
|
17
|
|
nengel@2
|
18 inline void spu_dma_barrier_put(void *ls, unsigned ea, int size, int tag){
|
|
nengel@2
|
19 mfc_putb(ls, ea, size, tag, 0, 0);
|
|
nengel@2
|
20 }
|
|
nengel@2
|
21
|
|
nengel@2
|
22 // Function that wait to finish a DMA transfer with especific id
|
|
nengel@2
|
23 inline void wait_dma_id(int id){
|
|
nengel@2
|
24 spu_writech(MFC_WrTagMask, 1<< id);
|
|
nengel@2
|
25 (void)spu_mfcstat(MFC_TAG_UPDATE_ALL);
|
|
nengel@2
|
26 }
|
|
nengel@2
|
27
|
|
nengel@2
|
28 // Functions to get/put a block from/to main memory
|
|
nengel@2
|
29 void get_dma_list(void *dst, void* ea, unsigned int w, unsigned int h, unsigned int stride, unsigned int tag, int barrier)
|
|
nengel@2
|
30 {
|
|
nengel@2
|
31 unsigned int i = 0;
|
|
nengel@2
|
32 unsigned int listsize;
|
|
nengel@2
|
33 unsigned int ea_low;
|
|
nengel@2
|
34
|
|
nengel@2
|
35 dma_list_elem_t* list = get_list;
|
|
nengel@2
|
36 get_list+=h;
|
|
nengel@2
|
37
|
|
nengel@2
|
38 ea_low=(uint32_t) mfc_ea2l(ea);
|
|
nengel@2
|
39
|
|
nengel@2
|
40 /* Create the list, size of each list id the "width" parameter defined by the user */
|
|
nengel@2
|
41 for ( i=0; i<h; i++ ){
|
|
nengel@2
|
42 list[i].size.all32 = w;
|
|
nengel@2
|
43 list[i].ea_low = ea_low;
|
|
nengel@2
|
44 ea_low += stride;
|
|
nengel@2
|
45 }
|
|
nengel@2
|
46 /* Specify the list size and initiate the list transfer */
|
|
nengel@2
|
47 listsize = h*sizeof(dma_list_elem_t);
|
|
nengel@2
|
48 if (barrier)
|
|
nengel@2
|
49 mfc_getlb(dst, (unsigned)ea, list, listsize, tag, 0, 0);
|
|
nengel@2
|
50 else
|
|
nengel@2
|
51 mfc_getl(dst, (unsigned)ea, list, listsize, tag, 0, 0);
|
|
nengel@2
|
52 }
|
|
nengel@2
|
53
|
|
nengel@2
|
54
|
|
nengel@2
|
55 void put_dma_list(void *src, void* ea, unsigned int size, unsigned int h, unsigned int stride, unsigned int tag){
|
|
nengel@2
|
56 unsigned int i = 0;
|
|
nengel@2
|
57 unsigned int listsize;
|
|
nengel@2
|
58 unsigned int ea_low;
|
|
nengel@2
|
59
|
|
nengel@2
|
60 dma_list_elem_t* list = put_list;
|
|
nengel@2
|
61 put_list+=h;
|
|
nengel@2
|
62
|
|
nengel@2
|
63 ea_low=(uint32_t) mfc_ea2l(ea);
|
|
nengel@2
|
64
|
|
nengel@2
|
65 /* Create the list, size of each list id the "width" parameter defined by the user */
|
|
nengel@2
|
66 for ( i=0; i<h; i++ ) {
|
|
nengel@2
|
67 list[i].size.all32 = size;
|
|
nengel@2
|
68 list[i].ea_low = ea_low;
|
|
nengel@2
|
69 ea_low += stride;
|
|
nengel@2
|
70 }
|
|
nengel@2
|
71 /* Specify the list size and initiate the list transfer */
|
|
nengel@2
|
72 listsize = h*sizeof(dma_list_elem_t);
|
|
nengel@2
|
73 mfc_putl(src, (unsigned) ea, list, listsize, tag, 0, 0);
|
|
nengel@2
|
74 }
|