Skip to content

Commit eb96c92

Browse files
committed
Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: drm/radeon/kms: use helper functions for fence read/write drm/radeon/kms: set DP link config properly for DP bridges drm/radeon/kms/atom: AdjustPixelClock fixes for DP bridges drm/radeon/kms: fix handling of DP to LVDS bridges drm/radeon/kms: issue blank/unblank commands for ext encoders drm/radeon/kms: fix support for DDC on dp bridges drm/radeon/kms: add support for load detection on dp bridges drm/radeon/kms: add missing external encoder action drm/radeon/kms: rework atombios_get_encoder_mode() drm/radeon/kms: fix num crtcs for Cedar and Caicos Revert "drm/i915: Enable GMBUS for post-gen2 chipsets" drivers/gpu/drm: use printk_ratelimited instead of printk_ratelimit drm/radeon: workaround a hw bug on some radeon chipsets with all-0 EDIDs. drm: make debug levels match in edid failure code. drm/radeon/kms: clear wb memory by default drm/radeon/kms: be more pedantic about the g5 quirk (v2) drm/radeon/kms: signed fix for evergreen thermal drm: populate irq_by_busid-member for pci
2 parents 8b97b21 + b81157d commit eb96c92

15 files changed

+237
-75
lines changed

drivers/gpu/drm/drm_edid.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,9 @@ drm_edid_block_valid(u8 *raw_edid)
184184

185185
bad:
186186
if (raw_edid) {
187-
DRM_ERROR("Raw EDID:\n");
187+
printk(KERN_ERR "Raw EDID:\n");
188188
print_hex_dump_bytes(KERN_ERR, DUMP_PREFIX_NONE, raw_edid, EDID_LENGTH);
189-
printk("\n");
189+
printk(KERN_ERR "\n");
190190
}
191191
return 0;
192192
}
@@ -258,6 +258,17 @@ drm_do_probe_ddc_edid(struct i2c_adapter *adapter, unsigned char *buf,
258258
return ret == 2 ? 0 : -1;
259259
}
260260

261+
static bool drm_edid_is_zero(u8 *in_edid, int length)
262+
{
263+
int i;
264+
u32 *raw_edid = (u32 *)in_edid;
265+
266+
for (i = 0; i < length / 4; i++)
267+
if (*(raw_edid + i) != 0)
268+
return false;
269+
return true;
270+
}
271+
261272
static u8 *
262273
drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
263274
{
@@ -273,6 +284,10 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
273284
goto out;
274285
if (drm_edid_block_valid(block))
275286
break;
287+
if (i == 0 && drm_edid_is_zero(block, EDID_LENGTH)) {
288+
connector->null_edid_counter++;
289+
goto carp;
290+
}
276291
}
277292
if (i == 4)
278293
goto carp;

drivers/gpu/drm/drm_ioc32.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
* IN THE SOFTWARE.
2929
*/
3030
#include <linux/compat.h>
31+
#include <linux/ratelimit.h>
3132

3233
#include "drmP.h"
3334
#include "drm_core.h"
@@ -253,10 +254,10 @@ static int compat_drm_addmap(struct file *file, unsigned int cmd,
253254
return -EFAULT;
254255

255256
m32.handle = (unsigned long)handle;
256-
if (m32.handle != (unsigned long)handle && printk_ratelimit())
257-
printk(KERN_ERR "compat_drm_addmap truncated handle"
258-
" %p for type %d offset %x\n",
259-
handle, m32.type, m32.offset);
257+
if (m32.handle != (unsigned long)handle)
258+
printk_ratelimited(KERN_ERR "compat_drm_addmap truncated handle"
259+
" %p for type %d offset %x\n",
260+
handle, m32.type, m32.offset);
260261

261262
if (copy_to_user(argp, &m32, sizeof(m32)))
262263
return -EFAULT;

drivers/gpu/drm/drm_pci.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ int drm_pci_set_unique(struct drm_device *dev,
251251
}
252252

253253

254-
int drm_pci_irq_by_busid(struct drm_device *dev, struct drm_irq_busid *p)
254+
static int drm_pci_irq_by_busid(struct drm_device *dev, struct drm_irq_busid *p)
255255
{
256256
if ((p->busnum >> 8) != drm_get_pci_domain(dev) ||
257257
(p->busnum & 0xff) != dev->pdev->bus->number ||
@@ -292,6 +292,7 @@ static struct drm_bus drm_pci_bus = {
292292
.get_name = drm_pci_get_name,
293293
.set_busid = drm_pci_set_busid,
294294
.set_unique = drm_pci_set_unique,
295+
.irq_by_busid = drm_pci_irq_by_busid,
295296
.agp_init = drm_pci_agp_init,
296297
};
297298

drivers/gpu/drm/i915/intel_i2c.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,8 +401,7 @@ int intel_setup_gmbus(struct drm_device *dev)
401401
bus->reg0 = i | GMBUS_RATE_100KHZ;
402402

403403
/* XXX force bit banging until GMBUS is fully debugged */
404-
if (IS_GEN2(dev))
405-
bus->force_bit = intel_gpio_create(dev_priv, i);
404+
bus->force_bit = intel_gpio_create(dev_priv, i);
406405
}
407406

408407
intel_i2c_reset(dev_priv->dev);

drivers/gpu/drm/radeon/atombios.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,6 +1200,7 @@ typedef struct _EXTERNAL_ENCODER_CONTROL_PARAMETERS_V3
12001200
#define EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING_OFF 0x10
12011201
#define EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING 0x11
12021202
#define EXTERNAL_ENCODER_ACTION_V3_DACLOAD_DETECTION 0x12
1203+
#define EXTERNAL_ENCODER_ACTION_V3_DDC_SETUP 0x14
12031204

12041205
// ucConfig
12051206
#define EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_MASK 0x03

drivers/gpu/drm/radeon/atombios_crtc.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,13 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
671671
DISPPLL_CONFIG_DUAL_LINK;
672672
}
673673
}
674+
if (radeon_encoder_is_dp_bridge(encoder)) {
675+
struct drm_encoder *ext_encoder = radeon_atom_get_external_encoder(encoder);
676+
struct radeon_encoder *ext_radeon_encoder = to_radeon_encoder(ext_encoder);
677+
args.v3.sInput.ucExtTransmitterID = ext_radeon_encoder->encoder_id;
678+
} else
679+
args.v3.sInput.ucExtTransmitterID = 0;
680+
674681
atom_execute_table(rdev->mode_info.atom_context,
675682
index, (uint32_t *)&args);
676683
adjusted_clock = le32_to_cpu(args.v3.sOutput.ulDispPllFreq) * 10;

drivers/gpu/drm/radeon/evergreen.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ u32 evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
8888
/* get temperature in millidegrees */
8989
int evergreen_get_temp(struct radeon_device *rdev)
9090
{
91-
u32 temp, toffset, actual_temp = 0;
91+
u32 temp, toffset;
92+
int actual_temp = 0;
9293

9394
if (rdev->family == CHIP_JUNIPER) {
9495
toffset = (RREG32(CG_THERMAL_CTRL) & TOFFSET_MASK) >>

drivers/gpu/drm/radeon/radeon_asic.c

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -938,6 +938,13 @@ static struct radeon_asic cayman_asic = {
938938
int radeon_asic_init(struct radeon_device *rdev)
939939
{
940940
radeon_register_accessor_init(rdev);
941+
942+
/* set the number of crtcs */
943+
if (rdev->flags & RADEON_SINGLE_CRTC)
944+
rdev->num_crtc = 1;
945+
else
946+
rdev->num_crtc = 2;
947+
941948
switch (rdev->family) {
942949
case CHIP_R100:
943950
case CHIP_RV100:
@@ -1017,6 +1024,11 @@ int radeon_asic_init(struct radeon_device *rdev)
10171024
case CHIP_JUNIPER:
10181025
case CHIP_CYPRESS:
10191026
case CHIP_HEMLOCK:
1027+
/* set num crtcs */
1028+
if (rdev->family == CHIP_CEDAR)
1029+
rdev->num_crtc = 4;
1030+
else
1031+
rdev->num_crtc = 6;
10201032
rdev->asic = &evergreen_asic;
10211033
break;
10221034
case CHIP_PALM:
@@ -1027,10 +1039,17 @@ int radeon_asic_init(struct radeon_device *rdev)
10271039
case CHIP_BARTS:
10281040
case CHIP_TURKS:
10291041
case CHIP_CAICOS:
1042+
/* set num crtcs */
1043+
if (rdev->family == CHIP_CAICOS)
1044+
rdev->num_crtc = 4;
1045+
else
1046+
rdev->num_crtc = 6;
10301047
rdev->asic = &btc_asic;
10311048
break;
10321049
case CHIP_CAYMAN:
10331050
rdev->asic = &cayman_asic;
1051+
/* set num crtcs */
1052+
rdev->num_crtc = 6;
10341053
break;
10351054
default:
10361055
/* FIXME: not supported yet */
@@ -1042,18 +1061,6 @@ int radeon_asic_init(struct radeon_device *rdev)
10421061
rdev->asic->set_memory_clock = NULL;
10431062
}
10441063

1045-
/* set the number of crtcs */
1046-
if (rdev->flags & RADEON_SINGLE_CRTC)
1047-
rdev->num_crtc = 1;
1048-
else {
1049-
if (ASIC_IS_DCE41(rdev))
1050-
rdev->num_crtc = 2;
1051-
else if (ASIC_IS_DCE4(rdev))
1052-
rdev->num_crtc = 6;
1053-
else
1054-
rdev->num_crtc = 2;
1055-
}
1056-
10571064
return 0;
10581065
}
10591066

drivers/gpu/drm/radeon/radeon_combios.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1553,9 +1553,12 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
15531553
(rdev->pdev->subsystem_device == 0x4a48)) {
15541554
/* Mac X800 */
15551555
rdev->mode_info.connector_table = CT_MAC_X800;
1556-
} else if (of_machine_is_compatible("PowerMac7,2") ||
1557-
of_machine_is_compatible("PowerMac7,3")) {
1558-
/* Mac G5 9600 */
1556+
} else if ((of_machine_is_compatible("PowerMac7,2") ||
1557+
of_machine_is_compatible("PowerMac7,3")) &&
1558+
(rdev->pdev->device == 0x4150) &&
1559+
(rdev->pdev->subsystem_vendor == 0x1002) &&
1560+
(rdev->pdev->subsystem_device == 0x4150)) {
1561+
/* Mac G5 tower 9600 */
15591562
rdev->mode_info.connector_table = CT_MAC_G5_9600;
15601563
} else
15611564
#endif /* CONFIG_PPC_PMAC */

drivers/gpu/drm/radeon/radeon_connectors.c

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ extern void
4444
radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder,
4545
struct drm_connector *drm_connector);
4646

47+
bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector);
48+
4749
void radeon_connector_hotplug(struct drm_connector *connector)
4850
{
4951
struct drm_device *dev = connector->dev;
@@ -836,6 +838,13 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
836838
if (!radeon_connector->edid) {
837839
DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
838840
drm_get_connector_name(connector));
841+
/* rs690 seems to have a problem with connectors not existing and always
842+
* return a block of 0's. If we see this just stop polling on this output */
843+
if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && radeon_connector->base.null_edid_counter) {
844+
ret = connector_status_disconnected;
845+
DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n", drm_get_connector_name(connector));
846+
radeon_connector->ddc_bus = NULL;
847+
}
839848
} else {
840849
radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
841850

@@ -1063,10 +1072,11 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
10631072
{
10641073
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
10651074
struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1075+
struct drm_encoder *encoder = radeon_best_single_encoder(connector);
10661076
int ret;
10671077

1068-
if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1069-
struct drm_encoder *encoder;
1078+
if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1079+
(connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
10701080
struct drm_display_mode *mode;
10711081

10721082
if (!radeon_dig_connector->edp_on)
@@ -1078,7 +1088,6 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
10781088
ATOM_TRANSMITTER_ACTION_POWER_OFF);
10791089

10801090
if (ret > 0) {
1081-
encoder = radeon_best_single_encoder(connector);
10821091
if (encoder) {
10831092
radeon_fixup_lvds_native_mode(encoder, connector);
10841093
/* add scaled modes */
@@ -1102,8 +1111,14 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
11021111
/* add scaled modes */
11031112
radeon_add_common_modes(encoder, connector);
11041113
}
1105-
} else
1114+
} else {
1115+
/* need to setup ddc on the bridge */
1116+
if (radeon_connector_encoder_is_dp_bridge(connector)) {
1117+
if (encoder)
1118+
radeon_atom_ext_encoder_setup_ddc(encoder);
1119+
}
11061120
ret = radeon_ddc_get_modes(radeon_connector);
1121+
}
11071122

11081123
return ret;
11091124
}
@@ -1187,14 +1202,15 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
11871202
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
11881203
enum drm_connector_status ret = connector_status_disconnected;
11891204
struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1205+
struct drm_encoder *encoder = radeon_best_single_encoder(connector);
11901206

11911207
if (radeon_connector->edid) {
11921208
kfree(radeon_connector->edid);
11931209
radeon_connector->edid = NULL;
11941210
}
11951211

1196-
if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1197-
struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1212+
if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1213+
(connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
11981214
if (encoder) {
11991215
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
12001216
struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
@@ -1214,6 +1230,11 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
12141230
atombios_set_edp_panel_power(connector,
12151231
ATOM_TRANSMITTER_ACTION_POWER_OFF);
12161232
} else {
1233+
/* need to setup ddc on the bridge */
1234+
if (radeon_connector_encoder_is_dp_bridge(connector)) {
1235+
if (encoder)
1236+
radeon_atom_ext_encoder_setup_ddc(encoder);
1237+
}
12171238
radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);
12181239
if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
12191240
ret = connector_status_connected;
@@ -1228,6 +1249,16 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
12281249
ret = connector_status_connected;
12291250
}
12301251
}
1252+
1253+
if ((ret == connector_status_disconnected) &&
1254+
radeon_connector->dac_load_detect) {
1255+
struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1256+
struct drm_encoder_helper_funcs *encoder_funcs;
1257+
if (encoder) {
1258+
encoder_funcs = encoder->helper_private;
1259+
ret = encoder_funcs->detect(encoder, connector);
1260+
}
1261+
}
12311262
}
12321263

12331264
radeon_connector_update_scratch_regs(connector, ret);
@@ -1242,7 +1273,8 @@ static int radeon_dp_mode_valid(struct drm_connector *connector,
12421273

12431274
/* XXX check mode bandwidth */
12441275

1245-
if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1276+
if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1277+
(connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
12461278
struct drm_encoder *encoder = radeon_best_single_encoder(connector);
12471279

12481280
if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
@@ -1252,7 +1284,7 @@ static int radeon_dp_mode_valid(struct drm_connector *connector,
12521284
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
12531285
struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
12541286

1255-
/* AVIVO hardware supports downscaling modes larger than the panel
1287+
/* AVIVO hardware supports downscaling modes larger than the panel
12561288
* to the panel size, but I'm not sure this is desirable.
12571289
*/
12581290
if ((mode->hdisplay > native_mode->hdisplay) ||
@@ -1401,6 +1433,10 @@ radeon_add_atom_connector(struct drm_device *dev,
14011433
default:
14021434
connector->interlace_allowed = true;
14031435
connector->doublescan_allowed = true;
1436+
radeon_connector->dac_load_detect = true;
1437+
drm_connector_attach_property(&radeon_connector->base,
1438+
rdev->mode_info.load_detect_property,
1439+
1);
14041440
break;
14051441
case DRM_MODE_CONNECTOR_DVII:
14061442
case DRM_MODE_CONNECTOR_DVID:
@@ -1422,6 +1458,12 @@ radeon_add_atom_connector(struct drm_device *dev,
14221458
connector->doublescan_allowed = true;
14231459
else
14241460
connector->doublescan_allowed = false;
1461+
if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1462+
radeon_connector->dac_load_detect = true;
1463+
drm_connector_attach_property(&radeon_connector->base,
1464+
rdev->mode_info.load_detect_property,
1465+
1);
1466+
}
14251467
break;
14261468
case DRM_MODE_CONNECTOR_LVDS:
14271469
case DRM_MODE_CONNECTOR_eDP:

drivers/gpu/drm/radeon/radeon_device.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ int radeon_wb_init(struct radeon_device *rdev)
215215
return r;
216216
}
217217

218+
/* clear wb memory */
219+
memset((char *)rdev->wb.wb, 0, RADEON_GPU_PAGE_SIZE);
218220
/* disable event_write fences */
219221
rdev->wb.use_event = false;
220222
/* disabled via module param */

0 commit comments

Comments
 (0)