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