22 Feb, 2013

3 commits


21 Feb, 2013

1 commit

  • KMS driver for TI LCD controller

    * 'tilcdc-next' of git://people.freedesktop.org/~robclark/linux:
    drm/tilcdc: add support for LCD panels (v5)
    drm/tilcdc: add encoder slave (v2)
    drm/i2c: nxp-tda998x (v3)
    drm/tilcdc: add TI LCD Controller DRM driver (v4)
    drm/nouveau: use i2c encoder helper wrappers
    drm: i2c encoder helper wrappers
    drm/cma: add debugfs helpers
    drm: small fix in drm_send_vblank_event()
    drm: Don't set the plane->fb to NULL on successfull set_plane
    drm/cma-helper: fixup compilation

    Conflicts:
    drivers/gpu/drm/Kconfig
    drivers/gpu/drm/Makefile
    drivers/gpu/drm/drm_fb_cma_helper.c

    Dave Airlie
     

20 Feb, 2013

1 commit

  • So here's my promised pile of fixes for 3.9. I've dropped the core prep
    patches for vt-switchless suspend/resume as discussed on irc. Highlights:
    - Fix dmar on g4x. Not really gfx related, but I'm fed up with getting
    blamed for dmar crapouts.
    - Disable wc ptes updates on ilk when dmar is enabled (Chris). So again,
    dmar, but this time gfx related :(
    - Reduced range support for hsw, using the pipe CSC (Ville).
    - Fixup pll limits for gen3/4 (Patrick Jakobsson). The sdvo patch is
    already confirmed to fix 2 bug reports, so added cc: stable on that one.
    - Regression fix for 8bit fb console (Ville).
    - Preserve lane reversal bits on DDI/FDI ports (Damien).
    - Page flip vs. gpu hang fixes (Ville). Unfortuntely not quite all of
    them, need to decide what to do with the currently still in-flight ones.
    - Panel fitter regression fix from Mika Kuoppala (was accidentally left on
    on some pipes with the new modset code since 3.7). This also improves
    the modeset sequence and might help a few other unrelated issues with
    lvds.
    - Write backlight regs even harder ... another installement in our eternal
    fight against the BIOS and backlights.
    - Fixup lid notifier vs. suspend/resume races (Zhang Rui). Prep work for
    new ACPI stuff, but closing the race itself seems worthwile on its own.
    - A few other small fixes and tiny cleanups all over.

    Lots of the patches are cc: stable since I've stalled on a few
    not-so-important fixes for 3.8 due to the grumpy noise Linus made.

    * 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel: (33 commits)
    intel/iommu: force writebuffer-flush quirk on Gen 4 Chipsets
    drm/i915: Disable WC PTE updates to w/a buggy IOMMU on ILK
    drm/i915: Implement pipe CSC based limited range RGB output
    drm/i915: inverted brightness quirk for Acer Aspire 4736Z
    drm/i915: Print the hw context status is debugfs
    drm/i915: Use HAS_L3_GPU_CACHE in i915_gem_l3_remap
    drm/i915: Fix PIPE_CONTROL DW/QW write through global GTT on IVB+
    drm/i915: Set i9xx sdvo clock limits according to specifications
    drm/i915: Set i9xx lvds clock limits according to specifications
    drm/i915: Preserve the DDI link reversal configuration
    drm/i915: Preserve the FDI line reversal override bit on CPT
    drm/i915: add missing \n to UTS_RELEASE in the error_state
    drm: Use C8 instead of RGB332 when determining the format from depth/bpp
    drm: Fill depth/bits_per_pixel for C8 format
    drm/i915: don't clflush gem objects in stolen memory
    drm/i915: Don't wait for page flips if there was GPU reset
    drm/i915: Kill obj->pending_flip
    drm/i915: Fix a typo in a intel_modeset_stage_output_state() comment
    drm/i915: remove bogus mutex_unlock from error-path
    drm/i915: Print the pipe control page GTT address
    ...

    Dave Airlie
     

18 Feb, 2013

2 commits

  • Simplify life for drivers using an encoder-slave, so that they can make
    their drm_encoder_helper_funcs const, rather than needing to dynamically
    allocate and populate them.

    Signed-off-by: Rob Clark

    Rob Clark
     
  • Add helper to display fb's which can be used directly in drm_info_list:

    static struct drm_info_list foo_debugfs_list[] = {
    ...
    { "fb", drm_fb_cma_debugfs_show, 0 },
    };

    to display information about CMA fb objects, as well as a
    drm_gem_cma_describe() which can be used if the driver bothers to keep
    a list of CMA GEM objects.

    Signed-off-by: Rob Clark

    Rob Clark
     

15 Feb, 2013

1 commit

  • When I refactored the code initially, I forgot that gen2 uses a
    different bar for the CPU mappable aperture. The agp-less code knows
    nothing of generations less than 5, so we have to expand the gtt_probe
    function to include the mappable base and end.

    It was originally broken by me:
    commit baa09f5fd8a6d033ec075355dda99a65b7f6a0f3
    Author: Ben Widawsky
    Date: Thu Jan 24 13:49:57 2013 -0800

    drm/i915: Add probe and remove to the gtt ops

    Reported-by: Chris Wilson
    Signed-off-by: Ben Widawsky
    Signed-off-by: Daniel Vetter

    Ben Widawsky
     

14 Feb, 2013

5 commits

  • Spotted by Rob Clark.

    Reviewed-by: Rob Clark
    Signed-off-by: Daniel Vetter

    Daniel Vetter
     
  • Now that the fbdev helper interface for drivers is trimmed down,
    update the kerneldoc for all the remaining exported functions.

    I've tried to beat the DocBook a bit by reordering the function
    references a bit into a more sensible ordering. But that didn't work
    out at all. Hence just extend the in-code DOC: section a bit.

    Also remove the LOCKING: sections - especially for the setup functions
    they're totally bogus. But that's not a documentation problem, but
    simply an artifact of the current rather hazardous locking around drm
    init and even more so around fbdev setup ...

    v2: Some further improvements:
    - Also add documentation for drm_fb_helper_single_add_all_connectors,
    Dave Airlie didn't want me to kill this one from the fb helper
    interface.
    - Update docs for drm_fb_helper_fill_var/fix - they should be used
    from the driver's ->fb_probe callback to setup the fbdev info
    structure.
    - Clarify what the ->fb_probe callback should all do - it needs to
    setup both the fbdev info and allocate the drm framebuffer used as
    backing storage.
    - Add basic documentaation for the drm_fb_helper_funcs driver callback
    vfunc.

    v3: Implement clarifications Laurent Pinchart suggested in his review.

    v4: Fix another mispelling Laurent spotted.

    Cc: Laurent Pinchart
    Acked-by: Laurent Pinchart
    Signed-off-by: Daniel Vetter

    Daniel Vetter
     
  • Not called by anyone, and really, shouldn't be. Drivers are supposed
    either drm_fb_helper_initial_config or drm_fb_helper_hotplug_event.
    Originally this was done differently, but is now consolidated in the
    helper functions and no longer done by drivers directly.

    Reviewed-by: Rob Clark
    Signed-off-by: Daniel Vetter

    Daniel Vetter
     
  • It's only used internally for the sysrq and panic handlers provided by
    the drm fb helper implementation. Hence just inline it, kill the
    export and remove the confusing kerneldoc. Driver's are supposed to
    call drm_fb_helper_restore_fbdev_mode on lastclose.

    Note that locking is totally fubar - the sysrq case doesn't take any
    locks at all. The panic handler probably shouldn't take any locks
    since it'll only make things worse. Otoh it's probably better to
    switch things over to the atomic modeset callbacks (and disable the
    panic handler for those drivers which don't implement it).

    But that's both better done in separate patches.

    Reviewed-by: Rob Clark
    Signed-off-by: Daniel Vetter

    Daniel Vetter
     
  • ... it's required. Fix up exynos and the cma helper, and add a
    corresponding WARN_ON to drm_fb_helper_restore_fbdev_mode.

    Note that tegra calls the fbdev cma helper restore function also from
    it's driver-load callback. Which is a bit against current practice,
    since usually the call is only from ->lastclose, and initial setup is
    done by drm_fb_helper_initial_config.

    Also add the relevant drm DocBook entry.

    v2: Add promised WARN to restore_fbdev_mode.

    Reviewed-by: Rob Clark
    Signed-off-by: Daniel Vetter

    Daniel Vetter
     

08 Feb, 2013

5 commits

  • TTM reservations changes, preparing for new reservation mutex system.

    * 'for-airlied' of git://people.freedesktop.org/~mlankhorst/linux:
    drm/ttm: unexport ttm_bo_wait_unreserved
    drm/nouveau: use ttm_bo_reserve_slowpath in validate_init, v2
    drm/ttm: use ttm_bo_reserve_slowpath_nolru in ttm_eu_reserve_buffers, v2
    drm/ttm: add ttm_bo_reserve_slowpath
    drm/ttm: cleanup ttm_eu_reserve_buffers handling
    drm/ttm: remove lru_lock around ttm_bo_reserve
    drm/nouveau: increase reservation sequence every retry
    drm/vmwgfx: always use ttm_bo_is_reserved

    Dave Airlie
     
  • Instead of reimplementing all of the dma_buf functionality in every driver,
    create helpers drm_prime_import and drm_prime_export that implement them in
    terms of new, lower-level hook functions:

    gem_prime_pin: callback when a buffer is created, used to pin buffers into GTT
    gem_prime_get_sg_table: convert a drm_gem_object to an sg_table for export
    gem_prime_import_sg_table: convert an sg_table into a drm_gem_object
    gem_prime_vmap, gem_prime_vunmap: map and unmap an object

    These hooks are optional; drivers can opt in by using drm_gem_prime_import and
    drm_gem_prime_export as the .gem_prime_import and .gem_prime_export fields of
    struct drm_driver.

    v2:
    - Drop .begin_cpu_access. None of the drivers this code replaces implemented
    it. Having it here was a leftover from when I was trying to include i915 in
    this rework.
    - Use mutex_lock instead of mutex_lock_interruptible, as these three drivers
    did. This patch series shouldn't change that behavior.
    - Rename helpers to gem_prime_get_sg_table and gem_prime_import_sg_table.
    Rename struct sg_table* variables to 'sgt' for clarity.
    - Update drm.tmpl for these new hooks.

    v3:
    - Pass the vaddr down to the driver. This lets drivers that just call vunmap on
    the pointer avoid having to store the pointer in their GEM private structures.
    - Move documentation into a /** DOC */ comment in drm_prime.c and include it in
    drm.tmpl with a !P line. I tried to use !F lines to include documentation of
    the individual functions from drmP.h, but the docproc / kernel-doc scripts
    barf on that file, so hopefully this is good enough for now.
    - apply refcount fix from commit be8a42ae60addd8b6092535c11b42d099d6470ec
    ("drm/prime: drop reference on imported dma-buf come from gem")

    Signed-off-by: Aaron Plattner
    Cc: Daniel Vetter
    Cc: David Airlie
    Signed-off-by: Dave Airlie

    Aaron Plattner
     
  • Alex writes:
    - CS ioctl cleanup and unification. Unification of a lot of functionality
    that was duplicated across multiple generates of hardware.
    - Add support for Oland GPUs
    - Deprecate UMS support. Mesa and the ddx dropped support for UMS and
    apparently very few people still use it since the UMS CS ioctl was broken
    for several kernels and no one reported it. It was fixed in 3.8/stable.
    - Rework GPU reset. Use the status registers to determine what blocks
    to reset. This better matches the recommended reset programming model.
    This also allows us to properly reset blocks besides GFX and DMA.
    - Switch the VM set page code to use an IB rather than the ring. This
    fixes overflow issues when doing large page table updates using a small
    ring like DMA.
    - Several small cleanups and bug fixes.

    * 'drm-next-3.9' of git://people.freedesktop.org/~agd5f/linux: (38 commits)
    drm/radeon/dce6: fix display powergating
    drm/radeon: add Oland pci ids
    drm/radeon: radeon-asic updates for Oland
    drm/radeon: add ucode loading support for Oland
    drm/radeon: fill in gpu init for Oland
    drm/radeon: add Oland chip family
    drm/radeon: switch back to using the DMA ring for VM PT updates
    drm/radeon: use IBs for VM page table updates v2
    drm/radeon: don't reset the MC on IGPs/APUs
    drm/radeon: use the reset mask to determine if rings are hung
    drm/radeon: halt engines before disabling MC (si)
    drm/radeon: halt engines before disabling MC (cayman/TN)
    drm/radeon: halt engines before disabling MC (evergreen)
    drm/radeon: halt engines before disabling MC (6xx/7xx)
    drm/radeon: use status regs to determine what to reset (si)
    drm/radeon: use status regs to determine what to reset (cayman)
    drm/radeon: use status regs to determine what to reset (evergreen)
    drm/radeon: use status regs to determine what to reset (6xx/7xx)
    drm/radeon: rework GPU reset on cayman/TN
    drm/radeon: rework GPU reset on cayman/TN
    ...

    Dave Airlie
     
  • videomode helpers for of + devicetree stuff, required for new kms drivers

    (not the fbdev maintainer).

    * tag 'of_videomode_helper' of git://git.pengutronix.de/git/str/linux:
    drm_modes: add of_videomode helpers
    drm_modes: add videomode helpers
    fbmon: add of_videomode helpers
    fbmon: add videomode helpers
    video: add of helper for display timings/videomode
    video: add display_timing and videomode
    viafb: rename display_timing to via_display_timing

    Dave Airlie
     
  • …m-intel into drm-next

    Daniel writes:
    "Probably the last feature pull for 3.9, there's some fixes outstanding
    thought that I'd like to sneak in. And maybe 3.8 takes a bit longer ...
    Anyway, highlights of this pull:
    - Kill the horrible IS_DISPLAYREG hack to handle the mmio offset movements
    on vlv, big thanks to Ville.
    - Dynamic power well support for Haswell, shaves away a bit when only
    using the eDP port on pipe A (Paulo). Plus unclaimed register fixes
    uncovered by this.
    - Clarifications of the gpu hang/reset state transitions, hopefully fixing
    a few spurious -EIO deaths in userspace.
    - Haswell ELD fixes.
    - Some more (pp)gtt cleanups from Ben.
    - A few smaller things all over.

    Plus all the stuff from the previous rather small pull request:
    - Broadcast RBG improvements and reduced color range fixes from Ville.
    - Ben is on a "kill legacy gtt code for good" spree, first pile of patches
    included.
    - No-relocs and bo lut improvements for faster execbuf from Chris.
    - Some refactorings from Imre."

    * tag 'drm-intel-next-2013-02-01' of git://people.freedesktop.org/~danvet/drm-intel: (101 commits)
    GPU/i915: Fix acpi_bus_get_device() check in drivers/gpu/drm/i915/intel_opregion.c
    drm/i915: Set the SR01 "screen off" bit in i915_redisable_vga() too
    drm/i915: Kill IS_DISPLAYREG()
    drm/i915: Introduce i915_vgacntrl_reg()
    drm/i915: gen6_gmch_remove can be static
    drm/i915: dynamic Haswell display power well support
    drm/i915: check the power down well on assert_pipe()
    drm/i915: don't send DP "idle" pattern before "normal" on HSW PORT_A
    drm/i915: don't run hsw power well code on !hsw
    drm/i915: kill cargo-culted locking from power well code
    drm/i915: Only run idle processing from i915_gem_retire_requests_worker
    drm/i915: Fix CAGF for HSW
    drm/i915: Reclaim GTT space for failed PPGTT
    drm/i915: remove intel_gtt structure
    drm/i915: Add probe and remove to the gtt ops
    drm/i915: extract hw ppgtt setup/cleanup code
    drm/i915: pte_encode is gen6+
    drm/i915: vfuncs for ppgtt
    drm/i915: vfuncs for gtt_clear_range/insert_entries
    drm/i915: Error state should print /sys/kernel/debug
    ...

    Dave Airlie
     

02 Feb, 2013

1 commit


31 Jan, 2013

1 commit

  • With the probe call in our dispatch table, we can now cut away the
    last three remaining members in the intel_gtt shared struct and so
    remove it completely.

    v2: Rebased on top of Daniel's series

    Signed-off-by: Ben Widawsky
    Reviewed-by: Damien Lespiau
    [danvet: bikeshed commit message a bit.]
    Signed-off-by: Daniel Vetter

    Ben Widawsky
     

24 Jan, 2013

2 commits

  • Add helper to get drm_display_mode from devicetree.

    Signed-off-by: Steffen Trumtrar
    Reviewed-by: Thierry Reding
    Acked-by: Thierry Reding
    Tested-by: Thierry Reding
    Tested-by: Philipp Zabel
    Reviewed-by: Laurent Pinchart
    Acked-by: Laurent Pinchart
    Tested-by: Afzal Mohammed
    Tested-by: Rob Clark
    Tested-by: Leela Krishna Amudala

    Steffen Trumtrar
     
  • Add conversion from videomode to drm_display_mode

    Signed-off-by: Steffen Trumtrar
    Reviewed-by: Thierry Reding
    Acked-by: Thierry Reding
    Tested-by: Thierry Reding
    Tested-by: Philipp Zabel
    Reviewed-by: Laurent Pinchart
    Acked-by: Laurent Pinchart
    Tested-by: Afzal Mohammed
    Tested-by: Rob Clark
    Tested-by: Leela Krishna Amudala

    Steffen Trumtrar
     

21 Jan, 2013

6 commits

  • The aim of this locking rework is that ioctls which a compositor should be
    might call for every frame (set_cursor, page_flip, addfb, rmfb and
    getfb/create_handle) should not be able to block on kms background
    activities like output detection. And since each EDID read takes about
    25ms (in the best case), that always means we'll drop at least one frame.

    The solution is to add per-crtc locking for these ioctls, and restrict
    background activities to only use the global lock. Change-the-world type
    of events (modeset, dpms, ...) need to grab all locks.

    Two tricky parts arose in the conversion:
    - A lot of current code assumes that a kms fb object can't disappear while
    holding the global lock, since the current code serializes fb
    destruction with it. Hence proper lifetime management using the already
    created refcounting for fbs need to be instantiated for all ioctls and
    interfaces/users.

    - The rmfb ioctl removes the to-be-deleted fb from all active users. But
    unconditionally taking the global kms lock to do so introduces an
    unacceptable potential stall point. And obviously changing the userspace
    abi isn't on the table, either. Hence this conversion opportunistically
    checks whether the rmfb ioctl holds the very last reference, which
    guarantees that the fb isn't in active use on any crtc or plane (thanks
    to the conversion to the new lifetime rules using proper refcounting).
    Only if this is not the case will the code go through the slowpath and
    grab all modeset locks. Sane compositors will never hit this path and so
    avoid the stall, but userspace relying on these semantics will also not
    break.

    All these cases are exercised by the newly added subtests for the i-g-t
    kms_flip, tested on a machine where a full detect cycle takes around 100
    ms. It works, and no frames are dropped any more with these patches
    applied. kms_flip also contains a special case to exercise the
    above-describe rmfb slowpath.

    * 'drm-kms-locking' of git://people.freedesktop.org/~danvet/drm-intel: (335 commits)
    drm/fb_helper: check whether fbcon is bound
    drm/doc: updates for new framebuffer lifetime rules
    drm: don't hold crtc mutexes for connector ->detect callbacks
    drm: only grab the crtc lock for pageflips
    drm: optimize drm_framebuffer_remove
    drm/vmwgfx: add proper framebuffer refcounting
    drm/i915: dump refcount into framebuffer debugfs file
    drm: refcounting for crtc framebuffers
    drm: refcounting for sprite framebuffers
    drm: fb refcounting for dirtyfb_ioctl
    drm: don't take modeset locks in getfb ioctl
    drm: push modeset_lock_all into ->fb_create driver callbacks
    drm: nest modeset locks within fpriv->fbs_lock
    drm: reference framebuffers which are on the idr
    drm: revamp framebuffer cleanup interfaces
    drm: create drm_framebuffer_lookup
    drm: revamp locking around fb creation/destruction
    drm: only take the crtc lock for ->cursor_move
    drm: only take the crtc lock for ->cursor_set
    drm: add per-crtc locks
    ...

    Dave Airlie
     
  • We have two classes of framebuffer
    - Created by the driver (atm only for fbdev), and the driver holds
    onto the last reference count until destruction.
    - Created by userspace and associated with a given fd. These
    framebuffers will be reaped when their assoiciated fb is closed.

    Now these two cases are set up differently, the framebuffers are on
    different lists and hence destruction needs to clean up different
    things. Also, for userspace framebuffers we remove them from any
    current usage, whereas for internal framebuffers it is assumed that
    the driver has done this already.

    Long story short, we need two different ways to cleanup such drivers.
    Three functions are involved in total:
    - drm_framebuffer_remove: Convenience function which removes the fb
    from all active usage and then drops the passed-in reference.
    - drm_framebuffer_unregister_private: Will remove driver-private
    framebuffers from relevant lists and drop the corresponding
    references. Should be called for driver-private framebuffers before
    dropping the last reference (or like for a lot of the drivers where
    the fbdev is embedded someplace else, before doing the cleanup
    manually).
    - drm_framebuffer_cleanup: Final cleanup for both classes of fbs,
    should be called by the driver's ->destroy callback once the last
    reference is gone.

    This patch just rolls out the new interfaces and updates all drivers
    (by adding calls to drm_framebuffer_unregister_private at all the
    right places)- no functional changes yet. Follow-on patches will move
    drm core code around and update the lifetime management for
    framebuffers, so that we are no longer required to keep framebuffers
    alive by locking mode_config.mutex.

    I've also updated the kerneldoc already.

    vmwgfx seems to again be a bit special, at least I haven't figured out
    how the fbdev support in that driver works. It smells like it's
    external though.

    v2: The i915 driver creates another private framebuffer in the
    load-detect code. Adjust its cleanup code, too.

    Reviewed-by: Rob Clark
    Signed-off-by: Daniel Vetter

    Daniel Vetter
     
  • And replace all fb lookups with it. Also add a WARN to
    drm_mode_object_find since that is now no longer the blessed interface
    to look up an fb. And add kerneldoc to both functions.

    This only updates all callsites, but immediately drops the acquired
    refence again. Hence all callers still rely on the fact that a mode fb
    can't disappear while they're holding the struct mutex. Subsequent
    patches will instate proper use of refcounts, and then rework the rmfb
    and unref code to no longer serialize fb destruction with the
    mode_config lock. We don't want that since otherwise a compositor
    might end up stalling for a few frames in rmfb.

    v2: Don't use kref_get_unless_zero - Greg KH doesn't like that kind of
    interface.

    Reviewed-by: Rob Clark
    Signed-off-by: Daniel Vetter

    Daniel Vetter
     
  • Well, at least step 1. The goal here is that framebuffer objects can
    survive outside of the mode_config lock, with just a reference held
    as protection. The first step to get there is to introduce a special
    fb_lock which protects fb lookup, creation and destruction, to make
    them appear atomic.

    This new fb_lock can nest within the mode_config lock. But the idea is
    (once the reference counting part is completed) that we only quickly
    take that fb_lock to lookup a framebuffer and grab a reference,
    without any other locks involved.

    vmwgfx is the only driver which does framebuffer lookups itself, also
    wrap those calls to drm_mode_object_find with the new lock.

    Also protect the fb_list walking in i915 and omapdrm with the new lock.

    As a slight complication there's also the list of user-created fbs
    attached to the file private. The problem now is that at fclose() time
    we need to walk that list, eventually do a modeset call to remove the
    fb from active usage (and are required to be able to take the
    mode_config lock), but in the end we need to grab the new fb_lock to
    remove the fb from the list. The easiest solution is to add another
    mutex to protect this per-file list.

    Currently that new fbs_lock nests within the modeset locks and so
    appears redudant. But later patches will switch around this sequence
    so that taking the modeset locks in the fb destruction path is
    optional in the fastpath. Ultimately the goal is that addfb and rmfb
    do not require the mode_config lock, since otherwise they have the
    potential to introduce stalls in the pageflip sequence of a compositor
    (if the compositor e.g. switches to a fullscreen client or if it
    enables a plane). But that requires a few more steps and hoops to jump
    through.

    Note that framebuffer creation/destruction is now double-protected -
    once by the fb_lock and in parts by the idr_lock. The later would be
    unnecessariy if framebuffers would have their own idr allocator. But
    that's material for another patch (series).

    v2: Properly initialize the fb->filp_head list in _init, otherwise the
    newly added WARN to check whether the fb isn't on a fpriv list any
    more will fail for driver-private objects.

    v3: Fixup two error-case unlock bugs spotted by Richard Wilbur.

    Reviewed-by: Rob Clark
    Signed-off-by: Daniel Vetter

    Daniel Vetter
     
  • *drumroll*

    The basic idea is to protect per-crtc state which can change without
    touching the output configuration with separate mutexes, i.e. all the
    input side state to a crtc like framebuffers, cursor settings or plane
    configuration. Holding such a crtc lock gives a read-lock on all the
    other crtc state which can be changed by e.g. a modeset.

    All non-crtc state is still protected by the mode_config mutex.
    Callers that need to change modeset state of a crtc (e.g. dpms or
    set_mode) need to grab both the mode_config lock and nested within any
    crtc locks.

    Note that since there can only ever be one holder of the mode_config
    lock we can grab the subordinate crtc locks in any order (if we need
    to grab more than one of them). Lockdep can handle such nesting with
    the mutex_lock_nest_lock call correctly.

    With this functions that only touch connectors/encoders but not crtcs
    only need to take the mode_config lock. The biggest such case is the
    output probing, which means that we can now pageflip and move cursors
    while the output probe code is reading an edid.

    Most cases neatly fall into the three buckets:
    - Only touches connectors and similar output state and so only needs
    the mode_config lock.
    - Touches the global configuration and so needs all locks.
    - Only touches the crtc input side and so only needs the crtc lock.

    But a few cases that need special consideration:

    - Load detection which requires a crtc. The mode_config lock already
    prevents a modeset change, so we can use any unused crtc as we like
    to do load detection. The only thing to consider is that such
    temporary state changes don't leak out to userspace through ioctls
    that only take the crtc look (like a pageflip). Hence the load
    detect code needs to grab the crtc of any output pipes it touches
    (but only if it touches state used by the pageflip or cursor
    ioctls).

    - Atomic pageflip when moving planes. The first case is sane hw, where
    planes have a fixed association with crtcs - nothing needs to be
    done there. More insane^Wflexible hw needs to have plane->crtc
    mapping which is separately protect with a lock that nests within
    the crtc lock. If the plane is unused we can just assign it to the
    current crtc and continue. But if a plane is already in use by
    another crtc we can't just reassign it.

    Two solution present themselves: Either go back to a slow-path which
    takes all modeset locks, potentially incure quite a hefty delay. Or
    simply disallowing such changes in one atomic pageflip - in general
    the vblanks of two crtcs are not synced, so there's no sane way to
    atomically flip such plane changes accross more than one crtc. I'd
    heavily favour the later approach, going as far as mandating it as
    part of the ABI of such a new a nuclear pageflip.

    And if we _really_ want such semantics, we can always get them by
    introducing another pageflip mutex between the mode_config.mutex and
    the individual crtc locks. Pageflips crossing more than one crtc
    would then need to take that lock first, to lock out concurrent
    multi-crtc pageflips.

    - Optimized global modeset operations: We could just take the
    mode_config lock and then lazily lock all crtc which are affected by
    a modeset operation. This has the advantage that pageflip could
    continue unhampered on unaffected crtc. But if e.g. global resources
    like plls need to be reassigned and so affect unrelated crtcs we can
    still do that - nested locking works in any order.

    This patch just adds the locks and takes them in drm_modeset_lock_all,
    no real locking changes yet.

    v2: Need to initialize the new lock in crtc_init and lock it righ
    away, for otherwise the modeset_unlock_all below will try to unlock a
    not-locked mutex.

    Reviewed-by: Rob Clark
    Signed-off-by: Daniel Vetter

    Daniel Vetter
     
  • This is the first step towards introducing the new modeset locking
    scheme. The plan is to put helper functions into place at all the
    right places step-by-step, so that the final patch to switch on the
    new locking scheme doesn't need to touch every single driver.

    This helper here will serve as the shotgun solutions for all places
    where a more fine-grained locking isn't (yet) implemented.

    v2: Fixup kerneldoc for unlock_all.

    Reviewed-by: Rob Clark
    Signed-off-by: Daniel Vetter

    Daniel Vetter
     

20 Jan, 2013

7 commits

  • With refcounting we need to adjust framebuffer refcounts at each
    callsite - much easier to do if they all call the same little helper
    function.

    Reviewed-by: Rob Clark
    Signed-off-by: Daniel Vetter

    Daniel Vetter
     
  • - config_cleanup was confused: It claimed that callers need to hold
    the modeset lock, but the connector|encoder_cleanup helpers grabbed
    that themselves (note that crtc_cleanup did _not_ grab the modeset
    lock). Which resulted in all drivers _not_ hodling the lock. Since
    this is for single-threaded cleanup code, drop the requirement from
    docs and also drop the lock_grabbing from all _cleanup functions.

    - Kill the LOCKING section in the doctype, since clearly we're not
    good enough to keep them up-to-date. And misleading locking
    documentation is worse than useless (see e.g. the comment in the
    vmgfx driver about the cleanup mess). And since for most functions
    the very first line either grabs the lock or has a WARN_ON(!locked)
    the documentation doesn't really add anything.

    - Instead put in some effort into explaining the only two special
    cases a bit better: config_init and config_cleanup are both called
    from single-threaded setup/teardown code, so don't do any locking.
    It's the driver's job though to enforce this.

    - Where lacking, add a WARN_ON(!is_locked). Not many places though,
    since locking around fbdev setup/teardown is through-roughly screwed
    up, and so will break almost every single WARN annotation I've tried
    to add.

    - Add a drm_modeset_is_locked helper - the Grate Modset Locking Rework
    will use the compiler to assist in the big reorg by renaming the
    mode lock, so start encapsulating things. Unfortunately this ended
    up in the "wrong" header file since it needs the definition of
    struct drm_device.

    v2: Drop most WARNS again - we hit them all over the place, mostly in
    the setup and teardown sequences. And trying to fix it up leads to
    nice deadlocks, since the locking in the setup code is really
    inconsistent.

    Reviewed-by: Rob Clark
    Signed-off-by: Daniel Vetter

    Daniel Vetter
     
  • It is no longer used in the i915 code, so isolate it from the shared
    struct.

    This was originally part of:
    commit 0e275518f325418d559c05327775bff894b237f7
    Author: Ben Widawsky
    Date: Mon Jan 14 13:35:33 2013 -0800

    agp/intel: decouple more of the agp-i915 sharing

    Reviewed-by: Rodrigo Vivi
    Signed-off-by: Ben Widawsky

    That commit had some other hunks which can't be used due to issues
    Daniel found in previous commits.

    Signed-off-by: Ben Widawsky
    [danvet: drop squash notice from the commit since it's imo ok to keep
    this one separate.]
    Signed-off-by: Daniel Vetter

    Ben Widawsky
     
  • The reasoning behind our code taking two paths depending upon whether or
    not we may have been configured for IOMMU isn't clear to me. It should
    always be safe to use the pci mapping functions as they are designed to
    abstract the decision we were handling in i915.

    Aside from simpler code, removing another member for the intel_gtt
    struct is a nice motivation.

    I ran this by Chris, and he wasn't concerned about the extra kzalloc,
    and memory references vs. page_to_phys calculation in the case without
    IOMMU.

    v2: Update commit message

    v3: Remove needs_dmar addition from Zhenyu upstream

    This reverts (and then other stuff)
    commit 20652097dadd9a7fb4d652f25466299974bc78f9
    Author: Zhenyu Wang
    Date: Thu Dec 13 23:47:47 2012 +0800

    drm/i915: Fix missed needs_dmar setting

    Reviewed-by: Rodrigo Vivi (v2)
    Cc: Zhenyu Wang
    Signed-off-by: Ben Widawsky
    [danvet: Squash in follow-up fix to remove the bogus hunk which
    deleted the dma_mask configuration for gen6+.]
    Signed-off-by: Daniel Vetter

    Ben Widawsky
     
  • We already had a mapping in both (minus the phys_addr in AGP).

    Reviewed-by: Rodrigo Vivi
    Signed-off-by: Ben Widawsky
    Signed-off-by: Daniel Vetter

    Ben Widawsky
     
  • And, move it to where the rest of the logic is.

    There is some slight functionality changes. There was extra paranoid
    checks in AGP code making sure we never do idle maps on gen2 parts. That
    was not duplicated as the simple PCI id check should do the right thing.

    v2: use IS_GEN5 && IS_MOBILE check instead. For now, this is the same as
    IS_IRONLAKE_M but is more future proof. The workaround docs hint that
    more than one platform may be effected, but we've never seen such a
    platform in the wild. (Rodrigo, Daniel)

    Reviewed-by: Rodrigo Vivi (v1)
    Cc: Dave Airlie
    Signed-off-by: Ben Widawsky
    Signed-off-by: Daniel Vetter

    Ben Widawsky
     
  • drm_rgb_quant_range_selectable() will report whether the monitor
    claims to support for RGB quantization range selection.

    The information can be found in the CEA Video capability block.

    v2: s/quantzation/quantization/ in the comment

    Reviewed-by: Paulo Zanoni
    Signed-off-by: Ville Syrjälä
    Acked-by: David Airlie
    Signed-off-by: Daniel Vetter

    Ville Syrjälä
     

17 Jan, 2013

1 commit

  • …m-intel into drm-next

    Daniel writes:
    - seqno wrap fixes and debug infrastructure from Mika Kuoppala and Chris
    Wilson
    - some leftover kill-agp on gen6+ patches from Ben
    - hotplug improvements from Damien
    - clear fb when allocated from stolen, avoids dirt on the fbcon (Chris)
    - Stolen mem support from Chris Wilson, one of the many steps to get to
    real fastboot support.
    - Some DDI code cleanups from Paulo.
    - Some refactorings around lvds and dp code.
    - some random little bits&pieces

    * tag 'drm-intel-next-2012-12-21' of git://people.freedesktop.org/~danvet/drm-intel: (93 commits)
    drm/i915: Return the real error code from intel_set_mode()
    drm/i915: Make GSM void
    drm/i915: Move GSM mapping into dev_priv
    drm/i915: Move even more gtt code to i915_gem_gtt
    drm/i915: Make next_seqno debugs entry to use i915_gem_set_seqno
    drm/i915: Introduce i915_gem_set_seqno()
    drm/i915: Always clear semaphore mboxes on seqno wrap
    drm/i915: Initialize hardware semaphore state on ring init
    drm/i915: Introduce ring set_seqno
    drm/i915: Missed conversion to gtt_pte_t
    drm/i915: Bug on unsupported swizzled platforms
    drm/i915: BUG() if fences are used on unsupported platform
    drm/i915: fixup overlay stolen memory leak
    drm/i915: clean up PIPECONF bpc #defines
    drm/i915: add intel_dp_set_signal_levels
    drm/i915: remove leftover display.update_wm assignment
    drm/i915: check for the PCH when setting pch_transcoder
    drm/i915: Clear the stolen fb before enabling
    drm/i915: Access to snooped system memory through the GTT is incoherent
    drm/i915: Remove stale comment about intel_dp_detect()
    ...

    Conflicts:
    drivers/gpu/drm/i915/intel_display.c

    Dave Airlie
     

15 Jan, 2013

3 commits


11 Jan, 2013

1 commit

  • Daniel writes:
    "Pretty much all just major fixes:
    - 2 pieces of duct-tape for the ilk bug.
    - Sprite regression fixes from Chris.
    - OOPS fix for a div-by-zero from Chris, regression due to the modeset
    rework in 3.7, now brought to light by a benign change in 3.8.
    - Fix interrupted bo pinning, used to work around CS coherency issues on
    i830/i845 (kernel also has a w/a newly in 3.8, but pinning is more efficient if
    possible)."

    Dave Airlie