Merge branch 'drm-next-4.6' of git://people.freedesktop.org/~agd5f/linux into drm...
authorDave Airlie <airlied@redhat.com>
Wed, 16 Mar 2016 22:25:04 +0000 (08:25 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 16 Mar 2016 22:25:04 +0000 (08:25 +1000)
A few more fixes and cleanups for 4.6:
- DCE code cleanups
- HDP flush/invalidation fixes
- GPUVM fixes
- switch to drm_vblank_[on|off]
- PX fixes
- misc bug fixes

* 'drm-next-4.6' of git://people.freedesktop.org/~agd5f/linux: (50 commits)
  drm/amdgpu: split pipeline sync out of SDMA vm_flush() as well
  drm/amdgpu: Revert "add mutex for ba_va->valids/invalids"
  drm/amdgpu: Revert "add lock for interval tree in vm"
  drm/amdgpu: Revert "add spin lock to protect freed list in vm (v3)"
  drm/amdgpu: reserve the PD during unmap and remove
  drm/amdgpu: Fix two bugs in amdgpu_vm_bo_split_mapping
  drm/radeon: Don't drop DP 2.7 Ghz link setup on some cards.
  MAINTAINERS: update radeon entry to include amdgpu as well
  drm/amdgpu: disable runtime pm on PX laptops without dGPU power control
  drm/radeon: disable runtime pm on PX laptops without dGPU power control
  drm/amd/amdgpu: Fix indentation in do_set_base() (DCEv8)
  drm/amd/amdgpu: make afmt_init cleanup if alloc fails (DCEv8)
  drm/amd/amdgpu: Move config init flag to bottom of sw_init (DCEv8)
  drm/amd/amdgpu: Don't proceed into audio_fini if audio is disabled (DCEv8)
  drm/amd/amdgpu: Fix identation in do_set_base() (DCEv10)
  drm/amd/amdgpu: Make afmt_init cleanup if alloc fails (DCEv10)
  drm/amd/amdgpu: Move initialized flag to bottom of sw_init (DCEv10)
  drm/amd/amdgpu: Don't proceed in audio_fini if disabled (DCEv10)
  drm/amd/amdgpu: Fix indentation in dce_v11_0_crtc_do_set_base()
  drm/amd/amdgpu: Make afmt_init() cleanup if alloc fails (DCEv11)
  ...

15 files changed:
1  2 
MAINTAINERS
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
drivers/gpu/drm/amd/amdgpu/ci_dpm.c
drivers/gpu/drm/amd/amdgpu/cik.c
drivers/gpu/drm/amd/amdgpu/cik_sdma.c
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
drivers/gpu/drm/amd/amdgpu/vi.c
drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
drivers/gpu/drm/radeon/radeon_device.c

diff --combined MAINTAINERS
@@@ -926,24 -926,17 +926,24 @@@ M:      Emilio López <emilio@elopez.com.ar
  S:    Maintained
  F:    drivers/clk/sunxi/
  
 -ARM/Amlogic MesonX SoC support
 +ARM/Amlogic Meson SoC support
  M:    Carlo Caione <carlo@caione.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +L:    linux-meson@googlegroups.com
 +W:    http://linux-meson.com/
  S:    Maintained
 -F:    drivers/media/rc/meson-ir.c
 -N:    meson[x68]
 +F:    arch/arm/mach-meson/
 +F:    arch/arm/boot/dts/meson*
 +N:    meson
  
  ARM/Annapurna Labs ALPINE ARCHITECTURE
  M:    Tsahee Zidenberg <tsahee@annapurnalabs.com>
 +M:    Antoine Tenart <antoine.tenart@free-electrons.com>
  S:    Maintained
  F:    arch/arm/mach-alpine/
 +F:    arch/arm/boot/dts/alpine*
 +F:    arch/arm64/boot/dts/al/
 +F:    drivers/*/*alpine*
  
  ARM/ATMEL AT91RM9200, AT91SAM9 AND SAMA5 SOC SUPPORT
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
@@@ -1455,8 -1448,8 +1455,8 @@@ S:      Maintaine
  ARM/RENESAS ARM64 ARCHITECTURE
  M:    Simon Horman <horms@verge.net.au>
  M:    Magnus Damm <magnus.damm@gmail.com>
 -L:    linux-sh@vger.kernel.org
 -Q:    http://patchwork.kernel.org/project/linux-sh/list/
 +L:    linux-renesas-soc@vger.kernel.org
 +Q:    http://patchwork.kernel.org/project/linux-renesas-soc/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas.git next
  S:    Supported
  F:    arch/arm64/boot/dts/renesas/
@@@ -2375,6 -2368,14 +2375,6 @@@ T:     git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  N:    bcm2835
  
 -BROADCOM BCM33XX MIPS ARCHITECTURE
 -M:    Kevin Cernekee <cernekee@gmail.com>
 -L:    linux-mips@linux-mips.org
 -S:    Maintained
 -F:    arch/mips/bcm3384/*
 -F:    arch/mips/include/asm/mach-bcm3384/*
 -F:    arch/mips/kernel/*bmips*
 -
  BROADCOM BCM47XX MIPS ARCHITECTURE
  M:    Hauke Mehrtens <hauke@hauke-m.de>
  M:    Rafał Miłecki <zajec5@gmail.com>
@@@ -3457,6 -3458,7 +3457,6 @@@ F:      drivers/usb/dwc2
  DESIGNWARE USB3 DRD IP DRIVER
  M:    Felipe Balbi <balbi@kernel.org>
  L:    linux-usb@vger.kernel.org
 -L:    linux-omap@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
  S:    Maintained
  F:    drivers/usb/dwc3/
@@@ -3710,7 -3712,7 +3710,7 @@@ F:      drivers/gpu/vga
  F:    include/drm/
  F:    include/uapi/drm/
  
- RADEON DRM DRIVERS
+ RADEON and AMDGPU DRM DRIVERS
  M:    Alex Deucher <alexander.deucher@amd.com>
  M:    Christian König <christian.koenig@amd.com>
  L:    dri-devel@lists.freedesktop.org
@@@ -3718,6 -3720,8 +3718,8 @@@ T:      git git://people.freedesktop.org/~ag
  S:    Supported
  F:    drivers/gpu/drm/radeon/
  F:    include/uapi/drm/radeon*
+ F:    drivers/gpu/drm/amd/
+ F:    include/uapi/drm/amdgpu*
  
  DRM PANEL DRIVERS
  M:    Thierry Reding <thierry.reding@gmail.com>
@@@ -3762,7 -3766,7 +3764,7 @@@ F:      include/drm/exynos
  F:    include/uapi/drm/exynos*
  
  DRM DRIVERS FOR FREESCALE DCU
 -M:    Jianwei Wang <jianwei.wang.chn@gmail.com>
 +M:    Stefan Agner <stefan@agner.ch>
  M:    Alison Wang <alison.wang@freescale.com>
  L:    dri-devel@lists.freedesktop.org
  S:    Supported
@@@ -4524,12 -4528,6 +4526,12 @@@ L:    linuxppc-dev@lists.ozlabs.or
  S:    Maintained
  F:    drivers/dma/fsldma.*
  
 +FREESCALE GPMI NAND DRIVER
 +M:    Han Xu <han.xu@nxp.com>
 +L:    linux-mtd@lists.infradead.org
 +S:    Maintained
 +F:    drivers/mtd/nand/gpmi-nand/*
 +
  FREESCALE I2C CPM DRIVER
  M:    Jochen Friedrich <jochen@scram.de>
  L:    linuxppc-dev@lists.ozlabs.org
@@@ -4546,7 -4544,7 +4548,7 @@@ F:      include/linux/platform_data/video-im
  F:    drivers/video/fbdev/imxfb.c
  
  FREESCALE QUAD SPI DRIVER
 -M:    Han Xu <han.xu@freescale.com>
 +M:    Han Xu <han.xu@nxp.com>
  L:    linux-mtd@lists.infradead.org
  S:    Maintained
  F:    drivers/mtd/spi-nor/fsl-quadspi.c
@@@ -4560,15 -4558,6 +4562,15 @@@ S:    Maintaine
  F:    drivers/net/ethernet/freescale/fs_enet/
  F:    include/linux/fs_enet_pd.h
  
 +FREESCALE IMX / MXC FEC DRIVER
 +M:    Fugang Duan <fugang.duan@nxp.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/ethernet/freescale/fec_main.c
 +F:    drivers/net/ethernet/freescale/fec_ptp.c
 +F:    drivers/net/ethernet/freescale/fec.h
 +F:    Documentation/devicetree/bindings/net/fsl-fec.txt
 +
  FREESCALE QUICC ENGINE LIBRARY
  L:    linuxppc-dev@lists.ozlabs.org
  S:    Orphan
@@@ -6155,7 -6144,7 +6157,7 @@@ F:      include/uapi/linux/sunrpc
  
  KERNEL SELFTEST FRAMEWORK
  M:    Shuah Khan <shuahkh@osg.samsung.com>
 -L:    linux-api@vger.kernel.org
 +L:    linux-kselftest@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/shuah/linux-kselftest
  S:    Maintained
  F:    tools/testing/selftests
@@@ -6785,7 -6774,6 +6787,7 @@@ S:      Maintaine
  F:    Documentation/networking/mac80211-injection.txt
  F:    include/net/mac80211.h
  F:    net/mac80211/
 +F:    drivers/net/wireless/mac80211_hwsim.[ch]
  
  MACVLAN DRIVER
  M:    Patrick McHardy <kaber@trash.net>
@@@ -7382,7 -7370,7 +7384,7 @@@ F:      drivers/tty/isicom.
  F:    include/linux/isicom.h
  
  MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER
 -M:    Felipe Balbi <balbi@kernel.org>
 +M:    Bin Liu <b-liu@ti.com>
  L:    linux-usb@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
  S:    Maintained
@@@ -7714,13 -7702,13 +7716,13 @@@ S:   Maintaine
  F:    arch/nios2/
  
  NOKIA N900 POWER SUPPLY DRIVERS
 -M:    Pali Rohár <pali.rohar@gmail.com>
 -S:    Maintained
 +R:    Pali Rohár <pali.rohar@gmail.com>
  F:    include/linux/power/bq2415x_charger.h
  F:    include/linux/power/bq27xxx_battery.h
  F:    include/linux/power/isp1704_charger.h
  F:    drivers/power/bq2415x_charger.c
  F:    drivers/power/bq27xxx_battery.c
 +F:    drivers/power/bq27xxx_battery_i2c.c
  F:    drivers/power/isp1704_charger.c
  F:    drivers/power/rx51_battery.c
  
@@@ -7951,9 -7939,11 +7953,9 @@@ F:     drivers/media/platform/omap3isp
  F:    drivers/staging/media/omap4iss/
  
  OMAP USB SUPPORT
 -M:    Felipe Balbi <balbi@kernel.org>
  L:    linux-usb@vger.kernel.org
  L:    linux-omap@vger.kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
 -S:    Maintained
 +S:    Orphan
  F:    drivers/usb/*/*omap*
  F:    arch/arm/*omap*/usb*
  
@@@ -9584,12 -9574,6 +9586,12 @@@ M:    Andreas Noever <andreas.noever@gmail
  S:    Maintained
  F:    drivers/thunderbolt/
  
 +TI BQ27XXX POWER SUPPLY DRIVER
 +R:    Andrew F. Davis <afd@ti.com>
 +F:    include/linux/power/bq27xxx_battery.h
 +F:    drivers/power/bq27xxx_battery.c
 +F:    drivers/power/bq27xxx_battery_i2c.c
 +
  TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
  M:    John Stultz <john.stultz@linaro.org>
  M:    Thomas Gleixner <tglx@linutronix.de>
@@@ -9811,11 -9795,10 +9813,11 @@@ S:   Supporte
  F:    drivers/scsi/be2iscsi/
  
  Emulex 10Gbps NIC BE2, BE3-R, Lancer, Skyhawk-R DRIVER
 -M:    Sathya Perla <sathya.perla@avagotech.com>
 -M:    Ajit Khaparde <ajit.khaparde@avagotech.com>
 -M:    Padmanabh Ratnakar <padmanabh.ratnakar@avagotech.com>
 -M:    Sriharsha Basavapatna <sriharsha.basavapatna@avagotech.com>
 +M:    Sathya Perla <sathya.perla@broadcom.com>
 +M:    Ajit Khaparde <ajit.khaparde@broadcom.com>
 +M:    Padmanabh Ratnakar <padmanabh.ratnakar@broadcom.com>
 +M:    Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
 +M:    Somnath Kotur <somnath.kotur@broadcom.com>
  L:    netdev@vger.kernel.org
  W:    http://www.emulex.com
  S:    Supported
@@@ -10874,14 -10857,6 +10876,14 @@@ L: linux-omap@vger.kernel.or
  S:    Maintained
  F:    drivers/thermal/ti-soc-thermal/
  
 +TI VPE/CAL DRIVERS
 +M:    Benoit Parrot <bparrot@ti.com>
 +L:    linux-media@vger.kernel.org
 +W:    http://linuxtv.org/
 +Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 +S:    Maintained
 +F:    drivers/media/platform/ti-vpe/
 +
  TI CDCE706 CLOCK DRIVER
  M:    Max Filippov <jcmvbkbc@gmail.com>
  S:    Maintained
@@@ -12053,6 -12028,7 +12055,6 @@@ F:   arch/arm64/xen
  F:    arch/arm64/include/asm/xen/
  
  XEN NETWORK BACKEND DRIVER
 -M:    Ian Campbell <ian.campbell@citrix.com>
  M:    Wei Liu <wei.liu2@citrix.com>
  L:    xen-devel@lists.xenproject.org (moderated for non-subscribers)
  L:    netdev@vger.kernel.org
@@@ -85,8 -85,6 +85,8 @@@ extern int amdgpu_vm_debug
  extern int amdgpu_sched_jobs;
  extern int amdgpu_sched_hw_submission;
  extern int amdgpu_powerplay;
 +extern unsigned amdgpu_pcie_gen_cap;
 +extern unsigned amdgpu_pcie_lane_cap;
  
  #define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS                3000
  #define AMDGPU_MAX_USEC_TIMEOUT                       100000  /* 100 ms */
  #define AMDGPU_RESET_VCE                      (1 << 13)
  #define AMDGPU_RESET_VCE1                     (1 << 14)
  
 -/* CG block flags */
 -#define AMDGPU_CG_BLOCK_GFX                   (1 << 0)
 -#define AMDGPU_CG_BLOCK_MC                    (1 << 1)
 -#define AMDGPU_CG_BLOCK_SDMA                  (1 << 2)
 -#define AMDGPU_CG_BLOCK_UVD                   (1 << 3)
 -#define AMDGPU_CG_BLOCK_VCE                   (1 << 4)
 -#define AMDGPU_CG_BLOCK_HDP                   (1 << 5)
 -#define AMDGPU_CG_BLOCK_BIF                   (1 << 6)
 -
 -/* CG flags */
 -#define AMDGPU_CG_SUPPORT_GFX_MGCG            (1 << 0)
 -#define AMDGPU_CG_SUPPORT_GFX_MGLS            (1 << 1)
 -#define AMDGPU_CG_SUPPORT_GFX_CGCG            (1 << 2)
 -#define AMDGPU_CG_SUPPORT_GFX_CGLS            (1 << 3)
 -#define AMDGPU_CG_SUPPORT_GFX_CGTS            (1 << 4)
 -#define AMDGPU_CG_SUPPORT_GFX_CGTS_LS         (1 << 5)
 -#define AMDGPU_CG_SUPPORT_GFX_CP_LS           (1 << 6)
 -#define AMDGPU_CG_SUPPORT_GFX_RLC_LS          (1 << 7)
 -#define AMDGPU_CG_SUPPORT_MC_LS                       (1 << 8)
 -#define AMDGPU_CG_SUPPORT_MC_MGCG             (1 << 9)
 -#define AMDGPU_CG_SUPPORT_SDMA_LS             (1 << 10)
 -#define AMDGPU_CG_SUPPORT_SDMA_MGCG           (1 << 11)
 -#define AMDGPU_CG_SUPPORT_BIF_LS              (1 << 12)
 -#define AMDGPU_CG_SUPPORT_UVD_MGCG            (1 << 13)
 -#define AMDGPU_CG_SUPPORT_VCE_MGCG            (1 << 14)
 -#define AMDGPU_CG_SUPPORT_HDP_LS              (1 << 15)
 -#define AMDGPU_CG_SUPPORT_HDP_MGCG            (1 << 16)
 -
 -/* PG flags */
 -#define AMDGPU_PG_SUPPORT_GFX_PG              (1 << 0)
 -#define AMDGPU_PG_SUPPORT_GFX_SMG             (1 << 1)
 -#define AMDGPU_PG_SUPPORT_GFX_DMG             (1 << 2)
 -#define AMDGPU_PG_SUPPORT_UVD                 (1 << 3)
 -#define AMDGPU_PG_SUPPORT_VCE                 (1 << 4)
 -#define AMDGPU_PG_SUPPORT_CP                  (1 << 5)
 -#define AMDGPU_PG_SUPPORT_GDS                 (1 << 6)
 -#define AMDGPU_PG_SUPPORT_RLC_SMU_HS          (1 << 7)
 -#define AMDGPU_PG_SUPPORT_SDMA                        (1 << 8)
 -#define AMDGPU_PG_SUPPORT_ACP                 (1 << 9)
 -#define AMDGPU_PG_SUPPORT_SAMU                        (1 << 10)
 -
  /* GFX current status */
  #define AMDGPU_GFX_NORMAL_MODE                        0x00000000L
  #define AMDGPU_GFX_SAFE_MODE                  0x00000001L
@@@ -287,9 -326,11 +287,11 @@@ struct amdgpu_ring_funcs 
                        struct amdgpu_ib *ib);
        void (*emit_fence)(struct amdgpu_ring *ring, uint64_t addr,
                           uint64_t seq, unsigned flags);
+       void (*emit_pipeline_sync)(struct amdgpu_ring *ring);
        void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vm_id,
                              uint64_t pd_addr);
        void (*emit_hdp_flush)(struct amdgpu_ring *ring);
+       void (*emit_hdp_invalidate)(struct amdgpu_ring *ring);
        void (*emit_gds_switch)(struct amdgpu_ring *ring, uint32_t vmid,
                                uint32_t gds_base, uint32_t gds_size,
                                uint32_t gws_base, uint32_t gws_size,
@@@ -369,9 -410,6 +371,6 @@@ struct amdgpu_fence 
        struct amdgpu_ring              *ring;
        uint64_t                        seq;
  
-       /* filp or special value for fence creator */
-       void                            *owner;
        wait_queue_t                    fence_wake;
  };
  
@@@ -392,8 -430,7 +391,7 @@@ int amdgpu_fence_driver_start_ring(stru
                                   unsigned irq_type);
  void amdgpu_fence_driver_suspend(struct amdgpu_device *adev);
  void amdgpu_fence_driver_resume(struct amdgpu_device *adev);
- int amdgpu_fence_emit(struct amdgpu_ring *ring, void *owner,
-                     struct amdgpu_fence **fence);
+ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct fence **fence);
  void amdgpu_fence_process(struct amdgpu_ring *ring);
  int amdgpu_fence_wait_next(struct amdgpu_ring *ring);
  int amdgpu_fence_wait_empty(struct amdgpu_ring *ring);
@@@ -434,6 -471,8 +432,8 @@@ struct amdgpu_bo_list_entry 
        struct ttm_validate_buffer      tv;
        struct amdgpu_bo_va             *bo_va;
        uint32_t                        priority;
+       struct page                     **user_pages;
+       int                             user_invalidated;
  };
  
  struct amdgpu_bo_va_mapping {
  
  /* bo virtual addresses in a specific vm */
  struct amdgpu_bo_va {
-       struct mutex                    mutex;
        /* protected by bo being reserved */
        struct list_head                bo_list;
        struct fence                    *last_pt_update;
@@@ -553,6 -591,8 +552,6 @@@ struct amdgpu_sa_manager 
        uint32_t                align;
  };
  
 -struct amdgpu_sa_bo;
 -
  /* sub-allocation buffer */
  struct amdgpu_sa_bo {
        struct list_head                olist;
@@@ -596,6 -636,8 +595,8 @@@ int amdgpu_sync_resv(struct amdgpu_devi
  struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync);
  int amdgpu_sync_wait(struct amdgpu_sync *sync);
  void amdgpu_sync_free(struct amdgpu_sync *sync);
+ int amdgpu_sync_init(void);
+ void amdgpu_sync_fini(void);
  
  /*
   * GART structures, functions & helpers
@@@ -726,7 -768,7 +727,7 @@@ struct amdgpu_ib 
        uint32_t                        length_dw;
        uint64_t                        gpu_addr;
        uint32_t                        *ptr;
-       struct amdgpu_fence             *fence;
+       struct fence                    *fence;
        struct amdgpu_user_fence        *user;
        struct amdgpu_vm                *vm;
        unsigned                        vm_id;
@@@ -845,7 -887,6 +846,6 @@@ struct amdgpu_vm_id 
  
  struct amdgpu_vm {
        /* tree of virtual addresses mapped */
-       spinlock_t              it_lock;
        struct rb_root          va;
  
        /* protecting invalidated */
@@@ -882,6 -923,13 +882,13 @@@ struct amdgpu_vm_manager_id 
        struct list_head        list;
        struct fence            *active;
        atomic_long_t           owner;
+       uint32_t                gds_base;
+       uint32_t                gds_size;
+       uint32_t                gws_base;
+       uint32_t                gws_size;
+       uint32_t                oa_base;
+       uint32_t                oa_size;
  };
  
  struct amdgpu_vm_manager {
@@@ -917,8 -965,11 +924,11 @@@ int amdgpu_vm_grab_id(struct amdgpu_vm 
                      struct amdgpu_sync *sync, struct fence *fence,
                      unsigned *vm_id, uint64_t *vm_pd_addr);
  void amdgpu_vm_flush(struct amdgpu_ring *ring,
-                    unsigned vmid,
-                    uint64_t pd_addr);
+                    unsigned vm_id, uint64_t pd_addr,
+                    uint32_t gds_base, uint32_t gds_size,
+                    uint32_t gws_base, uint32_t gws_size,
+                    uint32_t oa_base, uint32_t oa_size);
+ void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id);
  uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr);
  int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
                                    struct amdgpu_vm *vm);
@@@ -1006,7 -1057,7 +1016,7 @@@ struct amdgpu_bo_list 
        struct amdgpu_bo *gds_obj;
        struct amdgpu_bo *gws_obj;
        struct amdgpu_bo *oa_obj;
-       bool has_userptr;
+       unsigned first_userptr;
        unsigned num_entries;
        struct amdgpu_bo_list_entry *array;
  };
@@@ -1135,8 -1186,7 +1145,7 @@@ int amdgpu_ib_get(struct amdgpu_device 
                  unsigned size, struct amdgpu_ib *ib);
  void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib);
  int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
-                      struct amdgpu_ib *ib, void *owner,
-                      struct fence *last_vm_update,
+                      struct amdgpu_ib *ib, struct fence *last_vm_update,
                       struct fence **f);
  int amdgpu_ib_pool_init(struct amdgpu_device *adev);
  void amdgpu_ib_pool_fini(struct amdgpu_device *adev);
@@@ -2012,7 -2062,6 +2021,6 @@@ struct amdgpu_device 
        struct amdgpu_sdma              sdma;
  
        /* uvd */
-       bool                            has_uvd;
        struct amdgpu_uvd               uvd;
  
        /* vce */
@@@ -2186,10 -2235,12 +2194,12 @@@ amdgpu_get_sdma_instance(struct amdgpu_
  #define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
  #define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
  #define amdgpu_ring_emit_ib(r, ib) (r)->funcs->emit_ib((r), (ib))
+ #define amdgpu_ring_emit_pipeline_sync(r) (r)->funcs->emit_pipeline_sync((r))
  #define amdgpu_ring_emit_vm_flush(r, vmid, addr) (r)->funcs->emit_vm_flush((r), (vmid), (addr))
  #define amdgpu_ring_emit_fence(r, addr, seq, flags) (r)->funcs->emit_fence((r), (addr), (seq), (flags))
  #define amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), (as))
  #define amdgpu_ring_emit_hdp_flush(r) (r)->funcs->emit_hdp_flush((r))
+ #define amdgpu_ring_emit_hdp_invalidate(r) (r)->funcs->emit_hdp_invalidate((r))
  #define amdgpu_ring_pad_ib(r, ib) ((r)->funcs->pad_ib((r), (ib)))
  #define amdgpu_ih_get_wptr(adev) (adev)->irq.ih_funcs->get_wptr((adev))
  #define amdgpu_ih_decode_iv(adev, iv) (adev)->irq.ih_funcs->decode_iv((adev), (iv))
@@@ -2314,12 -2365,14 +2324,15 @@@ int amdgpu_cs_get_ring(struct amdgpu_de
                       struct amdgpu_ring **out_ring);
  void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *rbo, u32 domain);
  bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object *bo);
+ int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages);
  int amdgpu_ttm_tt_set_userptr(struct ttm_tt *ttm, uint64_t addr,
                                     uint32_t flags);
 +bool amdgpu_ttm_tt_has_userptr(struct ttm_tt *ttm);
  struct mm_struct *amdgpu_ttm_tt_get_usermm(struct ttm_tt *ttm);
  bool amdgpu_ttm_tt_affect_userptr(struct ttm_tt *ttm, unsigned long start,
                                  unsigned long end);
+ bool amdgpu_ttm_tt_userptr_invalidated(struct ttm_tt *ttm,
+                                      int *last_invalidated);
  bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm);
  uint32_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,
                                 struct ttm_mem_reg *mem);
@@@ -62,6 -62,12 +62,12 @@@ static const char *amdgpu_asic_name[] 
        "LAST",
  };
  
+ #if defined(CONFIG_VGA_SWITCHEROO)
+ bool amdgpu_has_atpx_dgpu_power_cntl(void);
+ #else
+ static inline bool amdgpu_has_atpx_dgpu_power_cntl(void) { return false; }
+ #endif
  bool amdgpu_device_is_px(struct drm_device *dev)
  {
        struct amdgpu_device *adev = dev->dev_private;
@@@ -1479,7 -1485,7 +1485,7 @@@ int amdgpu_device_init(struct amdgpu_de
  
        if (amdgpu_runtime_pm == 1)
                runtime = true;
-       if (amdgpu_device_is_px(ddev))
+       if (amdgpu_device_is_px(ddev) && amdgpu_has_atpx_dgpu_power_cntl())
                runtime = true;
        vga_switcheroo_register_client(adev->pdev, &amdgpu_switcheroo_ops, runtime);
        if (runtime)
@@@ -1762,20 -1768,15 +1768,20 @@@ int amdgpu_resume_kms(struct drm_devic
        }
  
        /* post card */
 -      amdgpu_atom_asic_init(adev->mode_info.atom_context);
 +      if (!amdgpu_card_posted(adev))
 +              amdgpu_atom_asic_init(adev->mode_info.atom_context);
  
        r = amdgpu_resume(adev);
 +      if (r)
 +              DRM_ERROR("amdgpu_resume failed (%d).\n", r);
  
        amdgpu_fence_driver_resume(adev);
  
 -      r = amdgpu_ib_ring_tests(adev);
 -      if (r)
 -              DRM_ERROR("ib ring test failed (%d).\n", r);
 +      if (resume) {
 +              r = amdgpu_ib_ring_tests(adev);
 +              if (r)
 +                      DRM_ERROR("ib ring test failed (%d).\n", r);
 +      }
  
        r = amdgpu_late_init(adev);
        if (r)
@@@ -1908,97 -1909,80 +1914,97 @@@ retry
        return r;
  }
  
 +#define AMDGPU_DEFAULT_PCIE_GEN_MASK 0x30007  /* gen: chipset 1/2, asic 1/2/3 */
 +#define AMDGPU_DEFAULT_PCIE_MLW_MASK 0x2f0000 /* 1/2/4/8/16 lanes */
 +
  void amdgpu_get_pcie_info(struct amdgpu_device *adev)
  {
        u32 mask;
        int ret;
  
 -      if (pci_is_root_bus(adev->pdev->bus))
 -              return;
 +      if (amdgpu_pcie_gen_cap)
 +              adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap;
  
 -      if (amdgpu_pcie_gen2 == 0)
 -              return;
 +      if (amdgpu_pcie_lane_cap)
 +              adev->pm.pcie_mlw_mask = amdgpu_pcie_lane_cap;
  
 -      if (adev->flags & AMD_IS_APU)
 +      /* covers APUs as well */
 +      if (pci_is_root_bus(adev->pdev->bus)) {
 +              if (adev->pm.pcie_gen_mask == 0)
 +                      adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
 +              if (adev->pm.pcie_mlw_mask == 0)
 +                      adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
                return;
 +      }
  
 -      ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
 -      if (!ret) {
 -              adev->pm.pcie_gen_mask = (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
 -                                        CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
 -                                        CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
 -
 -              if (mask & DRM_PCIE_SPEED_25)
 -                      adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1;
 -              if (mask & DRM_PCIE_SPEED_50)
 -                      adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2;
 -              if (mask & DRM_PCIE_SPEED_80)
 -                      adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3;
 -      }
 -      ret = drm_pcie_get_max_link_width(adev->ddev, &mask);
 -      if (!ret) {
 -              switch (mask) {
 -              case 32:
 -                      adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
 -                      break;
 -              case 16:
 -                      adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
 -                      break;
 -              case 12:
 -                      adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
 -                      break;
 -              case 8:
 -                      adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
 -                      break;
 -              case 4:
 -                      adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
 -                      break;
 -              case 2:
 -                      adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
 -                                                CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
 -                      break;
 -              case 1:
 -                      adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
 -                      break;
 -              default:
 -                      break;
 +      if (adev->pm.pcie_gen_mask == 0) {
 +              ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
 +              if (!ret) {
 +                      adev->pm.pcie_gen_mask = (CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1 |
 +                                                CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN2 |
 +                                                CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN3);
 +
 +                      if (mask & DRM_PCIE_SPEED_25)
 +                              adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1;
 +                      if (mask & DRM_PCIE_SPEED_50)
 +                              adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2;
 +                      if (mask & DRM_PCIE_SPEED_80)
 +                              adev->pm.pcie_gen_mask |= CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3;
 +              } else {
 +                      adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;
 +              }
 +      }
 +      if (adev->pm.pcie_mlw_mask == 0) {
 +              ret = drm_pcie_get_max_link_width(adev->ddev, &mask);
 +              if (!ret) {
 +                      switch (mask) {
 +                      case 32:
 +                              adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
 +                              break;
 +                      case 16:
 +                              adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
 +                              break;
 +                      case 12:
 +                              adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
 +                              break;
 +                      case 8:
 +                              adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
 +                              break;
 +                      case 4:
 +                              adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
 +                              break;
 +                      case 2:
 +                              adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 |
 +                                                        CAIL_PCIE_LINK_WIDTH_SUPPORT_X1);
 +                              break;
 +                      case 1:
 +                              adev->pm.pcie_mlw_mask = CAIL_PCIE_LINK_WIDTH_SUPPORT_X1;
 +                              break;
 +                      default:
 +                              break;
 +                      }
 +              } else {
 +                      adev->pm.pcie_mlw_mask = AMDGPU_DEFAULT_PCIE_MLW_MASK;
                }
        }
  }
@@@ -80,8 -80,6 +80,8 @@@ int amdgpu_exp_hw_support = 0
  int amdgpu_sched_jobs = 32;
  int amdgpu_sched_hw_submission = 2;
  int amdgpu_powerplay = -1;
 +unsigned amdgpu_pcie_gen_cap = 0;
 +unsigned amdgpu_pcie_lane_cap = 0;
  
  MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes");
  module_param_named(vramlimit, amdgpu_vram_limit, int, 0600);
@@@ -160,12 -158,6 +160,12 @@@ MODULE_PARM_DESC(powerplay, "Powerplay 
  module_param_named(powerplay, amdgpu_powerplay, int, 0444);
  #endif
  
 +MODULE_PARM_DESC(pcie_gen_cap, "PCIE Gen Caps (0: autodetect (default))");
 +module_param_named(pcie_gen_cap, amdgpu_pcie_gen_cap, uint, 0444);
 +
 +MODULE_PARM_DESC(pcie_lane_cap, "PCIE Lane Caps (0: autodetect (default))");
 +module_param_named(pcie_lane_cap, amdgpu_pcie_lane_cap, uint, 0444);
 +
  static struct pci_device_id pciidlist[] = {
  #ifdef CONFIG_DRM_AMDGPU_CIK
        /* Kaveri */
@@@ -318,14 -310,6 +318,14 @@@ static int amdgpu_pci_probe(struct pci_
                return -ENODEV;
        }
  
 +      /*
 +       * Initialize amdkfd before starting radeon. If it was not loaded yet,
 +       * defer radeon probing
 +       */
 +      ret = amdgpu_amdkfd_init();
 +      if (ret == -EPROBE_DEFER)
 +              return ret;
 +
        /* Get rid of things like offb */
        ret = amdgpu_kick_out_firmware_fb(pdev);
        if (ret)
@@@ -555,6 -539,7 +555,7 @@@ static struct pci_driver amdgpu_kms_pci
  
  static int __init amdgpu_init(void)
  {
+       amdgpu_sync_init();
  #ifdef CONFIG_VGA_CONSOLE
        if (vgacon_text_force()) {
                DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n");
        driver->num_ioctls = amdgpu_max_kms_ioctl;
        amdgpu_register_atpx_handler();
  
 -      amdgpu_amdkfd_init();
 -
        /* let modprobe override vga console setting */
        return drm_pci_init(driver, pdriver);
  }
@@@ -577,6 -564,7 +578,7 @@@ static void __exit amdgpu_exit(void
        amdgpu_amdkfd_fini();
        drm_pci_exit(driver, pdriver);
        amdgpu_unregister_atpx_handler();
+       amdgpu_sync_fini();
  }
  
  module_init(amdgpu_init);
@@@ -140,25 -140,40 +140,40 @@@ int amdgpu_gem_object_open(struct drm_g
  void amdgpu_gem_object_close(struct drm_gem_object *obj,
                             struct drm_file *file_priv)
  {
-       struct amdgpu_bo *rbo = gem_to_amdgpu_bo(obj);
-       struct amdgpu_device *adev = rbo->adev;
+       struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
+       struct amdgpu_device *adev = bo->adev;
        struct amdgpu_fpriv *fpriv = file_priv->driver_priv;
        struct amdgpu_vm *vm = &fpriv->vm;
+       struct amdgpu_bo_list_entry vm_pd;
+       struct list_head list, duplicates;
+       struct ttm_validate_buffer tv;
+       struct ww_acquire_ctx ticket;
        struct amdgpu_bo_va *bo_va;
        int r;
-       r = amdgpu_bo_reserve(rbo, true);
+       INIT_LIST_HEAD(&list);
+       INIT_LIST_HEAD(&duplicates);
+       tv.bo = &bo->tbo;
+       tv.shared = true;
+       list_add(&tv.head, &list);
+       amdgpu_vm_get_pd_bo(vm, &list, &vm_pd);
+       r = ttm_eu_reserve_buffers(&ticket, &list, true, &duplicates);
        if (r) {
                dev_err(adev->dev, "leaking bo va because "
                        "we fail to reserve bo (%d)\n", r);
                return;
        }
-       bo_va = amdgpu_vm_bo_find(vm, rbo);
+       bo_va = amdgpu_vm_bo_find(vm, bo);
        if (bo_va) {
                if (--bo_va->ref_count == 0) {
                        amdgpu_vm_bo_rmv(adev, bo_va);
                }
        }
-       amdgpu_bo_unreserve(rbo);
+       ttm_eu_backoff_reservation(&ticket, &list);
  }
  
  static int amdgpu_gem_handle_lockup(struct amdgpu_device *adev, int r)
@@@ -274,18 -289,23 +289,23 @@@ int amdgpu_gem_userptr_ioctl(struct drm
  
        if (args->flags & AMDGPU_GEM_USERPTR_VALIDATE) {
                down_read(&current->mm->mmap_sem);
+               r = amdgpu_ttm_tt_get_user_pages(bo->tbo.ttm,
+                                                bo->tbo.ttm->pages);
+               if (r)
+                       goto unlock_mmap_sem;
                r = amdgpu_bo_reserve(bo, true);
-               if (r) {
-                       up_read(&current->mm->mmap_sem);
-                       goto release_object;
-               }
+               if (r)
+                       goto free_pages;
  
                amdgpu_ttm_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_GTT);
                r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false);
                amdgpu_bo_unreserve(bo);
-               up_read(&current->mm->mmap_sem);
                if (r)
-                       goto release_object;
+                       goto free_pages;
+               up_read(&current->mm->mmap_sem);
        }
  
        r = drm_gem_handle_create(filp, gobj, &handle);
        args->handle = handle;
        return 0;
  
+ free_pages:
+       release_pages(bo->tbo.ttm->pages, bo->tbo.ttm->num_pages, false);
+ unlock_mmap_sem:
+       up_read(&current->mm->mmap_sem);
  release_object:
        drm_gem_object_unreference_unlocked(gobj);
  
@@@ -569,11 -595,10 +595,10 @@@ int amdgpu_gem_va_ioctl(struct drm_devi
        tv.shared = true;
        list_add(&tv.head, &list);
  
-       if (args->operation == AMDGPU_VA_OP_MAP) {
-               tv_pd.bo = &fpriv->vm.page_directory->tbo;
-               tv_pd.shared = true;
-               list_add(&tv_pd.head, &list);
-       }
+       tv_pd.bo = &fpriv->vm.page_directory->tbo;
+       tv_pd.shared = true;
+       list_add(&tv_pd.head, &list);
        r = ttm_eu_reserve_buffers(&ticket, &list, true, &duplicates);
        if (r) {
                drm_gem_object_unreference_unlocked(gobj);
                break;
        }
        ttm_eu_backoff_reservation(&ticket, &list);
 -      if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE))
 +      if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE) &&
 +          !amdgpu_vm_debug)
                amdgpu_gem_va_update_vm(adev, bo_va, args->operation);
  
        drm_gem_object_unreference_unlocked(gobj);
@@@ -494,29 -494,32 +494,32 @@@ static void amdgpu_ttm_io_mem_free(stru
  /*
   * TTM backend functions.
   */
+ struct amdgpu_ttm_gup_task_list {
+       struct list_head        list;
+       struct task_struct      *task;
+ };
  struct amdgpu_ttm_tt {
-       struct ttm_dma_tt               ttm;
-       struct amdgpu_device            *adev;
-       u64                             offset;
-       uint64_t                        userptr;
-       struct mm_struct                *usermm;
-       uint32_t                        userflags;
+       struct ttm_dma_tt       ttm;
+       struct amdgpu_device    *adev;
+       u64                     offset;
+       uint64_t                userptr;
+       struct mm_struct        *usermm;
+       uint32_t                userflags;
+       spinlock_t              guptasklock;
+       struct list_head        guptasks;
+       atomic_t                mmu_invalidations;
  };
  
- /* prepare the sg table with the user pages */
- static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm)
+ int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages)
  {
-       struct amdgpu_device *adev = amdgpu_get_adev(ttm->bdev);
        struct amdgpu_ttm_tt *gtt = (void *)ttm;
-       unsigned pinned = 0, nents;
-       int r;
        int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY);
-       enum dma_data_direction direction = write ?
-               DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
+       unsigned pinned = 0;
+       int r;
  
        if (gtt->userflags & AMDGPU_GEM_USERPTR_ANONONLY) {
-               /* check that we only pin down anonymous memory
+               /* check that we only use anonymous memory
                   to prevent problems with writeback */
                unsigned long end = gtt->userptr + ttm->num_pages * PAGE_SIZE;
                struct vm_area_struct *vma;
        do {
                unsigned num_pages = ttm->num_pages - pinned;
                uint64_t userptr = gtt->userptr + pinned * PAGE_SIZE;
-               struct page **pages = ttm->pages + pinned;
+               struct page **p = pages + pinned;
+               struct amdgpu_ttm_gup_task_list guptask;
+               guptask.task = current;
+               spin_lock(&gtt->guptasklock);
+               list_add(&guptask.list, &gtt->guptasks);
+               spin_unlock(&gtt->guptasklock);
  
                r = get_user_pages(current, current->mm, userptr, num_pages,
-                                  write, 0, pages, NULL);
+                                  write, 0, p, NULL);
+               spin_lock(&gtt->guptasklock);
+               list_del(&guptask.list);
+               spin_unlock(&gtt->guptasklock);
                if (r < 0)
                        goto release_pages;
  
  
        } while (pinned < ttm->num_pages);
  
+       return 0;
+ release_pages:
+       release_pages(pages, pinned, 0);
+       return r;
+ }
+ /* prepare the sg table with the user pages */
+ static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm)
+ {
+       struct amdgpu_device *adev = amdgpu_get_adev(ttm->bdev);
+       struct amdgpu_ttm_tt *gtt = (void *)ttm;
+       unsigned nents;
+       int r;
+       int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY);
+       enum dma_data_direction direction = write ?
+               DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
        r = sg_alloc_table_from_pages(ttm->sg, ttm->pages, ttm->num_pages, 0,
                                      ttm->num_pages << PAGE_SHIFT,
                                      GFP_KERNEL);
  
  release_sg:
        kfree(ttm->sg);
- release_pages:
-       release_pages(ttm->pages, pinned, 0);
        return r;
  }
  
@@@ -725,7 -755,7 +755,7 @@@ static int amdgpu_ttm_tt_populate(struc
                                                       0, PAGE_SIZE,
                                                       PCI_DMA_BIDIRECTIONAL);
                if (pci_dma_mapping_error(adev->pdev, gtt->ttm.dma_address[i])) {
 -                      while (--i) {
 +                      while (i--) {
                                pci_unmap_page(adev->pdev, gtt->ttm.dma_address[i],
                                               PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
                                gtt->ttm.dma_address[i] = 0;
@@@ -783,6 -813,10 +813,10 @@@ int amdgpu_ttm_tt_set_userptr(struct tt
        gtt->userptr = addr;
        gtt->usermm = current->mm;
        gtt->userflags = flags;
+       spin_lock_init(&gtt->guptasklock);
+       INIT_LIST_HEAD(&gtt->guptasks);
+       atomic_set(&gtt->mmu_invalidations, 0);
        return 0;
  }
  
@@@ -800,21 -834,40 +834,40 @@@ bool amdgpu_ttm_tt_affect_userptr(struc
                                  unsigned long end)
  {
        struct amdgpu_ttm_tt *gtt = (void *)ttm;
+       struct amdgpu_ttm_gup_task_list *entry;
        unsigned long size;
  
-       if (gtt == NULL)
-               return false;
-       if (gtt->ttm.ttm.state != tt_bound || !gtt->userptr)
+       if (gtt == NULL || !gtt->userptr)
                return false;
  
        size = (unsigned long)gtt->ttm.ttm.num_pages * PAGE_SIZE;
        if (gtt->userptr > end || gtt->userptr + size <= start)
                return false;
  
+       spin_lock(&gtt->guptasklock);
+       list_for_each_entry(entry, &gtt->guptasks, list) {
+               if (entry->task == current) {
+                       spin_unlock(&gtt->guptasklock);
+                       return false;
+               }
+       }
+       spin_unlock(&gtt->guptasklock);
+       atomic_inc(&gtt->mmu_invalidations);
        return true;
  }
  
+ bool amdgpu_ttm_tt_userptr_invalidated(struct ttm_tt *ttm,
+                                      int *last_invalidated)
+ {
+       struct amdgpu_ttm_tt *gtt = (void *)ttm;
+       int prev_invalidated = *last_invalidated;
+       *last_invalidated = atomic_read(&gtt->mmu_invalidations);
+       return prev_invalidated != *last_invalidated;
+ }
  bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm)
  {
        struct amdgpu_ttm_tt *gtt = (void *)ttm;
@@@ -31,7 -31,6 +31,7 @@@
  #include "ci_dpm.h"
  #include "gfx_v7_0.h"
  #include "atom.h"
 +#include "amd_pcie.h"
  #include <linux/seq_file.h>
  
  #include "smu/smu_7_0_1_d.h"
@@@ -3017,7 -3016,6 +3017,6 @@@ static int ci_populate_single_memory_le
                                                      &memory_level->MinVddcPhases);
  
        memory_level->EnabledForThrottle = 1;
-       memory_level->EnabledForActivity = 1;
        memory_level->UpH = 0;
        memory_level->DownH = 100;
        memory_level->VoltageDownH = 0;
@@@ -3376,7 -3374,6 +3375,6 @@@ static int ci_populate_single_graphic_l
        graphic_level->SpllSpreadSpectrum2 = cpu_to_be32(graphic_level->SpllSpreadSpectrum2);
        graphic_level->CcPwrDynRm = cpu_to_be32(graphic_level->CcPwrDynRm);
        graphic_level->CcPwrDynRm1 = cpu_to_be32(graphic_level->CcPwrDynRm1);
-       graphic_level->EnabledForActivity = 1;
  
        return 0;
  }
@@@ -3407,6 -3404,7 +3405,7 @@@ static int ci_populate_all_graphic_leve
                        pi->smc_state_table.GraphicsLevel[i].DisplayWatermark =
                                PPSMC_DISPLAY_WATERMARK_HIGH;
        }
+       pi->smc_state_table.GraphicsLevel[0].EnabledForActivity = 1;
  
        pi->smc_state_table.GraphicsDpmLevelCount = (u8)dpm_table->sclk_table.count;
        pi->dpm_level_enable_mask.sclk_dpm_enable_mask =
@@@ -3450,6 -3448,8 +3449,8 @@@ static int ci_populate_all_memory_level
                        return ret;
        }
  
+       pi->smc_state_table.MemoryLevel[0].EnabledForActivity = 1;
        if ((dpm_table->mclk_table.count >= 2) &&
            ((adev->pdev->device == 0x67B0) || (adev->pdev->device == 0x67B1))) {
                pi->smc_state_table.MemoryLevel[1].MinVddc =
@@@ -4381,26 -4381,6 +4382,6 @@@ static int ci_dpm_force_performance_lev
                                }
                        }
                }
-               if ((!pi->pcie_dpm_key_disabled) &&
-                   pi->dpm_level_enable_mask.pcie_dpm_enable_mask) {
-                       levels = 0;
-                       tmp = pi->dpm_level_enable_mask.pcie_dpm_enable_mask;
-                       while (tmp >>= 1)
-                               levels++;
-                       if (levels) {
-                               ret = ci_dpm_force_state_pcie(adev, level);
-                               if (ret)
-                                       return ret;
-                               for (i = 0; i < adev->usec_timeout; i++) {
-                                       tmp = (RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX_1) &
-                                       TARGET_AND_CURRENT_PROFILE_INDEX_1__CURR_PCIE_INDEX_MASK) >>
-                                       TARGET_AND_CURRENT_PROFILE_INDEX_1__CURR_PCIE_INDEX__SHIFT;
-                                       if (tmp == levels)
-                                               break;
-                                       udelay(1);
-                               }
-                       }
-               }
        } else if (level == AMDGPU_DPM_FORCED_LEVEL_LOW) {
                if ((!pi->sclk_dpm_key_disabled) &&
                    pi->dpm_level_enable_mask.sclk_dpm_enable_mask) {
@@@ -5395,30 -5375,6 +5376,6 @@@ static int ci_dpm_enable(struct amdgpu_
  
        ci_update_current_ps(adev, boot_ps);
  
-       if (adev->irq.installed &&
-           amdgpu_is_internal_thermal_sensor(adev->pm.int_thermal_type)) {
- #if 0
-               PPSMC_Result result;
- #endif
-               ret = ci_thermal_set_temperature_range(adev, CISLANDS_TEMP_RANGE_MIN,
-                                                      CISLANDS_TEMP_RANGE_MAX);
-               if (ret) {
-                       DRM_ERROR("ci_thermal_set_temperature_range failed\n");
-                       return ret;
-               }
-               amdgpu_irq_get(adev, &adev->pm.dpm.thermal.irq,
-                              AMDGPU_THERMAL_IRQ_LOW_TO_HIGH);
-               amdgpu_irq_get(adev, &adev->pm.dpm.thermal.irq,
-                              AMDGPU_THERMAL_IRQ_HIGH_TO_LOW);
- #if 0
-               result = amdgpu_ci_send_msg_to_smc(adev, PPSMC_MSG_EnableThermalInterrupt);
-               if (result != PPSMC_Result_OK)
-                       DRM_DEBUG_KMS("Could not enable thermal interrupts.\n");
- #endif
-       }
        return 0;
  }
  
@@@ -5836,16 -5792,18 +5793,16 @@@ static int ci_dpm_init(struct amdgpu_de
        u8 frev, crev;
        struct ci_power_info *pi;
        int ret;
 -      u32 mask;
  
        pi = kzalloc(sizeof(struct ci_power_info), GFP_KERNEL);
        if (pi == NULL)
                return -ENOMEM;
        adev->pm.dpm.priv = pi;
  
 -      ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
 -      if (ret)
 -              pi->sys_pcie_mask = 0;
 -      else
 -              pi->sys_pcie_mask = mask;
 +      pi->sys_pcie_mask =
 +              (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_MASK) >>
 +              CAIL_PCIE_LINK_SPEED_SUPPORT_SHIFT;
 +
        pi->force_pcie_gen = AMDGPU_PCIE_GEN_INVALID;
  
        pi->pcie_gen_performance.max = AMDGPU_PCIE_GEN1;
@@@ -1462,9 -1462,6 +1462,9 @@@ static void cik_program_aspm(struct amd
        if (amdgpu_aspm == 0)
                return;
  
 +      if (pci_is_root_bus(adev->pdev->bus))
 +              return;
 +
        /* XXX double check APUs */
        if (adev->flags & AMD_IS_APU)
                return;
@@@ -2028,79 -2025,77 +2028,77 @@@ static int cik_common_early_init(void *
  
        adev->asic_funcs = &cik_asic_funcs;
  
-       adev->has_uvd = true;
        adev->rev_id = cik_get_rev_id(adev);
        adev->external_rev_id = 0xFF;
        switch (adev->asic_type) {
        case CHIP_BONAIRE:
                adev->cg_flags =
 -                      AMDGPU_CG_SUPPORT_GFX_MGCG |
 -                      AMDGPU_CG_SUPPORT_GFX_MGLS |
 -                      /*AMDGPU_CG_SUPPORT_GFX_CGCG |*/
 -                      AMDGPU_CG_SUPPORT_GFX_CGLS |
 -                      AMDGPU_CG_SUPPORT_GFX_CGTS |
 -                      AMDGPU_CG_SUPPORT_GFX_CGTS_LS |
 -                      AMDGPU_CG_SUPPORT_GFX_CP_LS |
 -                      AMDGPU_CG_SUPPORT_MC_LS |
 -                      AMDGPU_CG_SUPPORT_MC_MGCG |
 -                      AMDGPU_CG_SUPPORT_SDMA_MGCG |
 -                      AMDGPU_CG_SUPPORT_SDMA_LS |
 -                      AMDGPU_CG_SUPPORT_BIF_LS |
 -                      AMDGPU_CG_SUPPORT_VCE_MGCG |
 -                      AMDGPU_CG_SUPPORT_UVD_MGCG |
 -                      AMDGPU_CG_SUPPORT_HDP_LS |
 -                      AMDGPU_CG_SUPPORT_HDP_MGCG;
 +                      AMD_CG_SUPPORT_GFX_MGCG |
 +                      AMD_CG_SUPPORT_GFX_MGLS |
 +                      /*AMD_CG_SUPPORT_GFX_CGCG |*/
 +                      AMD_CG_SUPPORT_GFX_CGLS |
 +                      AMD_CG_SUPPORT_GFX_CGTS |
 +                      AMD_CG_SUPPORT_GFX_CGTS_LS |
 +                      AMD_CG_SUPPORT_GFX_CP_LS |
 +                      AMD_CG_SUPPORT_MC_LS |
 +                      AMD_CG_SUPPORT_MC_MGCG |
 +                      AMD_CG_SUPPORT_SDMA_MGCG |
 +                      AMD_CG_SUPPORT_SDMA_LS |
 +                      AMD_CG_SUPPORT_BIF_LS |
 +                      AMD_CG_SUPPORT_VCE_MGCG |
 +                      AMD_CG_SUPPORT_UVD_MGCG |
 +                      AMD_CG_SUPPORT_HDP_LS |
 +                      AMD_CG_SUPPORT_HDP_MGCG;
                adev->pg_flags = 0;
                adev->external_rev_id = adev->rev_id + 0x14;
                break;
        case CHIP_HAWAII:
                adev->cg_flags =
 -                      AMDGPU_CG_SUPPORT_GFX_MGCG |
 -                      AMDGPU_CG_SUPPORT_GFX_MGLS |
 -                      /*AMDGPU_CG_SUPPORT_GFX_CGCG |*/
 -                      AMDGPU_CG_SUPPORT_GFX_CGLS |
 -                      AMDGPU_CG_SUPPORT_GFX_CGTS |
 -                      AMDGPU_CG_SUPPORT_GFX_CP_LS |
 -                      AMDGPU_CG_SUPPORT_MC_LS |
 -                      AMDGPU_CG_SUPPORT_MC_MGCG |
 -                      AMDGPU_CG_SUPPORT_SDMA_MGCG |
 -                      AMDGPU_CG_SUPPORT_SDMA_LS |
 -                      AMDGPU_CG_SUPPORT_BIF_LS |
 -                      AMDGPU_CG_SUPPORT_VCE_MGCG |
 -                      AMDGPU_CG_SUPPORT_UVD_MGCG |
 -                      AMDGPU_CG_SUPPORT_HDP_LS |
 -                      AMDGPU_CG_SUPPORT_HDP_MGCG;
 +                      AMD_CG_SUPPORT_GFX_MGCG |
 +                      AMD_CG_SUPPORT_GFX_MGLS |
 +                      /*AMD_CG_SUPPORT_GFX_CGCG |*/
 +                      AMD_CG_SUPPORT_GFX_CGLS |
 +                      AMD_CG_SUPPORT_GFX_CGTS |
 +                      AMD_CG_SUPPORT_GFX_CP_LS |
 +                      AMD_CG_SUPPORT_MC_LS |
 +                      AMD_CG_SUPPORT_MC_MGCG |
 +                      AMD_CG_SUPPORT_SDMA_MGCG |
 +                      AMD_CG_SUPPORT_SDMA_LS |
 +                      AMD_CG_SUPPORT_BIF_LS |
 +                      AMD_CG_SUPPORT_VCE_MGCG |
 +                      AMD_CG_SUPPORT_UVD_MGCG |
 +                      AMD_CG_SUPPORT_HDP_LS |
 +                      AMD_CG_SUPPORT_HDP_MGCG;
                adev->pg_flags = 0;
                adev->external_rev_id = 0x28;
                break;
        case CHIP_KAVERI:
                adev->cg_flags =
 -                      AMDGPU_CG_SUPPORT_GFX_MGCG |
 -                      AMDGPU_CG_SUPPORT_GFX_MGLS |
 -                      /*AMDGPU_CG_SUPPORT_GFX_CGCG |*/
 -                      AMDGPU_CG_SUPPORT_GFX_CGLS |
 -                      AMDGPU_CG_SUPPORT_GFX_CGTS |
 -                      AMDGPU_CG_SUPPORT_GFX_CGTS_LS |
 -                      AMDGPU_CG_SUPPORT_GFX_CP_LS |
 -                      AMDGPU_CG_SUPPORT_SDMA_MGCG |
 -                      AMDGPU_CG_SUPPORT_SDMA_LS |
 -                      AMDGPU_CG_SUPPORT_BIF_LS |
 -                      AMDGPU_CG_SUPPORT_VCE_MGCG |
 -                      AMDGPU_CG_SUPPORT_UVD_MGCG |
 -                      AMDGPU_CG_SUPPORT_HDP_LS |
 -                      AMDGPU_CG_SUPPORT_HDP_MGCG;
 +                      AMD_CG_SUPPORT_GFX_MGCG |
 +                      AMD_CG_SUPPORT_GFX_MGLS |
 +                      /*AMD_CG_SUPPORT_GFX_CGCG |*/
 +                      AMD_CG_SUPPORT_GFX_CGLS |
 +                      AMD_CG_SUPPORT_GFX_CGTS |
 +                      AMD_CG_SUPPORT_GFX_CGTS_LS |
 +                      AMD_CG_SUPPORT_GFX_CP_LS |
 +                      AMD_CG_SUPPORT_SDMA_MGCG |
 +                      AMD_CG_SUPPORT_SDMA_LS |
 +                      AMD_CG_SUPPORT_BIF_LS |
 +                      AMD_CG_SUPPORT_VCE_MGCG |
 +                      AMD_CG_SUPPORT_UVD_MGCG |
 +                      AMD_CG_SUPPORT_HDP_LS |
 +                      AMD_CG_SUPPORT_HDP_MGCG;
                adev->pg_flags =
 -                      /*AMDGPU_PG_SUPPORT_GFX_PG |
 -                        AMDGPU_PG_SUPPORT_GFX_SMG |
 -                        AMDGPU_PG_SUPPORT_GFX_DMG |*/
 -                      AMDGPU_PG_SUPPORT_UVD |
 -                      /*AMDGPU_PG_SUPPORT_VCE |
 -                        AMDGPU_PG_SUPPORT_CP |
 -                        AMDGPU_PG_SUPPORT_GDS |
 -                        AMDGPU_PG_SUPPORT_RLC_SMU_HS |
 -                        AMDGPU_PG_SUPPORT_ACP |
 -                        AMDGPU_PG_SUPPORT_SAMU |*/
 +                      /*AMD_PG_SUPPORT_GFX_PG |
 +                        AMD_PG_SUPPORT_GFX_SMG |
 +                        AMD_PG_SUPPORT_GFX_DMG |*/
 +                      AMD_PG_SUPPORT_UVD |
 +                      /*AMD_PG_SUPPORT_VCE |
 +                        AMD_PG_SUPPORT_CP |
 +                        AMD_PG_SUPPORT_GDS |
 +                        AMD_PG_SUPPORT_RLC_SMU_HS |
 +                        AMD_PG_SUPPORT_ACP |
 +                        AMD_PG_SUPPORT_SAMU |*/
                        0;
                if (adev->pdev->device == 0x1312 ||
                        adev->pdev->device == 0x1316 ||
        case CHIP_KABINI:
        case CHIP_MULLINS:
                adev->cg_flags =
 -                      AMDGPU_CG_SUPPORT_GFX_MGCG |
 -                      AMDGPU_CG_SUPPORT_GFX_MGLS |
 -                      /*AMDGPU_CG_SUPPORT_GFX_CGCG |*/
 -                      AMDGPU_CG_SUPPORT_GFX_CGLS |
 -                      AMDGPU_CG_SUPPORT_GFX_CGTS |
 -                      AMDGPU_CG_SUPPORT_GFX_CGTS_LS |
 -                      AMDGPU_CG_SUPPORT_GFX_CP_LS |
 -                      AMDGPU_CG_SUPPORT_SDMA_MGCG |
 -                      AMDGPU_CG_SUPPORT_SDMA_LS |
 -                      AMDGPU_CG_SUPPORT_BIF_LS |
 -                      AMDGPU_CG_SUPPORT_VCE_MGCG |
 -                      AMDGPU_CG_SUPPORT_UVD_MGCG |
 -                      AMDGPU_CG_SUPPORT_HDP_LS |
 -                      AMDGPU_CG_SUPPORT_HDP_MGCG;
 +                      AMD_CG_SUPPORT_GFX_MGCG |
 +                      AMD_CG_SUPPORT_GFX_MGLS |
 +                      /*AMD_CG_SUPPORT_GFX_CGCG |*/
 +                      AMD_CG_SUPPORT_GFX_CGLS |
 +                      AMD_CG_SUPPORT_GFX_CGTS |
 +                      AMD_CG_SUPPORT_GFX_CGTS_LS |
 +                      AMD_CG_SUPPORT_GFX_CP_LS |
 +                      AMD_CG_SUPPORT_SDMA_MGCG |
 +                      AMD_CG_SUPPORT_SDMA_LS |
 +                      AMD_CG_SUPPORT_BIF_LS |
 +                      AMD_CG_SUPPORT_VCE_MGCG |
 +                      AMD_CG_SUPPORT_UVD_MGCG |
 +                      AMD_CG_SUPPORT_HDP_LS |
 +                      AMD_CG_SUPPORT_HDP_MGCG;
                adev->pg_flags =
 -                      /*AMDGPU_PG_SUPPORT_GFX_PG |
 -                        AMDGPU_PG_SUPPORT_GFX_SMG | */
 -                      AMDGPU_PG_SUPPORT_UVD |
 -                      /*AMDGPU_PG_SUPPORT_VCE |
 -                        AMDGPU_PG_SUPPORT_CP |
 -                        AMDGPU_PG_SUPPORT_GDS |
 -                        AMDGPU_PG_SUPPORT_RLC_SMU_HS |
 -                        AMDGPU_PG_SUPPORT_SAMU |*/
 +                      /*AMD_PG_SUPPORT_GFX_PG |
 +                        AMD_PG_SUPPORT_GFX_SMG | */
 +                      AMD_PG_SUPPORT_UVD |
 +                      /*AMD_PG_SUPPORT_VCE |
 +                        AMD_PG_SUPPORT_CP |
 +                        AMD_PG_SUPPORT_GDS |
 +                        AMD_PG_SUPPORT_RLC_SMU_HS |
 +                        AMD_PG_SUPPORT_SAMU |*/
                        0;
                if (adev->asic_type == CHIP_KABINI) {
                        if (adev->rev_id == 0)
@@@ -261,6 -261,13 +261,13 @@@ static void cik_sdma_ring_emit_hdp_flus
        amdgpu_ring_write(ring, (0xfff << 16) | 10); /* retry count, poll interval */
  }
  
+ static void cik_sdma_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
+ {
+       amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
+       amdgpu_ring_write(ring, mmHDP_DEBUG0);
+       amdgpu_ring_write(ring, 1);
+ }
  /**
   * cik_sdma_ring_emit_fence - emit a fence on the DMA ring
   *
@@@ -636,8 -643,7 +643,7 @@@ static int cik_sdma_ring_test_ib(struc
        ib.ptr[3] = 1;
        ib.ptr[4] = 0xDEADBEEF;
        ib.length_dw = 5;
-       r = amdgpu_ib_schedule(ring, 1, &ib, AMDGPU_FENCE_OWNER_UNDEFINED,
-                              NULL, &f);
+       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
        if (r)
                goto err1;
  
@@@ -816,6 -822,30 +822,30 @@@ static void cik_sdma_ring_pad_ib(struc
  }
  
  /**
+  * cik_sdma_ring_emit_pipeline_sync - sync the pipeline
+  *
+  * @ring: amdgpu_ring pointer
+  *
+  * Make sure all previous operations are completed (CIK).
+  */
+ static void cik_sdma_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
+ {
+       uint32_t seq = ring->fence_drv.sync_seq;
+       uint64_t addr = ring->fence_drv.gpu_addr;
+       /* wait for idle */
+       amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_POLL_REG_MEM, 0,
+                                           SDMA_POLL_REG_MEM_EXTRA_OP(0) |
+                                           SDMA_POLL_REG_MEM_EXTRA_FUNC(3) | /* equal */
+                                           SDMA_POLL_REG_MEM_EXTRA_M));
+       amdgpu_ring_write(ring, addr & 0xfffffffc);
+       amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
+       amdgpu_ring_write(ring, seq); /* reference */
+       amdgpu_ring_write(ring, 0xfffffff); /* mask */
+       amdgpu_ring_write(ring, (0xfff << 16) | 4); /* retry count, poll interval */
+ }
+ /**
   * cik_sdma_ring_emit_vm_flush - cik vm flush using sDMA
   *
   * @ring: amdgpu_ring pointer
@@@ -856,7 -886,7 +886,7 @@@ static void cik_enable_sdma_mgcg(struc
  {
        u32 orig, data;
  
 -      if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_SDMA_MGCG)) {
 +      if (enable && (adev->cg_flags & AMD_CG_SUPPORT_SDMA_MGCG)) {
                WREG32(mmSDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, 0x00000100);
                WREG32(mmSDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, 0x00000100);
        } else {
@@@ -877,7 -907,7 +907,7 @@@ static void cik_enable_sdma_mgls(struc
  {
        u32 orig, data;
  
 -      if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_SDMA_LS)) {
 +      if (enable && (adev->cg_flags & AMD_CG_SUPPORT_SDMA_LS)) {
                orig = data = RREG32(mmSDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
                data |= 0x100;
                if (orig != data)
@@@ -1270,8 -1300,10 +1300,10 @@@ static const struct amdgpu_ring_funcs c
        .parse_cs = NULL,
        .emit_ib = cik_sdma_ring_emit_ib,
        .emit_fence = cik_sdma_ring_emit_fence,
+       .emit_pipeline_sync = cik_sdma_ring_emit_pipeline_sync,
        .emit_vm_flush = cik_sdma_ring_emit_vm_flush,
        .emit_hdp_flush = cik_sdma_ring_emit_hdp_flush,
+       .emit_hdp_invalidate = cik_sdma_ring_emit_hdp_invalidate,
        .test_ring = cik_sdma_ring_test_ring,
        .test_ib = cik_sdma_ring_test_ib,
        .insert_nop = cik_sdma_ring_insert_nop,
@@@ -1925,6 -1925,25 +1925,25 @@@ static void gfx_v7_0_ring_emit_hdp_flus
  }
  
  /**
+  * gfx_v7_0_ring_emit_hdp_invalidate - emit an hdp invalidate on the cp
+  *
+  * @adev: amdgpu_device pointer
+  * @ridx: amdgpu ring index
+  *
+  * Emits an hdp invalidate on the cp.
+  */
+ static void gfx_v7_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
+ {
+       amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
+       amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
+                                WRITE_DATA_DST_SEL(0) |
+                                WR_CONFIRM));
+       amdgpu_ring_write(ring, mmHDP_DEBUG0);
+       amdgpu_ring_write(ring, 0);
+       amdgpu_ring_write(ring, 1);
+ }
+ /**
   * gfx_v7_0_ring_emit_fence_gfx - emit a fence on the gfx ring
   *
   * @adev: amdgpu_device pointer
@@@ -2117,8 -2136,7 +2136,7 @@@ static int gfx_v7_0_ring_test_ib(struc
        ib.ptr[2] = 0xDEADBEEF;
        ib.length_dw = 3;
  
-       r = amdgpu_ib_schedule(ring, 1, &ib, AMDGPU_FENCE_OWNER_UNDEFINED,
-                              NULL, &f);
+       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
        if (r)
                goto err2;
  
@@@ -3023,6 -3041,26 +3041,26 @@@ static int gfx_v7_0_cp_resume(struct am
        return 0;
  }
  
+ /**
+  * gfx_v7_0_ring_emit_vm_flush - cik vm flush using the CP
+  *
+  * @ring: the ring to emmit the commands to
+  *
+  * Sync the command pipeline with the PFP. E.g. wait for everything
+  * to be completed.
+  */
+ static void gfx_v7_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
+ {
+       int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
+       if (usepfp) {
+               /* synce CE with ME to prevent CE fetch CEIB before context switch done */
+               amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
+               amdgpu_ring_write(ring, 0);
+               amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
+               amdgpu_ring_write(ring, 0);
+       }
+ }
  /*
   * vm
   * VMID 0 is the physical GPU addresses as used by the kernel.
@@@ -3041,27 -3079,7 +3079,19 @@@ static void gfx_v7_0_ring_emit_vm_flush
                                        unsigned vm_id, uint64_t pd_addr)
  {
        int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
 +      uint32_t seq = ring->fence_drv.sync_seq;
 +      uint64_t addr = ring->fence_drv.gpu_addr;
 +
 +      amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
 +      amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
 +                               WAIT_REG_MEM_FUNCTION(3) | /* equal */
 +                               WAIT_REG_MEM_ENGINE(usepfp)));   /* pfp or me */
 +      amdgpu_ring_write(ring, addr & 0xfffffffc);
 +      amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
 +      amdgpu_ring_write(ring, seq);
 +      amdgpu_ring_write(ring, 0xffffffff);
 +      amdgpu_ring_write(ring, 4); /* poll interval */
  
-       if (usepfp) {
-               /* synce CE with ME to prevent CE fetch CEIB before context switch done */
-               amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
-               amdgpu_ring_write(ring, 0);
-               amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
-               amdgpu_ring_write(ring, 0);
-       }
        amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
        amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
                                 WRITE_DATA_DST_SEL(0)));
@@@ -3535,7 -3553,7 +3565,7 @@@ static void gfx_v7_0_enable_cgcg(struc
  
        orig = data = RREG32(mmRLC_CGCG_CGLS_CTRL);
  
 -      if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_CGCG)) {
 +      if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {
                gfx_v7_0_enable_gui_idle_interrupt(adev, true);
  
                tmp = gfx_v7_0_halt_rlc(adev);
@@@ -3573,9 -3591,9 +3603,9 @@@ static void gfx_v7_0_enable_mgcg(struc
  {
        u32 data, orig, tmp = 0;
  
 -      if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_MGCG)) {
 -              if (adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_MGLS) {
 -                      if (adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_CP_LS) {
 +      if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) {
 +              if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) {
 +                      if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) {
                                orig = data = RREG32(mmCP_MEM_SLP_CNTL);
                                data |= CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK;
                                if (orig != data)
  
                gfx_v7_0_update_rlc(adev, tmp);
  
 -              if (adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_CGTS) {
 +              if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGTS) {
                        orig = data = RREG32(mmCGTS_SM_CTRL_REG);
                        data &= ~CGTS_SM_CTRL_REG__SM_MODE_MASK;
                        data |= (0x2 << CGTS_SM_CTRL_REG__SM_MODE__SHIFT);
                        data |= CGTS_SM_CTRL_REG__SM_MODE_ENABLE_MASK;
                        data &= ~CGTS_SM_CTRL_REG__OVERRIDE_MASK;
 -                      if ((adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_MGLS) &&
 -                          (adev->cg_flags & AMDGPU_CG_SUPPORT_GFX_CGTS_LS))
 +                      if ((adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) &&
 +                          (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGTS_LS))
                                data &= ~CGTS_SM_CTRL_REG__LS_OVERRIDE_MASK;
                        data &= ~CGTS_SM_CTRL_REG__ON_MONITOR_ADD_MASK;
                        data |= CGTS_SM_CTRL_REG__ON_MONITOR_ADD_EN_MASK;
@@@ -3675,7 -3693,7 +3705,7 @@@ static void gfx_v7_0_enable_sclk_slowdo
        u32 data, orig;
  
        orig = data = RREG32(mmRLC_PG_CNTL);
 -      if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_RLC_SMU_HS))
 +      if (enable && (adev->pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS))
                data |= RLC_PG_CNTL__SMU_CLK_SLOWDOWN_ON_PU_ENABLE_MASK;
        else
                data &= ~RLC_PG_CNTL__SMU_CLK_SLOWDOWN_ON_PU_ENABLE_MASK;
@@@ -3689,7 -3707,7 +3719,7 @@@ static void gfx_v7_0_enable_sclk_slowdo
        u32 data, orig;
  
        orig = data = RREG32(mmRLC_PG_CNTL);
 -      if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_RLC_SMU_HS))
 +      if (enable && (adev->pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS))
                data |= RLC_PG_CNTL__SMU_CLK_SLOWDOWN_ON_PD_ENABLE_MASK;
        else
                data &= ~RLC_PG_CNTL__SMU_CLK_SLOWDOWN_ON_PD_ENABLE_MASK;
@@@ -3702,7 -3720,7 +3732,7 @@@ static void gfx_v7_0_enable_cp_pg(struc
        u32 data, orig;
  
        orig = data = RREG32(mmRLC_PG_CNTL);
 -      if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_CP))
 +      if (enable && (adev->pg_flags & AMD_PG_SUPPORT_CP))
                data &= ~0x8000;
        else
                data |= 0x8000;
@@@ -3715,7 -3733,7 +3745,7 @@@ static void gfx_v7_0_enable_gds_pg(stru
        u32 data, orig;
  
        orig = data = RREG32(mmRLC_PG_CNTL);
 -      if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_GDS))
 +      if (enable && (adev->pg_flags & AMD_PG_SUPPORT_GDS))
                data &= ~0x2000;
        else
                data |= 0x2000;
@@@ -3796,7 -3814,7 +3826,7 @@@ static void gfx_v7_0_enable_gfx_cgpg(st
  {
        u32 data, orig;
  
 -      if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_PG)) {
 +      if (enable && (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG)) {
                orig = data = RREG32(mmRLC_PG_CNTL);
                data |= RLC_PG_CNTL__GFX_POWER_GATING_ENABLE_MASK;
                if (orig != data)
@@@ -3859,7 -3877,7 +3889,7 @@@ static void gfx_v7_0_enable_gfx_static_
        u32 data, orig;
  
        orig = data = RREG32(mmRLC_PG_CNTL);
 -      if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_SMG))
 +      if (enable && (adev->pg_flags & AMD_PG_SUPPORT_GFX_SMG))
                data |= RLC_PG_CNTL__STATIC_PER_CU_PG_ENABLE_MASK;
        else
                data &= ~RLC_PG_CNTL__STATIC_PER_CU_PG_ENABLE_MASK;
@@@ -3873,7 -3891,7 +3903,7 @@@ static void gfx_v7_0_enable_gfx_dynamic
        u32 data, orig;
  
        orig = data = RREG32(mmRLC_PG_CNTL);
 -      if (enable && (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_DMG))
 +      if (enable && (adev->pg_flags & AMD_PG_SUPPORT_GFX_DMG))
                data |= RLC_PG_CNTL__DYN_PER_CU_PG_ENABLE_MASK;
        else
                data &= ~RLC_PG_CNTL__DYN_PER_CU_PG_ENABLE_MASK;
@@@ -4040,15 -4058,15 +4070,15 @@@ static void gfx_v7_0_get_csb_buffer(str
  
  static void gfx_v7_0_init_pg(struct amdgpu_device *adev)
  {
 -      if (adev->pg_flags & (AMDGPU_PG_SUPPORT_GFX_PG |
 -                            AMDGPU_PG_SUPPORT_GFX_SMG |
 -                            AMDGPU_PG_SUPPORT_GFX_DMG |
 -                            AMDGPU_PG_SUPPORT_CP |
 -                            AMDGPU_PG_SUPPORT_GDS |
 -                            AMDGPU_PG_SUPPORT_RLC_SMU_HS)) {
 +      if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG |
 +                            AMD_PG_SUPPORT_GFX_SMG |
 +                            AMD_PG_SUPPORT_GFX_DMG |
 +                            AMD_PG_SUPPORT_CP |
 +                            AMD_PG_SUPPORT_GDS |
 +                            AMD_PG_SUPPORT_RLC_SMU_HS)) {
                gfx_v7_0_enable_sclk_slowdown_on_pu(adev, true);
                gfx_v7_0_enable_sclk_slowdown_on_pd(adev, true);
 -              if (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_PG) {
 +              if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) {
                        gfx_v7_0_init_gfx_cgpg(adev);
                        gfx_v7_0_enable_cp_pg(adev, true);
                        gfx_v7_0_enable_gds_pg(adev, true);
  
  static void gfx_v7_0_fini_pg(struct amdgpu_device *adev)
  {
 -      if (adev->pg_flags & (AMDGPU_PG_SUPPORT_GFX_PG |
 -                            AMDGPU_PG_SUPPORT_GFX_SMG |
 -                            AMDGPU_PG_SUPPORT_GFX_DMG |
 -                            AMDGPU_PG_SUPPORT_CP |
 -                            AMDGPU_PG_SUPPORT_GDS |
 -                            AMDGPU_PG_SUPPORT_RLC_SMU_HS)) {
 +      if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG |
 +                            AMD_PG_SUPPORT_GFX_SMG |
 +                            AMD_PG_SUPPORT_GFX_DMG |
 +                            AMD_PG_SUPPORT_CP |
 +                            AMD_PG_SUPPORT_GDS |
 +                            AMD_PG_SUPPORT_RLC_SMU_HS)) {
                gfx_v7_0_update_gfx_pg(adev, false);
 -              if (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_PG) {
 +              if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) {
                        gfx_v7_0_enable_cp_pg(adev, false);
                        gfx_v7_0_enable_gds_pg(adev, false);
                }
@@@ -5102,14 -5120,14 +5132,14 @@@ static int gfx_v7_0_set_powergating_sta
        if (state == AMD_PG_STATE_GATE)
                gate = true;
  
 -      if (adev->pg_flags & (AMDGPU_PG_SUPPORT_GFX_PG |
 -                            AMDGPU_PG_SUPPORT_GFX_SMG |
 -                            AMDGPU_PG_SUPPORT_GFX_DMG |
 -                            AMDGPU_PG_SUPPORT_CP |
 -                            AMDGPU_PG_SUPPORT_GDS |
 -                            AMDGPU_PG_SUPPORT_RLC_SMU_HS)) {
 +      if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG |
 +                            AMD_PG_SUPPORT_GFX_SMG |
 +                            AMD_PG_SUPPORT_GFX_DMG |
 +                            AMD_PG_SUPPORT_CP |
 +                            AMD_PG_SUPPORT_GDS |
 +                            AMD_PG_SUPPORT_RLC_SMU_HS)) {
                gfx_v7_0_update_gfx_pg(adev, gate);
 -              if (adev->pg_flags & AMDGPU_PG_SUPPORT_GFX_PG) {
 +              if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) {
                        gfx_v7_0_enable_cp_pg(adev, gate);
                        gfx_v7_0_enable_gds_pg(adev, gate);
                }
@@@ -5142,9 -5160,11 +5172,11 @@@ static const struct amdgpu_ring_funcs g
        .parse_cs = NULL,
        .emit_ib = gfx_v7_0_ring_emit_ib_gfx,
        .emit_fence = gfx_v7_0_ring_emit_fence_gfx,
+       .emit_pipeline_sync = gfx_v7_0_ring_emit_pipeline_sync,
        .emit_vm_flush = gfx_v7_0_ring_emit_vm_flush,
        .emit_gds_switch = gfx_v7_0_ring_emit_gds_switch,
        .emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush,
+       .emit_hdp_invalidate = gfx_v7_0_ring_emit_hdp_invalidate,
        .test_ring = gfx_v7_0_ring_test_ring,
        .test_ib = gfx_v7_0_ring_test_ib,
        .insert_nop = amdgpu_ring_insert_nop,
@@@ -5158,9 -5178,11 +5190,11 @@@ static const struct amdgpu_ring_funcs g
        .parse_cs = NULL,
        .emit_ib = gfx_v7_0_ring_emit_ib_compute,
        .emit_fence = gfx_v7_0_ring_emit_fence_compute,
+       .emit_pipeline_sync = gfx_v7_0_ring_emit_pipeline_sync,
        .emit_vm_flush = gfx_v7_0_ring_emit_vm_flush,
        .emit_gds_switch = gfx_v7_0_ring_emit_gds_switch,
        .emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush,
+       .emit_hdp_invalidate = gfx_v7_0_ring_emit_hdp_invalidate,
        .test_ring = gfx_v7_0_ring_test_ring,
        .test_ib = gfx_v7_0_ring_test_ib,
        .insert_nop = amdgpu_ring_insert_nop,
@@@ -706,8 -706,7 +706,7 @@@ static int gfx_v8_0_ring_test_ib(struc
        ib.ptr[2] = 0xDEADBEEF;
        ib.length_dw = 3;
  
-       r = amdgpu_ib_schedule(ring, 1, &ib, AMDGPU_FENCE_OWNER_UNDEFINED,
-                              NULL, &f);
+       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
        if (r)
                goto err2;
  
@@@ -1262,8 -1261,7 +1261,7 @@@ static int gfx_v8_0_do_edc_gpr_workarou
        ib.ptr[ib.length_dw++] = EVENT_TYPE(7) | EVENT_INDEX(4);
  
        /* shedule the ib on the ring */
-       r = amdgpu_ib_schedule(ring, 1, &ib, AMDGPU_FENCE_OWNER_UNDEFINED,
-                              NULL, &f);
+       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
        if (r) {
                DRM_ERROR("amdgpu: ib submit failed (%d).\n", r);
                goto fail;
@@@ -4589,6 -4587,18 +4587,18 @@@ static void gfx_v8_0_ring_emit_hdp_flus
        amdgpu_ring_write(ring, 0x20); /* poll interval */
  }
  
+ static void gfx_v8_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
+ {
+       amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
+       amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
+                                WRITE_DATA_DST_SEL(0) |
+                                WR_CONFIRM));
+       amdgpu_ring_write(ring, mmHDP_DEBUG0);
+       amdgpu_ring_write(ring, 0);
+       amdgpu_ring_write(ring, 1);
+ }
  static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
                                  struct amdgpu_ib *ib)
  {
@@@ -4682,8 -4692,7 +4692,7 @@@ static void gfx_v8_0_ring_emit_fence_gf
  
  }
  
- static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
-                                       unsigned vm_id, uint64_t pd_addr)
+ static void gfx_v8_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
  {
        int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
        uint32_t seq = ring->fence_drv.sync_seq;
  
        amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
        amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
 -               WAIT_REG_MEM_FUNCTION(3))); /* equal */
 +                               WAIT_REG_MEM_FUNCTION(3) | /* equal */
 +                               WAIT_REG_MEM_ENGINE(usepfp))); /* pfp or me */
        amdgpu_ring_write(ring, addr & 0xfffffffc);
        amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
        amdgpu_ring_write(ring, seq);
                amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
                amdgpu_ring_write(ring, 0);
        }
+ }
+ static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
+                                       unsigned vm_id, uint64_t pd_addr)
+ {
+       int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
  
        amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
        amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
@@@ -4878,7 -4892,7 +4893,7 @@@ static int gfx_v8_0_set_priv_reg_fault_
        case AMDGPU_IRQ_STATE_ENABLE:
                cp_int_cntl = RREG32(mmCP_INT_CNTL_RING0);
                cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0,
 -                                          PRIV_REG_INT_ENABLE, 0);
 +                                          PRIV_REG_INT_ENABLE, 1);
                WREG32(mmCP_INT_CNTL_RING0, cp_int_cntl);
                break;
        default:
@@@ -5028,9 -5042,11 +5043,11 @@@ static const struct amdgpu_ring_funcs g
        .parse_cs = NULL,
        .emit_ib = gfx_v8_0_ring_emit_ib_gfx,
        .emit_fence = gfx_v8_0_ring_emit_fence_gfx,
+       .emit_pipeline_sync = gfx_v8_0_ring_emit_pipeline_sync,
        .emit_vm_flush = gfx_v8_0_ring_emit_vm_flush,
        .emit_gds_switch = gfx_v8_0_ring_emit_gds_switch,
        .emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush,
+       .emit_hdp_invalidate = gfx_v8_0_ring_emit_hdp_invalidate,
        .test_ring = gfx_v8_0_ring_test_ring,
        .test_ib = gfx_v8_0_ring_test_ib,
        .insert_nop = amdgpu_ring_insert_nop,
@@@ -5044,9 -5060,11 +5061,11 @@@ static const struct amdgpu_ring_funcs g
        .parse_cs = NULL,
        .emit_ib = gfx_v8_0_ring_emit_ib_compute,
        .emit_fence = gfx_v8_0_ring_emit_fence_compute,
+       .emit_pipeline_sync = gfx_v8_0_ring_emit_pipeline_sync,
        .emit_vm_flush = gfx_v8_0_ring_emit_vm_flush,
        .emit_gds_switch = gfx_v8_0_ring_emit_gds_switch,
        .emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush,
+       .emit_hdp_invalidate = gfx_v8_0_ring_emit_hdp_invalidate,
        .test_ring = gfx_v8_0_ring_test_ring,
        .test_ib = gfx_v8_0_ring_test_ib,
        .insert_nop = amdgpu_ring_insert_nop,
@@@ -339,7 -339,7 +339,7 @@@ static void gmc_v7_0_mc_program(struct 
        WREG32(mmBIF_FB_EN, BIF_FB_EN__FB_READ_EN_MASK | BIF_FB_EN__FB_WRITE_EN_MASK);
  
        tmp = RREG32(mmHDP_MISC_CNTL);
-       tmp = REG_SET_FIELD(tmp, HDP_MISC_CNTL, FLUSH_INVALIDATE_CACHE, 1);
+       tmp = REG_SET_FIELD(tmp, HDP_MISC_CNTL, FLUSH_INVALIDATE_CACHE, 0);
        WREG32(mmHDP_MISC_CNTL, tmp);
  
        tmp = RREG32(mmHDP_HOST_PATH_CNTL);
@@@ -793,7 -793,7 +793,7 @@@ static void gmc_v7_0_enable_mc_ls(struc
  
        for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
                orig = data = RREG32(mc_cg_registers[i]);
 -              if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_MC_LS))
 +              if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_LS))
                        data |= mc_cg_ls_en[i];
                else
                        data &= ~mc_cg_ls_en[i];
@@@ -810,7 -810,7 +810,7 @@@ static void gmc_v7_0_enable_mc_mgcg(str
  
        for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
                orig = data = RREG32(mc_cg_registers[i]);
 -              if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_MC_MGCG))
 +              if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG))
                        data |= mc_cg_en[i];
                else
                        data &= ~mc_cg_en[i];
@@@ -826,7 -826,7 +826,7 @@@ static void gmc_v7_0_enable_bif_mgls(st
  
        orig = data = RREG32_PCIE(ixPCIE_CNTL2);
  
 -      if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_BIF_LS)) {
 +      if (enable && (adev->cg_flags & AMD_CG_SUPPORT_BIF_LS)) {
                data = REG_SET_FIELD(data, PCIE_CNTL2, SLV_MEM_LS_EN, 1);
                data = REG_SET_FIELD(data, PCIE_CNTL2, MST_MEM_LS_EN, 1);
                data = REG_SET_FIELD(data, PCIE_CNTL2, REPLAY_MEM_LS_EN, 1);
@@@ -849,7 -849,7 +849,7 @@@ static void gmc_v7_0_enable_hdp_mgcg(st
  
        orig = data = RREG32(mmHDP_HOST_PATH_CNTL);
  
 -      if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_HDP_MGCG))
 +      if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_MGCG))
                data = REG_SET_FIELD(data, HDP_HOST_PATH_CNTL, CLOCK_GATING_DIS, 0);
        else
                data = REG_SET_FIELD(data, HDP_HOST_PATH_CNTL, CLOCK_GATING_DIS, 1);
@@@ -865,7 -865,7 +865,7 @@@ static void gmc_v7_0_enable_hdp_ls(stru
  
        orig = data = RREG32(mmHDP_MEM_POWER_LS);
  
 -      if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_HDP_LS))
 +      if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS))
                data = REG_SET_FIELD(data, HDP_MEM_POWER_LS, LS_ENABLE, 1);
        else
                data = REG_SET_FIELD(data, HDP_MEM_POWER_LS, LS_ENABLE, 0);
@@@ -1071,28 -1071,25 +1071,24 @@@ static int vi_common_early_init(void *h
        adev->external_rev_id = 0xFF;
        switch (adev->asic_type) {
        case CHIP_TOPAZ:
-               adev->has_uvd = false;
                adev->cg_flags = 0;
                adev->pg_flags = 0;
                adev->external_rev_id = 0x1;
                break;
        case CHIP_FIJI:
-               adev->has_uvd = true;
                adev->cg_flags = 0;
                adev->pg_flags = 0;
                adev->external_rev_id = adev->rev_id + 0x3c;
                break;
        case CHIP_TONGA:
-               adev->has_uvd = true;
                adev->cg_flags = 0;
                adev->pg_flags = 0;
                adev->external_rev_id = adev->rev_id + 0x14;
                break;
        case CHIP_CARRIZO:
        case CHIP_STONEY:
-               adev->has_uvd = true;
                adev->cg_flags = 0;
 -              /* Disable UVD pg */
 -              adev->pg_flags = /* AMDGPU_PG_SUPPORT_UVD | */AMDGPU_PG_SUPPORT_VCE;
 +              adev->pg_flags = 0;
                adev->external_rev_id = adev->rev_id + 0x1;
                break;
        default:
@@@ -174,8 -174,6 +174,8 @@@ static int cz_initialize_dpm_defaults(s
  {
        struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend);
        uint32_t i;
 +      struct cgs_system_info sys_info = {0};
 +      int result;
  
        cz_hwmgr->gfx_ramp_step = 256*25/100;
  
        phm_cap_set(hwmgr->platform_descriptor.platformCaps,
                                   PHM_PlatformCaps_DisableVoltageIsland);
  
 +      phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
 +                    PHM_PlatformCaps_UVDPowerGating);
 +      phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
 +                    PHM_PlatformCaps_VCEPowerGating);
 +      sys_info.size = sizeof(struct cgs_system_info);
 +      sys_info.info_id = CGS_SYSTEM_INFO_PG_FLAGS;
 +      result = cgs_query_system_info(hwmgr->device, &sys_info);
 +      if (!result) {
 +              if (sys_info.value & AMD_PG_SUPPORT_UVD)
 +                      phm_cap_set(hwmgr->platform_descriptor.platformCaps,
 +                                    PHM_PlatformCaps_UVDPowerGating);
 +              if (sys_info.value & AMD_PG_SUPPORT_VCE)
 +                      phm_cap_set(hwmgr->platform_descriptor.platformCaps,
 +                                    PHM_PlatformCaps_VCEPowerGating);
 +      }
 +
        return 0;
  }
  
@@@ -744,8 -726,9 +744,9 @@@ static int cz_tf_update_sclk_limit(stru
                cz_hwmgr->sclk_dpm.soft_max_clk  = table->entries[table->count - 1].clk;
  
        clock = hwmgr->display_config.min_core_set_clock;
+ ;
        if (clock == 0)
-               printk(KERN_ERR "[ powerplay ] min_core_set_clock not set\n");
+               printk(KERN_INFO "[ powerplay ] min_core_set_clock not set\n");
  
        if (cz_hwmgr->sclk_dpm.hard_min_clk != clock) {
                cz_hwmgr->sclk_dpm.hard_min_clk = clock;
@@@ -103,6 -103,12 +103,12 @@@ static const char radeon_family_name[][
        "LAST",
  };
  
+ #if defined(CONFIG_VGA_SWITCHEROO)
+ bool radeon_has_atpx_dgpu_power_cntl(void);
+ #else
+ static inline bool radeon_has_atpx_dgpu_power_cntl(void) { return false; }
+ #endif
  #define RADEON_PX_QUIRK_DISABLE_PX  (1 << 0)
  #define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1)
  
@@@ -1433,7 -1439,7 +1439,7 @@@ int radeon_device_init(struct radeon_de
         * ignore it */
        vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode);
  
-       if (rdev->flags & RADEON_IS_PX)
+       if ((rdev->flags & RADEON_IS_PX) && radeon_has_atpx_dgpu_power_cntl())
                runtime = true;
        vga_switcheroo_register_client(rdev->pdev, &radeon_switcheroo_ops, runtime);
        if (runtime)
@@@ -1744,6 -1750,7 +1750,6 @@@ int radeon_resume_kms(struct drm_devic
        }
  
        drm_kms_helper_poll_enable(dev);
 -      drm_helper_hpd_irq_event(dev);
  
        /* set the power state here in case we are a PX system or headless */
        if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled)