Skip to content

Commit 37a82fa

Browse files
Ben Skeggsairlied
authored andcommitted
drm/nouveau/gsp: add hal for disp.dp.get_caps()
555.42.02 has incompatible changes to NV0073_CTRL_CMD_DP_GET_CAPS. 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>
1 parent cf6b2b5 commit 37a82fa

2 files changed

Lines changed: 48 additions & 34 deletions

File tree

  • drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c

Lines changed: 47 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
11621205
static int
11631206
r535_tmds_edid_get(struct nvkm_outp *outp, u8 *data, u16 *psize)
11641207
{
@@ -1203,6 +1246,7 @@ r535_tmds = {
12031246
static int
12041247
r535_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 = {

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ struct nvkm_rm_api {
8787
int (*bl_ctrl)(struct nvkm_disp *, unsigned display_id, bool set, int *val);
8888

8989
struct {
90+
int (*get_caps)(struct nvkm_disp *, int *link_bw, bool *mst, bool *wm);
9091
int (*set_indexed_link_rates)(struct nvkm_outp *);
9192
} dp;
9293

0 commit comments

Comments
 (0)