drm/nouveau/gsp: add hal for disp.chan.dmac_alloc()
authorBen Skeggs <bskeggs@nvidia.com>
Thu, 14 Nov 2024 03:02:39 +0000 (13:02 +1000)
committerDave Airlie <airlied@redhat.com>
Sun, 18 May 2025 20:29:26 +0000 (06:29 +1000)
565.57.01 has incompatible changes to
NV50VAIO_CHANNELDMA_ALLOCATION_PARAMETERS.

Signed-off-by: Ben Skeggs <bskeggs@nvidia.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Timur Tabi <ttabi@nvidia.com>
Tested-by: Timur Tabi <ttabi@nvidia.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h

index 14187e1618b8d88dc642c1fb7a902e65e70b3802..7e9e2d3564da70cab27e7db6cef7f9ee9962aca5 100644 (file)
@@ -164,27 +164,35 @@ r535_dmac_fini(struct nvkm_disp_chan *chan)
        r535_chan_fini(chan);
 }
 
+static int
+r535_dmac_alloc(struct nvkm_disp *disp, u32 oclass, int inst, u32 put_offset,
+               struct nvkm_gsp_object *dmac)
+{
+       NV50VAIO_CHANNELDMA_ALLOCATION_PARAMETERS *args;
+
+       args = nvkm_gsp_rm_alloc_get(&disp->rm.object, (oclass << 16) | inst, oclass,
+                                    sizeof(*args), dmac);
+       if (IS_ERR(args))
+               return PTR_ERR(args);
+
+       args->channelInstance = inst;
+       args->offset = put_offset;
+
+       return nvkm_gsp_rm_alloc_wr(dmac, args);
+}
+
 static int
 r535_dmac_init(struct nvkm_disp_chan *chan)
 {
        const struct nvkm_rm_api *rmapi = chan->disp->rm.objcom.client->gsp->rm->api;
-       NV50VAIO_CHANNELDMA_ALLOCATION_PARAMETERS *args;
        int ret;
 
        ret = rmapi->disp->chan.set_pushbuf(chan->disp, chan->object.oclass, chan->head, chan->memory);
        if (ret)
                return ret;
 
-       args = nvkm_gsp_rm_alloc_get(&chan->disp->rm.object,
-                                    (chan->object.oclass << 16) | chan->head,
-                                    chan->object.oclass, sizeof(*args), &chan->rm.object);
-       if (IS_ERR(args))
-               return PTR_ERR(args);
-
-       args->channelInstance = chan->head;
-       args->offset = chan->suspend_put;
-
-       return nvkm_gsp_rm_alloc_wr(&chan->rm.object, args);
+       return rmapi->disp->chan.dmac_alloc(chan->disp, chan->object.oclass, chan->head,
+                                           chan->suspend_put, &chan->rm.object);
 }
 
 static int
@@ -1780,5 +1788,6 @@ r535_disp = {
        },
        .chan = {
                .set_pushbuf = r535_disp_chan_set_pushbuf,
+               .dmac_alloc = r535_dmac_alloc,
        }
 };
index 1ca5b025eeb4552aa03cb29925a35f25208ccfc1..7aed7cd72e8561b03ee2046dd29a771653507af2 100644 (file)
@@ -94,6 +94,8 @@ struct nvkm_rm_api {
                struct {
                        int (*set_pushbuf)(struct nvkm_disp *, s32 oclass, int inst,
                                           struct nvkm_memory *);
+                       int (*dmac_alloc)(struct nvkm_disp *, u32 oclass, int inst, u32 put_offset,
+                                         struct nvkm_gsp_object *);
                } chan;
        } *disp;