staging: unisys: memregion: Eliminate visor_memregion_destroy()
[linux-drm-fsl-dcu.git] / drivers / staging / unisys / visorutil / memregion_direct.c
1 /* memregion_direct.c
2  *
3  * Copyright (C) 2010 - 2013 UNISYS CORPORATION
4  * All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or (at
9  * your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
14  * NON INFRINGEMENT.  See the GNU General Public License for more
15  * details.
16  */
17
18 /*
19  *  This is an implementation of memory regions that can be used to read/write
20  *  channel memory (in main memory of the host system) from code running in
21  *  a virtual partition.
22  */
23 #include "timskmod.h"
24 #include "memregion.h"
25
26 #define MYDRVNAME "memregion"
27
28 static int mapit(struct memregion *memregion);
29 static void unmapit(struct memregion *memregion);
30
31 static int
32 mapit(struct memregion *memregion)
33 {
34         ulong physaddr = (ulong)(memregion->physaddr);
35         ulong nbytes = memregion->nbytes;
36
37         if (!request_mem_region(physaddr, nbytes, MYDRVNAME))
38                 return -EBUSY;
39
40         memregion->mapped = ioremap_cache(physaddr, nbytes);
41         if (!memregion->mapped)
42                 return -EFAULT;
43
44         return 0;
45 }
46
47 static void
48 unmapit(struct memregion *memregion)
49 {
50         if (memregion->mapped) {
51                 iounmap(memregion->mapped);
52                 memregion->mapped = NULL;
53                 release_mem_region((unsigned long)memregion->physaddr,
54                                    memregion->nbytes);
55         }
56 }
57
58 HOSTADDRESS
59 visor_memregion_get_physaddr(struct memregion *memregion)
60 {
61         return memregion->physaddr;
62 }
63 EXPORT_SYMBOL_GPL(visor_memregion_get_physaddr);
64
65 ulong
66 visor_memregion_get_nbytes(struct memregion *memregion)
67 {
68         return memregion->nbytes;
69 }
70 EXPORT_SYMBOL_GPL(visor_memregion_get_nbytes);
71
72 void __iomem *
73 visor_memregion_get_pointer(struct memregion *memregion)
74 {
75         return memregion->mapped;
76 }
77 EXPORT_SYMBOL_GPL(visor_memregion_get_pointer);
78
79 int
80 visor_memregion_resize(struct memregion *memregion, ulong newsize)
81 {
82         int rc;
83
84         if (newsize == memregion->nbytes)
85                 return 0;
86
87         unmapit(memregion);
88         memregion->nbytes = newsize;
89         rc = mapit(memregion);
90
91         return rc;
92 }
93 EXPORT_SYMBOL_GPL(visor_memregion_resize);
94
95 int
96 visor_memregion_read(struct memregion *memregion, ulong offset, void *dest,
97                      ulong nbytes)
98 {
99         if (offset + nbytes > memregion->nbytes)
100                 return -EIO;
101
102         memcpy_fromio(dest, memregion->mapped + offset, nbytes);
103         return 0;
104 }
105 EXPORT_SYMBOL_GPL(visor_memregion_read);
106
107 int
108 visor_memregion_write(struct memregion *memregion, ulong offset, void *src,
109                       ulong nbytes)
110 {
111         if (offset + nbytes > memregion->nbytes)
112                 return -EIO;
113
114         memcpy_toio(memregion->mapped + offset, src, nbytes);
115         return 0;
116 }
117 EXPORT_SYMBOL_GPL(visor_memregion_write);