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

Commit 1db3fbd4 authored by Jordan Crouse's avatar Jordan Crouse
Browse files

drm/msm: Add a helper function for in-kernel buffer allocations



Nearly all of the buffer allocations for kernel allocate an buffer object,
virtual address and GPU iova at the same time. Make a helper function to
handle the details.

Change-Id: Ic0dedbad0ecd85d360895cc0d1e418277ba44c62
Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
parent 53530e16
Loading
Loading
Loading
Loading
+4 −20
Original line number Diff line number Diff line
@@ -477,30 +477,14 @@ static int a5xx_preempt_start(struct msm_gpu *gpu)
static struct drm_gem_object *a5xx_ucode_load_bo(struct msm_gpu *gpu,
		const struct firmware *fw, u64 *iova)
{
	struct drm_device *drm = gpu->dev;
	struct drm_gem_object *bo;
	void *ptr;

	bo = msm_gem_new(drm, fw->size - 4,
		MSM_BO_UNCACHED | MSM_BO_GPU_READONLY);
	ptr = msm_gem_kernel_new(gpu->dev, fw->size - 4,
		MSM_BO_UNCACHED | MSM_BO_GPU_READONLY, gpu->aspace, &bo, iova);

	if (IS_ERR(bo))
		return bo;

	ptr = msm_gem_vaddr(bo);
	if (!ptr) {
		drm_gem_object_unreference_unlocked(bo);
		return ERR_PTR(-ENOMEM);
	}

	if (iova) {
		int ret = msm_gem_get_iova(bo, gpu->aspace, iova);

		if (ret) {
			drm_gem_object_unreference_unlocked(bo);
			return ERR_PTR(ret);
		}
	}
	if (IS_ERR(ptr))
		return ERR_CAST(ptr);

	memcpy(ptr, &fw->data[4], fw->size - 4);
	return bo;
+4 −12
Original line number Diff line number Diff line
@@ -458,18 +458,10 @@ void a5xx_gpmu_ucode_init(struct msm_gpu *gpu)
	 */
	bosize = (cmds_size + (cmds_size / TYPE4_MAX_PAYLOAD) + 1) << 2;

	a5xx_gpu->gpmu_bo = msm_gem_new(drm, bosize,
		MSM_BO_UNCACHED | MSM_BO_GPU_READONLY);

	if (IS_ERR(a5xx_gpu->gpmu_bo))
		goto err;

	if (msm_gem_get_iova(a5xx_gpu->gpmu_bo, gpu->aspace,
		&a5xx_gpu->gpmu_iova))
		goto err;

	ptr = msm_gem_vaddr(a5xx_gpu->gpmu_bo);
	if (!ptr)
	ptr = msm_gem_kernel_new(drm, bosize,
		MSM_BO_UNCACHED | MSM_BO_GPU_READONLY, gpu->aspace,
		&a5xx_gpu->gpmu_bo, &a5xx_gpu->gpmu_iova);
	if (IS_ERR(ptr))
		goto err;

	while (cmds_size > 0) {
+4 −39
Original line number Diff line number Diff line
@@ -15,41 +15,6 @@
#include "msm_iommu.h"
#include "a5xx_gpu.h"

static void *alloc_kernel_bo(struct drm_device *drm, struct msm_gpu *gpu,
		size_t size, uint32_t flags, struct drm_gem_object **bo,
		u64 *iova)
{
	struct drm_gem_object *_bo;
	u64 _iova;
	void *ptr;
	int ret;

	_bo = msm_gem_new(drm, size, flags);

	if (IS_ERR(_bo))
		return _bo;

	ret = msm_gem_get_iova(_bo, gpu->aspace, &_iova);
	if (ret)
		goto out;

	ptr = msm_gem_vaddr(_bo);
	if (!ptr) {
		ret = -ENOMEM;
		goto out;
	}

	if (bo)
		*bo = _bo;
	if (iova)
		*iova = _iova;

	return ptr;
out:
	drm_gem_object_unreference_unlocked(_bo);
	return ERR_PTR(ret);
}

/*
 * Try to transition the preemption state from old to new. Return
 * true on success or false if the original state wasn't 'old'
@@ -278,10 +243,10 @@ static int preempt_init_ring(struct a5xx_gpu *a5xx_gpu,
	struct drm_gem_object *bo;
	u64 iova;

	ptr = alloc_kernel_bo(gpu->dev, gpu,
	ptr = msm_gem_kernel_new(gpu->dev,
		A5XX_PREEMPT_RECORD_SIZE + A5XX_PREEMPT_COUNTER_SIZE,
		MSM_BO_UNCACHED | MSM_BO_PRIVILEGED,
		&bo, &iova);
		gpu->aspace, &bo, &iova);

	if (IS_ERR(ptr))
		return PTR_ERR(ptr);
@@ -352,10 +317,10 @@ void a5xx_preempt_init(struct msm_gpu *gpu)
	}

	if (msm_iommu_allow_dynamic(gpu->aspace->mmu)) {
		ptr = alloc_kernel_bo(gpu->dev, gpu,
		ptr = msm_gem_kernel_new(gpu->dev,
			sizeof(struct a5xx_smmu_info),
			MSM_BO_UNCACHED | MSM_BO_PRIVILEGED,
			&bo, &iova);
			gpu->aspace, &bo, &iova);

		if (IS_ERR(ptr))
			goto fail;
+8 −22
Original line number Diff line number Diff line
@@ -214,28 +214,14 @@ struct crashdump {

static int crashdump_init(struct msm_gpu *gpu, struct crashdump *crashdump)
{
	struct drm_device *drm = gpu->dev;
	int ret = -ENOMEM;

	crashdump->bo = msm_gem_new_locked(drm, CRASHDUMP_BO_SIZE,
			MSM_BO_UNCACHED);
	if (IS_ERR(crashdump->bo)) {
		ret = PTR_ERR(crashdump->bo);
		crashdump->bo = NULL;
		return ret;
	}

	crashdump->ptr = msm_gem_vaddr(crashdump->bo);
	if (!crashdump->ptr)
		goto out;

	ret = msm_gem_get_iova(crashdump->bo, gpu->aspace,
		&crashdump->iova);

out:
	if (ret) {
		drm_gem_object_unreference(crashdump->bo);
		crashdump->bo = NULL;
	int ret = 0;

	crashdump->ptr = msm_gem_kernel_new_locked(gpu->dev,
		CRASHDUMP_BO_SIZE, MSM_BO_UNCACHED,
		gpu->aspace, &crashdump->bo, &crashdump->iova);
	if (IS_ERR(crashdump->ptr)) {
		ret = PTR_ERR(crashdump->ptr);
		crashdump->ptr = NULL;
	}

	return ret;
+7 −20
Original line number Diff line number Diff line
@@ -563,31 +563,18 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
		}
	}

	adreno_gpu->memptrs_bo = msm_gem_new(drm, sizeof(*adreno_gpu->memptrs),
			MSM_BO_UNCACHED);
	if (IS_ERR(adreno_gpu->memptrs_bo)) {
		ret = PTR_ERR(adreno_gpu->memptrs_bo);
		adreno_gpu->memptrs_bo = NULL;
		dev_err(drm->dev, "could not allocate memptrs: %d\n", ret);
		return ret;
	}
	adreno_gpu->memptrs = msm_gem_kernel_new(drm,
		sizeof(*adreno_gpu->memptrs), MSM_BO_UNCACHED, gpu->aspace,
		&adreno_gpu->memptrs_bo, &adreno_gpu->memptrs_iova);

	adreno_gpu->memptrs = msm_gem_vaddr(adreno_gpu->memptrs_bo);
	if (!adreno_gpu->memptrs) {
		dev_err(drm->dev, "could not vmap memptrs\n");
		return -ENOMEM;
	if (IS_ERR(adreno_gpu->memptrs)) {
		ret = PTR_ERR(adreno_gpu->memptrs);
		adreno_gpu->memptrs = NULL;
	}

	ret = msm_gem_get_iova(adreno_gpu->memptrs_bo, gpu->aspace,
			&adreno_gpu->memptrs_iova);
	if (ret) {
		dev_err(drm->dev, "could not map memptrs: %d\n", ret);
	return ret;
}

	return 0;
}

void adreno_gpu_cleanup(struct adreno_gpu *gpu)
{
	struct msm_gem_address_space *aspace = gpu->base.aspace;
Loading