union {
struct nv50_disp_sor_hdmi_pwr_v0 v0;
} *args = data;
+ struct packed_hdmi_infoframe avi_infoframe;
+ struct packed_hdmi_infoframe vendor_infoframe;
u32 ctrl;
int ret = -ENOSYS;
+ args->v0.vendor_infoframe_length) < size)
return -E2BIG;
+ pack_hdmi_infoframe(&avi_infoframe,
+ data,
+ args->v0.avi_infoframe_length);
+
+ pack_hdmi_infoframe(&vendor_infoframe,
+ data + args->v0.avi_infoframe_length,
+ args->v0.vendor_infoframe_length);
+
if (!(ctrl & 0x40000000)) {
nvkm_mask(device, 0x616798 + hoff, 0x40000000, 0x00000000);
+ nvkm_mask(device, 0x690100 + hdmi, 0x00000001, 0x00000000);
nvkm_mask(device, 0x6900c0 + hdmi, 0x00000001, 0x00000000);
nvkm_mask(device, 0x690000 + hdmi, 0x00000001, 0x00000000);
return 0;
/* AVI InfoFrame */
nvkm_mask(device, 0x690000 + hdmi, 0x00000001, 0x00000000);
- nvkm_wr32(device, 0x690008 + hdmi, 0x000d0282);
- nvkm_wr32(device, 0x69000c + hdmi, 0x0000006f);
- nvkm_wr32(device, 0x690010 + hdmi, 0x00000000);
- nvkm_wr32(device, 0x690014 + hdmi, 0x00000000);
- nvkm_wr32(device, 0x690018 + hdmi, 0x00000000);
- nvkm_mask(device, 0x690000 + hdmi, 0x00000001, 0x00000001);
+ if (args->v0.avi_infoframe_length) {
+ nvkm_wr32(device, 0x690008 + hdmi, avi_infoframe.header);
+ nvkm_wr32(device, 0x69000c + hdmi, avi_infoframe.subpack0_low);
+ nvkm_wr32(device, 0x690010 + hdmi, avi_infoframe.subpack0_high);
+ nvkm_wr32(device, 0x690014 + hdmi, avi_infoframe.subpack1_low);
+ nvkm_wr32(device, 0x690018 + hdmi, avi_infoframe.subpack1_high);
+ nvkm_mask(device, 0x690000 + hdmi, 0x00000001, 0x00000001);
+ }
+
+ /* GENERIC(?) / Vendor InfoFrame? */
+ nvkm_mask(device, 0x690100 + hdmi, 0x00010001, 0x00000000);
+ if (args->v0.vendor_infoframe_length) {
+ nvkm_wr32(device, 0x690108 + hdmi, vendor_infoframe.header);
+ nvkm_wr32(device, 0x69010c + hdmi, vendor_infoframe.subpack0_low);
+ nvkm_wr32(device, 0x690110 + hdmi, vendor_infoframe.subpack0_high);
+ /* Is there a second (or further?) set of subpack registers here? */
+ nvkm_mask(device, 0x690100 + hdmi, 0x00000001, 0x00000001);
+ }
+
/* ??? InfoFrame? */
nvkm_mask(device, 0x6900c0 + hdmi, 0x00000001, 0x00000000);