|
@@ -452,7 +452,7 @@ parse_general_definitions(struct drm_i915_private *dev_priv,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static const union child_device_config *
|
|
|
+static const struct child_device_config *
|
|
|
child_device_ptr(const struct bdb_general_definitions *p_defs, int i)
|
|
|
{
|
|
|
return (const void *) &p_defs->devices[i * p_defs->child_dev_size];
|
|
@@ -464,7 +464,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv,
|
|
|
{
|
|
|
struct sdvo_device_mapping *p_mapping;
|
|
|
const struct bdb_general_definitions *p_defs;
|
|
|
- const struct old_child_dev_config *child; /* legacy */
|
|
|
+ const struct child_device_config *child;
|
|
|
int i, child_device_num, count;
|
|
|
u16 block_size;
|
|
|
|
|
@@ -479,7 +479,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv,
|
|
|
* device size matches that of the *legacy* child device config
|
|
|
* struct. Thus, SDVO mapping will be skipped for newer VBT.
|
|
|
*/
|
|
|
- if (p_defs->child_dev_size != sizeof(*child)) {
|
|
|
+ if (p_defs->child_dev_size != sizeof(struct old_child_dev_config)) {
|
|
|
DRM_DEBUG_KMS("Unsupported child device size for SDVO mapping.\n");
|
|
|
return;
|
|
|
}
|
|
@@ -490,7 +490,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv,
|
|
|
p_defs->child_dev_size;
|
|
|
count = 0;
|
|
|
for (i = 0; i < child_device_num; i++) {
|
|
|
- child = &child_device_ptr(p_defs, i)->old;
|
|
|
+ child = child_device_ptr(p_defs, i);
|
|
|
if (!child->device_type) {
|
|
|
/* skip the device block if device type is invalid */
|
|
|
continue;
|
|
@@ -1113,7 +1113,7 @@ static void sanitize_aux_ch(struct drm_i915_private *dev_priv,
|
|
|
static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
|
|
|
const struct bdb_header *bdb)
|
|
|
{
|
|
|
- union child_device_config *it, *child = NULL;
|
|
|
+ struct child_device_config *it, *child = NULL;
|
|
|
struct ddi_vbt_port_info *info = &dev_priv->vbt.ddi_port_info[port];
|
|
|
uint8_t hdmi_level_shift;
|
|
|
int i, j;
|
|
@@ -1141,7 +1141,7 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
|
|
|
if (dvo_ports[port][j] == -1)
|
|
|
break;
|
|
|
|
|
|
- if (it->common.dvo_port == dvo_ports[port][j]) {
|
|
|
+ if (it->dvo_port == dvo_ports[port][j]) {
|
|
|
if (child) {
|
|
|
DRM_DEBUG_KMS("More than one child device for port %c in VBT, using the first.\n",
|
|
|
port_name(port));
|
|
@@ -1154,14 +1154,14 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
|
|
|
if (!child)
|
|
|
return;
|
|
|
|
|
|
- aux_channel = child->common.aux_channel;
|
|
|
- ddc_pin = child->common.ddc_pin;
|
|
|
+ aux_channel = child->aux_channel;
|
|
|
+ ddc_pin = child->ddc_pin;
|
|
|
|
|
|
- is_dvi = child->common.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING;
|
|
|
- is_dp = child->common.device_type & DEVICE_TYPE_DISPLAYPORT_OUTPUT;
|
|
|
- is_crt = child->common.device_type & DEVICE_TYPE_ANALOG_OUTPUT;
|
|
|
- is_hdmi = is_dvi && (child->common.device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0;
|
|
|
- is_edp = is_dp && (child->common.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR);
|
|
|
+ is_dvi = child->device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING;
|
|
|
+ is_dp = child->device_type & DEVICE_TYPE_DISPLAYPORT_OUTPUT;
|
|
|
+ is_crt = child->device_type & DEVICE_TYPE_ANALOG_OUTPUT;
|
|
|
+ is_hdmi = is_dvi && (child->device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0;
|
|
|
+ is_edp = is_dp && (child->device_type & DEVICE_TYPE_INTERNAL_CONNECTOR);
|
|
|
|
|
|
info->supports_dvi = is_dvi;
|
|
|
info->supports_hdmi = is_hdmi;
|
|
@@ -1210,7 +1210,7 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
|
|
|
|
|
|
if (bdb->version >= 158) {
|
|
|
/* The VBT HDMI level shift values match the table we have. */
|
|
|
- hdmi_level_shift = child->common.hdmi_level_shifter_value;
|
|
|
+ hdmi_level_shift = child->hdmi_level_shifter_value;
|
|
|
DRM_DEBUG_KMS("VBT HDMI level shift for port %c: %d\n",
|
|
|
port_name(port),
|
|
|
hdmi_level_shift);
|
|
@@ -1218,11 +1218,11 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
|
|
|
}
|
|
|
|
|
|
/* Parse the I_boost config for SKL and above */
|
|
|
- if (bdb->version >= 196 && child->common.iboost) {
|
|
|
- info->dp_boost_level = translate_iboost(child->common.iboost_level & 0xF);
|
|
|
+ if (bdb->version >= 196 && child->iboost) {
|
|
|
+ info->dp_boost_level = translate_iboost(child->iboost_level & 0xF);
|
|
|
DRM_DEBUG_KMS("VBT (e)DP boost level for port %c: %d\n",
|
|
|
port_name(port), info->dp_boost_level);
|
|
|
- info->hdmi_boost_level = translate_iboost(child->common.iboost_level >> 4);
|
|
|
+ info->hdmi_boost_level = translate_iboost(child->iboost_level >> 4);
|
|
|
DRM_DEBUG_KMS("VBT HDMI boost level for port %c: %d\n",
|
|
|
port_name(port), info->hdmi_boost_level);
|
|
|
}
|
|
@@ -1251,8 +1251,8 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
|
|
|
const struct bdb_header *bdb)
|
|
|
{
|
|
|
const struct bdb_general_definitions *p_defs;
|
|
|
- const union child_device_config *p_child;
|
|
|
- union child_device_config *child_dev_ptr;
|
|
|
+ const struct child_device_config *p_child;
|
|
|
+ struct child_device_config *child_dev_ptr;
|
|
|
int i, child_device_num, count;
|
|
|
u8 expected_size;
|
|
|
u16 block_size;
|
|
@@ -1301,7 +1301,7 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
|
|
|
/* get the number of child device that is present */
|
|
|
for (i = 0; i < child_device_num; i++) {
|
|
|
p_child = child_device_ptr(p_defs, i);
|
|
|
- if (!p_child->common.device_type) {
|
|
|
+ if (!p_child->device_type) {
|
|
|
/* skip the device block if device type is invalid */
|
|
|
continue;
|
|
|
}
|
|
@@ -1321,7 +1321,7 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
|
|
|
count = 0;
|
|
|
for (i = 0; i < child_device_num; i++) {
|
|
|
p_child = child_device_ptr(p_defs, i);
|
|
|
- if (!p_child->common.device_type) {
|
|
|
+ if (!p_child->device_type) {
|
|
|
/* skip the device block if device type is invalid */
|
|
|
continue;
|
|
|
}
|
|
@@ -1343,12 +1343,12 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
|
|
|
*/
|
|
|
if (bdb->version < 196) {
|
|
|
/* Set default values for bits added from v196 */
|
|
|
- child_dev_ptr->common.iboost = 0;
|
|
|
- child_dev_ptr->common.hpd_invert = 0;
|
|
|
+ child_dev_ptr->iboost = 0;
|
|
|
+ child_dev_ptr->hpd_invert = 0;
|
|
|
}
|
|
|
|
|
|
if (bdb->version < 192)
|
|
|
- child_dev_ptr->common.lspcon = 0;
|
|
|
+ child_dev_ptr->lspcon = 0;
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
@@ -1559,7 +1559,7 @@ out:
|
|
|
*/
|
|
|
bool intel_bios_is_tv_present(struct drm_i915_private *dev_priv)
|
|
|
{
|
|
|
- union child_device_config *p_child;
|
|
|
+ const struct child_device_config *child;
|
|
|
int i;
|
|
|
|
|
|
if (!dev_priv->vbt.int_tv_support)
|
|
@@ -1569,11 +1569,11 @@ bool intel_bios_is_tv_present(struct drm_i915_private *dev_priv)
|
|
|
return true;
|
|
|
|
|
|
for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
|
|
|
- p_child = dev_priv->vbt.child_dev + i;
|
|
|
+ child = dev_priv->vbt.child_dev + i;
|
|
|
/*
|
|
|
* If the device type is not TV, continue.
|
|
|
*/
|
|
|
- switch (p_child->old.device_type) {
|
|
|
+ switch (child->device_type) {
|
|
|
case DEVICE_TYPE_INT_TV:
|
|
|
case DEVICE_TYPE_TV:
|
|
|
case DEVICE_TYPE_TV_SVIDEO_COMPOSITE:
|
|
@@ -1584,7 +1584,7 @@ bool intel_bios_is_tv_present(struct drm_i915_private *dev_priv)
|
|
|
/* Only when the addin_offset is non-zero, it is regarded
|
|
|
* as present.
|
|
|
*/
|
|
|
- if (p_child->old.addin_offset)
|
|
|
+ if (child->addin_offset)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -1601,14 +1601,14 @@ bool intel_bios_is_tv_present(struct drm_i915_private *dev_priv)
|
|
|
*/
|
|
|
bool intel_bios_is_lvds_present(struct drm_i915_private *dev_priv, u8 *i2c_pin)
|
|
|
{
|
|
|
+ const struct child_device_config *child;
|
|
|
int i;
|
|
|
|
|
|
if (!dev_priv->vbt.child_dev_num)
|
|
|
return true;
|
|
|
|
|
|
for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
|
|
|
- union child_device_config *uchild = dev_priv->vbt.child_dev + i;
|
|
|
- struct old_child_dev_config *child = &uchild->old;
|
|
|
+ child = dev_priv->vbt.child_dev + i;
|
|
|
|
|
|
/* If the device type is not LFP, continue.
|
|
|
* We have to check both the new identifiers as well as the
|
|
@@ -1650,6 +1650,7 @@ bool intel_bios_is_lvds_present(struct drm_i915_private *dev_priv, u8 *i2c_pin)
|
|
|
*/
|
|
|
bool intel_bios_is_port_present(struct drm_i915_private *dev_priv, enum port port)
|
|
|
{
|
|
|
+ const struct child_device_config *child;
|
|
|
static const struct {
|
|
|
u16 dp, hdmi;
|
|
|
} port_mapping[] = {
|
|
@@ -1668,12 +1669,12 @@ bool intel_bios_is_port_present(struct drm_i915_private *dev_priv, enum port por
|
|
|
return false;
|
|
|
|
|
|
for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
|
|
|
- const union child_device_config *p_child =
|
|
|
- &dev_priv->vbt.child_dev[i];
|
|
|
- if ((p_child->common.dvo_port == port_mapping[port].dp ||
|
|
|
- p_child->common.dvo_port == port_mapping[port].hdmi) &&
|
|
|
- (p_child->common.device_type & (DEVICE_TYPE_TMDS_DVI_SIGNALING |
|
|
|
- DEVICE_TYPE_DISPLAYPORT_OUTPUT)))
|
|
|
+ child = dev_priv->vbt.child_dev + i;
|
|
|
+
|
|
|
+ if ((child->dvo_port == port_mapping[port].dp ||
|
|
|
+ child->dvo_port == port_mapping[port].hdmi) &&
|
|
|
+ (child->device_type & (DEVICE_TYPE_TMDS_DVI_SIGNALING |
|
|
|
+ DEVICE_TYPE_DISPLAYPORT_OUTPUT)))
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -1689,7 +1690,7 @@ bool intel_bios_is_port_present(struct drm_i915_private *dev_priv, enum port por
|
|
|
*/
|
|
|
bool intel_bios_is_port_edp(struct drm_i915_private *dev_priv, enum port port)
|
|
|
{
|
|
|
- union child_device_config *p_child;
|
|
|
+ const struct child_device_config *child;
|
|
|
static const short port_mapping[] = {
|
|
|
[PORT_B] = DVO_PORT_DPB,
|
|
|
[PORT_C] = DVO_PORT_DPC,
|
|
@@ -1705,10 +1706,10 @@ bool intel_bios_is_port_edp(struct drm_i915_private *dev_priv, enum port port)
|
|
|
return false;
|
|
|
|
|
|
for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
|
|
|
- p_child = dev_priv->vbt.child_dev + i;
|
|
|
+ child = dev_priv->vbt.child_dev + i;
|
|
|
|
|
|
- if (p_child->common.dvo_port == port_mapping[port] &&
|
|
|
- (p_child->common.device_type & DEVICE_TYPE_eDP_BITS) ==
|
|
|
+ if (child->dvo_port == port_mapping[port] &&
|
|
|
+ (child->device_type & DEVICE_TYPE_eDP_BITS) ==
|
|
|
(DEVICE_TYPE_eDP & DEVICE_TYPE_eDP_BITS))
|
|
|
return true;
|
|
|
}
|
|
@@ -1716,7 +1717,7 @@ bool intel_bios_is_port_edp(struct drm_i915_private *dev_priv, enum port port)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-static bool child_dev_is_dp_dual_mode(const union child_device_config *p_child,
|
|
|
+static bool child_dev_is_dp_dual_mode(const struct child_device_config *child,
|
|
|
enum port port)
|
|
|
{
|
|
|
static const struct {
|
|
@@ -1735,16 +1736,16 @@ static bool child_dev_is_dp_dual_mode(const union child_device_config *p_child,
|
|
|
if (port == PORT_A || port >= ARRAY_SIZE(port_mapping))
|
|
|
return false;
|
|
|
|
|
|
- if ((p_child->common.device_type & DEVICE_TYPE_DP_DUAL_MODE_BITS) !=
|
|
|
+ if ((child->device_type & DEVICE_TYPE_DP_DUAL_MODE_BITS) !=
|
|
|
(DEVICE_TYPE_DP_DUAL_MODE & DEVICE_TYPE_DP_DUAL_MODE_BITS))
|
|
|
return false;
|
|
|
|
|
|
- if (p_child->common.dvo_port == port_mapping[port].dp)
|
|
|
+ if (child->dvo_port == port_mapping[port].dp)
|
|
|
return true;
|
|
|
|
|
|
/* Only accept a HDMI dvo_port as DP++ if it has an AUX channel */
|
|
|
- if (p_child->common.dvo_port == port_mapping[port].hdmi &&
|
|
|
- p_child->common.aux_channel != 0)
|
|
|
+ if (child->dvo_port == port_mapping[port].hdmi &&
|
|
|
+ child->aux_channel != 0)
|
|
|
return true;
|
|
|
|
|
|
return false;
|
|
@@ -1753,13 +1754,13 @@ static bool child_dev_is_dp_dual_mode(const union child_device_config *p_child,
|
|
|
bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv,
|
|
|
enum port port)
|
|
|
{
|
|
|
+ const struct child_device_config *child;
|
|
|
int i;
|
|
|
|
|
|
for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
|
|
|
- const union child_device_config *p_child =
|
|
|
- &dev_priv->vbt.child_dev[i];
|
|
|
+ child = dev_priv->vbt.child_dev + i;
|
|
|
|
|
|
- if (child_dev_is_dp_dual_mode(p_child, port))
|
|
|
+ if (child_dev_is_dp_dual_mode(child, port))
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -1776,17 +1777,17 @@ bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv,
|
|
|
bool intel_bios_is_dsi_present(struct drm_i915_private *dev_priv,
|
|
|
enum port *port)
|
|
|
{
|
|
|
- union child_device_config *p_child;
|
|
|
+ const struct child_device_config *child;
|
|
|
u8 dvo_port;
|
|
|
int i;
|
|
|
|
|
|
for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
|
|
|
- p_child = dev_priv->vbt.child_dev + i;
|
|
|
+ child = dev_priv->vbt.child_dev + i;
|
|
|
|
|
|
- if (!(p_child->common.device_type & DEVICE_TYPE_MIPI_OUTPUT))
|
|
|
+ if (!(child->device_type & DEVICE_TYPE_MIPI_OUTPUT))
|
|
|
continue;
|
|
|
|
|
|
- dvo_port = p_child->common.dvo_port;
|
|
|
+ dvo_port = child->dvo_port;
|
|
|
|
|
|
switch (dvo_port) {
|
|
|
case DVO_PORT_MIPIA:
|
|
@@ -1816,16 +1817,19 @@ bool
|
|
|
intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv,
|
|
|
enum port port)
|
|
|
{
|
|
|
+ const struct child_device_config *child;
|
|
|
int i;
|
|
|
|
|
|
if (WARN_ON_ONCE(!IS_GEN9_LP(dev_priv)))
|
|
|
return false;
|
|
|
|
|
|
for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
|
|
|
- if (!dev_priv->vbt.child_dev[i].common.hpd_invert)
|
|
|
+ child = dev_priv->vbt.child_dev + i;
|
|
|
+
|
|
|
+ if (!child->hpd_invert)
|
|
|
continue;
|
|
|
|
|
|
- switch (dev_priv->vbt.child_dev[i].common.dvo_port) {
|
|
|
+ switch (child->dvo_port) {
|
|
|
case DVO_PORT_DPA:
|
|
|
case DVO_PORT_HDMIA:
|
|
|
if (port == PORT_A)
|
|
@@ -1860,16 +1864,19 @@ bool
|
|
|
intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv,
|
|
|
enum port port)
|
|
|
{
|
|
|
+ const struct child_device_config *child;
|
|
|
int i;
|
|
|
|
|
|
if (!HAS_LSPCON(dev_priv))
|
|
|
return false;
|
|
|
|
|
|
for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
|
|
|
- if (!dev_priv->vbt.child_dev[i].common.lspcon)
|
|
|
+ child = dev_priv->vbt.child_dev + i;
|
|
|
+
|
|
|
+ if (!child->lspcon)
|
|
|
continue;
|
|
|
|
|
|
- switch (dev_priv->vbt.child_dev[i].common.dvo_port) {
|
|
|
+ switch (child->dvo_port) {
|
|
|
case DVO_PORT_DPA:
|
|
|
case DVO_PORT_HDMIA:
|
|
|
if (port == PORT_A)
|