diff --git a/drivers/gpu/msm/adreno_a6xx.c b/drivers/gpu/msm/adreno_a6xx.c index 5d0dd684788c..4b26229932cd 100644 --- a/drivers/gpu/msm/adreno_a6xx.c +++ b/drivers/gpu/msm/adreno_a6xx.c @@ -2659,6 +2659,8 @@ static int a6xx_perfcounter_update(struct adreno_device *adreno_dev, struct cpu_gpu_lock *lock = ptr; u32 *data = ptr + sizeof(*lock); int i, offset = 0; + /* No of pairs to add: */ + u32 pending_pairs = adreno_is_a612(adreno_dev) ? 2 : 1; if (cpu_gpu_lock(lock)) { cpu_gpu_unlock(lock); @@ -2679,6 +2681,13 @@ static int a6xx_perfcounter_update(struct adreno_device *adreno_dev, offset += 2; } + /* Ensure there is enough space in the reglist buffer for new pairs */ + if ((offset + (pending_pairs * 2)) >= + (adreno_dev->pwrup_reglist.size / sizeof(u32))) { + cpu_gpu_unlock(lock); + return -ENOSPC; + } + /* * For a612 targets A6XX_RBBM_PERFCTR_CNTL needs to be the last entry, * so overwrite the existing A6XX_RBBM_PERFCNTL_CTRL and add it back to @@ -2688,7 +2697,7 @@ static int a6xx_perfcounter_update(struct adreno_device *adreno_dev, data[offset - 2] = reg->select; data[offset - 1] = reg->countable; - data[offset] = A6XX_RBBM_PERFCTR_CNTL, + data[offset] = A6XX_RBBM_PERFCTR_CNTL; data[offset + 1] = 1; } else { data[offset] = reg->select; diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index a17d164c07a0..51803d98b175 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2008-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */ #include @@ -318,6 +318,7 @@ static void kgsl_destroy_ion(struct kgsl_memdesc *memdesc) * doesn't try to free it again */ memdesc->sgt = NULL; + entry->priv_data = NULL; } static struct kgsl_memdesc_ops kgsl_dmabuf_ops = { @@ -4942,27 +4943,29 @@ static unsigned long _search_range(struct kgsl_process_private *private, return result; } +unsigned long kgsl_get_align(struct kgsl_memdesc *memdesc) +{ + u32 bit = kgsl_memdesc_get_align(memdesc); + + if (bit >= ilog2(SZ_2M)) + return SZ_2M; + else if (bit >= ilog2(SZ_1M)) + return SZ_1M; + else if (bit >= ilog2(SZ_64K)) + return SZ_64K; + + return PAGE_SIZE; +} + static unsigned long _get_svm_area(struct kgsl_process_private *private, struct kgsl_mem_entry *entry, unsigned long hint, unsigned long len, unsigned long flags) { uint64_t start, end; - int align_shift = kgsl_memdesc_get_align(&entry->memdesc); - uint64_t align; + unsigned long align = kgsl_get_align(&entry->memdesc); unsigned long result; unsigned long addr; - if (align_shift >= ilog2(SZ_2M)) - align = SZ_2M; - else if (align_shift >= ilog2(SZ_1M)) - align = SZ_1M; - else if (align_shift >= ilog2(SZ_64K)) - align = SZ_64K; - else - align = SZ_4K; - - align = max_t(uint64_t, align, PAGE_SIZE); - /* get the GPU pagetable's SVM range */ if (kgsl_mmu_svm_range(private->pagetable, &start, &end, entry->memdesc.flags)) diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h index f3691b6e165b..0dc906aa3d9e 100644 --- a/drivers/gpu/msm/kgsl.h +++ b/drivers/gpu/msm/kgsl.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2008-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */ #ifndef __KGSL_H #define __KGSL_H @@ -489,6 +489,8 @@ void kgsl_mmu_remove_global(struct kgsl_device *device, struct kgsl_memdesc *memdesc); /* Helper functions */ +unsigned long kgsl_get_align(struct kgsl_memdesc *memdesc); + int kgsl_request_irq(struct platform_device *pdev, const char *name, irq_handler_t handler, void *data); diff --git a/drivers/gpu/msm/kgsl_debugfs.c b/drivers/gpu/msm/kgsl_debugfs.c index 8a5fb7a350a6..2c28a0333970 100644 --- a/drivers/gpu/msm/kgsl_debugfs.c +++ b/drivers/gpu/msm/kgsl_debugfs.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2002,2008-2020, The Linux Foundation. All rights reserved. + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */ #include @@ -106,7 +107,7 @@ static const char *memtype_str(int memtype) static char get_alignflag(const struct kgsl_memdesc *m) { - int align = kgsl_memdesc_get_align(m); + u32 align = kgsl_memdesc_get_align(m); if (align >= ilog2(SZ_1M)) return 'L'; diff --git a/drivers/gpu/msm/kgsl_iommu.c b/drivers/gpu/msm/kgsl_iommu.c index dcf166395489..45c0e5c498e0 100644 --- a/drivers/gpu/msm/kgsl_iommu.c +++ b/drivers/gpu/msm/kgsl_iommu.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2011-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2022-2024, Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */ #include @@ -2528,8 +2528,7 @@ static int kgsl_iommu_get_gpuaddr(struct kgsl_pagetable *pagetable, size = kgsl_memdesc_footprint(memdesc); - align = max_t(uint64_t, 1 << kgsl_memdesc_get_align(memdesc), - PAGE_SIZE); + align = kgsl_get_align(memdesc); if (memdesc->flags & KGSL_MEMFLAGS_FORCE_32BIT) { start = pt->compat_va_start; diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index d884c01bd286..6aa270e0cc39 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2002,2007-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */ #include @@ -960,11 +960,16 @@ static int kgsl_shmem_alloc_page(struct page **pages, void kgsl_shmem_free_pages(struct kgsl_memdesc *memdesc) { - int i; + u32 i, n = 1; - for (i = 0; i < memdesc->page_count; i++) - if (memdesc->pages[i]) + for (i = 0; i < memdesc->page_count; i += n) { + n = 1; + + if (memdesc->pages[i]) { + n = 1 << compound_order(memdesc->pages[i]); put_page(memdesc->pages[i]); + } + } } static int kgsl_memdesc_file_setup(struct kgsl_memdesc *memdesc, uint64_t size) diff --git a/drivers/gpu/msm/kgsl_sharedmem.h b/drivers/gpu/msm/kgsl_sharedmem.h index 115e9e95acbe..2f9ff2b93a09 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.h +++ b/drivers/gpu/msm/kgsl_sharedmem.h @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2002, 2007-2020, The Linux Foundation. All rights reserved. + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */ #ifndef __KGSL_SHAREDMEM_H #define __KGSL_SHAREDMEM_H @@ -106,7 +107,7 @@ void kgsl_free_pages_from_sgt(struct kgsl_memdesc *memdesc); * * Returns the alignment requested, as power of 2 exponent. */ -static inline int +static inline u32 kgsl_memdesc_get_align(const struct kgsl_memdesc *memdesc) { return MEMFLAGS(memdesc->flags, KGSL_MEMALIGN_MASK,