[Intel-gfx] [i-g-t PATCH 06/10] tools/intel_vbt_decode: migrate child device dumping to kernel struct
Jani Nikula
jani.nikula at intel.com
Mon Aug 28 12:19:58 UTC 2017
Retain the legacy definition for the obsolete child device block, at
least for now. No functional changes.
Signed-off-by: Jani Nikula <jani.nikula at intel.com>
---
tools/intel_bios.h | 58 +----------------------------
tools/intel_vbt_decode.c | 45 ++++++++++-------------
tools/intel_vbt_defs.h | 96 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 118 insertions(+), 81 deletions(-)
diff --git a/tools/intel_bios.h b/tools/intel_bios.h
index 8d1bf7ae0c81..3f441a6da17b 100644
--- a/tools/intel_bios.h
+++ b/tools/intel_bios.h
@@ -72,7 +72,7 @@
#define DEVICE_PORT_DPC 8
#define DEVICE_PORT_DPD 9
-struct child_device_config {
+struct legacy_child_device_config {
uint16_t handle;
uint16_t device_type; /* See DEVICE_TYPE_* above */
uint8_t device_id[10];
@@ -94,65 +94,11 @@ struct child_device_config {
uint8_t dvo_function;
} __attribute__ ((packed));
-struct efp_child_device_config {
- uint16_t handle;
- uint16_t device_type;
- uint8_t i2c_speed;
- uint8_t dp_onboard_redriver; /* 158 */
- uint8_t dp_ondock_redriver; /* 158 */
- uint8_t hdmi_level_shifter_value:4; /* 169 */
- uint8_t hdmi_max_data_rate:4; /* 204 */
- uint16_t dtd_buf_ptr; /* 161 */
- uint8_t edidless_efp:1; /* 161 */
- uint8_t compression_enable:1; /* 198 */
- uint8_t compression_method:1; /* 198 */
- uint8_t ganged_edp:1; /* 202 */
- uint8_t skip0:4;
- uint8_t compression_structure_index:4; /* 198 */
- uint8_t skip1:4;
- uint8_t slave_port; /* 202 */
- uint8_t skip2;
- uint16_t addin_offset;
- uint8_t port;
- uint8_t i2c_pin; /* for add-in card */
- uint8_t slave_addr; /* for add-in card */
- uint8_t ddc_pin;
- uint16_t edid_ptr;
- uint8_t dvo_config;
- uint8_t efp_docked_port:1; /* 158 */
- uint8_t lane_reversal:1; /* 184 */
- uint8_t onboard_lspcon:1; /* 192 */
- uint8_t iboost_enable:1; /* 196 */
- uint8_t hpd_invert:1; /* BXT 196 */
- uint8_t slip3:3;
- uint8_t hdmi_compat:1;
- uint8_t dp_compat:1;
- uint8_t tmds_compat:1;
- uint8_t skip4:5;
- uint8_t aux_chan;
- uint8_t dongle_detect;
- uint8_t pipe_cap:2;
- uint8_t sdvo_stall:1; /* 158 */
- uint8_t hpd_status:2;
- uint8_t integrated_encoder:1;
- uint8_t skip5:2;
- uint8_t dvo_wiring;
- uint8_t mipi_bridge_type; /* 171 */
- uint16_t device_class_ext;
- uint8_t dvo_function;
- uint8_t dp_usb_type_c:1; /* 195 */
- uint8_t skip6:7;
- uint8_t dp_usb_type_c_2x_gpio_index; /* 195 */
- uint16_t dp_usb_type_c_2x_gpio_pin; /* 195 */
- uint8_t iboost_dp:4; /* 196 */
- uint8_t iboost_hdmi:4; /* 196 */
-} __attribute__ ((packed));
-
#define DEVICE_CHILD_SIZE 7
struct bdb_child_devices {
uint8_t child_structure_size;
- struct child_device_config children[DEVICE_CHILD_SIZE];
+ struct legacy_child_device_config children[DEVICE_CHILD_SIZE];
} __attribute__ ((packed));
struct blc_struct {
diff --git a/tools/intel_vbt_decode.c b/tools/intel_vbt_decode.c
index beb33672835e..711f29979418 100644
--- a/tools/intel_vbt_decode.c
+++ b/tools/intel_vbt_decode.c
@@ -383,6 +383,7 @@ static const char *efp_port(uint8_t type)
static void dump_child_device(struct context *context,
const struct child_device_config *child)
{
+ const struct child_device_config *efp = child;
char child_id[11];
if (!child->device_type)
@@ -399,8 +400,6 @@ static void dump_child_device(struct context *context,
printf("\t\tAIM offset: %d\n", child->addin_offset);
printf("\t\tDVO port: 0x%02x\n", child->dvo_port);
} else { /* 152+ have EFP blocks here */
- const struct efp_child_device_config *efp =
- (const struct efp_child_device_config *)child;
printf("\tEFP device info:\n");
printf("\t\tDevice handle: 0x%04x (%s)\n", efp->handle,
child_device_handle(efp->handle));
@@ -420,21 +419,21 @@ static void dump_child_device(struct context *context,
printf("\t\tCompression structure index: 0x%02x)\n", efp->compression_structure_index);
printf("\t\tSlave DDI port: 0x%02x (%s)\n", efp->slave_port, efp_port(efp->slave_port));
printf("\t\tAIM offset: %d\n", child->addin_offset);
- printf("\t\tPort: 0x%02x (%s)\n", efp->port, efp_port(efp->port));
+ printf("\t\tPort: 0x%02x (%s)\n", efp->dvo_port, efp_port(efp->dvo_port));
printf("\t\tAIM I2C pin: 0x%02x\n", efp->i2c_pin);
printf("\t\tAIM Slave address: 0x%02x\n", efp->slave_addr);
printf("\t\tDDC pin: 0x%02x\n", efp->ddc_pin);
printf("\t\tEDID buffer ptr: 0x%02x\n", efp->edid_ptr);
- printf("\t\tDVO config: 0x%02x\n", efp->dvo_config);
+ printf("\t\tDVO config: 0x%02x\n", efp->dvo_cfg);
printf("\t\tHPD sense invert: %s\n", YESNO(efp->hpd_invert));
- printf("\t\tIboost enable: %s\n", YESNO(efp->iboost_enable));
- printf("\t\tOnboard LSPCON: %s\n", YESNO(efp->onboard_lspcon));
+ printf("\t\tIboost enable: %s\n", YESNO(efp->iboost));
+ printf("\t\tOnboard LSPCON: %s\n", YESNO(efp->lspcon));
printf("\t\tLane reversal: %s\n", YESNO(efp->lane_reversal));
- printf("\t\tEFP routed through dock: %s\n", YESNO(efp->efp_docked_port));
- printf("\t\tHDMI compatible? %s\n", YESNO(efp->hdmi_compat));
- printf("\t\tDP compatible? %s\n", YESNO(efp->dp_compat));
- printf("\t\tTMDS compatible? %s\n", YESNO(efp->tmds_compat));
- printf("\t\tAux channel: 0x%02x\n", efp->aux_chan);
+ printf("\t\tEFP routed through dock: %s\n", YESNO(efp->efp_routed));
+ printf("\t\tHDMI compatible? %s\n", YESNO(efp->hdmi_support));
+ printf("\t\tDP compatible? %s\n", YESNO(efp->dp_support));
+ printf("\t\tTMDS compatible? %s\n", YESNO(efp->tmds_support));
+ printf("\t\tAux channel: 0x%02x\n", efp->aux_channel);
printf("\t\tDongle detect: 0x%02x\n", efp->dongle_detect);
printf("\t\tIntegrated encoder instead of SDVO: %s\n", YESNO(efp->integrated_encoder));
printf("\t\tHotplu connect status: 0x%02x\n", efp->hpd_status);
@@ -456,23 +455,19 @@ static void dump_child_device(struct context *context,
printf("(unknown value %d)\n", efp->mipi_bridge_type);
break;
}
- printf("\t\tDevice class extendsion: 0x%02x\n", efp->device_class_ext);
+ printf("\t\tDevice class extendsion: 0x%02x\n", efp->extended_type);
printf("\t\tDVO function: 0x%02x\n", efp->dvo_function);
}
if (context->bdb->version >= 195) {
- const struct efp_child_device_config *efp =
- (const struct efp_child_device_config *)child;
printf("\t\tDP USB type C support: %s\n", YESNO(efp->dp_usb_type_c));
- printf("\t\t2X DP GPIO index: 0x%02x\n", efp->dp_usb_type_c_2x_gpio_index);
- printf("\t\t2X DP GPIO pin number: 0x%02x\n", efp->dp_usb_type_c_2x_gpio_pin);
+ printf("\t\t2X DP GPIO index: 0x%02x\n", efp->dp_gpio_index);
+ printf("\t\t2X DP GPIO pin number: 0x%02x\n", efp->dp_gpio_pin_num);
}
if (context->bdb->version >= 196) {
- const struct efp_child_device_config *efp =
- (const struct efp_child_device_config *)child;
- printf("\t\tIBoost level for HDMI: 0x%02x\n", efp->iboost_hdmi);
- printf("\t\tIBoost level for DP/eDP: 0x%02x\n", efp->iboost_dp);
+ printf("\t\tIBoost level for HDMI: 0x%02x\n", efp->hdmi_iboost_level);
+ printf("\t\tIBoost level for DP/eDP: 0x%02x\n", efp->dp_iboost_level);
}
}
@@ -498,11 +493,11 @@ static void dump_general_definitions(struct context *context,
dump_child_device(context, (const void*)&defs->devices[i * defs->child_dev_size]);
}
-static void dump_child_devices(struct context *context,
- const struct bdb_block *block)
+static void dump_legacy_child_devices(struct context *context,
+ const struct bdb_block *block)
{
const struct bdb_child_devices *child_devs = block->data;
- const struct child_device_config *child;
+ const struct legacy_child_device_config *child;
int i;
for (i = 0; i < DEVICE_CHILD_SIZE; i++) {
@@ -1517,8 +1512,8 @@ struct dumper dumpers[] = {
},
{
.id = BDB_CHILD_DEVICE_TABLE,
- .name = "Child devices block",
- .dump = dump_child_devices,
+ .name = "Legacy child devices block",
+ .dump = dump_legacy_child_devices,
},
{
.id = BDB_LVDS_OPTIONS,
diff --git a/tools/intel_vbt_defs.h b/tools/intel_vbt_defs.h
index 8bdb2292747b..dcb6f36443ad 100644
--- a/tools/intel_vbt_defs.h
+++ b/tools/intel_vbt_defs.h
@@ -290,6 +290,102 @@ struct bdb_general_features {
#define LEGACY_CHILD_DEVICE_CONFIG_SIZE 33
+/*
+ * The child device config, aka the display device data structure, provides a
+ * description of a port and its configuration on the platform.
+ *
+ * The child device config size has been increased, and fields have been added
+ * and their meaning has changed over time. Care must be taken when accessing
+ * basically any of the fields to ensure the correct interpretation for the BDB
+ * version in question.
+ *
+ * When we copy the child device configs to dev_priv->vbt.child_dev, we reserve
+ * space for the full structure below, and initialize the tail not actually
+ * present in VBT to zeros. Accessing those fields is fine, as long as the
+ * default zero is taken into account, again according to the BDB version.
+ *
+ * BDB versions 155 and below are considered legacy, and version 155 seems to be
+ * a baseline for some of the VBT documentation. When adding new fields, please
+ * include the BDB version when the field was added, if it's above that.
+ */
+struct child_device_config {
+ u16 handle;
+ u16 device_type; /* See DEVICE_TYPE_* above */
+
+ union {
+ u8 device_id[10]; /* ascii string */
+ struct {
+ u8 i2c_speed;
+ u8 dp_onboard_redriver; /* 158 */
+ u8 dp_ondock_redriver; /* 158 */
+ u8 hdmi_level_shifter_value:4; /* 169 */
+ u8 hdmi_max_data_rate:4; /* 204 */
+ u16 dtd_buf_ptr; /* 161 */
+ u8 edidless_efp:1; /* 161 */
+ u8 compression_enable:1; /* 198 */
+ u8 compression_method:1; /* 198 */
+ u8 ganged_edp:1; /* 202 */
+ u8 reserved0:4;
+ u8 compression_structure_index:4; /* 198 */
+ u8 reserved1:4;
+ u8 slave_port; /* 202 */
+ u8 reserved2;
+ } __packed;
+ } __packed;
+
+ u16 addin_offset;
+ u8 dvo_port; /* See DEVICE_PORT_* and DVO_PORT_* above */
+ u8 i2c_pin;
+ u8 slave_addr;
+ u8 ddc_pin;
+ u16 edid_ptr;
+ u8 dvo_cfg; /* See DEVICE_CFG_* above */
+
+ union {
+ struct {
+ u8 dvo2_port;
+ u8 i2c2_pin;
+ u8 slave2_addr;
+ u8 ddc2_pin;
+ } __packed;
+ struct {
+ u8 efp_routed:1; /* 158 */
+ u8 lane_reversal:1; /* 184 */
+ u8 lspcon:1; /* 192 */
+ u8 iboost:1; /* 196 */
+ u8 hpd_invert:1; /* 196 */
+ u8 flag_reserved:3;
+ u8 hdmi_support:1; /* 158 */
+ u8 dp_support:1; /* 158 */
+ u8 tmds_support:1; /* 158 */
+ u8 support_reserved:5;
+ u8 aux_channel;
+ u8 dongle_detect;
+ } __packed;
+ } __packed;
+
+ u8 pipe_cap:2;
+ u8 sdvo_stall:1; /* 158 */
+ u8 hpd_status:2;
+ u8 integrated_encoder:1;
+ u8 capabilities_reserved:2;
+ u8 dvo_wiring; /* See DEVICE_WIRE_* above */
+
+ union {
+ u8 dvo2_wiring;
+ u8 mipi_bridge_type; /* 171 */
+ } __packed;
+
+ u16 extended_type;
+ u8 dvo_function;
+ u8 dp_usb_type_c:1; /* 195 */
+ u8 flags2_reserved:7; /* 195 */
+ u8 dp_gpio_index; /* 195 */
+ u16 dp_gpio_pin_num; /* 195 */
+ u8 dp_iboost_level:4; /* 196 */
+ u8 hdmi_iboost_level:4; /* 196 */
+} __packed;
+
struct bdb_general_definitions {
/* DDC GPIO */
u8 crt_ddc_gmbus_pin;
--
2.11.0
More information about the Intel-gfx
mailing list