aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-09-18 23:43:37 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-09-18 23:43:37 -0700
commitb4fc64fdfed398aaff5d6e0e3084b2b661bb5ade (patch)
tree01f7b383c527a37588fbaadd8c1620ca72c8fb15
parent5a5ae9fb795b0ad3bfc0c897f6ea67edf937b9ea (diff)
parenta00a642c254ed167d5e4992aa7d37f7d823675e4 (diff)
Merge "msm: kgsl: Make the "scratch" global buffer use a random GPU address"LA.UM.6.8.1.c1-02600-QCS605.0
-rw-r--r--drivers/gpu/msm/adreno_ringbuffer.c2
-rw-r--r--drivers/gpu/msm/kgsl.h4
-rw-r--r--drivers/gpu/msm/kgsl_iommu.c25
3 files changed, 25 insertions, 6 deletions
diff --git a/drivers/gpu/msm/adreno_ringbuffer.c b/drivers/gpu/msm/adreno_ringbuffer.c
index d548d71fc2fb..bff977d967f5 100644
--- a/drivers/gpu/msm/adreno_ringbuffer.c
+++ b/drivers/gpu/msm/adreno_ringbuffer.c
@@ -321,7 +321,7 @@ int adreno_ringbuffer_probe(struct adreno_device *adreno_dev, bool nopreempt)
if (!adreno_is_a3xx(adreno_dev)) {
status = kgsl_allocate_global(device, &device->scratch,
- PAGE_SIZE, 0, 0, "scratch");
+ PAGE_SIZE, 0, KGSL_MEMDESC_RANDOM, "scratch");
if (status != 0)
return status;
}
diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h
index 1fa27175064e..b9f5017fac77 100644
--- a/drivers/gpu/msm/kgsl.h
+++ b/drivers/gpu/msm/kgsl.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2008-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -197,6 +197,8 @@ struct kgsl_memdesc_ops {
#define KGSL_MEMDESC_TZ_LOCKED BIT(7)
/* The memdesc is allocated through contiguous memory */
#define KGSL_MEMDESC_CONTIG BIT(8)
+/* For global buffers, randomly assign an address from the region */
+#define KGSL_MEMDESC_RANDOM BIT(9)
/**
* struct kgsl_memdesc - GPU memory object descriptor
diff --git a/drivers/gpu/msm/kgsl_iommu.c b/drivers/gpu/msm/kgsl_iommu.c
index 06f600da6828..d023170a5de4 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 <linux/compat.h>
@@ -224,7 +225,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)
@@ -233,10 +234,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 =