Commit 08fe1b51 authored by Lizhi Hou's avatar Lizhi Hou
Browse files

accel/amdxdna: Remove buffer size check when creating command BO



Large command buffers may be used, and they do not always need to be
mapped or accessed by the driver. Performing a size check at command BO
creation time unnecessarily rejects valid use cases.

Remove the buffer size check from command BO creation, and defer vmap
and size validation to the paths where the driver actually needs to map
and access the command buffer.

Fixes: ac49797c ("accel/amdxdna: Add GEM buffer object management")
Reviewed-by: default avatarMario Limonciello (AMD) <superm1@kernel.org>
Signed-off-by: default avatarLizhi Hou <lizhi.hou@amd.com>
Link: https://patch.msgid.link/20260206060237.4050492-1-lizhi.hou@amd.com
parent c17ee635
Loading
Loading
Loading
Loading
+19 −19
Original line number Diff line number Diff line
@@ -21,8 +21,6 @@
#include "amdxdna_pci_drv.h"
#include "amdxdna_ubuf.h"

#define XDNA_MAX_CMD_BO_SIZE	SZ_32K

MODULE_IMPORT_NS("DMA_BUF");

static int
@@ -745,12 +743,6 @@ amdxdna_drm_create_cmd_bo(struct drm_device *dev,
{
	struct amdxdna_dev *xdna = to_xdna_dev(dev);
	struct amdxdna_gem_obj *abo;
	int ret;

	if (args->size > XDNA_MAX_CMD_BO_SIZE) {
		XDNA_ERR(xdna, "Command bo size 0x%llx too large", args->size);
		return ERR_PTR(-EINVAL);
	}

	if (args->size < sizeof(struct amdxdna_cmd)) {
		XDNA_DBG(xdna, "Command BO size 0x%llx too small", args->size);
@@ -764,17 +756,7 @@ amdxdna_drm_create_cmd_bo(struct drm_device *dev,
	abo->type = AMDXDNA_BO_CMD;
	abo->client = filp->driver_priv;

	ret = amdxdna_gem_obj_vmap(abo, &abo->mem.kva);
	if (ret) {
		XDNA_ERR(xdna, "Vmap cmd bo failed, ret %d", ret);
		goto release_obj;
	}

	return abo;

release_obj:
	drm_gem_object_put(to_gobj(abo));
	return ERR_PTR(ret);
}

int amdxdna_drm_create_bo_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
@@ -871,6 +853,7 @@ struct amdxdna_gem_obj *amdxdna_gem_get_obj(struct amdxdna_client *client,
	struct amdxdna_dev *xdna = client->xdna;
	struct amdxdna_gem_obj *abo;
	struct drm_gem_object *gobj;
	int ret;

	gobj = drm_gem_object_lookup(client->filp, bo_hdl);
	if (!gobj) {
@@ -879,9 +862,26 @@ struct amdxdna_gem_obj *amdxdna_gem_get_obj(struct amdxdna_client *client,
	}

	abo = to_xdna_obj(gobj);
	if (bo_type == AMDXDNA_BO_INVALID || abo->type == bo_type)
	if (bo_type != AMDXDNA_BO_INVALID && abo->type != bo_type)
		goto put_obj;

	if (bo_type != AMDXDNA_BO_CMD || abo->mem.kva)
		return abo;

	if (abo->mem.size > SZ_32K) {
		XDNA_ERR(xdna, "Cmd bo is too big %ld", abo->mem.size);
		goto put_obj;
	}

	ret = amdxdna_gem_obj_vmap(abo, &abo->mem.kva);
	if (ret) {
		XDNA_ERR(xdna, "Vmap cmd bo failed, ret %d", ret);
		goto put_obj;
	}

	return abo;

put_obj:
	drm_gem_object_put(gobj);
	return NULL;
}