Commit 31fe2c20 authored by Alastair Bridgewater's avatar Alastair Bridgewater Committed by Ben Skeggs

drm/nouveau/disp/g84-: Extend NVKM HDMI power control method to set InfoFrames

The nouveau driver, in the Linux 3.7 days, used to try and set the
AVI InfoFrame based on the selected display mode.  These days, it
uses a fixed set of InfoFrames.  Start to correct that, by
providing a mechanism whereby InfoFrame data may be passed to the
NVKM functions that do the actual configuration.

At this point, only establish the new parameters and their parsing,
don't actually use the data anywhere yet (since it's not supplied
anywhere).
Signed-off-by: default avatarAlastair Bridgewater <alastair.bridgewater@gmail.com>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 35dd9874
...@@ -76,7 +76,9 @@ struct nv50_disp_sor_hdmi_pwr_v0 { ...@@ -76,7 +76,9 @@ struct nv50_disp_sor_hdmi_pwr_v0 {
__u8 state; __u8 state;
__u8 max_ac_packet; __u8 max_ac_packet;
__u8 rekey; __u8 rekey;
__u8 pad04[4]; __u8 avi_infoframe_length;
__u8 vendor_infoframe_length;
__u8 pad06[2];
}; };
struct nv50_disp_sor_lvds_script_v0 { struct nv50_disp_sor_lvds_script_v0 {
......
...@@ -40,7 +40,7 @@ g84_hdmi_ctrl(NV50_DISP_MTHD_V1) ...@@ -40,7 +40,7 @@ g84_hdmi_ctrl(NV50_DISP_MTHD_V1)
int ret = -ENOSYS; int ret = -ENOSYS;
nvif_ioctl(object, "disp sor hdmi ctrl size %d\n", size); nvif_ioctl(object, "disp sor hdmi ctrl size %d\n", size);
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) { if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
nvif_ioctl(object, "disp sor hdmi ctrl vers %d state %d " nvif_ioctl(object, "disp sor hdmi ctrl vers %d state %d "
"max_ac_packet %d rekey %d\n", "max_ac_packet %d rekey %d\n",
args->v0.version, args->v0.state, args->v0.version, args->v0.state,
...@@ -54,6 +54,13 @@ g84_hdmi_ctrl(NV50_DISP_MTHD_V1) ...@@ -54,6 +54,13 @@ g84_hdmi_ctrl(NV50_DISP_MTHD_V1)
} else } else
return ret; return ret;
if ((args->v0.avi_infoframe_length
+ args->v0.vendor_infoframe_length) > size)
return -ENOSYS;
else if ((args->v0.avi_infoframe_length
+ args->v0.vendor_infoframe_length) < size)
return -E2BIG;
if (!(ctrl & 0x40000000)) { if (!(ctrl & 0x40000000)) {
nvkm_mask(device, 0x6165a4 + hoff, 0x40000000, 0x00000000); nvkm_mask(device, 0x6165a4 + hoff, 0x40000000, 0x00000000);
nvkm_mask(device, 0x616520 + hoff, 0x00000001, 0x00000000); nvkm_mask(device, 0x616520 + hoff, 0x00000001, 0x00000000);
......
...@@ -40,7 +40,7 @@ gf119_hdmi_ctrl(NV50_DISP_MTHD_V1) ...@@ -40,7 +40,7 @@ gf119_hdmi_ctrl(NV50_DISP_MTHD_V1)
int ret = -ENOSYS; int ret = -ENOSYS;
nvif_ioctl(object, "disp sor hdmi ctrl size %d\n", size); nvif_ioctl(object, "disp sor hdmi ctrl size %d\n", size);
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) { if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
nvif_ioctl(object, "disp sor hdmi ctrl vers %d state %d " nvif_ioctl(object, "disp sor hdmi ctrl vers %d state %d "
"max_ac_packet %d rekey %d\n", "max_ac_packet %d rekey %d\n",
args->v0.version, args->v0.state, args->v0.version, args->v0.state,
...@@ -53,6 +53,13 @@ gf119_hdmi_ctrl(NV50_DISP_MTHD_V1) ...@@ -53,6 +53,13 @@ gf119_hdmi_ctrl(NV50_DISP_MTHD_V1)
} else } else
return ret; return ret;
if ((args->v0.avi_infoframe_length
+ args->v0.vendor_infoframe_length) > size)
return -ENOSYS;
else if ((args->v0.avi_infoframe_length
+ args->v0.vendor_infoframe_length) < size)
return -E2BIG;
if (!(ctrl & 0x40000000)) { if (!(ctrl & 0x40000000)) {
nvkm_mask(device, 0x616798 + hoff, 0x40000000, 0x00000000); nvkm_mask(device, 0x616798 + hoff, 0x40000000, 0x00000000);
nvkm_mask(device, 0x6167a4 + hoff, 0x00000001, 0x00000000); nvkm_mask(device, 0x6167a4 + hoff, 0x00000001, 0x00000000);
......
...@@ -41,7 +41,7 @@ gk104_hdmi_ctrl(NV50_DISP_MTHD_V1) ...@@ -41,7 +41,7 @@ gk104_hdmi_ctrl(NV50_DISP_MTHD_V1)
int ret = -ENOSYS; int ret = -ENOSYS;
nvif_ioctl(object, "disp sor hdmi ctrl size %d\n", size); nvif_ioctl(object, "disp sor hdmi ctrl size %d\n", size);
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) { if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
nvif_ioctl(object, "disp sor hdmi ctrl vers %d state %d " nvif_ioctl(object, "disp sor hdmi ctrl vers %d state %d "
"max_ac_packet %d rekey %d\n", "max_ac_packet %d rekey %d\n",
args->v0.version, args->v0.state, args->v0.version, args->v0.state,
...@@ -54,6 +54,13 @@ gk104_hdmi_ctrl(NV50_DISP_MTHD_V1) ...@@ -54,6 +54,13 @@ gk104_hdmi_ctrl(NV50_DISP_MTHD_V1)
} else } else
return ret; return ret;
if ((args->v0.avi_infoframe_length
+ args->v0.vendor_infoframe_length) > size)
return -ENOSYS;
else if ((args->v0.avi_infoframe_length
+ args->v0.vendor_infoframe_length) < size)
return -E2BIG;
if (!(ctrl & 0x40000000)) { if (!(ctrl & 0x40000000)) {
nvkm_mask(device, 0x616798 + hoff, 0x40000000, 0x00000000); nvkm_mask(device, 0x616798 + hoff, 0x40000000, 0x00000000);
nvkm_mask(device, 0x6900c0 + hdmi, 0x00000001, 0x00000000); nvkm_mask(device, 0x6900c0 + hdmi, 0x00000001, 0x00000000);
......
...@@ -41,7 +41,7 @@ gt215_hdmi_ctrl(NV50_DISP_MTHD_V1) ...@@ -41,7 +41,7 @@ gt215_hdmi_ctrl(NV50_DISP_MTHD_V1)
int ret = -ENOSYS; int ret = -ENOSYS;
nvif_ioctl(object, "disp sor hdmi ctrl size %d\n", size); nvif_ioctl(object, "disp sor hdmi ctrl size %d\n", size);
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) { if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
nvif_ioctl(object, "disp sor hdmi ctrl vers %d state %d " nvif_ioctl(object, "disp sor hdmi ctrl vers %d state %d "
"max_ac_packet %d rekey %d\n", "max_ac_packet %d rekey %d\n",
args->v0.version, args->v0.state, args->v0.version, args->v0.state,
...@@ -55,6 +55,13 @@ gt215_hdmi_ctrl(NV50_DISP_MTHD_V1) ...@@ -55,6 +55,13 @@ gt215_hdmi_ctrl(NV50_DISP_MTHD_V1)
} else } else
return ret; return ret;
if ((args->v0.avi_infoframe_length
+ args->v0.vendor_infoframe_length) > size)
return -ENOSYS;
else if ((args->v0.avi_infoframe_length
+ args->v0.vendor_infoframe_length) < size)
return -E2BIG;
if (!(ctrl & 0x40000000)) { if (!(ctrl & 0x40000000)) {
nvkm_mask(device, 0x61c5a4 + soff, 0x40000000, 0x00000000); nvkm_mask(device, 0x61c5a4 + soff, 0x40000000, 0x00000000);
nvkm_mask(device, 0x61c520 + soff, 0x00000001, 0x00000000); nvkm_mask(device, 0x61c520 + soff, 0x00000001, 0x00000000);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment