Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: drm/ttm: fix two regressions since move_notify changes drm/radeon: avoid deadlock if GPU lockup is detected in ib_pool_get drm/radeon: silence out possible lock dependency warning drm: Fix authentication kernel crash gma500: Fix shmem mapping drm/radeon/kms: refine TMDS dual link checks drm/radeon/kms: use drm_detect_hdmi_monitor for picking encoder mode drm/radeon/kms: rework modeset sequence for DCE41 and DCE5 drm/radeon/kms: move panel mode setup into encoder mode set drm/radeon/kms: move disp eng pll setup to init path drm/radeon: finish getting bios earlier drm/radeon: fix invalid memory access in radeon_atrm_get_bios() drm/radeon/kms: add some missing semaphore init drm/radeon/kms: Add an MSI quirk for Dell RS690 gpu, drm, sis: Don't return uninitialized variable from sis_driver_load()
This commit is contained in:
commit
74a7f6a0a6
@ -101,7 +101,7 @@ static int drm_add_magic(struct drm_master *master, struct drm_file *priv,
|
||||
* Searches and unlinks the entry in drm_device::magiclist with the magic
|
||||
* number hash key, while holding the drm_device::struct_mutex lock.
|
||||
*/
|
||||
static int drm_remove_magic(struct drm_master *master, drm_magic_t magic)
|
||||
int drm_remove_magic(struct drm_master *master, drm_magic_t magic)
|
||||
{
|
||||
struct drm_magic_entry *pt;
|
||||
struct drm_hash_item *hash;
|
||||
@ -136,6 +136,8 @@ static int drm_remove_magic(struct drm_master *master, drm_magic_t magic)
|
||||
* If there is a magic number in drm_file::magic then use it, otherwise
|
||||
* searches an unique non-zero magic number and add it associating it with \p
|
||||
* file_priv.
|
||||
* This ioctl needs protection by the drm_global_mutex, which protects
|
||||
* struct drm_file::magic and struct drm_magic_entry::priv.
|
||||
*/
|
||||
int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
||||
{
|
||||
@ -173,6 +175,8 @@ int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
||||
* \return zero if authentication successed, or a negative number otherwise.
|
||||
*
|
||||
* Checks if \p file_priv is associated with the magic number passed in \arg.
|
||||
* This ioctl needs protection by the drm_global_mutex, which protects
|
||||
* struct drm_file::magic and struct drm_magic_entry::priv.
|
||||
*/
|
||||
int drm_authmagic(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
|
@ -487,6 +487,11 @@ int drm_release(struct inode *inode, struct file *filp)
|
||||
(long)old_encode_dev(file_priv->minor->device),
|
||||
dev->open_count);
|
||||
|
||||
/* Release any auth tokens that might point to this file_priv,
|
||||
(do that under the drm_global_mutex) */
|
||||
if (file_priv->magic)
|
||||
(void) drm_remove_magic(file_priv->master, file_priv->magic);
|
||||
|
||||
/* if the master has gone away we can't do anything with the lock */
|
||||
if (file_priv->minor->master)
|
||||
drm_master_release(dev, filp);
|
||||
|
@ -812,6 +812,10 @@ nouveau_bo_move_ntfy(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem)
|
||||
struct nouveau_bo *nvbo = nouveau_bo(bo);
|
||||
struct nouveau_vma *vma;
|
||||
|
||||
/* ttm can now (stupidly) pass the driver bos it didn't create... */
|
||||
if (bo->destroy != nouveau_bo_del_ttm)
|
||||
return;
|
||||
|
||||
list_for_each_entry(vma, &nvbo->vma_list, head) {
|
||||
if (new_mem && new_mem->mem_type == TTM_PL_VRAM) {
|
||||
nouveau_vm_map(vma, new_mem->mm_node);
|
||||
|
@ -355,15 +355,12 @@ static void atombios_crtc_set_timing(struct drm_crtc *crtc,
|
||||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||
}
|
||||
|
||||
static void atombios_disable_ss(struct drm_crtc *crtc)
|
||||
static void atombios_disable_ss(struct radeon_device *rdev, int pll_id)
|
||||
{
|
||||
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
||||
struct drm_device *dev = crtc->dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
u32 ss_cntl;
|
||||
|
||||
if (ASIC_IS_DCE4(rdev)) {
|
||||
switch (radeon_crtc->pll_id) {
|
||||
switch (pll_id) {
|
||||
case ATOM_PPLL1:
|
||||
ss_cntl = RREG32(EVERGREEN_P1PLL_SS_CNTL);
|
||||
ss_cntl &= ~EVERGREEN_PxPLL_SS_EN;
|
||||
@ -379,7 +376,7 @@ static void atombios_disable_ss(struct drm_crtc *crtc)
|
||||
return;
|
||||
}
|
||||
} else if (ASIC_IS_AVIVO(rdev)) {
|
||||
switch (radeon_crtc->pll_id) {
|
||||
switch (pll_id) {
|
||||
case ATOM_PPLL1:
|
||||
ss_cntl = RREG32(AVIVO_P1PLL_INT_SS_CNTL);
|
||||
ss_cntl &= ~1;
|
||||
@ -406,13 +403,11 @@ union atom_enable_ss {
|
||||
ENABLE_SPREAD_SPECTRUM_ON_PPLL_V3 v3;
|
||||
};
|
||||
|
||||
static void atombios_crtc_program_ss(struct drm_crtc *crtc,
|
||||
static void atombios_crtc_program_ss(struct radeon_device *rdev,
|
||||
int enable,
|
||||
int pll_id,
|
||||
struct radeon_atom_ss *ss)
|
||||
{
|
||||
struct drm_device *dev = crtc->dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
int index = GetIndexIntoMasterTable(COMMAND, EnableSpreadSpectrumOnPPLL);
|
||||
union atom_enable_ss args;
|
||||
|
||||
@ -479,7 +474,7 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc,
|
||||
} else if (ASIC_IS_AVIVO(rdev)) {
|
||||
if ((enable == ATOM_DISABLE) || (ss->percentage == 0) ||
|
||||
(ss->type & ATOM_EXTERNAL_SS_MASK)) {
|
||||
atombios_disable_ss(crtc);
|
||||
atombios_disable_ss(rdev, pll_id);
|
||||
return;
|
||||
}
|
||||
args.lvds_ss_2.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage);
|
||||
@ -491,7 +486,7 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc,
|
||||
} else {
|
||||
if ((enable == ATOM_DISABLE) || (ss->percentage == 0) ||
|
||||
(ss->type & ATOM_EXTERNAL_SS_MASK)) {
|
||||
atombios_disable_ss(crtc);
|
||||
atombios_disable_ss(rdev, pll_id);
|
||||
return;
|
||||
}
|
||||
args.lvds_ss.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage);
|
||||
@ -523,6 +518,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
|
||||
int encoder_mode = 0;
|
||||
u32 dp_clock = mode->clock;
|
||||
int bpc = 8;
|
||||
bool is_duallink = false;
|
||||
|
||||
/* reset the pll flags */
|
||||
pll->flags = 0;
|
||||
@ -557,6 +553,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
|
||||
if (connector && connector->display_info.bpc)
|
||||
bpc = connector->display_info.bpc;
|
||||
encoder_mode = atombios_get_encoder_mode(encoder);
|
||||
is_duallink = radeon_dig_monitor_is_duallink(encoder, mode->clock);
|
||||
if ((radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) ||
|
||||
(radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE)) {
|
||||
if (connector) {
|
||||
@ -652,7 +649,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
|
||||
if (dig->coherent_mode)
|
||||
args.v3.sInput.ucDispPllConfig |=
|
||||
DISPPLL_CONFIG_COHERENT_MODE;
|
||||
if (mode->clock > 165000)
|
||||
if (is_duallink)
|
||||
args.v3.sInput.ucDispPllConfig |=
|
||||
DISPPLL_CONFIG_DUAL_LINK;
|
||||
}
|
||||
@ -702,11 +699,9 @@ union set_pixel_clock {
|
||||
/* on DCE5, make sure the voltage is high enough to support the
|
||||
* required disp clk.
|
||||
*/
|
||||
static void atombios_crtc_set_dcpll(struct drm_crtc *crtc,
|
||||
static void atombios_crtc_set_dcpll(struct radeon_device *rdev,
|
||||
u32 dispclk)
|
||||
{
|
||||
struct drm_device *dev = crtc->dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
u8 frev, crev;
|
||||
int index;
|
||||
union set_pixel_clock args;
|
||||
@ -996,7 +991,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
|
||||
radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div,
|
||||
&ref_div, &post_div);
|
||||
|
||||
atombios_crtc_program_ss(crtc, ATOM_DISABLE, radeon_crtc->pll_id, &ss);
|
||||
atombios_crtc_program_ss(rdev, ATOM_DISABLE, radeon_crtc->pll_id, &ss);
|
||||
|
||||
atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id,
|
||||
encoder_mode, radeon_encoder->encoder_id, mode->clock,
|
||||
@ -1019,7 +1014,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
|
||||
ss.step = step_size;
|
||||
}
|
||||
|
||||
atombios_crtc_program_ss(crtc, ATOM_ENABLE, radeon_crtc->pll_id, &ss);
|
||||
atombios_crtc_program_ss(rdev, ATOM_ENABLE, radeon_crtc->pll_id, &ss);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1494,6 +1489,24 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc)
|
||||
|
||||
}
|
||||
|
||||
void radeon_atom_dcpll_init(struct radeon_device *rdev)
|
||||
{
|
||||
/* always set DCPLL */
|
||||
if (ASIC_IS_DCE4(rdev)) {
|
||||
struct radeon_atom_ss ss;
|
||||
bool ss_enabled = radeon_atombios_get_asic_ss_info(rdev, &ss,
|
||||
ASIC_INTERNAL_SS_ON_DCPLL,
|
||||
rdev->clock.default_dispclk);
|
||||
if (ss_enabled)
|
||||
atombios_crtc_program_ss(rdev, ATOM_DISABLE, ATOM_DCPLL, &ss);
|
||||
/* XXX: DCE5, make sure voltage, dispclk is high enough */
|
||||
atombios_crtc_set_dcpll(rdev, rdev->clock.default_dispclk);
|
||||
if (ss_enabled)
|
||||
atombios_crtc_program_ss(rdev, ATOM_ENABLE, ATOM_DCPLL, &ss);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int atombios_crtc_mode_set(struct drm_crtc *crtc,
|
||||
struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode,
|
||||
@ -1515,19 +1528,6 @@ int atombios_crtc_mode_set(struct drm_crtc *crtc,
|
||||
}
|
||||
}
|
||||
|
||||
/* always set DCPLL */
|
||||
if (ASIC_IS_DCE4(rdev)) {
|
||||
struct radeon_atom_ss ss;
|
||||
bool ss_enabled = radeon_atombios_get_asic_ss_info(rdev, &ss,
|
||||
ASIC_INTERNAL_SS_ON_DCPLL,
|
||||
rdev->clock.default_dispclk);
|
||||
if (ss_enabled)
|
||||
atombios_crtc_program_ss(crtc, ATOM_DISABLE, ATOM_DCPLL, &ss);
|
||||
/* XXX: DCE5, make sure voltage, dispclk is high enough */
|
||||
atombios_crtc_set_dcpll(crtc, rdev->clock.default_dispclk);
|
||||
if (ss_enabled)
|
||||
atombios_crtc_program_ss(crtc, ATOM_ENABLE, ATOM_DCPLL, &ss);
|
||||
}
|
||||
atombios_crtc_set_pll(crtc, adjusted_mode);
|
||||
|
||||
if (ASIC_IS_DCE4(rdev))
|
||||
|
@ -549,8 +549,8 @@ bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector)
|
||||
return false;
|
||||
}
|
||||
|
||||
static void radeon_dp_set_panel_mode(struct drm_encoder *encoder,
|
||||
struct drm_connector *connector)
|
||||
int radeon_dp_get_panel_mode(struct drm_encoder *encoder,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
@ -558,7 +558,7 @@ static void radeon_dp_set_panel_mode(struct drm_encoder *encoder,
|
||||
int panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
|
||||
|
||||
if (!ASIC_IS_DCE4(rdev))
|
||||
return;
|
||||
return panel_mode;
|
||||
|
||||
if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) ==
|
||||
ENCODER_OBJECT_ID_NUTMEG)
|
||||
@ -572,14 +572,7 @@ static void radeon_dp_set_panel_mode(struct drm_encoder *encoder,
|
||||
panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
|
||||
}
|
||||
|
||||
atombios_dig_encoder_setup(encoder,
|
||||
ATOM_ENCODER_CMD_SETUP_PANEL_MODE,
|
||||
panel_mode);
|
||||
|
||||
if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) &&
|
||||
(panel_mode == DP_PANEL_MODE_INTERNAL_DP2_MODE)) {
|
||||
radeon_write_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_SET, 1);
|
||||
}
|
||||
return panel_mode;
|
||||
}
|
||||
|
||||
void radeon_dp_set_link_config(struct drm_connector *connector,
|
||||
@ -717,6 +710,8 @@ static void radeon_dp_set_tp(struct radeon_dp_link_train_info *dp_info, int tp)
|
||||
|
||||
static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info)
|
||||
{
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(dp_info->encoder);
|
||||
struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
||||
u8 tmp;
|
||||
|
||||
/* power up the sink */
|
||||
@ -732,7 +727,10 @@ static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info)
|
||||
radeon_write_dpcd_reg(dp_info->radeon_connector,
|
||||
DP_DOWNSPREAD_CTRL, 0);
|
||||
|
||||
radeon_dp_set_panel_mode(dp_info->encoder, dp_info->connector);
|
||||
if ((dp_info->connector->connector_type == DRM_MODE_CONNECTOR_eDP) &&
|
||||
(dig->panel_mode == DP_PANEL_MODE_INTERNAL_DP2_MODE)) {
|
||||
radeon_write_dpcd_reg(dp_info->radeon_connector, DP_EDP_CONFIGURATION_SET, 1);
|
||||
}
|
||||
|
||||
/* set the lane count on the sink */
|
||||
tmp = dp_info->dp_lane_count;
|
||||
|
@ -57,22 +57,6 @@ static inline bool radeon_encoder_is_digital(struct drm_encoder *encoder)
|
||||
}
|
||||
}
|
||||
|
||||
static struct drm_connector *
|
||||
radeon_get_connector_for_encoder_init(struct drm_encoder *encoder)
|
||||
{
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
struct drm_connector *connector;
|
||||
struct radeon_connector *radeon_connector;
|
||||
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
radeon_connector = to_radeon_connector(connector);
|
||||
if (radeon_encoder->devices & radeon_connector->devices)
|
||||
return connector;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
|
||||
struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode)
|
||||
@ -253,7 +237,7 @@ atombios_dvo_setup(struct drm_encoder *encoder, int action)
|
||||
/* R4xx, R5xx */
|
||||
args.ext_tmds.sXTmdsEncoder.ucEnable = action;
|
||||
|
||||
if (radeon_encoder->pixel_clock > 165000)
|
||||
if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.ext_tmds.sXTmdsEncoder.ucMisc |= PANEL_ENCODER_MISC_DUAL;
|
||||
|
||||
args.ext_tmds.sXTmdsEncoder.ucMisc |= ATOM_PANEL_MISC_888RGB;
|
||||
@ -265,7 +249,7 @@ atombios_dvo_setup(struct drm_encoder *encoder, int action)
|
||||
/* DFP1, CRT1, TV1 depending on the type of port */
|
||||
args.dvo.sDVOEncoder.ucDeviceType = ATOM_DEVICE_DFP1_INDEX;
|
||||
|
||||
if (radeon_encoder->pixel_clock > 165000)
|
||||
if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.dvo.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute |= PANEL_ENCODER_MISC_DUAL;
|
||||
break;
|
||||
case 3:
|
||||
@ -349,7 +333,7 @@ atombios_digital_setup(struct drm_encoder *encoder, int action)
|
||||
} else {
|
||||
if (dig->linkb)
|
||||
args.v1.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB;
|
||||
if (radeon_encoder->pixel_clock > 165000)
|
||||
if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL;
|
||||
/*if (pScrn->rgbBits == 8) */
|
||||
args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB;
|
||||
@ -388,7 +372,7 @@ atombios_digital_setup(struct drm_encoder *encoder, int action)
|
||||
} else {
|
||||
if (dig->linkb)
|
||||
args.v2.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB;
|
||||
if (radeon_encoder->pixel_clock > 165000)
|
||||
if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v2.ucMisc |= PANEL_ENCODER_MISC_DUAL;
|
||||
}
|
||||
break;
|
||||
@ -432,7 +416,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
|
||||
switch (connector->connector_type) {
|
||||
case DRM_MODE_CONNECTOR_DVII:
|
||||
case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */
|
||||
if (drm_detect_monitor_audio(radeon_connector->edid) &&
|
||||
if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||
radeon_audio)
|
||||
return ATOM_ENCODER_MODE_HDMI;
|
||||
else if (radeon_connector->use_digital)
|
||||
@ -443,7 +427,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
|
||||
case DRM_MODE_CONNECTOR_DVID:
|
||||
case DRM_MODE_CONNECTOR_HDMIA:
|
||||
default:
|
||||
if (drm_detect_monitor_audio(radeon_connector->edid) &&
|
||||
if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||
radeon_audio)
|
||||
return ATOM_ENCODER_MODE_HDMI;
|
||||
else
|
||||
@ -457,7 +441,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
|
||||
if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
|
||||
(dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
|
||||
return ATOM_ENCODER_MODE_DP;
|
||||
else if (drm_detect_monitor_audio(radeon_connector->edid) &&
|
||||
else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||
radeon_audio)
|
||||
return ATOM_ENCODER_MODE_HDMI;
|
||||
else
|
||||
@ -587,7 +571,7 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo
|
||||
|
||||
if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode))
|
||||
args.v1.ucLaneNum = dp_lane_count;
|
||||
else if (radeon_encoder->pixel_clock > 165000)
|
||||
else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v1.ucLaneNum = 8;
|
||||
else
|
||||
args.v1.ucLaneNum = 4;
|
||||
@ -622,7 +606,7 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo
|
||||
|
||||
if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode))
|
||||
args.v3.ucLaneNum = dp_lane_count;
|
||||
else if (radeon_encoder->pixel_clock > 165000)
|
||||
else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v3.ucLaneNum = 8;
|
||||
else
|
||||
args.v3.ucLaneNum = 4;
|
||||
@ -662,7 +646,7 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo
|
||||
|
||||
if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode))
|
||||
args.v4.ucLaneNum = dp_lane_count;
|
||||
else if (radeon_encoder->pixel_clock > 165000)
|
||||
else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v4.ucLaneNum = 8;
|
||||
else
|
||||
args.v4.ucLaneNum = 4;
|
||||
@ -806,7 +790,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
if (is_dp)
|
||||
args.v1.usPixelClock =
|
||||
cpu_to_le16(dp_clock / 10);
|
||||
else if (radeon_encoder->pixel_clock > 165000)
|
||||
else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v1.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10);
|
||||
else
|
||||
args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
|
||||
@ -821,7 +805,8 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
|
||||
if ((rdev->flags & RADEON_IS_IGP) &&
|
||||
(radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_UNIPHY)) {
|
||||
if (is_dp || (radeon_encoder->pixel_clock <= 165000)) {
|
||||
if (is_dp ||
|
||||
!radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) {
|
||||
if (igp_lane_info & 0x1)
|
||||
args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_3;
|
||||
else if (igp_lane_info & 0x2)
|
||||
@ -848,7 +833,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
|
||||
if (dig->coherent_mode)
|
||||
args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT;
|
||||
if (radeon_encoder->pixel_clock > 165000)
|
||||
if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_8LANE_LINK;
|
||||
}
|
||||
break;
|
||||
@ -863,7 +848,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
if (is_dp)
|
||||
args.v2.usPixelClock =
|
||||
cpu_to_le16(dp_clock / 10);
|
||||
else if (radeon_encoder->pixel_clock > 165000)
|
||||
else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v2.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10);
|
||||
else
|
||||
args.v2.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
|
||||
@ -891,7 +876,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
} else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
|
||||
if (dig->coherent_mode)
|
||||
args.v2.acConfig.fCoherentMode = 1;
|
||||
if (radeon_encoder->pixel_clock > 165000)
|
||||
if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v2.acConfig.fDualLinkConnector = 1;
|
||||
}
|
||||
break;
|
||||
@ -906,7 +891,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
if (is_dp)
|
||||
args.v3.usPixelClock =
|
||||
cpu_to_le16(dp_clock / 10);
|
||||
else if (radeon_encoder->pixel_clock > 165000)
|
||||
else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v3.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10);
|
||||
else
|
||||
args.v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
|
||||
@ -914,7 +899,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
|
||||
if (is_dp)
|
||||
args.v3.ucLaneNum = dp_lane_count;
|
||||
else if (radeon_encoder->pixel_clock > 165000)
|
||||
else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v3.ucLaneNum = 8;
|
||||
else
|
||||
args.v3.ucLaneNum = 4;
|
||||
@ -951,7 +936,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
|
||||
if (dig->coherent_mode)
|
||||
args.v3.acConfig.fCoherentMode = 1;
|
||||
if (radeon_encoder->pixel_clock > 165000)
|
||||
if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v3.acConfig.fDualLinkConnector = 1;
|
||||
}
|
||||
break;
|
||||
@ -966,7 +951,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
if (is_dp)
|
||||
args.v4.usPixelClock =
|
||||
cpu_to_le16(dp_clock / 10);
|
||||
else if (radeon_encoder->pixel_clock > 165000)
|
||||
else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v4.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10);
|
||||
else
|
||||
args.v4.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
|
||||
@ -974,7 +959,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
|
||||
if (is_dp)
|
||||
args.v4.ucLaneNum = dp_lane_count;
|
||||
else if (radeon_encoder->pixel_clock > 165000)
|
||||
else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v4.ucLaneNum = 8;
|
||||
else
|
||||
args.v4.ucLaneNum = 4;
|
||||
@ -1014,7 +999,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
|
||||
if (dig->coherent_mode)
|
||||
args.v4.acConfig.fCoherentMode = 1;
|
||||
if (radeon_encoder->pixel_clock > 165000)
|
||||
if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v4.acConfig.fDualLinkConnector = 1;
|
||||
}
|
||||
break;
|
||||
@ -1137,7 +1122,7 @@ atombios_external_encoder_setup(struct drm_encoder *encoder,
|
||||
if (dp_clock == 270000)
|
||||
args.v1.sDigEncoder.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
|
||||
args.v1.sDigEncoder.ucLaneNum = dp_lane_count;
|
||||
} else if (radeon_encoder->pixel_clock > 165000)
|
||||
} else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v1.sDigEncoder.ucLaneNum = 8;
|
||||
else
|
||||
args.v1.sDigEncoder.ucLaneNum = 4;
|
||||
@ -1156,7 +1141,7 @@ atombios_external_encoder_setup(struct drm_encoder *encoder,
|
||||
else if (dp_clock == 540000)
|
||||
args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_5_40GHZ;
|
||||
args.v3.sExtEncoder.ucLaneNum = dp_lane_count;
|
||||
} else if (radeon_encoder->pixel_clock > 165000)
|
||||
} else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
|
||||
args.v3.sExtEncoder.ucLaneNum = 8;
|
||||
else
|
||||
args.v3.sExtEncoder.ucLaneNum = 4;
|
||||
@ -1341,7 +1326,8 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode)
|
||||
switch (mode) {
|
||||
case DRM_MODE_DPMS_ON:
|
||||
/* some early dce3.2 boards have a bug in their transmitter control table */
|
||||
if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730))
|
||||
if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730) ||
|
||||
ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev))
|
||||
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
|
||||
else
|
||||
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0);
|
||||
@ -1351,8 +1337,6 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode)
|
||||
ATOM_TRANSMITTER_ACTION_POWER_ON);
|
||||
radeon_dig_connector->edp_on = true;
|
||||
}
|
||||
if (ASIC_IS_DCE4(rdev))
|
||||
atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0);
|
||||
radeon_dp_link_train(encoder, connector);
|
||||
if (ASIC_IS_DCE4(rdev))
|
||||
atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0);
|
||||
@ -1363,7 +1347,10 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode)
|
||||
case DRM_MODE_DPMS_STANDBY:
|
||||
case DRM_MODE_DPMS_SUSPEND:
|
||||
case DRM_MODE_DPMS_OFF:
|
||||
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0);
|
||||
if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev))
|
||||
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
|
||||
else
|
||||
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0);
|
||||
if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) {
|
||||
if (ASIC_IS_DCE4(rdev))
|
||||
atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0);
|
||||
@ -1810,7 +1797,21 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
|
||||
if (ASIC_IS_DCE4(rdev)) {
|
||||
if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
|
||||
struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
|
||||
struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
||||
|
||||
if (!connector)
|
||||
dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
|
||||
else
|
||||
dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector);
|
||||
|
||||
/* setup and enable the encoder */
|
||||
atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0);
|
||||
atombios_dig_encoder_setup(encoder,
|
||||
ATOM_ENCODER_CMD_SETUP_PANEL_MODE,
|
||||
dig->panel_mode);
|
||||
} else if (ASIC_IS_DCE4(rdev)) {
|
||||
/* disable the transmitter */
|
||||
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
|
||||
/* setup and enable the encoder */
|
||||
|
@ -1455,6 +1455,7 @@ int evergreen_cp_resume(struct radeon_device *rdev)
|
||||
#endif
|
||||
WREG32(CP_RB_CNTL, tmp);
|
||||
WREG32(CP_SEM_WAIT_TIMER, 0x0);
|
||||
WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
|
||||
|
||||
/* Set the write pointer delay */
|
||||
WREG32(CP_RB_WPTR_DELAY, 0);
|
||||
|
@ -108,6 +108,7 @@
|
||||
#define CP_RB_WPTR_ADDR_HI 0xC11C
|
||||
#define CP_RB_WPTR_DELAY 0x8704
|
||||
#define CP_SEM_WAIT_TIMER 0x85BC
|
||||
#define CP_SEM_INCOMPLETE_TIMER_CNTL 0x85C8
|
||||
#define CP_DEBUG 0xC1FC
|
||||
|
||||
|
||||
|
@ -1219,6 +1219,7 @@ int cayman_cp_resume(struct radeon_device *rdev)
|
||||
RREG32(GRBM_SOFT_RESET);
|
||||
|
||||
WREG32(CP_SEM_WAIT_TIMER, 0x0);
|
||||
WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
|
||||
|
||||
/* Set the write pointer delay */
|
||||
WREG32(CP_RB_WPTR_DELAY, 0);
|
||||
|
@ -222,6 +222,7 @@
|
||||
#define SCRATCH_UMSK 0x8540
|
||||
#define SCRATCH_ADDR 0x8544
|
||||
#define CP_SEM_WAIT_TIMER 0x85BC
|
||||
#define CP_SEM_INCOMPLETE_TIMER_CNTL 0x85C8
|
||||
#define CP_COHER_CNTL2 0x85E8
|
||||
#define CP_ME_CNTL 0x86D8
|
||||
#define CP_ME_HALT (1 << 28)
|
||||
|
@ -156,6 +156,47 @@ static inline int radeon_atrm_get_bios_chunk(uint8_t *bios, int offset, int len)
|
||||
bool radeon_get_bios(struct radeon_device *rdev);
|
||||
|
||||
|
||||
/*
|
||||
* Mutex which allows recursive locking from the same process.
|
||||
*/
|
||||
struct radeon_mutex {
|
||||
struct mutex mutex;
|
||||
struct task_struct *owner;
|
||||
int level;
|
||||
};
|
||||
|
||||
static inline void radeon_mutex_init(struct radeon_mutex *mutex)
|
||||
{
|
||||
mutex_init(&mutex->mutex);
|
||||
mutex->owner = NULL;
|
||||
mutex->level = 0;
|
||||
}
|
||||
|
||||
static inline void radeon_mutex_lock(struct radeon_mutex *mutex)
|
||||
{
|
||||
if (mutex_trylock(&mutex->mutex)) {
|
||||
/* The mutex was unlocked before, so it's ours now */
|
||||
mutex->owner = current;
|
||||
} else if (mutex->owner != current) {
|
||||
/* Another process locked the mutex, take it */
|
||||
mutex_lock(&mutex->mutex);
|
||||
mutex->owner = current;
|
||||
}
|
||||
/* Otherwise the mutex was already locked by this process */
|
||||
|
||||
mutex->level++;
|
||||
}
|
||||
|
||||
static inline void radeon_mutex_unlock(struct radeon_mutex *mutex)
|
||||
{
|
||||
if (--mutex->level > 0)
|
||||
return;
|
||||
|
||||
mutex->owner = NULL;
|
||||
mutex_unlock(&mutex->mutex);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Dummy page
|
||||
*/
|
||||
@ -598,7 +639,7 @@ struct radeon_ib {
|
||||
* mutex protects scheduled_ibs, ready, alloc_bm
|
||||
*/
|
||||
struct radeon_ib_pool {
|
||||
struct mutex mutex;
|
||||
struct radeon_mutex mutex;
|
||||
struct radeon_sa_manager sa_manager;
|
||||
struct radeon_ib ibs[RADEON_IB_POOL_SIZE];
|
||||
bool ready;
|
||||
@ -1354,47 +1395,6 @@ struct r600_vram_scratch {
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Mutex which allows recursive locking from the same process.
|
||||
*/
|
||||
struct radeon_mutex {
|
||||
struct mutex mutex;
|
||||
struct task_struct *owner;
|
||||
int level;
|
||||
};
|
||||
|
||||
static inline void radeon_mutex_init(struct radeon_mutex *mutex)
|
||||
{
|
||||
mutex_init(&mutex->mutex);
|
||||
mutex->owner = NULL;
|
||||
mutex->level = 0;
|
||||
}
|
||||
|
||||
static inline void radeon_mutex_lock(struct radeon_mutex *mutex)
|
||||
{
|
||||
if (mutex_trylock(&mutex->mutex)) {
|
||||
/* The mutex was unlocked before, so it's ours now */
|
||||
mutex->owner = current;
|
||||
} else if (mutex->owner != current) {
|
||||
/* Another process locked the mutex, take it */
|
||||
mutex_lock(&mutex->mutex);
|
||||
mutex->owner = current;
|
||||
}
|
||||
/* Otherwise the mutex was already locked by this process */
|
||||
|
||||
mutex->level++;
|
||||
}
|
||||
|
||||
static inline void radeon_mutex_unlock(struct radeon_mutex *mutex)
|
||||
{
|
||||
if (--mutex->level > 0)
|
||||
return;
|
||||
|
||||
mutex->owner = NULL;
|
||||
mutex_unlock(&mutex->mutex);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Core structure, functions and helpers.
|
||||
*/
|
||||
|
@ -58,9 +58,9 @@ static int radeon_atrm_call(acpi_handle atrm_handle, uint8_t *bios,
|
||||
}
|
||||
|
||||
obj = (union acpi_object *)buffer.pointer;
|
||||
memcpy(bios+offset, obj->buffer.pointer, len);
|
||||
memcpy(bios+offset, obj->buffer.pointer, obj->buffer.length);
|
||||
kfree(buffer.pointer);
|
||||
return len;
|
||||
return obj->buffer.length;
|
||||
}
|
||||
|
||||
bool radeon_atrm_supported(struct pci_dev *pdev)
|
||||
|
@ -120,7 +120,7 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev)
|
||||
ret = radeon_atrm_get_bios_chunk(rdev->bios,
|
||||
(i * ATRM_BIOS_PAGE),
|
||||
ATRM_BIOS_PAGE);
|
||||
if (ret <= 0)
|
||||
if (ret < ATRM_BIOS_PAGE)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -720,7 +720,7 @@ int radeon_device_init(struct radeon_device *rdev,
|
||||
/* mutex initialization are all done here so we
|
||||
* can recall function without having locking issues */
|
||||
radeon_mutex_init(&rdev->cs_mutex);
|
||||
mutex_init(&rdev->ib_pool.mutex);
|
||||
radeon_mutex_init(&rdev->ib_pool.mutex);
|
||||
for (i = 0; i < RADEON_NUM_RINGS; ++i)
|
||||
mutex_init(&rdev->ring[i].mutex);
|
||||
mutex_init(&rdev->dc_hw_i2c_mutex);
|
||||
@ -959,9 +959,11 @@ int radeon_resume_kms(struct drm_device *dev)
|
||||
radeon_fbdev_set_suspend(rdev, 0);
|
||||
console_unlock();
|
||||
|
||||
/* init dig PHYs */
|
||||
if (rdev->is_atom_bios)
|
||||
/* init dig PHYs, disp eng pll */
|
||||
if (rdev->is_atom_bios) {
|
||||
radeon_atom_encoder_init(rdev);
|
||||
radeon_atom_dcpll_init(rdev);
|
||||
}
|
||||
/* reset hpd state */
|
||||
radeon_hpd_init(rdev);
|
||||
/* blat the mode back in */
|
||||
|
@ -1305,9 +1305,11 @@ int radeon_modeset_init(struct radeon_device *rdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* init dig PHYs */
|
||||
if (rdev->is_atom_bios)
|
||||
/* init dig PHYs, disp eng pll */
|
||||
if (rdev->is_atom_bios) {
|
||||
radeon_atom_encoder_init(rdev);
|
||||
radeon_atom_dcpll_init(rdev);
|
||||
}
|
||||
|
||||
/* initialize hpd */
|
||||
radeon_hpd_init(rdev);
|
||||
|
@ -202,6 +202,22 @@ radeon_get_connector_for_encoder(struct drm_encoder *encoder)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct drm_connector *
|
||||
radeon_get_connector_for_encoder_init(struct drm_encoder *encoder)
|
||||
{
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
struct drm_connector *connector;
|
||||
struct radeon_connector *radeon_connector;
|
||||
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
radeon_connector = to_radeon_connector(connector);
|
||||
if (radeon_encoder->devices & radeon_connector->devices)
|
||||
return connector;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct drm_encoder *radeon_get_external_encoder(struct drm_encoder *encoder)
|
||||
{
|
||||
struct drm_device *dev = encoder->dev;
|
||||
@ -288,3 +304,64 @@ void radeon_panel_mode_fixup(struct drm_encoder *encoder,
|
||||
|
||||
}
|
||||
|
||||
bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
|
||||
u32 pixel_clock)
|
||||
{
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct drm_connector *connector;
|
||||
struct radeon_connector *radeon_connector;
|
||||
struct radeon_connector_atom_dig *dig_connector;
|
||||
|
||||
connector = radeon_get_connector_for_encoder(encoder);
|
||||
/* if we don't have an active device yet, just use one of
|
||||
* the connectors tied to the encoder.
|
||||
*/
|
||||
if (!connector)
|
||||
connector = radeon_get_connector_for_encoder_init(encoder);
|
||||
radeon_connector = to_radeon_connector(connector);
|
||||
|
||||
switch (connector->connector_type) {
|
||||
case DRM_MODE_CONNECTOR_DVII:
|
||||
case DRM_MODE_CONNECTOR_HDMIB:
|
||||
if (radeon_connector->use_digital) {
|
||||
/* HDMI 1.3 supports up to 340 Mhz over single link */
|
||||
if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
|
||||
if (pixel_clock > 340000)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
} else {
|
||||
if (pixel_clock > 165000)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
} else
|
||||
return false;
|
||||
case DRM_MODE_CONNECTOR_DVID:
|
||||
case DRM_MODE_CONNECTOR_HDMIA:
|
||||
case DRM_MODE_CONNECTOR_DisplayPort:
|
||||
dig_connector = radeon_connector->con_priv;
|
||||
if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
|
||||
(dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
|
||||
return false;
|
||||
else {
|
||||
/* HDMI 1.3 supports up to 340 Mhz over single link */
|
||||
if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
|
||||
if (pixel_clock > 340000)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
} else {
|
||||
if (pixel_clock > 165000)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -135,6 +135,12 @@ static bool radeon_msi_ok(struct radeon_device *rdev)
|
||||
(rdev->pdev->subsystem_device == 0x30c2))
|
||||
return true;
|
||||
|
||||
/* Dell RS690 only seems to work with MSIs. */
|
||||
if ((rdev->pdev->device == 0x791f) &&
|
||||
(rdev->pdev->subsystem_vendor == 0x1028) &&
|
||||
(rdev->pdev->subsystem_device == 0x01fc))
|
||||
return true;
|
||||
|
||||
/* Dell RS690 only seems to work with MSIs. */
|
||||
if ((rdev->pdev->device == 0x791f) &&
|
||||
(rdev->pdev->subsystem_vendor == 0x1028) &&
|
||||
|
@ -362,6 +362,7 @@ struct radeon_encoder_atom_dig {
|
||||
struct backlight_device *bl_dev;
|
||||
int dpms_mode;
|
||||
uint8_t backlight_level;
|
||||
int panel_mode;
|
||||
};
|
||||
|
||||
struct radeon_encoder_atom_dac {
|
||||
@ -466,6 +467,10 @@ radeon_atombios_get_tv_info(struct radeon_device *rdev);
|
||||
|
||||
extern struct drm_connector *
|
||||
radeon_get_connector_for_encoder(struct drm_encoder *encoder);
|
||||
extern struct drm_connector *
|
||||
radeon_get_connector_for_encoder_init(struct drm_encoder *encoder);
|
||||
extern bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
|
||||
u32 pixel_clock);
|
||||
|
||||
extern u16 radeon_encoder_get_dp_bridge_encoder_id(struct drm_encoder *encoder);
|
||||
extern u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector);
|
||||
@ -482,8 +487,11 @@ extern void radeon_dp_link_train(struct drm_encoder *encoder,
|
||||
extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector);
|
||||
extern u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector);
|
||||
extern bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector);
|
||||
extern int radeon_dp_get_panel_mode(struct drm_encoder *encoder,
|
||||
struct drm_connector *connector);
|
||||
extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode);
|
||||
extern void radeon_atom_encoder_init(struct radeon_device *rdev);
|
||||
extern void radeon_atom_dcpll_init(struct radeon_device *rdev);
|
||||
extern void atombios_dig_transmitter_setup(struct drm_encoder *encoder,
|
||||
int action, uint8_t lane_num,
|
||||
uint8_t lane_set);
|
||||
|
@ -109,12 +109,12 @@ int radeon_ib_get(struct radeon_device *rdev, int ring,
|
||||
return r;
|
||||
}
|
||||
|
||||
mutex_lock(&rdev->ib_pool.mutex);
|
||||
radeon_mutex_lock(&rdev->ib_pool.mutex);
|
||||
idx = rdev->ib_pool.head_id;
|
||||
retry:
|
||||
if (cretry > 5) {
|
||||
dev_err(rdev->dev, "failed to get an ib after 5 retry\n");
|
||||
mutex_unlock(&rdev->ib_pool.mutex);
|
||||
radeon_mutex_unlock(&rdev->ib_pool.mutex);
|
||||
radeon_fence_unref(&fence);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@ -139,7 +139,7 @@ retry:
|
||||
*/
|
||||
rdev->ib_pool.head_id = (1 + idx);
|
||||
rdev->ib_pool.head_id &= (RADEON_IB_POOL_SIZE - 1);
|
||||
mutex_unlock(&rdev->ib_pool.mutex);
|
||||
radeon_mutex_unlock(&rdev->ib_pool.mutex);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -158,7 +158,7 @@ retry:
|
||||
}
|
||||
idx = (idx + 1) & (RADEON_IB_POOL_SIZE - 1);
|
||||
}
|
||||
mutex_unlock(&rdev->ib_pool.mutex);
|
||||
radeon_mutex_unlock(&rdev->ib_pool.mutex);
|
||||
radeon_fence_unref(&fence);
|
||||
return r;
|
||||
}
|
||||
@ -171,12 +171,12 @@ void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib)
|
||||
if (tmp == NULL) {
|
||||
return;
|
||||
}
|
||||
mutex_lock(&rdev->ib_pool.mutex);
|
||||
radeon_mutex_lock(&rdev->ib_pool.mutex);
|
||||
if (tmp->fence && !tmp->fence->emitted) {
|
||||
radeon_sa_bo_free(rdev, &tmp->sa_bo);
|
||||
radeon_fence_unref(&tmp->fence);
|
||||
}
|
||||
mutex_unlock(&rdev->ib_pool.mutex);
|
||||
radeon_mutex_unlock(&rdev->ib_pool.mutex);
|
||||
}
|
||||
|
||||
int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib)
|
||||
@ -204,22 +204,25 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib)
|
||||
|
||||
int radeon_ib_pool_init(struct radeon_device *rdev)
|
||||
{
|
||||
struct radeon_sa_manager tmp;
|
||||
int i, r;
|
||||
|
||||
mutex_lock(&rdev->ib_pool.mutex);
|
||||
if (rdev->ib_pool.ready) {
|
||||
mutex_unlock(&rdev->ib_pool.mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = radeon_sa_bo_manager_init(rdev, &rdev->ib_pool.sa_manager,
|
||||
r = radeon_sa_bo_manager_init(rdev, &tmp,
|
||||
RADEON_IB_POOL_SIZE*64*1024,
|
||||
RADEON_GEM_DOMAIN_GTT);
|
||||
if (r) {
|
||||
mutex_unlock(&rdev->ib_pool.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
radeon_mutex_lock(&rdev->ib_pool.mutex);
|
||||
if (rdev->ib_pool.ready) {
|
||||
radeon_mutex_unlock(&rdev->ib_pool.mutex);
|
||||
radeon_sa_bo_manager_fini(rdev, &tmp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
rdev->ib_pool.sa_manager = tmp;
|
||||
INIT_LIST_HEAD(&rdev->ib_pool.sa_manager.sa_bo);
|
||||
for (i = 0; i < RADEON_IB_POOL_SIZE; i++) {
|
||||
rdev->ib_pool.ibs[i].fence = NULL;
|
||||
rdev->ib_pool.ibs[i].idx = i;
|
||||
@ -236,7 +239,7 @@ int radeon_ib_pool_init(struct radeon_device *rdev)
|
||||
if (radeon_debugfs_ring_init(rdev)) {
|
||||
DRM_ERROR("Failed to register debugfs file for rings !\n");
|
||||
}
|
||||
mutex_unlock(&rdev->ib_pool.mutex);
|
||||
radeon_mutex_unlock(&rdev->ib_pool.mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -244,7 +247,7 @@ void radeon_ib_pool_fini(struct radeon_device *rdev)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
mutex_lock(&rdev->ib_pool.mutex);
|
||||
radeon_mutex_lock(&rdev->ib_pool.mutex);
|
||||
if (rdev->ib_pool.ready) {
|
||||
for (i = 0; i < RADEON_IB_POOL_SIZE; i++) {
|
||||
radeon_sa_bo_free(rdev, &rdev->ib_pool.ibs[i].sa_bo);
|
||||
@ -253,7 +256,7 @@ void radeon_ib_pool_fini(struct radeon_device *rdev)
|
||||
radeon_sa_bo_manager_fini(rdev, &rdev->ib_pool.sa_manager);
|
||||
rdev->ib_pool.ready = false;
|
||||
}
|
||||
mutex_unlock(&rdev->ib_pool.mutex);
|
||||
radeon_mutex_unlock(&rdev->ib_pool.mutex);
|
||||
}
|
||||
|
||||
int radeon_ib_pool_start(struct radeon_device *rdev)
|
||||
|
@ -40,7 +40,6 @@ static struct pci_device_id pciidlist[] = {
|
||||
static int sis_driver_load(struct drm_device *dev, unsigned long chipset)
|
||||
{
|
||||
drm_sis_private_t *dev_priv;
|
||||
int ret;
|
||||
|
||||
dev_priv = kzalloc(sizeof(drm_sis_private_t), GFP_KERNEL);
|
||||
if (dev_priv == NULL)
|
||||
@ -50,7 +49,7 @@ static int sis_driver_load(struct drm_device *dev, unsigned long chipset)
|
||||
dev_priv->chipset = chipset;
|
||||
idr_init(&dev->object_name_idr);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sis_driver_unload(struct drm_device *dev)
|
||||
|
@ -404,6 +404,9 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
|
||||
}
|
||||
}
|
||||
|
||||
if (bdev->driver->move_notify)
|
||||
bdev->driver->move_notify(bo, mem);
|
||||
|
||||
if (!(old_man->flags & TTM_MEMTYPE_FLAG_FIXED) &&
|
||||
!(new_man->flags & TTM_MEMTYPE_FLAG_FIXED))
|
||||
ret = ttm_bo_move_ttm(bo, evict, no_wait_reserve, no_wait_gpu, mem);
|
||||
@ -413,11 +416,17 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
|
||||
else
|
||||
ret = ttm_bo_move_memcpy(bo, evict, no_wait_reserve, no_wait_gpu, mem);
|
||||
|
||||
if (ret)
|
||||
goto out_err;
|
||||
if (ret) {
|
||||
if (bdev->driver->move_notify) {
|
||||
struct ttm_mem_reg tmp_mem = *mem;
|
||||
*mem = bo->mem;
|
||||
bo->mem = tmp_mem;
|
||||
bdev->driver->move_notify(bo, mem);
|
||||
bo->mem = *mem;
|
||||
}
|
||||
|
||||
if (bdev->driver->move_notify)
|
||||
bdev->driver->move_notify(bo, mem);
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
moved:
|
||||
if (bo->evicted) {
|
||||
|
@ -1328,6 +1328,7 @@ extern int drm_getmagic(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
extern int drm_authmagic(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
extern int drm_remove_magic(struct drm_master *master, drm_magic_t magic);
|
||||
|
||||
/* Cache management (drm_cache.c) */
|
||||
void drm_clflush_pages(struct page *pages[], unsigned long num_pages);
|
||||
|
Loading…
Reference in New Issue
Block a user