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

Merge tag 'topic/drm-misc-2016-05-13' of git://anongit.freedesktop.org/drm-intel into drm-next

I kinda hoped that I could still sneak in Noralf's
drm_simple_display_pipe, since there's intereset by others now (for tilcdc
at least). But it wasn't ready by a hair. Oh well.

Otherwise random stuff plus prep patches from Noralf.

* tag 'topic/drm-misc-2016-05-13' of git://anongit.freedesktop.org/drm-intel:
drm/atomic: Add drm_atomic_helper_best_encoder()
drm/atomic: Don't skip drm_bridge_*() calls if !drm_encoder_helper_funcs
drm/fb-cma-helper: Hook up to DocBook and fix some docs
drm/fb-helper: Remove mention of CONFIG_FB_DEFERRED_IO in docs
drm/sti: include linux/seq_file.h where needed
drm/tegra: Use lockless gem BO free callback
drm/exynos: Use lockless gem BO free callback
drm: Make drm_encoder_helper_funcs optional

+95 -38
+5
Documentation/DocBook/gpu.tmpl
··· 1617 1617 !Iinclude/drm/drm_fb_helper.h 1618 1618 </sect2> 1619 1619 <sect2> 1620 + <title>Framebuffer CMA Helper Functions Reference</title> 1621 + !Pdrivers/gpu/drm/drm_fb_cma_helper.c framebuffer cma helper functions 1622 + !Edrivers/gpu/drm/drm_fb_cma_helper.c 1623 + </sect2> 1624 + <sect2> 1620 1625 <title>Display Port Helper Functions Reference</title> 1621 1626 !Pdrivers/gpu/drm/drm_dp_helper.c dp helpers 1622 1627 !Iinclude/drm/drm_dp_helper.h
+34 -15
drivers/gpu/drm/drm_atomic_helper.c
··· 384 384 */ 385 385 encoder = conn_state->best_encoder; 386 386 funcs = encoder->helper_private; 387 - if (!funcs) 388 - continue; 389 387 390 388 ret = drm_bridge_mode_fixup(encoder->bridge, &crtc_state->mode, 391 389 &crtc_state->adjusted_mode); ··· 392 394 return -EINVAL; 393 395 } 394 396 395 - if (funcs->atomic_check) { 397 + if (funcs && funcs->atomic_check) { 396 398 ret = funcs->atomic_check(encoder, crtc_state, 397 399 conn_state); 398 400 if (ret) { ··· 400 402 encoder->base.id, encoder->name); 401 403 return ret; 402 404 } 403 - } else if (funcs->mode_fixup) { 405 + } else if (funcs && funcs->mode_fixup) { 404 406 ret = funcs->mode_fixup(encoder, &crtc_state->mode, 405 407 &crtc_state->adjusted_mode); 406 408 if (!ret) { ··· 705 707 drm_bridge_disable(encoder->bridge); 706 708 707 709 /* Right function depends upon target state. */ 708 - if (connector->state->crtc && funcs->prepare) 709 - funcs->prepare(encoder); 710 - else if (funcs->disable) 711 - funcs->disable(encoder); 712 - else 713 - funcs->dpms(encoder, DRM_MODE_DPMS_OFF); 710 + if (funcs) { 711 + if (connector->state->crtc && funcs->prepare) 712 + funcs->prepare(encoder); 713 + else if (funcs->disable) 714 + funcs->disable(encoder); 715 + else if (funcs->dpms) 716 + funcs->dpms(encoder, DRM_MODE_DPMS_OFF); 717 + } 714 718 715 719 drm_bridge_post_disable(encoder->bridge); 716 720 } ··· 873 873 * Each encoder has at most one connector (since we always steal 874 874 * it away), so we won't call mode_set hooks twice. 875 875 */ 876 - if (funcs->mode_set) 876 + if (funcs && funcs->mode_set) 877 877 funcs->mode_set(encoder, mode, adjusted_mode); 878 878 879 879 drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode); ··· 974 974 */ 975 975 drm_bridge_pre_enable(encoder->bridge); 976 976 977 - if (funcs->enable) 978 - funcs->enable(encoder); 979 - else 980 - funcs->commit(encoder); 977 + if (funcs) { 978 + if (funcs->enable) 979 + funcs->enable(encoder); 980 + else if (funcs->commit) 981 + funcs->commit(encoder); 982 + } 981 983 982 984 drm_bridge_enable(encoder->bridge); 983 985 } ··· 2481 2479 goto retry; 2482 2480 } 2483 2481 EXPORT_SYMBOL(drm_atomic_helper_connector_dpms); 2482 + 2483 + /** 2484 + * drm_atomic_helper_best_encoder - Helper for &drm_connector_helper_funcs 2485 + * ->best_encoder callback 2486 + * @connector: Connector control structure 2487 + * 2488 + * This is a &drm_connector_helper_funcs ->best_encoder callback helper for 2489 + * connectors that support exactly 1 encoder, statically determined at driver 2490 + * init time. 2491 + */ 2492 + struct drm_encoder * 2493 + drm_atomic_helper_best_encoder(struct drm_connector *connector) 2494 + { 2495 + WARN_ON(connector->encoder_ids[1]); 2496 + return drm_encoder_find(connector->dev, connector->encoder_ids[0]); 2497 + } 2498 + EXPORT_SYMBOL(drm_atomic_helper_best_encoder); 2484 2499 2485 2500 /** 2486 2501 * DOC: atomic state reset and initialization
+33 -8
drivers/gpu/drm/drm_crtc_helper.c
··· 170 170 { 171 171 const struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; 172 172 173 + if (!encoder_funcs) 174 + return; 175 + 173 176 drm_bridge_disable(encoder->bridge); 174 177 175 178 if (encoder_funcs->disable) 176 179 (*encoder_funcs->disable)(encoder); 177 - else 180 + else if (encoder_funcs->dpms) 178 181 (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF); 179 182 180 183 drm_bridge_post_disable(encoder->bridge); ··· 251 248 252 249 drm_for_each_encoder(encoder, dev) { 253 250 encoder_funcs = encoder->helper_private; 251 + if (!encoder_funcs) 252 + continue; 253 + 254 254 /* Disable unused encoders */ 255 255 if (encoder->crtc == NULL) 256 256 drm_encoder_disable(encoder); ··· 332 326 if (encoder->crtc != crtc) 333 327 continue; 334 328 329 + encoder_funcs = encoder->helper_private; 330 + if (!encoder_funcs) 331 + continue; 332 + 335 333 ret = drm_bridge_mode_fixup(encoder->bridge, 336 334 mode, adjusted_mode); 337 335 if (!ret) { ··· 370 360 if (encoder->crtc != crtc) 371 361 continue; 372 362 363 + encoder_funcs = encoder->helper_private; 364 + if (!encoder_funcs) 365 + continue; 366 + 373 367 drm_bridge_disable(encoder->bridge); 374 368 375 - encoder_funcs = encoder->helper_private; 376 369 /* Disable the encoders as the first thing we do. */ 377 - encoder_funcs->prepare(encoder); 370 + if (encoder_funcs->prepare) 371 + encoder_funcs->prepare(encoder); 378 372 379 373 drm_bridge_post_disable(encoder->bridge); 380 374 } ··· 399 385 if (encoder->crtc != crtc) 400 386 continue; 401 387 388 + encoder_funcs = encoder->helper_private; 389 + if (!encoder_funcs) 390 + continue; 391 + 402 392 DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%d:%s]\n", 403 393 encoder->base.id, encoder->name, 404 394 mode->base.id, mode->name); 405 - encoder_funcs = encoder->helper_private; 406 - encoder_funcs->mode_set(encoder, mode, adjusted_mode); 395 + if (encoder_funcs->mode_set) 396 + encoder_funcs->mode_set(encoder, mode, adjusted_mode); 407 397 408 398 drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode); 409 399 } ··· 420 402 if (encoder->crtc != crtc) 421 403 continue; 422 404 405 + encoder_funcs = encoder->helper_private; 406 + if (!encoder_funcs) 407 + continue; 408 + 423 409 drm_bridge_pre_enable(encoder->bridge); 424 410 425 - encoder_funcs = encoder->helper_private; 426 - encoder_funcs->commit(encoder); 411 + if (encoder_funcs->commit) 412 + encoder_funcs->commit(encoder); 427 413 428 414 drm_bridge_enable(encoder->bridge); 429 415 } ··· 812 790 struct drm_bridge *bridge = encoder->bridge; 813 791 const struct drm_encoder_helper_funcs *encoder_funcs; 814 792 793 + encoder_funcs = encoder->helper_private; 794 + if (!encoder_funcs) 795 + return; 796 + 815 797 if (mode == DRM_MODE_DPMS_ON) 816 798 drm_bridge_pre_enable(bridge); 817 799 else 818 800 drm_bridge_disable(bridge); 819 801 820 - encoder_funcs = encoder->helper_private; 821 802 if (encoder_funcs->dpms) 822 803 encoder_funcs->dpms(encoder, mode); 823 804
+3 -5
drivers/gpu/drm/drm_fb_cma_helper.c
··· 43 43 * Provides helper functions for creating a cma (contiguous memory allocator) 44 44 * backed framebuffer. 45 45 * 46 - * drm_fb_cma_create() is used in the 47 - * (struct drm_mode_config_funcs *)->fb_create callback function to create the 48 - * cma backed framebuffer. 46 + * drm_fb_cma_create() is used in the &drm_mode_config_funcs ->fb_create 47 + * callback function to create a cma backed framebuffer. 49 48 * 50 49 * An fbdev framebuffer backed by cma is also available by calling 51 50 * drm_fbdev_cma_init(). drm_fbdev_cma_fini() tears it down. 52 - * If CONFIG_FB_DEFERRED_IO is enabled and the callback 53 - * (struct drm_framebuffer_funcs)->dirty is set, fb_deferred_io 51 + * If the &drm_framebuffer_funcs ->dirty callback is set, fb_deferred_io 54 52 * will be set up automatically. dirty() is called by 55 53 * drm_fb_helper_deferred_io() in process context (struct delayed_work). 56 54 *
+8 -8
drivers/gpu/drm/drm_fb_helper.c
··· 85 85 * should call drm_fb_helper_single_add_all_connectors() followed by 86 86 * drm_fb_helper_initial_config(). 87 87 * 88 - * If CONFIG_FB_DEFERRED_IO is enabled and &drm_framebuffer_funcs ->dirty is 89 - * set, the drm_fb_helper_{cfb,sys}_{write,fillrect,copyarea,imageblit} 90 - * functions will accumulate changes and schedule &fb_helper .dirty_work to run 91 - * right away. This worker then calls the dirty() function ensuring that it 92 - * will always run in process context since the fb_*() function could be 93 - * running in atomic context. If drm_fb_helper_deferred_io() is used as the 94 - * deferred_io callback it will also schedule dirty_work with the damage 95 - * collected from the mmap page writes. 88 + * If &drm_framebuffer_funcs ->dirty is set, the 89 + * drm_fb_helper_{cfb,sys}_{write,fillrect,copyarea,imageblit} functions will 90 + * accumulate changes and schedule &drm_fb_helper ->dirty_work to run right 91 + * away. This worker then calls the dirty() function ensuring that it will 92 + * always run in process context since the fb_*() function could be running in 93 + * atomic context. If drm_fb_helper_deferred_io() is used as the deferred_io 94 + * callback it will also schedule dirty_work with the damage collected from the 95 + * mmap page writes. 96 96 */ 97 97 98 98 /**
+1 -1
drivers/gpu/drm/exynos/exynos_drm_drv.c
··· 418 418 .get_vblank_counter = drm_vblank_no_hw_counter, 419 419 .enable_vblank = exynos_drm_crtc_enable_vblank, 420 420 .disable_vblank = exynos_drm_crtc_disable_vblank, 421 - .gem_free_object = exynos_drm_gem_free_object, 421 + .gem_free_object_unlocked = exynos_drm_gem_free_object, 422 422 .gem_vm_ops = &exynos_drm_gem_vm_ops, 423 423 .dumb_create = exynos_drm_gem_dumb_create, 424 424 .dumb_map_offset = exynos_drm_gem_dumb_map_offset,
+2
drivers/gpu/drm/sti/sti_cursor.c
··· 6 6 * License terms: GNU General Public License (GPL), version 2 7 7 */ 8 8 9 + #include <linux/seq_file.h> 10 + 9 11 #include <drm/drm_atomic.h> 10 12 #include <drm/drm_fb_cma_helper.h> 11 13 #include <drm/drm_gem_cma_helper.h>
+1
drivers/gpu/drm/sti/sti_gdp.c
··· 5 5 * for STMicroelectronics. 6 6 * License terms: GNU General Public License (GPL), version 2 7 7 */ 8 + #include <linux/seq_file.h> 8 9 9 10 #include <drm/drm_atomic.h> 10 11 #include <drm/drm_fb_cma_helper.h>
+1
drivers/gpu/drm/sti/sti_hda.c
··· 8 8 #include <linux/component.h> 9 9 #include <linux/module.h> 10 10 #include <linux/platform_device.h> 11 + #include <linux/seq_file.h> 11 12 12 13 #include <drm/drmP.h> 13 14 #include <drm/drm_atomic_helper.h>
+1
drivers/gpu/drm/sti/sti_hqvdp.c
··· 7 7 #include <linux/component.h> 8 8 #include <linux/firmware.h> 9 9 #include <linux/reset.h> 10 + #include <linux/seq_file.h> 10 11 11 12 #include <drm/drm_atomic.h> 12 13 #include <drm/drm_fb_cma_helper.h>
+1
drivers/gpu/drm/sti/sti_mixer.c
··· 5 5 * for STMicroelectronics. 6 6 * License terms: GNU General Public License (GPL), version 2 7 7 */ 8 + #include <linux/seq_file.h> 8 9 9 10 #include "sti_compositor.h" 10 11 #include "sti_mixer.h"
+1
drivers/gpu/drm/sti/sti_tvout.c
··· 12 12 #include <linux/of_platform.h> 13 13 #include <linux/platform_device.h> 14 14 #include <linux/reset.h> 15 + #include <linux/seq_file.h> 15 16 16 17 #include <drm/drmP.h> 17 18 #include <drm/drm_crtc_helper.h>
+1
drivers/gpu/drm/sti/sti_vid.c
··· 3 3 * Author: Fabien Dessenne <fabien.dessenne@st.com> for STMicroelectronics. 4 4 * License terms: GNU General Public License (GPL), version 2 5 5 */ 6 + #include <linux/seq_file.h> 6 7 7 8 #include <drm/drmP.h> 8 9
+1 -1
drivers/gpu/drm/tegra/drm.c
··· 932 932 .debugfs_cleanup = tegra_debugfs_cleanup, 933 933 #endif 934 934 935 - .gem_free_object = tegra_bo_free_object, 935 + .gem_free_object_unlocked = tegra_bo_free_object, 936 936 .gem_vm_ops = &tegra_bo_vm_ops, 937 937 938 938 .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
+2
include/drm/drm_atomic_helper.h
··· 110 110 uint32_t flags); 111 111 int drm_atomic_helper_connector_dpms(struct drm_connector *connector, 112 112 int mode); 113 + struct drm_encoder * 114 + drm_atomic_helper_best_encoder(struct drm_connector *connector); 113 115 114 116 /* default implementations for state handling */ 115 117 void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc);