]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
accel/amdxdna: Remove buffer size check when creating command BO
authorLizhi Hou <lizhi.hou@amd.com>
Fri, 6 Feb 2026 06:02:37 +0000 (22:02 -0800)
committerLizhi Hou <lizhi.hou@amd.com>
Mon, 23 Feb 2026 17:23:41 +0000 (09:23 -0800)
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
drivers/accel/amdxdna/amdxdna_gem.c

index 8c290ddd325181e92cd31def182b8f6d9649a31c..d60db49ead7140924a0a5d256c8d57744d8d3608 100644 (file)
@@ -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;
 }