545.23.06 has incompatible changes to
NV0073_CTRL_SPECIFIC_BACKLIGHT_BRIGHTNESS_PARAMS.

Signed-off-by: Ben Skeggs <bske...@nvidia.com>
Reviewed-by: Dave Airlie <airl...@redhat.com>
Reviewed-by: Timur Tabi <tt...@nvidia.com>
Tested-by: Timur Tabi <tt...@nvidia.com>
---
 .../nouveau/nvkm/subdev/gsp/rm/r535/disp.c    | 57 ++++++++++---------
 .../drm/nouveau/nvkm/subdev/gsp/rm/r535/rm.c  |  1 +
 .../gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h   |  5 ++
 3 files changed, 37 insertions(+), 26 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 1ba86e223978..1e9bbfd402d3 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
@@ -252,47 +252,47 @@ r535_core = {
 };
 
 static int
-r535_sor_bl_set(struct nvkm_ior *sor, int lvl)
+r535_bl_ctrl(struct nvkm_disp *disp, unsigned display_id, bool set, int *pval)
 {
-       struct nvkm_disp *disp = sor->disp;
+       u32 cmd = set ? NV0073_CTRL_CMD_SPECIFIC_SET_BACKLIGHT_BRIGHTNESS :
+                       NV0073_CTRL_CMD_SPECIFIC_GET_BACKLIGHT_BRIGHTNESS;
        NV0073_CTRL_SPECIFIC_BACKLIGHT_BRIGHTNESS_PARAMS *ctrl;
+       int ret;
 
-       ctrl = nvkm_gsp_rm_ctrl_get(&disp->rm.objcom,
-                                   
NV0073_CTRL_CMD_SPECIFIC_SET_BACKLIGHT_BRIGHTNESS,
-                                   sizeof(*ctrl));
+       ctrl = nvkm_gsp_rm_ctrl_get(&disp->rm.objcom, cmd, sizeof(*ctrl));
        if (IS_ERR(ctrl))
                return PTR_ERR(ctrl);
 
-       ctrl->displayId = BIT(sor->asy.outp->index);
-       ctrl->brightness = lvl;
+       ctrl->displayId = BIT(display_id);
+       ctrl->brightness = *pval;
 
-       return nvkm_gsp_rm_ctrl_wr(&disp->rm.objcom, ctrl);
+       ret = nvkm_gsp_rm_ctrl_push(&disp->rm.objcom, &ctrl, sizeof(*ctrl));
+       if (ret)
+               return ret;
+
+       *pval = ctrl->brightness;
+
+       nvkm_gsp_rm_ctrl_done(&disp->rm.objcom, ctrl);
+       return 0;
 }
 
 static int
-r535_sor_bl_get(struct nvkm_ior *sor)
+r535_sor_bl_set(struct nvkm_ior *sor, int lvl)
 {
        struct nvkm_disp *disp = sor->disp;
-       NV0073_CTRL_SPECIFIC_BACKLIGHT_BRIGHTNESS_PARAMS *ctrl;
-       int ret, lvl;
-
-       ctrl = nvkm_gsp_rm_ctrl_get(&disp->rm.objcom,
-                                   
NV0073_CTRL_CMD_SPECIFIC_GET_BACKLIGHT_BRIGHTNESS,
-                                   sizeof(*ctrl));
-       if (IS_ERR(ctrl))
-               return PTR_ERR(ctrl);
+       const struct nvkm_rm_api *rmapi = 
disp->engine.subdev.device->gsp->rm->api;
 
-       ctrl->displayId = BIT(sor->asy.outp->index);
+       return rmapi->disp->bl_ctrl(disp, sor->asy.outp->index, true, &lvl);
+}
 
-       ret = nvkm_gsp_rm_ctrl_push(&disp->rm.objcom, &ctrl, sizeof(*ctrl));
-       if (ret) {
-               nvkm_gsp_rm_ctrl_done(&disp->rm.objcom, ctrl);
-               return ret;
-       }
+static int
+r535_sor_bl_get(struct nvkm_ior *sor)
+{
+       struct nvkm_disp *disp = sor->disp;
+       const struct nvkm_rm_api *rmapi = 
disp->engine.subdev.device->gsp->rm->api;
+       int lvl, ret = rmapi->disp->bl_ctrl(disp, sor->asy.outp->index, false, 
&lvl);
 
-       lvl = ctrl->brightness;
-       nvkm_gsp_rm_ctrl_done(&disp->rm.objcom, ctrl);
-       return lvl;
+       return (ret == 0) ? lvl : ret;
 }
 
 static const struct nvkm_ior_func_bl
@@ -1722,3 +1722,8 @@ r535_disp_new(const struct nvkm_disp_func *hw, struct 
nvkm_device *device,
        mutex_init(&(*pdisp)->super.mutex); //XXX
        return ret;
 }
+
+const struct nvkm_rm_api_disp
+r535_disp = {
+       .bl_ctrl = r535_bl_ctrl,
+};
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/rm.c 
b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/rm.c
index efedd387fcc5..9eff944f6c39 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/rm.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/rm.c
@@ -28,6 +28,7 @@ r535_api = {
        .alloc = &r535_alloc,
        .client = &r535_client,
        .device = &r535_device,
+       .disp = &r535_disp,
        .ce = &r535_ce,
        .nvdec = &r535_nvdec,
        .nvenc = &r535_nvenc,
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 4a27e8bfafcc..2386e419be62 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h
@@ -70,6 +70,10 @@ struct nvkm_rm_api {
                } event;
        } *device;
 
+       const struct nvkm_rm_api_disp {
+               int (*bl_ctrl)(struct nvkm_disp *, unsigned display_id, bool 
set, int *val);
+       } *disp;
+
        const struct nvkm_rm_api_engine {
                int (*alloc)(struct nvkm_gsp_object *chan, u32 handle, u32 
class, int inst,
                             struct nvkm_gsp_object *);
@@ -84,6 +88,7 @@ extern const struct nvkm_rm_api_ctrl r535_ctrl;
 extern const struct nvkm_rm_api_alloc r535_alloc;
 extern const struct nvkm_rm_api_client r535_client;
 extern const struct nvkm_rm_api_device r535_device;
+extern const struct nvkm_rm_api_disp r535_disp;
 extern const struct nvkm_rm_api_engine r535_ce;
 void *r535_gr_dtor(struct nvkm_gr *);
 int r535_gr_oneinit(struct nvkm_gr *);
-- 
2.49.0

Reply via email to