diff options
author | Jordan Crouse <jcrouse@codeaurora.org> | 2019-09-11 08:32:15 -0600 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2019-09-24 04:49:23 -0700 |
commit | 422ae191fb859f57cfa237a7e7a563624838cd94 (patch) | |
tree | 77313bcd7c34dd99a5dc1b7164ca890f216f86d1 | |
parent | d6374babf93f357698e979bf74f2e0e97ad619d3 (diff) |
msm: kgsl: Make the "scratch" global buffer use a random GPU addressLE.UM.2.3.2-08300-SDX24
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>
Signed-off-by: Deepak Kumar <dkumar@codeaurora.org>
Signed-off-by: Rajesh Kemisetti <rajeshk@codeaurora.org>
-rw-r--r-- | drivers/gpu/msm/adreno_ringbuffer.c | 2 | ||||
-rw-r--r-- | drivers/gpu/msm/kgsl.h | 4 | ||||
-rw-r--r-- | drivers/gpu/msm/kgsl_iommu.c | 25 |
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 = |