[PATCH 6.18 028/314] accel/amdxdna: Remove buffer size check when creating command BO

Sasha Levin
2026-03-10T11:21:01Z

From: Lizhi Hou <lizhi.hou@amd.com>

[ Upstream commit 08fe1b5166fdc81b010d7bf39cd6440620e7931e ]

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: ac49797c1815 ("accel/amdxdna: Add GEM buffer object management")
Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
Signed-off-by: Lizhi Hou <lizhi.hou@amd.com>
Link: https://patch.msgid.link/20260206060237.4050492-1-lizhi.hou@amd.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/accel/amdxdna/amdxdna_gem.c | 38 ++++++++++++++---------------
1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/accel/amdxdna/amdxdna_gem.c b/drivers/accel/amdxdna/amdxdna_gem.c
index 7f91863c3f24c..a1c9cc4a2b9d8 100644
--- a/drivers/accel/amdxdna/amdxdna_gem.c
+++ b/drivers/accel/amdxdna/amdxdna_gem.c
@@ -20,8 +20,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;
}
--
2.51.0