Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

Pull drm fixes from Dave Airlie:
"For your Friday pull request stack, nothing astounding or shattering
this week some exynos, some intel, some radeon fixes. One intel fix
for a regression somwehere back in 2.6.35 land."

* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux:
drm/radeon/kms: use frac fb div on APUs
drm/radeon: add a missing entry to encoder_names
drm/i915: handle input/output sdvo timings separately in mode_set
drm/i915: fix integer overflow in i915_gem_do_execbuffer()
drm/i915: fix integer overflow in i915_gem_execbuffer2()
drm/exynos: added missed vm area region mapping type.
drm/exynos: fixed exynos_drm_gem_map_pages bug.
drm/exynos: fixed duplicatd memory allocation bug.
drm/i915: fixup load-detect on enabled, but not active pipe

+46 -61
+5 -25
drivers/gpu/drm/exynos/exynos_drm_gem.c
··· 149 149 unsigned long pfn; 150 150 151 151 if (exynos_gem_obj->flags & EXYNOS_BO_NONCONTIG) { 152 - unsigned long usize = buf->size; 153 - 154 152 if (!buf->pages) 155 153 return -EINTR; 156 154 157 - while (usize > 0) { 158 - pfn = page_to_pfn(buf->pages[page_offset++]); 159 - vm_insert_mixed(vma, f_vaddr, pfn); 160 - f_vaddr += PAGE_SIZE; 161 - usize -= PAGE_SIZE; 162 - } 163 - 164 - return 0; 165 - } 166 - 167 - pfn = (buf->dma_addr >> PAGE_SHIFT) + page_offset; 155 + pfn = page_to_pfn(buf->pages[page_offset++]); 156 + } else 157 + pfn = (buf->dma_addr >> PAGE_SHIFT) + page_offset; 168 158 169 159 return vm_insert_mixed(vma, f_vaddr, pfn); 170 160 } ··· 514 524 if (!buffer->pages) 515 525 return -EINVAL; 516 526 527 + vma->vm_flags |= VM_MIXEDMAP; 528 + 517 529 do { 518 530 ret = vm_insert_page(vma, uaddr, buffer->pages[i++]); 519 531 if (ret) { ··· 702 710 int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 703 711 { 704 712 struct drm_gem_object *obj = vma->vm_private_data; 705 - struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj); 706 713 struct drm_device *dev = obj->dev; 707 714 unsigned long f_vaddr; 708 715 pgoff_t page_offset; ··· 713 722 714 723 mutex_lock(&dev->struct_mutex); 715 724 716 - /* 717 - * allocate all pages as desired size if user wants to allocate 718 - * physically non-continuous memory. 719 - */ 720 - if (exynos_gem_obj->flags & EXYNOS_BO_NONCONTIG) { 721 - ret = exynos_drm_gem_get_pages(obj); 722 - if (ret < 0) 723 - goto err; 724 - } 725 - 726 725 ret = exynos_drm_gem_map_pages(obj, vma, f_vaddr, page_offset); 727 726 if (ret < 0) 728 727 DRM_ERROR("failed to map pages.\n"); 729 728 730 - err: 731 729 mutex_unlock(&dev->struct_mutex); 732 730 733 731 return convert_to_vm_err_msg(ret);
+7 -1
drivers/gpu/drm/i915/i915_gem_execbuffer.c
··· 1133 1133 return -EINVAL; 1134 1134 } 1135 1135 1136 + if (args->num_cliprects > UINT_MAX / sizeof(*cliprects)) { 1137 + DRM_DEBUG("execbuf with %u cliprects\n", 1138 + args->num_cliprects); 1139 + return -EINVAL; 1140 + } 1136 1141 cliprects = kmalloc(args->num_cliprects * sizeof(*cliprects), 1137 1142 GFP_KERNEL); 1138 1143 if (cliprects == NULL) { ··· 1409 1404 struct drm_i915_gem_exec_object2 *exec2_list = NULL; 1410 1405 int ret; 1411 1406 1412 - if (args->buffer_count < 1) { 1407 + if (args->buffer_count < 1 || 1408 + args->buffer_count > UINT_MAX / sizeof(*exec2_list)) { 1413 1409 DRM_DEBUG("execbuf2 with %d buffers\n", args->buffer_count); 1414 1410 return -EINVAL; 1415 1411 }
+11 -18
drivers/gpu/drm/i915/intel_crt.c
··· 430 430 { 431 431 struct drm_device *dev = connector->dev; 432 432 struct intel_crt *crt = intel_attached_crt(connector); 433 - struct drm_crtc *crtc; 434 433 enum drm_connector_status status; 434 + struct intel_load_detect_pipe tmp; 435 435 436 436 if (I915_HAS_HOTPLUG(dev)) { 437 437 if (intel_crt_detect_hotplug(connector)) { ··· 450 450 return connector->status; 451 451 452 452 /* for pre-945g platforms use load detect */ 453 - crtc = crt->base.base.crtc; 454 - if (crtc && crtc->enabled) { 455 - status = intel_crt_load_detect(crt); 456 - } else { 457 - struct intel_load_detect_pipe tmp; 458 - 459 - if (intel_get_load_detect_pipe(&crt->base, connector, NULL, 460 - &tmp)) { 461 - if (intel_crt_detect_ddc(connector)) 462 - status = connector_status_connected; 463 - else 464 - status = intel_crt_load_detect(crt); 465 - intel_release_load_detect_pipe(&crt->base, connector, 466 - &tmp); 467 - } else 468 - status = connector_status_unknown; 469 - } 453 + if (intel_get_load_detect_pipe(&crt->base, connector, NULL, 454 + &tmp)) { 455 + if (intel_crt_detect_ddc(connector)) 456 + status = connector_status_connected; 457 + else 458 + status = intel_crt_load_detect(crt); 459 + intel_release_load_detect_pipe(&crt->base, connector, 460 + &tmp); 461 + } else 462 + status = connector_status_unknown; 470 463 471 464 return status; 472 465 }
+18 -16
drivers/gpu/drm/i915/intel_sdvo.c
··· 731 731 uint16_t width, height; 732 732 uint16_t h_blank_len, h_sync_len, v_blank_len, v_sync_len; 733 733 uint16_t h_sync_offset, v_sync_offset; 734 + int mode_clock; 734 735 735 736 width = mode->crtc_hdisplay; 736 737 height = mode->crtc_vdisplay; ··· 746 745 h_sync_offset = mode->crtc_hsync_start - mode->crtc_hblank_start; 747 746 v_sync_offset = mode->crtc_vsync_start - mode->crtc_vblank_start; 748 747 749 - dtd->part1.clock = mode->clock / 10; 748 + mode_clock = mode->clock; 749 + mode_clock /= intel_mode_get_pixel_multiplier(mode) ?: 1; 750 + mode_clock /= 10; 751 + dtd->part1.clock = mode_clock; 752 + 750 753 dtd->part1.h_active = width & 0xff; 751 754 dtd->part1.h_blank = h_blank_len & 0xff; 752 755 dtd->part1.h_high = (((width >> 8) & 0xf) << 4) | ··· 1001 996 struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder); 1002 997 u32 sdvox; 1003 998 struct intel_sdvo_in_out_map in_out; 1004 - struct intel_sdvo_dtd input_dtd; 999 + struct intel_sdvo_dtd input_dtd, output_dtd; 1005 1000 int pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode); 1006 1001 int rate; 1007 1002 ··· 1026 1021 intel_sdvo->attached_output)) 1027 1022 return; 1028 1023 1029 - /* We have tried to get input timing in mode_fixup, and filled into 1030 - * adjusted_mode. 1031 - */ 1032 - if (intel_sdvo->is_tv || intel_sdvo->is_lvds) { 1033 - input_dtd = intel_sdvo->input_dtd; 1034 - } else { 1035 - /* Set the output timing to the screen */ 1036 - if (!intel_sdvo_set_target_output(intel_sdvo, 1037 - intel_sdvo->attached_output)) 1038 - return; 1039 - 1040 - intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode); 1041 - (void) intel_sdvo_set_output_timing(intel_sdvo, &input_dtd); 1042 - } 1024 + /* lvds has a special fixed output timing. */ 1025 + if (intel_sdvo->is_lvds) 1026 + intel_sdvo_get_dtd_from_mode(&output_dtd, 1027 + intel_sdvo->sdvo_lvds_fixed_mode); 1028 + else 1029 + intel_sdvo_get_dtd_from_mode(&output_dtd, mode); 1030 + (void) intel_sdvo_set_output_timing(intel_sdvo, &output_dtd); 1043 1031 1044 1032 /* Set the input timing to the screen. Assume always input 0. */ 1045 1033 if (!intel_sdvo_set_target_input(intel_sdvo)) ··· 1050 1052 !intel_sdvo_set_tv_format(intel_sdvo)) 1051 1053 return; 1052 1054 1055 + /* We have tried to get input timing in mode_fixup, and filled into 1056 + * adjusted_mode. 1057 + */ 1058 + intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode); 1053 1059 (void) intel_sdvo_set_input_timing(intel_sdvo, &input_dtd); 1054 1060 1055 1061 switch (pixel_multiplier) {
+3
drivers/gpu/drm/radeon/atombios_crtc.c
··· 575 575 576 576 if (rdev->family < CHIP_RV770) 577 577 pll->flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; 578 + /* use frac fb div on APUs */ 579 + if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev)) 580 + pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV; 578 581 } else { 579 582 pll->flags |= RADEON_PLL_LEGACY; 580 583
+2 -1
drivers/gpu/drm/radeon/radeon_display.c
··· 533 533 radeon_legacy_init_crtc(dev, radeon_crtc); 534 534 } 535 535 536 - static const char *encoder_names[36] = { 536 + static const char *encoder_names[37] = { 537 537 "NONE", 538 538 "INTERNAL_LVDS", 539 539 "INTERNAL_TMDS1", ··· 570 570 "INTERNAL_UNIPHY2", 571 571 "NUTMEG", 572 572 "TRAVIS", 573 + "INTERNAL_VCE" 573 574 }; 574 575 575 576 static const char *connector_names[15] = {