1 /* Memory manager interface */
2 #include <stdio.h>
3 #include <sys/ioctl.h>
4 #include <sys/types.h>
5 #include <sys/mman.h> /* mlock */
6 #include <errno.h>
7 #include <unistd.h>
8 #include <fcntl.h>
9 #include "libdha.h"
10 #include "kernelhelper/dhahelper.h"
11
12 static int libdha_fd=-1;
13
14 #define ALLOWED_VER 0x10
bm_open(void)15 int bm_open( void )
16 {
17 int retv;
18 libdha_fd = open("/dev/dhahelper",O_RDWR);
19 retv = libdha_fd > 0 ? 0 : ENXIO;
20 if(!retv)
21 {
22 int ver;
23 ioctl(libdha_fd,DHAHELPER_GET_VERSION,&ver);
24 if(ver < ALLOWED_VER)
25 {
26 printf("libdha: You have wrong version (%i) of /dev/dhahelper\n"
27 "libdha: Please upgrade your driver up to ver=%i\n",ver,ALLOWED_VER);
28 retv = EINVAL;
29 close(libdha_fd);
30 }
31 }
32 else printf("libdha: Can't open /dev/dhahelper\n");
33 return retv;
34 }
35
bm_close(void)36 void bm_close( void )
37 {
38 close(libdha_fd);
39 }
40
bm_virt_to_phys(void * virt_addr,unsigned long length,unsigned long * parray)41 int bm_virt_to_phys( void * virt_addr, unsigned long length, unsigned long * parray )
42 {
43 dhahelper_vmi_t vmi;
44 vmi.virtaddr = virt_addr;
45 vmi.length = length;
46 vmi.realaddr = parray;
47 if(libdha_fd > 0) return ioctl(libdha_fd,DHAHELPER_VIRT_TO_PHYS,&vmi);
48 return ENXIO;
49 }
50
bm_virt_to_bus(void * virt_addr,unsigned long length,unsigned long * barray)51 int bm_virt_to_bus( void * virt_addr, unsigned long length, unsigned long * barray )
52 {
53 dhahelper_vmi_t vmi;
54 vmi.virtaddr = virt_addr;
55 vmi.length = length;
56 vmi.realaddr = barray;
57 if(libdha_fd > 0) return ioctl(libdha_fd,DHAHELPER_VIRT_TO_BUS,&vmi);
58 return ENXIO;
59 }
60
bm_alloc_pci_shmem(pciinfo_t * pi,unsigned mem_bitness,unsigned long length,int op)61 void * bm_alloc_pci_shmem(pciinfo_t *pi, unsigned mem_bitness, unsigned long length,int op )
62 {
63 printf("libdha: Pure virtual function call - bm_alloc_pci_shmem()\n");
64 #if 0
65 dhahelper_mem_t vmi;
66 vmi.length = length;
67 if(libdha_fd > 0)
68 {
69 if(ioctl(libdha_fd,DHAHELPER_ALLOC_PA,&vmi) == 0)
70 return vmi.addr;
71 }
72 #else
73 (void)pi;
74 (void)mem_bitness;
75 (void)length;
76 (void)op;
77 #endif
78 return NULL;
79 }
80
bm_free_pci_shmem(void * pci_shmem)81 void bm_free_pci_shmem(void * pci_shmem)
82 {
83 printf("libdha: Pure virtual function call - bm_free_pci_shmem()\n");
84 #if 0
85 dhahelper_mem_t vmi;
86 vmi.addr = virt_addr;
87 vmi.length = length;
88 if(libdha_fd > 0)
89 {
90 ioctl(libdha_fd,DHAHELPER_FREE_PA,&vmi);
91 }
92 #else
93 (void)pci_shmem;
94 #endif
95 }
96
bm_lock_mem(const void * addr,unsigned long length)97 int bm_lock_mem( const void *addr, unsigned long length )
98 {
99 dhahelper_mem_t vmi;
100 vmi.addr = (void *) addr;
101 vmi.length = length;
102 if(libdha_fd > 0)
103 {
104 return ioctl(libdha_fd,DHAHELPER_LOCK_MEM,&vmi);
105 }
106 return mlock(addr,length);
107 }
108
bm_unlock_mem(const void * addr,unsigned long length)109 int bm_unlock_mem( const void * addr, unsigned long length )
110 {
111 dhahelper_mem_t vmi;
112 vmi.addr = (void *) addr;
113 vmi.length = length;
114 if(libdha_fd > 0)
115 {
116 return ioctl(libdha_fd,DHAHELPER_UNLOCK_MEM,&vmi);
117 }
118 return munlock(addr,length);
119 }
120