Merge tag 'drm-for-v4.9' of git://people.freedesktop.org/~airlied/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 12 Oct 2016 01:12:22 +0000 (18:12 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 12 Oct 2016 01:12:22 +0000 (18:12 -0700)
Pull drm updates from Dave Airlie:
 "Core:
   - Fence destaging work
   - DRIVER_LEGACY to split off legacy drm drivers
   - drm_mm refactoring
   - Splitting drm_crtc.c into chunks and documenting better
   - Display info fixes
   - rbtree support for prime buffer lookup
   - Simple VGA DAC driver

  Panel:
   - Add Nexus 7 panel
   - More simple panels

  i915:
   - Refactoring GEM naming
   - Refactored vma/active tracking
   - Lockless request lookups
   - Better stolen memory support
   - FBC fixes
   - SKL watermark fixes
   - VGPU improvements
   - dma-buf fencing support
   - Better DP dongle support

  amdgpu:
   - Powerplay for Iceland asics
   - Improved GPU reset support
   - UVD/VEC powergating support for CZ/ST
   - Preinitialised VRAM buffer support
   - Virtual display support
   - Initial SI support
   - GTT rework
   - PCI shutdown callback support
   - HPD IRQ storm fixes

  amdkfd:
   - bugfixes

  tilcdc:
   - Atomic modesetting support

  mediatek:
   - AAL + GAMMA engine support
   - Hook up gamma LUT
   - Temporal dithering support

  imx:
   - Pixel clock from devicetree
   - drm bridge support for LVDS bridges
   - active plane reconfiguration
   - VDIC deinterlacer support
   - Frame synchronisation unit support
   - Color space conversion support

  analogix:
   - PSR support
   - Better panel on/off support

  rockchip:
   - rk3399 vop/crtc support
   - PSR support

  vc4:
   - Interlaced vblank timing
   - 3D rendering CPU overhead reduction
   - HDMI output fixes

  tda998x:
   - HDMI audio ASoC support

  sunxi:
   - Allwinner A33 support
   - better TCON support

  msm:
   - DT binding cleanups
   - Explicit fence-fd support

  sti:
   - remove sti415/416 support

  etnaviv:
   - MMUv2 refactoring
   - GC3000 support

  exynos:
   - Refactoring HDMI DCC/PHY
   - G2D pm regression fix
   - Page fault issues with wait for vblank

  There is no nouveau work in this tree, as Ben didn't get a pull
  request in, and he was fighting moving to atomic and adding mst
  support, so maybe best it waits for a cycle"

* tag 'drm-for-v4.9' of git://people.freedesktop.org/~airlied/linux: (1412 commits)
  drm/crtc: constify drm_crtc_index parameter
  drm/i915: Fix conflict resolution from backmerge of v4.8-rc8 to drm-next
  drm/i915/guc: Unwind GuC workqueue reservation if request construction fails
  drm/i915: Reset the breadcrumbs IRQ more carefully
  drm/i915: Force relocations via cpu if we run out of idle aperture
  drm/i915: Distinguish last emitted request from last submitted request
  drm/i915: Allow DP to work w/o EDID
  drm/i915: Move long hpd handling into the hotplug work
  drm/i915/execlists: Reinitialise context image after GPU hang
  drm/i915: Use correct index for backtracking HUNG semaphores
  drm/i915: Unalias obj->phys_handle and obj->userptr
  drm/i915: Just clear the mmiodebug before a register access
  drm/i915/gen9: only add the planes actually affected by ddb changes
  drm/i915: Allow PCH DPLL sharing regardless of DPLL_SDVO_HIGH_SPEED
  drm/i915/bxt: Fix HDMI DPLL configuration
  drm/i915/gen9: fix the watermark res_blocks value
  drm/i915/gen9: fix plane_blocks_per_line on watermarks calculations
  drm/i915/gen9: minimum scanlines for Y tile is not always 4
  drm/i915/gen9: fix the WaWmMemoryReadLatency implementation
  drm/i915/kbl: KBL also needs to run the SAGV code
  ...

13 files changed:
1  2 
Documentation/gpu/index.rst
MAINTAINERS
arch/arm/boot/dts/am335x-boneblack.dts
arch/x86/kernel/early-quirks.c
drivers/dma-buf/sync_debug.c
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/armada/armada_gem.c
drivers/gpu/drm/drm_dp_helper.c
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/radeon/si_dpm.c
include/uapi/linux/Kbuild

index 5ff3d2b236afa04c171375e9223def9d339d2db9,ba92f45abb76e59f6c8324c3bd01db13b53003e9..be0dafcf5556df17509a9d376e29e2800c14ca61
@@@ -12,10 -12,4 +12,11 @@@ Linux GPU Driver Developer's Guid
     drm-uapi
     i915
     vga-switcheroo
+    vgaarbiter
 +
 +.. only::  subproject
 +
 +   Indices
 +   =======
 +
 +   * :ref:`genindex`
diff --cc MAINTAINERS
Simple merge
Simple merge
index fab95204cf74ead77020695c201d322940fd6edf,0000000000000000000000000000000000000000..2dd4c3db6caa83ceff101bb5405baea8c2ef4874
mode 100644,000000..100644
--- /dev/null
@@@ -1,230 -1,0 +1,236 @@@
-                  sync_status_str(atomic_read(&sync_file->status)));
 +/*
 + * Sync File validation framework and debug information
 + *
 + * Copyright (C) 2012 Google, Inc.
 + *
 + * This software is licensed under the terms of the GNU General Public
 + * License version 2, as published by the Free Software Foundation, and
 + * may be copied, distributed, and modified under those terms.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + */
 +
 +#include <linux/debugfs.h>
 +#include "sync_debug.h"
 +
 +static struct dentry *dbgfs;
 +
 +static LIST_HEAD(sync_timeline_list_head);
 +static DEFINE_SPINLOCK(sync_timeline_list_lock);
 +static LIST_HEAD(sync_file_list_head);
 +static DEFINE_SPINLOCK(sync_file_list_lock);
 +
 +void sync_timeline_debug_add(struct sync_timeline *obj)
 +{
 +      unsigned long flags;
 +
 +      spin_lock_irqsave(&sync_timeline_list_lock, flags);
 +      list_add_tail(&obj->sync_timeline_list, &sync_timeline_list_head);
 +      spin_unlock_irqrestore(&sync_timeline_list_lock, flags);
 +}
 +
 +void sync_timeline_debug_remove(struct sync_timeline *obj)
 +{
 +      unsigned long flags;
 +
 +      spin_lock_irqsave(&sync_timeline_list_lock, flags);
 +      list_del(&obj->sync_timeline_list);
 +      spin_unlock_irqrestore(&sync_timeline_list_lock, flags);
 +}
 +
 +void sync_file_debug_add(struct sync_file *sync_file)
 +{
 +      unsigned long flags;
 +
 +      spin_lock_irqsave(&sync_file_list_lock, flags);
 +      list_add_tail(&sync_file->sync_file_list, &sync_file_list_head);
 +      spin_unlock_irqrestore(&sync_file_list_lock, flags);
 +}
 +
 +void sync_file_debug_remove(struct sync_file *sync_file)
 +{
 +      unsigned long flags;
 +
 +      spin_lock_irqsave(&sync_file_list_lock, flags);
 +      list_del(&sync_file->sync_file_list);
 +      spin_unlock_irqrestore(&sync_file_list_lock, flags);
 +}
 +
 +static const char *sync_status_str(int status)
 +{
 +      if (status == 0)
 +              return "signaled";
 +
 +      if (status > 0)
 +              return "active";
 +
 +      return "error";
 +}
 +
 +static void sync_print_fence(struct seq_file *s, struct fence *fence, bool show)
 +{
 +      int status = 1;
 +      struct sync_timeline *parent = fence_parent(fence);
 +
 +      if (fence_is_signaled_locked(fence))
 +              status = fence->status;
 +
 +      seq_printf(s, "  %s%sfence %s",
 +                 show ? parent->name : "",
 +                 show ? "_" : "",
 +                 sync_status_str(status));
 +
 +      if (status <= 0) {
 +              struct timespec64 ts64 =
 +                      ktime_to_timespec64(fence->timestamp);
 +
 +              seq_printf(s, "@%lld.%09ld", (s64)ts64.tv_sec, ts64.tv_nsec);
 +      }
 +
 +      if (fence->ops->timeline_value_str &&
 +              fence->ops->fence_value_str) {
 +              char value[64];
 +              bool success;
 +
 +              fence->ops->fence_value_str(fence, value, sizeof(value));
 +              success = strlen(value);
 +
 +              if (success) {
 +                      seq_printf(s, ": %s", value);
 +
 +                      fence->ops->timeline_value_str(fence, value,
 +                                                     sizeof(value));
 +
 +                      if (strlen(value))
 +                              seq_printf(s, " / %s", value);
 +              }
 +      }
 +
 +      seq_puts(s, "\n");
 +}
 +
 +static void sync_print_obj(struct seq_file *s, struct sync_timeline *obj)
 +{
 +      struct list_head *pos;
 +      unsigned long flags;
 +
 +      seq_printf(s, "%s: %d\n", obj->name, obj->value);
 +
 +      spin_lock_irqsave(&obj->child_list_lock, flags);
 +      list_for_each(pos, &obj->child_list_head) {
 +              struct sync_pt *pt =
 +                      container_of(pos, struct sync_pt, child_list);
 +              sync_print_fence(s, &pt->base, false);
 +      }
 +      spin_unlock_irqrestore(&obj->child_list_lock, flags);
 +}
 +
 +static void sync_print_sync_file(struct seq_file *s,
 +                                struct sync_file *sync_file)
 +{
 +      int i;
 +
 +      seq_printf(s, "[%p] %s: %s\n", sync_file, sync_file->name,
-       for (i = 0; i < sync_file->num_fences; ++i)
-               sync_print_fence(s, sync_file->cbs[i].fence, true);
++                 sync_status_str(!fence_is_signaled(sync_file->fence)));
 +
++      if (fence_is_array(sync_file->fence)) {
++              struct fence_array *array = to_fence_array(sync_file->fence);
++
++              for (i = 0; i < array->num_fences; ++i)
++                      sync_print_fence(s, array->fences[i], true);
++      } else {
++              sync_print_fence(s, sync_file->fence, true);
++      }
 +}
 +
 +static int sync_debugfs_show(struct seq_file *s, void *unused)
 +{
 +      unsigned long flags;
 +      struct list_head *pos;
 +
 +      seq_puts(s, "objs:\n--------------\n");
 +
 +      spin_lock_irqsave(&sync_timeline_list_lock, flags);
 +      list_for_each(pos, &sync_timeline_list_head) {
 +              struct sync_timeline *obj =
 +                      container_of(pos, struct sync_timeline,
 +                                   sync_timeline_list);
 +
 +              sync_print_obj(s, obj);
 +              seq_puts(s, "\n");
 +      }
 +      spin_unlock_irqrestore(&sync_timeline_list_lock, flags);
 +
 +      seq_puts(s, "fences:\n--------------\n");
 +
 +      spin_lock_irqsave(&sync_file_list_lock, flags);
 +      list_for_each(pos, &sync_file_list_head) {
 +              struct sync_file *sync_file =
 +                      container_of(pos, struct sync_file, sync_file_list);
 +
 +              sync_print_sync_file(s, sync_file);
 +              seq_puts(s, "\n");
 +      }
 +      spin_unlock_irqrestore(&sync_file_list_lock, flags);
 +      return 0;
 +}
 +
 +static int sync_info_debugfs_open(struct inode *inode, struct file *file)
 +{
 +      return single_open(file, sync_debugfs_show, inode->i_private);
 +}
 +
 +static const struct file_operations sync_info_debugfs_fops = {
 +      .open           = sync_info_debugfs_open,
 +      .read           = seq_read,
 +      .llseek         = seq_lseek,
 +      .release        = single_release,
 +};
 +
 +static __init int sync_debugfs_init(void)
 +{
 +      dbgfs = debugfs_create_dir("sync", NULL);
 +
 +      /*
 +       * The debugfs files won't ever get removed and thus, there is
 +       * no need to protect it against removal races. The use of
 +       * debugfs_create_file_unsafe() is actually safe here.
 +       */
 +      debugfs_create_file_unsafe("info", 0444, dbgfs, NULL,
 +                                 &sync_info_debugfs_fops);
 +      debugfs_create_file_unsafe("sw_sync", 0644, dbgfs, NULL,
 +                                 &sw_sync_debugfs_fops);
 +
 +      return 0;
 +}
 +late_initcall(sync_debugfs_init);
 +
 +#define DUMP_CHUNK 256
 +static char sync_dump_buf[64 * 1024];
 +void sync_dump(void)
 +{
 +      struct seq_file s = {
 +              .buf = sync_dump_buf,
 +              .size = sizeof(sync_dump_buf) - 1,
 +      };
 +      int i;
 +
 +      sync_debugfs_show(&s, NULL);
 +
 +      for (i = 0; i < s.count; i += DUMP_CHUNK) {
 +              if ((s.count - i) > DUMP_CHUNK) {
 +                      char c = s.buf[i + DUMP_CHUNK];
 +
 +                      s.buf[i + DUMP_CHUNK] = 0;
 +                      pr_cont("%s", s.buf + i);
 +                      s.buf[i + DUMP_CHUNK] = c;
 +              } else {
 +                      s.buf[s.count] = 0;
 +                      pr_cont("%s", s.buf + i);
 +              }
 +      }
 +}
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge