diff options
author | Ben Skeggs <bskeggs@nvidia.com> | 2024-11-14 13:02:39 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2025-05-19 06:29:26 +1000 |
commit | f82fb646e12e3f64c4576d8f537b343f16966be9 (patch) | |
tree | e4d29b8961015f370e8d0489c0da36760d7e762b | |
parent | 8887abb8cb6fb4647fb8b1f023b612c201512150 (diff) |
drm/nouveau/gsp: add hal for disp.chan.dmac_alloc()
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>
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c | 31 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h | 2 |
2 files changed, 22 insertions, 11 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c index 14187e1618b8..7e9e2d3564da 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c @@ -165,26 +165,34 @@ r535_dmac_fini(struct nvkm_disp_chan *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, } }; diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h index 1ca5b025eeb4..7aed7cd72e85 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h @@ -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; |