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