mirror of
				https://github.com/tiagovignatti/intel-gpu-tools.git
				synced 2025-11-04 03:58:27 +00:00 
			
		
		
		
	intel_infoframes: add support for Gen 4
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
		
							parent
							
								
									0611af4a33
								
							
						
					
					
						commit
						9898083fa2
					
				@ -20,7 +20,7 @@ or
 | 
				
			|||||||
.B --help
 | 
					.B --help
 | 
				
			||||||
options to learn how to use the command
 | 
					options to learn how to use the command
 | 
				
			||||||
.SH LIMITATIONS
 | 
					.SH LIMITATIONS
 | 
				
			||||||
Not all HDMI monitors respect the InfoFrames sent to them. Only Iron Lake
 | 
					Not all HDMI monitors respect the InfoFrames sent to them. Only GEN 4
 | 
				
			||||||
or newer hardware is supported yet.
 | 
					or newer hardware is supported yet.
 | 
				
			||||||
.SH SEE ALSO
 | 
					.SH SEE ALSO
 | 
				
			||||||
HDMI specification, CEA-861 specification.
 | 
					HDMI specification, CEA-861 specification.
 | 
				
			||||||
 | 
				
			|||||||
@ -40,15 +40,19 @@ typedef enum {
 | 
				
			|||||||
} Transcoder;
 | 
					} Transcoder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
	REG_HDMIB      = 0xe1140,
 | 
						REG_HDMIB_GEN4    = 0x61140,
 | 
				
			||||||
	REG_HDMIC      = 0xe1150,
 | 
						REG_HDMIC_GEN4    = 0x61160,
 | 
				
			||||||
	REG_HDMID      = 0xe1160,
 | 
						REG_HDMIB_PCH     = 0xe1140,
 | 
				
			||||||
	REG_DIP_CTL_A  = 0xe0200,
 | 
						REG_HDMIC_PCH     = 0xe1150,
 | 
				
			||||||
	REG_DIP_CTL_B  = 0xe1200,
 | 
						REG_HDMID_PCH     = 0xe1160,
 | 
				
			||||||
	REG_DIP_CTL_C  = 0xe2200,
 | 
						REG_DIP_CTL_GEN4  = 0x61170,
 | 
				
			||||||
	REG_DIP_DATA_A = 0xe0208,
 | 
						REG_DIP_CTL_A     = 0xe0200,
 | 
				
			||||||
	REG_DIP_DATA_B = 0xe1208,
 | 
						REG_DIP_CTL_B     = 0xe1200,
 | 
				
			||||||
	REG_DIP_DATA_C = 0xe2208,
 | 
						REG_DIP_CTL_C     = 0xe2200,
 | 
				
			||||||
 | 
						REG_DIP_DATA_GEN4 = 0x61178,
 | 
				
			||||||
 | 
						REG_DIP_DATA_A    = 0xe0208,
 | 
				
			||||||
 | 
						REG_DIP_DATA_B    = 0xe1208,
 | 
				
			||||||
 | 
						REG_DIP_DATA_C    = 0xe2208,
 | 
				
			||||||
} Register;
 | 
					} Register;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
@ -82,13 +86,14 @@ typedef enum {
 | 
				
			|||||||
	SOURCE_DEVICE_RESERVED          = 0x0c
 | 
						SOURCE_DEVICE_RESERVED          = 0x0c
 | 
				
			||||||
} SourceDevice;
 | 
					} SourceDevice;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HDMI_PORT_ENABLE         (1 << 31)
 | 
					#define HDMI_PORT_ENABLE          (1 << 31)
 | 
				
			||||||
#define HDMI_PORT_TRANSCODER_IBX (1 << 30)
 | 
					#define HDMI_PORT_TRANSCODER_GEN4 (1 << 30)
 | 
				
			||||||
#define HDMI_PORT_TRANSCODER_CPT (3 << 29)
 | 
					#define HDMI_PORT_TRANSCODER_IBX  (1 << 30)
 | 
				
			||||||
#define HDMI_PORT_ENCODING       (3 << 10)
 | 
					#define HDMI_PORT_TRANSCODER_CPT  (3 << 29)
 | 
				
			||||||
#define HDMI_PORT_MODE           (1 << 9)
 | 
					#define HDMI_PORT_ENCODING        (3 << 10)
 | 
				
			||||||
#define HDMI_PORT_AUDIO          (1 << 6)
 | 
					#define HDMI_PORT_MODE            (1 << 9)
 | 
				
			||||||
#define HDMI_PORT_DETECTED       (1 << 2)
 | 
					#define HDMI_PORT_AUDIO           (1 << 6)
 | 
				
			||||||
 | 
					#define HDMI_PORT_DETECTED        (1 << 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DIP_CTL_ENABLE           (1 << 31)
 | 
					#define DIP_CTL_ENABLE           (1 << 31)
 | 
				
			||||||
#define DIP_CTL_GCP_ENABLE       (1 << 25)
 | 
					#define DIP_CTL_GCP_ENABLE       (1 << 25)
 | 
				
			||||||
@ -108,6 +113,11 @@ typedef enum {
 | 
				
			|||||||
#define DIP_CTL_BUFFER_SIZE      (15 << 8)
 | 
					#define DIP_CTL_BUFFER_SIZE      (15 << 8)
 | 
				
			||||||
#define DIP_CTL_ACCESS_ADDR      (15 << 0)
 | 
					#define DIP_CTL_ACCESS_ADDR      (15 << 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DIP_CTL_PORT_SEL_MASK_GEN4       (3 << 29)
 | 
				
			||||||
 | 
					#define DIP_CTL_PORT_SEL_B_GEN4          (1 << 29)
 | 
				
			||||||
 | 
					#define DIP_CTL_PORT_SEL_C_GEN4          (2 << 29)
 | 
				
			||||||
 | 
					#define DIP_CTL_BUFFER_TRANS_ACTIVE_GEN4 (1 << 28)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define AVI_INFOFRAME_TYPE    0x82
 | 
					#define AVI_INFOFRAME_TYPE    0x82
 | 
				
			||||||
#define AVI_INFOFRAME_VERSION 0x02
 | 
					#define AVI_INFOFRAME_VERSION 0x02
 | 
				
			||||||
#define AVI_INFOFRAME_LENGTH  0x0d
 | 
					#define AVI_INFOFRAME_LENGTH  0x0d
 | 
				
			||||||
@ -171,17 +181,21 @@ typedef union {
 | 
				
			|||||||
	uint32_t data32[16];
 | 
						uint32_t data32[16];
 | 
				
			||||||
} DipInfoFrame;
 | 
					} DipInfoFrame;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Register hdmi_ports[] = {
 | 
					Register gen4_hdmi_ports[] = {
 | 
				
			||||||
	REG_HDMIB,
 | 
						REG_HDMIB_GEN4,
 | 
				
			||||||
	REG_HDMIC,
 | 
						REG_HDMIC_GEN4,
 | 
				
			||||||
	REG_HDMID
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
Register dip_ctl_regs[] = {
 | 
					Register pch_hdmi_ports[] = {
 | 
				
			||||||
 | 
						REG_HDMIB_PCH,
 | 
				
			||||||
 | 
						REG_HDMIC_PCH,
 | 
				
			||||||
 | 
						REG_HDMID_PCH
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					Register pch_dip_ctl_regs[] = {
 | 
				
			||||||
	REG_DIP_CTL_A,
 | 
						REG_DIP_CTL_A,
 | 
				
			||||||
	REG_DIP_CTL_B,
 | 
						REG_DIP_CTL_B,
 | 
				
			||||||
	REG_DIP_CTL_C
 | 
						REG_DIP_CTL_C
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
Register dip_data_regs[] = {
 | 
					Register pch_dip_data_regs[] = {
 | 
				
			||||||
	REG_DIP_DATA_A,
 | 
						REG_DIP_DATA_A,
 | 
				
			||||||
	REG_DIP_DATA_B,
 | 
						REG_DIP_DATA_B,
 | 
				
			||||||
	REG_DIP_DATA_C
 | 
						REG_DIP_DATA_C
 | 
				
			||||||
@ -203,6 +217,8 @@ const char *dip_frequency_names[] = {
 | 
				
			|||||||
	"reserved (invalid)"
 | 
						"reserved (invalid)"
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int gen = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const char *spd_source_to_string(SourceDevice source)
 | 
					static const char *spd_source_to_string(SourceDevice source)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	switch (source) {
 | 
						switch (source) {
 | 
				
			||||||
@ -235,11 +251,37 @@ static const char *spd_source_to_string(SourceDevice source)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Register get_dip_ctl_reg(Transcoder transcoder)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (gen == 4)
 | 
				
			||||||
 | 
							return REG_DIP_CTL_GEN4;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return pch_dip_ctl_regs[transcoder];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Register get_dip_data_reg(Transcoder transcoder)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (gen == 4)
 | 
				
			||||||
 | 
							return REG_DIP_DATA_GEN4;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return pch_dip_data_regs[transcoder];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Register get_hdmi_port(int hdmi_port_index)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (gen == 4) {
 | 
				
			||||||
 | 
							assert(hdmi_port_index <= 2);
 | 
				
			||||||
 | 
							return gen4_hdmi_ports[hdmi_port_index];
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return pch_hdmi_ports[hdmi_port_index];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void load_infoframe(Transcoder transcoder, DipInfoFrame *frame,
 | 
					static void load_infoframe(Transcoder transcoder, DipInfoFrame *frame,
 | 
				
			||||||
			   DipType type)
 | 
								   DipType type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register ctl_reg = dip_ctl_regs[transcoder];
 | 
						Register ctl_reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	Register data_reg = dip_data_regs[transcoder];
 | 
						Register data_reg = get_dip_data_reg(transcoder);
 | 
				
			||||||
	uint32_t ctl_val;
 | 
						uint32_t ctl_val;
 | 
				
			||||||
	uint32_t i;
 | 
						uint32_t i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -290,21 +332,23 @@ static void infoframe_fix_checksum(DipInfoFrame *frame)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void dump_port_info(int hdmi_port_index)
 | 
					static void dump_port_info(int hdmi_port_index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register port = hdmi_ports[hdmi_port_index];
 | 
						Register port = get_hdmi_port(hdmi_port_index);
 | 
				
			||||||
	uint32_t val = INREG(port);
 | 
						uint32_t val = INREG(port);
 | 
				
			||||||
	Transcoder transcoder;
 | 
						Transcoder transcoder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printf("\nPort %s:\n", hdmi_port_names[hdmi_port_index]);
 | 
						printf("\nPort %s:\n", hdmi_port_names[hdmi_port_index]);
 | 
				
			||||||
	printf("- %sdetected\n", val & HDMI_PORT_DETECTED ? "" : "not  ");
 | 
						printf("- %sdetected\n", val & HDMI_PORT_DETECTED ? "" : "not ");
 | 
				
			||||||
	printf("- %s\n", val & HDMI_PORT_ENABLE ? "enabled" : "disabled");
 | 
						printf("- %s\n", val & HDMI_PORT_ENABLE ? "enabled" : "disabled");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(val & HDMI_PORT_ENABLE))
 | 
						if (!(val & HDMI_PORT_ENABLE))
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (pch >= PCH_CPT)
 | 
						if (gen == 4)
 | 
				
			||||||
 | 
							transcoder = (val & HDMI_PORT_TRANSCODER_GEN4) >> 30;
 | 
				
			||||||
 | 
						else if (pch >= PCH_CPT)
 | 
				
			||||||
		transcoder = (val & HDMI_PORT_TRANSCODER_CPT) >> 29;
 | 
							transcoder = (val & HDMI_PORT_TRANSCODER_CPT) >> 29;
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		transcoder = (val & HDMI_PORT_TRANSCODER_CPT) >> 30;
 | 
							transcoder = (val & HDMI_PORT_TRANSCODER_IBX) >> 30;
 | 
				
			||||||
	printf("- transcoder: %s\n", transcoder_names[transcoder]);
 | 
						printf("- transcoder: %s\n", transcoder_names[transcoder]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch ((val & HDMI_PORT_ENCODING) >> 10) {
 | 
						switch ((val & HDMI_PORT_ENCODING) >> 10) {
 | 
				
			||||||
@ -336,7 +380,7 @@ static void dump_raw_infoframe(DipInfoFrame *frame)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void dump_avi_info(Transcoder transcoder)
 | 
					static void dump_avi_info(Transcoder transcoder)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register reg = dip_ctl_regs[transcoder];
 | 
						Register reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	uint32_t val = INREG(reg);
 | 
						uint32_t val = INREG(reg);
 | 
				
			||||||
	DipFrequency freq;
 | 
						DipFrequency freq;
 | 
				
			||||||
	DipInfoFrame frame;
 | 
						DipInfoFrame frame;
 | 
				
			||||||
@ -346,6 +390,11 @@ static void dump_avi_info(Transcoder transcoder)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	printf("AVI InfoFrame:\n");
 | 
						printf("AVI InfoFrame:\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (gen == 4) {
 | 
				
			||||||
 | 
							printf("- %sbeing transmitted\n",
 | 
				
			||||||
 | 
							       val & DIP_CTL_BUFFER_TRANS_ACTIVE_GEN4 ? "" : "not ");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	freq = (val & DIP_CTL_FREQUENCY) >> 16;
 | 
						freq = (val & DIP_CTL_FREQUENCY) >> 16;
 | 
				
			||||||
	printf("- frequency: %s\n", dip_frequency_names[freq]);
 | 
						printf("- frequency: %s\n", dip_frequency_names[freq]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -377,7 +426,7 @@ static void dump_avi_info(Transcoder transcoder)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void dump_vendor_info(Transcoder transcoder)
 | 
					static void dump_vendor_info(Transcoder transcoder)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register reg = dip_ctl_regs[transcoder];
 | 
						Register reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	uint32_t val = INREG(reg);
 | 
						uint32_t val = INREG(reg);
 | 
				
			||||||
	DipFrequency freq;
 | 
						DipFrequency freq;
 | 
				
			||||||
	DipInfoFrame frame;
 | 
						DipInfoFrame frame;
 | 
				
			||||||
@ -387,6 +436,11 @@ static void dump_vendor_info(Transcoder transcoder)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	printf("Vendor InfoFrame:\n");
 | 
						printf("Vendor InfoFrame:\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (gen == 4) {
 | 
				
			||||||
 | 
							printf("- %sbeing transmitted\n",
 | 
				
			||||||
 | 
							       val & DIP_CTL_BUFFER_TRANS_ACTIVE_GEN4 ? "" : "not ");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	freq = (val & DIP_CTL_FREQUENCY) >> 16;
 | 
						freq = (val & DIP_CTL_FREQUENCY) >> 16;
 | 
				
			||||||
	printf("- frequency: %s\n", dip_frequency_names[freq]);
 | 
						printf("- frequency: %s\n", dip_frequency_names[freq]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -398,7 +452,7 @@ static void dump_vendor_info(Transcoder transcoder)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void dump_gamut_info(Transcoder transcoder)
 | 
					static void dump_gamut_info(Transcoder transcoder)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register reg = dip_ctl_regs[transcoder];
 | 
						Register reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	uint32_t val = INREG(reg);
 | 
						uint32_t val = INREG(reg);
 | 
				
			||||||
	DipFrequency freq;
 | 
						DipFrequency freq;
 | 
				
			||||||
	DipInfoFrame frame;
 | 
						DipInfoFrame frame;
 | 
				
			||||||
@ -408,6 +462,11 @@ static void dump_gamut_info(Transcoder transcoder)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	printf("Gamut InfoFrame:\n");
 | 
						printf("Gamut InfoFrame:\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (gen == 4) {
 | 
				
			||||||
 | 
							printf("- %sbeing transmitted\n",
 | 
				
			||||||
 | 
							       val & DIP_CTL_BUFFER_TRANS_ACTIVE_GEN4 ? "" : "not ");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	freq = (val & DIP_CTL_FREQUENCY) >> 16;
 | 
						freq = (val & DIP_CTL_FREQUENCY) >> 16;
 | 
				
			||||||
	printf("- frequency: %s\n", dip_frequency_names[freq]);
 | 
						printf("- frequency: %s\n", dip_frequency_names[freq]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -419,7 +478,7 @@ static void dump_gamut_info(Transcoder transcoder)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void dump_spd_info(Transcoder transcoder)
 | 
					static void dump_spd_info(Transcoder transcoder)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register reg = dip_ctl_regs[transcoder];
 | 
						Register reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	uint32_t val = INREG(reg);
 | 
						uint32_t val = INREG(reg);
 | 
				
			||||||
	DipFrequency freq;
 | 
						DipFrequency freq;
 | 
				
			||||||
	DipInfoFrame frame;
 | 
						DipInfoFrame frame;
 | 
				
			||||||
@ -431,6 +490,11 @@ static void dump_spd_info(Transcoder transcoder)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	printf("SPD InfoFrame:\n");
 | 
						printf("SPD InfoFrame:\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (gen == 4) {
 | 
				
			||||||
 | 
							printf("- %sbeing transmitted\n",
 | 
				
			||||||
 | 
							       val & DIP_CTL_BUFFER_TRANS_ACTIVE_GEN4 ? "" : "not ");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	freq = (val & DIP_CTL_FREQUENCY) >> 16;
 | 
						freq = (val & DIP_CTL_FREQUENCY) >> 16;
 | 
				
			||||||
	printf("- frequency: %s\n", dip_frequency_names[freq]);
 | 
						printf("- frequency: %s\n", dip_frequency_names[freq]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -456,10 +520,24 @@ static void dump_spd_info(Transcoder transcoder)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void dump_transcoder_info(Transcoder transcoder)
 | 
					static void dump_transcoder_info(Transcoder transcoder)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register reg = dip_ctl_regs[transcoder];
 | 
						Register reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	uint32_t val = INREG(reg);
 | 
						uint32_t val = INREG(reg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printf("\nTranscoder %s:\n", transcoder_names[transcoder]);
 | 
						if (gen == 4) {
 | 
				
			||||||
 | 
							printf("\nDIP information:\n");
 | 
				
			||||||
 | 
							switch (val & DIP_CTL_PORT_SEL_MASK_GEN4) {
 | 
				
			||||||
 | 
							case DIP_CTL_PORT_SEL_B_GEN4:
 | 
				
			||||||
 | 
								printf("- port B\n");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case DIP_CTL_PORT_SEL_C_GEN4:
 | 
				
			||||||
 | 
								printf("- port C\n");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								printf("- INVALID port!\n");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							printf("\nTranscoder %s:\n", transcoder_names[transcoder]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	printf("- %s\n", val & DIP_CTL_ENABLE ? "enabled" : "disabled");
 | 
						printf("- %s\n", val & DIP_CTL_ENABLE ? "enabled" : "disabled");
 | 
				
			||||||
	if (!(val & DIP_CTL_ENABLE))
 | 
						if (!(val & DIP_CTL_ENABLE))
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
@ -481,17 +559,23 @@ static void dump_all_info(void)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < ARRAY_SIZE(hdmi_ports); i++)
 | 
						if (gen == 4) {
 | 
				
			||||||
		dump_port_info(i);
 | 
							for (i = 0; i < ARRAY_SIZE(gen4_hdmi_ports); i++)
 | 
				
			||||||
	for (i = 0; i < ARRAY_SIZE(dip_ctl_regs); i++)
 | 
								dump_port_info(i);
 | 
				
			||||||
		dump_transcoder_info(i);
 | 
							dump_transcoder_info(0);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							for (i = 0; i < ARRAY_SIZE(pch_hdmi_ports); i++)
 | 
				
			||||||
 | 
								dump_port_info(i);
 | 
				
			||||||
 | 
							for (i = 0; i < ARRAY_SIZE(pch_dip_ctl_regs); i++)
 | 
				
			||||||
 | 
								dump_transcoder_info(i);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void write_infoframe(Transcoder transcoder, DipType type,
 | 
					static void write_infoframe(Transcoder transcoder, DipType type,
 | 
				
			||||||
			    DipInfoFrame *frame)
 | 
								    DipInfoFrame *frame)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register ctl_reg = dip_ctl_regs[transcoder];
 | 
						Register ctl_reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	Register data_reg = dip_data_regs[transcoder];
 | 
						Register data_reg = get_dip_data_reg(transcoder);
 | 
				
			||||||
	uint32_t ctl_val;
 | 
						uint32_t ctl_val;
 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -510,9 +594,9 @@ static void write_infoframe(Transcoder transcoder, DipType type,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void disable_infoframe(Transcoder transcoder, DipType type)
 | 
					static void disable_infoframe(Transcoder transcoder, DipType type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register reg = dip_ctl_regs[transcoder];
 | 
						Register reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	uint32_t val = INREG(reg);
 | 
						uint32_t val = INREG(reg);
 | 
				
			||||||
	if (type == DIP_AVI)
 | 
						if (gen != 4 && type == DIP_AVI)
 | 
				
			||||||
		val &= ~DIP_CTL_ENABLE;
 | 
							val &= ~DIP_CTL_ENABLE;
 | 
				
			||||||
	val &= ~(1 << (21 + type));
 | 
						val &= ~(1 << (21 + type));
 | 
				
			||||||
	OUTREG(reg, val);
 | 
						OUTREG(reg, val);
 | 
				
			||||||
@ -520,9 +604,9 @@ static void disable_infoframe(Transcoder transcoder, DipType type)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void enable_infoframe(Transcoder transcoder, DipType type)
 | 
					static void enable_infoframe(Transcoder transcoder, DipType type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register reg = dip_ctl_regs[transcoder];
 | 
						Register reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	uint32_t val = INREG(reg);
 | 
						uint32_t val = INREG(reg);
 | 
				
			||||||
	if (type == DIP_AVI)
 | 
						if (gen != 4 && type == DIP_AVI)
 | 
				
			||||||
		val |= DIP_CTL_ENABLE;
 | 
							val |= DIP_CTL_ENABLE;
 | 
				
			||||||
	val |= (1 << (21 + type));
 | 
						val |= (1 << (21 + type));
 | 
				
			||||||
	OUTREG(reg, val);
 | 
						OUTREG(reg, val);
 | 
				
			||||||
@ -575,7 +659,7 @@ static int parse_infoframe_option_s(const char *name, const char *s,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void change_avi_infoframe(Transcoder transcoder, char *commands)
 | 
					static void change_avi_infoframe(Transcoder transcoder, char *commands)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register reg = dip_ctl_regs[transcoder];
 | 
						Register reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	uint32_t val = INREG(reg);
 | 
						uint32_t val = INREG(reg);
 | 
				
			||||||
	DipInfoFrame frame;
 | 
						DipInfoFrame frame;
 | 
				
			||||||
	char option[32];
 | 
						char option[32];
 | 
				
			||||||
@ -675,7 +759,7 @@ static void change_avi_infoframe(Transcoder transcoder, char *commands)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void change_spd_infoframe(Transcoder transcoder, char *commands)
 | 
					static void change_spd_infoframe(Transcoder transcoder, char *commands)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register reg = dip_ctl_regs[transcoder];
 | 
						Register reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	uint32_t val = INREG(reg);
 | 
						uint32_t val = INREG(reg);
 | 
				
			||||||
	DipInfoFrame frame;
 | 
						DipInfoFrame frame;
 | 
				
			||||||
	char option[16];
 | 
						char option[16];
 | 
				
			||||||
@ -742,7 +826,7 @@ static void change_infoframe_checksum(Transcoder transcoder, DipType type,
 | 
				
			|||||||
static void change_infoframe_frequency(Transcoder transcoder, DipType type,
 | 
					static void change_infoframe_frequency(Transcoder transcoder, DipType type,
 | 
				
			||||||
				       DipFrequency frequency)
 | 
									       DipFrequency frequency)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register reg = dip_ctl_regs[transcoder];
 | 
						Register reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	uint32_t val = INREG(reg);
 | 
						uint32_t val = INREG(reg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (type == DIP_AVI && frequency != DIP_FREQ_EVERY_VSYNC) {
 | 
						if (type == DIP_AVI && frequency != DIP_FREQ_EVERY_VSYNC) {
 | 
				
			||||||
@ -757,7 +841,7 @@ static void change_infoframe_frequency(Transcoder transcoder, DipType type,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void disable_dip(Transcoder transcoder)
 | 
					static void disable_dip(Transcoder transcoder)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register reg = dip_ctl_regs[transcoder];
 | 
						Register reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	uint32_t val = INREG(reg);
 | 
						uint32_t val = INREG(reg);
 | 
				
			||||||
	val &= ~DIP_CTL_ENABLE;
 | 
						val &= ~DIP_CTL_ENABLE;
 | 
				
			||||||
	OUTREG(reg, val);
 | 
						OUTREG(reg, val);
 | 
				
			||||||
@ -765,7 +849,7 @@ static void disable_dip(Transcoder transcoder)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void enable_dip(Transcoder transcoder)
 | 
					static void enable_dip(Transcoder transcoder)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Register reg = dip_ctl_regs[transcoder];
 | 
						Register reg = get_dip_ctl_reg(transcoder);
 | 
				
			||||||
	uint32_t val = INREG(reg);
 | 
						uint32_t val = INREG(reg);
 | 
				
			||||||
	val |= DIP_CTL_ENABLE;
 | 
						val |= DIP_CTL_ENABLE;
 | 
				
			||||||
	OUTREG(reg, val);
 | 
						OUTREG(reg, val);
 | 
				
			||||||
@ -908,8 +992,16 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
	intel_register_access_init(pci_dev, 0);
 | 
						intel_register_access_init(pci_dev, 0);
 | 
				
			||||||
	intel_check_pch();
 | 
						intel_check_pch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!HAS_PCH_SPLIT(pci_dev->device_id)) {
 | 
						if (IS_GEN4(pci_dev->device_id))
 | 
				
			||||||
		printf("This program still only supports ILK or newer.\n");
 | 
							gen = 4;
 | 
				
			||||||
 | 
						else if (IS_GEN5(pci_dev->device_id))
 | 
				
			||||||
 | 
							gen = 5;
 | 
				
			||||||
 | 
						else if (IS_GEN6(pci_dev->device_id))
 | 
				
			||||||
 | 
							gen = 6;
 | 
				
			||||||
 | 
						else if (IS_GEN7(pci_dev->device_id))
 | 
				
			||||||
 | 
							gen = 7;
 | 
				
			||||||
 | 
						else {
 | 
				
			||||||
 | 
							printf("This program does not support your hardware yet.\n");
 | 
				
			||||||
		ret = 1;
 | 
							ret = 1;
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -991,11 +1083,11 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
		case 'p':
 | 
							case 'p':
 | 
				
			||||||
		case 'P':
 | 
							case 'P':
 | 
				
			||||||
			if (!strcmp(optarg, "B"))
 | 
								if (!strcmp(optarg, "B"))
 | 
				
			||||||
				hdmi_port = REG_HDMIB;
 | 
									hdmi_port = get_hdmi_port(0);
 | 
				
			||||||
			else if (!strcmp(optarg, "C"))
 | 
								else if (!strcmp(optarg, "C"))
 | 
				
			||||||
				hdmi_port = REG_HDMIC;
 | 
									hdmi_port = get_hdmi_port(1);
 | 
				
			||||||
			else if (!strcmp(optarg, "D"))
 | 
								else if (!strcmp(optarg, "D"))
 | 
				
			||||||
				hdmi_port = REG_HDMID;
 | 
									hdmi_port = get_hdmi_port(2);
 | 
				
			||||||
			else {
 | 
								else {
 | 
				
			||||||
				printf("Invalid HDMI port.\n");
 | 
									printf("Invalid HDMI port.\n");
 | 
				
			||||||
				ret = 1;
 | 
									ret = 1;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user