return true;
}
+
+void radeon_atombios_get_tmds_info(struct radeon_encoder *encoder)
+{
+ struct drm_device *dev = encoder->base.dev;
+ struct drm_radeon_private *dev_priv = dev->dev_private;
+ struct radeon_mode_info *mode_info = &dev_priv->mode_info;
+ int index = GetIndexIntoMasterTable(DATA, TMDS_Info);
+ uint16_t data_offset;
+ struct _ATOM_TMDS_INFO *tmds_info;
+ uint8_t frev, crev;
+ uint16_t maxfreq;
+ int i;
+
+ atom_parse_data_header(mode_info->atom_context, index, NULL, &frev, &crev, &data_offset);
+
+ tmds_info = (struct _ATOM_TMDS_INFO *)(mode_info->atom_context->bios + data_offset);
+
+ maxfreq = le16_to_cpu(tmds_info->usMaxFrequency);
+ for (i = 0; i < 4; i++) {
+ encoder->tmds_pll[i].freq = le16_to_cpu(tmds_info->asMiscInfo[i].usFrequency);
+ encoder->tmds_pll[i].value = tmds_info->asMiscInfo[i].ucPLL_ChargePump & 0x3f;
+ encoder->tmds_pll[i].value |= (tmds_info->asMiscInfo[i].ucPLL_VCO_Gain & 0x3f << 6);
+ encoder->tmds_pll[i].value |= (tmds_info->asMiscInfo[i].ucPLL_DutyCycle & 0xf << 12);
+ encoder->tmds_pll[i].value |= (tmds_info->asMiscInfo[i].ucPLL_VoltageSwing & 0xf << 16);
+
+ DRM_DEBUG("TMDS PLL From BIOS %u %x\n",
+ encoder->tmds_pll[i].freq,
+ encoder->tmds_pll[i].value);
+
+ if (maxfreq == encoder->tmds_pll[i].freq) {
+ encoder->tmds_pll[i].freq = 0xffffffff;
+ break;
+ }
+ }
+}
+
union lvds_info {
struct _ATOM_LVDS_INFO info;
struct _ATOM_LVDS_INFO_V12 info_12;
};
-void radeon_get_lvds_info(struct radeon_encoder *encoder)
+void radeon_atombios_get_lvds_info(struct radeon_encoder *encoder)
{
struct drm_device *dev = encoder->base.dev;
struct drm_radeon_private *dev_priv = dev->dev_private;
COMBIOS_CONNECTOR_INFO_TABLE,
COMBIOS_DYN_CLK_1_TABLE,
COMBIOS_RESERVED_MEM_TABLE,
- COMBIOS_EXT_TDMS_INFO_TABLE,
+ COMBIOS_EXT_TMDS_INFO_TABLE,
COMBIOS_MEM_CLK_INFO_TABLE,
COMBIOS_EXT_DAC_INFO_TABLE,
COMBIOS_MISC_INFO_TABLE,
if (check_offset)
offset = check_offset;
break;
- case COMBIOS_EXT_TDMS_INFO_TABLE:
+ case COMBIOS_EXT_TMDS_INFO_TABLE:
check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x58);
if (check_offset)
offset = check_offset;
return false;
}
+bool radeon_combios_get_ext_tmds_info(struct radeon_encoder *encoder)
+{
+ struct drm_device *dev = encoder->base.dev;
+ struct drm_radeon_private *dev_priv = dev->dev_private;
+ uint16_t ext_tmds_info;
+ uint8_t ver;
+
+ ext_tmds_info = combios_get_table_offset(dev, COMBIOS_EXT_TMDS_INFO_TABLE);
+ if (ext_tmds_info) {
+ ver = radeon_bios8(dev_priv, ext_tmds_info);
+ DRM_INFO("External TMDS Table revision: %d\n", ver);
+ // TODO
+ }
+}
+
static void radeon_apply_legacy_quirks(struct drm_device *dev, int bios_index)
{
struct drm_radeon_private *dev_priv = dev->dev_private;
static void radeon_legacy_lvds_prepare(struct drm_encoder *encoder)
{
+ struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
// fix me: atom/legacy r4xx
- radeon_combios_output_lock(encoder, true);
+ if (!dev_priv->is_atom_bios)
+ radeon_combios_output_lock(encoder, true);
radeon_legacy_lvds_dpms(encoder, DRM_MODE_DPMS_OFF);
}
static void radeon_legacy_lvds_commit(struct drm_encoder *encoder)
{
+ struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
radeon_legacy_lvds_dpms(encoder, DRM_MODE_DPMS_ON);
// fix me: atom/legacy r4xx
- radeon_combios_output_lock(encoder, false);
+ if (!dev_priv->is_atom_bios)
+ radeon_combios_output_lock(encoder, false);
}
static void radeon_legacy_lvds_mode_set(struct drm_encoder *encoder,
struct drm_encoder *radeon_encoder_legacy_lvds_add(struct drm_device *dev, int bios_index)
{
+ struct drm_radeon_private *dev_priv = dev->dev_private;
struct radeon_encoder *radeon_encoder;
struct drm_encoder *encoder;
drm_encoder_helper_add(encoder, &radeon_legacy_lvds_helper_funcs);
/* get the lvds info from the bios */
- radeon_combios_get_lvds_info(radeon_encoder);
+ if (dev_priv->is_atom_bios)
+ radeon_atombios_get_lvds_info(radeon_encoder);
+ else
+ radeon_combios_get_lvds_info(radeon_encoder);
/* LVDS gets default RMX full scaling */
radeon_encoder->rmx_type = RMX_FULL;
static void radeon_legacy_primary_dac_prepare(struct drm_encoder *encoder)
{
+ struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
// fix me: atom/legacy r4xx
- radeon_combios_output_lock(encoder, true);
+ if (!dev_priv->is_atom_bios)
+ radeon_combios_output_lock(encoder, true);
radeon_legacy_primary_dac_dpms(encoder, DRM_MODE_DPMS_OFF);
}
static void radeon_legacy_primary_dac_commit(struct drm_encoder *encoder)
{
+ struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
radeon_legacy_primary_dac_dpms(encoder, DRM_MODE_DPMS_ON);
// fix me: atom/legacy r4xx
- radeon_combios_output_lock(encoder, false);
+ if (!dev_priv->is_atom_bios)
+ radeon_combios_output_lock(encoder, false);
}
static void radeon_legacy_primary_dac_mode_set(struct drm_encoder *encoder,
struct drm_encoder *radeon_encoder_legacy_primary_dac_add(struct drm_device *dev, int bios_index, int has_tv)
{
+ struct drm_radeon_private *dev_priv = dev->dev_private;
struct radeon_encoder *radeon_encoder;
struct drm_encoder *encoder;
drm_encoder_helper_add(encoder, &radeon_legacy_primary_dac_helper_funcs);
/* get the primary dac bg/adj vals from bios tables */
- radeon_combios_get_primary_dac_info(radeon_encoder);
+ if (!dev_priv->is_atom_bios)
+ radeon_combios_get_primary_dac_info(radeon_encoder);
return encoder;
}
static void radeon_legacy_tmds_int_prepare(struct drm_encoder *encoder)
{
+ struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
// fix me: atom/legacy r4xx
- radeon_combios_output_lock(encoder, true);
+ if (!dev_priv->is_atom_bios)
+ radeon_combios_output_lock(encoder, true);
radeon_legacy_tmds_int_dpms(encoder, DRM_MODE_DPMS_OFF);
}
static void radeon_legacy_tmds_int_commit(struct drm_encoder *encoder)
{
+ struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
radeon_legacy_tmds_int_dpms(encoder, DRM_MODE_DPMS_ON);
// fix me: atom/legacy r4xx
- radeon_combios_output_lock(encoder, true);
+ if (!dev_priv->is_atom_bios)
+ radeon_combios_output_lock(encoder, true);
}
static void radeon_legacy_tmds_int_mode_set(struct drm_encoder *encoder,
struct drm_encoder *radeon_encoder_legacy_tmds_int_add(struct drm_device *dev, int bios_index)
{
+ struct drm_radeon_private *dev_priv = dev->dev_private;
struct radeon_encoder *radeon_encoder;
struct drm_encoder *encoder;
drm_encoder_helper_add(encoder, &radeon_legacy_tmds_int_helper_funcs);
- radeon_combios_get_tmds_info(radeon_encoder);
+ if (dev_priv->is_atom_bios)
+ radeon_atombios_get_tmds_info(radeon_encoder);
+ else
+ radeon_combios_get_tmds_info(radeon_encoder);
return encoder;
}
static void radeon_legacy_tmds_ext_prepare(struct drm_encoder *encoder)
{
+ struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
// fix me: atom/legacy r4xx
- radeon_combios_output_lock(encoder, true);
+ if (!dev_priv->is_atom_bios)
+ radeon_combios_output_lock(encoder, true);
radeon_legacy_tmds_ext_dpms(encoder, DRM_MODE_DPMS_OFF);
}
static void radeon_legacy_tmds_ext_commit(struct drm_encoder *encoder)
{
+ struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
radeon_legacy_tmds_ext_dpms(encoder, DRM_MODE_DPMS_ON);
// fix me: atom/legacy r4xx
- radeon_combios_output_lock(encoder, false);
+ if (!dev_priv->is_atom_bios)
+ radeon_combios_output_lock(encoder, false);
}
static void radeon_legacy_tmds_ext_mode_set(struct drm_encoder *encoder,
struct drm_encoder *radeon_encoder_legacy_tmds_ext_add(struct drm_device *dev, int bios_index)
{
+ struct drm_radeon_private *dev_priv = dev->dev_private;
struct radeon_encoder *radeon_encoder;
struct drm_encoder *encoder;
drm_encoder_helper_add(encoder, &radeon_legacy_tmds_ext_helper_funcs);
- //radeon_combios_get_tmds_info(radeon_encoder);
+ if (!dev_priv->is_atom_bios)
+ radeon_combios_get_ext_tmds_info(radeon_encoder);
return encoder;
}