Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7d8ab1b2 authored by Jordan Crouse's avatar Jordan Crouse
Browse files

msm: kgsl: Correctly expand memory flag masks to 64 bit



For legacy reasons some of the MEMFLAG bits and masks are not marked
as ULL in the user API and they end up getting applied incorrectly
when used as inverse masks in the driver. Cast to uint64_t directly
before using to avoid losing bits.

Change-Id: Ic0dedbad3aad81533cda73c2f72473b1f01f6d8d
Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
parent c2b86fa6
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -2386,7 +2386,7 @@ static int kgsl_setup_dma_buf(struct kgsl_device *device,
	entry->memdesc.size = 0;
	entry->memdesc.mmapsize = 0;
	/* USE_CPU_MAP is not impemented for ION. */
	entry->memdesc.flags &= ~KGSL_MEMFLAGS_USE_CPU_MAP;
	entry->memdesc.flags &= ~((uint64_t) KGSL_MEMFLAGS_USE_CPU_MAP);
	entry->memdesc.flags |= KGSL_MEMFLAGS_USERMEM_ION;

	sg_table = dma_buf_map_attachment(attach, DMA_TO_DEVICE);
@@ -2483,10 +2483,11 @@ long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv,
			| KGSL_MEMALIGN_MASK
			| KGSL_MEMFLAGS_USE_CPU_MAP
			| KGSL_MEMFLAGS_SECURE;
	entry->memdesc.flags = param->flags | KGSL_MEMFLAGS_FORCE_32BIT;
	entry->memdesc.flags = ((uint64_t) param->flags)
		| KGSL_MEMFLAGS_FORCE_32BIT;

	if (!kgsl_mmu_use_cpu_map(&dev_priv->device->mmu))
		entry->memdesc.flags &= ~KGSL_MEMFLAGS_USE_CPU_MAP;
		entry->memdesc.flags &= ~((uint64_t) KGSL_MEMFLAGS_USE_CPU_MAP);

	if (kgsl_mmu_get_mmutype() == KGSL_MMU_TYPE_IOMMU)
		entry->memdesc.priv |= KGSL_MEMDESC_GUARD_PAGE;
@@ -2865,7 +2866,7 @@ static uint64_t kgsl_filter_cachemode(uint64_t flags)
	 */
	if ((flags & KGSL_CACHEMODE_MASK) >> KGSL_CACHEMODE_SHIFT ==
					KGSL_CACHEMODE_WRITETHROUGH) {
		flags &= ~KGSL_CACHEMODE_MASK;
		flags &= ~((uint64_t) KGSL_CACHEMODE_MASK);
		flags |= (KGSL_CACHEMODE_WRITEBACK << KGSL_CACHEMODE_SHIFT) &
							KGSL_CACHEMODE_MASK;
	}
@@ -2900,7 +2901,7 @@ static struct kgsl_mem_entry *gpumem_alloc_entry(

	/* Turn off SVM if the system doesn't support it */
	if (!kgsl_mmu_use_cpu_map(&dev_priv->device->mmu))
		flags &= ~KGSL_MEMFLAGS_USE_CPU_MAP;
		flags &= ~((uint64_t) KGSL_MEMFLAGS_USE_CPU_MAP);

	/* Return not supported error if secure memory isn't enabled */
	if (!kgsl_mmu_is_secured(&dev_priv->device->mmu) &&
@@ -2912,8 +2913,7 @@ static struct kgsl_mem_entry *gpumem_alloc_entry(

	/* Secure memory disables advanced addressing modes */
	if (flags & KGSL_MEMFLAGS_SECURE)
		flags &= ~(KGSL_MEMFLAGS_USE_CPU_MAP
			   | KGSL_MEMFLAGS_FORCE_32BIT);
		flags &= ~((uint64_t) KGSL_MEMFLAGS_USE_CPU_MAP);

	/* Cap the alignment bits to the highest number we can handle */
	align = MEMFLAGS(flags, KGSL_MEMALIGN_MASK, KGSL_MEMALIGN_SHIFT);
@@ -2921,7 +2921,7 @@ static struct kgsl_mem_entry *gpumem_alloc_entry(
		KGSL_CORE_ERR("Alignment too large; restricting to %dK\n",
			KGSL_MAX_ALIGN >> 10);

		flags &= ~KGSL_MEMALIGN_MASK;
		flags &= ~((uint64_t) KGSL_MEMALIGN_MASK);
		flags |= (ilog2(KGSL_MAX_ALIGN) << KGSL_MEMALIGN_SHIFT) &
			KGSL_MEMALIGN_MASK;
	}
@@ -3023,7 +3023,7 @@ long kgsl_ioctl_gpumem_alloc(struct kgsl_device_private *dev_priv,
	uint64_t flags = param->flags;

	/* Legacy functions doesn't support these advanced features */
	flags &= ~KGSL_MEMFLAGS_USE_CPU_MAP;
	flags &= ~((uint64_t) KGSL_MEMFLAGS_USE_CPU_MAP);
	flags |= KGSL_MEMFLAGS_FORCE_32BIT;

	entry = gpumem_alloc_entry(dev_priv, (uint64_t) param->size,
@@ -3145,7 +3145,7 @@ long kgsl_ioctl_gpuobj_set_info(struct kgsl_device_private *dev_priv,
		copy_metadata(entry, param->metadata, param->metadata_len);

	if (param->flags & KGSL_GPUOBJ_SET_INFO_TYPE) {
		entry->memdesc.flags &= ~KGSL_MEMTYPE_MASK;
		entry->memdesc.flags &= ~((uint64_t) KGSL_MEMTYPE_MASK);
		entry->memdesc.flags |= param->type << KGSL_MEMTYPE_SHIFT;
	}