summaryrefslogtreecommitdiff
path: root/drivers/gpu/msm/kgsl_iommu.c
diff options
context:
space:
mode:
authorJordan Crouse <jcrouse@codeaurora.org>2019-09-11 08:32:15 -0600
committerGerrit - the friendly Code Review server <code-review@localhost>2019-09-17 02:18:24 -0700
commit5ffb9e5b7a80805f6e6c504cdd1d70d6411b51ab (patch)
tree85a5117ccf7de1adf4eb647598ac6ce86869da33 /drivers/gpu/msm/kgsl_iommu.c
parent19f118bcf52ba3ee9d9e89ca1e6ad01215e245ac (diff)
msm: kgsl: Make the "scratch" global buffer use a random GPU address
Select a random global GPU address for the "scratch" buffer that is used by the ringbuffer for various tasks. Change-Id: Ic0dedbaddda71dbf9cb2adab3c6c33a24d6a604c Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org> Signed-off-by: Harshitha Sai Neelati <hsaine@codeaurora.org>
Diffstat (limited to 'drivers/gpu/msm/kgsl_iommu.c')
-rw-r--r--drivers/gpu/msm/kgsl_iommu.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/drivers/gpu/msm/kgsl_iommu.c b/drivers/gpu/msm/kgsl_iommu.c
index 30f7c9543e38..ffab5423d694 100644
--- a/drivers/gpu/msm/kgsl_iommu.c
+++ b/drivers/gpu/msm/kgsl_iommu.c
@@ -20,6 +20,7 @@
#include <linux/msm_kgsl.h>
#include <linux/ratelimit.h>
#include <linux/of_platform.h>
+#include <linux/random.h>
#include <soc/qcom/scm.h>
#include <soc/qcom/secure_buffer.h>
#include <stddef.h>
@@ -198,7 +199,7 @@ static void kgsl_iommu_remove_global(struct kgsl_mmu *mmu,
static void kgsl_iommu_add_global(struct kgsl_mmu *mmu,
struct kgsl_memdesc *memdesc, const char *name)
{
- int bit;
+ u32 bit, start = 0;
u64 size = kgsl_memdesc_footprint(memdesc);
if (memdesc->gpuaddr != 0)
@@ -207,10 +208,26 @@ static void kgsl_iommu_add_global(struct kgsl_mmu *mmu,
if (WARN_ON(global_pt_count >= GLOBAL_PT_ENTRIES))
return;
- bit = bitmap_find_next_zero_area(global_map, GLOBAL_MAP_PAGES,
- 0, size >> PAGE_SHIFT, 0);
+ if (WARN_ON(size > KGSL_IOMMU_GLOBAL_MEM_SIZE))
+ return;
+
+ if (memdesc->priv & KGSL_MEMDESC_RANDOM) {
+ u32 range = GLOBAL_MAP_PAGES - (size >> PAGE_SHIFT);
+
+ start = get_random_int() % range;
+ }
+
+ while (start >= 0) {
+ bit = bitmap_find_next_zero_area(global_map, GLOBAL_MAP_PAGES,
+ start, size >> PAGE_SHIFT, 0);
+
+ if (bit < GLOBAL_MAP_PAGES)
+ break;
+
+ start--;
+ }
- if (WARN_ON(bit >= GLOBAL_MAP_PAGES))
+ if (WARN_ON(start < 0))
return;
memdesc->gpuaddr =