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/r600: fix possible NULL pointer derefernce
drm/radeon/kms: add quirk for ASUS HD 3600 board
include/linux/vgaarb.h: add missing part of include guard
drm/nouveau: Fix crashes during fbcon init on single head cards.
drm/nouveau: fix pcirom vbios shadow breakage from acpi rom patch
drm/radeon/kms: fix shared ddc harder
drm/i915: enable low power render writes on GEN3 hardware.
drm/i915: Define MI_ARB_STATE bits
vmwgfx: return -EFAULT if copy_to_user fails
fb: handle allocation failure in alloc_apertures()
drm: radeon: check kzalloc() result
drm/ttm: Fix build on architectures without AGP
drm/radeon/kms: fix gtt MC base alignment on rs4xx/rs690/rs740 asics
drm/radeon/kms: fix possible mis-detection of sideport on rs690/rs740
drm/radeon/kms: fix legacy tv-out pal mode

+142 -49
+10
drivers/gpu/drm/i915/i915_gem.c
··· 4742 4742 list_add(&dev_priv->mm.shrink_list, &shrink_list); 4743 4743 spin_unlock(&shrink_list_lock); 4744 4744 4745 + /* On GEN3 we really need to make sure the ARB C3 LP bit is set */ 4746 + if (IS_GEN3(dev)) { 4747 + u32 tmp = I915_READ(MI_ARB_STATE); 4748 + if (!(tmp & MI_ARB_C3_LP_WRITE_ENABLE)) { 4749 + /* arb state is a masked write, so set bit + bit in mask */ 4750 + tmp = MI_ARB_C3_LP_WRITE_ENABLE | (MI_ARB_C3_LP_WRITE_ENABLE << MI_ARB_MASK_SHIFT); 4751 + I915_WRITE(MI_ARB_STATE, tmp); 4752 + } 4753 + } 4754 + 4745 4755 /* Old X drivers will take 0-2 for front, back, depth buffers */ 4746 4756 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 4747 4757 dev_priv->fence_reg_start = 3;
+64
drivers/gpu/drm/i915/i915_reg.h
··· 359 359 #define LM_BURST_LENGTH 0x00000700 360 360 #define LM_FIFO_WATERMARK 0x0000001F 361 361 #define MI_ARB_STATE 0x020e4 /* 915+ only */ 362 + #define MI_ARB_MASK_SHIFT 16 /* shift for enable bits */ 363 + 364 + /* Make render/texture TLB fetches lower priorty than associated data 365 + * fetches. This is not turned on by default 366 + */ 367 + #define MI_ARB_RENDER_TLB_LOW_PRIORITY (1 << 15) 368 + 369 + /* Isoch request wait on GTT enable (Display A/B/C streams). 370 + * Make isoch requests stall on the TLB update. May cause 371 + * display underruns (test mode only) 372 + */ 373 + #define MI_ARB_ISOCH_WAIT_GTT (1 << 14) 374 + 375 + /* Block grant count for isoch requests when block count is 376 + * set to a finite value. 377 + */ 378 + #define MI_ARB_BLOCK_GRANT_MASK (3 << 12) 379 + #define MI_ARB_BLOCK_GRANT_8 (0 << 12) /* for 3 display planes */ 380 + #define MI_ARB_BLOCK_GRANT_4 (1 << 12) /* for 2 display planes */ 381 + #define MI_ARB_BLOCK_GRANT_2 (2 << 12) /* for 1 display plane */ 382 + #define MI_ARB_BLOCK_GRANT_0 (3 << 12) /* don't use */ 383 + 384 + /* Enable render writes to complete in C2/C3/C4 power states. 385 + * If this isn't enabled, render writes are prevented in low 386 + * power states. That seems bad to me. 387 + */ 388 + #define MI_ARB_C3_LP_WRITE_ENABLE (1 << 11) 389 + 390 + /* This acknowledges an async flip immediately instead 391 + * of waiting for 2TLB fetches. 392 + */ 393 + #define MI_ARB_ASYNC_FLIP_ACK_IMMEDIATE (1 << 10) 394 + 395 + /* Enables non-sequential data reads through arbiter 396 + */ 397 + #define MI_ARB_DUAL_DATA_PHASE_DISABLE (1 << 9) 398 + 399 + /* Disable FSB snooping of cacheable write cycles from binner/render 400 + * command stream 401 + */ 402 + #define MI_ARB_CACHE_SNOOP_DISABLE (1 << 8) 403 + 404 + /* Arbiter time slice for non-isoch streams */ 405 + #define MI_ARB_TIME_SLICE_MASK (7 << 5) 406 + #define MI_ARB_TIME_SLICE_1 (0 << 5) 407 + #define MI_ARB_TIME_SLICE_2 (1 << 5) 408 + #define MI_ARB_TIME_SLICE_4 (2 << 5) 409 + #define MI_ARB_TIME_SLICE_6 (3 << 5) 410 + #define MI_ARB_TIME_SLICE_8 (4 << 5) 411 + #define MI_ARB_TIME_SLICE_10 (5 << 5) 412 + #define MI_ARB_TIME_SLICE_14 (6 << 5) 413 + #define MI_ARB_TIME_SLICE_16 (7 << 5) 414 + 415 + /* Low priority grace period page size */ 416 + #define MI_ARB_LOW_PRIORITY_GRACE_4KB (0 << 4) /* default */ 417 + #define MI_ARB_LOW_PRIORITY_GRACE_8KB (1 << 4) 418 + 419 + /* Disable display A/B trickle feed */ 420 + #define MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE (1 << 2) 421 + 422 + /* Set display plane priority */ 423 + #define MI_ARB_DISPLAY_PRIORITY_A_B (0 << 0) /* display A > display B */ 424 + #define MI_ARB_DISPLAY_PRIORITY_B_A (1 << 0) /* display B > display A */ 425 + 362 426 #define CACHE_MODE_0 0x02120 /* 915+ only */ 363 427 #define CM0_MASK_SHIFT 16 364 428 #define CM0_IZ_OPT_DISABLE (1<<6)
+9 -24
drivers/gpu/drm/nouveau/nouveau_bios.c
··· 203 203 const bool rw; 204 204 }; 205 205 206 - static struct methods nv04_methods[] = { 207 - { "PROM", load_vbios_prom, false }, 206 + static struct methods shadow_methods[] = { 208 207 { "PRAMIN", load_vbios_pramin, true }, 208 + { "PROM", load_vbios_prom, false }, 209 209 { "PCIROM", load_vbios_pci, true }, 210 - }; 211 - 212 - static struct methods nv50_methods[] = { 213 210 { "ACPI", load_vbios_acpi, true }, 214 - { "PRAMIN", load_vbios_pramin, true }, 215 - { "PROM", load_vbios_prom, false }, 216 - { "PCIROM", load_vbios_pci, true }, 217 211 }; 218 - 219 - #define METHODCNT 3 220 212 221 213 static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data) 222 214 { 223 - struct drm_nouveau_private *dev_priv = dev->dev_private; 224 - struct methods *methods; 225 - int i; 215 + const int nr_methods = ARRAY_SIZE(shadow_methods); 216 + struct methods *methods = shadow_methods; 226 217 int testscore = 3; 227 - int scores[METHODCNT]; 218 + int scores[nr_methods], i; 228 219 229 220 if (nouveau_vbios) { 230 - methods = nv04_methods; 231 - for (i = 0; i < METHODCNT; i++) 221 + for (i = 0; i < nr_methods; i++) 232 222 if (!strcasecmp(nouveau_vbios, methods[i].desc)) 233 223 break; 234 224 235 - if (i < METHODCNT) { 225 + if (i < nr_methods) { 236 226 NV_INFO(dev, "Attempting to use BIOS image from %s\n", 237 227 methods[i].desc); 238 228 ··· 234 244 NV_ERROR(dev, "VBIOS source \'%s\' invalid\n", nouveau_vbios); 235 245 } 236 246 237 - if (dev_priv->card_type < NV_50) 238 - methods = nv04_methods; 239 - else 240 - methods = nv50_methods; 241 - 242 - for (i = 0; i < METHODCNT; i++) { 247 + for (i = 0; i < nr_methods; i++) { 243 248 NV_TRACE(dev, "Attempting to load BIOS image from %s\n", 244 249 methods[i].desc); 245 250 data[0] = data[1] = 0; /* avoid reuse of previous image */ ··· 245 260 } 246 261 247 262 while (--testscore > 0) { 248 - for (i = 0; i < METHODCNT; i++) { 263 + for (i = 0; i < nr_methods; i++) { 249 264 if (scores[i] == testscore) { 250 265 NV_TRACE(dev, "Using BIOS image from %s\n", 251 266 methods[i].desc);
+2 -1
drivers/gpu/drm/nouveau/nouveau_fbcon.c
··· 387 387 dev_priv->nfbdev = nfbdev; 388 388 nfbdev->helper.funcs = &nouveau_fbcon_helper_funcs; 389 389 390 - ret = drm_fb_helper_init(dev, &nfbdev->helper, 2, 4); 390 + ret = drm_fb_helper_init(dev, &nfbdev->helper, 391 + nv_two_heads(dev) ? 2 : 1, 4); 391 392 if (ret) { 392 393 kfree(nfbdev); 393 394 return ret;
+1
drivers/gpu/drm/radeon/r100.c
··· 2354 2354 if (rdev->flags & RADEON_IS_IGP) 2355 2355 base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; 2356 2356 radeon_vram_location(rdev, &rdev->mc, base); 2357 + rdev->mc.gtt_base_align = 0; 2357 2358 if (!(rdev->flags & RADEON_IS_AGP)) 2358 2359 radeon_gtt_location(rdev, &rdev->mc); 2359 2360 radeon_update_bandwidth_info(rdev);
+3
drivers/gpu/drm/radeon/r300.c
··· 481 481 if (rdev->flags & RADEON_IS_IGP) 482 482 base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; 483 483 radeon_vram_location(rdev, &rdev->mc, base); 484 + rdev->mc.gtt_base_align = 0; 484 485 if (!(rdev->flags & RADEON_IS_AGP)) 485 486 radeon_gtt_location(rdev, &rdev->mc); 486 487 radeon_update_bandwidth_info(rdev); ··· 1177 1176 int r; 1178 1177 1179 1178 track = kzalloc(sizeof(*track), GFP_KERNEL); 1179 + if (track == NULL) 1180 + return -ENOMEM; 1180 1181 r100_cs_track_clear(p->rdev, track); 1181 1182 p->track = track; 1182 1183 do {
+1
drivers/gpu/drm/radeon/r520.c
··· 125 125 r520_vram_get_type(rdev); 126 126 r100_vram_init_sizes(rdev); 127 127 radeon_vram_location(rdev, &rdev->mc, 0); 128 + rdev->mc.gtt_base_align = 0; 128 129 if (!(rdev->flags & RADEON_IS_AGP)) 129 130 radeon_gtt_location(rdev, &rdev->mc); 130 131 radeon_update_bandwidth_info(rdev);
+1
drivers/gpu/drm/radeon/r600.c
··· 1179 1179 if (rdev->flags & RADEON_IS_IGP) 1180 1180 base = (RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24; 1181 1181 radeon_vram_location(rdev, &rdev->mc, base); 1182 + rdev->mc.gtt_base_align = 0; 1182 1183 radeon_gtt_location(rdev, mc); 1183 1184 } 1184 1185 }
+4 -1
drivers/gpu/drm/radeon/r600_blit.c
··· 538 538 r600_prepare_blit_copy(struct drm_device *dev, struct drm_file *file_priv) 539 539 { 540 540 drm_radeon_private_t *dev_priv = dev->dev_private; 541 + int ret; 541 542 DRM_DEBUG("\n"); 542 543 543 - r600_nomm_get_vb(dev); 544 + ret = r600_nomm_get_vb(dev); 545 + if (ret) 546 + return ret; 544 547 545 548 dev_priv->blit_vb->file_priv = file_priv; 546 549
+1
drivers/gpu/drm/radeon/radeon.h
··· 351 351 int vram_mtrr; 352 352 bool vram_is_ddr; 353 353 bool igp_sideport_enabled; 354 + u64 gtt_base_align; 354 355 }; 355 356 356 357 bool radeon_combios_sideport_present(struct radeon_device *rdev);
+18 -2
drivers/gpu/drm/radeon/radeon_atombios.c
··· 280 280 } 281 281 } 282 282 283 + /* ASUS HD 3600 board lists the DVI port as HDMI */ 284 + if ((dev->pdev->device == 0x9598) && 285 + (dev->pdev->subsystem_vendor == 0x1043) && 286 + (dev->pdev->subsystem_device == 0x01e4)) { 287 + if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) { 288 + *connector_type = DRM_MODE_CONNECTOR_DVII; 289 + } 290 + } 291 + 283 292 /* ASUS HD 3450 board lists the DVI port as HDMI */ 284 293 if ((dev->pdev->device == 0x95C5) && 285 294 (dev->pdev->subsystem_vendor == 0x1043) && ··· 1038 1029 data_offset); 1039 1030 switch (crev) { 1040 1031 case 1: 1041 - if (igp_info->info.ucMemoryType & 0xf0) 1042 - return true; 1032 + /* AMD IGPS */ 1033 + if ((rdev->family == CHIP_RS690) || 1034 + (rdev->family == CHIP_RS740)) { 1035 + if (igp_info->info.ulBootUpMemoryClock) 1036 + return true; 1037 + } else { 1038 + if (igp_info->info.ucMemoryType & 0xf0) 1039 + return true; 1040 + } 1043 1041 break; 1044 1042 case 2: 1045 1043 if (igp_info->info_2.ucMemoryType & 0x0f)
+9 -14
drivers/gpu/drm/radeon/radeon_connectors.c
··· 771 771 } else 772 772 ret = connector_status_connected; 773 773 774 - /* multiple connectors on the same encoder with the same ddc line 775 - * This tends to be HDMI and DVI on the same encoder with the 776 - * same ddc line. If the edid says HDMI, consider the HDMI port 777 - * connected and the DVI port disconnected. If the edid doesn't 778 - * say HDMI, vice versa. 774 + /* This gets complicated. We have boards with VGA + HDMI with a 775 + * shared DDC line and we have boards with DVI-D + HDMI with a shared 776 + * DDC line. The latter is more complex because with DVI<->HDMI adapters 777 + * you don't really know what's connected to which port as both are digital. 779 778 */ 780 779 if (radeon_connector->shared_ddc && (ret == connector_status_connected)) { 781 780 struct drm_device *dev = connector->dev; 781 + struct radeon_device *rdev = dev->dev_private; 782 782 struct drm_connector *list_connector; 783 783 struct radeon_connector *list_radeon_connector; 784 784 list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) { ··· 788 788 if (list_radeon_connector->shared_ddc && 789 789 (list_radeon_connector->ddc_bus->rec.i2c_id == 790 790 radeon_connector->ddc_bus->rec.i2c_id)) { 791 - if (drm_detect_hdmi_monitor(radeon_connector->edid)) { 792 - if (connector->connector_type == DRM_MODE_CONNECTOR_DVID) { 793 - kfree(radeon_connector->edid); 794 - radeon_connector->edid = NULL; 795 - ret = connector_status_disconnected; 796 - } 797 - } else { 798 - if ((connector->connector_type == DRM_MODE_CONNECTOR_HDMIA) || 799 - (connector->connector_type == DRM_MODE_CONNECTOR_HDMIB)) { 791 + /* cases where both connectors are digital */ 792 + if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) { 793 + /* hpd is our only option in this case */ 794 + if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { 800 795 kfree(radeon_connector->edid); 801 796 radeon_connector->edid = NULL; 802 797 ret = connector_status_disconnected;
+4 -4
drivers/gpu/drm/radeon/radeon_device.c
··· 226 226 { 227 227 u64 size_af, size_bf; 228 228 229 - size_af = 0xFFFFFFFF - mc->vram_end; 230 - size_bf = mc->vram_start; 229 + size_af = ((0xFFFFFFFF - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align; 230 + size_bf = mc->vram_start & ~mc->gtt_base_align; 231 231 if (size_bf > size_af) { 232 232 if (mc->gtt_size > size_bf) { 233 233 dev_warn(rdev->dev, "limiting GTT\n"); 234 234 mc->gtt_size = size_bf; 235 235 } 236 - mc->gtt_start = mc->vram_start - mc->gtt_size; 236 + mc->gtt_start = (mc->vram_start & ~mc->gtt_base_align) - mc->gtt_size; 237 237 } else { 238 238 if (mc->gtt_size > size_af) { 239 239 dev_warn(rdev->dev, "limiting GTT\n"); 240 240 mc->gtt_size = size_af; 241 241 } 242 - mc->gtt_start = mc->vram_end + 1; 242 + mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align; 243 243 } 244 244 mc->gtt_end = mc->gtt_start + mc->gtt_size - 1; 245 245 dev_info(rdev->dev, "GTT: %lluM 0x%08llX - 0x%08llX\n",
+2 -2
drivers/gpu/drm/radeon/radeon_legacy_tv.c
··· 642 642 } 643 643 flicker_removal = (tmp + 500) / 1000; 644 644 645 - if (flicker_removal < 2) 646 - flicker_removal = 2; 645 + if (flicker_removal < 3) 646 + flicker_removal = 3; 647 647 for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) { 648 648 if (flicker_removal == SLOPE_limit[i]) 649 649 break;
+4 -1
drivers/gpu/drm/radeon/rs400.c
··· 57 57 } 58 58 if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) { 59 59 /* FIXME: RS400 & RS480 seems to have issue with GART size 60 - * if 4G of system memory (needs more testing) */ 60 + * if 4G of system memory (needs more testing) 61 + */ 62 + /* XXX is this still an issue with proper alignment? */ 61 63 rdev->mc.gtt_size = 32 * 1024 * 1024; 62 64 DRM_ERROR("Forcing to 32M GART size (because of ASIC bug ?)\n"); 63 65 } ··· 265 263 r100_vram_init_sizes(rdev); 266 264 base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; 267 265 radeon_vram_location(rdev, &rdev->mc, base); 266 + rdev->mc.gtt_base_align = rdev->mc.gtt_size - 1; 268 267 radeon_gtt_location(rdev, &rdev->mc); 269 268 radeon_update_bandwidth_info(rdev); 270 269 }
+1
drivers/gpu/drm/radeon/rs600.c
··· 698 698 base = G_000004_MC_FB_START(base) << 16; 699 699 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 700 700 radeon_vram_location(rdev, &rdev->mc, base); 701 + rdev->mc.gtt_base_align = 0; 701 702 radeon_gtt_location(rdev, &rdev->mc); 702 703 radeon_update_bandwidth_info(rdev); 703 704 }
+1
drivers/gpu/drm/radeon/rs690.c
··· 162 162 rs690_pm_info(rdev); 163 163 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 164 164 radeon_vram_location(rdev, &rdev->mc, base); 165 + rdev->mc.gtt_base_align = rdev->mc.gtt_size - 1; 165 166 radeon_gtt_location(rdev, &rdev->mc); 166 167 radeon_update_bandwidth_info(rdev); 167 168 }
+1
drivers/gpu/drm/radeon/rv515.c
··· 195 195 rv515_vram_get_type(rdev); 196 196 r100_vram_init_sizes(rdev); 197 197 radeon_vram_location(rdev, &rdev->mc, 0); 198 + rdev->mc.gtt_base_align = 0; 198 199 if (!(rdev->flags & RADEON_IS_AGP)) 199 200 radeon_gtt_location(rdev, &rdev->mc); 200 201 radeon_update_bandwidth_info(rdev);
+2
drivers/gpu/drm/ttm/ttm_page_alloc.c
··· 40 40 #include <linux/slab.h> 41 41 42 42 #include <asm/atomic.h> 43 + #ifdef TTM_HAS_AGP 43 44 #include <asm/agp.h> 45 + #endif 44 46 45 47 #include "ttm/ttm_bo_driver.h" 46 48 #include "ttm/ttm_page_alloc.h"
+1
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
··· 972 972 ret = copy_from_user(rects, user_rects, rects_size); 973 973 if (unlikely(ret != 0)) { 974 974 DRM_ERROR("Failed to get rects.\n"); 975 + ret = -EFAULT; 975 976 goto out_free; 976 977 } 977 978
+2
include/linux/fb.h
··· 873 873 static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { 874 874 struct apertures_struct *a = kzalloc(sizeof(struct apertures_struct) 875 875 + max_num * sizeof(struct aperture), GFP_KERNEL); 876 + if (!a) 877 + return NULL; 876 878 a->count = max_num; 877 879 return a; 878 880 }
+1
include/linux/vgaarb.h
··· 29 29 */ 30 30 31 31 #ifndef LINUX_VGA_H 32 + #define LINUX_VGA_H 32 33 33 34 #include <asm/vga.h> 34 35