diff options
Diffstat (limited to 'firmware/target/mips/ingenic_jz47xx/dma_acc-jz4760.c')
-rw-r--r-- | firmware/target/mips/ingenic_jz47xx/dma_acc-jz4760.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/firmware/target/mips/ingenic_jz47xx/dma_acc-jz4760.c b/firmware/target/mips/ingenic_jz47xx/dma_acc-jz4760.c new file mode 100644 index 0000000000..4cdea2ad08 --- /dev/null +++ b/firmware/target/mips/ingenic_jz47xx/dma_acc-jz4760.c | |||
@@ -0,0 +1,102 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2016 by Roman Stolyarov | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | #include "dma-target.h" | ||
23 | |||
24 | #define MDMA_CHANNEL 0 | ||
25 | |||
26 | void memset_dma(void *target, int c, size_t len, unsigned int bits) | ||
27 | { | ||
28 | unsigned int d; | ||
29 | unsigned char *dp; | ||
30 | |||
31 | if(((unsigned int)target < 0xa0000000) && len) | ||
32 | dma_cache_wback_inv((unsigned long)target, len); | ||
33 | |||
34 | dp = (unsigned char *)((unsigned int)(&d) | 0xa0000000); | ||
35 | *(dp + 0) = c; | ||
36 | *(dp + 1) = c; | ||
37 | *(dp + 2) = c; | ||
38 | *(dp + 3) = c; | ||
39 | |||
40 | REG_MDMAC_DCCSR(MDMA_CHANNEL) = 0; | ||
41 | REG_MDMAC_DSAR(MDMA_CHANNEL) = PHYSADDR((unsigned long)dp); | ||
42 | REG_MDMAC_DTAR(MDMA_CHANNEL) = PHYSADDR((unsigned long)target); | ||
43 | REG_MDMAC_DRSR(MDMA_CHANNEL) = DMAC_DRSR_RS_AUTO; | ||
44 | switch (bits) | ||
45 | { | ||
46 | case 8: | ||
47 | REG_MDMAC_DTCR(MDMA_CHANNEL) = len; | ||
48 | REG_MDMAC_DCMD(MDMA_CHANNEL) = DMAC_DCMD_DAI | DMAC_DCMD_SWDH_8 | DMAC_DCMD_DWDH_8 | DMAC_DCMD_DS_8BIT; | ||
49 | break; | ||
50 | case 16: | ||
51 | REG_MDMAC_DTCR(MDMA_CHANNEL) = len / 2; | ||
52 | REG_MDMAC_DCMD(MDMA_CHANNEL) = DMAC_DCMD_DAI | DMAC_DCMD_SWDH_16 | DMAC_DCMD_DWDH_16 | DMAC_DCMD_DS_16BIT; | ||
53 | break; | ||
54 | case 32: | ||
55 | REG_MDMAC_DTCR(MDMA_CHANNEL) = len / 4; | ||
56 | REG_MDMAC_DCMD(MDMA_CHANNEL) = DMAC_DCMD_DAI | DMAC_DCMD_SWDH_32 | DMAC_DCMD_DWDH_32 | DMAC_DCMD_DS_32BIT; | ||
57 | break; | ||
58 | default: | ||
59 | return; | ||
60 | } | ||
61 | REG_MDMAC_DCCSR(MDMA_CHANNEL) = DMAC_DCCSR_EN | DMAC_DCCSR_NDES; | ||
62 | |||
63 | while (REG_MDMAC_DTCR(MDMA_CHANNEL)); | ||
64 | |||
65 | REG_MDMAC_DCCSR(MDMA_CHANNEL) = 0; | ||
66 | } | ||
67 | |||
68 | void memcpy_dma(void *target, const void *source, size_t len, unsigned int bits) | ||
69 | { | ||
70 | if(((unsigned int)source < 0xa0000000) && len) | ||
71 | dma_cache_wback_inv((unsigned long)source, len); | ||
72 | |||
73 | if(((unsigned int)target < 0xa0000000) && len) | ||
74 | dma_cache_wback_inv((unsigned long)target, len); | ||
75 | |||
76 | REG_MDMAC_DCCSR(MDMA_CHANNEL) = 0; | ||
77 | REG_MDMAC_DSAR(MDMA_CHANNEL) = PHYSADDR((unsigned long)source); | ||
78 | REG_MDMAC_DTAR(MDMA_CHANNEL) = PHYSADDR((unsigned long)target); | ||
79 | REG_MDMAC_DRSR(MDMA_CHANNEL) = DMAC_DRSR_RS_AUTO; | ||
80 | switch (bits) | ||
81 | { | ||
82 | case 8: | ||
83 | REG_MDMAC_DTCR(MDMA_CHANNEL) = len; | ||
84 | REG_MDMAC_DCMD(MDMA_CHANNEL) = DMAC_DCMD_SAI | DMAC_DCMD_DAI | DMAC_DCMD_SWDH_8 | DMAC_DCMD_DWDH_8 | DMAC_DCMD_DS_8BIT; | ||
85 | break; | ||
86 | case 16: | ||
87 | REG_MDMAC_DTCR(MDMA_CHANNEL) = len / 2; | ||
88 | REG_MDMAC_DCMD(MDMA_CHANNEL) = DMAC_DCMD_SAI | DMAC_DCMD_DAI | DMAC_DCMD_SWDH_16 | DMAC_DCMD_DWDH_16 | DMAC_DCMD_DS_16BIT; | ||
89 | break; | ||
90 | case 32: | ||
91 | REG_MDMAC_DTCR(MDMA_CHANNEL) = len / 4; | ||
92 | REG_MDMAC_DCMD(MDMA_CHANNEL) = DMAC_DCMD_SAI | DMAC_DCMD_DAI | DMAC_DCMD_SWDH_32 | DMAC_DCMD_DWDH_32 | DMAC_DCMD_DS_32BIT; | ||
93 | break; | ||
94 | default: | ||
95 | return; | ||
96 | } | ||
97 | REG_MDMAC_DCCSR(MDMA_CHANNEL) = DMAC_DCCSR_EN | DMAC_DCCSR_NDES; | ||
98 | |||
99 | while (REG_MDMAC_DTCR(MDMA_CHANNEL)); | ||
100 | |||
101 | REG_MDMAC_DCCSR(MDMA_CHANNEL) = 0; | ||
102 | } | ||