Commit 4126b99e authored by Ilia Mirkin's avatar Ilia Mirkin Committed by Ben Skeggs
Browse files

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: default avatarIlia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent cfea88a4
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -69,7 +69,10 @@ struct nv50_disp_sor_hdmi_pwr_v0 {
	__u8  rekey;
	__u8  avi_infoframe_length;
	__u8  vendor_infoframe_length;
	__u8  pad06[2];
#define NV50_DISP_SOR_HDMI_PWR_V0_SCDC_SCRAMBLE (1 << 0)
#define NV50_DISP_SOR_HDMI_PWR_V0_SCDC_DIV_BY_4 (1 << 1)
	__u8  scdc;
	__u8  pad07[1];
};

struct nv50_disp_sor_lvds_script_v0 {
+1 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ struct nvkm_ior_func {
		void (*ctrl)(struct nvkm_ior *, int head, bool enable,
			     u8 max_ac_packet, u8 rekey, u8 *avi, u8 avi_size,
			     u8 *vendor, u8 vendor_size);
		void (*scdc)(struct nvkm_ior *, int head, u8 scdc);
	} hdmi;

	struct {
+8 −2
Original line number Diff line number Diff line
@@ -176,9 +176,10 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
		nvif_ioctl(object, "disp sor hdmi ctrl size %d\n", size);
		if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
			nvif_ioctl(object, "disp sor hdmi ctrl vers %d state %d "
					   "max_ac_packet %d rekey %d\n",
					   "max_ac_packet %d rekey %d scdc %d\n",
				   args->v0.version, args->v0.state,
				   args->v0.max_ac_packet, args->v0.rekey);
				   args->v0.max_ac_packet, args->v0.rekey,
				   args->v0.scdc);
			if (args->v0.max_ac_packet > 0x1f || args->v0.rekey > 0x7f)
				return -EINVAL;
			if ((args->v0.avi_infoframe_length
@@ -202,6 +203,11 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
					   args->v0.max_ac_packet,
					   args->v0.rekey, avi, avi_size,
					   vendor, vendor_size);

		if (outp->ior->func->hdmi.scdc)
			outp->ior->func->hdmi.scdc(
					outp->ior, hidx, args->v0.scdc);

		return 0;
	}
		break;