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

Commit 9b0e4442 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: kgsl: Add CMA memory feature to support NOMMU for GPU"

parents 48441748 72805db0
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1352,7 +1352,8 @@ static int a2xx_create_gmem_shadow(struct adreno_device *adreno_dev,
	calc_gmemsize(&drawctxt->context_gmem_shadow, adreno_dev->gmem_size);
	tmp_ctx.gmem_base = adreno_dev->gmem_base;

	result = kgsl_allocate(&drawctxt->context_gmem_shadow.gmemshadow,
	result = kgsl_allocate(&(adreno_dev->dev),
		&drawctxt->context_gmem_shadow.gmemshadow,
		drawctxt->base.proc_priv->pagetable,
		drawctxt->context_gmem_shadow.size);

@@ -1450,7 +1451,7 @@ static int a2xx_drawctxt_create(struct adreno_device *adreno_dev,
	 * and texture and vertex buffer storage too
	 */

	ret = kgsl_allocate(&drawctxt->gpustate,
	ret = kgsl_allocate(&(adreno_dev->dev), &drawctxt->gpustate,
		drawctxt->base.proc_priv->pagetable, _context_size(adreno_dev));

	if (ret)
+3 −2
Original line number Diff line number Diff line
@@ -2404,7 +2404,8 @@ static int a3xx_create_gmem_shadow(struct adreno_device *adreno_dev,
	calc_gmemsize(&drawctxt->context_gmem_shadow, adreno_dev->gmem_size);
	tmp_ctx.gmem_base = adreno_dev->gmem_base;

	result = kgsl_allocate(&drawctxt->context_gmem_shadow.gmemshadow,
	result = kgsl_allocate(&(adreno_dev->dev),
		&drawctxt->context_gmem_shadow.gmemshadow,
		drawctxt->base.proc_priv->pagetable,
		drawctxt->context_gmem_shadow.size);

@@ -2460,7 +2461,7 @@ static int a3xx_drawctxt_create(struct adreno_device *adreno_dev,
	}
	drawctxt->ops = &a3xx_legacy_ctx_ops;

	ret = kgsl_allocate(&drawctxt->gpustate,
	ret = kgsl_allocate(&(adreno_dev->dev), &drawctxt->gpustate,
		drawctxt->base.proc_priv->pagetable, CONTEXT_SIZE);

	if (ret)
+5 −4
Original line number Diff line number Diff line
@@ -2675,7 +2675,7 @@ static long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv,
			| KGSL_MEMFLAGS_USE_CPU_MAP;

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

	if (kgsl_mmu_get_mmutype() == KGSL_MMU_TYPE_IOMMU)
@@ -3007,8 +3007,8 @@ _gpumem_alloc(struct kgsl_device_private *dev_priv,
	if (kgsl_mmu_get_mmutype() == KGSL_MMU_TYPE_IOMMU)
		entry->memdesc.priv |= KGSL_MEMDESC_GUARD_PAGE;

	result = kgsl_allocate_user(&entry->memdesc, private->pagetable, size,
				    flags);
	result = kgsl_allocate_user(dev_priv->device, &entry->memdesc,
				private->pagetable, size, flags);
	if (result != 0)
		goto err;

@@ -3058,11 +3058,12 @@ kgsl_ioctl_gpumem_alloc_id(struct kgsl_device_private *dev_priv,
			unsigned int cmd, void *data)
{
	struct kgsl_process_private *private = dev_priv->process_priv;
	struct kgsl_device *device = dev_priv->device;
	struct kgsl_gpumem_alloc_id *param = data;
	struct kgsl_mem_entry *entry = NULL;
	int result;

	if (!kgsl_mmu_use_cpu_map(private->pagetable->mmu))
	if (!kgsl_mmu_use_cpu_map(&device->mmu))
		param->flags &= ~KGSL_MEMFLAGS_USE_CPU_MAP;

	result = _gpumem_alloc(dev_priv, &entry, param->size, param->flags);
+1 −0
Original line number Diff line number Diff line
@@ -178,6 +178,7 @@ struct kgsl_memdesc {
	unsigned int sglen_alloc;  /* Allocated entries in the sglist */
	struct kgsl_memdesc_ops *ops;
	unsigned int flags; /* Flags set from userspace */
	struct device *dev;
};

/* List of different memory entry types */
+7 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <linux/iommu.h>
#include <mach/iommu.h>
#include <mach/socinfo.h>
#include <linux/types.h>

#include "kgsl.h"
#include "kgsl_mmu.h"
@@ -378,6 +379,8 @@ int kgsl_mmu_init(struct kgsl_device *device)
	if (KGSL_MMU_TYPE_NONE == kgsl_mmu_type) {
		dev_info(device->dev, "|%s| MMU type set for device is "
				"NOMMU\n", __func__);
		status = dma_set_coherent_mask(device->dev->parent,
					DMA_BIT_MASK(sizeof(dma_addr_t)*8));
		goto done;
	} else if (KGSL_MMU_TYPE_GPU == kgsl_mmu_type)
		mmu->mmu_ops = &gpummu_ops;
@@ -717,6 +720,10 @@ kgsl_mmu_map(struct kgsl_pagetable *pagetable,
	if (!kgsl_memdesc_is_global(memdesc) &&
		(KGSL_MEMDESC_MAPPED & memdesc->priv))
		return -EINVAL;

	if (kgsl_mmu_get_mmutype() == KGSL_MMU_TYPE_NONE)
		return 0;

	/* Add space for the guard page when allocating the mmu VA. */
	size = memdesc->size;
	if (kgsl_memdesc_has_guard_page(memdesc))
Loading