-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
omap iommu: simple virtual address space management
This patch provides a device drivers, which has a omap iommu, with address mapping APIs between device virtual address(iommu), physical address and MPU virtual address. There are 4 possible patterns for iommu virtual address(iova/da) mapping. |iova/ mapping iommu_ page | da pa va (d)-(p)-(v) function type --------------------------------------------------------------------------- 1 | c c c 1 - 1 - 1 _kmap() / _kunmap() s 2 | c c,a c 1 - 1 - 1 _kmalloc()/ _kfree() s 3 | c d c 1 - n - 1 _vmap() / _vunmap() s 4 | c d,a c 1 - n - 1 _vmalloc()/ _vfree() n* 'iova': device iommu virtual address 'da': alias of 'iova' 'pa': physical address 'va': mpu virtual address 'c': contiguous memory area 'd': dicontiguous memory area 'a': anonymous memory allocation '()': optional feature 'n': a normal page(4KB) size is used. 's': multiple iommu superpage(16MB, 1MB, 64KB, 4KB) size is used. '*': not yet, but feasible. Signed-off-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
- Loading branch information
Hiroshi DOYU
authored and
Hiroshi DOYU
committed
May 19, 2009
1 parent
066aa9c
commit 69d3a84
Showing
5 changed files
with
1,005 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
/* | ||
* omap iommu: simple virtual address space management | ||
* | ||
* Copyright (C) 2008-2009 Nokia Corporation | ||
* | ||
* Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#ifndef __IOMMU_MMAP_H | ||
#define __IOMMU_MMAP_H | ||
|
||
struct iovm_struct { | ||
struct iommu *iommu; /* iommu object which this belongs to */ | ||
u32 da_start; /* area definition */ | ||
u32 da_end; | ||
u32 flags; /* IOVMF_: see below */ | ||
struct list_head list; /* linked in ascending order */ | ||
const struct sg_table *sgt; /* keep 'page' <-> 'da' mapping */ | ||
void *va; /* mpu side mapped address */ | ||
}; | ||
|
||
/* | ||
* IOVMF_FLAGS: attribute for iommu virtual memory area(iovma) | ||
* | ||
* lower 16 bit is used for h/w and upper 16 bit is for s/w. | ||
*/ | ||
#define IOVMF_SW_SHIFT 16 | ||
#define IOVMF_HW_SIZE (1 << IOVMF_SW_SHIFT) | ||
#define IOVMF_HW_MASK (IOVMF_HW_SIZE - 1) | ||
#define IOVMF_SW_MASK (~IOVMF_HW_MASK)UL | ||
|
||
/* | ||
* iovma: h/w flags derived from cam and ram attribute | ||
*/ | ||
#define IOVMF_CAM_MASK (~((1 << 10) - 1)) | ||
#define IOVMF_RAM_MASK (~IOVMF_CAM_MASK) | ||
|
||
#define IOVMF_PGSZ_MASK (3 << 0) | ||
#define IOVMF_PGSZ_1M MMU_CAM_PGSZ_1M | ||
#define IOVMF_PGSZ_64K MMU_CAM_PGSZ_64K | ||
#define IOVMF_PGSZ_4K MMU_CAM_PGSZ_4K | ||
#define IOVMF_PGSZ_16M MMU_CAM_PGSZ_16M | ||
|
||
#define IOVMF_ENDIAN_MASK (1 << 9) | ||
#define IOVMF_ENDIAN_BIG MMU_RAM_ENDIAN_BIG | ||
#define IOVMF_ENDIAN_LITTLE MMU_RAM_ENDIAN_LITTLE | ||
|
||
#define IOVMF_ELSZ_MASK (3 << 7) | ||
#define IOVMF_ELSZ_8 MMU_RAM_ELSZ_8 | ||
#define IOVMF_ELSZ_16 MMU_RAM_ELSZ_16 | ||
#define IOVMF_ELSZ_32 MMU_RAM_ELSZ_32 | ||
#define IOVMF_ELSZ_NONE MMU_RAM_ELSZ_NONE | ||
|
||
#define IOVMF_MIXED_MASK (1 << 6) | ||
#define IOVMF_MIXED MMU_RAM_MIXED | ||
|
||
/* | ||
* iovma: s/w flags, used for mapping and umapping internally. | ||
*/ | ||
#define IOVMF_MMIO (1 << IOVMF_SW_SHIFT) | ||
#define IOVMF_ALLOC (2 << IOVMF_SW_SHIFT) | ||
#define IOVMF_ALLOC_MASK (3 << IOVMF_SW_SHIFT) | ||
|
||
/* "superpages" is supported just with physically linear pages */ | ||
#define IOVMF_DISCONT (1 << (2 + IOVMF_SW_SHIFT)) | ||
#define IOVMF_LINEAR (2 << (2 + IOVMF_SW_SHIFT)) | ||
#define IOVMF_LINEAR_MASK (3 << (2 + IOVMF_SW_SHIFT)) | ||
|
||
#define IOVMF_DA_FIXED (1 << (4 + IOVMF_SW_SHIFT)) | ||
#define IOVMF_DA_ANON (2 << (4 + IOVMF_SW_SHIFT)) | ||
#define IOVMF_DA_MASK (3 << (4 + IOVMF_SW_SHIFT)) | ||
|
||
|
||
extern struct iovm_struct *find_iovm_area(struct iommu *obj, u32 da); | ||
extern u32 iommu_vmap(struct iommu *obj, u32 da, | ||
const struct sg_table *sgt, u32 flags); | ||
extern struct sg_table *iommu_vunmap(struct iommu *obj, u32 da); | ||
extern u32 iommu_vmalloc(struct iommu *obj, u32 da, size_t bytes, | ||
u32 flags); | ||
extern void iommu_vfree(struct iommu *obj, const u32 da); | ||
extern u32 iommu_kmap(struct iommu *obj, u32 da, u32 pa, size_t bytes, | ||
u32 flags); | ||
extern void iommu_kunmap(struct iommu *obj, u32 da); | ||
extern u32 iommu_kmalloc(struct iommu *obj, u32 da, size_t bytes, | ||
u32 flags); | ||
extern void iommu_kfree(struct iommu *obj, u32 da); | ||
|
||
extern void *da_to_va(struct iommu *obj, u32 da); | ||
|
||
#endif /* __IOMMU_MMAP_H */ |
Oops, something went wrong.