@@ -1159,6 +1159,49 @@ r535_dp = {
11591159 .dp .drive = r535_dp_drive ,
11601160};
11611161
1162+ static int
1163+ r535_dp_get_caps (struct nvkm_disp * disp , int * plink_bw , bool * pmst , bool * pwm )
1164+ {
1165+ NV0073_CTRL_CMD_DP_GET_CAPS_PARAMS * ctrl ;
1166+ int ret ;
1167+
1168+ ctrl = nvkm_gsp_rm_ctrl_get (& disp -> rm .objcom ,
1169+ NV0073_CTRL_CMD_DP_GET_CAPS , sizeof (* ctrl ));
1170+ if (IS_ERR (ctrl ))
1171+ return PTR_ERR (ctrl );
1172+
1173+ ctrl -> sorIndex = ~0 ;
1174+
1175+ ret = nvkm_gsp_rm_ctrl_push (& disp -> rm .objcom , & ctrl , sizeof (* ctrl ));
1176+ if (ret ) {
1177+ nvkm_gsp_rm_ctrl_done (& disp -> rm .objcom , ctrl );
1178+ return ret ;
1179+ }
1180+
1181+ switch (NVVAL_GET (ctrl -> maxLinkRate , NV0073_CTRL_CMD , DP_GET_CAPS , MAX_LINK_RATE )) {
1182+ case NV0073_CTRL_CMD_DP_GET_CAPS_MAX_LINK_RATE_1_62 :
1183+ * plink_bw = 0x06 ;
1184+ break ;
1185+ case NV0073_CTRL_CMD_DP_GET_CAPS_MAX_LINK_RATE_2_70 :
1186+ * plink_bw = 0x0a ;
1187+ break ;
1188+ case NV0073_CTRL_CMD_DP_GET_CAPS_MAX_LINK_RATE_5_40 :
1189+ * plink_bw = 0x14 ;
1190+ break ;
1191+ case NV0073_CTRL_CMD_DP_GET_CAPS_MAX_LINK_RATE_8_10 :
1192+ * plink_bw = 0x1e ;
1193+ break ;
1194+ default :
1195+ * plink_bw = 0x00 ;
1196+ break ;
1197+ }
1198+
1199+ * pmst = ctrl -> bIsMultistreamSupported ;
1200+ * pwm = ctrl -> bHasIncreasedWatermarkLimits ;
1201+ nvkm_gsp_rm_ctrl_done (& disp -> rm .objcom , ctrl );
1202+ return 0 ;
1203+ }
1204+
11621205static int
11631206r535_tmds_edid_get (struct nvkm_outp * outp , u8 * data , u16 * psize )
11641207{
@@ -1203,6 +1246,7 @@ r535_tmds = {
12031246static int
12041247r535_outp_new (struct nvkm_disp * disp , u32 id )
12051248{
1249+ const struct nvkm_rm_api * rmapi = disp -> rm .objcom .client -> gsp -> rm -> api ;
12061250 NV0073_CTRL_SPECIFIC_OR_GET_INFO_PARAMS * ctrl ;
12071251 enum nvkm_ior_proto proto ;
12081252 struct dcb_output dcbE = {};
@@ -1287,43 +1331,11 @@ r535_outp_new(struct nvkm_disp *disp, u32 id)
12871331 if (ret )
12881332 return ret ;
12891333 } else {
1290- NV0073_CTRL_CMD_DP_GET_CAPS_PARAMS * ctrl ;
12911334 bool mst , wm ;
12921335
1293- ctrl = nvkm_gsp_rm_ctrl_get (& disp -> rm .objcom ,
1294- NV0073_CTRL_CMD_DP_GET_CAPS , sizeof (* ctrl ));
1295- if (IS_ERR (ctrl ))
1296- return PTR_ERR (ctrl );
1297-
1298- ctrl -> sorIndex = ~0 ;
1299-
1300- ret = nvkm_gsp_rm_ctrl_push (& disp -> rm .objcom , & ctrl , sizeof (* ctrl ));
1301- if (ret ) {
1302- nvkm_gsp_rm_ctrl_done (& disp -> rm .objcom , ctrl );
1336+ ret = rmapi -> disp -> dp .get_caps (disp , & dcbE .dpconf .link_bw , & mst , & wm );
1337+ if (ret )
13031338 return ret ;
1304- }
1305-
1306- switch (NVVAL_GET (ctrl -> maxLinkRate , NV0073_CTRL_CMD , DP_GET_CAPS , MAX_LINK_RATE )) {
1307- case NV0073_CTRL_CMD_DP_GET_CAPS_MAX_LINK_RATE_1_62 :
1308- dcbE .dpconf .link_bw = 0x06 ;
1309- break ;
1310- case NV0073_CTRL_CMD_DP_GET_CAPS_MAX_LINK_RATE_2_70 :
1311- dcbE .dpconf .link_bw = 0x0a ;
1312- break ;
1313- case NV0073_CTRL_CMD_DP_GET_CAPS_MAX_LINK_RATE_5_40 :
1314- dcbE .dpconf .link_bw = 0x14 ;
1315- break ;
1316- case NV0073_CTRL_CMD_DP_GET_CAPS_MAX_LINK_RATE_8_10 :
1317- dcbE .dpconf .link_bw = 0x1e ;
1318- break ;
1319- default :
1320- dcbE .dpconf .link_bw = 0x00 ;
1321- break ;
1322- }
1323-
1324- mst = ctrl -> bIsMultistreamSupported ;
1325- wm = ctrl -> bHasIncreasedWatermarkLimits ;
1326- nvkm_gsp_rm_ctrl_done (& disp -> rm .objcom , ctrl );
13271339
13281340 if (WARN_ON (!dcbE .dpconf .link_bw ))
13291341 return - EINVAL ;
@@ -1763,6 +1775,7 @@ r535_disp = {
17631775 .get_active = r535_disp_get_active ,
17641776 .bl_ctrl = r535_bl_ctrl ,
17651777 .dp = {
1778+ .get_caps = r535_dp_get_caps ,
17661779 .set_indexed_link_rates = r535_dp_set_indexed_link_rates ,
17671780 },
17681781 .chan = {
0 commit comments