1 /*
2 * Copyright (c) 2006-2022, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2017-08-24 chinesebear first version
9 */
10
11
12 #include "synopGMAC_plat.h"
13 #include "synopGMAC_Dev.h"
14 #include <rthw.h>
15 #include <rtthread.h>
16 extern void flush_cache(unsigned long start_addr, unsigned long size);
gmac_dmamap(unsigned long va,u32 size)17 dma_addr_t __attribute__((weak)) gmac_dmamap(unsigned long va,u32 size)
18 {
19 return VA_TO_PA (va);
20 //return UNCACHED_TO_PHYS(va);
21 }
22
23
24
25 /**
26 * This is a wrapper function for Memory allocation routine. In linux Kernel
27 * it it kmalloc function
28 * @param[in] bytes in bytes to allocate
29 */
30
plat_alloc_memory(u32 bytes)31 void *plat_alloc_memory(u32 bytes)
32 {
33 //return (void*)malloc((size_t)bytes, M_DEVBUF, M_DONTWAIT);
34 void *buf = (void*)rt_malloc((u32)bytes);
35
36 flush_cache((unsigned long)buf, bytes);
37 return buf;
38 }
39
40 /**
41 * This is a wrapper function for consistent dma-able Memory allocation routine.
42 * In linux Kernel, it depends on pci dev structure
43 * @param[in] bytes in bytes to allocate
44 */
45
46 //void *plat_alloc_consistent_dmaable_memory(struct synopGMACdevice *dev, u32 size, u32 *addr)
plat_alloc_consistent_dmaable_memory(synopGMACdevice * pcidev,u32 size,u32 * addr)47 void *plat_alloc_consistent_dmaable_memory(synopGMACdevice *pcidev, u32 size, u32 *addr)
48 {
49 void *buf;
50 buf = (void*)rt_malloc((u32)(size+16));
51 //CPU_IOFlushDCache( buf,size, SYNC_W);
52 unsigned long i = (unsigned long)buf;
53 // rt_kprintf("size = %d\n", size);
54 // rt_kprintf("bufaddr = %p\n", buf);
55 // rt_kprintf("i%%16 == %d\n", i%16);
56 if(i%16 == 8){
57 i += 8;
58 }
59 else if(i%16 == 4){
60 i += 12;
61 }
62 else if(i%16 == 12){
63 i += 4;
64 }
65
66 flush_cache(i, size);
67 *addr =gmac_dmamap(i, size);
68 buf = (unsigned char *)CACHED_TO_UNCACHED(i);
69 // rt_kprintf("bufaddr = %p\n", buf);
70 return buf;
71 }
72
73
74 /**
75 * This is a wrapper function for freeing consistent dma-able Memory.
76 * In linux Kernel, it depends on pci dev structure
77 * @param[in] bytes in bytes to allocate
78 */
79
80
81 //void plat_free_consistent_dmaable_memory(void * addr)
plat_free_consistent_dmaable_memory(synopGMACdevice * pcidev,u32 size,void * addr,u32 dma_addr)82 void plat_free_consistent_dmaable_memory(synopGMACdevice *pcidev, u32 size, void * addr,u32 dma_addr)
83 {
84 rt_free((void*)PHYS_TO_CACHED(UNCACHED_TO_PHYS(addr)));
85 return;
86 }
87
88
89
90 /**
91 * This is a wrapper function for Memory free routine. In linux Kernel
92 * it it kfree function
93 * @param[in] buffer pointer to be freed
94 */
plat_free_memory(void * buffer)95 void plat_free_memory(void *buffer)
96 {
97 rt_free(buffer);
98 return ;
99 }
100
101
102
plat_dma_map_single(void * hwdev,void * ptr,u32 size)103 dma_addr_t plat_dma_map_single(void *hwdev, void *ptr,
104 u32 size)
105 {
106 unsigned long addr = (unsigned long) ptr;
107 //CPU_IOFlushDCache(addr,size, direction);
108 flush_cache(addr, size);
109 return gmac_dmamap(addr, size);
110 }
111
112 /**
113 * This is a wrapper function for platform dependent delay
114 * Take care while passing the argument to this function
115 * @param[in] buffer pointer to be freed
116 */
plat_delay(u32 delay)117 void plat_delay(u32 delay)
118 {
119 while (delay--);
120 return;
121 }
122
123
124