Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux

Pull radeon drm stuff from Dave Airlie:
"Just some radeon fixes, one is for an oops where we run out of ioremap
space on some big hardware systems in 32-bit mode, stuff doesn't work
properly but at least the machine will boot.

One regression fix, and two bugs, one hw, one blit code."

* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux:
drm/radeon/kms: fix hdmi duallink checks
drm/radeon/kms: set SX_MISC in the r6xx blit code (v2)
drm/radeon: deal with errors from framebuffer init path.
drm/radeon: fix a semaphore deadlock on pre cayman asics

+41 -10
+3
drivers/gpu/drm/radeon/r600.c
··· 2362 2362 uint64_t addr = semaphore->gpu_addr; 2363 2363 unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; 2364 2364 2365 + if (rdev->family < CHIP_CAYMAN) 2366 + sel |= PACKET3_SEM_WAIT_ON_SIGNAL; 2367 + 2365 2368 radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); 2366 2369 radeon_ring_write(ring, addr & 0xffffffff); 2367 2370 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel);
+8
drivers/gpu/drm/radeon/r600_blit_shaders.c
··· 314 314 0x00000000, /* VGT_VTX_CNT_EN */ 315 315 316 316 0xc0016900, 317 + 0x000000d4, 318 + 0x00000000, /* SX_MISC */ 319 + 320 + 0xc0016900, 317 321 0x000002c8, 318 322 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ 319 323 ··· 628 624 0x00000000, /* VGT_STRMOUT_EN */ 629 625 0x00000000, /* VGT_REUSE_OFF */ 630 626 0x00000000, /* VGT_VTX_CNT_EN */ 627 + 628 + 0xc0016900, 629 + 0x000000d4, 630 + 0x00000000, /* SX_MISC */ 631 631 632 632 0xc0016900, 633 633 0x000002c8,
+1
drivers/gpu/drm/radeon/r600d.h
··· 831 831 #define PACKET3_STRMOUT_BUFFER_UPDATE 0x34 832 832 #define PACKET3_INDIRECT_BUFFER_MP 0x38 833 833 #define PACKET3_MEM_SEMAPHORE 0x39 834 + # define PACKET3_SEM_WAIT_ON_SIGNAL (0x1 << 12) 834 835 # define PACKET3_SEM_SEL_SIGNAL (0x6 << 29) 835 836 # define PACKET3_SEM_SEL_WAIT (0x7 << 29) 836 837 #define PACKET3_MPEG_INDEX 0x3A
+1 -1
drivers/gpu/drm/radeon/radeon_connectors.c
··· 1057 1057 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) 1058 1058 return MODE_OK; 1059 1059 else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) { 1060 - if (ASIC_IS_DCE3(rdev)) { 1060 + if (0) { 1061 1061 /* HDMI 1.3+ supports max clock of 340 Mhz */ 1062 1062 if (mode->clock > 340000) 1063 1063 return MODE_CLOCK_HIGH;
+15 -3
drivers/gpu/drm/radeon/radeon_display.c
··· 1078 1078 .create_handle = radeon_user_framebuffer_create_handle, 1079 1079 }; 1080 1080 1081 - void 1081 + int 1082 1082 radeon_framebuffer_init(struct drm_device *dev, 1083 1083 struct radeon_framebuffer *rfb, 1084 1084 struct drm_mode_fb_cmd2 *mode_cmd, 1085 1085 struct drm_gem_object *obj) 1086 1086 { 1087 + int ret; 1087 1088 rfb->obj = obj; 1088 - drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs); 1089 + ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs); 1090 + if (ret) { 1091 + rfb->obj = NULL; 1092 + return ret; 1093 + } 1089 1094 drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd); 1095 + return 0; 1090 1096 } 1091 1097 1092 1098 static struct drm_framebuffer * ··· 1102 1096 { 1103 1097 struct drm_gem_object *obj; 1104 1098 struct radeon_framebuffer *radeon_fb; 1099 + int ret; 1105 1100 1106 1101 obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]); 1107 1102 if (obj == NULL) { ··· 1115 1108 if (radeon_fb == NULL) 1116 1109 return ERR_PTR(-ENOMEM); 1117 1110 1118 - radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj); 1111 + ret = radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj); 1112 + if (ret) { 1113 + kfree(radeon_fb); 1114 + drm_gem_object_unreference_unlocked(obj); 1115 + return NULL; 1116 + } 1119 1117 1120 1118 return &radeon_fb->base; 1121 1119 }
+2 -4
drivers/gpu/drm/radeon/radeon_encoders.c
··· 307 307 bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, 308 308 u32 pixel_clock) 309 309 { 310 - struct drm_device *dev = encoder->dev; 311 - struct radeon_device *rdev = dev->dev_private; 312 310 struct drm_connector *connector; 313 311 struct radeon_connector *radeon_connector; 314 312 struct radeon_connector_atom_dig *dig_connector; ··· 324 326 case DRM_MODE_CONNECTOR_HDMIB: 325 327 if (radeon_connector->use_digital) { 326 328 /* HDMI 1.3 supports up to 340 Mhz over single link */ 327 - if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { 329 + if (0 && drm_detect_hdmi_monitor(radeon_connector->edid)) { 328 330 if (pixel_clock > 340000) 329 331 return true; 330 332 else ··· 346 348 return false; 347 349 else { 348 350 /* HDMI 1.3 supports up to 340 Mhz over single link */ 349 - if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { 351 + if (0 && drm_detect_hdmi_monitor(radeon_connector->edid)) { 350 352 if (pixel_clock > 340000) 351 353 return true; 352 354 else
+10 -1
drivers/gpu/drm/radeon/radeon_fb.c
··· 209 209 sizes->surface_depth); 210 210 211 211 ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj); 212 + if (ret) { 213 + DRM_ERROR("failed to create fbcon object %d\n", ret); 214 + return ret; 215 + } 216 + 212 217 rbo = gem_to_radeon_bo(gobj); 213 218 214 219 /* okay we have an object now allocate the framebuffer */ ··· 225 220 226 221 info->par = rfbdev; 227 222 228 - radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj); 223 + ret = radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj); 224 + if (ret) { 225 + DRM_ERROR("failed to initalise framebuffer %d\n", ret); 226 + goto out_unref; 227 + } 229 228 230 229 fb = &rfbdev->rfb.base; 231 230
+1 -1
drivers/gpu/drm/radeon/radeon_mode.h
··· 649 649 u16 blue, int regno); 650 650 extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, 651 651 u16 *blue, int regno); 652 - void radeon_framebuffer_init(struct drm_device *dev, 652 + int radeon_framebuffer_init(struct drm_device *dev, 653 653 struct radeon_framebuffer *rfb, 654 654 struct drm_mode_fb_cmd2 *mode_cmd, 655 655 struct drm_gem_object *obj);