1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2012 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker *
4*d83cc019SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker *
11*d83cc019SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker * Software.
14*d83cc019SAndroid Build Coastguard Worker *
15*d83cc019SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*d83cc019SAndroid Build Coastguard Worker * DEALINGS IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker *
23*d83cc019SAndroid Build Coastguard Worker * Authors:
24*d83cc019SAndroid Build Coastguard Worker * Paulo Zanoni <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker *
26*d83cc019SAndroid Build Coastguard Worker */
27*d83cc019SAndroid Build Coastguard Worker
28*d83cc019SAndroid Build Coastguard Worker #include <assert.h>
29*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
30*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
31*d83cc019SAndroid Build Coastguard Worker #include <string.h>
32*d83cc019SAndroid Build Coastguard Worker #include <getopt.h>
33*d83cc019SAndroid Build Coastguard Worker #include "intel_io.h"
34*d83cc019SAndroid Build Coastguard Worker #include "intel_chipset.h"
35*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
36*d83cc019SAndroid Build Coastguard Worker
37*d83cc019SAndroid Build Coastguard Worker typedef enum {
38*d83cc019SAndroid Build Coastguard Worker TRANSC_A = 0,
39*d83cc019SAndroid Build Coastguard Worker TRANSC_B = 1,
40*d83cc019SAndroid Build Coastguard Worker TRANSC_C = 2,
41*d83cc019SAndroid Build Coastguard Worker TRANSC_INVALID
42*d83cc019SAndroid Build Coastguard Worker } Transcoder;
43*d83cc019SAndroid Build Coastguard Worker
44*d83cc019SAndroid Build Coastguard Worker typedef enum {
45*d83cc019SAndroid Build Coastguard Worker REG_HDMIB_GEN4 = 0x61140,
46*d83cc019SAndroid Build Coastguard Worker REG_HDMIC_GEN4 = 0x61160,
47*d83cc019SAndroid Build Coastguard Worker REG_HDMIB_VLV = 0x1e1140,
48*d83cc019SAndroid Build Coastguard Worker REG_HDMIC_VLV = 0x1e1160,
49*d83cc019SAndroid Build Coastguard Worker REG_HDMIB_PCH = 0xe1140,
50*d83cc019SAndroid Build Coastguard Worker REG_HDMIC_PCH = 0xe1150,
51*d83cc019SAndroid Build Coastguard Worker REG_HDMID_PCH = 0xe1160,
52*d83cc019SAndroid Build Coastguard Worker REG_DIP_CTL_GEN4 = 0x61170,
53*d83cc019SAndroid Build Coastguard Worker REG_DIP_CTL_A_VLV = 0x1e0200,
54*d83cc019SAndroid Build Coastguard Worker REG_DIP_CTL_B_VLV = 0x1e1170,
55*d83cc019SAndroid Build Coastguard Worker REG_DIP_CTL_A = 0xe0200,
56*d83cc019SAndroid Build Coastguard Worker REG_DIP_CTL_B = 0xe1200,
57*d83cc019SAndroid Build Coastguard Worker REG_DIP_CTL_C = 0xe2200,
58*d83cc019SAndroid Build Coastguard Worker REG_DIP_DATA_GEN4 = 0x61178,
59*d83cc019SAndroid Build Coastguard Worker REG_DIP_DATA_A_VLV = 0x1e0208,
60*d83cc019SAndroid Build Coastguard Worker REG_DIP_DATA_B_VLV = 0x1e1174,
61*d83cc019SAndroid Build Coastguard Worker REG_DIP_DATA_A = 0xe0208,
62*d83cc019SAndroid Build Coastguard Worker REG_DIP_DATA_B = 0xe1208,
63*d83cc019SAndroid Build Coastguard Worker REG_DIP_DATA_C = 0xe2208,
64*d83cc019SAndroid Build Coastguard Worker } Register;
65*d83cc019SAndroid Build Coastguard Worker
66*d83cc019SAndroid Build Coastguard Worker typedef enum {
67*d83cc019SAndroid Build Coastguard Worker DIP_AVI = 0,
68*d83cc019SAndroid Build Coastguard Worker DIP_VENDOR = 1,
69*d83cc019SAndroid Build Coastguard Worker DIP_GAMUT = 2,
70*d83cc019SAndroid Build Coastguard Worker DIP_SPD = 3,
71*d83cc019SAndroid Build Coastguard Worker DIP_INVALID,
72*d83cc019SAndroid Build Coastguard Worker } DipType;
73*d83cc019SAndroid Build Coastguard Worker
74*d83cc019SAndroid Build Coastguard Worker typedef enum {
75*d83cc019SAndroid Build Coastguard Worker DIP_FREQ_ONCE = 0,
76*d83cc019SAndroid Build Coastguard Worker DIP_FREQ_EVERY_VSYNC = 1,
77*d83cc019SAndroid Build Coastguard Worker DIP_FREQ_EVERY_OTHER_VSYNC = 2,
78*d83cc019SAndroid Build Coastguard Worker DIP_FREQ_RESERVED = 3,
79*d83cc019SAndroid Build Coastguard Worker } DipFrequency;
80*d83cc019SAndroid Build Coastguard Worker
81*d83cc019SAndroid Build Coastguard Worker typedef enum {
82*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_UNKNOWN = 0x00,
83*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_DIGITAL_STB = 0x01,
84*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_DVD_PLAYER = 0x02,
85*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_D_VHS = 0x03,
86*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_HDD_VIDEORECORDER = 0x04,
87*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_DVC = 0x05,
88*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_DSC = 0x06,
89*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_VIDEO_CD = 0x07,
90*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_GAME = 0x08,
91*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_PC_GENERAL = 0x09,
92*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_BLU_RAY_DISK = 0x0a,
93*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_SUPER_AUDIO_CD = 0x0b,
94*d83cc019SAndroid Build Coastguard Worker SOURCE_DEVICE_RESERVED = 0x0c
95*d83cc019SAndroid Build Coastguard Worker } SourceDevice;
96*d83cc019SAndroid Build Coastguard Worker
97*d83cc019SAndroid Build Coastguard Worker #define HDMI_PORT_ENABLE (1 << 31)
98*d83cc019SAndroid Build Coastguard Worker #define HDMI_PORT_TRANSCODER_GEN4 (1 << 30)
99*d83cc019SAndroid Build Coastguard Worker #define HDMI_PORT_TRANSCODER_IBX (1 << 30)
100*d83cc019SAndroid Build Coastguard Worker #define HDMI_PORT_TRANSCODER_CPT (3 << 29)
101*d83cc019SAndroid Build Coastguard Worker #define HDMI_PORT_ENCODING (3 << 10)
102*d83cc019SAndroid Build Coastguard Worker #define HDMI_PORT_MODE (1 << 9)
103*d83cc019SAndroid Build Coastguard Worker #define HDMI_PORT_AUDIO (1 << 6)
104*d83cc019SAndroid Build Coastguard Worker #define HDMI_PORT_DETECTED (1 << 2)
105*d83cc019SAndroid Build Coastguard Worker
106*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_ENABLE (1 << 31)
107*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_GCP_ENABLE (1 << 25)
108*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_SPD_ENABLE (1 << 24)
109*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_GAMUT_ENABLE (1 << 23)
110*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_VENDOR_ENABLE (1 << 22)
111*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_AVI_ENABLE (1 << 21)
112*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_BUFFER_INDEX (3 << 19)
113*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_BUFFER_AVI (0 << 19)
114*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_BUFFER_VENDOR (1 << 19)
115*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_BUFFER_GAMUT (2 << 19)
116*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_BUFFER_SPD (3 << 19)
117*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_FREQUENCY (3 << 16)
118*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_FREQ_ONCE (0 << 16)
119*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_FREQ_EVERY (1 << 16)
120*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_FREQ_EVERY_OTHER (2 << 16)
121*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_BUFFER_SIZE (15 << 8)
122*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_ACCESS_ADDR (15 << 0)
123*d83cc019SAndroid Build Coastguard Worker
124*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_PORT_SEL_MASK_GEN4 (3 << 29)
125*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_PORT_SEL_B_GEN4 (1 << 29)
126*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_PORT_SEL_C_GEN4 (2 << 29)
127*d83cc019SAndroid Build Coastguard Worker #define DIP_CTL_BUFFER_TRANS_ACTIVE_GEN4 (1 << 28)
128*d83cc019SAndroid Build Coastguard Worker
129*d83cc019SAndroid Build Coastguard Worker #define AVI_INFOFRAME_TYPE 0x82
130*d83cc019SAndroid Build Coastguard Worker #define AVI_INFOFRAME_VERSION 0x02
131*d83cc019SAndroid Build Coastguard Worker #define AVI_INFOFRAME_LENGTH 0x0d
132*d83cc019SAndroid Build Coastguard Worker #define SPD_INFOFRAME_TYPE 0x83
133*d83cc019SAndroid Build Coastguard Worker #define SPD_INFOFRAME_VERSION 0x01
134*d83cc019SAndroid Build Coastguard Worker #define SPD_INFOFRAME_LENGTH 0x19
135*d83cc019SAndroid Build Coastguard Worker
136*d83cc019SAndroid Build Coastguard Worker #define VENDOR_ID_HDMI 0x000c03
137*d83cc019SAndroid Build Coastguard Worker
138*d83cc019SAndroid Build Coastguard Worker typedef struct {
139*d83cc019SAndroid Build Coastguard Worker uint8_t type;
140*d83cc019SAndroid Build Coastguard Worker uint8_t version;
141*d83cc019SAndroid Build Coastguard Worker uint8_t length;
142*d83cc019SAndroid Build Coastguard Worker uint8_t ecc;
143*d83cc019SAndroid Build Coastguard Worker } DipInfoFrameHeader;
144*d83cc019SAndroid Build Coastguard Worker
145*d83cc019SAndroid Build Coastguard Worker typedef union {
146*d83cc019SAndroid Build Coastguard Worker struct {
147*d83cc019SAndroid Build Coastguard Worker DipInfoFrameHeader header;
148*d83cc019SAndroid Build Coastguard Worker uint8_t checksum;
149*d83cc019SAndroid Build Coastguard Worker
150*d83cc019SAndroid Build Coastguard Worker uint8_t S :2;
151*d83cc019SAndroid Build Coastguard Worker uint8_t B :2;
152*d83cc019SAndroid Build Coastguard Worker uint8_t A :1;
153*d83cc019SAndroid Build Coastguard Worker uint8_t Y :2;
154*d83cc019SAndroid Build Coastguard Worker uint8_t Rsvd0 :1;
155*d83cc019SAndroid Build Coastguard Worker
156*d83cc019SAndroid Build Coastguard Worker uint8_t R :4;
157*d83cc019SAndroid Build Coastguard Worker uint8_t M :2;
158*d83cc019SAndroid Build Coastguard Worker uint8_t C :2;
159*d83cc019SAndroid Build Coastguard Worker
160*d83cc019SAndroid Build Coastguard Worker uint8_t SC :2;
161*d83cc019SAndroid Build Coastguard Worker uint8_t Q :2;
162*d83cc019SAndroid Build Coastguard Worker uint8_t EC :3;
163*d83cc019SAndroid Build Coastguard Worker uint8_t ITC :1;
164*d83cc019SAndroid Build Coastguard Worker
165*d83cc019SAndroid Build Coastguard Worker uint8_t VIC :7;
166*d83cc019SAndroid Build Coastguard Worker uint8_t Rsvd1 :1;
167*d83cc019SAndroid Build Coastguard Worker
168*d83cc019SAndroid Build Coastguard Worker uint8_t PR :4;
169*d83cc019SAndroid Build Coastguard Worker uint8_t Rsvd2 :4;
170*d83cc019SAndroid Build Coastguard Worker
171*d83cc019SAndroid Build Coastguard Worker uint16_t top;
172*d83cc019SAndroid Build Coastguard Worker uint16_t bottom;
173*d83cc019SAndroid Build Coastguard Worker uint16_t left;
174*d83cc019SAndroid Build Coastguard Worker uint16_t right;
175*d83cc019SAndroid Build Coastguard Worker
176*d83cc019SAndroid Build Coastguard Worker uint16_t Rsvd3;
177*d83cc019SAndroid Build Coastguard Worker uint32_t Rsvd4[3];
178*d83cc019SAndroid Build Coastguard Worker } avi;
179*d83cc019SAndroid Build Coastguard Worker struct {
180*d83cc019SAndroid Build Coastguard Worker DipInfoFrameHeader header;
181*d83cc019SAndroid Build Coastguard Worker uint8_t checksum;
182*d83cc019SAndroid Build Coastguard Worker uint8_t vendor[8];
183*d83cc019SAndroid Build Coastguard Worker uint8_t description[16];
184*d83cc019SAndroid Build Coastguard Worker uint8_t source;
185*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)) spd;
186*d83cc019SAndroid Build Coastguard Worker struct {
187*d83cc019SAndroid Build Coastguard Worker DipInfoFrameHeader header;
188*d83cc019SAndroid Build Coastguard Worker uint8_t checksum;
189*d83cc019SAndroid Build Coastguard Worker
190*d83cc019SAndroid Build Coastguard Worker uint8_t id[3];
191*d83cc019SAndroid Build Coastguard Worker
192*d83cc019SAndroid Build Coastguard Worker uint8_t Rsvd0 :5;
193*d83cc019SAndroid Build Coastguard Worker uint8_t video_format :3;
194*d83cc019SAndroid Build Coastguard Worker
195*d83cc019SAndroid Build Coastguard Worker union {
196*d83cc019SAndroid Build Coastguard Worker uint8_t vic;
197*d83cc019SAndroid Build Coastguard Worker struct {
198*d83cc019SAndroid Build Coastguard Worker uint8_t Rsvd1 :4;
199*d83cc019SAndroid Build Coastguard Worker uint8_t s3d_structure :4;
200*d83cc019SAndroid Build Coastguard Worker } s3d;
201*d83cc019SAndroid Build Coastguard Worker } pb5;
202*d83cc019SAndroid Build Coastguard Worker
203*d83cc019SAndroid Build Coastguard Worker uint8_t Rsvd2 :4;
204*d83cc019SAndroid Build Coastguard Worker uint8_t s3d_ext_data :4;
205*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)) vendor;
206*d83cc019SAndroid Build Coastguard Worker struct {
207*d83cc019SAndroid Build Coastguard Worker DipInfoFrameHeader header;
208*d83cc019SAndroid Build Coastguard Worker uint8_t body[27];
209*d83cc019SAndroid Build Coastguard Worker } generic;
210*d83cc019SAndroid Build Coastguard Worker uint8_t data8[128];
211*d83cc019SAndroid Build Coastguard Worker uint32_t data32[16];
212*d83cc019SAndroid Build Coastguard Worker } DipInfoFrame;
213*d83cc019SAndroid Build Coastguard Worker
214*d83cc019SAndroid Build Coastguard Worker Register vlv_hdmi_ports[] = {
215*d83cc019SAndroid Build Coastguard Worker REG_HDMIB_VLV,
216*d83cc019SAndroid Build Coastguard Worker REG_HDMIC_VLV,
217*d83cc019SAndroid Build Coastguard Worker };
218*d83cc019SAndroid Build Coastguard Worker
219*d83cc019SAndroid Build Coastguard Worker Register vlv_dip_ctl_regs[] = {
220*d83cc019SAndroid Build Coastguard Worker REG_DIP_CTL_A_VLV,
221*d83cc019SAndroid Build Coastguard Worker REG_DIP_CTL_B_VLV,
222*d83cc019SAndroid Build Coastguard Worker };
223*d83cc019SAndroid Build Coastguard Worker
224*d83cc019SAndroid Build Coastguard Worker Register vlv_dip_data_regs[] = {
225*d83cc019SAndroid Build Coastguard Worker REG_DIP_DATA_A_VLV,
226*d83cc019SAndroid Build Coastguard Worker REG_DIP_DATA_B_VLV,
227*d83cc019SAndroid Build Coastguard Worker };
228*d83cc019SAndroid Build Coastguard Worker
229*d83cc019SAndroid Build Coastguard Worker Register gen4_hdmi_ports[] = {
230*d83cc019SAndroid Build Coastguard Worker REG_HDMIB_GEN4,
231*d83cc019SAndroid Build Coastguard Worker REG_HDMIC_GEN4,
232*d83cc019SAndroid Build Coastguard Worker };
233*d83cc019SAndroid Build Coastguard Worker Register pch_hdmi_ports[] = {
234*d83cc019SAndroid Build Coastguard Worker REG_HDMIB_PCH,
235*d83cc019SAndroid Build Coastguard Worker REG_HDMIC_PCH,
236*d83cc019SAndroid Build Coastguard Worker REG_HDMID_PCH
237*d83cc019SAndroid Build Coastguard Worker };
238*d83cc019SAndroid Build Coastguard Worker Register pch_dip_ctl_regs[] = {
239*d83cc019SAndroid Build Coastguard Worker REG_DIP_CTL_A,
240*d83cc019SAndroid Build Coastguard Worker REG_DIP_CTL_B,
241*d83cc019SAndroid Build Coastguard Worker REG_DIP_CTL_C
242*d83cc019SAndroid Build Coastguard Worker };
243*d83cc019SAndroid Build Coastguard Worker Register pch_dip_data_regs[] = {
244*d83cc019SAndroid Build Coastguard Worker REG_DIP_DATA_A,
245*d83cc019SAndroid Build Coastguard Worker REG_DIP_DATA_B,
246*d83cc019SAndroid Build Coastguard Worker REG_DIP_DATA_C
247*d83cc019SAndroid Build Coastguard Worker };
248*d83cc019SAndroid Build Coastguard Worker const char *hdmi_port_names[] = {
249*d83cc019SAndroid Build Coastguard Worker "HDMIB",
250*d83cc019SAndroid Build Coastguard Worker "HDMIC",
251*d83cc019SAndroid Build Coastguard Worker "HDMID"
252*d83cc019SAndroid Build Coastguard Worker };
253*d83cc019SAndroid Build Coastguard Worker const char *transcoder_names[] = {
254*d83cc019SAndroid Build Coastguard Worker "A",
255*d83cc019SAndroid Build Coastguard Worker "B",
256*d83cc019SAndroid Build Coastguard Worker "C"
257*d83cc019SAndroid Build Coastguard Worker };
258*d83cc019SAndroid Build Coastguard Worker const char *dip_frequency_names[] = {
259*d83cc019SAndroid Build Coastguard Worker "once",
260*d83cc019SAndroid Build Coastguard Worker "every vsync",
261*d83cc019SAndroid Build Coastguard Worker "every other vsync",
262*d83cc019SAndroid Build Coastguard Worker "reserved (invalid)"
263*d83cc019SAndroid Build Coastguard Worker };
264*d83cc019SAndroid Build Coastguard Worker
265*d83cc019SAndroid Build Coastguard Worker struct pci_device *pci_dev;
266*d83cc019SAndroid Build Coastguard Worker int gen = 0;
267*d83cc019SAndroid Build Coastguard Worker
spd_source_to_string(SourceDevice source)268*d83cc019SAndroid Build Coastguard Worker static const char *spd_source_to_string(SourceDevice source)
269*d83cc019SAndroid Build Coastguard Worker {
270*d83cc019SAndroid Build Coastguard Worker switch (source) {
271*d83cc019SAndroid Build Coastguard Worker case SOURCE_DEVICE_UNKNOWN:
272*d83cc019SAndroid Build Coastguard Worker return "unknown";
273*d83cc019SAndroid Build Coastguard Worker case SOURCE_DEVICE_DIGITAL_STB:
274*d83cc019SAndroid Build Coastguard Worker return "digital stb";
275*d83cc019SAndroid Build Coastguard Worker case SOURCE_DEVICE_DVD_PLAYER:
276*d83cc019SAndroid Build Coastguard Worker return "dvd player";
277*d83cc019SAndroid Build Coastguard Worker case SOURCE_DEVICE_D_VHS:
278*d83cc019SAndroid Build Coastguard Worker return "d vhs";
279*d83cc019SAndroid Build Coastguard Worker case SOURCE_DEVICE_HDD_VIDEORECORDER:
280*d83cc019SAndroid Build Coastguard Worker return "hdd videorecorder";
281*d83cc019SAndroid Build Coastguard Worker case SOURCE_DEVICE_DVC:
282*d83cc019SAndroid Build Coastguard Worker return "dvc";
283*d83cc019SAndroid Build Coastguard Worker case SOURCE_DEVICE_DSC:
284*d83cc019SAndroid Build Coastguard Worker return "dsc";
285*d83cc019SAndroid Build Coastguard Worker case SOURCE_DEVICE_VIDEO_CD:
286*d83cc019SAndroid Build Coastguard Worker return "video cd";
287*d83cc019SAndroid Build Coastguard Worker case SOURCE_DEVICE_GAME:
288*d83cc019SAndroid Build Coastguard Worker return "game";
289*d83cc019SAndroid Build Coastguard Worker case SOURCE_DEVICE_PC_GENERAL:
290*d83cc019SAndroid Build Coastguard Worker return "pc general";
291*d83cc019SAndroid Build Coastguard Worker case SOURCE_DEVICE_BLU_RAY_DISK:
292*d83cc019SAndroid Build Coastguard Worker return "blu-ray disk";
293*d83cc019SAndroid Build Coastguard Worker case SOURCE_DEVICE_SUPER_AUDIO_CD:
294*d83cc019SAndroid Build Coastguard Worker return "super audio cd";
295*d83cc019SAndroid Build Coastguard Worker default:
296*d83cc019SAndroid Build Coastguard Worker return "reserved";
297*d83cc019SAndroid Build Coastguard Worker }
298*d83cc019SAndroid Build Coastguard Worker }
299*d83cc019SAndroid Build Coastguard Worker
get_dip_ctl_reg(Transcoder transcoder)300*d83cc019SAndroid Build Coastguard Worker static Register get_dip_ctl_reg(Transcoder transcoder)
301*d83cc019SAndroid Build Coastguard Worker {
302*d83cc019SAndroid Build Coastguard Worker if (IS_VALLEYVIEW(pci_dev->device_id))
303*d83cc019SAndroid Build Coastguard Worker return vlv_dip_ctl_regs[transcoder];
304*d83cc019SAndroid Build Coastguard Worker else if (gen == 4)
305*d83cc019SAndroid Build Coastguard Worker return REG_DIP_CTL_GEN4;
306*d83cc019SAndroid Build Coastguard Worker else
307*d83cc019SAndroid Build Coastguard Worker return pch_dip_ctl_regs[transcoder];
308*d83cc019SAndroid Build Coastguard Worker }
309*d83cc019SAndroid Build Coastguard Worker
get_dip_data_reg(Transcoder transcoder)310*d83cc019SAndroid Build Coastguard Worker static Register get_dip_data_reg(Transcoder transcoder)
311*d83cc019SAndroid Build Coastguard Worker {
312*d83cc019SAndroid Build Coastguard Worker if (IS_VALLEYVIEW(pci_dev->device_id))
313*d83cc019SAndroid Build Coastguard Worker return vlv_dip_data_regs[transcoder];
314*d83cc019SAndroid Build Coastguard Worker else if (gen == 4)
315*d83cc019SAndroid Build Coastguard Worker return REG_DIP_DATA_GEN4;
316*d83cc019SAndroid Build Coastguard Worker else
317*d83cc019SAndroid Build Coastguard Worker return pch_dip_data_regs[transcoder];
318*d83cc019SAndroid Build Coastguard Worker }
319*d83cc019SAndroid Build Coastguard Worker
get_hdmi_port(int hdmi_port_index)320*d83cc019SAndroid Build Coastguard Worker static Register get_hdmi_port(int hdmi_port_index)
321*d83cc019SAndroid Build Coastguard Worker {
322*d83cc019SAndroid Build Coastguard Worker if (IS_VALLEYVIEW(pci_dev->device_id))
323*d83cc019SAndroid Build Coastguard Worker return vlv_hdmi_ports[hdmi_port_index];
324*d83cc019SAndroid Build Coastguard Worker else if (gen == 4) {
325*d83cc019SAndroid Build Coastguard Worker assert(hdmi_port_index < 2);
326*d83cc019SAndroid Build Coastguard Worker return gen4_hdmi_ports[hdmi_port_index];
327*d83cc019SAndroid Build Coastguard Worker } else {
328*d83cc019SAndroid Build Coastguard Worker return pch_hdmi_ports[hdmi_port_index];
329*d83cc019SAndroid Build Coastguard Worker }
330*d83cc019SAndroid Build Coastguard Worker }
331*d83cc019SAndroid Build Coastguard Worker
load_infoframe(Transcoder transcoder,DipInfoFrame * frame,DipType type)332*d83cc019SAndroid Build Coastguard Worker static void load_infoframe(Transcoder transcoder, DipInfoFrame *frame,
333*d83cc019SAndroid Build Coastguard Worker DipType type)
334*d83cc019SAndroid Build Coastguard Worker {
335*d83cc019SAndroid Build Coastguard Worker Register ctl_reg = get_dip_ctl_reg(transcoder);
336*d83cc019SAndroid Build Coastguard Worker Register data_reg = get_dip_data_reg(transcoder);
337*d83cc019SAndroid Build Coastguard Worker uint32_t ctl_val;
338*d83cc019SAndroid Build Coastguard Worker uint32_t i;
339*d83cc019SAndroid Build Coastguard Worker
340*d83cc019SAndroid Build Coastguard Worker ctl_val = INREG(ctl_reg);
341*d83cc019SAndroid Build Coastguard Worker
342*d83cc019SAndroid Build Coastguard Worker ctl_val &= ~DIP_CTL_BUFFER_INDEX;
343*d83cc019SAndroid Build Coastguard Worker ctl_val |= type << 19;
344*d83cc019SAndroid Build Coastguard Worker OUTREG(ctl_reg, ctl_val);
345*d83cc019SAndroid Build Coastguard Worker ctl_val = INREG(ctl_reg);
346*d83cc019SAndroid Build Coastguard Worker
347*d83cc019SAndroid Build Coastguard Worker ctl_val &= ~DIP_CTL_ACCESS_ADDR;
348*d83cc019SAndroid Build Coastguard Worker OUTREG(ctl_reg, ctl_val);
349*d83cc019SAndroid Build Coastguard Worker
350*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 16; i++) {
351*d83cc019SAndroid Build Coastguard Worker ctl_val = INREG(ctl_reg);
352*d83cc019SAndroid Build Coastguard Worker assert((ctl_val & DIP_CTL_ACCESS_ADDR) == i);
353*d83cc019SAndroid Build Coastguard Worker frame->data32[i] = INREG(data_reg);
354*d83cc019SAndroid Build Coastguard Worker }
355*d83cc019SAndroid Build Coastguard Worker }
356*d83cc019SAndroid Build Coastguard Worker
infoframe_valid_checksum(DipInfoFrame * frame)357*d83cc019SAndroid Build Coastguard Worker static int infoframe_valid_checksum(DipInfoFrame *frame)
358*d83cc019SAndroid Build Coastguard Worker {
359*d83cc019SAndroid Build Coastguard Worker int i;
360*d83cc019SAndroid Build Coastguard Worker int length = frame->generic.header.length;
361*d83cc019SAndroid Build Coastguard Worker uint8_t csum;
362*d83cc019SAndroid Build Coastguard Worker
363*d83cc019SAndroid Build Coastguard Worker csum = frame->generic.header.type + frame->generic.header.version +
364*d83cc019SAndroid Build Coastguard Worker frame->generic.header.length; /* no ecc */
365*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < length + 1; i++)
366*d83cc019SAndroid Build Coastguard Worker csum += frame->generic.body[i];
367*d83cc019SAndroid Build Coastguard Worker
368*d83cc019SAndroid Build Coastguard Worker return (csum == 0);
369*d83cc019SAndroid Build Coastguard Worker }
370*d83cc019SAndroid Build Coastguard Worker
infoframe_fix_checksum(DipInfoFrame * frame)371*d83cc019SAndroid Build Coastguard Worker static void infoframe_fix_checksum(DipInfoFrame *frame)
372*d83cc019SAndroid Build Coastguard Worker {
373*d83cc019SAndroid Build Coastguard Worker int i;
374*d83cc019SAndroid Build Coastguard Worker int length = frame->generic.header.length;
375*d83cc019SAndroid Build Coastguard Worker uint8_t csum;
376*d83cc019SAndroid Build Coastguard Worker
377*d83cc019SAndroid Build Coastguard Worker csum = frame->generic.header.type + frame->generic.header.version +
378*d83cc019SAndroid Build Coastguard Worker frame->generic.header.length; /* no ecc */
379*d83cc019SAndroid Build Coastguard Worker /* Length does not include the header field nor the checksum */
380*d83cc019SAndroid Build Coastguard Worker for (i = 1; i < length + 1; i++)
381*d83cc019SAndroid Build Coastguard Worker csum += frame->generic.body[i];
382*d83cc019SAndroid Build Coastguard Worker frame->generic.body[0] = 0x100 - csum;
383*d83cc019SAndroid Build Coastguard Worker }
384*d83cc019SAndroid Build Coastguard Worker
dump_port_info(int hdmi_port_index)385*d83cc019SAndroid Build Coastguard Worker static void dump_port_info(int hdmi_port_index)
386*d83cc019SAndroid Build Coastguard Worker {
387*d83cc019SAndroid Build Coastguard Worker Register port = get_hdmi_port(hdmi_port_index);
388*d83cc019SAndroid Build Coastguard Worker uint32_t val = INREG(port);
389*d83cc019SAndroid Build Coastguard Worker Transcoder transcoder;
390*d83cc019SAndroid Build Coastguard Worker
391*d83cc019SAndroid Build Coastguard Worker printf("\nPort %s:\n", hdmi_port_names[hdmi_port_index]);
392*d83cc019SAndroid Build Coastguard Worker printf("- %sdetected\n", val & HDMI_PORT_DETECTED ? "" : "not ");
393*d83cc019SAndroid Build Coastguard Worker printf("- %s\n", val & HDMI_PORT_ENABLE ? "enabled" : "disabled");
394*d83cc019SAndroid Build Coastguard Worker
395*d83cc019SAndroid Build Coastguard Worker if (!(val & HDMI_PORT_ENABLE))
396*d83cc019SAndroid Build Coastguard Worker return;
397*d83cc019SAndroid Build Coastguard Worker
398*d83cc019SAndroid Build Coastguard Worker if (gen == 4 || IS_VALLEYVIEW(pci_dev->device_id))
399*d83cc019SAndroid Build Coastguard Worker transcoder = (val & HDMI_PORT_TRANSCODER_GEN4) >> 30;
400*d83cc019SAndroid Build Coastguard Worker else if (intel_pch >= PCH_CPT)
401*d83cc019SAndroid Build Coastguard Worker transcoder = (val & HDMI_PORT_TRANSCODER_CPT) >> 29;
402*d83cc019SAndroid Build Coastguard Worker else
403*d83cc019SAndroid Build Coastguard Worker transcoder = (val & HDMI_PORT_TRANSCODER_IBX) >> 30;
404*d83cc019SAndroid Build Coastguard Worker printf("- transcoder: %s\n", transcoder_names[transcoder]);
405*d83cc019SAndroid Build Coastguard Worker
406*d83cc019SAndroid Build Coastguard Worker switch ((val & HDMI_PORT_ENCODING) >> 10) {
407*d83cc019SAndroid Build Coastguard Worker case 0:
408*d83cc019SAndroid Build Coastguard Worker printf("- mode: SDVO\n");
409*d83cc019SAndroid Build Coastguard Worker break;
410*d83cc019SAndroid Build Coastguard Worker case 2:
411*d83cc019SAndroid Build Coastguard Worker printf("- mode: TMDS\n");
412*d83cc019SAndroid Build Coastguard Worker break;
413*d83cc019SAndroid Build Coastguard Worker default:
414*d83cc019SAndroid Build Coastguard Worker printf("- mode: INVALID!\n");
415*d83cc019SAndroid Build Coastguard Worker }
416*d83cc019SAndroid Build Coastguard Worker
417*d83cc019SAndroid Build Coastguard Worker printf("- mode: %s\n", val & HDMI_PORT_MODE ? "HDMI" : "DVI");
418*d83cc019SAndroid Build Coastguard Worker printf("- audio: %s\n", val & HDMI_PORT_AUDIO ? "enabled" : "disabled");
419*d83cc019SAndroid Build Coastguard Worker }
420*d83cc019SAndroid Build Coastguard Worker
dump_raw_infoframe(DipInfoFrame * frame)421*d83cc019SAndroid Build Coastguard Worker static void dump_raw_infoframe(DipInfoFrame *frame)
422*d83cc019SAndroid Build Coastguard Worker {
423*d83cc019SAndroid Build Coastguard Worker unsigned int i;
424*d83cc019SAndroid Build Coastguard Worker printf("- raw:");
425*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 16; i++) {
426*d83cc019SAndroid Build Coastguard Worker if (i % 4 == 0)
427*d83cc019SAndroid Build Coastguard Worker printf("\n ");
428*d83cc019SAndroid Build Coastguard Worker printf(" %08x", frame->data32[i]);
429*d83cc019SAndroid Build Coastguard Worker }
430*d83cc019SAndroid Build Coastguard Worker printf("\n");
431*d83cc019SAndroid Build Coastguard Worker }
432*d83cc019SAndroid Build Coastguard Worker
dump_avi_info(Transcoder transcoder)433*d83cc019SAndroid Build Coastguard Worker static void dump_avi_info(Transcoder transcoder)
434*d83cc019SAndroid Build Coastguard Worker {
435*d83cc019SAndroid Build Coastguard Worker Register reg = get_dip_ctl_reg(transcoder);
436*d83cc019SAndroid Build Coastguard Worker uint32_t val;
437*d83cc019SAndroid Build Coastguard Worker DipFrequency freq;
438*d83cc019SAndroid Build Coastguard Worker DipInfoFrame frame;
439*d83cc019SAndroid Build Coastguard Worker
440*d83cc019SAndroid Build Coastguard Worker load_infoframe(transcoder, &frame, DIP_AVI);
441*d83cc019SAndroid Build Coastguard Worker val = INREG(reg);
442*d83cc019SAndroid Build Coastguard Worker
443*d83cc019SAndroid Build Coastguard Worker printf("AVI InfoFrame:\n");
444*d83cc019SAndroid Build Coastguard Worker
445*d83cc019SAndroid Build Coastguard Worker if (gen == 4) {
446*d83cc019SAndroid Build Coastguard Worker printf("- %sbeing transmitted\n",
447*d83cc019SAndroid Build Coastguard Worker val & DIP_CTL_BUFFER_TRANS_ACTIVE_GEN4 ? "" : "not ");
448*d83cc019SAndroid Build Coastguard Worker }
449*d83cc019SAndroid Build Coastguard Worker
450*d83cc019SAndroid Build Coastguard Worker freq = (val & DIP_CTL_FREQUENCY) >> 16;
451*d83cc019SAndroid Build Coastguard Worker printf("- frequency: %s\n", dip_frequency_names[freq]);
452*d83cc019SAndroid Build Coastguard Worker
453*d83cc019SAndroid Build Coastguard Worker dump_raw_infoframe(&frame);
454*d83cc019SAndroid Build Coastguard Worker
455*d83cc019SAndroid Build Coastguard Worker printf("- type: %x, version: %x, length: %x, ecc: %x, checksum: %x\n",
456*d83cc019SAndroid Build Coastguard Worker frame.avi.header.type, frame.avi.header.version,
457*d83cc019SAndroid Build Coastguard Worker frame.avi.header.length, frame.avi.header.ecc,
458*d83cc019SAndroid Build Coastguard Worker frame.avi.checksum);
459*d83cc019SAndroid Build Coastguard Worker printf("- S: %x, B: %x, A: %x, Y: %x, Rsvd0: %x\n",
460*d83cc019SAndroid Build Coastguard Worker frame.avi.S, frame.avi.B, frame.avi.A, frame.avi.Y,
461*d83cc019SAndroid Build Coastguard Worker frame.avi.Rsvd0);
462*d83cc019SAndroid Build Coastguard Worker printf("- R: %x, M: %x, C: %x\n",
463*d83cc019SAndroid Build Coastguard Worker frame.avi.R, frame.avi.M, frame.avi.C);
464*d83cc019SAndroid Build Coastguard Worker printf("- SC: %x, Q: %x, EC: %x, ITC: %x\n",
465*d83cc019SAndroid Build Coastguard Worker frame.avi.SC, frame.avi.Q, frame.avi.EC, frame.avi.ITC);
466*d83cc019SAndroid Build Coastguard Worker printf("- VIC: %d, Rsvd1: %x\n", frame.avi.VIC, frame.avi.Rsvd1);
467*d83cc019SAndroid Build Coastguard Worker printf("- PR: %x, Rsvd2: %x\n", frame.avi.PR, frame.avi.Rsvd2);
468*d83cc019SAndroid Build Coastguard Worker printf("- top: %x, bottom: %x, left: %x, right: %x\n",
469*d83cc019SAndroid Build Coastguard Worker frame.avi.top, frame.avi.bottom, frame.avi.left,
470*d83cc019SAndroid Build Coastguard Worker frame.avi.right);
471*d83cc019SAndroid Build Coastguard Worker printf("- Rsvd3: %x, Rsvd4[0]: %x, Rsvd4[1]: %x, Rsvd4[2]: %x\n",
472*d83cc019SAndroid Build Coastguard Worker frame.avi.Rsvd3, frame.avi.Rsvd4[0], frame.avi.Rsvd4[1],
473*d83cc019SAndroid Build Coastguard Worker frame.avi.Rsvd4[2]);
474*d83cc019SAndroid Build Coastguard Worker
475*d83cc019SAndroid Build Coastguard Worker if (!infoframe_valid_checksum(&frame))
476*d83cc019SAndroid Build Coastguard Worker printf("Invalid InfoFrame checksum!\n");
477*d83cc019SAndroid Build Coastguard Worker }
478*d83cc019SAndroid Build Coastguard Worker
vendor_id_to_string(uint32_t id)479*d83cc019SAndroid Build Coastguard Worker static const char *vendor_id_to_string(uint32_t id)
480*d83cc019SAndroid Build Coastguard Worker {
481*d83cc019SAndroid Build Coastguard Worker switch (id) {
482*d83cc019SAndroid Build Coastguard Worker case VENDOR_ID_HDMI:
483*d83cc019SAndroid Build Coastguard Worker return "HDMI";
484*d83cc019SAndroid Build Coastguard Worker default:
485*d83cc019SAndroid Build Coastguard Worker return "Unknown";
486*d83cc019SAndroid Build Coastguard Worker }
487*d83cc019SAndroid Build Coastguard Worker }
488*d83cc019SAndroid Build Coastguard Worker
s3d_structure_to_string(int format)489*d83cc019SAndroid Build Coastguard Worker static const char *s3d_structure_to_string(int format)
490*d83cc019SAndroid Build Coastguard Worker {
491*d83cc019SAndroid Build Coastguard Worker switch (format) {
492*d83cc019SAndroid Build Coastguard Worker case 0:
493*d83cc019SAndroid Build Coastguard Worker return "Frame Packing";
494*d83cc019SAndroid Build Coastguard Worker case 6:
495*d83cc019SAndroid Build Coastguard Worker return "Top Bottom";
496*d83cc019SAndroid Build Coastguard Worker case 8:
497*d83cc019SAndroid Build Coastguard Worker return "Side By Side (half)";
498*d83cc019SAndroid Build Coastguard Worker default:
499*d83cc019SAndroid Build Coastguard Worker return "Reserved";
500*d83cc019SAndroid Build Coastguard Worker }
501*d83cc019SAndroid Build Coastguard Worker }
502*d83cc019SAndroid Build Coastguard Worker
dump_vendor_hdmi(DipInfoFrame * frame)503*d83cc019SAndroid Build Coastguard Worker static void dump_vendor_hdmi(DipInfoFrame *frame)
504*d83cc019SAndroid Build Coastguard Worker {
505*d83cc019SAndroid Build Coastguard Worker int vic_present = frame->vendor.video_format & 0x1;
506*d83cc019SAndroid Build Coastguard Worker int s3d_present = frame->vendor.video_format & 0x2;
507*d83cc019SAndroid Build Coastguard Worker
508*d83cc019SAndroid Build Coastguard Worker printf("- video format: 0x%03x %s\n", frame->vendor.video_format,
509*d83cc019SAndroid Build Coastguard Worker s3d_present ? "(3D)" : "");
510*d83cc019SAndroid Build Coastguard Worker
511*d83cc019SAndroid Build Coastguard Worker if (vic_present && s3d_present) {
512*d83cc019SAndroid Build Coastguard Worker printf("Error: HDMI VIC and S3D bits set. Only one of those "
513*d83cc019SAndroid Build Coastguard Worker " at a time is valid\n");
514*d83cc019SAndroid Build Coastguard Worker return;
515*d83cc019SAndroid Build Coastguard Worker }
516*d83cc019SAndroid Build Coastguard Worker
517*d83cc019SAndroid Build Coastguard Worker if (vic_present)
518*d83cc019SAndroid Build Coastguard Worker printf("- HDMI VIC: %d\n", frame->vendor.pb5.vic);
519*d83cc019SAndroid Build Coastguard Worker else if (s3d_present) {
520*d83cc019SAndroid Build Coastguard Worker int s3d_structure = frame->vendor.pb5.s3d.s3d_structure;
521*d83cc019SAndroid Build Coastguard Worker
522*d83cc019SAndroid Build Coastguard Worker printf("- 3D Format: %s\n",
523*d83cc019SAndroid Build Coastguard Worker s3d_structure_to_string(s3d_structure));
524*d83cc019SAndroid Build Coastguard Worker
525*d83cc019SAndroid Build Coastguard Worker /* Side-by-side (half) */
526*d83cc019SAndroid Build Coastguard Worker if (s3d_structure >= 8)
527*d83cc019SAndroid Build Coastguard Worker printf("- 3D Ext Data 0x%x\n",
528*d83cc019SAndroid Build Coastguard Worker frame->vendor.s3d_ext_data);
529*d83cc019SAndroid Build Coastguard Worker }
530*d83cc019SAndroid Build Coastguard Worker }
531*d83cc019SAndroid Build Coastguard Worker
dump_vendor_info(Transcoder transcoder)532*d83cc019SAndroid Build Coastguard Worker static void dump_vendor_info(Transcoder transcoder)
533*d83cc019SAndroid Build Coastguard Worker {
534*d83cc019SAndroid Build Coastguard Worker Register reg = get_dip_ctl_reg(transcoder);
535*d83cc019SAndroid Build Coastguard Worker uint32_t val, vendor_id;
536*d83cc019SAndroid Build Coastguard Worker DipFrequency freq;
537*d83cc019SAndroid Build Coastguard Worker DipInfoFrame frame;
538*d83cc019SAndroid Build Coastguard Worker
539*d83cc019SAndroid Build Coastguard Worker load_infoframe(transcoder, &frame, DIP_VENDOR);
540*d83cc019SAndroid Build Coastguard Worker val = INREG(reg);
541*d83cc019SAndroid Build Coastguard Worker
542*d83cc019SAndroid Build Coastguard Worker printf("Vendor InfoFrame:\n");
543*d83cc019SAndroid Build Coastguard Worker
544*d83cc019SAndroid Build Coastguard Worker if (gen == 4) {
545*d83cc019SAndroid Build Coastguard Worker printf("- %sbeing transmitted\n",
546*d83cc019SAndroid Build Coastguard Worker val & DIP_CTL_BUFFER_TRANS_ACTIVE_GEN4 ? "" : "not ");
547*d83cc019SAndroid Build Coastguard Worker }
548*d83cc019SAndroid Build Coastguard Worker
549*d83cc019SAndroid Build Coastguard Worker freq = (val & DIP_CTL_FREQUENCY) >> 16;
550*d83cc019SAndroid Build Coastguard Worker printf("- frequency: %s\n", dip_frequency_names[freq]);
551*d83cc019SAndroid Build Coastguard Worker
552*d83cc019SAndroid Build Coastguard Worker dump_raw_infoframe(&frame);
553*d83cc019SAndroid Build Coastguard Worker
554*d83cc019SAndroid Build Coastguard Worker vendor_id = frame.vendor.id[2] << 16 | frame.vendor.id[1] << 8 |
555*d83cc019SAndroid Build Coastguard Worker frame.vendor.id[0];
556*d83cc019SAndroid Build Coastguard Worker
557*d83cc019SAndroid Build Coastguard Worker printf("- vendor Id: 0x%06x (%s)\n", vendor_id,
558*d83cc019SAndroid Build Coastguard Worker vendor_id_to_string(vendor_id));
559*d83cc019SAndroid Build Coastguard Worker
560*d83cc019SAndroid Build Coastguard Worker if (vendor_id == VENDOR_ID_HDMI)
561*d83cc019SAndroid Build Coastguard Worker dump_vendor_hdmi(&frame);
562*d83cc019SAndroid Build Coastguard Worker
563*d83cc019SAndroid Build Coastguard Worker if (!infoframe_valid_checksum(&frame))
564*d83cc019SAndroid Build Coastguard Worker printf("Invalid InfoFrame checksum!\n");
565*d83cc019SAndroid Build Coastguard Worker }
566*d83cc019SAndroid Build Coastguard Worker
dump_gamut_info(Transcoder transcoder)567*d83cc019SAndroid Build Coastguard Worker static void dump_gamut_info(Transcoder transcoder)
568*d83cc019SAndroid Build Coastguard Worker {
569*d83cc019SAndroid Build Coastguard Worker Register reg = get_dip_ctl_reg(transcoder);
570*d83cc019SAndroid Build Coastguard Worker uint32_t val;
571*d83cc019SAndroid Build Coastguard Worker DipFrequency freq;
572*d83cc019SAndroid Build Coastguard Worker DipInfoFrame frame;
573*d83cc019SAndroid Build Coastguard Worker
574*d83cc019SAndroid Build Coastguard Worker load_infoframe(transcoder, &frame, DIP_GAMUT);
575*d83cc019SAndroid Build Coastguard Worker val = INREG(reg);
576*d83cc019SAndroid Build Coastguard Worker
577*d83cc019SAndroid Build Coastguard Worker printf("Gamut InfoFrame:\n");
578*d83cc019SAndroid Build Coastguard Worker
579*d83cc019SAndroid Build Coastguard Worker if (gen == 4) {
580*d83cc019SAndroid Build Coastguard Worker printf("- %sbeing transmitted\n",
581*d83cc019SAndroid Build Coastguard Worker val & DIP_CTL_BUFFER_TRANS_ACTIVE_GEN4 ? "" : "not ");
582*d83cc019SAndroid Build Coastguard Worker }
583*d83cc019SAndroid Build Coastguard Worker
584*d83cc019SAndroid Build Coastguard Worker freq = (val & DIP_CTL_FREQUENCY) >> 16;
585*d83cc019SAndroid Build Coastguard Worker printf("- frequency: %s\n", dip_frequency_names[freq]);
586*d83cc019SAndroid Build Coastguard Worker
587*d83cc019SAndroid Build Coastguard Worker dump_raw_infoframe(&frame);
588*d83cc019SAndroid Build Coastguard Worker
589*d83cc019SAndroid Build Coastguard Worker if (!infoframe_valid_checksum(&frame))
590*d83cc019SAndroid Build Coastguard Worker printf("Invalid InfoFrame checksum!\n");
591*d83cc019SAndroid Build Coastguard Worker }
592*d83cc019SAndroid Build Coastguard Worker
dump_spd_info(Transcoder transcoder)593*d83cc019SAndroid Build Coastguard Worker static void dump_spd_info(Transcoder transcoder)
594*d83cc019SAndroid Build Coastguard Worker {
595*d83cc019SAndroid Build Coastguard Worker Register reg = get_dip_ctl_reg(transcoder);
596*d83cc019SAndroid Build Coastguard Worker uint32_t val;
597*d83cc019SAndroid Build Coastguard Worker DipFrequency freq;
598*d83cc019SAndroid Build Coastguard Worker DipInfoFrame frame;
599*d83cc019SAndroid Build Coastguard Worker char vendor[9];
600*d83cc019SAndroid Build Coastguard Worker char description[17];
601*d83cc019SAndroid Build Coastguard Worker
602*d83cc019SAndroid Build Coastguard Worker load_infoframe(transcoder, &frame, DIP_SPD);
603*d83cc019SAndroid Build Coastguard Worker val = INREG(reg);
604*d83cc019SAndroid Build Coastguard Worker
605*d83cc019SAndroid Build Coastguard Worker printf("SPD InfoFrame:\n");
606*d83cc019SAndroid Build Coastguard Worker
607*d83cc019SAndroid Build Coastguard Worker if (gen == 4) {
608*d83cc019SAndroid Build Coastguard Worker printf("- %sbeing transmitted\n",
609*d83cc019SAndroid Build Coastguard Worker val & DIP_CTL_BUFFER_TRANS_ACTIVE_GEN4 ? "" : "not ");
610*d83cc019SAndroid Build Coastguard Worker }
611*d83cc019SAndroid Build Coastguard Worker
612*d83cc019SAndroid Build Coastguard Worker freq = (val & DIP_CTL_FREQUENCY) >> 16;
613*d83cc019SAndroid Build Coastguard Worker printf("- frequency: %s\n", dip_frequency_names[freq]);
614*d83cc019SAndroid Build Coastguard Worker
615*d83cc019SAndroid Build Coastguard Worker dump_raw_infoframe(&frame);
616*d83cc019SAndroid Build Coastguard Worker
617*d83cc019SAndroid Build Coastguard Worker printf("- type: %x, version: %x, length: %x, ecc: %x, checksum: %x\n",
618*d83cc019SAndroid Build Coastguard Worker frame.spd.header.type, frame.spd.header.version,
619*d83cc019SAndroid Build Coastguard Worker frame.spd.header.length, frame.spd.header.ecc,
620*d83cc019SAndroid Build Coastguard Worker frame.spd.checksum);
621*d83cc019SAndroid Build Coastguard Worker
622*d83cc019SAndroid Build Coastguard Worker memcpy(vendor, frame.spd.vendor, 8);
623*d83cc019SAndroid Build Coastguard Worker vendor[8] = '\0';
624*d83cc019SAndroid Build Coastguard Worker memcpy(description, frame.spd.description, 16);
625*d83cc019SAndroid Build Coastguard Worker description[16] = '\0';
626*d83cc019SAndroid Build Coastguard Worker
627*d83cc019SAndroid Build Coastguard Worker printf("- vendor: %s\n", vendor);
628*d83cc019SAndroid Build Coastguard Worker printf("- description: %s\n", description);
629*d83cc019SAndroid Build Coastguard Worker printf("- source: %s\n", spd_source_to_string(frame.spd.source));
630*d83cc019SAndroid Build Coastguard Worker
631*d83cc019SAndroid Build Coastguard Worker if (!infoframe_valid_checksum(&frame))
632*d83cc019SAndroid Build Coastguard Worker printf("Invalid InfoFrame checksum!\n");
633*d83cc019SAndroid Build Coastguard Worker }
634*d83cc019SAndroid Build Coastguard Worker
dump_transcoder_info(Transcoder transcoder)635*d83cc019SAndroid Build Coastguard Worker static void dump_transcoder_info(Transcoder transcoder)
636*d83cc019SAndroid Build Coastguard Worker {
637*d83cc019SAndroid Build Coastguard Worker Register reg = get_dip_ctl_reg(transcoder);
638*d83cc019SAndroid Build Coastguard Worker uint32_t val = INREG(reg);
639*d83cc019SAndroid Build Coastguard Worker
640*d83cc019SAndroid Build Coastguard Worker if (gen == 4) {
641*d83cc019SAndroid Build Coastguard Worker printf("\nDIP information:\n");
642*d83cc019SAndroid Build Coastguard Worker switch (val & DIP_CTL_PORT_SEL_MASK_GEN4) {
643*d83cc019SAndroid Build Coastguard Worker case DIP_CTL_PORT_SEL_B_GEN4:
644*d83cc019SAndroid Build Coastguard Worker printf("- port B\n");
645*d83cc019SAndroid Build Coastguard Worker break;
646*d83cc019SAndroid Build Coastguard Worker case DIP_CTL_PORT_SEL_C_GEN4:
647*d83cc019SAndroid Build Coastguard Worker printf("- port C\n");
648*d83cc019SAndroid Build Coastguard Worker break;
649*d83cc019SAndroid Build Coastguard Worker default:
650*d83cc019SAndroid Build Coastguard Worker printf("- INVALID port!\n");
651*d83cc019SAndroid Build Coastguard Worker }
652*d83cc019SAndroid Build Coastguard Worker } else {
653*d83cc019SAndroid Build Coastguard Worker printf("\nTranscoder %s:\n", transcoder_names[transcoder]);
654*d83cc019SAndroid Build Coastguard Worker }
655*d83cc019SAndroid Build Coastguard Worker printf("- %s\n", val & DIP_CTL_ENABLE ? "enabled" : "disabled");
656*d83cc019SAndroid Build Coastguard Worker if (!(val & DIP_CTL_ENABLE))
657*d83cc019SAndroid Build Coastguard Worker return;
658*d83cc019SAndroid Build Coastguard Worker
659*d83cc019SAndroid Build Coastguard Worker printf("- GCP: %s\n", val & DIP_CTL_GCP_ENABLE ?
660*d83cc019SAndroid Build Coastguard Worker "enabled" : "disabled");
661*d83cc019SAndroid Build Coastguard Worker
662*d83cc019SAndroid Build Coastguard Worker if (val & DIP_CTL_AVI_ENABLE)
663*d83cc019SAndroid Build Coastguard Worker dump_avi_info(transcoder);
664*d83cc019SAndroid Build Coastguard Worker if (val & DIP_CTL_VENDOR_ENABLE)
665*d83cc019SAndroid Build Coastguard Worker dump_vendor_info(transcoder);
666*d83cc019SAndroid Build Coastguard Worker if (val & DIP_CTL_GAMUT_ENABLE)
667*d83cc019SAndroid Build Coastguard Worker dump_gamut_info(transcoder);
668*d83cc019SAndroid Build Coastguard Worker if (val & DIP_CTL_SPD_ENABLE)
669*d83cc019SAndroid Build Coastguard Worker dump_spd_info(transcoder);
670*d83cc019SAndroid Build Coastguard Worker }
671*d83cc019SAndroid Build Coastguard Worker
dump_all_info(void)672*d83cc019SAndroid Build Coastguard Worker static void dump_all_info(void)
673*d83cc019SAndroid Build Coastguard Worker {
674*d83cc019SAndroid Build Coastguard Worker unsigned int i;
675*d83cc019SAndroid Build Coastguard Worker
676*d83cc019SAndroid Build Coastguard Worker if (IS_VALLEYVIEW(pci_dev->device_id)) {
677*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(vlv_hdmi_ports); i++)
678*d83cc019SAndroid Build Coastguard Worker dump_port_info(i);
679*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(vlv_dip_ctl_regs); i++)
680*d83cc019SAndroid Build Coastguard Worker dump_transcoder_info(i);
681*d83cc019SAndroid Build Coastguard Worker } else if (gen == 4) {
682*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(gen4_hdmi_ports); i++)
683*d83cc019SAndroid Build Coastguard Worker dump_port_info(i);
684*d83cc019SAndroid Build Coastguard Worker dump_transcoder_info(0);
685*d83cc019SAndroid Build Coastguard Worker } else {
686*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(pch_hdmi_ports); i++)
687*d83cc019SAndroid Build Coastguard Worker dump_port_info(i);
688*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(pch_dip_ctl_regs); i++)
689*d83cc019SAndroid Build Coastguard Worker dump_transcoder_info(i);
690*d83cc019SAndroid Build Coastguard Worker }
691*d83cc019SAndroid Build Coastguard Worker }
692*d83cc019SAndroid Build Coastguard Worker
write_infoframe(Transcoder transcoder,DipType type,DipInfoFrame * frame)693*d83cc019SAndroid Build Coastguard Worker static void write_infoframe(Transcoder transcoder, DipType type,
694*d83cc019SAndroid Build Coastguard Worker DipInfoFrame *frame)
695*d83cc019SAndroid Build Coastguard Worker {
696*d83cc019SAndroid Build Coastguard Worker Register ctl_reg = get_dip_ctl_reg(transcoder);
697*d83cc019SAndroid Build Coastguard Worker Register data_reg = get_dip_data_reg(transcoder);
698*d83cc019SAndroid Build Coastguard Worker uint32_t ctl_val;
699*d83cc019SAndroid Build Coastguard Worker unsigned int i;
700*d83cc019SAndroid Build Coastguard Worker
701*d83cc019SAndroid Build Coastguard Worker ctl_val = INREG(ctl_reg);
702*d83cc019SAndroid Build Coastguard Worker ctl_val &= ~DIP_CTL_BUFFER_INDEX;
703*d83cc019SAndroid Build Coastguard Worker ctl_val |= (type << 19);
704*d83cc019SAndroid Build Coastguard Worker ctl_val &= ~DIP_CTL_ACCESS_ADDR;
705*d83cc019SAndroid Build Coastguard Worker OUTREG(ctl_reg, ctl_val);
706*d83cc019SAndroid Build Coastguard Worker
707*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 8; i++) {
708*d83cc019SAndroid Build Coastguard Worker ctl_val = INREG(ctl_reg);
709*d83cc019SAndroid Build Coastguard Worker assert((ctl_val & DIP_CTL_ACCESS_ADDR) == i);
710*d83cc019SAndroid Build Coastguard Worker OUTREG(data_reg, frame->data32[i]);
711*d83cc019SAndroid Build Coastguard Worker }
712*d83cc019SAndroid Build Coastguard Worker }
713*d83cc019SAndroid Build Coastguard Worker
disable_infoframe(Transcoder transcoder,DipType type)714*d83cc019SAndroid Build Coastguard Worker static void disable_infoframe(Transcoder transcoder, DipType type)
715*d83cc019SAndroid Build Coastguard Worker {
716*d83cc019SAndroid Build Coastguard Worker Register reg = get_dip_ctl_reg(transcoder);
717*d83cc019SAndroid Build Coastguard Worker uint32_t val = INREG(reg);
718*d83cc019SAndroid Build Coastguard Worker if (gen != 4 && type == DIP_AVI)
719*d83cc019SAndroid Build Coastguard Worker val &= ~DIP_CTL_ENABLE;
720*d83cc019SAndroid Build Coastguard Worker val &= ~(1 << (21 + type));
721*d83cc019SAndroid Build Coastguard Worker OUTREG(reg, val);
722*d83cc019SAndroid Build Coastguard Worker }
723*d83cc019SAndroid Build Coastguard Worker
enable_infoframe(Transcoder transcoder,DipType type)724*d83cc019SAndroid Build Coastguard Worker static void enable_infoframe(Transcoder transcoder, DipType type)
725*d83cc019SAndroid Build Coastguard Worker {
726*d83cc019SAndroid Build Coastguard Worker Register reg = get_dip_ctl_reg(transcoder);
727*d83cc019SAndroid Build Coastguard Worker uint32_t val = INREG(reg);
728*d83cc019SAndroid Build Coastguard Worker if (gen != 4 && type == DIP_AVI)
729*d83cc019SAndroid Build Coastguard Worker val |= DIP_CTL_ENABLE;
730*d83cc019SAndroid Build Coastguard Worker val |= (1 << (21 + type));
731*d83cc019SAndroid Build Coastguard Worker OUTREG(reg, val);
732*d83cc019SAndroid Build Coastguard Worker }
733*d83cc019SAndroid Build Coastguard Worker
parse_infoframe_option_u(const char * name,const char * s,uint32_t min,uint32_t max,uint32_t * value,char ** commands)734*d83cc019SAndroid Build Coastguard Worker static int parse_infoframe_option_u(const char *name, const char *s,
735*d83cc019SAndroid Build Coastguard Worker uint32_t min, uint32_t max,
736*d83cc019SAndroid Build Coastguard Worker uint32_t *value, char **commands)
737*d83cc019SAndroid Build Coastguard Worker {
738*d83cc019SAndroid Build Coastguard Worker int read, rc;
739*d83cc019SAndroid Build Coastguard Worker if (!strcmp(name, s)) {
740*d83cc019SAndroid Build Coastguard Worker rc = sscanf(*commands, "%x%n", value, &read);
741*d83cc019SAndroid Build Coastguard Worker *commands = &(*commands)[read];
742*d83cc019SAndroid Build Coastguard Worker if (rc != 1) {
743*d83cc019SAndroid Build Coastguard Worker printf("Invalid value.\n");
744*d83cc019SAndroid Build Coastguard Worker return 0;
745*d83cc019SAndroid Build Coastguard Worker }
746*d83cc019SAndroid Build Coastguard Worker
747*d83cc019SAndroid Build Coastguard Worker if (*value < min || *value > max) {
748*d83cc019SAndroid Build Coastguard Worker printf("Value outside allowed range.\n");
749*d83cc019SAndroid Build Coastguard Worker return 0;
750*d83cc019SAndroid Build Coastguard Worker }
751*d83cc019SAndroid Build Coastguard Worker return 1;
752*d83cc019SAndroid Build Coastguard Worker }
753*d83cc019SAndroid Build Coastguard Worker return 0;
754*d83cc019SAndroid Build Coastguard Worker }
755*d83cc019SAndroid Build Coastguard Worker
parse_infoframe_option_s(const char * name,const char * s,int min_size,int max_size,char * value,char ** commands)756*d83cc019SAndroid Build Coastguard Worker static int parse_infoframe_option_s(const char *name, const char *s,
757*d83cc019SAndroid Build Coastguard Worker int min_size, int max_size,
758*d83cc019SAndroid Build Coastguard Worker char *value, char **commands)
759*d83cc019SAndroid Build Coastguard Worker {
760*d83cc019SAndroid Build Coastguard Worker int size, read, rc;
761*d83cc019SAndroid Build Coastguard Worker if (!strcmp(name, s)) {
762*d83cc019SAndroid Build Coastguard Worker rc = sscanf(*commands, "%31s%n", value, &read);
763*d83cc019SAndroid Build Coastguard Worker *commands = &(*commands)[read];
764*d83cc019SAndroid Build Coastguard Worker if (rc != 1) {
765*d83cc019SAndroid Build Coastguard Worker printf("Invalid value.\n");
766*d83cc019SAndroid Build Coastguard Worker return 0;
767*d83cc019SAndroid Build Coastguard Worker }
768*d83cc019SAndroid Build Coastguard Worker
769*d83cc019SAndroid Build Coastguard Worker size = strlen(value);
770*d83cc019SAndroid Build Coastguard Worker if (size < min_size || size > max_size) {
771*d83cc019SAndroid Build Coastguard Worker printf("String either too big or too small.\n");
772*d83cc019SAndroid Build Coastguard Worker return 0;
773*d83cc019SAndroid Build Coastguard Worker }
774*d83cc019SAndroid Build Coastguard Worker return 1;
775*d83cc019SAndroid Build Coastguard Worker }
776*d83cc019SAndroid Build Coastguard Worker return 0;
777*d83cc019SAndroid Build Coastguard Worker }
778*d83cc019SAndroid Build Coastguard Worker
change_avi_infoframe(Transcoder transcoder,char * commands)779*d83cc019SAndroid Build Coastguard Worker static void change_avi_infoframe(Transcoder transcoder, char *commands)
780*d83cc019SAndroid Build Coastguard Worker {
781*d83cc019SAndroid Build Coastguard Worker Register reg = get_dip_ctl_reg(transcoder);
782*d83cc019SAndroid Build Coastguard Worker uint32_t val;
783*d83cc019SAndroid Build Coastguard Worker DipInfoFrame frame;
784*d83cc019SAndroid Build Coastguard Worker char option[32];
785*d83cc019SAndroid Build Coastguard Worker uint32_t option_val;
786*d83cc019SAndroid Build Coastguard Worker int rc, read;
787*d83cc019SAndroid Build Coastguard Worker char *current = commands;
788*d83cc019SAndroid Build Coastguard Worker
789*d83cc019SAndroid Build Coastguard Worker load_infoframe(transcoder, &frame, DIP_AVI);
790*d83cc019SAndroid Build Coastguard Worker val = INREG(reg);
791*d83cc019SAndroid Build Coastguard Worker
792*d83cc019SAndroid Build Coastguard Worker while (1) {
793*d83cc019SAndroid Build Coastguard Worker rc = sscanf(current, "%31s%n", option, &read);
794*d83cc019SAndroid Build Coastguard Worker current = ¤t[read];
795*d83cc019SAndroid Build Coastguard Worker if (rc == EOF) {
796*d83cc019SAndroid Build Coastguard Worker break;
797*d83cc019SAndroid Build Coastguard Worker } else if (rc != 1) {
798*d83cc019SAndroid Build Coastguard Worker printf("Invalid option: %s\n", option);
799*d83cc019SAndroid Build Coastguard Worker continue;
800*d83cc019SAndroid Build Coastguard Worker }
801*d83cc019SAndroid Build Coastguard Worker
802*d83cc019SAndroid Build Coastguard Worker if (parse_infoframe_option_u("S", option, 0, 2, &option_val,
803*d83cc019SAndroid Build Coastguard Worker ¤t))
804*d83cc019SAndroid Build Coastguard Worker frame.avi.S = option_val;
805*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("B", option, 0, 3,
806*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
807*d83cc019SAndroid Build Coastguard Worker frame.avi.B = option_val;
808*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("A", option, 0, 1,
809*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
810*d83cc019SAndroid Build Coastguard Worker frame.avi.A = option_val;
811*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("Y", option, 0, 2,
812*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
813*d83cc019SAndroid Build Coastguard Worker frame.avi.Y = option_val;
814*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("R", option, 0, 15,
815*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
816*d83cc019SAndroid Build Coastguard Worker frame.avi.R = option_val;
817*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("M", option, 0, 2,
818*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
819*d83cc019SAndroid Build Coastguard Worker frame.avi.M = option_val;
820*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("C", option, 0, 3,
821*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
822*d83cc019SAndroid Build Coastguard Worker frame.avi.C = option_val;
823*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("SC", option, 0, 3,
824*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
825*d83cc019SAndroid Build Coastguard Worker frame.avi.SC = option_val;
826*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("Q", option, 0, 2,
827*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
828*d83cc019SAndroid Build Coastguard Worker frame.avi.Q = option_val;
829*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("EC", option, 0, 1,
830*d83cc019SAndroid Build Coastguard Worker &option_val,¤t))
831*d83cc019SAndroid Build Coastguard Worker frame.avi.EC = option_val;
832*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("ITC", option, 0, 1,
833*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
834*d83cc019SAndroid Build Coastguard Worker frame.avi.ITC = option_val;
835*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("VIC", option, 0, 127,
836*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
837*d83cc019SAndroid Build Coastguard Worker frame.avi.VIC = option_val;
838*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("PR", option, 0, 15,
839*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
840*d83cc019SAndroid Build Coastguard Worker frame.avi.PR = option_val;
841*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("top", option, 0, 65535,
842*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
843*d83cc019SAndroid Build Coastguard Worker frame.avi.top = option_val;
844*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("bottom", option, 0, 65535,
845*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
846*d83cc019SAndroid Build Coastguard Worker frame.avi.bottom = option_val;
847*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("left", option, 0, 65535,
848*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
849*d83cc019SAndroid Build Coastguard Worker frame.avi.left = option_val;
850*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("right", option, 0, 65535,
851*d83cc019SAndroid Build Coastguard Worker &option_val, ¤t))
852*d83cc019SAndroid Build Coastguard Worker frame.avi.right = option_val;
853*d83cc019SAndroid Build Coastguard Worker else
854*d83cc019SAndroid Build Coastguard Worker printf("Unrecognized option: %s\n", option);
855*d83cc019SAndroid Build Coastguard Worker }
856*d83cc019SAndroid Build Coastguard Worker
857*d83cc019SAndroid Build Coastguard Worker val &= ~DIP_CTL_FREQUENCY;
858*d83cc019SAndroid Build Coastguard Worker val |= DIP_CTL_FREQ_EVERY;
859*d83cc019SAndroid Build Coastguard Worker OUTREG(reg, val);
860*d83cc019SAndroid Build Coastguard Worker
861*d83cc019SAndroid Build Coastguard Worker frame.avi.header.type = AVI_INFOFRAME_TYPE;
862*d83cc019SAndroid Build Coastguard Worker frame.avi.header.version = AVI_INFOFRAME_VERSION;
863*d83cc019SAndroid Build Coastguard Worker frame.avi.header.length = AVI_INFOFRAME_LENGTH;
864*d83cc019SAndroid Build Coastguard Worker frame.avi.Rsvd0 = 0;
865*d83cc019SAndroid Build Coastguard Worker frame.avi.Rsvd1 = 0;
866*d83cc019SAndroid Build Coastguard Worker frame.avi.Rsvd2 = 0;
867*d83cc019SAndroid Build Coastguard Worker frame.avi.Rsvd3 = 0;
868*d83cc019SAndroid Build Coastguard Worker frame.avi.Rsvd4[0] = 0;
869*d83cc019SAndroid Build Coastguard Worker frame.avi.Rsvd4[1] = 0;
870*d83cc019SAndroid Build Coastguard Worker frame.avi.Rsvd4[2] = 0;
871*d83cc019SAndroid Build Coastguard Worker
872*d83cc019SAndroid Build Coastguard Worker infoframe_fix_checksum(&frame);
873*d83cc019SAndroid Build Coastguard Worker
874*d83cc019SAndroid Build Coastguard Worker disable_infoframe(transcoder, DIP_AVI);
875*d83cc019SAndroid Build Coastguard Worker write_infoframe(transcoder, DIP_AVI, &frame);
876*d83cc019SAndroid Build Coastguard Worker enable_infoframe(transcoder, DIP_AVI);
877*d83cc019SAndroid Build Coastguard Worker }
878*d83cc019SAndroid Build Coastguard Worker
change_spd_infoframe(Transcoder transcoder,char * commands)879*d83cc019SAndroid Build Coastguard Worker static void change_spd_infoframe(Transcoder transcoder, char *commands)
880*d83cc019SAndroid Build Coastguard Worker {
881*d83cc019SAndroid Build Coastguard Worker Register reg = get_dip_ctl_reg(transcoder);
882*d83cc019SAndroid Build Coastguard Worker uint32_t val;
883*d83cc019SAndroid Build Coastguard Worker DipInfoFrame frame;
884*d83cc019SAndroid Build Coastguard Worker char option[16];
885*d83cc019SAndroid Build Coastguard Worker char option_val_s[32];
886*d83cc019SAndroid Build Coastguard Worker uint32_t option_val_i;
887*d83cc019SAndroid Build Coastguard Worker int rc, read;
888*d83cc019SAndroid Build Coastguard Worker char *current = commands;
889*d83cc019SAndroid Build Coastguard Worker
890*d83cc019SAndroid Build Coastguard Worker load_infoframe(transcoder, &frame, DIP_SPD);
891*d83cc019SAndroid Build Coastguard Worker val = INREG(reg);
892*d83cc019SAndroid Build Coastguard Worker
893*d83cc019SAndroid Build Coastguard Worker while (1) {
894*d83cc019SAndroid Build Coastguard Worker rc = sscanf(current, "%15s%n", option, &read);
895*d83cc019SAndroid Build Coastguard Worker current = ¤t[read];
896*d83cc019SAndroid Build Coastguard Worker if (rc == EOF) {
897*d83cc019SAndroid Build Coastguard Worker break;
898*d83cc019SAndroid Build Coastguard Worker } else if (rc != 1) {
899*d83cc019SAndroid Build Coastguard Worker printf("Invalid option: %s\n", option);
900*d83cc019SAndroid Build Coastguard Worker continue;
901*d83cc019SAndroid Build Coastguard Worker }
902*d83cc019SAndroid Build Coastguard Worker
903*d83cc019SAndroid Build Coastguard Worker memset(option_val_s, 0, 32);
904*d83cc019SAndroid Build Coastguard Worker
905*d83cc019SAndroid Build Coastguard Worker if (parse_infoframe_option_s("vendor", option, 0, 8,
906*d83cc019SAndroid Build Coastguard Worker option_val_s, ¤t))
907*d83cc019SAndroid Build Coastguard Worker memcpy(frame.spd.vendor, option_val_s, 8);
908*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_s("description", option, 0, 16,
909*d83cc019SAndroid Build Coastguard Worker option_val_s, ¤t))
910*d83cc019SAndroid Build Coastguard Worker memcpy(frame.spd.description, option_val_s, 16);
911*d83cc019SAndroid Build Coastguard Worker else if (parse_infoframe_option_u("source", option, 0, 0x0c,
912*d83cc019SAndroid Build Coastguard Worker &option_val_i, ¤t))
913*d83cc019SAndroid Build Coastguard Worker frame.spd.source = option_val_i;
914*d83cc019SAndroid Build Coastguard Worker else
915*d83cc019SAndroid Build Coastguard Worker printf("Unrecognized option: %s\n", option);
916*d83cc019SAndroid Build Coastguard Worker }
917*d83cc019SAndroid Build Coastguard Worker
918*d83cc019SAndroid Build Coastguard Worker val &= ~DIP_CTL_FREQUENCY;
919*d83cc019SAndroid Build Coastguard Worker val |= DIP_CTL_FREQ_EVERY_OTHER;
920*d83cc019SAndroid Build Coastguard Worker OUTREG(reg, val);
921*d83cc019SAndroid Build Coastguard Worker
922*d83cc019SAndroid Build Coastguard Worker frame.spd.header.type = SPD_INFOFRAME_TYPE;
923*d83cc019SAndroid Build Coastguard Worker frame.spd.header.version = SPD_INFOFRAME_VERSION;
924*d83cc019SAndroid Build Coastguard Worker frame.spd.header.length = SPD_INFOFRAME_LENGTH;
925*d83cc019SAndroid Build Coastguard Worker
926*d83cc019SAndroid Build Coastguard Worker infoframe_fix_checksum(&frame);
927*d83cc019SAndroid Build Coastguard Worker
928*d83cc019SAndroid Build Coastguard Worker disable_infoframe(transcoder, DIP_SPD);
929*d83cc019SAndroid Build Coastguard Worker write_infoframe(transcoder, DIP_SPD, &frame);
930*d83cc019SAndroid Build Coastguard Worker enable_infoframe(transcoder, DIP_SPD);
931*d83cc019SAndroid Build Coastguard Worker }
932*d83cc019SAndroid Build Coastguard Worker
change_infoframe_checksum(Transcoder transcoder,DipType type,uint32_t selected_csum)933*d83cc019SAndroid Build Coastguard Worker static void change_infoframe_checksum(Transcoder transcoder, DipType type,
934*d83cc019SAndroid Build Coastguard Worker uint32_t selected_csum)
935*d83cc019SAndroid Build Coastguard Worker {
936*d83cc019SAndroid Build Coastguard Worker DipInfoFrame frame;
937*d83cc019SAndroid Build Coastguard Worker
938*d83cc019SAndroid Build Coastguard Worker load_infoframe(transcoder, &frame, type);
939*d83cc019SAndroid Build Coastguard Worker frame.generic.body[0] = selected_csum;
940*d83cc019SAndroid Build Coastguard Worker disable_infoframe(transcoder, type);
941*d83cc019SAndroid Build Coastguard Worker write_infoframe(transcoder, type, &frame);
942*d83cc019SAndroid Build Coastguard Worker enable_infoframe(transcoder, type);
943*d83cc019SAndroid Build Coastguard Worker }
944*d83cc019SAndroid Build Coastguard Worker
change_infoframe_frequency(Transcoder transcoder,DipType type,DipFrequency frequency)945*d83cc019SAndroid Build Coastguard Worker static void change_infoframe_frequency(Transcoder transcoder, DipType type,
946*d83cc019SAndroid Build Coastguard Worker DipFrequency frequency)
947*d83cc019SAndroid Build Coastguard Worker {
948*d83cc019SAndroid Build Coastguard Worker Register reg = get_dip_ctl_reg(transcoder);
949*d83cc019SAndroid Build Coastguard Worker uint32_t val = INREG(reg);
950*d83cc019SAndroid Build Coastguard Worker
951*d83cc019SAndroid Build Coastguard Worker if (type == DIP_AVI && frequency != DIP_FREQ_EVERY_VSYNC) {
952*d83cc019SAndroid Build Coastguard Worker printf("Error: AVI infoframe must be sent every VSync!\n");
953*d83cc019SAndroid Build Coastguard Worker frequency = DIP_FREQ_EVERY_VSYNC;
954*d83cc019SAndroid Build Coastguard Worker }
955*d83cc019SAndroid Build Coastguard Worker
956*d83cc019SAndroid Build Coastguard Worker val &= ~DIP_CTL_FREQUENCY;
957*d83cc019SAndroid Build Coastguard Worker val |= (frequency << 16);
958*d83cc019SAndroid Build Coastguard Worker OUTREG(reg, val);
959*d83cc019SAndroid Build Coastguard Worker }
960*d83cc019SAndroid Build Coastguard Worker
disable_dip(Transcoder transcoder)961*d83cc019SAndroid Build Coastguard Worker static void disable_dip(Transcoder transcoder)
962*d83cc019SAndroid Build Coastguard Worker {
963*d83cc019SAndroid Build Coastguard Worker Register reg = get_dip_ctl_reg(transcoder);
964*d83cc019SAndroid Build Coastguard Worker uint32_t val = INREG(reg);
965*d83cc019SAndroid Build Coastguard Worker val &= ~DIP_CTL_ENABLE;
966*d83cc019SAndroid Build Coastguard Worker OUTREG(reg, val);
967*d83cc019SAndroid Build Coastguard Worker }
968*d83cc019SAndroid Build Coastguard Worker
enable_dip(Transcoder transcoder)969*d83cc019SAndroid Build Coastguard Worker static void enable_dip(Transcoder transcoder)
970*d83cc019SAndroid Build Coastguard Worker {
971*d83cc019SAndroid Build Coastguard Worker Register reg = get_dip_ctl_reg(transcoder);
972*d83cc019SAndroid Build Coastguard Worker uint32_t val = INREG(reg);
973*d83cc019SAndroid Build Coastguard Worker val |= DIP_CTL_ENABLE;
974*d83cc019SAndroid Build Coastguard Worker OUTREG(reg, val);
975*d83cc019SAndroid Build Coastguard Worker }
976*d83cc019SAndroid Build Coastguard Worker
disable_hdmi_port(Register reg)977*d83cc019SAndroid Build Coastguard Worker static void disable_hdmi_port(Register reg)
978*d83cc019SAndroid Build Coastguard Worker {
979*d83cc019SAndroid Build Coastguard Worker uint32_t val = INREG(reg);
980*d83cc019SAndroid Build Coastguard Worker val &= ~HDMI_PORT_ENABLE;
981*d83cc019SAndroid Build Coastguard Worker OUTREG(reg, val);
982*d83cc019SAndroid Build Coastguard Worker }
983*d83cc019SAndroid Build Coastguard Worker
enable_hdmi_port(Register reg)984*d83cc019SAndroid Build Coastguard Worker static void enable_hdmi_port(Register reg)
985*d83cc019SAndroid Build Coastguard Worker {
986*d83cc019SAndroid Build Coastguard Worker uint32_t val = INREG(reg);
987*d83cc019SAndroid Build Coastguard Worker val |= HDMI_PORT_ENABLE;
988*d83cc019SAndroid Build Coastguard Worker OUTREG(reg, val);
989*d83cc019SAndroid Build Coastguard Worker }
990*d83cc019SAndroid Build Coastguard Worker
print_usage(void)991*d83cc019SAndroid Build Coastguard Worker static void print_usage(void)
992*d83cc019SAndroid Build Coastguard Worker {
993*d83cc019SAndroid Build Coastguard Worker printf("Options:\n"
994*d83cc019SAndroid Build Coastguard Worker " -d, --dump\n"
995*d83cc019SAndroid Build Coastguard Worker " dump information about all transcoders\n"
996*d83cc019SAndroid Build Coastguard Worker " -c, --change-fields [fields]\n"
997*d83cc019SAndroid Build Coastguard Worker " change infoframe fields from selected transcoder\n"
998*d83cc019SAndroid Build Coastguard Worker " -k, --change-checksum [checksum]\n"
999*d83cc019SAndroid Build Coastguard Worker " change infoframe checksum (value in hex)\n"
1000*d83cc019SAndroid Build Coastguard Worker " -q, --change-frequency [frequency]\n"
1001*d83cc019SAndroid Build Coastguard Worker " change infoframe frequency (once, everyvsync or everyothervsync)\n"
1002*d83cc019SAndroid Build Coastguard Worker " -n, --disable\n"
1003*d83cc019SAndroid Build Coastguard Worker " disable the selected infoframe from the selected transcoder\n"
1004*d83cc019SAndroid Build Coastguard Worker " -N, --enable\n"
1005*d83cc019SAndroid Build Coastguard Worker " enable the selected infoframe from the selected transcoder\n"
1006*d83cc019SAndroid Build Coastguard Worker " -x, --disable-infoframes\n"
1007*d83cc019SAndroid Build Coastguard Worker " disable all infoframes from selected transcoder\n"
1008*d83cc019SAndroid Build Coastguard Worker " -X, --enable-infoframes\n"
1009*d83cc019SAndroid Build Coastguard Worker " enable sending infoframes on the selected transcoder\n"
1010*d83cc019SAndroid Build Coastguard Worker " -p, --disable-hdmi-port [port]\n"
1011*d83cc019SAndroid Build Coastguard Worker " disable hdmi port on the selected transcoder (B, C or D)\n"
1012*d83cc019SAndroid Build Coastguard Worker " -P, --enable-hdmi-port [port]\n"
1013*d83cc019SAndroid Build Coastguard Worker " enable hdmi port on the selected transcoder (B, C or D)\n"
1014*d83cc019SAndroid Build Coastguard Worker " -t, --transcoder\n"
1015*d83cc019SAndroid Build Coastguard Worker " select transcoder (A, B or C)\n"
1016*d83cc019SAndroid Build Coastguard Worker " -f, --infoframe\n"
1017*d83cc019SAndroid Build Coastguard Worker " select infoframe (AVI, Vendor, Gamut or SPD)\n"
1018*d83cc019SAndroid Build Coastguard Worker " -h, --help\n"
1019*d83cc019SAndroid Build Coastguard Worker " prints this message\n"
1020*d83cc019SAndroid Build Coastguard Worker "\n"
1021*d83cc019SAndroid Build Coastguard Worker "Examples:\n"
1022*d83cc019SAndroid Build Coastguard Worker "\n"
1023*d83cc019SAndroid Build Coastguard Worker " Dump information:\n"
1024*d83cc019SAndroid Build Coastguard Worker " intel_infoframes\n"
1025*d83cc019SAndroid Build Coastguard Worker "\n"
1026*d83cc019SAndroid Build Coastguard Worker " Disable overscan and set ITC on transcoder B:\n"
1027*d83cc019SAndroid Build Coastguard Worker " intel_infoframes -t B -f AVI -c 'S 2 ITC 1'\n"
1028*d83cc019SAndroid Build Coastguard Worker "\n"
1029*d83cc019SAndroid Build Coastguard Worker " Many actions on the same command:\n"
1030*d83cc019SAndroid Build Coastguard Worker " - enable overscan on transcoder A\n"
1031*d83cc019SAndroid Build Coastguard Worker " - enable overscan and change description on transcoder B\n"
1032*d83cc019SAndroid Build Coastguard Worker " - disable all infoframes on transcoder C\n"
1033*d83cc019SAndroid Build Coastguard Worker " - dump the resulting state:\n"
1034*d83cc019SAndroid Build Coastguard Worker " intel_infoframes -t A -f AVI -c 'S 1' \\\n"
1035*d83cc019SAndroid Build Coastguard Worker " -t B -f AVI -c 'S 2' \\\n"
1036*d83cc019SAndroid Build Coastguard Worker " -f SPD -c 'description Linux' \\\n"
1037*d83cc019SAndroid Build Coastguard Worker " -t C --disable-infoframes \\\n"
1038*d83cc019SAndroid Build Coastguard Worker " -d\n"
1039*d83cc019SAndroid Build Coastguard Worker "\n"
1040*d83cc019SAndroid Build Coastguard Worker " Even more:\n"
1041*d83cc019SAndroid Build Coastguard Worker " - print the help message\n"
1042*d83cc019SAndroid Build Coastguard Worker " - completely disable all infoframes on all transcoders\n"
1043*d83cc019SAndroid Build Coastguard Worker " - dump the state"
1044*d83cc019SAndroid Build Coastguard Worker " - enable sending infoframes on transcoder B, but disable all infoframes\n"
1045*d83cc019SAndroid Build Coastguard Worker " - enable AVI infoframes transcoder B, use underscan and declare ITC\n"
1046*d83cc019SAndroid Build Coastguard Worker " - also enable SPD infoframes on the same transcoder, change frequency to\n"
1047*d83cc019SAndroid Build Coastguard Worker " every vsync and change vendor, description and source\n"
1048*d83cc019SAndroid Build Coastguard Worker " - dump the state again\n"
1049*d83cc019SAndroid Build Coastguard Worker " intel_infoframes -h \\\n"
1050*d83cc019SAndroid Build Coastguard Worker " -t A -x -t B -x -t C -x \\\n"
1051*d83cc019SAndroid Build Coastguard Worker " -d \\\n"
1052*d83cc019SAndroid Build Coastguard Worker " -t A -X -f AVI -n -f Vendor -n \\\n"
1053*d83cc019SAndroid Build Coastguard Worker " -f Gamut -n -f SPD -n \\\n"
1054*d83cc019SAndroid Build Coastguard Worker " -f AVI -N -c 'S 2 ITC 1'\\\n"
1055*d83cc019SAndroid Build Coastguard Worker " -f SPD -q everyvsync \\\n"
1056*d83cc019SAndroid Build Coastguard Worker " -c 'vendor me description mine source 0x09' \\\n"
1057*d83cc019SAndroid Build Coastguard Worker " -d\n"
1058*d83cc019SAndroid Build Coastguard Worker "\n"
1059*d83cc019SAndroid Build Coastguard Worker "Infoframe fields used by the --change-fields option:\n"
1060*d83cc019SAndroid Build Coastguard Worker " - AVI infoframe fields:\n"
1061*d83cc019SAndroid Build Coastguard Worker " S B A Y R M C SC Q EC ITC VIC PR top bottom left right\n"
1062*d83cc019SAndroid Build Coastguard Worker " - SPD infoframe fields:\n"
1063*d83cc019SAndroid Build Coastguard Worker " vendor description source\n"
1064*d83cc019SAndroid Build Coastguard Worker " - Other infoframe fields are not implemented yet.\n");
1065*d83cc019SAndroid Build Coastguard Worker }
1066*d83cc019SAndroid Build Coastguard Worker
1067*d83cc019SAndroid Build Coastguard Worker #define CHECK_TRANSCODER(transcoder) \
1068*d83cc019SAndroid Build Coastguard Worker if (transcoder == TRANSC_INVALID) { \
1069*d83cc019SAndroid Build Coastguard Worker printf("Transcoder not selected.\n"); \
1070*d83cc019SAndroid Build Coastguard Worker ret = 1; \
1071*d83cc019SAndroid Build Coastguard Worker goto out; \
1072*d83cc019SAndroid Build Coastguard Worker }
1073*d83cc019SAndroid Build Coastguard Worker
1074*d83cc019SAndroid Build Coastguard Worker #define CHECK_DIP(dip) \
1075*d83cc019SAndroid Build Coastguard Worker if (dip == DIP_INVALID) { \
1076*d83cc019SAndroid Build Coastguard Worker printf("Infoframe not selected.\n"); \
1077*d83cc019SAndroid Build Coastguard Worker ret = 1; \
1078*d83cc019SAndroid Build Coastguard Worker goto out; \
1079*d83cc019SAndroid Build Coastguard Worker }
1080*d83cc019SAndroid Build Coastguard Worker
main(int argc,char * argv[])1081*d83cc019SAndroid Build Coastguard Worker int main(int argc, char *argv[])
1082*d83cc019SAndroid Build Coastguard Worker {
1083*d83cc019SAndroid Build Coastguard Worker int opt;
1084*d83cc019SAndroid Build Coastguard Worker int ret = 0;
1085*d83cc019SAndroid Build Coastguard Worker Transcoder transcoder = TRANSC_INVALID;
1086*d83cc019SAndroid Build Coastguard Worker DipType dip = DIP_INVALID;
1087*d83cc019SAndroid Build Coastguard Worker Register hdmi_port;
1088*d83cc019SAndroid Build Coastguard Worker
1089*d83cc019SAndroid Build Coastguard Worker char short_opts[] = "dc:k:q:nNxXp:P:t:f:h";
1090*d83cc019SAndroid Build Coastguard Worker struct option long_opts[] = {
1091*d83cc019SAndroid Build Coastguard Worker { "dump", no_argument, NULL, 'd' },
1092*d83cc019SAndroid Build Coastguard Worker { "change-fields", required_argument, NULL, 'c' },
1093*d83cc019SAndroid Build Coastguard Worker { "change-checksum", required_argument, NULL, 'k' },
1094*d83cc019SAndroid Build Coastguard Worker { "change-frequency", required_argument, NULL, 'q' },
1095*d83cc019SAndroid Build Coastguard Worker { "disable", no_argument, NULL, 'n' },
1096*d83cc019SAndroid Build Coastguard Worker { "enable", no_argument, NULL, 'N' },
1097*d83cc019SAndroid Build Coastguard Worker { "disable-infoframes", no_argument, NULL, 'x' },
1098*d83cc019SAndroid Build Coastguard Worker { "enable-infoframes", no_argument, NULL, 'X' },
1099*d83cc019SAndroid Build Coastguard Worker { "disable-hdmi-port", required_argument, NULL, 'p' },
1100*d83cc019SAndroid Build Coastguard Worker { "enable-hdmi-port", required_argument, NULL, 'P' },
1101*d83cc019SAndroid Build Coastguard Worker { "transcoder" , required_argument, NULL, 't' },
1102*d83cc019SAndroid Build Coastguard Worker { "infoframe", required_argument, NULL, 'f' },
1103*d83cc019SAndroid Build Coastguard Worker { "help", no_argument, NULL, 'h' },
1104*d83cc019SAndroid Build Coastguard Worker { 0 }
1105*d83cc019SAndroid Build Coastguard Worker };
1106*d83cc019SAndroid Build Coastguard Worker
1107*d83cc019SAndroid Build Coastguard Worker printf("WARNING: This is just a debugging tool! Don't expect it to work"
1108*d83cc019SAndroid Build Coastguard Worker " perfectly: the Kernel might undo our changes.\n");
1109*d83cc019SAndroid Build Coastguard Worker
1110*d83cc019SAndroid Build Coastguard Worker pci_dev = intel_get_pci_device();
1111*d83cc019SAndroid Build Coastguard Worker intel_register_access_init(pci_dev, 0, -1);
1112*d83cc019SAndroid Build Coastguard Worker intel_check_pch();
1113*d83cc019SAndroid Build Coastguard Worker
1114*d83cc019SAndroid Build Coastguard Worker if (IS_GEN4(pci_dev->device_id))
1115*d83cc019SAndroid Build Coastguard Worker gen = 4;
1116*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN5(pci_dev->device_id))
1117*d83cc019SAndroid Build Coastguard Worker gen = 5;
1118*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN6(pci_dev->device_id))
1119*d83cc019SAndroid Build Coastguard Worker gen = 6;
1120*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN7(pci_dev->device_id))
1121*d83cc019SAndroid Build Coastguard Worker gen = 7;
1122*d83cc019SAndroid Build Coastguard Worker else {
1123*d83cc019SAndroid Build Coastguard Worker printf("This program does not support your hardware yet.\n");
1124*d83cc019SAndroid Build Coastguard Worker ret = 1;
1125*d83cc019SAndroid Build Coastguard Worker goto out;
1126*d83cc019SAndroid Build Coastguard Worker }
1127*d83cc019SAndroid Build Coastguard Worker
1128*d83cc019SAndroid Build Coastguard Worker while (1) {
1129*d83cc019SAndroid Build Coastguard Worker opt = getopt_long(argc, argv, short_opts, long_opts, NULL);
1130*d83cc019SAndroid Build Coastguard Worker if (opt == -1)
1131*d83cc019SAndroid Build Coastguard Worker break;
1132*d83cc019SAndroid Build Coastguard Worker
1133*d83cc019SAndroid Build Coastguard Worker switch (opt) {
1134*d83cc019SAndroid Build Coastguard Worker case 'd':
1135*d83cc019SAndroid Build Coastguard Worker dump_all_info();
1136*d83cc019SAndroid Build Coastguard Worker break;
1137*d83cc019SAndroid Build Coastguard Worker case 'c':
1138*d83cc019SAndroid Build Coastguard Worker if (transcoder == TRANSC_INVALID) {
1139*d83cc019SAndroid Build Coastguard Worker printf("Transcoder not selected.\n");
1140*d83cc019SAndroid Build Coastguard Worker ret = 1;
1141*d83cc019SAndroid Build Coastguard Worker goto out;
1142*d83cc019SAndroid Build Coastguard Worker }
1143*d83cc019SAndroid Build Coastguard Worker switch (dip) {
1144*d83cc019SAndroid Build Coastguard Worker case DIP_AVI:
1145*d83cc019SAndroid Build Coastguard Worker change_avi_infoframe(transcoder, optarg);
1146*d83cc019SAndroid Build Coastguard Worker break;
1147*d83cc019SAndroid Build Coastguard Worker case DIP_VENDOR:
1148*d83cc019SAndroid Build Coastguard Worker case DIP_GAMUT:
1149*d83cc019SAndroid Build Coastguard Worker printf("Option not implemented yet.\n");
1150*d83cc019SAndroid Build Coastguard Worker ret = 1;
1151*d83cc019SAndroid Build Coastguard Worker goto out;
1152*d83cc019SAndroid Build Coastguard Worker case DIP_SPD:
1153*d83cc019SAndroid Build Coastguard Worker change_spd_infoframe(transcoder, optarg);
1154*d83cc019SAndroid Build Coastguard Worker break;
1155*d83cc019SAndroid Build Coastguard Worker case DIP_INVALID:
1156*d83cc019SAndroid Build Coastguard Worker printf("Infoframe not selected.\n");
1157*d83cc019SAndroid Build Coastguard Worker ret = 1;
1158*d83cc019SAndroid Build Coastguard Worker goto out;
1159*d83cc019SAndroid Build Coastguard Worker }
1160*d83cc019SAndroid Build Coastguard Worker break;
1161*d83cc019SAndroid Build Coastguard Worker case 'k':
1162*d83cc019SAndroid Build Coastguard Worker CHECK_TRANSCODER(transcoder);
1163*d83cc019SAndroid Build Coastguard Worker CHECK_DIP(dip);
1164*d83cc019SAndroid Build Coastguard Worker change_infoframe_checksum(transcoder, dip, atoi(optarg));
1165*d83cc019SAndroid Build Coastguard Worker break;
1166*d83cc019SAndroid Build Coastguard Worker case 'q':
1167*d83cc019SAndroid Build Coastguard Worker CHECK_TRANSCODER(transcoder);
1168*d83cc019SAndroid Build Coastguard Worker CHECK_DIP(dip);
1169*d83cc019SAndroid Build Coastguard Worker if (!strcmp(optarg, "once"))
1170*d83cc019SAndroid Build Coastguard Worker change_infoframe_frequency(transcoder, dip,
1171*d83cc019SAndroid Build Coastguard Worker DIP_FREQ_ONCE);
1172*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "everyvsync"))
1173*d83cc019SAndroid Build Coastguard Worker change_infoframe_frequency(transcoder, dip,
1174*d83cc019SAndroid Build Coastguard Worker DIP_FREQ_EVERY_VSYNC);
1175*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "everyothervsync"))
1176*d83cc019SAndroid Build Coastguard Worker change_infoframe_frequency(transcoder, dip,
1177*d83cc019SAndroid Build Coastguard Worker DIP_FREQ_EVERY_OTHER_VSYNC);
1178*d83cc019SAndroid Build Coastguard Worker else {
1179*d83cc019SAndroid Build Coastguard Worker printf("Invalid frequency.\n");
1180*d83cc019SAndroid Build Coastguard Worker ret = 1;
1181*d83cc019SAndroid Build Coastguard Worker goto out;
1182*d83cc019SAndroid Build Coastguard Worker }
1183*d83cc019SAndroid Build Coastguard Worker break;
1184*d83cc019SAndroid Build Coastguard Worker case 'n':
1185*d83cc019SAndroid Build Coastguard Worker CHECK_TRANSCODER(transcoder);
1186*d83cc019SAndroid Build Coastguard Worker CHECK_DIP(dip);
1187*d83cc019SAndroid Build Coastguard Worker disable_infoframe(transcoder, dip);
1188*d83cc019SAndroid Build Coastguard Worker break;
1189*d83cc019SAndroid Build Coastguard Worker case 'N':
1190*d83cc019SAndroid Build Coastguard Worker CHECK_TRANSCODER(transcoder);
1191*d83cc019SAndroid Build Coastguard Worker CHECK_DIP(dip);
1192*d83cc019SAndroid Build Coastguard Worker enable_infoframe(transcoder, dip);
1193*d83cc019SAndroid Build Coastguard Worker break;
1194*d83cc019SAndroid Build Coastguard Worker case 'x':
1195*d83cc019SAndroid Build Coastguard Worker CHECK_TRANSCODER(transcoder);
1196*d83cc019SAndroid Build Coastguard Worker disable_dip(transcoder);
1197*d83cc019SAndroid Build Coastguard Worker break;
1198*d83cc019SAndroid Build Coastguard Worker case 'X':
1199*d83cc019SAndroid Build Coastguard Worker CHECK_TRANSCODER(transcoder);
1200*d83cc019SAndroid Build Coastguard Worker enable_dip(transcoder);
1201*d83cc019SAndroid Build Coastguard Worker break;
1202*d83cc019SAndroid Build Coastguard Worker case 'p':
1203*d83cc019SAndroid Build Coastguard Worker case 'P':
1204*d83cc019SAndroid Build Coastguard Worker if (!strcmp(optarg, "B"))
1205*d83cc019SAndroid Build Coastguard Worker hdmi_port = get_hdmi_port(0);
1206*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "C"))
1207*d83cc019SAndroid Build Coastguard Worker hdmi_port = get_hdmi_port(1);
1208*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "D"))
1209*d83cc019SAndroid Build Coastguard Worker hdmi_port = get_hdmi_port(2);
1210*d83cc019SAndroid Build Coastguard Worker else {
1211*d83cc019SAndroid Build Coastguard Worker printf("Invalid HDMI port.\n");
1212*d83cc019SAndroid Build Coastguard Worker ret = 1;
1213*d83cc019SAndroid Build Coastguard Worker goto out;
1214*d83cc019SAndroid Build Coastguard Worker }
1215*d83cc019SAndroid Build Coastguard Worker if (opt == 'p')
1216*d83cc019SAndroid Build Coastguard Worker disable_hdmi_port(hdmi_port);
1217*d83cc019SAndroid Build Coastguard Worker else
1218*d83cc019SAndroid Build Coastguard Worker enable_hdmi_port(hdmi_port);
1219*d83cc019SAndroid Build Coastguard Worker break;
1220*d83cc019SAndroid Build Coastguard Worker case 't':
1221*d83cc019SAndroid Build Coastguard Worker if (!strcmp(optarg, "A"))
1222*d83cc019SAndroid Build Coastguard Worker transcoder = TRANSC_A;
1223*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "B"))
1224*d83cc019SAndroid Build Coastguard Worker transcoder = TRANSC_B;
1225*d83cc019SAndroid Build Coastguard Worker else if (intel_pch >= PCH_CPT && !strcmp(optarg, "C")) {
1226*d83cc019SAndroid Build Coastguard Worker transcoder = TRANSC_C;
1227*d83cc019SAndroid Build Coastguard Worker } else {
1228*d83cc019SAndroid Build Coastguard Worker printf("Invalid transcoder.\n");
1229*d83cc019SAndroid Build Coastguard Worker ret = 1;
1230*d83cc019SAndroid Build Coastguard Worker goto out;
1231*d83cc019SAndroid Build Coastguard Worker }
1232*d83cc019SAndroid Build Coastguard Worker break;
1233*d83cc019SAndroid Build Coastguard Worker case 'f':
1234*d83cc019SAndroid Build Coastguard Worker if (!strcmp(optarg, "AVI"))
1235*d83cc019SAndroid Build Coastguard Worker dip = DIP_AVI;
1236*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "Vendor"))
1237*d83cc019SAndroid Build Coastguard Worker dip = DIP_VENDOR;
1238*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "Gamut"))
1239*d83cc019SAndroid Build Coastguard Worker dip = DIP_GAMUT;
1240*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "SPD"))
1241*d83cc019SAndroid Build Coastguard Worker dip = DIP_SPD;
1242*d83cc019SAndroid Build Coastguard Worker else {
1243*d83cc019SAndroid Build Coastguard Worker printf("Invalid infoframe.\n");
1244*d83cc019SAndroid Build Coastguard Worker ret = 1;
1245*d83cc019SAndroid Build Coastguard Worker goto out;
1246*d83cc019SAndroid Build Coastguard Worker }
1247*d83cc019SAndroid Build Coastguard Worker break;
1248*d83cc019SAndroid Build Coastguard Worker case 'h':
1249*d83cc019SAndroid Build Coastguard Worker print_usage();
1250*d83cc019SAndroid Build Coastguard Worker break;
1251*d83cc019SAndroid Build Coastguard Worker default:
1252*d83cc019SAndroid Build Coastguard Worker print_usage();
1253*d83cc019SAndroid Build Coastguard Worker ret = 1;
1254*d83cc019SAndroid Build Coastguard Worker goto out;
1255*d83cc019SAndroid Build Coastguard Worker }
1256*d83cc019SAndroid Build Coastguard Worker }
1257*d83cc019SAndroid Build Coastguard Worker
1258*d83cc019SAndroid Build Coastguard Worker out:
1259*d83cc019SAndroid Build Coastguard Worker intel_register_access_fini();
1260*d83cc019SAndroid Build Coastguard Worker return ret;
1261*d83cc019SAndroid Build Coastguard Worker }
1262