@ -38,9 +38,10 @@
# define _IOMMU_PRIV(_mmu) (&((_mmu)->priv.iommu))
# define ADDR_IN_GLOBAL(_a) \
( ( ( _a ) > = KGSL_IOMMU_GLOBAL_MEM_BASE ) & & \
( ( _a ) < ( KGSL_IOMMU_GLOBAL_MEM_BASE + KGSL_IOMMU_GLOBAL_MEM_SIZE ) ) )
# define ADDR_IN_GLOBAL(_mmu, _a) \
( ( ( _a ) > = KGSL_IOMMU_GLOBAL_MEM_BASE ( _mmu ) ) & & \
( ( _a ) < ( KGSL_IOMMU_GLOBAL_MEM_BASE ( _mmu ) + \
KGSL_IOMMU_GLOBAL_MEM_SIZE ) ) )
/*
* Flag to set SMMU memory attributes required to
@ -185,8 +186,8 @@ int kgsl_iommu_map_global_secure_pt_entry(struct kgsl_device *device,
struct kgsl_pagetable * pagetable = device - > mmu . securepagetable ;
entry - > pagetable = pagetable ;
entry - > gpuaddr = KGSL_IOMMU_SECURE_BASE + secure_global_size ;
entry - > gpuaddr = KGSL_IOMMU_SECURE_BASE ( & device - > mmu ) +
secure_global_size ;
ret = kgsl_mmu_map ( pagetable , entry ) ;
if ( ret = = 0 )
@ -225,7 +226,8 @@ static void kgsl_iommu_add_global(struct kgsl_mmu *mmu,
KGSL_IOMMU_GLOBAL_MEM_SIZE ) )
return ;
memdesc - > gpuaddr = KGSL_IOMMU_GLOBAL_MEM_BASE + global_pt_alloc ;
memdesc - > gpuaddr = KGSL_IOMMU_GLOBAL_MEM_BASE ( mmu ) + global_pt_alloc ;
memdesc - > priv | = KGSL_MEMDESC_GLOBAL ;
global_pt_alloc + = memdesc - > size ;
@ -643,7 +645,7 @@ static void _find_mem_entries(struct kgsl_mmu *mmu, uint64_t faultaddr,
/* Set the maximum possible size as an initial value */
nextentry - > gpuaddr = ( uint64_t ) - 1 ;
if ( ADDR_IN_GLOBAL ( faultaddr ) ) {
if ( ADDR_IN_GLOBAL ( mmu , faultaddr ) ) {
_get_global_entries ( faultaddr , preventry , nextentry ) ;
} else if ( context ) {
private = context - > proc_priv ;
@ -1034,13 +1036,13 @@ static void setup_64bit_pagetable(struct kgsl_mmu *mmu,
struct kgsl_iommu_pt * pt )
{
if ( mmu - > secured & & pagetable - > name = = KGSL_MMU_SECURE_PT ) {
pt - > compat_va_start = KGSL_IOMMU_SECURE_BASE ;
pt - > compat_va_end = KGSL_IOMMU_SECURE_END ;
pt - > va_start = KGSL_IOMMU_SECURE_BASE ;
pt - > va_end = KGSL_IOMMU_SECURE_END ;
pt - > compat_va_start = KGSL_IOMMU_SECURE_BASE ( mmu ) ;
pt - > compat_va_end = KGSL_IOMMU_SECURE_END ( mmu ) ;
pt - > va_start = KGSL_IOMMU_SECURE_BASE ( mmu ) ;
pt - > va_end = KGSL_IOMMU_SECURE_END ( mmu ) ;
} else {
pt - > compat_va_start = KGSL_IOMMU_SVM_BASE32 ;
pt - > compat_va_end = KGSL_IOMMU_SVM_END32 ;
pt - > compat_va_end = KGSL_IOMMU_SECURE_BASE ( mmu ) ;
pt - > va_start = KGSL_IOMMU_VA_BASE64 ;
pt - > va_end = KGSL_IOMMU_VA_END64 ;
}
@ -1049,7 +1051,7 @@ static void setup_64bit_pagetable(struct kgsl_mmu *mmu,
pagetable - > name ! = KGSL_MMU_SECURE_PT ) {
if ( ( BITS_PER_LONG = = 32 ) | | is_compat_task ( ) ) {
pt - > svm_start = KGSL_IOMMU_SVM_BASE32 ;
pt - > svm_end = KGSL_IOMMU_SVM_END32 ;
pt - > svm_end = KGSL_IOMMU_SECURE_BASE ( mmu ) ;
} else {
pt - > svm_start = KGSL_IOMMU_SVM_BASE64 ;
pt - > svm_end = KGSL_IOMMU_SVM_END64 ;
@ -1063,19 +1065,19 @@ static void setup_32bit_pagetable(struct kgsl_mmu *mmu,
{
if ( mmu - > secured ) {
if ( pagetable - > name = = KGSL_MMU_SECURE_PT ) {
pt - > compat_va_start = KGSL_IOMMU_SECURE_BASE ;
pt - > compat_va_end = KGSL_IOMMU_SECURE_END ;
pt - > va_start = KGSL_IOMMU_SECURE_BASE ;
pt - > va_end = KGSL_IOMMU_SECURE_END ;
pt - > compat_va_start = KGSL_IOMMU_SECURE_BASE ( mmu ) ;
pt - > compat_va_end = KGSL_IOMMU_SECURE_END ( mmu ) ;
pt - > va_start = KGSL_IOMMU_SECURE_BASE ( mmu ) ;
pt - > va_end = KGSL_IOMMU_SECURE_END ( mmu ) ;
} else {
pt - > va_start = KGSL_IOMMU_SVM_BASE32 ;
pt - > va_end = KGSL_IOMMU_SECURE_BASE ;
pt - > va_end = KGSL_IOMMU_SECURE_BASE ( mmu ) ;
pt - > compat_va_start = pt - > va_start ;
pt - > compat_va_end = pt - > va_end ;
}
} else {
pt - > va_start = KGSL_IOMMU_SVM_BASE32 ;
pt - > va_end = KGSL_IOMMU_GLOBAL_MEM_BASE ;
pt - > va_end = KGSL_IOMMU_GLOBAL_MEM_BASE ( mmu ) ;
pt - > compat_va_start = pt - > va_start ;
pt - > compat_va_end = pt - > va_end ;
}
@ -2385,7 +2387,8 @@ static int kgsl_iommu_set_svm_region(struct kgsl_pagetable *pagetable,
struct rb_node * node ;
/* Make sure the requested address doesn't fall in the global range */
if ( ADDR_IN_GLOBAL ( gpuaddr ) | | ADDR_IN_GLOBAL ( gpuaddr + size ) )
if ( ADDR_IN_GLOBAL ( pagetable - > mmu , gpuaddr ) | |
ADDR_IN_GLOBAL ( pagetable - > mmu , gpuaddr + size ) )
return - ENOMEM ;
spin_lock ( & pagetable - > lock ) ;