Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -76,7 +76,9 @@ struct nv50_disp_sor_hdmi_pwr_v0 {
	__u8  state;
	__u8  max_ac_packet;
	__u8  rekey;
	__u8  pad04[4];
	__u8  avi_infoframe_length;
	__u8  vendor_infoframe_length;
	__u8  pad06[2];
};

struct nv50_disp_sor_lvds_script_v0 {
+8 −1
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ g84_hdmi_ctrl(NV50_DISP_MTHD_V1)
	int ret = -ENOSYS;

	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 "
				   "max_ac_packet %d rekey %d\n",
			   args->v0.version, args->v0.state,
@@ -54,6 +54,13 @@ g84_hdmi_ctrl(NV50_DISP_MTHD_V1)
	} else
		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)) {
		nvkm_mask(device, 0x6165a4 + hoff, 0x40000000, 0x00000000);
		nvkm_mask(device, 0x616520 + hoff, 0x00000001, 0x00000000);
+8 −1
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ gf119_hdmi_ctrl(NV50_DISP_MTHD_V1)
	int ret = -ENOSYS;

	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 "
				   "max_ac_packet %d rekey %d\n",
			   args->v0.version, args->v0.state,
@@ -53,6 +53,13 @@ gf119_hdmi_ctrl(NV50_DISP_MTHD_V1)
	} else
		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)) {
		nvkm_mask(device, 0x616798 + hoff, 0x40000000, 0x00000000);
		nvkm_mask(device, 0x6167a4 + hoff, 0x00000001, 0x00000000);
+8 −1
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ gk104_hdmi_ctrl(NV50_DISP_MTHD_V1)
	int ret = -ENOSYS;

	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 "
				   "max_ac_packet %d rekey %d\n",
			   args->v0.version, args->v0.state,
@@ -54,6 +54,13 @@ gk104_hdmi_ctrl(NV50_DISP_MTHD_V1)
	} else
		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)) {
		nvkm_mask(device, 0x616798 + hoff, 0x40000000, 0x00000000);
		nvkm_mask(device, 0x6900c0 + hdmi, 0x00000001, 0x00000000);
+8 −1
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ gt215_hdmi_ctrl(NV50_DISP_MTHD_V1)
	int ret = -ENOSYS;

	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 "
				   "max_ac_packet %d rekey %d\n",
			   args->v0.version, args->v0.state,
@@ -55,6 +55,13 @@ gt215_hdmi_ctrl(NV50_DISP_MTHD_V1)
	} else
		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)) {
		nvkm_mask(device, 0x61c5a4 + soff, 0x40000000, 0x00000000);
		nvkm_mask(device, 0x61c520 + soff, 0x00000001, 0x00000000);