diff options
author | Ilia Mirkin <imirkin@alum.mit.edu> | 2018-09-03 20:57:33 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2018-10-10 19:54:10 -0400 |
commit | 4126b99e744b7a29746e201e2be6644d2edf3c56 (patch) | |
tree | dca22fe1256aec7a017be0aa72bad7a13221a773 /drivers/gpu/drm | |
parent | cfea88a4d86632f28cf80be97079f131645b7869 (diff) |
drm/nouveau/disp: add a way to configure scrambling/tmds for hdmi 2.0
High pixel clocks are required to use a 40 TMDS divider instead of 10,
and even low ones may optionally use scrambling depending on device
support.
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/nouveau/include/nvif/cl5070.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c | 10 |
3 files changed, 13 insertions, 3 deletions
diff --git a/drivers/gpu/drm/nouveau/include/nvif/cl5070.h b/drivers/gpu/drm/nouveau/include/nvif/cl5070.h index 7cdf53615d7b..bced81987269 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/cl5070.h +++ b/drivers/gpu/drm/nouveau/include/nvif/cl5070.h | |||
@@ -69,7 +69,10 @@ struct nv50_disp_sor_hdmi_pwr_v0 { | |||
69 | __u8 rekey; | 69 | __u8 rekey; |
70 | __u8 avi_infoframe_length; | 70 | __u8 avi_infoframe_length; |
71 | __u8 vendor_infoframe_length; | 71 | __u8 vendor_infoframe_length; |
72 | __u8 pad06[2]; | 72 | #define NV50_DISP_SOR_HDMI_PWR_V0_SCDC_SCRAMBLE (1 << 0) |
73 | #define NV50_DISP_SOR_HDMI_PWR_V0_SCDC_DIV_BY_4 (1 << 1) | ||
74 | __u8 scdc; | ||
75 | __u8 pad07[1]; | ||
73 | }; | 76 | }; |
74 | 77 | ||
75 | struct nv50_disp_sor_lvds_script_v0 { | 78 | struct nv50_disp_sor_lvds_script_v0 { |
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h b/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h index 19911211a12a..aa7aa2f21cf6 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h +++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h | |||
@@ -61,6 +61,7 @@ struct nvkm_ior_func { | |||
61 | void (*ctrl)(struct nvkm_ior *, int head, bool enable, | 61 | void (*ctrl)(struct nvkm_ior *, int head, bool enable, |
62 | u8 max_ac_packet, u8 rekey, u8 *avi, u8 avi_size, | 62 | u8 max_ac_packet, u8 rekey, u8 *avi, u8 avi_size, |
63 | u8 *vendor, u8 vendor_size); | 63 | u8 *vendor, u8 vendor_size); |
64 | void (*scdc)(struct nvkm_ior *, int head, u8 scdc); | ||
64 | } hdmi; | 65 | } hdmi; |
65 | 66 | ||
66 | struct { | 67 | struct { |
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c index 3aa5a2879239..5f758948d6e1 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c | |||
@@ -176,9 +176,10 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size) | |||
176 | nvif_ioctl(object, "disp sor hdmi ctrl size %d\n", size); | 176 | nvif_ioctl(object, "disp sor hdmi ctrl size %d\n", size); |
177 | if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) { | 177 | if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) { |
178 | nvif_ioctl(object, "disp sor hdmi ctrl vers %d state %d " | 178 | nvif_ioctl(object, "disp sor hdmi ctrl vers %d state %d " |
179 | "max_ac_packet %d rekey %d\n", | 179 | "max_ac_packet %d rekey %d scdc %d\n", |
180 | args->v0.version, args->v0.state, | 180 | args->v0.version, args->v0.state, |
181 | args->v0.max_ac_packet, args->v0.rekey); | 181 | args->v0.max_ac_packet, args->v0.rekey, |
182 | args->v0.scdc); | ||
182 | if (args->v0.max_ac_packet > 0x1f || args->v0.rekey > 0x7f) | 183 | if (args->v0.max_ac_packet > 0x1f || args->v0.rekey > 0x7f) |
183 | return -EINVAL; | 184 | return -EINVAL; |
184 | if ((args->v0.avi_infoframe_length | 185 | if ((args->v0.avi_infoframe_length |
@@ -202,6 +203,11 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size) | |||
202 | args->v0.max_ac_packet, | 203 | args->v0.max_ac_packet, |
203 | args->v0.rekey, avi, avi_size, | 204 | args->v0.rekey, avi, avi_size, |
204 | vendor, vendor_size); | 205 | vendor, vendor_size); |
206 | |||
207 | if (outp->ior->func->hdmi.scdc) | ||
208 | outp->ior->func->hdmi.scdc( | ||
209 | outp->ior, hidx, args->v0.scdc); | ||
210 | |||
205 | return 0; | 211 | return 0; |
206 | } | 212 | } |
207 | break; | 213 | break; |