struct memregion;
struct memregion *visor_memregion_create(HOSTADDRESS physaddr, ulong nbytes);
-struct memregion *visor_memregion_create_overlapped(struct memregion *parent,
- ulong offset, ulong nbytes);
int visor_memregion_resize(struct memregion *memregion, ulong newsize);
int visor_memregion_read(struct memregion *memregion,
ulong offset, void *dest, ulong nbytes);
ulong nbytes;
void __iomem *mapped;
BOOL requested;
- BOOL overlapped;
};
static BOOL mapit(struct memregion *memregion);
memregion->physaddr = physaddr;
memregion->nbytes = nbytes;
- memregion->overlapped = FALSE;
if (!mapit(memregion)) {
rc = NULL;
goto cleanup;
}
EXPORT_SYMBOL_GPL(visor_memregion_create);
-struct memregion *
-visor_memregion_create_overlapped(struct memregion *parent, ulong offset,
- ulong nbytes)
-{
- struct memregion *memregion = NULL;
-
- if (parent == NULL)
- return NULL;
-
- if (parent->mapped == NULL)
- return NULL;
-
- if ((offset >= parent->nbytes) ||
- ((offset + nbytes) >= parent->nbytes))
- return NULL;
-
- memregion = kzalloc(sizeof(*memregion), GFP_KERNEL|__GFP_NORETRY);
- if (memregion == NULL)
- return NULL;
-
- memregion->physaddr = parent->physaddr + offset;
- memregion->nbytes = nbytes;
- memregion->mapped = ((u8 __iomem *)(parent->mapped)) + offset;
- memregion->requested = FALSE;
- memregion->overlapped = TRUE;
- return memregion;
-}
-EXPORT_SYMBOL_GPL(visor_memregion_create_overlapped);
-
static BOOL
mapit(struct memregion *memregion)
{
{
if (newsize == memregion->nbytes)
return 0;
- if (memregion->overlapped)
- /* no error check here - we no longer know the
- * parent's range!
- */
- memregion->nbytes = newsize;
- else {
- unmapit(memregion);
- memregion->nbytes = newsize;
- if (!mapit(memregion))
- return -EIO;
- }
+
+ unmapit(memregion);
+ memregion->nbytes = newsize;
+ if (!mapit(memregion))
+ return -EIO;
+
return 0;
}
EXPORT_SYMBOL_GPL(visor_memregion_resize);
{
if (!memregion)
return;
- if (!memregion->overlapped)
- unmapit(memregion);
+ unmapit(memregion);
kfree(memregion);
}
EXPORT_SYMBOL_GPL(visor_memregion_destroy);
-