1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright � 2006 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 FROM,
20*d83cc019SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*d83cc019SAndroid Build Coastguard Worker * SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker *
23*d83cc019SAndroid Build Coastguard Worker * Authors:
24*d83cc019SAndroid Build Coastguard Worker * Eric Anholt <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker *
26*d83cc019SAndroid Build Coastguard Worker */
27*d83cc019SAndroid Build Coastguard Worker
28*d83cc019SAndroid Build Coastguard Worker #include <ctype.h>
29*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
30*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
31*d83cc019SAndroid Build Coastguard Worker #include <getopt.h>
32*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
33*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
34*d83cc019SAndroid Build Coastguard Worker #include <string.h>
35*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
36*d83cc019SAndroid Build Coastguard Worker #include <sys/mman.h>
37*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
38*d83cc019SAndroid Build Coastguard Worker #include <sys/types.h>
39*d83cc019SAndroid Build Coastguard Worker
40*d83cc019SAndroid Build Coastguard Worker #include "igt_aux.h"
41*d83cc019SAndroid Build Coastguard Worker #include "intel_io.h"
42*d83cc019SAndroid Build Coastguard Worker #include "intel_chipset.h"
43*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
44*d83cc019SAndroid Build Coastguard Worker
45*d83cc019SAndroid Build Coastguard Worker /* kernel types for intel_vbt_defs.h */
46*d83cc019SAndroid Build Coastguard Worker typedef uint8_t u8;
47*d83cc019SAndroid Build Coastguard Worker typedef uint16_t u16;
48*d83cc019SAndroid Build Coastguard Worker typedef uint32_t u32;
49*d83cc019SAndroid Build Coastguard Worker typedef uint64_t u64;
50*d83cc019SAndroid Build Coastguard Worker #define __packed __attribute__ ((packed))
51*d83cc019SAndroid Build Coastguard Worker
52*d83cc019SAndroid Build Coastguard Worker #define _INTEL_BIOS_PRIVATE
53*d83cc019SAndroid Build Coastguard Worker #include "intel_vbt_defs.h"
54*d83cc019SAndroid Build Coastguard Worker
55*d83cc019SAndroid Build Coastguard Worker /* no bother to include "edid.h" */
56*d83cc019SAndroid Build Coastguard Worker #define _H_ACTIVE(x) (x[2] + ((x[4] & 0xF0) << 4))
57*d83cc019SAndroid Build Coastguard Worker #define _H_SYNC_OFF(x) (x[8] + ((x[11] & 0xC0) << 2))
58*d83cc019SAndroid Build Coastguard Worker #define _H_SYNC_WIDTH(x) (x[9] + ((x[11] & 0x30) << 4))
59*d83cc019SAndroid Build Coastguard Worker #define _H_BLANK(x) (x[3] + ((x[4] & 0x0F) << 8))
60*d83cc019SAndroid Build Coastguard Worker #define _V_ACTIVE(x) (x[5] + ((x[7] & 0xF0) << 4))
61*d83cc019SAndroid Build Coastguard Worker #define _V_SYNC_OFF(x) ((x[10] >> 4) + ((x[11] & 0x0C) << 2))
62*d83cc019SAndroid Build Coastguard Worker #define _V_SYNC_WIDTH(x) ((x[10] & 0x0F) + ((x[11] & 0x03) << 4))
63*d83cc019SAndroid Build Coastguard Worker #define _V_BLANK(x) (x[6] + ((x[7] & 0x0F) << 8))
64*d83cc019SAndroid Build Coastguard Worker #define _PIXEL_CLOCK(x) (x[0] + (x[1] << 8)) * 10000
65*d83cc019SAndroid Build Coastguard Worker
66*d83cc019SAndroid Build Coastguard Worker #define YESNO(val) ((val) ? "yes" : "no")
67*d83cc019SAndroid Build Coastguard Worker
68*d83cc019SAndroid Build Coastguard Worker /* This is not for mapping to memory layout. */
69*d83cc019SAndroid Build Coastguard Worker struct bdb_block {
70*d83cc019SAndroid Build Coastguard Worker uint8_t id;
71*d83cc019SAndroid Build Coastguard Worker uint32_t size;
72*d83cc019SAndroid Build Coastguard Worker const void *data;
73*d83cc019SAndroid Build Coastguard Worker };
74*d83cc019SAndroid Build Coastguard Worker
75*d83cc019SAndroid Build Coastguard Worker struct context {
76*d83cc019SAndroid Build Coastguard Worker const struct vbt_header *vbt;
77*d83cc019SAndroid Build Coastguard Worker const struct bdb_header *bdb;
78*d83cc019SAndroid Build Coastguard Worker int size;
79*d83cc019SAndroid Build Coastguard Worker
80*d83cc019SAndroid Build Coastguard Worker uint32_t devid;
81*d83cc019SAndroid Build Coastguard Worker int panel_type;
82*d83cc019SAndroid Build Coastguard Worker bool dump_all_panel_types;
83*d83cc019SAndroid Build Coastguard Worker bool hexdump;
84*d83cc019SAndroid Build Coastguard Worker };
85*d83cc019SAndroid Build Coastguard Worker
86*d83cc019SAndroid Build Coastguard Worker /* Get BDB block size given a pointer to Block ID. */
_get_blocksize(const uint8_t * block_base)87*d83cc019SAndroid Build Coastguard Worker static uint32_t _get_blocksize(const uint8_t *block_base)
88*d83cc019SAndroid Build Coastguard Worker {
89*d83cc019SAndroid Build Coastguard Worker /* The MIPI Sequence Block v3+ has a separate size field. */
90*d83cc019SAndroid Build Coastguard Worker if (*block_base == BDB_MIPI_SEQUENCE && *(block_base + 3) >= 3)
91*d83cc019SAndroid Build Coastguard Worker return *((const uint32_t *)(block_base + 4));
92*d83cc019SAndroid Build Coastguard Worker else
93*d83cc019SAndroid Build Coastguard Worker return *((const uint16_t *)(block_base + 1));
94*d83cc019SAndroid Build Coastguard Worker }
95*d83cc019SAndroid Build Coastguard Worker
find_section(struct context * context,int section_id)96*d83cc019SAndroid Build Coastguard Worker static struct bdb_block *find_section(struct context *context, int section_id)
97*d83cc019SAndroid Build Coastguard Worker {
98*d83cc019SAndroid Build Coastguard Worker const struct bdb_header *bdb = context->bdb;
99*d83cc019SAndroid Build Coastguard Worker int length = context->size;
100*d83cc019SAndroid Build Coastguard Worker struct bdb_block *block;
101*d83cc019SAndroid Build Coastguard Worker const uint8_t *base = (const uint8_t *)bdb;
102*d83cc019SAndroid Build Coastguard Worker int index = 0;
103*d83cc019SAndroid Build Coastguard Worker uint32_t total, current_size;
104*d83cc019SAndroid Build Coastguard Worker unsigned char current_id;
105*d83cc019SAndroid Build Coastguard Worker
106*d83cc019SAndroid Build Coastguard Worker /* skip to first section */
107*d83cc019SAndroid Build Coastguard Worker index += bdb->header_size;
108*d83cc019SAndroid Build Coastguard Worker total = bdb->bdb_size;
109*d83cc019SAndroid Build Coastguard Worker if (total > length)
110*d83cc019SAndroid Build Coastguard Worker total = length;
111*d83cc019SAndroid Build Coastguard Worker
112*d83cc019SAndroid Build Coastguard Worker block = malloc(sizeof(*block));
113*d83cc019SAndroid Build Coastguard Worker if (!block) {
114*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "out of memory\n");
115*d83cc019SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
116*d83cc019SAndroid Build Coastguard Worker }
117*d83cc019SAndroid Build Coastguard Worker
118*d83cc019SAndroid Build Coastguard Worker /* walk the sections looking for section_id */
119*d83cc019SAndroid Build Coastguard Worker while (index + 3 < total) {
120*d83cc019SAndroid Build Coastguard Worker current_id = *(base + index);
121*d83cc019SAndroid Build Coastguard Worker current_size = _get_blocksize(base + index);
122*d83cc019SAndroid Build Coastguard Worker index += 3;
123*d83cc019SAndroid Build Coastguard Worker
124*d83cc019SAndroid Build Coastguard Worker if (index + current_size > total)
125*d83cc019SAndroid Build Coastguard Worker return NULL;
126*d83cc019SAndroid Build Coastguard Worker
127*d83cc019SAndroid Build Coastguard Worker if (current_id == section_id) {
128*d83cc019SAndroid Build Coastguard Worker block->id = current_id;
129*d83cc019SAndroid Build Coastguard Worker block->size = current_size;
130*d83cc019SAndroid Build Coastguard Worker block->data = base + index;
131*d83cc019SAndroid Build Coastguard Worker return block;
132*d83cc019SAndroid Build Coastguard Worker }
133*d83cc019SAndroid Build Coastguard Worker
134*d83cc019SAndroid Build Coastguard Worker index += current_size;
135*d83cc019SAndroid Build Coastguard Worker }
136*d83cc019SAndroid Build Coastguard Worker
137*d83cc019SAndroid Build Coastguard Worker free(block);
138*d83cc019SAndroid Build Coastguard Worker return NULL;
139*d83cc019SAndroid Build Coastguard Worker }
140*d83cc019SAndroid Build Coastguard Worker
dump_general_features(struct context * context,const struct bdb_block * block)141*d83cc019SAndroid Build Coastguard Worker static void dump_general_features(struct context *context,
142*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
143*d83cc019SAndroid Build Coastguard Worker {
144*d83cc019SAndroid Build Coastguard Worker const struct bdb_general_features *features = block->data;
145*d83cc019SAndroid Build Coastguard Worker
146*d83cc019SAndroid Build Coastguard Worker printf("\tPanel fitting: ");
147*d83cc019SAndroid Build Coastguard Worker switch (features->panel_fitting) {
148*d83cc019SAndroid Build Coastguard Worker case 0:
149*d83cc019SAndroid Build Coastguard Worker printf("disabled\n");
150*d83cc019SAndroid Build Coastguard Worker break;
151*d83cc019SAndroid Build Coastguard Worker case 1:
152*d83cc019SAndroid Build Coastguard Worker printf("text only\n");
153*d83cc019SAndroid Build Coastguard Worker break;
154*d83cc019SAndroid Build Coastguard Worker case 2:
155*d83cc019SAndroid Build Coastguard Worker printf("graphics only\n");
156*d83cc019SAndroid Build Coastguard Worker break;
157*d83cc019SAndroid Build Coastguard Worker case 3:
158*d83cc019SAndroid Build Coastguard Worker printf("text & graphics\n");
159*d83cc019SAndroid Build Coastguard Worker break;
160*d83cc019SAndroid Build Coastguard Worker }
161*d83cc019SAndroid Build Coastguard Worker printf("\tFlexaim: %s\n", YESNO(features->flexaim));
162*d83cc019SAndroid Build Coastguard Worker printf("\tMessage: %s\n", YESNO(features->msg_enable));
163*d83cc019SAndroid Build Coastguard Worker printf("\tClear screen: %d\n", features->clear_screen);
164*d83cc019SAndroid Build Coastguard Worker printf("\tDVO color flip required: %s\n", YESNO(features->color_flip));
165*d83cc019SAndroid Build Coastguard Worker
166*d83cc019SAndroid Build Coastguard Worker printf("\tExternal VBT: %s\n", YESNO(features->download_ext_vbt));
167*d83cc019SAndroid Build Coastguard Worker printf("\tEnable SSC: %s\n", YESNO(features->enable_ssc));
168*d83cc019SAndroid Build Coastguard Worker if (features->enable_ssc) {
169*d83cc019SAndroid Build Coastguard Worker if (!context->devid)
170*d83cc019SAndroid Build Coastguard Worker printf("\tSSC frequency: <unknown platform>\n");
171*d83cc019SAndroid Build Coastguard Worker else if (IS_VALLEYVIEW(context->devid) ||
172*d83cc019SAndroid Build Coastguard Worker IS_CHERRYVIEW(context->devid) ||
173*d83cc019SAndroid Build Coastguard Worker IS_BROXTON(context->devid))
174*d83cc019SAndroid Build Coastguard Worker printf("\tSSC frequency: 100 MHz\n");
175*d83cc019SAndroid Build Coastguard Worker else if (HAS_PCH_SPLIT(context->devid))
176*d83cc019SAndroid Build Coastguard Worker printf("\tSSC frequency: %s\n", features->ssc_freq ?
177*d83cc019SAndroid Build Coastguard Worker "100 MHz" : "120 MHz");
178*d83cc019SAndroid Build Coastguard Worker else
179*d83cc019SAndroid Build Coastguard Worker printf("\tSSC frequency: %s\n", features->ssc_freq ?
180*d83cc019SAndroid Build Coastguard Worker "100 MHz (66 MHz on 855)" : "96 MHz (48 MHz on 855)");
181*d83cc019SAndroid Build Coastguard Worker }
182*d83cc019SAndroid Build Coastguard Worker printf("\tLFP on override: %s\n",
183*d83cc019SAndroid Build Coastguard Worker YESNO(features->enable_lfp_on_override));
184*d83cc019SAndroid Build Coastguard Worker printf("\tDisable SSC on clone: %s\n",
185*d83cc019SAndroid Build Coastguard Worker YESNO(features->disable_ssc_ddt));
186*d83cc019SAndroid Build Coastguard Worker printf("\tUnderscan support for VGA timings: %s\n",
187*d83cc019SAndroid Build Coastguard Worker YESNO(features->underscan_vga_timings));
188*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 183)
189*d83cc019SAndroid Build Coastguard Worker printf("\tDynamic CD clock: %s\n", YESNO(features->display_clock_mode));
190*d83cc019SAndroid Build Coastguard Worker printf("\tHotplug support in VBIOS: %s\n",
191*d83cc019SAndroid Build Coastguard Worker YESNO(features->vbios_hotplug_support));
192*d83cc019SAndroid Build Coastguard Worker
193*d83cc019SAndroid Build Coastguard Worker printf("\tDisable smooth vision: %s\n",
194*d83cc019SAndroid Build Coastguard Worker YESNO(features->disable_smooth_vision));
195*d83cc019SAndroid Build Coastguard Worker printf("\tSingle DVI for CRT/DVI: %s\n", YESNO(features->single_dvi));
196*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 181)
197*d83cc019SAndroid Build Coastguard Worker printf("\tEnable 180 degree rotation: %s\n", YESNO(features->rotate_180));
198*d83cc019SAndroid Build Coastguard Worker printf("\tInverted FDI Rx polarity: %s\n", YESNO(features->fdi_rx_polarity_inverted));
199*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 160) {
200*d83cc019SAndroid Build Coastguard Worker printf("\tExtended VBIOS mode: %s\n", YESNO(features->vbios_extended_mode));
201*d83cc019SAndroid Build Coastguard Worker printf("\tCopy iLFP DTD to SDVO LVDS DTD: %s\n", YESNO(features->copy_ilfp_dtd_to_sdvo_lvds_dtd));
202*d83cc019SAndroid Build Coastguard Worker printf("\tBest fit panel timing algorithm: %s\n", YESNO(features->panel_best_fit_timing));
203*d83cc019SAndroid Build Coastguard Worker printf("\tIgnore strap state: %s\n", YESNO(features->ignore_strap_state));
204*d83cc019SAndroid Build Coastguard Worker }
205*d83cc019SAndroid Build Coastguard Worker
206*d83cc019SAndroid Build Coastguard Worker printf("\tLegacy monitor detect: %s\n",
207*d83cc019SAndroid Build Coastguard Worker YESNO(features->legacy_monitor_detect));
208*d83cc019SAndroid Build Coastguard Worker
209*d83cc019SAndroid Build Coastguard Worker printf("\tIntegrated CRT: %s\n", YESNO(features->int_crt_support));
210*d83cc019SAndroid Build Coastguard Worker printf("\tIntegrated TV: %s\n", YESNO(features->int_tv_support));
211*d83cc019SAndroid Build Coastguard Worker printf("\tIntegrated EFP: %s\n", YESNO(features->int_efp_support));
212*d83cc019SAndroid Build Coastguard Worker printf("\tDP SSC enable: %s\n", YESNO(features->dp_ssc_enable));
213*d83cc019SAndroid Build Coastguard Worker if (features->dp_ssc_enable) {
214*d83cc019SAndroid Build Coastguard Worker if (IS_VALLEYVIEW(context->devid) || IS_CHERRYVIEW(context->devid) ||
215*d83cc019SAndroid Build Coastguard Worker IS_BROXTON(context->devid))
216*d83cc019SAndroid Build Coastguard Worker printf("\tSSC frequency: 100 MHz\n");
217*d83cc019SAndroid Build Coastguard Worker else if (HAS_PCH_SPLIT(context->devid))
218*d83cc019SAndroid Build Coastguard Worker printf("\tSSC frequency: %s\n", features->dp_ssc_freq ?
219*d83cc019SAndroid Build Coastguard Worker "100 MHz" : "120 MHz");
220*d83cc019SAndroid Build Coastguard Worker else
221*d83cc019SAndroid Build Coastguard Worker printf("\tSSC frequency: %s\n", features->dp_ssc_freq ?
222*d83cc019SAndroid Build Coastguard Worker "100 MHz" : "96 MHz");
223*d83cc019SAndroid Build Coastguard Worker }
224*d83cc019SAndroid Build Coastguard Worker printf("\tDP SSC dongle supported: %s\n", YESNO(features->dp_ssc_dongle_supported));
225*d83cc019SAndroid Build Coastguard Worker }
226*d83cc019SAndroid Build Coastguard Worker
dump_backlight_info(struct context * context,const struct bdb_block * block)227*d83cc019SAndroid Build Coastguard Worker static void dump_backlight_info(struct context *context,
228*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
229*d83cc019SAndroid Build Coastguard Worker {
230*d83cc019SAndroid Build Coastguard Worker const struct bdb_lfp_backlight_data *backlight = block->data;
231*d83cc019SAndroid Build Coastguard Worker const struct lfp_backlight_data_entry *blc;
232*d83cc019SAndroid Build Coastguard Worker
233*d83cc019SAndroid Build Coastguard Worker if (sizeof(*blc) != backlight->entry_size) {
234*d83cc019SAndroid Build Coastguard Worker printf("\tBacklight struct sizes don't match (expected %zu, got %u), skipping\n",
235*d83cc019SAndroid Build Coastguard Worker sizeof(*blc), backlight->entry_size);
236*d83cc019SAndroid Build Coastguard Worker return;
237*d83cc019SAndroid Build Coastguard Worker }
238*d83cc019SAndroid Build Coastguard Worker
239*d83cc019SAndroid Build Coastguard Worker blc = &backlight->data[context->panel_type];
240*d83cc019SAndroid Build Coastguard Worker
241*d83cc019SAndroid Build Coastguard Worker printf("\tInverter type: %d\n", blc->type);
242*d83cc019SAndroid Build Coastguard Worker printf("\t polarity: %d\n", blc->active_low_pwm);
243*d83cc019SAndroid Build Coastguard Worker printf("\t PWM freq: %d\n", blc->pwm_freq_hz);
244*d83cc019SAndroid Build Coastguard Worker printf("\tMinimum brightness: %d\n", blc->min_brightness);
245*d83cc019SAndroid Build Coastguard Worker }
246*d83cc019SAndroid Build Coastguard Worker
247*d83cc019SAndroid Build Coastguard Worker static const struct {
248*d83cc019SAndroid Build Coastguard Worker unsigned short type;
249*d83cc019SAndroid Build Coastguard Worker const char *name;
250*d83cc019SAndroid Build Coastguard Worker } child_device_types[] = {
251*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_NONE, "none" },
252*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_CRT, "CRT" },
253*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_TV, "TV" },
254*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_EFP, "EFP" },
255*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_LFP, "LFP" },
256*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_CRT_DPMS, "CRT" },
257*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_CRT_DPMS_HOTPLUG, "CRT" },
258*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_TV_COMPOSITE, "TV composite" },
259*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_TV_MACROVISION, "TV" },
260*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_TV_RF_COMPOSITE, "TV" },
261*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_TV_SVIDEO_COMPOSITE, "TV S-Video" },
262*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_TV_SCART, "TV SCART" },
263*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_TV_CODEC_HOTPLUG_PWR, "TV" },
264*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_EFP_HOTPLUG_PWR, "EFP" },
265*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_EFP_DVI_HOTPLUG_PWR, "DVI" },
266*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_EFP_DVI_I, "DVI-I" },
267*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_EFP_DVI_D_DUAL, "DL-DVI-D" },
268*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_EFP_DVI_D_HDCP, "DVI-D" },
269*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_OPENLDI_HOTPLUG_PWR, "OpenLDI" },
270*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_OPENLDI_DUALPIX, "OpenLDI" },
271*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_LFP_PANELLINK, "PanelLink" },
272*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_LFP_CMOS_PWR, "CMOS LFP" },
273*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_LFP_LVDS_PWR, "LVDS" },
274*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_LFP_LVDS_DUAL, "LVDS" },
275*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_LFP_LVDS_DUAL_HDCP, "LVDS" },
276*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_INT_LFP, "LFP" },
277*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_INT_TV, "TV" },
278*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_DP, "DisplayPort" },
279*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_DP_DUAL_MODE, "DisplayPort/HDMI/DVI" },
280*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_DP_DVI, "DisplayPort/DVI" },
281*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_HDMI, "HDMI/DVI" },
282*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_DVI, "DVI" },
283*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_eDP, "eDP" },
284*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_MIPI, "MIPI" },
285*d83cc019SAndroid Build Coastguard Worker };
286*d83cc019SAndroid Build Coastguard Worker static const int num_child_device_types =
287*d83cc019SAndroid Build Coastguard Worker sizeof(child_device_types) / sizeof(child_device_types[0]);
288*d83cc019SAndroid Build Coastguard Worker
child_device_type(unsigned short type)289*d83cc019SAndroid Build Coastguard Worker static const char *child_device_type(unsigned short type)
290*d83cc019SAndroid Build Coastguard Worker {
291*d83cc019SAndroid Build Coastguard Worker int i;
292*d83cc019SAndroid Build Coastguard Worker
293*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < num_child_device_types; i++)
294*d83cc019SAndroid Build Coastguard Worker if (child_device_types[i].type == type)
295*d83cc019SAndroid Build Coastguard Worker return child_device_types[i].name;
296*d83cc019SAndroid Build Coastguard Worker
297*d83cc019SAndroid Build Coastguard Worker return "unknown";
298*d83cc019SAndroid Build Coastguard Worker }
299*d83cc019SAndroid Build Coastguard Worker
300*d83cc019SAndroid Build Coastguard Worker static const struct {
301*d83cc019SAndroid Build Coastguard Worker unsigned short mask;
302*d83cc019SAndroid Build Coastguard Worker const char *name;
303*d83cc019SAndroid Build Coastguard Worker } child_device_type_bits[] = {
304*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_CLASS_EXTENSION, "Class extension" },
305*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_POWER_MANAGEMENT, "Power management" },
306*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_HOTPLUG_SIGNALING, "Hotplug signaling" },
307*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_INTERNAL_CONNECTOR, "Internal connector" },
308*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_NOT_HDMI_OUTPUT, "HDMI output" }, /* decoded as inverse */
309*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_MIPI_OUTPUT, "MIPI output" },
310*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_COMPOSITE_OUTPUT, "Composite output" },
311*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_DUAL_CHANNEL, "Dual channel" },
312*d83cc019SAndroid Build Coastguard Worker { 1 << 7, "Content protection" },
313*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_HIGH_SPEED_LINK, "High speed link" },
314*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_LVDS_SIGNALING, "LVDS signaling" },
315*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_TMDS_DVI_SIGNALING, "TMDS/DVI signaling" },
316*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_VIDEO_SIGNALING, "Video signaling" },
317*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_DISPLAYPORT_OUTPUT, "DisplayPort output" },
318*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_DIGITAL_OUTPUT, "Digital output" },
319*d83cc019SAndroid Build Coastguard Worker { DEVICE_TYPE_ANALOG_OUTPUT, "Analog output" },
320*d83cc019SAndroid Build Coastguard Worker };
321*d83cc019SAndroid Build Coastguard Worker
dump_child_device_type_bits(uint16_t type)322*d83cc019SAndroid Build Coastguard Worker static void dump_child_device_type_bits(uint16_t type)
323*d83cc019SAndroid Build Coastguard Worker {
324*d83cc019SAndroid Build Coastguard Worker int i;
325*d83cc019SAndroid Build Coastguard Worker
326*d83cc019SAndroid Build Coastguard Worker type ^= DEVICE_TYPE_NOT_HDMI_OUTPUT;
327*d83cc019SAndroid Build Coastguard Worker
328*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(child_device_type_bits); i++) {
329*d83cc019SAndroid Build Coastguard Worker if (child_device_type_bits[i].mask & type)
330*d83cc019SAndroid Build Coastguard Worker printf("\t\t\t%s\n", child_device_type_bits[i].name);
331*d83cc019SAndroid Build Coastguard Worker }
332*d83cc019SAndroid Build Coastguard Worker }
333*d83cc019SAndroid Build Coastguard Worker
334*d83cc019SAndroid Build Coastguard Worker static const struct {
335*d83cc019SAndroid Build Coastguard Worker unsigned char handle;
336*d83cc019SAndroid Build Coastguard Worker const char *name;
337*d83cc019SAndroid Build Coastguard Worker } child_device_handles[] = {
338*d83cc019SAndroid Build Coastguard Worker { DEVICE_HANDLE_CRT, "CRT" },
339*d83cc019SAndroid Build Coastguard Worker { DEVICE_HANDLE_EFP1, "EFP 1 (HDMI/DVI/DP)" },
340*d83cc019SAndroid Build Coastguard Worker { DEVICE_HANDLE_EFP2, "EFP 2 (HDMI/DVI/DP)" },
341*d83cc019SAndroid Build Coastguard Worker { DEVICE_HANDLE_EFP3, "EFP 3 (HDMI/DVI/DP)" },
342*d83cc019SAndroid Build Coastguard Worker { DEVICE_HANDLE_EFP4, "EFP 4 (HDMI/DVI/DP)" },
343*d83cc019SAndroid Build Coastguard Worker { DEVICE_HANDLE_LPF1, "LFP 1 (eDP)" },
344*d83cc019SAndroid Build Coastguard Worker { DEVICE_HANDLE_LFP2, "LFP 2 (eDP)" },
345*d83cc019SAndroid Build Coastguard Worker };
346*d83cc019SAndroid Build Coastguard Worker static const int num_child_device_handles =
347*d83cc019SAndroid Build Coastguard Worker sizeof(child_device_handles) / sizeof(child_device_handles[0]);
348*d83cc019SAndroid Build Coastguard Worker
child_device_handle(unsigned char handle)349*d83cc019SAndroid Build Coastguard Worker static const char *child_device_handle(unsigned char handle)
350*d83cc019SAndroid Build Coastguard Worker {
351*d83cc019SAndroid Build Coastguard Worker int i;
352*d83cc019SAndroid Build Coastguard Worker
353*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < num_child_device_handles; i++)
354*d83cc019SAndroid Build Coastguard Worker if (child_device_handles[i].handle == handle)
355*d83cc019SAndroid Build Coastguard Worker return child_device_handles[i].name;
356*d83cc019SAndroid Build Coastguard Worker
357*d83cc019SAndroid Build Coastguard Worker return "unknown";
358*d83cc019SAndroid Build Coastguard Worker }
359*d83cc019SAndroid Build Coastguard Worker
360*d83cc019SAndroid Build Coastguard Worker static const char *dvo_port_names[] = {
361*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_HDMIA] = "HDMI-A",
362*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_HDMIB] = "HDMI-B",
363*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_HDMIC] = "HDMI-C",
364*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_HDMID] = "HDMI-D",
365*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_LVDS] = "LVDS",
366*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_TV] = "TV",
367*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_CRT] = "CRT",
368*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_DPB] = "DP-B",
369*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_DPC] = "DP-C",
370*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_DPD] = "DP-D",
371*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_DPA] = "DP-A",
372*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_DPE] = "DP-E",
373*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_HDMIE] = "HDMI-E",
374*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_MIPIA] = "MIPI-A",
375*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_MIPIB] = "MIPI-B",
376*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_MIPIC] = "MIPI-C",
377*d83cc019SAndroid Build Coastguard Worker [DVO_PORT_MIPID] = "MIPI-D",
378*d83cc019SAndroid Build Coastguard Worker };
379*d83cc019SAndroid Build Coastguard Worker
dvo_port(uint8_t type)380*d83cc019SAndroid Build Coastguard Worker static const char *dvo_port(uint8_t type)
381*d83cc019SAndroid Build Coastguard Worker {
382*d83cc019SAndroid Build Coastguard Worker if (type < ARRAY_SIZE(dvo_port_names) && dvo_port_names[type])
383*d83cc019SAndroid Build Coastguard Worker return dvo_port_names[type];
384*d83cc019SAndroid Build Coastguard Worker else
385*d83cc019SAndroid Build Coastguard Worker return "unknown";
386*d83cc019SAndroid Build Coastguard Worker }
387*d83cc019SAndroid Build Coastguard Worker
mipi_bridge_type(uint8_t type)388*d83cc019SAndroid Build Coastguard Worker static const char *mipi_bridge_type(uint8_t type)
389*d83cc019SAndroid Build Coastguard Worker {
390*d83cc019SAndroid Build Coastguard Worker switch (type) {
391*d83cc019SAndroid Build Coastguard Worker case 1:
392*d83cc019SAndroid Build Coastguard Worker return "ASUS";
393*d83cc019SAndroid Build Coastguard Worker case 2:
394*d83cc019SAndroid Build Coastguard Worker return "Toshiba";
395*d83cc019SAndroid Build Coastguard Worker case 3:
396*d83cc019SAndroid Build Coastguard Worker return "Renesas";
397*d83cc019SAndroid Build Coastguard Worker default:
398*d83cc019SAndroid Build Coastguard Worker return "unknown";
399*d83cc019SAndroid Build Coastguard Worker }
400*d83cc019SAndroid Build Coastguard Worker }
401*d83cc019SAndroid Build Coastguard Worker
dump_hmdi_max_data_rate(uint8_t hdmi_max_data_rate)402*d83cc019SAndroid Build Coastguard Worker static void dump_hmdi_max_data_rate(uint8_t hdmi_max_data_rate)
403*d83cc019SAndroid Build Coastguard Worker {
404*d83cc019SAndroid Build Coastguard Worker static const uint16_t max_data_rate[] = {
405*d83cc019SAndroid Build Coastguard Worker [HDMI_MAX_DATA_RATE_PLATFORM] = 0,
406*d83cc019SAndroid Build Coastguard Worker [HDMI_MAX_DATA_RATE_297] = 297,
407*d83cc019SAndroid Build Coastguard Worker [HDMI_MAX_DATA_RATE_165] = 165,
408*d83cc019SAndroid Build Coastguard Worker };
409*d83cc019SAndroid Build Coastguard Worker
410*d83cc019SAndroid Build Coastguard Worker if (hdmi_max_data_rate >= ARRAY_SIZE(max_data_rate))
411*d83cc019SAndroid Build Coastguard Worker printf("\t\tHDMI max data rate: <unknown> (0x%02x)\n",
412*d83cc019SAndroid Build Coastguard Worker hdmi_max_data_rate);
413*d83cc019SAndroid Build Coastguard Worker else if (hdmi_max_data_rate == HDMI_MAX_DATA_RATE_PLATFORM)
414*d83cc019SAndroid Build Coastguard Worker printf("\t\tHDMI max data rate: <platform max> (0x%02x)\n",
415*d83cc019SAndroid Build Coastguard Worker hdmi_max_data_rate);
416*d83cc019SAndroid Build Coastguard Worker else
417*d83cc019SAndroid Build Coastguard Worker printf("\t\tHDMI max data rate: %d MHz (0x%02x)\n",
418*d83cc019SAndroid Build Coastguard Worker max_data_rate[hdmi_max_data_rate],
419*d83cc019SAndroid Build Coastguard Worker hdmi_max_data_rate);
420*d83cc019SAndroid Build Coastguard Worker }
421*d83cc019SAndroid Build Coastguard Worker
dump_child_device(struct context * context,const struct child_device_config * child)422*d83cc019SAndroid Build Coastguard Worker static void dump_child_device(struct context *context,
423*d83cc019SAndroid Build Coastguard Worker const struct child_device_config *child)
424*d83cc019SAndroid Build Coastguard Worker {
425*d83cc019SAndroid Build Coastguard Worker if (!child->device_type)
426*d83cc019SAndroid Build Coastguard Worker return;
427*d83cc019SAndroid Build Coastguard Worker
428*d83cc019SAndroid Build Coastguard Worker printf("\tChild device info:\n");
429*d83cc019SAndroid Build Coastguard Worker printf("\t\tDevice handle: 0x%04x (%s)\n", child->handle,
430*d83cc019SAndroid Build Coastguard Worker child_device_handle(child->handle));
431*d83cc019SAndroid Build Coastguard Worker printf("\t\tDevice type: 0x%04x (%s)\n", child->device_type,
432*d83cc019SAndroid Build Coastguard Worker child_device_type(child->device_type));
433*d83cc019SAndroid Build Coastguard Worker dump_child_device_type_bits(child->device_type);
434*d83cc019SAndroid Build Coastguard Worker
435*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version < 152) {
436*d83cc019SAndroid Build Coastguard Worker printf("\t\tSignature: %.*s\n", (int)sizeof(child->device_id), child->device_id);
437*d83cc019SAndroid Build Coastguard Worker } else {
438*d83cc019SAndroid Build Coastguard Worker printf("\t\tI2C speed: 0x%02x\n", child->i2c_speed);
439*d83cc019SAndroid Build Coastguard Worker printf("\t\tDP onboard redriver: 0x%02x\n", child->dp_onboard_redriver);
440*d83cc019SAndroid Build Coastguard Worker printf("\t\tDP ondock redriver: 0x%02x\n", child->dp_ondock_redriver);
441*d83cc019SAndroid Build Coastguard Worker printf("\t\tHDMI level shifter value: 0x%02x\n", child->hdmi_level_shifter_value);
442*d83cc019SAndroid Build Coastguard Worker dump_hmdi_max_data_rate(child->hdmi_max_data_rate);
443*d83cc019SAndroid Build Coastguard Worker printf("\t\tOffset to DTD buffer for edidless CHILD: 0x%02x\n", child->dtd_buf_ptr);
444*d83cc019SAndroid Build Coastguard Worker printf("\t\tEdidless EFP: %s\n", YESNO(child->edidless_efp));
445*d83cc019SAndroid Build Coastguard Worker printf("\t\tCompression enable: %s\n", YESNO(child->compression_enable));
446*d83cc019SAndroid Build Coastguard Worker printf("\t\tCompression method CPS: %s\n", YESNO(child->compression_method));
447*d83cc019SAndroid Build Coastguard Worker printf("\t\tDual pipe ganged eDP: %s\n", YESNO(child->ganged_edp));
448*d83cc019SAndroid Build Coastguard Worker printf("\t\tCompression structure index: 0x%02x)\n", child->compression_structure_index);
449*d83cc019SAndroid Build Coastguard Worker printf("\t\tSlave DDI port: 0x%02x (%s)\n", child->slave_port, dvo_port(child->slave_port));
450*d83cc019SAndroid Build Coastguard Worker }
451*d83cc019SAndroid Build Coastguard Worker
452*d83cc019SAndroid Build Coastguard Worker printf("\t\tAIM offset: %d\n", child->addin_offset);
453*d83cc019SAndroid Build Coastguard Worker printf("\t\tDVO Port: 0x%02x (%s)\n", child->dvo_port, dvo_port(child->dvo_port));
454*d83cc019SAndroid Build Coastguard Worker
455*d83cc019SAndroid Build Coastguard Worker printf("\t\tAIM I2C pin: 0x%02x\n", child->i2c_pin);
456*d83cc019SAndroid Build Coastguard Worker printf("\t\tAIM Slave address: 0x%02x\n", child->slave_addr);
457*d83cc019SAndroid Build Coastguard Worker printf("\t\tDDC pin: 0x%02x\n", child->ddc_pin);
458*d83cc019SAndroid Build Coastguard Worker printf("\t\tEDID buffer ptr: 0x%02x\n", child->edid_ptr);
459*d83cc019SAndroid Build Coastguard Worker printf("\t\tDVO config: 0x%02x\n", child->dvo_cfg);
460*d83cc019SAndroid Build Coastguard Worker
461*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version < 155) {
462*d83cc019SAndroid Build Coastguard Worker printf("\t\tDVO2 Port: 0x%02x (%s)\n", child->dvo2_port, dvo_port(child->dvo2_port));
463*d83cc019SAndroid Build Coastguard Worker printf("\t\tI2C2 pin: 0x%02x\n", child->i2c2_pin);
464*d83cc019SAndroid Build Coastguard Worker printf("\t\tSlave2 address: 0x%02x\n", child->slave2_addr);
465*d83cc019SAndroid Build Coastguard Worker printf("\t\tDDC2 pin: 0x%02x\n", child->ddc2_pin);
466*d83cc019SAndroid Build Coastguard Worker } else {
467*d83cc019SAndroid Build Coastguard Worker printf("\t\tEFP routed through dock: %s\n", YESNO(child->efp_routed));
468*d83cc019SAndroid Build Coastguard Worker printf("\t\tLane reversal: %s\n", YESNO(child->lane_reversal));
469*d83cc019SAndroid Build Coastguard Worker printf("\t\tOnboard LSPCON: %s\n", YESNO(child->lspcon));
470*d83cc019SAndroid Build Coastguard Worker printf("\t\tIboost enable: %s\n", YESNO(child->iboost));
471*d83cc019SAndroid Build Coastguard Worker printf("\t\tHPD sense invert: %s\n", YESNO(child->hpd_invert));
472*d83cc019SAndroid Build Coastguard Worker printf("\t\tHDMI compatible? %s\n", YESNO(child->hdmi_support));
473*d83cc019SAndroid Build Coastguard Worker printf("\t\tDP compatible? %s\n", YESNO(child->dp_support));
474*d83cc019SAndroid Build Coastguard Worker printf("\t\tTMDS compatible? %s\n", YESNO(child->tmds_support));
475*d83cc019SAndroid Build Coastguard Worker printf("\t\tAux channel: 0x%02x\n", child->aux_channel);
476*d83cc019SAndroid Build Coastguard Worker printf("\t\tDongle detect: 0x%02x\n", child->dongle_detect);
477*d83cc019SAndroid Build Coastguard Worker }
478*d83cc019SAndroid Build Coastguard Worker
479*d83cc019SAndroid Build Coastguard Worker printf("\t\tPipe capabilities: 0x%02x\n", child->pipe_cap);
480*d83cc019SAndroid Build Coastguard Worker printf("\t\tSDVO stall signal available: %s\n", YESNO(child->sdvo_stall));
481*d83cc019SAndroid Build Coastguard Worker printf("\t\tHotplug connect status: 0x%02x\n", child->hpd_status);
482*d83cc019SAndroid Build Coastguard Worker printf("\t\tIntegrated encoder instead of SDVO: %s\n", YESNO(child->integrated_encoder));
483*d83cc019SAndroid Build Coastguard Worker printf("\t\tDVO wiring: 0x%02x\n", child->dvo_wiring);
484*d83cc019SAndroid Build Coastguard Worker
485*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version < 171) {
486*d83cc019SAndroid Build Coastguard Worker printf("\t\tDVO2 wiring: 0x%02x\n", child->dvo2_wiring);
487*d83cc019SAndroid Build Coastguard Worker } else {
488*d83cc019SAndroid Build Coastguard Worker printf("\t\tMIPI bridge type: %02x (%s)\n", child->mipi_bridge_type,
489*d83cc019SAndroid Build Coastguard Worker mipi_bridge_type(child->mipi_bridge_type));
490*d83cc019SAndroid Build Coastguard Worker }
491*d83cc019SAndroid Build Coastguard Worker
492*d83cc019SAndroid Build Coastguard Worker printf("\t\tDevice class extension: 0x%02x\n", child->extended_type);
493*d83cc019SAndroid Build Coastguard Worker printf("\t\tDVO function: 0x%02x\n", child->dvo_function);
494*d83cc019SAndroid Build Coastguard Worker
495*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 195) {
496*d83cc019SAndroid Build Coastguard Worker printf("\t\tDP USB type C support: %s\n", YESNO(child->dp_usb_type_c));
497*d83cc019SAndroid Build Coastguard Worker printf("\t\t2X DP GPIO index: 0x%02x\n", child->dp_gpio_index);
498*d83cc019SAndroid Build Coastguard Worker printf("\t\t2X DP GPIO pin number: 0x%02x\n", child->dp_gpio_pin_num);
499*d83cc019SAndroid Build Coastguard Worker }
500*d83cc019SAndroid Build Coastguard Worker
501*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 196) {
502*d83cc019SAndroid Build Coastguard Worker printf("\t\tIBoost level for HDMI: 0x%02x\n", child->hdmi_iboost_level);
503*d83cc019SAndroid Build Coastguard Worker printf("\t\tIBoost level for DP/eDP: 0x%02x\n", child->dp_iboost_level);
504*d83cc019SAndroid Build Coastguard Worker }
505*d83cc019SAndroid Build Coastguard Worker }
506*d83cc019SAndroid Build Coastguard Worker
507*d83cc019SAndroid Build Coastguard Worker
dump_child_devices(struct context * context,const uint8_t * devices,uint8_t child_dev_num,uint8_t child_dev_size)508*d83cc019SAndroid Build Coastguard Worker static void dump_child_devices(struct context *context, const uint8_t *devices,
509*d83cc019SAndroid Build Coastguard Worker uint8_t child_dev_num, uint8_t child_dev_size)
510*d83cc019SAndroid Build Coastguard Worker {
511*d83cc019SAndroid Build Coastguard Worker struct child_device_config *child;
512*d83cc019SAndroid Build Coastguard Worker int i;
513*d83cc019SAndroid Build Coastguard Worker
514*d83cc019SAndroid Build Coastguard Worker /*
515*d83cc019SAndroid Build Coastguard Worker * Use a temp buffer so dump_child_device() doesn't have to worry about
516*d83cc019SAndroid Build Coastguard Worker * accessing the struct beyond child_dev_size. The tail, if any, remains
517*d83cc019SAndroid Build Coastguard Worker * initialized to zero.
518*d83cc019SAndroid Build Coastguard Worker */
519*d83cc019SAndroid Build Coastguard Worker child = calloc(1, sizeof(*child));
520*d83cc019SAndroid Build Coastguard Worker
521*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < child_dev_num; i++) {
522*d83cc019SAndroid Build Coastguard Worker memcpy(child, devices + i * child_dev_size,
523*d83cc019SAndroid Build Coastguard Worker min(sizeof(*child), child_dev_size));
524*d83cc019SAndroid Build Coastguard Worker
525*d83cc019SAndroid Build Coastguard Worker dump_child_device(context, child);
526*d83cc019SAndroid Build Coastguard Worker }
527*d83cc019SAndroid Build Coastguard Worker
528*d83cc019SAndroid Build Coastguard Worker free(child);
529*d83cc019SAndroid Build Coastguard Worker }
530*d83cc019SAndroid Build Coastguard Worker
dump_general_definitions(struct context * context,const struct bdb_block * block)531*d83cc019SAndroid Build Coastguard Worker static void dump_general_definitions(struct context *context,
532*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
533*d83cc019SAndroid Build Coastguard Worker {
534*d83cc019SAndroid Build Coastguard Worker const struct bdb_general_definitions *defs = block->data;
535*d83cc019SAndroid Build Coastguard Worker int child_dev_num;
536*d83cc019SAndroid Build Coastguard Worker
537*d83cc019SAndroid Build Coastguard Worker child_dev_num = (block->size - sizeof(*defs)) / defs->child_dev_size;
538*d83cc019SAndroid Build Coastguard Worker
539*d83cc019SAndroid Build Coastguard Worker printf("\tCRT DDC GMBUS addr: 0x%02x\n", defs->crt_ddc_gmbus_pin);
540*d83cc019SAndroid Build Coastguard Worker printf("\tUse ACPI DPMS CRT power states: %s\n",
541*d83cc019SAndroid Build Coastguard Worker YESNO(defs->dpms_acpi));
542*d83cc019SAndroid Build Coastguard Worker printf("\tSkip CRT detect at boot: %s\n",
543*d83cc019SAndroid Build Coastguard Worker YESNO(defs->skip_boot_crt_detect));
544*d83cc019SAndroid Build Coastguard Worker printf("\tUse DPMS on AIM devices: %s\n", YESNO(defs->dpms_aim));
545*d83cc019SAndroid Build Coastguard Worker printf("\tBoot display type: 0x%02x%02x\n", defs->boot_display[1],
546*d83cc019SAndroid Build Coastguard Worker defs->boot_display[0]);
547*d83cc019SAndroid Build Coastguard Worker printf("\tChild device size: %d\n", defs->child_dev_size);
548*d83cc019SAndroid Build Coastguard Worker printf("\tChild device count: %d\n", child_dev_num);
549*d83cc019SAndroid Build Coastguard Worker
550*d83cc019SAndroid Build Coastguard Worker dump_child_devices(context, defs->devices,
551*d83cc019SAndroid Build Coastguard Worker child_dev_num, defs->child_dev_size);
552*d83cc019SAndroid Build Coastguard Worker }
553*d83cc019SAndroid Build Coastguard Worker
dump_legacy_child_devices(struct context * context,const struct bdb_block * block)554*d83cc019SAndroid Build Coastguard Worker static void dump_legacy_child_devices(struct context *context,
555*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
556*d83cc019SAndroid Build Coastguard Worker {
557*d83cc019SAndroid Build Coastguard Worker const struct bdb_legacy_child_devices *defs = block->data;
558*d83cc019SAndroid Build Coastguard Worker int child_dev_num;
559*d83cc019SAndroid Build Coastguard Worker
560*d83cc019SAndroid Build Coastguard Worker child_dev_num = (block->size - sizeof(*defs)) / defs->child_dev_size;
561*d83cc019SAndroid Build Coastguard Worker
562*d83cc019SAndroid Build Coastguard Worker printf("\tChild device size: %d\n", defs->child_dev_size);
563*d83cc019SAndroid Build Coastguard Worker printf("\tChild device count: %d\n", child_dev_num);
564*d83cc019SAndroid Build Coastguard Worker
565*d83cc019SAndroid Build Coastguard Worker dump_child_devices(context, defs->devices,
566*d83cc019SAndroid Build Coastguard Worker child_dev_num, defs->child_dev_size);
567*d83cc019SAndroid Build Coastguard Worker }
568*d83cc019SAndroid Build Coastguard Worker
dump_lvds_options(struct context * context,const struct bdb_block * block)569*d83cc019SAndroid Build Coastguard Worker static void dump_lvds_options(struct context *context,
570*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
571*d83cc019SAndroid Build Coastguard Worker {
572*d83cc019SAndroid Build Coastguard Worker const struct bdb_lvds_options *options = block->data;
573*d83cc019SAndroid Build Coastguard Worker
574*d83cc019SAndroid Build Coastguard Worker if (context->panel_type == options->panel_type)
575*d83cc019SAndroid Build Coastguard Worker printf("\tPanel type: %d\n", options->panel_type);
576*d83cc019SAndroid Build Coastguard Worker else
577*d83cc019SAndroid Build Coastguard Worker printf("\tPanel type: %d (override %d)\n",
578*d83cc019SAndroid Build Coastguard Worker options->panel_type, context->panel_type);
579*d83cc019SAndroid Build Coastguard Worker printf("\tLVDS EDID available: %s\n", YESNO(options->lvds_edid));
580*d83cc019SAndroid Build Coastguard Worker printf("\tPixel dither: %s\n", YESNO(options->pixel_dither));
581*d83cc019SAndroid Build Coastguard Worker printf("\tPFIT auto ratio: %s\n", YESNO(options->pfit_ratio_auto));
582*d83cc019SAndroid Build Coastguard Worker printf("\tPFIT enhanced graphics mode: %s\n",
583*d83cc019SAndroid Build Coastguard Worker YESNO(options->pfit_gfx_mode_enhanced));
584*d83cc019SAndroid Build Coastguard Worker printf("\tPFIT enhanced text mode: %s\n",
585*d83cc019SAndroid Build Coastguard Worker YESNO(options->pfit_text_mode_enhanced));
586*d83cc019SAndroid Build Coastguard Worker printf("\tPFIT mode: %d\n", options->pfit_mode);
587*d83cc019SAndroid Build Coastguard Worker }
588*d83cc019SAndroid Build Coastguard Worker
dump_lvds_ptr_data(struct context * context,const struct bdb_block * block)589*d83cc019SAndroid Build Coastguard Worker static void dump_lvds_ptr_data(struct context *context,
590*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
591*d83cc019SAndroid Build Coastguard Worker {
592*d83cc019SAndroid Build Coastguard Worker const struct bdb_lvds_lfp_data_ptrs *ptrs = block->data;
593*d83cc019SAndroid Build Coastguard Worker
594*d83cc019SAndroid Build Coastguard Worker printf("\tNumber of entries: %d\n", ptrs->lvds_entries);
595*d83cc019SAndroid Build Coastguard Worker }
596*d83cc019SAndroid Build Coastguard Worker
dump_lvds_data(struct context * context,const struct bdb_block * block)597*d83cc019SAndroid Build Coastguard Worker static void dump_lvds_data(struct context *context,
598*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
599*d83cc019SAndroid Build Coastguard Worker {
600*d83cc019SAndroid Build Coastguard Worker const struct bdb_lvds_lfp_data *lvds_data = block->data;
601*d83cc019SAndroid Build Coastguard Worker struct bdb_block *ptrs_block;
602*d83cc019SAndroid Build Coastguard Worker const struct bdb_lvds_lfp_data_ptrs *ptrs;
603*d83cc019SAndroid Build Coastguard Worker int num_entries;
604*d83cc019SAndroid Build Coastguard Worker int i;
605*d83cc019SAndroid Build Coastguard Worker int hdisplay, hsyncstart, hsyncend, htotal;
606*d83cc019SAndroid Build Coastguard Worker int vdisplay, vsyncstart, vsyncend, vtotal;
607*d83cc019SAndroid Build Coastguard Worker float clock;
608*d83cc019SAndroid Build Coastguard Worker int lfp_data_size, dvo_offset;
609*d83cc019SAndroid Build Coastguard Worker
610*d83cc019SAndroid Build Coastguard Worker ptrs_block = find_section(context, BDB_LVDS_LFP_DATA_PTRS);
611*d83cc019SAndroid Build Coastguard Worker if (!ptrs_block) {
612*d83cc019SAndroid Build Coastguard Worker printf("No LVDS ptr block\n");
613*d83cc019SAndroid Build Coastguard Worker return;
614*d83cc019SAndroid Build Coastguard Worker }
615*d83cc019SAndroid Build Coastguard Worker
616*d83cc019SAndroid Build Coastguard Worker ptrs = ptrs_block->data;
617*d83cc019SAndroid Build Coastguard Worker
618*d83cc019SAndroid Build Coastguard Worker lfp_data_size =
619*d83cc019SAndroid Build Coastguard Worker ptrs->ptr[1].fp_timing_offset - ptrs->ptr[0].fp_timing_offset;
620*d83cc019SAndroid Build Coastguard Worker dvo_offset =
621*d83cc019SAndroid Build Coastguard Worker ptrs->ptr[0].dvo_timing_offset - ptrs->ptr[0].fp_timing_offset;
622*d83cc019SAndroid Build Coastguard Worker
623*d83cc019SAndroid Build Coastguard Worker num_entries = block->size / lfp_data_size;
624*d83cc019SAndroid Build Coastguard Worker
625*d83cc019SAndroid Build Coastguard Worker printf(" Number of entries: %d (preferred block marked with '*')\n",
626*d83cc019SAndroid Build Coastguard Worker num_entries);
627*d83cc019SAndroid Build Coastguard Worker
628*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < num_entries; i++) {
629*d83cc019SAndroid Build Coastguard Worker const uint8_t *lfp_data_ptr =
630*d83cc019SAndroid Build Coastguard Worker (const uint8_t *) lvds_data->data + lfp_data_size * i;
631*d83cc019SAndroid Build Coastguard Worker const uint8_t *timing_data = lfp_data_ptr + dvo_offset;
632*d83cc019SAndroid Build Coastguard Worker const struct lvds_lfp_data_entry *lfp_data =
633*d83cc019SAndroid Build Coastguard Worker (const struct lvds_lfp_data_entry *)lfp_data_ptr;
634*d83cc019SAndroid Build Coastguard Worker char marker;
635*d83cc019SAndroid Build Coastguard Worker
636*d83cc019SAndroid Build Coastguard Worker if (i != context->panel_type && !context->dump_all_panel_types)
637*d83cc019SAndroid Build Coastguard Worker continue;
638*d83cc019SAndroid Build Coastguard Worker
639*d83cc019SAndroid Build Coastguard Worker if (i == context->panel_type)
640*d83cc019SAndroid Build Coastguard Worker marker = '*';
641*d83cc019SAndroid Build Coastguard Worker else
642*d83cc019SAndroid Build Coastguard Worker marker = ' ';
643*d83cc019SAndroid Build Coastguard Worker
644*d83cc019SAndroid Build Coastguard Worker hdisplay = _H_ACTIVE(timing_data);
645*d83cc019SAndroid Build Coastguard Worker hsyncstart = hdisplay + _H_SYNC_OFF(timing_data);
646*d83cc019SAndroid Build Coastguard Worker hsyncend = hsyncstart + _H_SYNC_WIDTH(timing_data);
647*d83cc019SAndroid Build Coastguard Worker htotal = hdisplay + _H_BLANK(timing_data);
648*d83cc019SAndroid Build Coastguard Worker
649*d83cc019SAndroid Build Coastguard Worker vdisplay = _V_ACTIVE(timing_data);
650*d83cc019SAndroid Build Coastguard Worker vsyncstart = vdisplay + _V_SYNC_OFF(timing_data);
651*d83cc019SAndroid Build Coastguard Worker vsyncend = vsyncstart + _V_SYNC_WIDTH(timing_data);
652*d83cc019SAndroid Build Coastguard Worker vtotal = vdisplay + _V_BLANK(timing_data);
653*d83cc019SAndroid Build Coastguard Worker clock = _PIXEL_CLOCK(timing_data) / 1000;
654*d83cc019SAndroid Build Coastguard Worker
655*d83cc019SAndroid Build Coastguard Worker printf("%c\tpanel type %02i: %dx%d clock %d\n", marker,
656*d83cc019SAndroid Build Coastguard Worker i, lfp_data->fp_timing.x_res, lfp_data->fp_timing.y_res,
657*d83cc019SAndroid Build Coastguard Worker _PIXEL_CLOCK(timing_data));
658*d83cc019SAndroid Build Coastguard Worker printf("\t\tinfo:\n");
659*d83cc019SAndroid Build Coastguard Worker printf("\t\t LVDS: 0x%08lx\n",
660*d83cc019SAndroid Build Coastguard Worker (unsigned long)lfp_data->fp_timing.lvds_reg_val);
661*d83cc019SAndroid Build Coastguard Worker printf("\t\t PP_ON_DELAYS: 0x%08lx\n",
662*d83cc019SAndroid Build Coastguard Worker (unsigned long)lfp_data->fp_timing.pp_on_reg_val);
663*d83cc019SAndroid Build Coastguard Worker printf("\t\t PP_OFF_DELAYS: 0x%08lx\n",
664*d83cc019SAndroid Build Coastguard Worker (unsigned long)lfp_data->fp_timing.pp_off_reg_val);
665*d83cc019SAndroid Build Coastguard Worker printf("\t\t PP_DIVISOR: 0x%08lx\n",
666*d83cc019SAndroid Build Coastguard Worker (unsigned long)lfp_data->fp_timing.pp_cycle_reg_val);
667*d83cc019SAndroid Build Coastguard Worker printf("\t\t PFIT: 0x%08lx\n",
668*d83cc019SAndroid Build Coastguard Worker (unsigned long)lfp_data->fp_timing.pfit_reg_val);
669*d83cc019SAndroid Build Coastguard Worker printf("\t\ttimings: %d %d %d %d %d %d %d %d %.2f (%s)\n",
670*d83cc019SAndroid Build Coastguard Worker hdisplay, hsyncstart, hsyncend, htotal,
671*d83cc019SAndroid Build Coastguard Worker vdisplay, vsyncstart, vsyncend, vtotal, clock,
672*d83cc019SAndroid Build Coastguard Worker (hsyncend > htotal || vsyncend > vtotal) ?
673*d83cc019SAndroid Build Coastguard Worker "BAD!" : "good");
674*d83cc019SAndroid Build Coastguard Worker }
675*d83cc019SAndroid Build Coastguard Worker
676*d83cc019SAndroid Build Coastguard Worker free(ptrs_block);
677*d83cc019SAndroid Build Coastguard Worker }
678*d83cc019SAndroid Build Coastguard Worker
dump_driver_feature(struct context * context,const struct bdb_block * block)679*d83cc019SAndroid Build Coastguard Worker static void dump_driver_feature(struct context *context,
680*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
681*d83cc019SAndroid Build Coastguard Worker {
682*d83cc019SAndroid Build Coastguard Worker const struct bdb_driver_features *feature = block->data;
683*d83cc019SAndroid Build Coastguard Worker
684*d83cc019SAndroid Build Coastguard Worker printf("\tBoot Device Algorithm: %s\n", feature->boot_dev_algorithm ?
685*d83cc019SAndroid Build Coastguard Worker "driver default" : "os default");
686*d83cc019SAndroid Build Coastguard Worker printf("\tBlock display switching when DVD active: %s\n",
687*d83cc019SAndroid Build Coastguard Worker YESNO(feature->block_display_switch));
688*d83cc019SAndroid Build Coastguard Worker printf("\tAllow display switching when in Full Screen DOS: %s\n",
689*d83cc019SAndroid Build Coastguard Worker YESNO(feature->allow_display_switch));
690*d83cc019SAndroid Build Coastguard Worker printf("\tHot Plug DVO: %s\n", YESNO(feature->hotplug_dvo));
691*d83cc019SAndroid Build Coastguard Worker printf("\tDual View Zoom: %s\n", YESNO(feature->dual_view_zoom));
692*d83cc019SAndroid Build Coastguard Worker printf("\tDriver INT 15h hook: %s\n", YESNO(feature->int15h_hook));
693*d83cc019SAndroid Build Coastguard Worker printf("\tEnable Sprite in Clone Mode: %s\n",
694*d83cc019SAndroid Build Coastguard Worker YESNO(feature->sprite_in_clone));
695*d83cc019SAndroid Build Coastguard Worker printf("\tUse 00000110h ID for Primary LFP: %s\n",
696*d83cc019SAndroid Build Coastguard Worker YESNO(feature->primary_lfp_id));
697*d83cc019SAndroid Build Coastguard Worker printf("\tBoot Mode X: %u\n", feature->boot_mode_x);
698*d83cc019SAndroid Build Coastguard Worker printf("\tBoot Mode Y: %u\n", feature->boot_mode_y);
699*d83cc019SAndroid Build Coastguard Worker printf("\tBoot Mode Bpp: %u\n", feature->boot_mode_bpp);
700*d83cc019SAndroid Build Coastguard Worker printf("\tBoot Mode Refresh: %u\n", feature->boot_mode_refresh);
701*d83cc019SAndroid Build Coastguard Worker printf("\tEnable LFP as primary: %s\n",
702*d83cc019SAndroid Build Coastguard Worker YESNO(feature->enable_lfp_primary));
703*d83cc019SAndroid Build Coastguard Worker printf("\tSelective Mode Pruning: %s\n",
704*d83cc019SAndroid Build Coastguard Worker YESNO(feature->selective_mode_pruning));
705*d83cc019SAndroid Build Coastguard Worker printf("\tDual-Frequency Graphics Technology: %s\n",
706*d83cc019SAndroid Build Coastguard Worker YESNO(feature->dual_frequency));
707*d83cc019SAndroid Build Coastguard Worker printf("\tDefault Render Clock Frequency: %s\n",
708*d83cc019SAndroid Build Coastguard Worker feature->render_clock_freq ? "low" : "high");
709*d83cc019SAndroid Build Coastguard Worker printf("\tNT 4.0 Dual Display Clone Support: %s\n",
710*d83cc019SAndroid Build Coastguard Worker YESNO(feature->nt_clone_support));
711*d83cc019SAndroid Build Coastguard Worker printf("\tDefault Power Scheme user interface: %s\n",
712*d83cc019SAndroid Build Coastguard Worker feature->power_scheme_ui ? "3rd party" : "CUI");
713*d83cc019SAndroid Build Coastguard Worker printf
714*d83cc019SAndroid Build Coastguard Worker ("\tSprite Display Assignment when Overlay is Active in Clone Mode: %s\n",
715*d83cc019SAndroid Build Coastguard Worker feature->sprite_display_assign ? "primary" : "secondary");
716*d83cc019SAndroid Build Coastguard Worker printf("\tDisplay Maintain Aspect Scaling via CUI: %s\n",
717*d83cc019SAndroid Build Coastguard Worker YESNO(feature->cui_aspect_scaling));
718*d83cc019SAndroid Build Coastguard Worker printf("\tPreserve Aspect Ratio: %s\n",
719*d83cc019SAndroid Build Coastguard Worker YESNO(feature->preserve_aspect_ratio));
720*d83cc019SAndroid Build Coastguard Worker printf("\tEnable SDVO device power down: %s\n",
721*d83cc019SAndroid Build Coastguard Worker YESNO(feature->sdvo_device_power_down));
722*d83cc019SAndroid Build Coastguard Worker printf("\tCRT hotplug: %s\n", YESNO(feature->crt_hotplug));
723*d83cc019SAndroid Build Coastguard Worker printf("\tLVDS config: ");
724*d83cc019SAndroid Build Coastguard Worker switch (feature->lvds_config) {
725*d83cc019SAndroid Build Coastguard Worker case BDB_DRIVER_NO_LVDS:
726*d83cc019SAndroid Build Coastguard Worker printf("No LVDS\n");
727*d83cc019SAndroid Build Coastguard Worker break;
728*d83cc019SAndroid Build Coastguard Worker case BDB_DRIVER_INT_LVDS:
729*d83cc019SAndroid Build Coastguard Worker printf("Integrated LVDS\n");
730*d83cc019SAndroid Build Coastguard Worker break;
731*d83cc019SAndroid Build Coastguard Worker case BDB_DRIVER_SDVO_LVDS:
732*d83cc019SAndroid Build Coastguard Worker printf("SDVO LVDS\n");
733*d83cc019SAndroid Build Coastguard Worker break;
734*d83cc019SAndroid Build Coastguard Worker case BDB_DRIVER_EDP:
735*d83cc019SAndroid Build Coastguard Worker printf("Embedded DisplayPort\n");
736*d83cc019SAndroid Build Coastguard Worker break;
737*d83cc019SAndroid Build Coastguard Worker }
738*d83cc019SAndroid Build Coastguard Worker printf("\tDefine Display statically: %s\n",
739*d83cc019SAndroid Build Coastguard Worker YESNO(feature->static_display));
740*d83cc019SAndroid Build Coastguard Worker printf("\tLegacy CRT max X: %d\n", feature->legacy_crt_max_x);
741*d83cc019SAndroid Build Coastguard Worker printf("\tLegacy CRT max Y: %d\n", feature->legacy_crt_max_y);
742*d83cc019SAndroid Build Coastguard Worker printf("\tLegacy CRT max refresh: %d\n",
743*d83cc019SAndroid Build Coastguard Worker feature->legacy_crt_max_refresh);
744*d83cc019SAndroid Build Coastguard Worker printf("\tEnable DRRS: %s\n", YESNO(feature->drrs_enabled));
745*d83cc019SAndroid Build Coastguard Worker printf("\tEnable PSR: %s\n", YESNO(feature->psr_enabled));
746*d83cc019SAndroid Build Coastguard Worker }
747*d83cc019SAndroid Build Coastguard Worker
dump_edp(struct context * context,const struct bdb_block * block)748*d83cc019SAndroid Build Coastguard Worker static void dump_edp(struct context *context,
749*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
750*d83cc019SAndroid Build Coastguard Worker {
751*d83cc019SAndroid Build Coastguard Worker const struct bdb_edp *edp = block->data;
752*d83cc019SAndroid Build Coastguard Worker int bpp, msa;
753*d83cc019SAndroid Build Coastguard Worker int i;
754*d83cc019SAndroid Build Coastguard Worker
755*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 16; i++) {
756*d83cc019SAndroid Build Coastguard Worker if (i != context->panel_type && !context->dump_all_panel_types)
757*d83cc019SAndroid Build Coastguard Worker continue;
758*d83cc019SAndroid Build Coastguard Worker
759*d83cc019SAndroid Build Coastguard Worker printf("\tPanel %d%s\n", i, context->panel_type == i ? " *" : "");
760*d83cc019SAndroid Build Coastguard Worker
761*d83cc019SAndroid Build Coastguard Worker printf("\t\tPower Sequence: T3 %d T7 %d T9 %d T10 %d T12 %d\n",
762*d83cc019SAndroid Build Coastguard Worker edp->power_seqs[i].t3,
763*d83cc019SAndroid Build Coastguard Worker edp->power_seqs[i].t7,
764*d83cc019SAndroid Build Coastguard Worker edp->power_seqs[i].t9,
765*d83cc019SAndroid Build Coastguard Worker edp->power_seqs[i].t10,
766*d83cc019SAndroid Build Coastguard Worker edp->power_seqs[i].t12);
767*d83cc019SAndroid Build Coastguard Worker
768*d83cc019SAndroid Build Coastguard Worker bpp = (edp->color_depth >> (i * 2)) & 3;
769*d83cc019SAndroid Build Coastguard Worker
770*d83cc019SAndroid Build Coastguard Worker printf("\t\tPanel color depth: ");
771*d83cc019SAndroid Build Coastguard Worker switch (bpp) {
772*d83cc019SAndroid Build Coastguard Worker case EDP_18BPP:
773*d83cc019SAndroid Build Coastguard Worker printf("18 bpp\n");
774*d83cc019SAndroid Build Coastguard Worker break;
775*d83cc019SAndroid Build Coastguard Worker case EDP_24BPP:
776*d83cc019SAndroid Build Coastguard Worker printf("24 bpp\n");
777*d83cc019SAndroid Build Coastguard Worker break;
778*d83cc019SAndroid Build Coastguard Worker case EDP_30BPP:
779*d83cc019SAndroid Build Coastguard Worker printf("30 bpp\n");
780*d83cc019SAndroid Build Coastguard Worker break;
781*d83cc019SAndroid Build Coastguard Worker default:
782*d83cc019SAndroid Build Coastguard Worker printf("(unknown value %d)\n", bpp);
783*d83cc019SAndroid Build Coastguard Worker break;
784*d83cc019SAndroid Build Coastguard Worker }
785*d83cc019SAndroid Build Coastguard Worker
786*d83cc019SAndroid Build Coastguard Worker msa = (edp->sdrrs_msa_timing_delay >> (i * 2)) & 3;
787*d83cc019SAndroid Build Coastguard Worker printf("\t\teDP sDRRS MSA Delay: Lane %d\n", msa + 1);
788*d83cc019SAndroid Build Coastguard Worker
789*d83cc019SAndroid Build Coastguard Worker printf("\t\tFast link params:\n");
790*d83cc019SAndroid Build Coastguard Worker printf("\t\t\trate: ");
791*d83cc019SAndroid Build Coastguard Worker if (edp->fast_link_params[i].rate == EDP_RATE_1_62)
792*d83cc019SAndroid Build Coastguard Worker printf("1.62G\n");
793*d83cc019SAndroid Build Coastguard Worker else if (edp->fast_link_params[i].rate == EDP_RATE_2_7)
794*d83cc019SAndroid Build Coastguard Worker printf("2.7G\n");
795*d83cc019SAndroid Build Coastguard Worker printf("\t\t\tlanes: ");
796*d83cc019SAndroid Build Coastguard Worker switch (edp->fast_link_params[i].lanes) {
797*d83cc019SAndroid Build Coastguard Worker case EDP_LANE_1:
798*d83cc019SAndroid Build Coastguard Worker printf("x1 mode\n");
799*d83cc019SAndroid Build Coastguard Worker break;
800*d83cc019SAndroid Build Coastguard Worker case EDP_LANE_2:
801*d83cc019SAndroid Build Coastguard Worker printf("x2 mode\n");
802*d83cc019SAndroid Build Coastguard Worker break;
803*d83cc019SAndroid Build Coastguard Worker case EDP_LANE_4:
804*d83cc019SAndroid Build Coastguard Worker printf("x4 mode\n");
805*d83cc019SAndroid Build Coastguard Worker break;
806*d83cc019SAndroid Build Coastguard Worker default:
807*d83cc019SAndroid Build Coastguard Worker printf("(unknown value %d)\n",
808*d83cc019SAndroid Build Coastguard Worker edp->fast_link_params[i].lanes);
809*d83cc019SAndroid Build Coastguard Worker break;
810*d83cc019SAndroid Build Coastguard Worker }
811*d83cc019SAndroid Build Coastguard Worker printf("\t\t\tpre-emphasis: ");
812*d83cc019SAndroid Build Coastguard Worker switch (edp->fast_link_params[i].preemphasis) {
813*d83cc019SAndroid Build Coastguard Worker case EDP_PREEMPHASIS_NONE:
814*d83cc019SAndroid Build Coastguard Worker printf("none\n");
815*d83cc019SAndroid Build Coastguard Worker break;
816*d83cc019SAndroid Build Coastguard Worker case EDP_PREEMPHASIS_3_5dB:
817*d83cc019SAndroid Build Coastguard Worker printf("3.5dB\n");
818*d83cc019SAndroid Build Coastguard Worker break;
819*d83cc019SAndroid Build Coastguard Worker case EDP_PREEMPHASIS_6dB:
820*d83cc019SAndroid Build Coastguard Worker printf("6dB\n");
821*d83cc019SAndroid Build Coastguard Worker break;
822*d83cc019SAndroid Build Coastguard Worker case EDP_PREEMPHASIS_9_5dB:
823*d83cc019SAndroid Build Coastguard Worker printf("9.5dB\n");
824*d83cc019SAndroid Build Coastguard Worker break;
825*d83cc019SAndroid Build Coastguard Worker default:
826*d83cc019SAndroid Build Coastguard Worker printf("(unknown value %d)\n",
827*d83cc019SAndroid Build Coastguard Worker edp->fast_link_params[i].preemphasis);
828*d83cc019SAndroid Build Coastguard Worker break;
829*d83cc019SAndroid Build Coastguard Worker }
830*d83cc019SAndroid Build Coastguard Worker printf("\t\t\tvswing: ");
831*d83cc019SAndroid Build Coastguard Worker switch (edp->fast_link_params[i].vswing) {
832*d83cc019SAndroid Build Coastguard Worker case EDP_VSWING_0_4V:
833*d83cc019SAndroid Build Coastguard Worker printf("0.4V\n");
834*d83cc019SAndroid Build Coastguard Worker break;
835*d83cc019SAndroid Build Coastguard Worker case EDP_VSWING_0_6V:
836*d83cc019SAndroid Build Coastguard Worker printf("0.6V\n");
837*d83cc019SAndroid Build Coastguard Worker break;
838*d83cc019SAndroid Build Coastguard Worker case EDP_VSWING_0_8V:
839*d83cc019SAndroid Build Coastguard Worker printf("0.8V\n");
840*d83cc019SAndroid Build Coastguard Worker break;
841*d83cc019SAndroid Build Coastguard Worker case EDP_VSWING_1_2V:
842*d83cc019SAndroid Build Coastguard Worker printf("1.2V\n");
843*d83cc019SAndroid Build Coastguard Worker break;
844*d83cc019SAndroid Build Coastguard Worker default:
845*d83cc019SAndroid Build Coastguard Worker printf("(unknown value %d)\n",
846*d83cc019SAndroid Build Coastguard Worker edp->fast_link_params[i].vswing);
847*d83cc019SAndroid Build Coastguard Worker break;
848*d83cc019SAndroid Build Coastguard Worker }
849*d83cc019SAndroid Build Coastguard Worker
850*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 162) {
851*d83cc019SAndroid Build Coastguard Worker bool val = (edp->edp_s3d_feature >> i) & 1;
852*d83cc019SAndroid Build Coastguard Worker printf("\t\tStereo 3D feature: %s\n", YESNO(val));
853*d83cc019SAndroid Build Coastguard Worker }
854*d83cc019SAndroid Build Coastguard Worker
855*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 165) {
856*d83cc019SAndroid Build Coastguard Worker bool val = (edp->edp_t3_optimization >> i) & 1;
857*d83cc019SAndroid Build Coastguard Worker printf("\t\tT3 optimization: %s\n", YESNO(val));
858*d83cc019SAndroid Build Coastguard Worker }
859*d83cc019SAndroid Build Coastguard Worker
860*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 173) {
861*d83cc019SAndroid Build Coastguard Worker int val = (edp->edp_vswing_preemph >> (i * 4)) & 0xf;
862*d83cc019SAndroid Build Coastguard Worker
863*d83cc019SAndroid Build Coastguard Worker printf("\t\tVswing/preemphasis table selection: ");
864*d83cc019SAndroid Build Coastguard Worker switch (val) {
865*d83cc019SAndroid Build Coastguard Worker case 0:
866*d83cc019SAndroid Build Coastguard Worker printf("Low power (200 mV)\n");
867*d83cc019SAndroid Build Coastguard Worker break;
868*d83cc019SAndroid Build Coastguard Worker case 1:
869*d83cc019SAndroid Build Coastguard Worker printf("Default (400 mV)\n");
870*d83cc019SAndroid Build Coastguard Worker break;
871*d83cc019SAndroid Build Coastguard Worker default:
872*d83cc019SAndroid Build Coastguard Worker printf("(unknown value %d)\n", val);
873*d83cc019SAndroid Build Coastguard Worker break;
874*d83cc019SAndroid Build Coastguard Worker }
875*d83cc019SAndroid Build Coastguard Worker }
876*d83cc019SAndroid Build Coastguard Worker
877*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 182) {
878*d83cc019SAndroid Build Coastguard Worker bool val = (edp->fast_link_training >> i) & 1;
879*d83cc019SAndroid Build Coastguard Worker printf("\t\tFast link training: %s\n", YESNO(val));
880*d83cc019SAndroid Build Coastguard Worker }
881*d83cc019SAndroid Build Coastguard Worker
882*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 185) {
883*d83cc019SAndroid Build Coastguard Worker bool val = (edp->dpcd_600h_write_required >> i) & 1;
884*d83cc019SAndroid Build Coastguard Worker printf("\t\tDPCD 600h write required: %s\n", YESNO(val));
885*d83cc019SAndroid Build Coastguard Worker }
886*d83cc019SAndroid Build Coastguard Worker
887*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 186) {
888*d83cc019SAndroid Build Coastguard Worker printf("\t\tPWM delays:\n"
889*d83cc019SAndroid Build Coastguard Worker "\t\t\tPWM on to backlight enable: %d\n"
890*d83cc019SAndroid Build Coastguard Worker "\t\t\tBacklight disable to PWM off: %d\n",
891*d83cc019SAndroid Build Coastguard Worker edp->pwm_delays[i].pwm_on_to_backlight_enable,
892*d83cc019SAndroid Build Coastguard Worker edp->pwm_delays[i].backlight_disable_to_pwm_off);
893*d83cc019SAndroid Build Coastguard Worker }
894*d83cc019SAndroid Build Coastguard Worker
895*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 199) {
896*d83cc019SAndroid Build Coastguard Worker bool val = (edp->full_link_params_provided >> i) & 1;
897*d83cc019SAndroid Build Coastguard Worker
898*d83cc019SAndroid Build Coastguard Worker printf("\t\tFull link params provided: %s\n", YESNO(val));
899*d83cc019SAndroid Build Coastguard Worker printf("\t\tFull link params:\n");
900*d83cc019SAndroid Build Coastguard Worker printf("\t\t\tpre-emphasis: ");
901*d83cc019SAndroid Build Coastguard Worker switch (edp->full_link_params[i].preemphasis) {
902*d83cc019SAndroid Build Coastguard Worker case EDP_PREEMPHASIS_NONE:
903*d83cc019SAndroid Build Coastguard Worker printf("none\n");
904*d83cc019SAndroid Build Coastguard Worker break;
905*d83cc019SAndroid Build Coastguard Worker case EDP_PREEMPHASIS_3_5dB:
906*d83cc019SAndroid Build Coastguard Worker printf("3.5dB\n");
907*d83cc019SAndroid Build Coastguard Worker break;
908*d83cc019SAndroid Build Coastguard Worker case EDP_PREEMPHASIS_6dB:
909*d83cc019SAndroid Build Coastguard Worker printf("6dB\n");
910*d83cc019SAndroid Build Coastguard Worker break;
911*d83cc019SAndroid Build Coastguard Worker case EDP_PREEMPHASIS_9_5dB:
912*d83cc019SAndroid Build Coastguard Worker printf("9.5dB\n");
913*d83cc019SAndroid Build Coastguard Worker break;
914*d83cc019SAndroid Build Coastguard Worker default:
915*d83cc019SAndroid Build Coastguard Worker printf("(unknown value %d)\n",
916*d83cc019SAndroid Build Coastguard Worker edp->full_link_params[i].preemphasis);
917*d83cc019SAndroid Build Coastguard Worker break;
918*d83cc019SAndroid Build Coastguard Worker }
919*d83cc019SAndroid Build Coastguard Worker printf("\t\t\tvswing: ");
920*d83cc019SAndroid Build Coastguard Worker switch (edp->full_link_params[i].vswing) {
921*d83cc019SAndroid Build Coastguard Worker case EDP_VSWING_0_4V:
922*d83cc019SAndroid Build Coastguard Worker printf("0.4V\n");
923*d83cc019SAndroid Build Coastguard Worker break;
924*d83cc019SAndroid Build Coastguard Worker case EDP_VSWING_0_6V:
925*d83cc019SAndroid Build Coastguard Worker printf("0.6V\n");
926*d83cc019SAndroid Build Coastguard Worker break;
927*d83cc019SAndroid Build Coastguard Worker case EDP_VSWING_0_8V:
928*d83cc019SAndroid Build Coastguard Worker printf("0.8V\n");
929*d83cc019SAndroid Build Coastguard Worker break;
930*d83cc019SAndroid Build Coastguard Worker case EDP_VSWING_1_2V:
931*d83cc019SAndroid Build Coastguard Worker printf("1.2V\n");
932*d83cc019SAndroid Build Coastguard Worker break;
933*d83cc019SAndroid Build Coastguard Worker default:
934*d83cc019SAndroid Build Coastguard Worker printf("(unknown value %d)\n",
935*d83cc019SAndroid Build Coastguard Worker edp->full_link_params[i].vswing);
936*d83cc019SAndroid Build Coastguard Worker break;
937*d83cc019SAndroid Build Coastguard Worker }
938*d83cc019SAndroid Build Coastguard Worker }
939*d83cc019SAndroid Build Coastguard Worker }
940*d83cc019SAndroid Build Coastguard Worker }
941*d83cc019SAndroid Build Coastguard Worker
dump_psr(struct context * context,const struct bdb_block * block)942*d83cc019SAndroid Build Coastguard Worker static void dump_psr(struct context *context,
943*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
944*d83cc019SAndroid Build Coastguard Worker {
945*d83cc019SAndroid Build Coastguard Worker const struct bdb_psr *psr_block = block->data;
946*d83cc019SAndroid Build Coastguard Worker int i;
947*d83cc019SAndroid Build Coastguard Worker uint32_t psr2_tp_time;
948*d83cc019SAndroid Build Coastguard Worker
949*d83cc019SAndroid Build Coastguard Worker /* The same block ID was used for something else before? */
950*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version < 165)
951*d83cc019SAndroid Build Coastguard Worker return;
952*d83cc019SAndroid Build Coastguard Worker
953*d83cc019SAndroid Build Coastguard Worker psr2_tp_time = psr_block->psr2_tp2_tp3_wakeup_time;
954*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 16; i++) {
955*d83cc019SAndroid Build Coastguard Worker const struct psr_table *psr = &psr_block->psr_table[i];
956*d83cc019SAndroid Build Coastguard Worker
957*d83cc019SAndroid Build Coastguard Worker if (i != context->panel_type && !context->dump_all_panel_types)
958*d83cc019SAndroid Build Coastguard Worker continue;
959*d83cc019SAndroid Build Coastguard Worker
960*d83cc019SAndroid Build Coastguard Worker printf("\tPanel %d%s\n", i, context->panel_type == i ? " *" : "");
961*d83cc019SAndroid Build Coastguard Worker
962*d83cc019SAndroid Build Coastguard Worker printf("\t\tFull link: %s\n", YESNO(psr->full_link));
963*d83cc019SAndroid Build Coastguard Worker printf("\t\tRequire AUX to wakeup: %s\n", YESNO(psr->require_aux_to_wakeup));
964*d83cc019SAndroid Build Coastguard Worker
965*d83cc019SAndroid Build Coastguard Worker switch (psr->lines_to_wait) {
966*d83cc019SAndroid Build Coastguard Worker case 0:
967*d83cc019SAndroid Build Coastguard Worker case 1:
968*d83cc019SAndroid Build Coastguard Worker printf("\t\tLines to wait before link standby: %d\n",
969*d83cc019SAndroid Build Coastguard Worker psr->lines_to_wait);
970*d83cc019SAndroid Build Coastguard Worker break;
971*d83cc019SAndroid Build Coastguard Worker case 2:
972*d83cc019SAndroid Build Coastguard Worker case 3:
973*d83cc019SAndroid Build Coastguard Worker printf("\t\tLines to wait before link standby: %d\n",
974*d83cc019SAndroid Build Coastguard Worker 1 << psr->lines_to_wait);
975*d83cc019SAndroid Build Coastguard Worker break;
976*d83cc019SAndroid Build Coastguard Worker default:
977*d83cc019SAndroid Build Coastguard Worker printf("\t\tLines to wait before link standby: (unknown) (0x%x)\n",
978*d83cc019SAndroid Build Coastguard Worker psr->lines_to_wait);
979*d83cc019SAndroid Build Coastguard Worker break;
980*d83cc019SAndroid Build Coastguard Worker }
981*d83cc019SAndroid Build Coastguard Worker
982*d83cc019SAndroid Build Coastguard Worker printf("\t\tIdle frames to for PSR enable: %d\n",
983*d83cc019SAndroid Build Coastguard Worker psr->idle_frames);
984*d83cc019SAndroid Build Coastguard Worker
985*d83cc019SAndroid Build Coastguard Worker printf("\t\tTP1 wakeup time: %d usec (0x%x)\n",
986*d83cc019SAndroid Build Coastguard Worker psr->tp1_wakeup_time * 100,
987*d83cc019SAndroid Build Coastguard Worker psr->tp1_wakeup_time);
988*d83cc019SAndroid Build Coastguard Worker
989*d83cc019SAndroid Build Coastguard Worker printf("\t\tTP2/TP3 wakeup time: %d usec (0x%x)\n",
990*d83cc019SAndroid Build Coastguard Worker psr->tp2_tp3_wakeup_time * 100,
991*d83cc019SAndroid Build Coastguard Worker psr->tp2_tp3_wakeup_time);
992*d83cc019SAndroid Build Coastguard Worker
993*d83cc019SAndroid Build Coastguard Worker if (context->bdb->version >= 226) {
994*d83cc019SAndroid Build Coastguard Worker int index;
995*d83cc019SAndroid Build Coastguard Worker static const uint16_t psr2_tp_times[] = {500, 100, 2500, 5};
996*d83cc019SAndroid Build Coastguard Worker
997*d83cc019SAndroid Build Coastguard Worker index = (psr2_tp_time >> (i * 2)) & 0x3;
998*d83cc019SAndroid Build Coastguard Worker printf("\t\tPSR2 TP2/TP3 wakeup time: %d usec (0x%x)\n",
999*d83cc019SAndroid Build Coastguard Worker psr2_tp_times[index], index);
1000*d83cc019SAndroid Build Coastguard Worker }
1001*d83cc019SAndroid Build Coastguard Worker }
1002*d83cc019SAndroid Build Coastguard Worker }
1003*d83cc019SAndroid Build Coastguard Worker
1004*d83cc019SAndroid Build Coastguard Worker static void
print_detail_timing_data(const struct lvds_dvo_timing * dvo_timing)1005*d83cc019SAndroid Build Coastguard Worker print_detail_timing_data(const struct lvds_dvo_timing *dvo_timing)
1006*d83cc019SAndroid Build Coastguard Worker {
1007*d83cc019SAndroid Build Coastguard Worker int display, sync_start, sync_end, total;
1008*d83cc019SAndroid Build Coastguard Worker
1009*d83cc019SAndroid Build Coastguard Worker display = (dvo_timing->hactive_hi << 8) | dvo_timing->hactive_lo;
1010*d83cc019SAndroid Build Coastguard Worker sync_start = display +
1011*d83cc019SAndroid Build Coastguard Worker ((dvo_timing->hsync_off_hi << 8) | dvo_timing->hsync_off_lo);
1012*d83cc019SAndroid Build Coastguard Worker sync_end = sync_start + ((dvo_timing->hsync_pulse_width_hi << 8) |
1013*d83cc019SAndroid Build Coastguard Worker dvo_timing->hsync_pulse_width_lo);
1014*d83cc019SAndroid Build Coastguard Worker total = display +
1015*d83cc019SAndroid Build Coastguard Worker ((dvo_timing->hblank_hi << 8) | dvo_timing->hblank_lo);
1016*d83cc019SAndroid Build Coastguard Worker printf("\thdisplay: %d\n", display);
1017*d83cc019SAndroid Build Coastguard Worker printf("\thsync [%d, %d] %s\n", sync_start, sync_end,
1018*d83cc019SAndroid Build Coastguard Worker dvo_timing->hsync_positive ? "+sync" : "-sync");
1019*d83cc019SAndroid Build Coastguard Worker printf("\thtotal: %d\n", total);
1020*d83cc019SAndroid Build Coastguard Worker
1021*d83cc019SAndroid Build Coastguard Worker display = (dvo_timing->vactive_hi << 8) | dvo_timing->vactive_lo;
1022*d83cc019SAndroid Build Coastguard Worker sync_start = display + ((dvo_timing->vsync_off_hi << 8) |
1023*d83cc019SAndroid Build Coastguard Worker dvo_timing->vsync_off_lo);
1024*d83cc019SAndroid Build Coastguard Worker sync_end = sync_start + ((dvo_timing->vsync_pulse_width_hi << 8) |
1025*d83cc019SAndroid Build Coastguard Worker dvo_timing->vsync_pulse_width_lo);
1026*d83cc019SAndroid Build Coastguard Worker total = display +
1027*d83cc019SAndroid Build Coastguard Worker ((dvo_timing->vblank_hi << 8) | dvo_timing->vblank_lo);
1028*d83cc019SAndroid Build Coastguard Worker printf("\tvdisplay: %d\n", display);
1029*d83cc019SAndroid Build Coastguard Worker printf("\tvsync [%d, %d] %s\n", sync_start, sync_end,
1030*d83cc019SAndroid Build Coastguard Worker dvo_timing->vsync_positive ? "+sync" : "-sync");
1031*d83cc019SAndroid Build Coastguard Worker printf("\tvtotal: %d\n", total);
1032*d83cc019SAndroid Build Coastguard Worker
1033*d83cc019SAndroid Build Coastguard Worker printf("\tclock: %d\n", dvo_timing->clock * 10);
1034*d83cc019SAndroid Build Coastguard Worker }
1035*d83cc019SAndroid Build Coastguard Worker
dump_sdvo_panel_dtds(struct context * context,const struct bdb_block * block)1036*d83cc019SAndroid Build Coastguard Worker static void dump_sdvo_panel_dtds(struct context *context,
1037*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
1038*d83cc019SAndroid Build Coastguard Worker {
1039*d83cc019SAndroid Build Coastguard Worker const struct lvds_dvo_timing *dvo_timing = block->data;
1040*d83cc019SAndroid Build Coastguard Worker int n, count;
1041*d83cc019SAndroid Build Coastguard Worker
1042*d83cc019SAndroid Build Coastguard Worker count = block->size / sizeof(struct lvds_dvo_timing);
1043*d83cc019SAndroid Build Coastguard Worker for (n = 0; n < count; n++) {
1044*d83cc019SAndroid Build Coastguard Worker printf("%d:\n", n);
1045*d83cc019SAndroid Build Coastguard Worker print_detail_timing_data(dvo_timing++);
1046*d83cc019SAndroid Build Coastguard Worker }
1047*d83cc019SAndroid Build Coastguard Worker }
1048*d83cc019SAndroid Build Coastguard Worker
dump_sdvo_lvds_options(struct context * context,const struct bdb_block * block)1049*d83cc019SAndroid Build Coastguard Worker static void dump_sdvo_lvds_options(struct context *context,
1050*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
1051*d83cc019SAndroid Build Coastguard Worker {
1052*d83cc019SAndroid Build Coastguard Worker const struct bdb_sdvo_lvds_options *options = block->data;
1053*d83cc019SAndroid Build Coastguard Worker
1054*d83cc019SAndroid Build Coastguard Worker printf("\tbacklight: %d\n", options->panel_backlight);
1055*d83cc019SAndroid Build Coastguard Worker printf("\th40 type: %d\n", options->h40_set_panel_type);
1056*d83cc019SAndroid Build Coastguard Worker printf("\ttype: %d\n", options->panel_type);
1057*d83cc019SAndroid Build Coastguard Worker printf("\tssc_clk_freq: %d\n", options->ssc_clk_freq);
1058*d83cc019SAndroid Build Coastguard Worker printf("\tals_low_trip: %d\n", options->als_low_trip);
1059*d83cc019SAndroid Build Coastguard Worker printf("\tals_high_trip: %d\n", options->als_high_trip);
1060*d83cc019SAndroid Build Coastguard Worker /*
1061*d83cc019SAndroid Build Coastguard Worker u8 sclalarcoeff_tab_row_num;
1062*d83cc019SAndroid Build Coastguard Worker u8 sclalarcoeff_tab_row_size;
1063*d83cc019SAndroid Build Coastguard Worker u8 coefficient[8];
1064*d83cc019SAndroid Build Coastguard Worker */
1065*d83cc019SAndroid Build Coastguard Worker printf("\tmisc[0]: %x\n", options->panel_misc_bits_1);
1066*d83cc019SAndroid Build Coastguard Worker printf("\tmisc[1]: %x\n", options->panel_misc_bits_2);
1067*d83cc019SAndroid Build Coastguard Worker printf("\tmisc[2]: %x\n", options->panel_misc_bits_3);
1068*d83cc019SAndroid Build Coastguard Worker printf("\tmisc[3]: %x\n", options->panel_misc_bits_4);
1069*d83cc019SAndroid Build Coastguard Worker }
1070*d83cc019SAndroid Build Coastguard Worker
dump_mipi_config(struct context * context,const struct bdb_block * block)1071*d83cc019SAndroid Build Coastguard Worker static void dump_mipi_config(struct context *context,
1072*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
1073*d83cc019SAndroid Build Coastguard Worker {
1074*d83cc019SAndroid Build Coastguard Worker const struct bdb_mipi_config *start = block->data;
1075*d83cc019SAndroid Build Coastguard Worker const struct mipi_config *config;
1076*d83cc019SAndroid Build Coastguard Worker const struct mipi_pps_data *pps;
1077*d83cc019SAndroid Build Coastguard Worker
1078*d83cc019SAndroid Build Coastguard Worker config = &start->config[context->panel_type];
1079*d83cc019SAndroid Build Coastguard Worker pps = &start->pps[context->panel_type];
1080*d83cc019SAndroid Build Coastguard Worker
1081*d83cc019SAndroid Build Coastguard Worker printf("\tGeneral Param\n");
1082*d83cc019SAndroid Build Coastguard Worker printf("\t\t BTA disable: %s\n", config->bta ? "Disabled" : "Enabled");
1083*d83cc019SAndroid Build Coastguard Worker printf("\t\t Panel Rotation: %d degrees\n", config->rotation * 90);
1084*d83cc019SAndroid Build Coastguard Worker
1085*d83cc019SAndroid Build Coastguard Worker printf("\t\t Video Mode Color Format: ");
1086*d83cc019SAndroid Build Coastguard Worker if (config->videomode_color_format == 0)
1087*d83cc019SAndroid Build Coastguard Worker printf("Not supported\n");
1088*d83cc019SAndroid Build Coastguard Worker else if (config->videomode_color_format == 1)
1089*d83cc019SAndroid Build Coastguard Worker printf("RGB565\n");
1090*d83cc019SAndroid Build Coastguard Worker else if (config->videomode_color_format == 2)
1091*d83cc019SAndroid Build Coastguard Worker printf("RGB666\n");
1092*d83cc019SAndroid Build Coastguard Worker else if (config->videomode_color_format == 3)
1093*d83cc019SAndroid Build Coastguard Worker printf("RGB666 Loosely Packed\n");
1094*d83cc019SAndroid Build Coastguard Worker else if (config->videomode_color_format == 4)
1095*d83cc019SAndroid Build Coastguard Worker printf("RGB888\n");
1096*d83cc019SAndroid Build Coastguard Worker printf("\t\t PPS GPIO Pins: %s \n", config->pwm_blc ? "Using SOC" : "Using PMIC");
1097*d83cc019SAndroid Build Coastguard Worker printf("\t\t CABC Support: %s\n", config->cabc ? "supported" : "not supported");
1098*d83cc019SAndroid Build Coastguard Worker printf("\t\t Mode: %s\n", config->cmd_mode ? "COMMAND" : "VIDEO");
1099*d83cc019SAndroid Build Coastguard Worker printf("\t\t Video transfer mode: %s (0x%x)\n",
1100*d83cc019SAndroid Build Coastguard Worker config->vtm == 1 ? "non-burst with sync pulse" :
1101*d83cc019SAndroid Build Coastguard Worker config->vtm == 2 ? "non-burst with sync events" :
1102*d83cc019SAndroid Build Coastguard Worker config->vtm == 3 ? "burst" : "<unknown>",
1103*d83cc019SAndroid Build Coastguard Worker config->vtm);
1104*d83cc019SAndroid Build Coastguard Worker printf("\t\t Dithering: %s\n", config->dithering ? "done in Display Controller" : "done in Panel Controller");
1105*d83cc019SAndroid Build Coastguard Worker
1106*d83cc019SAndroid Build Coastguard Worker printf("\tPort Desc\n");
1107*d83cc019SAndroid Build Coastguard Worker printf("\t\t Pixel overlap: %d\n", config->pixel_overlap);
1108*d83cc019SAndroid Build Coastguard Worker printf("\t\t Lane Count: %d\n", config->lane_cnt + 1);
1109*d83cc019SAndroid Build Coastguard Worker printf("\t\t Dual Link Support: ");
1110*d83cc019SAndroid Build Coastguard Worker if (config->dual_link == 0)
1111*d83cc019SAndroid Build Coastguard Worker printf("not supported\n");
1112*d83cc019SAndroid Build Coastguard Worker else if (config->dual_link == 1)
1113*d83cc019SAndroid Build Coastguard Worker printf("Front Back mode\n");
1114*d83cc019SAndroid Build Coastguard Worker else
1115*d83cc019SAndroid Build Coastguard Worker printf("Pixel Alternative Mode\n");
1116*d83cc019SAndroid Build Coastguard Worker
1117*d83cc019SAndroid Build Coastguard Worker printf("\tDphy Flags\n");
1118*d83cc019SAndroid Build Coastguard Worker printf("\t\t Clock Stop: %s\n", config->clk_stop ? "ENABLED" : "DISABLED");
1119*d83cc019SAndroid Build Coastguard Worker printf("\t\t EOT disabled: %s\n\n", config->eot_disabled ? "EOT not to be sent" : "EOT to be sent");
1120*d83cc019SAndroid Build Coastguard Worker
1121*d83cc019SAndroid Build Coastguard Worker printf("\tHSTxTimeOut: 0x%x\n", config->hs_tx_timeout);
1122*d83cc019SAndroid Build Coastguard Worker printf("\tLPRXTimeOut: 0x%x\n", config->lp_rx_timeout);
1123*d83cc019SAndroid Build Coastguard Worker printf("\tTurnAroundTimeOut: 0x%x\n", config->turn_around_timeout);
1124*d83cc019SAndroid Build Coastguard Worker printf("\tDeviceResetTimer: 0x%x\n", config->device_reset_timer);
1125*d83cc019SAndroid Build Coastguard Worker printf("\tMasterinitTimer: 0x%x\n", config->master_init_timer);
1126*d83cc019SAndroid Build Coastguard Worker printf("\tDBIBandwidthTimer: 0x%x\n", config->dbi_bw_timer);
1127*d83cc019SAndroid Build Coastguard Worker printf("\tLpByteClkValue: 0x%x\n\n", config->lp_byte_clk_val);
1128*d83cc019SAndroid Build Coastguard Worker
1129*d83cc019SAndroid Build Coastguard Worker printf("\tDphy Params\n");
1130*d83cc019SAndroid Build Coastguard Worker printf("\t\tExit to zero Count: 0x%x\n", config->exit_zero_cnt);
1131*d83cc019SAndroid Build Coastguard Worker printf("\t\tTrail Count: 0x%X\n", config->trail_cnt);
1132*d83cc019SAndroid Build Coastguard Worker printf("\t\tClk zero count: 0x%x\n", config->clk_zero_cnt);
1133*d83cc019SAndroid Build Coastguard Worker printf("\t\tPrepare count:0x%x\n\n", config->prepare_cnt);
1134*d83cc019SAndroid Build Coastguard Worker
1135*d83cc019SAndroid Build Coastguard Worker printf("\tClockLaneSwitchingCount: 0x%x\n", config->clk_lane_switch_cnt);
1136*d83cc019SAndroid Build Coastguard Worker printf("\tHighToLowSwitchingCount: 0x%x\n\n", config->hl_switch_cnt);
1137*d83cc019SAndroid Build Coastguard Worker
1138*d83cc019SAndroid Build Coastguard Worker printf("\tTimings based on Dphy spec\n");
1139*d83cc019SAndroid Build Coastguard Worker printf("\t\tTClkMiss: 0x%x\n", config->tclk_miss);
1140*d83cc019SAndroid Build Coastguard Worker printf("\t\tTClkPost: 0x%x\n", config->tclk_post);
1141*d83cc019SAndroid Build Coastguard Worker printf("\t\tTClkPre: 0x%x\n", config->tclk_pre);
1142*d83cc019SAndroid Build Coastguard Worker printf("\t\tTClkPrepare: 0x%x\n", config->tclk_prepare);
1143*d83cc019SAndroid Build Coastguard Worker printf("\t\tTClkSettle: 0x%x\n", config->tclk_settle);
1144*d83cc019SAndroid Build Coastguard Worker printf("\t\tTClkTermEnable: 0x%x\n\n", config->tclk_term_enable);
1145*d83cc019SAndroid Build Coastguard Worker
1146*d83cc019SAndroid Build Coastguard Worker printf("\tTClkTrail: 0x%x\n", config->tclk_trail);
1147*d83cc019SAndroid Build Coastguard Worker printf("\tTClkPrepareTClkZero: 0x%x\n", config->tclk_prepare_clkzero);
1148*d83cc019SAndroid Build Coastguard Worker printf("\tTHSExit: 0x%x\n", config->ths_exit);
1149*d83cc019SAndroid Build Coastguard Worker printf("\tTHsPrepare: 0x%x\n", config->ths_prepare);
1150*d83cc019SAndroid Build Coastguard Worker printf("\tTHsPrepareTHsZero: 0x%x\n", config->ths_prepare_hszero);
1151*d83cc019SAndroid Build Coastguard Worker printf("\tTHSSettle: 0x%x\n", config->ths_settle);
1152*d83cc019SAndroid Build Coastguard Worker printf("\tTHSSkip: 0x%x\n", config->ths_skip);
1153*d83cc019SAndroid Build Coastguard Worker printf("\tTHsTrail: 0x%x\n", config->ths_trail);
1154*d83cc019SAndroid Build Coastguard Worker printf("\tTInit: 0x%x\n", config->tinit);
1155*d83cc019SAndroid Build Coastguard Worker printf("\tTLPX: 0x%x\n", config->tlpx);
1156*d83cc019SAndroid Build Coastguard Worker
1157*d83cc019SAndroid Build Coastguard Worker printf("\tMIPI PPS\n");
1158*d83cc019SAndroid Build Coastguard Worker printf("\t\tPanel power ON delay: %d\n", pps->panel_on_delay);
1159*d83cc019SAndroid Build Coastguard Worker printf("\t\tPanel power on to Backlight enable delay: %d\n", pps->bl_enable_delay);
1160*d83cc019SAndroid Build Coastguard Worker printf("\t\tBacklight disable to Panel power OFF delay: %d\n", pps->bl_disable_delay);
1161*d83cc019SAndroid Build Coastguard Worker printf("\t\tPanel power OFF delay: %d\n", pps->panel_off_delay);
1162*d83cc019SAndroid Build Coastguard Worker printf("\t\tPanel power cycle delay: %d\n", pps->panel_power_cycle_delay);
1163*d83cc019SAndroid Build Coastguard Worker }
1164*d83cc019SAndroid Build Coastguard Worker
mipi_dump_send_packet(const uint8_t * data,uint8_t seq_version)1165*d83cc019SAndroid Build Coastguard Worker static const uint8_t *mipi_dump_send_packet(const uint8_t *data, uint8_t seq_version)
1166*d83cc019SAndroid Build Coastguard Worker {
1167*d83cc019SAndroid Build Coastguard Worker uint8_t flags, type;
1168*d83cc019SAndroid Build Coastguard Worker uint16_t len, i;
1169*d83cc019SAndroid Build Coastguard Worker
1170*d83cc019SAndroid Build Coastguard Worker flags = *data++;
1171*d83cc019SAndroid Build Coastguard Worker type = *data++;
1172*d83cc019SAndroid Build Coastguard Worker len = *((const uint16_t *) data);
1173*d83cc019SAndroid Build Coastguard Worker data += 2;
1174*d83cc019SAndroid Build Coastguard Worker
1175*d83cc019SAndroid Build Coastguard Worker printf("\t\tSend DCS: Port %s, VC %d, %s, Type %02x, Length %u, Data",
1176*d83cc019SAndroid Build Coastguard Worker (flags >> 3) & 1 ? "C" : "A",
1177*d83cc019SAndroid Build Coastguard Worker (flags >> 1) & 3,
1178*d83cc019SAndroid Build Coastguard Worker flags & 1 ? "HS" : "LP",
1179*d83cc019SAndroid Build Coastguard Worker type,
1180*d83cc019SAndroid Build Coastguard Worker len);
1181*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < len; i++)
1182*d83cc019SAndroid Build Coastguard Worker printf(" %02x", *data++);
1183*d83cc019SAndroid Build Coastguard Worker printf("\n");
1184*d83cc019SAndroid Build Coastguard Worker
1185*d83cc019SAndroid Build Coastguard Worker return data;
1186*d83cc019SAndroid Build Coastguard Worker }
1187*d83cc019SAndroid Build Coastguard Worker
mipi_dump_delay(const uint8_t * data,uint8_t seq_version)1188*d83cc019SAndroid Build Coastguard Worker static const uint8_t *mipi_dump_delay(const uint8_t *data, uint8_t seq_version)
1189*d83cc019SAndroid Build Coastguard Worker {
1190*d83cc019SAndroid Build Coastguard Worker printf("\t\tDelay: %u us\n", *((const uint32_t *)data));
1191*d83cc019SAndroid Build Coastguard Worker
1192*d83cc019SAndroid Build Coastguard Worker return data + 4;
1193*d83cc019SAndroid Build Coastguard Worker }
1194*d83cc019SAndroid Build Coastguard Worker
mipi_dump_gpio(const uint8_t * data,uint8_t seq_version)1195*d83cc019SAndroid Build Coastguard Worker static const uint8_t *mipi_dump_gpio(const uint8_t *data, uint8_t seq_version)
1196*d83cc019SAndroid Build Coastguard Worker {
1197*d83cc019SAndroid Build Coastguard Worker uint8_t index, number, flags;
1198*d83cc019SAndroid Build Coastguard Worker
1199*d83cc019SAndroid Build Coastguard Worker if (seq_version >= 3) {
1200*d83cc019SAndroid Build Coastguard Worker index = *data++;
1201*d83cc019SAndroid Build Coastguard Worker number = *data++;
1202*d83cc019SAndroid Build Coastguard Worker flags = *data++;
1203*d83cc019SAndroid Build Coastguard Worker
1204*d83cc019SAndroid Build Coastguard Worker printf("\t\tGPIO index %u, number %u, set %d (0x%02x)\n",
1205*d83cc019SAndroid Build Coastguard Worker index, number, flags & 1, flags);
1206*d83cc019SAndroid Build Coastguard Worker } else {
1207*d83cc019SAndroid Build Coastguard Worker index = *data++;
1208*d83cc019SAndroid Build Coastguard Worker flags = *data++;
1209*d83cc019SAndroid Build Coastguard Worker
1210*d83cc019SAndroid Build Coastguard Worker printf("\t\tGPIO index %u, source %d, set %d (0x%02x)\n",
1211*d83cc019SAndroid Build Coastguard Worker index, (flags >> 1) & 3, flags & 1, flags);
1212*d83cc019SAndroid Build Coastguard Worker }
1213*d83cc019SAndroid Build Coastguard Worker
1214*d83cc019SAndroid Build Coastguard Worker return data;
1215*d83cc019SAndroid Build Coastguard Worker }
1216*d83cc019SAndroid Build Coastguard Worker
mipi_dump_i2c(const uint8_t * data,uint8_t seq_version)1217*d83cc019SAndroid Build Coastguard Worker static const uint8_t *mipi_dump_i2c(const uint8_t *data, uint8_t seq_version)
1218*d83cc019SAndroid Build Coastguard Worker {
1219*d83cc019SAndroid Build Coastguard Worker uint8_t flags, index, bus, offset, len, i;
1220*d83cc019SAndroid Build Coastguard Worker uint16_t address;
1221*d83cc019SAndroid Build Coastguard Worker
1222*d83cc019SAndroid Build Coastguard Worker flags = *data++;
1223*d83cc019SAndroid Build Coastguard Worker index = *data++;
1224*d83cc019SAndroid Build Coastguard Worker bus = *data++;
1225*d83cc019SAndroid Build Coastguard Worker address = *((const uint16_t *) data);
1226*d83cc019SAndroid Build Coastguard Worker data += 2;
1227*d83cc019SAndroid Build Coastguard Worker offset = *data++;
1228*d83cc019SAndroid Build Coastguard Worker len = *data++;
1229*d83cc019SAndroid Build Coastguard Worker
1230*d83cc019SAndroid Build Coastguard Worker printf("\t\tSend I2C: Flags %02x, Index %02x, Bus %02x, Address %04x, Offset %02x, Length %u, Data",
1231*d83cc019SAndroid Build Coastguard Worker flags, index, bus, address, offset, len);
1232*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < len; i++)
1233*d83cc019SAndroid Build Coastguard Worker printf(" %02x", *data++);
1234*d83cc019SAndroid Build Coastguard Worker printf("\n");
1235*d83cc019SAndroid Build Coastguard Worker
1236*d83cc019SAndroid Build Coastguard Worker return data;
1237*d83cc019SAndroid Build Coastguard Worker }
1238*d83cc019SAndroid Build Coastguard Worker
1239*d83cc019SAndroid Build Coastguard Worker typedef const uint8_t * (*fn_mipi_elem_dump)(const uint8_t *data, uint8_t seq_version);
1240*d83cc019SAndroid Build Coastguard Worker
1241*d83cc019SAndroid Build Coastguard Worker static const fn_mipi_elem_dump dump_elem[] = {
1242*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_ELEM_SEND_PKT] = mipi_dump_send_packet,
1243*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_ELEM_DELAY] = mipi_dump_delay,
1244*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_ELEM_GPIO] = mipi_dump_gpio,
1245*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_ELEM_I2C] = mipi_dump_i2c,
1246*d83cc019SAndroid Build Coastguard Worker };
1247*d83cc019SAndroid Build Coastguard Worker
1248*d83cc019SAndroid Build Coastguard Worker static const char * const seq_name[] = {
1249*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_ASSERT_RESET] = "MIPI_SEQ_ASSERT_RESET",
1250*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_INIT_OTP] = "MIPI_SEQ_INIT_OTP",
1251*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_DISPLAY_ON] = "MIPI_SEQ_DISPLAY_ON",
1252*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_DISPLAY_OFF] = "MIPI_SEQ_DISPLAY_OFF",
1253*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_DEASSERT_RESET] = "MIPI_SEQ_DEASSERT_RESET",
1254*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_BACKLIGHT_ON] = "MIPI_SEQ_BACKLIGHT_ON",
1255*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_BACKLIGHT_OFF] = "MIPI_SEQ_BACKLIGHT_OFF",
1256*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_TEAR_ON] = "MIPI_SEQ_TEAR_ON",
1257*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_TEAR_OFF] = "MIPI_SEQ_TEAR_OFF",
1258*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_POWER_ON] = "MIPI_SEQ_POWER_ON",
1259*d83cc019SAndroid Build Coastguard Worker [MIPI_SEQ_POWER_OFF] = "MIPI_SEQ_POWER_OFF",
1260*d83cc019SAndroid Build Coastguard Worker };
1261*d83cc019SAndroid Build Coastguard Worker
sequence_name(enum mipi_seq seq_id)1262*d83cc019SAndroid Build Coastguard Worker static const char *sequence_name(enum mipi_seq seq_id)
1263*d83cc019SAndroid Build Coastguard Worker {
1264*d83cc019SAndroid Build Coastguard Worker if (seq_id < ARRAY_SIZE(seq_name) && seq_name[seq_id])
1265*d83cc019SAndroid Build Coastguard Worker return seq_name[seq_id];
1266*d83cc019SAndroid Build Coastguard Worker else
1267*d83cc019SAndroid Build Coastguard Worker return "(unknown)";
1268*d83cc019SAndroid Build Coastguard Worker }
1269*d83cc019SAndroid Build Coastguard Worker
dump_sequence(const uint8_t * data,uint8_t seq_version)1270*d83cc019SAndroid Build Coastguard Worker static const uint8_t *dump_sequence(const uint8_t *data, uint8_t seq_version)
1271*d83cc019SAndroid Build Coastguard Worker {
1272*d83cc019SAndroid Build Coastguard Worker fn_mipi_elem_dump mipi_elem_dump;
1273*d83cc019SAndroid Build Coastguard Worker
1274*d83cc019SAndroid Build Coastguard Worker printf("\tSequence %u - %s\n", *data, sequence_name(*data));
1275*d83cc019SAndroid Build Coastguard Worker
1276*d83cc019SAndroid Build Coastguard Worker /* Skip Sequence Byte. */
1277*d83cc019SAndroid Build Coastguard Worker data++;
1278*d83cc019SAndroid Build Coastguard Worker
1279*d83cc019SAndroid Build Coastguard Worker /* Skip Size of Sequence. */
1280*d83cc019SAndroid Build Coastguard Worker if (seq_version >= 3)
1281*d83cc019SAndroid Build Coastguard Worker data += 4;
1282*d83cc019SAndroid Build Coastguard Worker
1283*d83cc019SAndroid Build Coastguard Worker while (1) {
1284*d83cc019SAndroid Build Coastguard Worker uint8_t operation_byte = *data++;
1285*d83cc019SAndroid Build Coastguard Worker uint8_t operation_size = 0;
1286*d83cc019SAndroid Build Coastguard Worker
1287*d83cc019SAndroid Build Coastguard Worker if (operation_byte == MIPI_SEQ_ELEM_END)
1288*d83cc019SAndroid Build Coastguard Worker break;
1289*d83cc019SAndroid Build Coastguard Worker
1290*d83cc019SAndroid Build Coastguard Worker if (operation_byte < ARRAY_SIZE(dump_elem))
1291*d83cc019SAndroid Build Coastguard Worker mipi_elem_dump = dump_elem[operation_byte];
1292*d83cc019SAndroid Build Coastguard Worker else
1293*d83cc019SAndroid Build Coastguard Worker mipi_elem_dump = NULL;
1294*d83cc019SAndroid Build Coastguard Worker
1295*d83cc019SAndroid Build Coastguard Worker /* Size of Operation. */
1296*d83cc019SAndroid Build Coastguard Worker if (seq_version >= 3)
1297*d83cc019SAndroid Build Coastguard Worker operation_size = *data++;
1298*d83cc019SAndroid Build Coastguard Worker
1299*d83cc019SAndroid Build Coastguard Worker if (mipi_elem_dump) {
1300*d83cc019SAndroid Build Coastguard Worker const uint8_t *next = data + operation_size;
1301*d83cc019SAndroid Build Coastguard Worker
1302*d83cc019SAndroid Build Coastguard Worker data = mipi_elem_dump(data, seq_version);
1303*d83cc019SAndroid Build Coastguard Worker
1304*d83cc019SAndroid Build Coastguard Worker if (operation_size && next != data)
1305*d83cc019SAndroid Build Coastguard Worker printf("Error: Inconsistent operation size: %d\n",
1306*d83cc019SAndroid Build Coastguard Worker operation_size);
1307*d83cc019SAndroid Build Coastguard Worker } else if (operation_size) {
1308*d83cc019SAndroid Build Coastguard Worker /* We have size, skip. */
1309*d83cc019SAndroid Build Coastguard Worker data += operation_size;
1310*d83cc019SAndroid Build Coastguard Worker } else {
1311*d83cc019SAndroid Build Coastguard Worker /* No size, can't skip without parsing. */
1312*d83cc019SAndroid Build Coastguard Worker printf("Error: Unsupported MIPI element %u\n",
1313*d83cc019SAndroid Build Coastguard Worker operation_byte);
1314*d83cc019SAndroid Build Coastguard Worker return NULL;
1315*d83cc019SAndroid Build Coastguard Worker }
1316*d83cc019SAndroid Build Coastguard Worker }
1317*d83cc019SAndroid Build Coastguard Worker
1318*d83cc019SAndroid Build Coastguard Worker return data;
1319*d83cc019SAndroid Build Coastguard Worker }
1320*d83cc019SAndroid Build Coastguard Worker
1321*d83cc019SAndroid Build Coastguard Worker /* Find the sequence block and size for the given panel. */
1322*d83cc019SAndroid Build Coastguard Worker static const uint8_t *
find_panel_sequence_block(const struct bdb_mipi_sequence * sequence,uint16_t panel_id,uint32_t total,uint32_t * seq_size)1323*d83cc019SAndroid Build Coastguard Worker find_panel_sequence_block(const struct bdb_mipi_sequence *sequence,
1324*d83cc019SAndroid Build Coastguard Worker uint16_t panel_id, uint32_t total, uint32_t *seq_size)
1325*d83cc019SAndroid Build Coastguard Worker {
1326*d83cc019SAndroid Build Coastguard Worker const uint8_t *data = &sequence->data[0];
1327*d83cc019SAndroid Build Coastguard Worker uint8_t current_id;
1328*d83cc019SAndroid Build Coastguard Worker uint32_t current_size;
1329*d83cc019SAndroid Build Coastguard Worker int header_size = sequence->version >= 3 ? 5 : 3;
1330*d83cc019SAndroid Build Coastguard Worker int index = 0;
1331*d83cc019SAndroid Build Coastguard Worker int i;
1332*d83cc019SAndroid Build Coastguard Worker
1333*d83cc019SAndroid Build Coastguard Worker /* skip new block size */
1334*d83cc019SAndroid Build Coastguard Worker if (sequence->version >= 3)
1335*d83cc019SAndroid Build Coastguard Worker data += 4;
1336*d83cc019SAndroid Build Coastguard Worker
1337*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < MAX_MIPI_CONFIGURATIONS && index < total; i++) {
1338*d83cc019SAndroid Build Coastguard Worker if (index + header_size > total) {
1339*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Invalid sequence block (header)\n");
1340*d83cc019SAndroid Build Coastguard Worker return NULL;
1341*d83cc019SAndroid Build Coastguard Worker }
1342*d83cc019SAndroid Build Coastguard Worker
1343*d83cc019SAndroid Build Coastguard Worker current_id = *(data + index);
1344*d83cc019SAndroid Build Coastguard Worker if (sequence->version >= 3)
1345*d83cc019SAndroid Build Coastguard Worker current_size = *((const uint32_t *)(data + index + 1));
1346*d83cc019SAndroid Build Coastguard Worker else
1347*d83cc019SAndroid Build Coastguard Worker current_size = *((const uint16_t *)(data + index + 1));
1348*d83cc019SAndroid Build Coastguard Worker
1349*d83cc019SAndroid Build Coastguard Worker index += header_size;
1350*d83cc019SAndroid Build Coastguard Worker
1351*d83cc019SAndroid Build Coastguard Worker if (index + current_size > total) {
1352*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Invalid sequence block\n");
1353*d83cc019SAndroid Build Coastguard Worker return NULL;
1354*d83cc019SAndroid Build Coastguard Worker }
1355*d83cc019SAndroid Build Coastguard Worker
1356*d83cc019SAndroid Build Coastguard Worker if (current_id == panel_id) {
1357*d83cc019SAndroid Build Coastguard Worker *seq_size = current_size;
1358*d83cc019SAndroid Build Coastguard Worker return data + index;
1359*d83cc019SAndroid Build Coastguard Worker }
1360*d83cc019SAndroid Build Coastguard Worker
1361*d83cc019SAndroid Build Coastguard Worker index += current_size;
1362*d83cc019SAndroid Build Coastguard Worker }
1363*d83cc019SAndroid Build Coastguard Worker
1364*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Sequence block detected but no valid configuration\n");
1365*d83cc019SAndroid Build Coastguard Worker
1366*d83cc019SAndroid Build Coastguard Worker return NULL;
1367*d83cc019SAndroid Build Coastguard Worker }
1368*d83cc019SAndroid Build Coastguard Worker
goto_next_sequence(const uint8_t * data,int index,int total)1369*d83cc019SAndroid Build Coastguard Worker static int goto_next_sequence(const uint8_t *data, int index, int total)
1370*d83cc019SAndroid Build Coastguard Worker {
1371*d83cc019SAndroid Build Coastguard Worker uint16_t len;
1372*d83cc019SAndroid Build Coastguard Worker
1373*d83cc019SAndroid Build Coastguard Worker /* Skip Sequence Byte. */
1374*d83cc019SAndroid Build Coastguard Worker for (index = index + 1; index < total; index += len) {
1375*d83cc019SAndroid Build Coastguard Worker uint8_t operation_byte = *(data + index);
1376*d83cc019SAndroid Build Coastguard Worker index++;
1377*d83cc019SAndroid Build Coastguard Worker
1378*d83cc019SAndroid Build Coastguard Worker switch (operation_byte) {
1379*d83cc019SAndroid Build Coastguard Worker case MIPI_SEQ_ELEM_END:
1380*d83cc019SAndroid Build Coastguard Worker return index;
1381*d83cc019SAndroid Build Coastguard Worker case MIPI_SEQ_ELEM_SEND_PKT:
1382*d83cc019SAndroid Build Coastguard Worker if (index + 4 > total)
1383*d83cc019SAndroid Build Coastguard Worker return 0;
1384*d83cc019SAndroid Build Coastguard Worker
1385*d83cc019SAndroid Build Coastguard Worker len = *((const uint16_t *)(data + index + 2)) + 4;
1386*d83cc019SAndroid Build Coastguard Worker break;
1387*d83cc019SAndroid Build Coastguard Worker case MIPI_SEQ_ELEM_DELAY:
1388*d83cc019SAndroid Build Coastguard Worker len = 4;
1389*d83cc019SAndroid Build Coastguard Worker break;
1390*d83cc019SAndroid Build Coastguard Worker case MIPI_SEQ_ELEM_GPIO:
1391*d83cc019SAndroid Build Coastguard Worker len = 2;
1392*d83cc019SAndroid Build Coastguard Worker break;
1393*d83cc019SAndroid Build Coastguard Worker case MIPI_SEQ_ELEM_I2C:
1394*d83cc019SAndroid Build Coastguard Worker if (index + 7 > total)
1395*d83cc019SAndroid Build Coastguard Worker return 0;
1396*d83cc019SAndroid Build Coastguard Worker len = *(data + index + 6) + 7;
1397*d83cc019SAndroid Build Coastguard Worker break;
1398*d83cc019SAndroid Build Coastguard Worker default:
1399*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Unknown operation byte\n");
1400*d83cc019SAndroid Build Coastguard Worker return 0;
1401*d83cc019SAndroid Build Coastguard Worker }
1402*d83cc019SAndroid Build Coastguard Worker }
1403*d83cc019SAndroid Build Coastguard Worker
1404*d83cc019SAndroid Build Coastguard Worker return 0;
1405*d83cc019SAndroid Build Coastguard Worker }
1406*d83cc019SAndroid Build Coastguard Worker
goto_next_sequence_v3(const uint8_t * data,int index,int total)1407*d83cc019SAndroid Build Coastguard Worker static int goto_next_sequence_v3(const uint8_t *data, int index, int total)
1408*d83cc019SAndroid Build Coastguard Worker {
1409*d83cc019SAndroid Build Coastguard Worker int seq_end;
1410*d83cc019SAndroid Build Coastguard Worker uint16_t len;
1411*d83cc019SAndroid Build Coastguard Worker uint32_t size_of_sequence;
1412*d83cc019SAndroid Build Coastguard Worker
1413*d83cc019SAndroid Build Coastguard Worker /*
1414*d83cc019SAndroid Build Coastguard Worker * Could skip sequence based on Size of Sequence alone, but also do some
1415*d83cc019SAndroid Build Coastguard Worker * checking on the structure.
1416*d83cc019SAndroid Build Coastguard Worker */
1417*d83cc019SAndroid Build Coastguard Worker if (total < 5) {
1418*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Too small sequence size\n");
1419*d83cc019SAndroid Build Coastguard Worker return 0;
1420*d83cc019SAndroid Build Coastguard Worker }
1421*d83cc019SAndroid Build Coastguard Worker
1422*d83cc019SAndroid Build Coastguard Worker /* Skip Sequence Byte. */
1423*d83cc019SAndroid Build Coastguard Worker index++;
1424*d83cc019SAndroid Build Coastguard Worker
1425*d83cc019SAndroid Build Coastguard Worker /*
1426*d83cc019SAndroid Build Coastguard Worker * Size of Sequence. Excludes the Sequence Byte and the size itself,
1427*d83cc019SAndroid Build Coastguard Worker * includes MIPI_SEQ_ELEM_END byte, excludes the final MIPI_SEQ_END
1428*d83cc019SAndroid Build Coastguard Worker * byte.
1429*d83cc019SAndroid Build Coastguard Worker */
1430*d83cc019SAndroid Build Coastguard Worker size_of_sequence = *((const uint32_t *)(data + index));
1431*d83cc019SAndroid Build Coastguard Worker index += 4;
1432*d83cc019SAndroid Build Coastguard Worker
1433*d83cc019SAndroid Build Coastguard Worker seq_end = index + size_of_sequence;
1434*d83cc019SAndroid Build Coastguard Worker if (seq_end > total) {
1435*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Invalid sequence size\n");
1436*d83cc019SAndroid Build Coastguard Worker return 0;
1437*d83cc019SAndroid Build Coastguard Worker }
1438*d83cc019SAndroid Build Coastguard Worker
1439*d83cc019SAndroid Build Coastguard Worker for (; index < total; index += len) {
1440*d83cc019SAndroid Build Coastguard Worker uint8_t operation_byte = *(data + index);
1441*d83cc019SAndroid Build Coastguard Worker index++;
1442*d83cc019SAndroid Build Coastguard Worker
1443*d83cc019SAndroid Build Coastguard Worker if (operation_byte == MIPI_SEQ_ELEM_END) {
1444*d83cc019SAndroid Build Coastguard Worker if (index != seq_end) {
1445*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Invalid element structure\n");
1446*d83cc019SAndroid Build Coastguard Worker return 0;
1447*d83cc019SAndroid Build Coastguard Worker }
1448*d83cc019SAndroid Build Coastguard Worker return index;
1449*d83cc019SAndroid Build Coastguard Worker }
1450*d83cc019SAndroid Build Coastguard Worker
1451*d83cc019SAndroid Build Coastguard Worker len = *(data + index);
1452*d83cc019SAndroid Build Coastguard Worker index++;
1453*d83cc019SAndroid Build Coastguard Worker
1454*d83cc019SAndroid Build Coastguard Worker /*
1455*d83cc019SAndroid Build Coastguard Worker * FIXME: Would be nice to check elements like for v1/v2 in
1456*d83cc019SAndroid Build Coastguard Worker * goto_next_sequence() above.
1457*d83cc019SAndroid Build Coastguard Worker */
1458*d83cc019SAndroid Build Coastguard Worker switch (operation_byte) {
1459*d83cc019SAndroid Build Coastguard Worker case MIPI_SEQ_ELEM_SEND_PKT:
1460*d83cc019SAndroid Build Coastguard Worker case MIPI_SEQ_ELEM_DELAY:
1461*d83cc019SAndroid Build Coastguard Worker case MIPI_SEQ_ELEM_GPIO:
1462*d83cc019SAndroid Build Coastguard Worker case MIPI_SEQ_ELEM_I2C:
1463*d83cc019SAndroid Build Coastguard Worker case MIPI_SEQ_ELEM_SPI:
1464*d83cc019SAndroid Build Coastguard Worker case MIPI_SEQ_ELEM_PMIC:
1465*d83cc019SAndroid Build Coastguard Worker break;
1466*d83cc019SAndroid Build Coastguard Worker default:
1467*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Unknown operation byte %u\n",
1468*d83cc019SAndroid Build Coastguard Worker operation_byte);
1469*d83cc019SAndroid Build Coastguard Worker break;
1470*d83cc019SAndroid Build Coastguard Worker }
1471*d83cc019SAndroid Build Coastguard Worker }
1472*d83cc019SAndroid Build Coastguard Worker
1473*d83cc019SAndroid Build Coastguard Worker return 0;
1474*d83cc019SAndroid Build Coastguard Worker }
1475*d83cc019SAndroid Build Coastguard Worker
dump_mipi_sequence(struct context * context,const struct bdb_block * block)1476*d83cc019SAndroid Build Coastguard Worker static void dump_mipi_sequence(struct context *context,
1477*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block)
1478*d83cc019SAndroid Build Coastguard Worker {
1479*d83cc019SAndroid Build Coastguard Worker const struct bdb_mipi_sequence *sequence = block->data;
1480*d83cc019SAndroid Build Coastguard Worker const uint8_t *data;
1481*d83cc019SAndroid Build Coastguard Worker uint32_t seq_size;
1482*d83cc019SAndroid Build Coastguard Worker int index = 0, i;
1483*d83cc019SAndroid Build Coastguard Worker const uint8_t *sequence_ptrs[MIPI_SEQ_MAX] = {};
1484*d83cc019SAndroid Build Coastguard Worker
1485*d83cc019SAndroid Build Coastguard Worker /* Check if we have sequence block as well */
1486*d83cc019SAndroid Build Coastguard Worker if (!sequence) {
1487*d83cc019SAndroid Build Coastguard Worker printf("No MIPI Sequence found\n");
1488*d83cc019SAndroid Build Coastguard Worker return;
1489*d83cc019SAndroid Build Coastguard Worker }
1490*d83cc019SAndroid Build Coastguard Worker
1491*d83cc019SAndroid Build Coastguard Worker printf("\tSequence block version v%u\n", sequence->version);
1492*d83cc019SAndroid Build Coastguard Worker
1493*d83cc019SAndroid Build Coastguard Worker /* Fail gracefully for forward incompatible sequence block. */
1494*d83cc019SAndroid Build Coastguard Worker if (sequence->version >= 4) {
1495*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Unable to parse MIPI Sequence Block v%u\n",
1496*d83cc019SAndroid Build Coastguard Worker sequence->version);
1497*d83cc019SAndroid Build Coastguard Worker return;
1498*d83cc019SAndroid Build Coastguard Worker }
1499*d83cc019SAndroid Build Coastguard Worker
1500*d83cc019SAndroid Build Coastguard Worker data = find_panel_sequence_block(sequence, context->panel_type,
1501*d83cc019SAndroid Build Coastguard Worker block->size, &seq_size);
1502*d83cc019SAndroid Build Coastguard Worker if (!data)
1503*d83cc019SAndroid Build Coastguard Worker return;
1504*d83cc019SAndroid Build Coastguard Worker
1505*d83cc019SAndroid Build Coastguard Worker /* Parse the sequences. Corresponds to VBT parsing in the kernel. */
1506*d83cc019SAndroid Build Coastguard Worker for (;;) {
1507*d83cc019SAndroid Build Coastguard Worker uint8_t seq_id = *(data + index);
1508*d83cc019SAndroid Build Coastguard Worker if (seq_id == MIPI_SEQ_END)
1509*d83cc019SAndroid Build Coastguard Worker break;
1510*d83cc019SAndroid Build Coastguard Worker
1511*d83cc019SAndroid Build Coastguard Worker if (seq_id >= MIPI_SEQ_MAX) {
1512*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Unknown sequence %u\n", seq_id);
1513*d83cc019SAndroid Build Coastguard Worker return;
1514*d83cc019SAndroid Build Coastguard Worker }
1515*d83cc019SAndroid Build Coastguard Worker
1516*d83cc019SAndroid Build Coastguard Worker sequence_ptrs[seq_id] = data + index;
1517*d83cc019SAndroid Build Coastguard Worker
1518*d83cc019SAndroid Build Coastguard Worker if (sequence->version >= 3)
1519*d83cc019SAndroid Build Coastguard Worker index = goto_next_sequence_v3(data, index, seq_size);
1520*d83cc019SAndroid Build Coastguard Worker else
1521*d83cc019SAndroid Build Coastguard Worker index = goto_next_sequence(data, index, seq_size);
1522*d83cc019SAndroid Build Coastguard Worker if (!index) {
1523*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Invalid sequence %u\n", seq_id);
1524*d83cc019SAndroid Build Coastguard Worker return;
1525*d83cc019SAndroid Build Coastguard Worker }
1526*d83cc019SAndroid Build Coastguard Worker }
1527*d83cc019SAndroid Build Coastguard Worker
1528*d83cc019SAndroid Build Coastguard Worker /* Dump the sequences. Corresponds to sequence execution in kernel. */
1529*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(sequence_ptrs); i++)
1530*d83cc019SAndroid Build Coastguard Worker if (sequence_ptrs[i])
1531*d83cc019SAndroid Build Coastguard Worker dump_sequence(sequence_ptrs[i], sequence->version);
1532*d83cc019SAndroid Build Coastguard Worker }
1533*d83cc019SAndroid Build Coastguard Worker
1534*d83cc019SAndroid Build Coastguard Worker /* get panel type from lvds options block, or -1 if block not found */
get_panel_type(struct context * context)1535*d83cc019SAndroid Build Coastguard Worker static int get_panel_type(struct context *context)
1536*d83cc019SAndroid Build Coastguard Worker {
1537*d83cc019SAndroid Build Coastguard Worker struct bdb_block *block;
1538*d83cc019SAndroid Build Coastguard Worker const struct bdb_lvds_options *options;
1539*d83cc019SAndroid Build Coastguard Worker int panel_type;
1540*d83cc019SAndroid Build Coastguard Worker
1541*d83cc019SAndroid Build Coastguard Worker block = find_section(context, BDB_LVDS_OPTIONS);
1542*d83cc019SAndroid Build Coastguard Worker if (!block)
1543*d83cc019SAndroid Build Coastguard Worker return -1;
1544*d83cc019SAndroid Build Coastguard Worker
1545*d83cc019SAndroid Build Coastguard Worker options = block->data;
1546*d83cc019SAndroid Build Coastguard Worker panel_type = options->panel_type;
1547*d83cc019SAndroid Build Coastguard Worker
1548*d83cc019SAndroid Build Coastguard Worker free(block);
1549*d83cc019SAndroid Build Coastguard Worker
1550*d83cc019SAndroid Build Coastguard Worker return panel_type;
1551*d83cc019SAndroid Build Coastguard Worker }
1552*d83cc019SAndroid Build Coastguard Worker
1553*d83cc019SAndroid Build Coastguard Worker static int
get_device_id(unsigned char * bios,int size)1554*d83cc019SAndroid Build Coastguard Worker get_device_id(unsigned char *bios, int size)
1555*d83cc019SAndroid Build Coastguard Worker {
1556*d83cc019SAndroid Build Coastguard Worker int device;
1557*d83cc019SAndroid Build Coastguard Worker int offset = (bios[0x19] << 8) + bios[0x18];
1558*d83cc019SAndroid Build Coastguard Worker
1559*d83cc019SAndroid Build Coastguard Worker if (offset + 7 >= size)
1560*d83cc019SAndroid Build Coastguard Worker return -1;
1561*d83cc019SAndroid Build Coastguard Worker
1562*d83cc019SAndroid Build Coastguard Worker if (bios[offset] != 'P' ||
1563*d83cc019SAndroid Build Coastguard Worker bios[offset+1] != 'C' ||
1564*d83cc019SAndroid Build Coastguard Worker bios[offset+2] != 'I' ||
1565*d83cc019SAndroid Build Coastguard Worker bios[offset+3] != 'R')
1566*d83cc019SAndroid Build Coastguard Worker return -1;
1567*d83cc019SAndroid Build Coastguard Worker
1568*d83cc019SAndroid Build Coastguard Worker device = (bios[offset+7] << 8) + bios[offset+6];
1569*d83cc019SAndroid Build Coastguard Worker
1570*d83cc019SAndroid Build Coastguard Worker return device;
1571*d83cc019SAndroid Build Coastguard Worker }
1572*d83cc019SAndroid Build Coastguard Worker
1573*d83cc019SAndroid Build Coastguard Worker struct dumper {
1574*d83cc019SAndroid Build Coastguard Worker uint8_t id;
1575*d83cc019SAndroid Build Coastguard Worker const char *name;
1576*d83cc019SAndroid Build Coastguard Worker void (*dump)(struct context *context,
1577*d83cc019SAndroid Build Coastguard Worker const struct bdb_block *block);
1578*d83cc019SAndroid Build Coastguard Worker };
1579*d83cc019SAndroid Build Coastguard Worker
1580*d83cc019SAndroid Build Coastguard Worker struct dumper dumpers[] = {
1581*d83cc019SAndroid Build Coastguard Worker {
1582*d83cc019SAndroid Build Coastguard Worker .id = BDB_GENERAL_FEATURES,
1583*d83cc019SAndroid Build Coastguard Worker .name = "General features block",
1584*d83cc019SAndroid Build Coastguard Worker .dump = dump_general_features,
1585*d83cc019SAndroid Build Coastguard Worker },
1586*d83cc019SAndroid Build Coastguard Worker {
1587*d83cc019SAndroid Build Coastguard Worker .id = BDB_GENERAL_DEFINITIONS,
1588*d83cc019SAndroid Build Coastguard Worker .name = "General definitions block",
1589*d83cc019SAndroid Build Coastguard Worker .dump = dump_general_definitions,
1590*d83cc019SAndroid Build Coastguard Worker },
1591*d83cc019SAndroid Build Coastguard Worker {
1592*d83cc019SAndroid Build Coastguard Worker .id = BDB_CHILD_DEVICE_TABLE,
1593*d83cc019SAndroid Build Coastguard Worker .name = "Legacy child devices block",
1594*d83cc019SAndroid Build Coastguard Worker .dump = dump_legacy_child_devices,
1595*d83cc019SAndroid Build Coastguard Worker },
1596*d83cc019SAndroid Build Coastguard Worker {
1597*d83cc019SAndroid Build Coastguard Worker .id = BDB_LVDS_OPTIONS,
1598*d83cc019SAndroid Build Coastguard Worker .name = "LVDS options block",
1599*d83cc019SAndroid Build Coastguard Worker .dump = dump_lvds_options,
1600*d83cc019SAndroid Build Coastguard Worker },
1601*d83cc019SAndroid Build Coastguard Worker {
1602*d83cc019SAndroid Build Coastguard Worker .id = BDB_LVDS_LFP_DATA_PTRS,
1603*d83cc019SAndroid Build Coastguard Worker .name = "LVDS timing pointer data",
1604*d83cc019SAndroid Build Coastguard Worker .dump = dump_lvds_ptr_data,
1605*d83cc019SAndroid Build Coastguard Worker },
1606*d83cc019SAndroid Build Coastguard Worker {
1607*d83cc019SAndroid Build Coastguard Worker .id = BDB_LVDS_LFP_DATA,
1608*d83cc019SAndroid Build Coastguard Worker .name = "LVDS panel data block",
1609*d83cc019SAndroid Build Coastguard Worker .dump = dump_lvds_data,
1610*d83cc019SAndroid Build Coastguard Worker },
1611*d83cc019SAndroid Build Coastguard Worker {
1612*d83cc019SAndroid Build Coastguard Worker .id = BDB_LVDS_BACKLIGHT,
1613*d83cc019SAndroid Build Coastguard Worker .name = "Backlight info block",
1614*d83cc019SAndroid Build Coastguard Worker .dump = dump_backlight_info,
1615*d83cc019SAndroid Build Coastguard Worker },
1616*d83cc019SAndroid Build Coastguard Worker {
1617*d83cc019SAndroid Build Coastguard Worker .id = BDB_SDVO_LVDS_OPTIONS,
1618*d83cc019SAndroid Build Coastguard Worker .name = "SDVO LVDS options block",
1619*d83cc019SAndroid Build Coastguard Worker .dump = dump_sdvo_lvds_options,
1620*d83cc019SAndroid Build Coastguard Worker },
1621*d83cc019SAndroid Build Coastguard Worker {
1622*d83cc019SAndroid Build Coastguard Worker .id = BDB_SDVO_PANEL_DTDS,
1623*d83cc019SAndroid Build Coastguard Worker .name = "SDVO panel dtds",
1624*d83cc019SAndroid Build Coastguard Worker .dump = dump_sdvo_panel_dtds,
1625*d83cc019SAndroid Build Coastguard Worker },
1626*d83cc019SAndroid Build Coastguard Worker {
1627*d83cc019SAndroid Build Coastguard Worker .id = BDB_DRIVER_FEATURES,
1628*d83cc019SAndroid Build Coastguard Worker .name = "Driver feature data block",
1629*d83cc019SAndroid Build Coastguard Worker .dump = dump_driver_feature,
1630*d83cc019SAndroid Build Coastguard Worker },
1631*d83cc019SAndroid Build Coastguard Worker {
1632*d83cc019SAndroid Build Coastguard Worker .id = BDB_EDP,
1633*d83cc019SAndroid Build Coastguard Worker .name = "eDP block",
1634*d83cc019SAndroid Build Coastguard Worker .dump = dump_edp,
1635*d83cc019SAndroid Build Coastguard Worker },
1636*d83cc019SAndroid Build Coastguard Worker {
1637*d83cc019SAndroid Build Coastguard Worker .id = BDB_PSR,
1638*d83cc019SAndroid Build Coastguard Worker .name = "PSR block",
1639*d83cc019SAndroid Build Coastguard Worker .dump = dump_psr,
1640*d83cc019SAndroid Build Coastguard Worker },
1641*d83cc019SAndroid Build Coastguard Worker {
1642*d83cc019SAndroid Build Coastguard Worker .id = BDB_MIPI_CONFIG,
1643*d83cc019SAndroid Build Coastguard Worker .name = "MIPI configuration block",
1644*d83cc019SAndroid Build Coastguard Worker .dump = dump_mipi_config,
1645*d83cc019SAndroid Build Coastguard Worker },
1646*d83cc019SAndroid Build Coastguard Worker {
1647*d83cc019SAndroid Build Coastguard Worker .id = BDB_MIPI_SEQUENCE,
1648*d83cc019SAndroid Build Coastguard Worker .name = "MIPI sequence block",
1649*d83cc019SAndroid Build Coastguard Worker .dump = dump_mipi_sequence,
1650*d83cc019SAndroid Build Coastguard Worker },
1651*d83cc019SAndroid Build Coastguard Worker };
1652*d83cc019SAndroid Build Coastguard Worker
hex_dump(const void * data,uint32_t size)1653*d83cc019SAndroid Build Coastguard Worker static void hex_dump(const void *data, uint32_t size)
1654*d83cc019SAndroid Build Coastguard Worker {
1655*d83cc019SAndroid Build Coastguard Worker int i;
1656*d83cc019SAndroid Build Coastguard Worker const uint8_t *p = data;
1657*d83cc019SAndroid Build Coastguard Worker
1658*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < size; i++) {
1659*d83cc019SAndroid Build Coastguard Worker if (i % 16 == 0)
1660*d83cc019SAndroid Build Coastguard Worker printf("\t%04x: ", i);
1661*d83cc019SAndroid Build Coastguard Worker printf("%02x", p[i]);
1662*d83cc019SAndroid Build Coastguard Worker if (i % 16 == 15) {
1663*d83cc019SAndroid Build Coastguard Worker if (i + 1 < size)
1664*d83cc019SAndroid Build Coastguard Worker printf("\n");
1665*d83cc019SAndroid Build Coastguard Worker } else if (i % 8 == 7) {
1666*d83cc019SAndroid Build Coastguard Worker printf(" ");
1667*d83cc019SAndroid Build Coastguard Worker } else {
1668*d83cc019SAndroid Build Coastguard Worker printf(" ");
1669*d83cc019SAndroid Build Coastguard Worker }
1670*d83cc019SAndroid Build Coastguard Worker }
1671*d83cc019SAndroid Build Coastguard Worker printf("\n\n");
1672*d83cc019SAndroid Build Coastguard Worker }
1673*d83cc019SAndroid Build Coastguard Worker
hex_dump_block(const struct bdb_block * block)1674*d83cc019SAndroid Build Coastguard Worker static void hex_dump_block(const struct bdb_block *block)
1675*d83cc019SAndroid Build Coastguard Worker {
1676*d83cc019SAndroid Build Coastguard Worker hex_dump(block->data, block->size);
1677*d83cc019SAndroid Build Coastguard Worker }
1678*d83cc019SAndroid Build Coastguard Worker
dump_section(struct context * context,int section_id)1679*d83cc019SAndroid Build Coastguard Worker static bool dump_section(struct context *context, int section_id)
1680*d83cc019SAndroid Build Coastguard Worker {
1681*d83cc019SAndroid Build Coastguard Worker struct dumper *dumper = NULL;
1682*d83cc019SAndroid Build Coastguard Worker struct bdb_block *block;
1683*d83cc019SAndroid Build Coastguard Worker int i;
1684*d83cc019SAndroid Build Coastguard Worker
1685*d83cc019SAndroid Build Coastguard Worker block = find_section(context, section_id);
1686*d83cc019SAndroid Build Coastguard Worker if (!block)
1687*d83cc019SAndroid Build Coastguard Worker return false;
1688*d83cc019SAndroid Build Coastguard Worker
1689*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(dumpers); i++) {
1690*d83cc019SAndroid Build Coastguard Worker if (block->id == dumpers[i].id) {
1691*d83cc019SAndroid Build Coastguard Worker dumper = &dumpers[i];
1692*d83cc019SAndroid Build Coastguard Worker break;
1693*d83cc019SAndroid Build Coastguard Worker }
1694*d83cc019SAndroid Build Coastguard Worker }
1695*d83cc019SAndroid Build Coastguard Worker
1696*d83cc019SAndroid Build Coastguard Worker if (dumper && dumper->name)
1697*d83cc019SAndroid Build Coastguard Worker printf("BDB block %d - %s:\n", block->id, dumper->name);
1698*d83cc019SAndroid Build Coastguard Worker else
1699*d83cc019SAndroid Build Coastguard Worker printf("BDB block %d - Unknown, no decoding available:\n",
1700*d83cc019SAndroid Build Coastguard Worker block->id);
1701*d83cc019SAndroid Build Coastguard Worker
1702*d83cc019SAndroid Build Coastguard Worker if (context->hexdump)
1703*d83cc019SAndroid Build Coastguard Worker hex_dump_block(block);
1704*d83cc019SAndroid Build Coastguard Worker if (dumper && dumper->dump)
1705*d83cc019SAndroid Build Coastguard Worker dumper->dump(context, block);
1706*d83cc019SAndroid Build Coastguard Worker printf("\n");
1707*d83cc019SAndroid Build Coastguard Worker
1708*d83cc019SAndroid Build Coastguard Worker free(block);
1709*d83cc019SAndroid Build Coastguard Worker
1710*d83cc019SAndroid Build Coastguard Worker return true;
1711*d83cc019SAndroid Build Coastguard Worker }
1712*d83cc019SAndroid Build Coastguard Worker
1713*d83cc019SAndroid Build Coastguard Worker /* print a description of the VBT of the form <bdb-version>-<vbt-signature> */
print_description(struct context * context)1714*d83cc019SAndroid Build Coastguard Worker static void print_description(struct context *context)
1715*d83cc019SAndroid Build Coastguard Worker {
1716*d83cc019SAndroid Build Coastguard Worker const struct vbt_header *vbt = context->vbt;
1717*d83cc019SAndroid Build Coastguard Worker const struct bdb_header *bdb = context->bdb;
1718*d83cc019SAndroid Build Coastguard Worker char *desc = strndup((char *)vbt->signature, sizeof(vbt->signature));
1719*d83cc019SAndroid Build Coastguard Worker char *p;
1720*d83cc019SAndroid Build Coastguard Worker
1721*d83cc019SAndroid Build Coastguard Worker for (p = desc + strlen(desc) - 1; p >= desc && isspace(*p); p--)
1722*d83cc019SAndroid Build Coastguard Worker *p = '\0';
1723*d83cc019SAndroid Build Coastguard Worker
1724*d83cc019SAndroid Build Coastguard Worker for (p = desc; *p; p++) {
1725*d83cc019SAndroid Build Coastguard Worker if (!isalnum(*p))
1726*d83cc019SAndroid Build Coastguard Worker *p = '-';
1727*d83cc019SAndroid Build Coastguard Worker else
1728*d83cc019SAndroid Build Coastguard Worker *p = tolower(*p);
1729*d83cc019SAndroid Build Coastguard Worker }
1730*d83cc019SAndroid Build Coastguard Worker
1731*d83cc019SAndroid Build Coastguard Worker p = desc;
1732*d83cc019SAndroid Build Coastguard Worker if (strncmp(p, "-vbt-", 5) == 0)
1733*d83cc019SAndroid Build Coastguard Worker p += 5;
1734*d83cc019SAndroid Build Coastguard Worker
1735*d83cc019SAndroid Build Coastguard Worker printf("%d-%s\n", bdb->version, p);
1736*d83cc019SAndroid Build Coastguard Worker
1737*d83cc019SAndroid Build Coastguard Worker free (desc);
1738*d83cc019SAndroid Build Coastguard Worker }
1739*d83cc019SAndroid Build Coastguard Worker
dump_headers(struct context * context)1740*d83cc019SAndroid Build Coastguard Worker static void dump_headers(struct context *context)
1741*d83cc019SAndroid Build Coastguard Worker {
1742*d83cc019SAndroid Build Coastguard Worker const struct vbt_header *vbt = context->vbt;
1743*d83cc019SAndroid Build Coastguard Worker const struct bdb_header *bdb = context->bdb;
1744*d83cc019SAndroid Build Coastguard Worker int i, j = 0;
1745*d83cc019SAndroid Build Coastguard Worker
1746*d83cc019SAndroid Build Coastguard Worker printf("VBT header:\n");
1747*d83cc019SAndroid Build Coastguard Worker if (context->hexdump)
1748*d83cc019SAndroid Build Coastguard Worker hex_dump(vbt, vbt->header_size);
1749*d83cc019SAndroid Build Coastguard Worker
1750*d83cc019SAndroid Build Coastguard Worker printf("\tVBT signature:\t\t\"%.*s\"\n",
1751*d83cc019SAndroid Build Coastguard Worker (int)sizeof(vbt->signature), vbt->signature);
1752*d83cc019SAndroid Build Coastguard Worker printf("\tVBT version:\t\t0x%04x (%d.%d)\n", vbt->version,
1753*d83cc019SAndroid Build Coastguard Worker vbt->version / 100, vbt->version % 100);
1754*d83cc019SAndroid Build Coastguard Worker printf("\tVBT header size:\t0x%04x (%u)\n",
1755*d83cc019SAndroid Build Coastguard Worker vbt->header_size, vbt->header_size);
1756*d83cc019SAndroid Build Coastguard Worker printf("\tVBT size:\t\t0x%04x (%u)\n", vbt->vbt_size, vbt->vbt_size);
1757*d83cc019SAndroid Build Coastguard Worker printf("\tVBT checksum:\t\t0x%02x\n", vbt->vbt_checksum);
1758*d83cc019SAndroid Build Coastguard Worker printf("\tBDB offset:\t\t0x%08x (%u)\n", vbt->bdb_offset, vbt->bdb_offset);
1759*d83cc019SAndroid Build Coastguard Worker
1760*d83cc019SAndroid Build Coastguard Worker printf("\n");
1761*d83cc019SAndroid Build Coastguard Worker
1762*d83cc019SAndroid Build Coastguard Worker printf("BDB header:\n");
1763*d83cc019SAndroid Build Coastguard Worker if (context->hexdump)
1764*d83cc019SAndroid Build Coastguard Worker hex_dump(bdb, bdb->header_size);
1765*d83cc019SAndroid Build Coastguard Worker
1766*d83cc019SAndroid Build Coastguard Worker printf("\tBDB signature:\t\t\"%.*s\"\n",
1767*d83cc019SAndroid Build Coastguard Worker (int)sizeof(bdb->signature), bdb->signature);
1768*d83cc019SAndroid Build Coastguard Worker printf("\tBDB version:\t\t%d\n", bdb->version);
1769*d83cc019SAndroid Build Coastguard Worker printf("\tBDB header size:\t0x%04x (%u)\n",
1770*d83cc019SAndroid Build Coastguard Worker bdb->header_size, bdb->header_size);
1771*d83cc019SAndroid Build Coastguard Worker printf("\tBDB size:\t\t0x%04x (%u)\n", bdb->bdb_size, bdb->bdb_size);
1772*d83cc019SAndroid Build Coastguard Worker printf("\n");
1773*d83cc019SAndroid Build Coastguard Worker
1774*d83cc019SAndroid Build Coastguard Worker printf("BDB blocks present:");
1775*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 256; i++) {
1776*d83cc019SAndroid Build Coastguard Worker struct bdb_block *block;
1777*d83cc019SAndroid Build Coastguard Worker
1778*d83cc019SAndroid Build Coastguard Worker block = find_section(context, i);
1779*d83cc019SAndroid Build Coastguard Worker if (!block)
1780*d83cc019SAndroid Build Coastguard Worker continue;
1781*d83cc019SAndroid Build Coastguard Worker
1782*d83cc019SAndroid Build Coastguard Worker if (j++ % 16)
1783*d83cc019SAndroid Build Coastguard Worker printf(" %3d", i);
1784*d83cc019SAndroid Build Coastguard Worker else
1785*d83cc019SAndroid Build Coastguard Worker printf("\n\t%3d", i);
1786*d83cc019SAndroid Build Coastguard Worker
1787*d83cc019SAndroid Build Coastguard Worker free(block);
1788*d83cc019SAndroid Build Coastguard Worker }
1789*d83cc019SAndroid Build Coastguard Worker printf("\n\n");
1790*d83cc019SAndroid Build Coastguard Worker }
1791*d83cc019SAndroid Build Coastguard Worker
1792*d83cc019SAndroid Build Coastguard Worker enum opt {
1793*d83cc019SAndroid Build Coastguard Worker OPT_UNKNOWN = '?',
1794*d83cc019SAndroid Build Coastguard Worker OPT_END = -1,
1795*d83cc019SAndroid Build Coastguard Worker OPT_FILE,
1796*d83cc019SAndroid Build Coastguard Worker OPT_DEVID,
1797*d83cc019SAndroid Build Coastguard Worker OPT_PANEL_TYPE,
1798*d83cc019SAndroid Build Coastguard Worker OPT_ALL_PANELS,
1799*d83cc019SAndroid Build Coastguard Worker OPT_HEXDUMP,
1800*d83cc019SAndroid Build Coastguard Worker OPT_BLOCK,
1801*d83cc019SAndroid Build Coastguard Worker OPT_USAGE,
1802*d83cc019SAndroid Build Coastguard Worker OPT_HEADER,
1803*d83cc019SAndroid Build Coastguard Worker OPT_DESCRIBE,
1804*d83cc019SAndroid Build Coastguard Worker };
1805*d83cc019SAndroid Build Coastguard Worker
usage(const char * toolname)1806*d83cc019SAndroid Build Coastguard Worker static void usage(const char *toolname)
1807*d83cc019SAndroid Build Coastguard Worker {
1808*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "usage: %s", toolname);
1809*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, " --file=<rom_file>"
1810*d83cc019SAndroid Build Coastguard Worker " [--devid=<device_id>]"
1811*d83cc019SAndroid Build Coastguard Worker " [--panel-type=<panel_type>]"
1812*d83cc019SAndroid Build Coastguard Worker " [--all-panels]"
1813*d83cc019SAndroid Build Coastguard Worker " [--hexdump]"
1814*d83cc019SAndroid Build Coastguard Worker " [--block=<block_no>]"
1815*d83cc019SAndroid Build Coastguard Worker " [--header]"
1816*d83cc019SAndroid Build Coastguard Worker " [--describe]"
1817*d83cc019SAndroid Build Coastguard Worker " [--help]\n");
1818*d83cc019SAndroid Build Coastguard Worker }
1819*d83cc019SAndroid Build Coastguard Worker
main(int argc,char ** argv)1820*d83cc019SAndroid Build Coastguard Worker int main(int argc, char **argv)
1821*d83cc019SAndroid Build Coastguard Worker {
1822*d83cc019SAndroid Build Coastguard Worker uint8_t *VBIOS;
1823*d83cc019SAndroid Build Coastguard Worker int index;
1824*d83cc019SAndroid Build Coastguard Worker enum opt opt;
1825*d83cc019SAndroid Build Coastguard Worker int fd;
1826*d83cc019SAndroid Build Coastguard Worker struct vbt_header *vbt = NULL;
1827*d83cc019SAndroid Build Coastguard Worker int vbt_off, bdb_off, i;
1828*d83cc019SAndroid Build Coastguard Worker const char *filename = NULL;
1829*d83cc019SAndroid Build Coastguard Worker const char *toolname = argv[0];
1830*d83cc019SAndroid Build Coastguard Worker struct stat finfo;
1831*d83cc019SAndroid Build Coastguard Worker int size;
1832*d83cc019SAndroid Build Coastguard Worker struct context context = {
1833*d83cc019SAndroid Build Coastguard Worker .panel_type = -1,
1834*d83cc019SAndroid Build Coastguard Worker };
1835*d83cc019SAndroid Build Coastguard Worker char *endp;
1836*d83cc019SAndroid Build Coastguard Worker int block_number = -1;
1837*d83cc019SAndroid Build Coastguard Worker bool header_only = false, describe = false;
1838*d83cc019SAndroid Build Coastguard Worker
1839*d83cc019SAndroid Build Coastguard Worker static struct option options[] = {
1840*d83cc019SAndroid Build Coastguard Worker { "file", required_argument, NULL, OPT_FILE },
1841*d83cc019SAndroid Build Coastguard Worker { "devid", required_argument, NULL, OPT_DEVID },
1842*d83cc019SAndroid Build Coastguard Worker { "panel-type", required_argument, NULL, OPT_PANEL_TYPE },
1843*d83cc019SAndroid Build Coastguard Worker { "all-panels", no_argument, NULL, OPT_ALL_PANELS },
1844*d83cc019SAndroid Build Coastguard Worker { "hexdump", no_argument, NULL, OPT_HEXDUMP },
1845*d83cc019SAndroid Build Coastguard Worker { "block", required_argument, NULL, OPT_BLOCK },
1846*d83cc019SAndroid Build Coastguard Worker { "header", no_argument, NULL, OPT_HEADER },
1847*d83cc019SAndroid Build Coastguard Worker { "describe", no_argument, NULL, OPT_DESCRIBE },
1848*d83cc019SAndroid Build Coastguard Worker { "help", no_argument, NULL, OPT_USAGE },
1849*d83cc019SAndroid Build Coastguard Worker { 0 }
1850*d83cc019SAndroid Build Coastguard Worker };
1851*d83cc019SAndroid Build Coastguard Worker
1852*d83cc019SAndroid Build Coastguard Worker for (opt = 0; opt != OPT_END; ) {
1853*d83cc019SAndroid Build Coastguard Worker opt = getopt_long(argc, argv, "", options, &index);
1854*d83cc019SAndroid Build Coastguard Worker
1855*d83cc019SAndroid Build Coastguard Worker switch (opt) {
1856*d83cc019SAndroid Build Coastguard Worker case OPT_FILE:
1857*d83cc019SAndroid Build Coastguard Worker filename = optarg;
1858*d83cc019SAndroid Build Coastguard Worker break;
1859*d83cc019SAndroid Build Coastguard Worker case OPT_DEVID:
1860*d83cc019SAndroid Build Coastguard Worker context.devid = strtoul(optarg, &endp, 16);
1861*d83cc019SAndroid Build Coastguard Worker if (!context.devid || *endp) {
1862*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "invalid devid '%s'\n", optarg);
1863*d83cc019SAndroid Build Coastguard Worker return EXIT_FAILURE;
1864*d83cc019SAndroid Build Coastguard Worker }
1865*d83cc019SAndroid Build Coastguard Worker break;
1866*d83cc019SAndroid Build Coastguard Worker case OPT_PANEL_TYPE:
1867*d83cc019SAndroid Build Coastguard Worker context.panel_type = strtoul(optarg, &endp, 0);
1868*d83cc019SAndroid Build Coastguard Worker if (*endp || context.panel_type > 15) {
1869*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "invalid panel type '%s'\n",
1870*d83cc019SAndroid Build Coastguard Worker optarg);
1871*d83cc019SAndroid Build Coastguard Worker return EXIT_FAILURE;
1872*d83cc019SAndroid Build Coastguard Worker }
1873*d83cc019SAndroid Build Coastguard Worker break;
1874*d83cc019SAndroid Build Coastguard Worker case OPT_ALL_PANELS:
1875*d83cc019SAndroid Build Coastguard Worker context.dump_all_panel_types = true;
1876*d83cc019SAndroid Build Coastguard Worker break;
1877*d83cc019SAndroid Build Coastguard Worker case OPT_HEXDUMP:
1878*d83cc019SAndroid Build Coastguard Worker context.hexdump = true;
1879*d83cc019SAndroid Build Coastguard Worker break;
1880*d83cc019SAndroid Build Coastguard Worker case OPT_BLOCK:
1881*d83cc019SAndroid Build Coastguard Worker block_number = strtoul(optarg, &endp, 0);
1882*d83cc019SAndroid Build Coastguard Worker if (*endp) {
1883*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "invalid block number '%s'\n",
1884*d83cc019SAndroid Build Coastguard Worker optarg);
1885*d83cc019SAndroid Build Coastguard Worker return EXIT_FAILURE;
1886*d83cc019SAndroid Build Coastguard Worker }
1887*d83cc019SAndroid Build Coastguard Worker break;
1888*d83cc019SAndroid Build Coastguard Worker case OPT_HEADER:
1889*d83cc019SAndroid Build Coastguard Worker header_only = true;
1890*d83cc019SAndroid Build Coastguard Worker break;
1891*d83cc019SAndroid Build Coastguard Worker case OPT_DESCRIBE:
1892*d83cc019SAndroid Build Coastguard Worker describe = true;
1893*d83cc019SAndroid Build Coastguard Worker break;
1894*d83cc019SAndroid Build Coastguard Worker case OPT_END:
1895*d83cc019SAndroid Build Coastguard Worker break;
1896*d83cc019SAndroid Build Coastguard Worker case OPT_USAGE: /* fall-through */
1897*d83cc019SAndroid Build Coastguard Worker case OPT_UNKNOWN:
1898*d83cc019SAndroid Build Coastguard Worker usage(toolname);
1899*d83cc019SAndroid Build Coastguard Worker return EXIT_FAILURE;
1900*d83cc019SAndroid Build Coastguard Worker }
1901*d83cc019SAndroid Build Coastguard Worker }
1902*d83cc019SAndroid Build Coastguard Worker
1903*d83cc019SAndroid Build Coastguard Worker argc -= optind;
1904*d83cc019SAndroid Build Coastguard Worker argv += optind;
1905*d83cc019SAndroid Build Coastguard Worker
1906*d83cc019SAndroid Build Coastguard Worker if (!filename) {
1907*d83cc019SAndroid Build Coastguard Worker if (argc == 1) {
1908*d83cc019SAndroid Build Coastguard Worker /* for backwards compatibility */
1909*d83cc019SAndroid Build Coastguard Worker filename = argv[0];
1910*d83cc019SAndroid Build Coastguard Worker } else {
1911*d83cc019SAndroid Build Coastguard Worker usage(toolname);
1912*d83cc019SAndroid Build Coastguard Worker return EXIT_FAILURE;
1913*d83cc019SAndroid Build Coastguard Worker }
1914*d83cc019SAndroid Build Coastguard Worker }
1915*d83cc019SAndroid Build Coastguard Worker
1916*d83cc019SAndroid Build Coastguard Worker fd = open(filename, O_RDONLY);
1917*d83cc019SAndroid Build Coastguard Worker if (fd == -1) {
1918*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Couldn't open \"%s\": %s\n",
1919*d83cc019SAndroid Build Coastguard Worker filename, strerror(errno));
1920*d83cc019SAndroid Build Coastguard Worker return EXIT_FAILURE;
1921*d83cc019SAndroid Build Coastguard Worker }
1922*d83cc019SAndroid Build Coastguard Worker
1923*d83cc019SAndroid Build Coastguard Worker if (stat(filename, &finfo)) {
1924*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Failed to stat \"%s\": %s\n",
1925*d83cc019SAndroid Build Coastguard Worker filename, strerror(errno));
1926*d83cc019SAndroid Build Coastguard Worker return EXIT_FAILURE;
1927*d83cc019SAndroid Build Coastguard Worker }
1928*d83cc019SAndroid Build Coastguard Worker size = finfo.st_size;
1929*d83cc019SAndroid Build Coastguard Worker
1930*d83cc019SAndroid Build Coastguard Worker if (size == 0) {
1931*d83cc019SAndroid Build Coastguard Worker int len = 0, ret;
1932*d83cc019SAndroid Build Coastguard Worker size = 8192;
1933*d83cc019SAndroid Build Coastguard Worker VBIOS = malloc (size);
1934*d83cc019SAndroid Build Coastguard Worker while ((ret = read(fd, VBIOS + len, size - len))) {
1935*d83cc019SAndroid Build Coastguard Worker if (ret < 0) {
1936*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Failed to read \"%s\": %s\n",
1937*d83cc019SAndroid Build Coastguard Worker filename, strerror(errno));
1938*d83cc019SAndroid Build Coastguard Worker return EXIT_FAILURE;
1939*d83cc019SAndroid Build Coastguard Worker }
1940*d83cc019SAndroid Build Coastguard Worker
1941*d83cc019SAndroid Build Coastguard Worker len += ret;
1942*d83cc019SAndroid Build Coastguard Worker if (len == size) {
1943*d83cc019SAndroid Build Coastguard Worker size *= 2;
1944*d83cc019SAndroid Build Coastguard Worker VBIOS = realloc(VBIOS, size);
1945*d83cc019SAndroid Build Coastguard Worker }
1946*d83cc019SAndroid Build Coastguard Worker }
1947*d83cc019SAndroid Build Coastguard Worker } else {
1948*d83cc019SAndroid Build Coastguard Worker VBIOS = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
1949*d83cc019SAndroid Build Coastguard Worker if (VBIOS == MAP_FAILED) {
1950*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Failed to map \"%s\": %s\n",
1951*d83cc019SAndroid Build Coastguard Worker filename, strerror(errno));
1952*d83cc019SAndroid Build Coastguard Worker return EXIT_FAILURE;
1953*d83cc019SAndroid Build Coastguard Worker }
1954*d83cc019SAndroid Build Coastguard Worker }
1955*d83cc019SAndroid Build Coastguard Worker
1956*d83cc019SAndroid Build Coastguard Worker /* Scour memory looking for the VBT signature */
1957*d83cc019SAndroid Build Coastguard Worker for (i = 0; i + 4 < size; i++) {
1958*d83cc019SAndroid Build Coastguard Worker if (!memcmp(VBIOS + i, "$VBT", 4)) {
1959*d83cc019SAndroid Build Coastguard Worker vbt_off = i;
1960*d83cc019SAndroid Build Coastguard Worker vbt = (struct vbt_header *)(VBIOS + i);
1961*d83cc019SAndroid Build Coastguard Worker break;
1962*d83cc019SAndroid Build Coastguard Worker }
1963*d83cc019SAndroid Build Coastguard Worker }
1964*d83cc019SAndroid Build Coastguard Worker
1965*d83cc019SAndroid Build Coastguard Worker if (!vbt) {
1966*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "VBT signature missing\n");
1967*d83cc019SAndroid Build Coastguard Worker return EXIT_FAILURE;
1968*d83cc019SAndroid Build Coastguard Worker }
1969*d83cc019SAndroid Build Coastguard Worker
1970*d83cc019SAndroid Build Coastguard Worker bdb_off = vbt_off + vbt->bdb_offset;
1971*d83cc019SAndroid Build Coastguard Worker if (bdb_off >= size - sizeof(struct bdb_header)) {
1972*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Invalid VBT found, BDB points beyond end of data block\n");
1973*d83cc019SAndroid Build Coastguard Worker return EXIT_FAILURE;
1974*d83cc019SAndroid Build Coastguard Worker }
1975*d83cc019SAndroid Build Coastguard Worker
1976*d83cc019SAndroid Build Coastguard Worker context.vbt = vbt;
1977*d83cc019SAndroid Build Coastguard Worker context.bdb = (const struct bdb_header *)(VBIOS + bdb_off);
1978*d83cc019SAndroid Build Coastguard Worker context.size = size;
1979*d83cc019SAndroid Build Coastguard Worker
1980*d83cc019SAndroid Build Coastguard Worker if (!context.devid) {
1981*d83cc019SAndroid Build Coastguard Worker const char *devid_string = getenv("DEVICE");
1982*d83cc019SAndroid Build Coastguard Worker if (devid_string)
1983*d83cc019SAndroid Build Coastguard Worker context.devid = strtoul(devid_string, NULL, 16);
1984*d83cc019SAndroid Build Coastguard Worker }
1985*d83cc019SAndroid Build Coastguard Worker if (!context.devid)
1986*d83cc019SAndroid Build Coastguard Worker context.devid = get_device_id(VBIOS, size);
1987*d83cc019SAndroid Build Coastguard Worker if (!context.devid)
1988*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Warning: could not find PCI device ID!\n");
1989*d83cc019SAndroid Build Coastguard Worker
1990*d83cc019SAndroid Build Coastguard Worker if (context.panel_type == -1)
1991*d83cc019SAndroid Build Coastguard Worker context.panel_type = get_panel_type(&context);
1992*d83cc019SAndroid Build Coastguard Worker if (context.panel_type == -1) {
1993*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Warning: panel type not set, using 0\n");
1994*d83cc019SAndroid Build Coastguard Worker context.panel_type = 0;
1995*d83cc019SAndroid Build Coastguard Worker }
1996*d83cc019SAndroid Build Coastguard Worker
1997*d83cc019SAndroid Build Coastguard Worker if (describe) {
1998*d83cc019SAndroid Build Coastguard Worker print_description(&context);
1999*d83cc019SAndroid Build Coastguard Worker } else if (header_only) {
2000*d83cc019SAndroid Build Coastguard Worker dump_headers(&context);
2001*d83cc019SAndroid Build Coastguard Worker } else if (block_number != -1) {
2002*d83cc019SAndroid Build Coastguard Worker /* dump specific section only */
2003*d83cc019SAndroid Build Coastguard Worker if (!dump_section(&context, block_number)) {
2004*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Block %d not found\n", block_number);
2005*d83cc019SAndroid Build Coastguard Worker return EXIT_FAILURE;
2006*d83cc019SAndroid Build Coastguard Worker }
2007*d83cc019SAndroid Build Coastguard Worker } else {
2008*d83cc019SAndroid Build Coastguard Worker dump_headers(&context);
2009*d83cc019SAndroid Build Coastguard Worker
2010*d83cc019SAndroid Build Coastguard Worker /* dump all sections */
2011*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 256; i++)
2012*d83cc019SAndroid Build Coastguard Worker dump_section(&context, i);
2013*d83cc019SAndroid Build Coastguard Worker }
2014*d83cc019SAndroid Build Coastguard Worker
2015*d83cc019SAndroid Build Coastguard Worker return 0;
2016*d83cc019SAndroid Build Coastguard Worker }
2017