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

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 40c50d9fca0baf12677691ac69f0b481d520e83f..4df5b2b72d29e2480000b74e43def3a028203b17 100644 (file)
@@ -852,10 +852,9 @@ r535_outp_dfp_get_info(struct nvkm_outp *outp)
 }
 
 static int
-r535_outp_detect(struct nvkm_outp *outp)
+r535_disp_get_connect_state(struct nvkm_disp *disp, unsigned display_id)
 {
        NV0073_CTRL_SYSTEM_GET_CONNECT_STATE_PARAMS *ctrl;
-       struct nvkm_disp *disp = outp->disp;
        int ret;
 
        ctrl = nvkm_gsp_rm_ctrl_get(&disp->rm.objcom,
@@ -864,23 +863,29 @@ r535_outp_detect(struct nvkm_outp *outp)
                return PTR_ERR(ctrl);
 
        ctrl->subDeviceInstance = 0;
-       ctrl->displayMask = BIT(outp->index);
+       ctrl->displayMask = BIT(display_id);
 
        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;
-       }
+       if (ret == 0 && (ctrl->displayMask & BIT(display_id)))
+               ret = 1;
+
+       nvkm_gsp_rm_ctrl_done(&disp->rm.objcom, ctrl);
+       return ret;
+}
 
-       if (ctrl->displayMask & BIT(outp->index)) {
+static int
+r535_outp_detect(struct nvkm_outp *outp)
+{
+       const struct nvkm_rm_api *rmapi = outp->disp->rm.objcom.client->gsp->rm->api;
+       int ret;
+
+       ret = rmapi->disp->get_connect_state(outp->disp, outp->index);
+       if (ret == 1) {
                ret = r535_outp_dfp_get_info(outp);
                if (ret == 0)
                        ret = 1;
-       } else {
-               ret = 0;
        }
 
-       nvkm_gsp_rm_ctrl_done(&disp->rm.objcom, ctrl);
        return ret;
 }
 
@@ -1752,6 +1757,7 @@ const struct nvkm_rm_api_disp
 r535_disp = {
        .get_static_info = r535_disp_get_static_info,
        .get_supported = r535_disp_get_supported,
+       .get_connect_state = r535_disp_get_connect_state,
        .bl_ctrl = r535_bl_ctrl,
        .dp = {
                .set_indexed_link_rates = r535_dp_set_indexed_link_rates,
index 3f0cb6790f0078a69310c3bd354294417b0f83c7..58c745554544bec138449d1da6d88ff286b99960 100644 (file)
@@ -81,6 +81,7 @@ struct nvkm_rm_api {
        const struct nvkm_rm_api_disp {
                int (*get_static_info)(struct nvkm_disp *);
                int (*get_supported)(struct nvkm_disp *, unsigned long *display_mask);
+               int (*get_connect_state)(struct nvkm_disp *, unsigned display_id);
 
                int (*bl_ctrl)(struct nvkm_disp *, unsigned display_id, bool set, int *val);