Merge tag 'v3.18' into drm-next
authorDave Airlie <airlied@redhat.com>
Mon, 8 Dec 2014 00:33:52 +0000 (10:33 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 8 Dec 2014 00:33:52 +0000 (10:33 +1000)
Linux 3.18

Backmerge Linus tree into -next as we had conflicts in i915/radeon/nouveau,
and everyone was solving them individually.

* tag 'v3.18': (57 commits)
  Linux 3.18
  watchdog: s3c2410_wdt: Fix the mask bit offset for Exynos7
  uapi: fix to export linux/vm_sockets.h
  i2c: cadence: Set the hardware time-out register to maximum value
  i2c: davinci: generate STP always when NACK is received
  ahci: disable MSI on SAMSUNG 0xa800 SSD
  context_tracking: Restore previous state in schedule_user
  slab: fix nodeid bounds check for non-contiguous node IDs
  lib/genalloc.c: export devm_gen_pool_create() for modules
  mm: fix anon_vma_clone() error treatment
  mm: fix swapoff hang after page migration and fork
  fat: fix oops on corrupted vfat fs
  ipc/sem.c: fully initialize sem_array before making it visible
  drivers/input/evdev.c: don't kfree() a vmalloc address
  cxgb4: Fill in supported link mode for SFP modules
  xen-netfront: Remove BUGs on paged skb data which crosses a page boundary
  mm/vmpressure.c: fix race in vmpressure_work_fn()
  mm: frontswap: invalidate expired data on a dup-store failure
  mm: do not overwrite reserved pages counter at show_mem()
  drm/radeon: kernel panic in drm_calc_vbltimestamp_from_scanoutpos with 3.18.0-rc6
  ...

Conflicts:
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/radeon/radeon_cs.c

1  2 
MAINTAINERS
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_lvds.c
drivers/gpu/drm/nouveau/core/engine/fifo/nve0.c
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/radeon/radeon_cs.c
drivers/gpu/drm/radeon/radeon_kms.c
drivers/gpu/drm/radeon/radeon_object.c
mm/memory.c
mm/rmap.c

diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
index afb93bb72f97949135e38b352b902b5d31a66034,62b97c4eef8dc0166490770e2691f00b5bfb487a..65910e3aed0c86e1240273f274f42ea947373d58
@@@ -647,30 -667,7 +647,29 @@@ nouveau_do_resume(struct drm_device *de
        return 0;
  }
  
 -int nouveau_pmops_resume(struct device *dev)
 +int
 +nouveau_pmops_suspend(struct device *dev)
 +{
 +      struct pci_dev *pdev = to_pci_dev(dev);
 +      struct drm_device *drm_dev = pci_get_drvdata(pdev);
 +      int ret;
 +
 +      if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF ||
 +          drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
 +              return 0;
 +
 +      ret = nouveau_do_suspend(drm_dev, false);
 +      if (ret)
 +              return ret;
 +
 +      pci_save_state(pdev);
 +      pci_disable_device(pdev);
-       pci_ignore_hotplug(pdev);
 +      pci_set_power_state(pdev, PCI_D3hot);
 +      return 0;
 +}
 +
 +int
 +nouveau_pmops_resume(struct device *dev)
  {
        struct pci_dev *pdev = to_pci_dev(dev);
        struct drm_device *drm_dev = pci_get_drvdata(pdev);
@@@ -706,105 -701,6 +705,106 @@@ nouveau_pmops_thaw(struct device *dev
        return nouveau_do_resume(drm_dev, false);
  }
  
 +static int
 +nouveau_pmops_runtime_suspend(struct device *dev)
 +{
 +      struct pci_dev *pdev = to_pci_dev(dev);
 +      struct drm_device *drm_dev = pci_get_drvdata(pdev);
 +      int ret;
 +
 +      if (nouveau_runtime_pm == 0) {
 +              pm_runtime_forbid(dev);
 +              return -EBUSY;
 +      }
 +
 +      /* are we optimus enabled? */
 +      if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) {
 +              DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
 +              pm_runtime_forbid(dev);
 +              return -EBUSY;
 +      }
 +
 +      nv_debug_level(SILENT);
 +      drm_kms_helper_poll_disable(drm_dev);
 +      vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF);
 +      nouveau_switcheroo_optimus_dsm();
 +      ret = nouveau_do_suspend(drm_dev, true);
 +      pci_save_state(pdev);
 +      pci_disable_device(pdev);
++      pci_ignore_hotplug(pdev);
 +      pci_set_power_state(pdev, PCI_D3cold);
 +      drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
 +      return ret;
 +}
 +
 +static int
 +nouveau_pmops_runtime_resume(struct device *dev)
 +{
 +      struct pci_dev *pdev = to_pci_dev(dev);
 +      struct drm_device *drm_dev = pci_get_drvdata(pdev);
 +      struct nvif_device *device = &nouveau_drm(drm_dev)->device;
 +      int ret;
 +
 +      if (nouveau_runtime_pm == 0)
 +              return -EINVAL;
 +
 +      pci_set_power_state(pdev, PCI_D0);
 +      pci_restore_state(pdev);
 +      ret = pci_enable_device(pdev);
 +      if (ret)
 +              return ret;
 +      pci_set_master(pdev);
 +
 +      ret = nouveau_do_resume(drm_dev, true);
 +      drm_kms_helper_poll_enable(drm_dev);
 +      /* do magic */
 +      nvif_mask(device, 0x88488, (1 << 25), (1 << 25));
 +      vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_ON);
 +      drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;
 +      nv_debug_level(NORMAL);
 +      return ret;
 +}
 +
 +static int
 +nouveau_pmops_runtime_idle(struct device *dev)
 +{
 +      struct pci_dev *pdev = to_pci_dev(dev);
 +      struct drm_device *drm_dev = pci_get_drvdata(pdev);
 +      struct nouveau_drm *drm = nouveau_drm(drm_dev);
 +      struct drm_crtc *crtc;
 +
 +      if (nouveau_runtime_pm == 0) {
 +              pm_runtime_forbid(dev);
 +              return -EBUSY;
 +      }
 +
 +      /* are we optimus enabled? */
 +      if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) {
 +              DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
 +              pm_runtime_forbid(dev);
 +              return -EBUSY;
 +      }
 +
 +      /* if we have a hdmi audio device - make sure it has a driver loaded */
 +      if (drm->hdmi_device) {
 +              if (!drm->hdmi_device->driver) {
 +                      DRM_DEBUG_DRIVER("failing to power off - no HDMI audio driver loaded\n");
 +                      pm_runtime_mark_last_busy(dev);
 +                      return -EBUSY;
 +              }
 +      }
 +
 +      list_for_each_entry(crtc, &drm->dev->mode_config.crtc_list, head) {
 +              if (crtc->enabled) {
 +                      DRM_DEBUG_DRIVER("failing to power off - crtc active\n");
 +                      return -EBUSY;
 +              }
 +      }
 +      pm_runtime_mark_last_busy(dev);
 +      pm_runtime_autosuspend(dev);
 +      /* we don't want the main rpm_idle to call suspend - we want to autosuspend */
 +      return 1;
 +}
  
  static int
  nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
index 9648e28c4501b8236e3c7609d7d1728fc0324e28,6f377de099f93ad44ec876e6d385ff916b08345a..c830863bc98aa0cb55e84aedfbbc76606945ee01
@@@ -239,9 -258,8 +239,8 @@@ static int radeon_cs_sync_rings(struct 
                struct reservation_object *resv;
  
                resv = reloc->robj->tbo.resv;
 -              r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv,
 -                                             reloc->tv.shared);
 +              r = radeon_sync_resv(p->rdev, &p->ib.sync, resv,
 +                                   reloc->tv.shared);
                if (r)
                        return r;
        }
Simple merge
diff --cc mm/memory.c
Simple merge
diff --cc mm/rmap.c
Simple merge