aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-11-10 12:33:06 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-11-10 12:33:06 -0500
commit3e82806b97398d542a5e03bd94861f79ce10ecee (patch)
tree467753d23d422fc42a07992ac25cae7889e48c18 /drivers/gpu/drm/amd/amdgpu
parentbd4f203e433387d39be404b67ad02acf6f76b7bc (diff)
parent816d2206f0f9953ca854e4ff1a2749a5cbd62715 (diff)
Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
Pull drm updates from Dave Airlie: "I Was Almost Tempted To Capitalise Every Word, but then I decided I couldn't read it myself! I've also got one pull request for the sti driver outstanding. It relied on a commit in Greg's tree and I didn't find out in time, that commit is in your tree now so I might send that along once this is merged. I also had the accidental misfortune to have access to a Skylake on my desk for a few days, and I've had to encourage Intel to try harder, which seems to be happening now. Here is the main drm-next pull request for 4.4. Highlights: New driver: vc4 driver for the Rasberry Pi VPU. (From Eric Anholt at Broadcom.) Core: Atomic fbdev support Atomic helpers for runtime pm dp/aux i2c STATUS_UPDATE handling struct_mutex usage cleanups. Generic of probing support. Documentation: Kerneldoc for VGA switcheroo code. Rename to gpu instead of drm to reflect scope. i915: Skylake GuC firmware fixes HPD A support VBT backlight fallbacks Fastboot by default for some systems FBC work BXT/SKL workarounds Skylake deeper sleep state fixes amdgpu: Enable GPU scheduler by default New atombios opcodes GPUVM debugging options Stoney support. Fencing cleanups. radeon: More efficient CS checking nouveau: gk20a instance memory handling improvements. Improved PGOB detection and GK107 support Kepler GDDR5 PLL statbility improvement G8x/GT2xx reclock improvements new userspace API compatiblity fixes. virtio-gpu: Add 3D support - qemu 2.5 has it merged for it's gtk backend. msm: Initial msm88896 (snapdragon 8200) exynos: HDMI cleanups Enable mixer driver byt default Add DECON-TV support vmwgfx: Move to using memremap + fixes. rcar-du: Add support for R8A7793/4 DU armada: Remove support for non-component mode Improved plane handling Power savings while in DPMS off. tda998x: Remove unused slave encoder support Use more HDMI helpers Fix EDID read handling dwhdmi: Interlace video mode support for ipu-v3/dw_hdmi Hotplug state fixes Audio driver integration imx: More color formats support. tegra: Minor fixes/improvements" [ Merge fixup: remove unused variable 'dev' that had all uses removed in commit 4e270f088011: "drm/gem: Drop struct_mutex requirement from drm_gem_mmap_obj" ] * 'drm-next' of git://people.freedesktop.org/~airlied/linux: (764 commits) drm/vmwgfx: Relax irq locking somewhat drm/vmwgfx: Properly flush cursor updates and page-flips drm/i915/skl: disable display side power well support for now drm/i915: Extend DSL readout fix to BDW and SKL. drm/i915: Do graphics device reset under forcewake drm/i915: Skip fence installation for objects with rotated views (v4) vga_switcheroo: Drop client power state VGA_SWITCHEROO_INIT drm/amdgpu: group together common fence implementation drm/amdgpu: remove AMDGPU_FENCE_OWNER_MOVE drm/amdgpu: remove now unused fence functions drm/amdgpu: fix fence fallback check drm/amdgpu: fix stoping the scheduler timeout drm/amdgpu: cleanup on error in amdgpu_cs_ioctl() drm/i915: Fix locking around GuC firmware load drm/amdgpu: update Fiji's Golden setting drm/amdgpu: update Fiji's rev id drm/amdgpu: extract common code in vi_common_early_init drm/amd/scheduler: don't oops on failure to load drm/amdgpu: don't oops on failure to load (v2) drm/amdgpu: don't VT switch on suspend ...
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h104
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c48
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c47
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_display.c25
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c22
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c397
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c29
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c72
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h12
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c71
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c43
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c55
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h12
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c74
-rw-r--r--drivers/gpu/drm/amd/amdgpu/atom.c53
-rw-r--r--drivers/gpu/drm/amd/amdgpu/atom.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik_sdma.c149
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cz_dpm.c21
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cz_smc.c60
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v10_0.c245
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v11_0.c264
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v8_0.c247
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c20
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c828
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c44
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c52
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c175
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c213
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v2_0.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v3_0.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vi.c50
47 files changed, 1871 insertions, 1617 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 0d13e6368b96..615ce6d464fb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -79,6 +79,8 @@ extern int amdgpu_bapm;
79extern int amdgpu_deep_color; 79extern int amdgpu_deep_color;
80extern int amdgpu_vm_size; 80extern int amdgpu_vm_size;
81extern int amdgpu_vm_block_size; 81extern int amdgpu_vm_block_size;
82extern int amdgpu_vm_fault_stop;
83extern int amdgpu_vm_debug;
82extern int amdgpu_enable_scheduler; 84extern int amdgpu_enable_scheduler;
83extern int amdgpu_sched_jobs; 85extern int amdgpu_sched_jobs;
84extern int amdgpu_sched_hw_submission; 86extern int amdgpu_sched_hw_submission;
@@ -343,7 +345,6 @@ struct amdgpu_ring_funcs {
343 /* testing functions */ 345 /* testing functions */
344 int (*test_ring)(struct amdgpu_ring *ring); 346 int (*test_ring)(struct amdgpu_ring *ring);
345 int (*test_ib)(struct amdgpu_ring *ring); 347 int (*test_ib)(struct amdgpu_ring *ring);
346 bool (*is_lockup)(struct amdgpu_ring *ring);
347 /* insert NOP packets */ 348 /* insert NOP packets */
348 void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count); 349 void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count);
349}; 350};
@@ -404,7 +405,6 @@ struct amdgpu_fence_driver {
404/* some special values for the owner field */ 405/* some special values for the owner field */
405#define AMDGPU_FENCE_OWNER_UNDEFINED ((void*)0ul) 406#define AMDGPU_FENCE_OWNER_UNDEFINED ((void*)0ul)
406#define AMDGPU_FENCE_OWNER_VM ((void*)1ul) 407#define AMDGPU_FENCE_OWNER_VM ((void*)1ul)
407#define AMDGPU_FENCE_OWNER_MOVE ((void*)2ul)
408 408
409#define AMDGPU_FENCE_FLAG_64BIT (1 << 0) 409#define AMDGPU_FENCE_FLAG_64BIT (1 << 0)
410#define AMDGPU_FENCE_FLAG_INT (1 << 1) 410#define AMDGPU_FENCE_FLAG_INT (1 << 1)
@@ -446,58 +446,11 @@ int amdgpu_fence_wait_next(struct amdgpu_ring *ring);
446int amdgpu_fence_wait_empty(struct amdgpu_ring *ring); 446int amdgpu_fence_wait_empty(struct amdgpu_ring *ring);
447unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring); 447unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring);
448 448
449signed long amdgpu_fence_wait_any(struct amdgpu_device *adev,
450 struct fence **array,
451 uint32_t count,
452 bool intr,
453 signed long t);
454struct amdgpu_fence *amdgpu_fence_ref(struct amdgpu_fence *fence);
455void amdgpu_fence_unref(struct amdgpu_fence **fence);
456
457bool amdgpu_fence_need_sync(struct amdgpu_fence *fence, 449bool amdgpu_fence_need_sync(struct amdgpu_fence *fence,
458 struct amdgpu_ring *ring); 450 struct amdgpu_ring *ring);
459void amdgpu_fence_note_sync(struct amdgpu_fence *fence, 451void amdgpu_fence_note_sync(struct amdgpu_fence *fence,
460 struct amdgpu_ring *ring); 452 struct amdgpu_ring *ring);
461 453
462static inline struct amdgpu_fence *amdgpu_fence_later(struct amdgpu_fence *a,
463 struct amdgpu_fence *b)
464{
465 if (!a) {
466 return b;
467 }
468
469 if (!b) {
470 return a;
471 }
472
473 BUG_ON(a->ring != b->ring);
474
475 if (a->seq > b->seq) {
476 return a;
477 } else {
478 return b;
479 }
480}
481
482static inline bool amdgpu_fence_is_earlier(struct amdgpu_fence *a,
483 struct amdgpu_fence *b)
484{
485 if (!a) {
486 return false;
487 }
488
489 if (!b) {
490 return true;
491 }
492
493 BUG_ON(a->ring != b->ring);
494
495 return a->seq < b->seq;
496}
497
498int amdgpu_user_fence_emit(struct amdgpu_ring *ring, struct amdgpu_user_fence *user,
499 void *owner, struct amdgpu_fence **fence);
500
501/* 454/*
502 * TTM. 455 * TTM.
503 */ 456 */
@@ -708,7 +661,7 @@ void amdgpu_semaphore_free(struct amdgpu_device *adev,
708 */ 661 */
709struct amdgpu_sync { 662struct amdgpu_sync {
710 struct amdgpu_semaphore *semaphores[AMDGPU_NUM_SYNCS]; 663 struct amdgpu_semaphore *semaphores[AMDGPU_NUM_SYNCS];
711 struct amdgpu_fence *sync_to[AMDGPU_MAX_RINGS]; 664 struct fence *sync_to[AMDGPU_MAX_RINGS];
712 DECLARE_HASHTABLE(fences, 4); 665 DECLARE_HASHTABLE(fences, 4);
713 struct fence *last_vm_update; 666 struct fence *last_vm_update;
714}; 667};
@@ -905,8 +858,6 @@ struct amdgpu_ring {
905 unsigned ring_size; 858 unsigned ring_size;
906 unsigned ring_free_dw; 859 unsigned ring_free_dw;
907 int count_dw; 860 int count_dw;
908 atomic_t last_rptr;
909 atomic64_t last_activity;
910 uint64_t gpu_addr; 861 uint64_t gpu_addr;
911 uint32_t align_mask; 862 uint32_t align_mask;
912 uint32_t ptr_mask; 863 uint32_t ptr_mask;
@@ -960,6 +911,11 @@ struct amdgpu_ring {
960#define AMDGPU_PTE_FRAG_64KB (4 << 7) 911#define AMDGPU_PTE_FRAG_64KB (4 << 7)
961#define AMDGPU_LOG2_PAGES_PER_FRAG 4 912#define AMDGPU_LOG2_PAGES_PER_FRAG 4
962 913
914/* How to programm VM fault handling */
915#define AMDGPU_VM_FAULT_STOP_NEVER 0
916#define AMDGPU_VM_FAULT_STOP_FIRST 1
917#define AMDGPU_VM_FAULT_STOP_ALWAYS 2
918
963struct amdgpu_vm_pt { 919struct amdgpu_vm_pt {
964 struct amdgpu_bo *bo; 920 struct amdgpu_bo *bo;
965 uint64_t addr; 921 uint64_t addr;
@@ -971,7 +927,7 @@ struct amdgpu_vm_id {
971 /* last flushed PD/PT update */ 927 /* last flushed PD/PT update */
972 struct fence *flushed_updates; 928 struct fence *flushed_updates;
973 /* last use of vmid */ 929 /* last use of vmid */
974 struct amdgpu_fence *last_id_use; 930 struct fence *last_id_use;
975}; 931};
976 932
977struct amdgpu_vm { 933struct amdgpu_vm {
@@ -1004,7 +960,7 @@ struct amdgpu_vm {
1004}; 960};
1005 961
1006struct amdgpu_vm_manager { 962struct amdgpu_vm_manager {
1007 struct amdgpu_fence *active[AMDGPU_NUM_VM]; 963 struct fence *active[AMDGPU_NUM_VM];
1008 uint32_t max_pfn; 964 uint32_t max_pfn;
1009 /* number of VMIDs */ 965 /* number of VMIDs */
1010 unsigned nvm; 966 unsigned nvm;
@@ -1223,8 +1179,6 @@ void amdgpu_ring_commit(struct amdgpu_ring *ring);
1223void amdgpu_ring_unlock_commit(struct amdgpu_ring *ring); 1179void amdgpu_ring_unlock_commit(struct amdgpu_ring *ring);
1224void amdgpu_ring_undo(struct amdgpu_ring *ring); 1180void amdgpu_ring_undo(struct amdgpu_ring *ring);
1225void amdgpu_ring_unlock_undo(struct amdgpu_ring *ring); 1181void amdgpu_ring_unlock_undo(struct amdgpu_ring *ring);
1226void amdgpu_ring_lockup_update(struct amdgpu_ring *ring);
1227bool amdgpu_ring_test_lockup(struct amdgpu_ring *ring);
1228unsigned amdgpu_ring_backup(struct amdgpu_ring *ring, 1182unsigned amdgpu_ring_backup(struct amdgpu_ring *ring,
1229 uint32_t **data); 1183 uint32_t **data);
1230int amdgpu_ring_restore(struct amdgpu_ring *ring, 1184int amdgpu_ring_restore(struct amdgpu_ring *ring,
@@ -1234,6 +1188,7 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
1234 struct amdgpu_irq_src *irq_src, unsigned irq_type, 1188 struct amdgpu_irq_src *irq_src, unsigned irq_type,
1235 enum amdgpu_ring_type ring_type); 1189 enum amdgpu_ring_type ring_type);
1236void amdgpu_ring_fini(struct amdgpu_ring *ring); 1190void amdgpu_ring_fini(struct amdgpu_ring *ring);
1191struct amdgpu_ring *amdgpu_ring_from_fence(struct fence *f);
1237 1192
1238/* 1193/*
1239 * CS. 1194 * CS.
@@ -1709,7 +1664,7 @@ struct amdgpu_vce {
1709/* 1664/*
1710 * SDMA 1665 * SDMA
1711 */ 1666 */
1712struct amdgpu_sdma { 1667struct amdgpu_sdma_instance {
1713 /* SDMA firmware */ 1668 /* SDMA firmware */
1714 const struct firmware *fw; 1669 const struct firmware *fw;
1715 uint32_t fw_version; 1670 uint32_t fw_version;
@@ -1719,6 +1674,13 @@ struct amdgpu_sdma {
1719 bool burst_nop; 1674 bool burst_nop;
1720}; 1675};
1721 1676
1677struct amdgpu_sdma {
1678 struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES];
1679 struct amdgpu_irq_src trap_irq;
1680 struct amdgpu_irq_src illegal_inst_irq;
1681 int num_instances;
1682};
1683
1722/* 1684/*
1723 * Firmware 1685 * Firmware
1724 */ 1686 */
@@ -1751,11 +1713,11 @@ void amdgpu_test_syncing(struct amdgpu_device *adev);
1751int amdgpu_mn_register(struct amdgpu_bo *bo, unsigned long addr); 1713int amdgpu_mn_register(struct amdgpu_bo *bo, unsigned long addr);
1752void amdgpu_mn_unregister(struct amdgpu_bo *bo); 1714void amdgpu_mn_unregister(struct amdgpu_bo *bo);
1753#else 1715#else
1754static int amdgpu_mn_register(struct amdgpu_bo *bo, unsigned long addr) 1716static inline int amdgpu_mn_register(struct amdgpu_bo *bo, unsigned long addr)
1755{ 1717{
1756 return -ENODEV; 1718 return -ENODEV;
1757} 1719}
1758static void amdgpu_mn_unregister(struct amdgpu_bo *bo) {} 1720static inline void amdgpu_mn_unregister(struct amdgpu_bo *bo) {}
1759#endif 1721#endif
1760 1722
1761/* 1723/*
@@ -1947,7 +1909,6 @@ struct amdgpu_device {
1947 struct device *dev; 1909 struct device *dev;
1948 struct drm_device *ddev; 1910 struct drm_device *ddev;
1949 struct pci_dev *pdev; 1911 struct pci_dev *pdev;
1950 struct rw_semaphore exclusive_lock;
1951 1912
1952 /* ASIC */ 1913 /* ASIC */
1953 enum amd_asic_type asic_type; 1914 enum amd_asic_type asic_type;
@@ -1961,7 +1922,6 @@ struct amdgpu_device {
1961 bool suspend; 1922 bool suspend;
1962 bool need_dma32; 1923 bool need_dma32;
1963 bool accel_working; 1924 bool accel_working;
1964 bool needs_reset;
1965 struct work_struct reset_work; 1925 struct work_struct reset_work;
1966 struct notifier_block acpi_nb; 1926 struct notifier_block acpi_nb;
1967 struct amdgpu_i2c_chan *i2c_bus[AMDGPU_MAX_I2C_BUS]; 1927 struct amdgpu_i2c_chan *i2c_bus[AMDGPU_MAX_I2C_BUS];
@@ -2065,9 +2025,7 @@ struct amdgpu_device {
2065 struct amdgpu_gfx gfx; 2025 struct amdgpu_gfx gfx;
2066 2026
2067 /* sdma */ 2027 /* sdma */
2068 struct amdgpu_sdma sdma[AMDGPU_MAX_SDMA_INSTANCES]; 2028 struct amdgpu_sdma sdma;
2069 struct amdgpu_irq_src sdma_trap_irq;
2070 struct amdgpu_irq_src sdma_illegal_inst_irq;
2071 2029
2072 /* uvd */ 2030 /* uvd */
2073 bool has_uvd; 2031 bool has_uvd;
@@ -2204,17 +2162,18 @@ static inline void amdgpu_ring_write(struct amdgpu_ring *ring, uint32_t v)
2204 ring->ring_free_dw--; 2162 ring->ring_free_dw--;
2205} 2163}
2206 2164
2207static inline struct amdgpu_sdma * amdgpu_get_sdma_instance(struct amdgpu_ring *ring) 2165static inline struct amdgpu_sdma_instance *
2166amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
2208{ 2167{
2209 struct amdgpu_device *adev = ring->adev; 2168 struct amdgpu_device *adev = ring->adev;
2210 int i; 2169 int i;
2211 2170
2212 for (i = 0; i < AMDGPU_MAX_SDMA_INSTANCES; i++) 2171 for (i = 0; i < adev->sdma.num_instances; i++)
2213 if (&adev->sdma[i].ring == ring) 2172 if (&adev->sdma.instance[i].ring == ring)
2214 break; 2173 break;
2215 2174
2216 if (i < AMDGPU_MAX_SDMA_INSTANCES) 2175 if (i < AMDGPU_MAX_SDMA_INSTANCES)
2217 return &adev->sdma[i]; 2176 return &adev->sdma.instance[i];
2218 else 2177 else
2219 return NULL; 2178 return NULL;
2220} 2179}
@@ -2241,7 +2200,6 @@ static inline struct amdgpu_sdma * amdgpu_get_sdma_instance(struct amdgpu_ring *
2241#define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), (ib))) 2200#define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), (ib)))
2242#define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r)) 2201#define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r))
2243#define amdgpu_ring_test_ib(r) (r)->funcs->test_ib((r)) 2202#define amdgpu_ring_test_ib(r) (r)->funcs->test_ib((r))
2244#define amdgpu_ring_is_lockup(r) (r)->funcs->is_lockup((r))
2245#define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r)) 2203#define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r))
2246#define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r)) 2204#define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
2247#define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r)) 2205#define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
@@ -2350,10 +2308,10 @@ void amdgpu_driver_preclose_kms(struct drm_device *dev,
2350 struct drm_file *file_priv); 2308 struct drm_file *file_priv);
2351int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon); 2309int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon);
2352int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon); 2310int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon);
2353u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, int crtc); 2311u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);
2354int amdgpu_enable_vblank_kms(struct drm_device *dev, int crtc); 2312int amdgpu_enable_vblank_kms(struct drm_device *dev, unsigned int pipe);
2355void amdgpu_disable_vblank_kms(struct drm_device *dev, int crtc); 2313void amdgpu_disable_vblank_kms(struct drm_device *dev, unsigned int pipe);
2356int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, int crtc, 2314int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
2357 int *max_error, 2315 int *max_error,
2358 struct timeval *vblank_time, 2316 struct timeval *vblank_time,
2359 unsigned flags); 2317 unsigned flags);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
index aef4a7aac0f7..a142d5ae148d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
@@ -25,7 +25,6 @@
25#include <linux/acpi.h> 25#include <linux/acpi.h>
26#include <linux/slab.h> 26#include <linux/slab.h>
27#include <linux/power_supply.h> 27#include <linux/power_supply.h>
28#include <linux/vga_switcheroo.h>
29#include <acpi/video.h> 28#include <acpi/video.h>
30#include <drm/drmP.h> 29#include <drm/drmP.h>
31#include <drm/drm_crtc_helper.h> 30#include <drm/drm_crtc_helper.h>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
index dd2037bc0b4a..0e1376317683 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
@@ -649,12 +649,12 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type)
649 649
650 case KGD_ENGINE_SDMA1: 650 case KGD_ENGINE_SDMA1:
651 hdr = (const union amdgpu_firmware_header *) 651 hdr = (const union amdgpu_firmware_header *)
652 adev->sdma[0].fw->data; 652 adev->sdma.instance[0].fw->data;
653 break; 653 break;
654 654
655 case KGD_ENGINE_SDMA2: 655 case KGD_ENGINE_SDMA2:
656 hdr = (const union amdgpu_firmware_header *) 656 hdr = (const union amdgpu_firmware_header *)
657 adev->sdma[1].fw->data; 657 adev->sdma.instance[1].fw->data;
658 break; 658 break;
659 659
660 default: 660 default:
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
index dfd1d503bccf..79fa5c7de856 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
@@ -523,12 +523,12 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type)
523 523
524 case KGD_ENGINE_SDMA1: 524 case KGD_ENGINE_SDMA1:
525 hdr = (const union amdgpu_firmware_header *) 525 hdr = (const union amdgpu_firmware_header *)
526 adev->sdma[0].fw->data; 526 adev->sdma.instance[0].fw->data;
527 break; 527 break;
528 528
529 case KGD_ENGINE_SDMA2: 529 case KGD_ENGINE_SDMA2:
530 hdr = (const union amdgpu_firmware_header *) 530 hdr = (const union amdgpu_firmware_header *)
531 adev->sdma[1].fw->data; 531 adev->sdma.instance[1].fw->data;
532 break; 532 break;
533 533
534 default: 534 default:
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
index 3f7aaa45bf8e..5a8fbadbd27b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
@@ -501,7 +501,7 @@ static int amdgpu_atpx_get_client_id(struct pci_dev *pdev)
501 return VGA_SWITCHEROO_DIS; 501 return VGA_SWITCHEROO_DIS;
502} 502}
503 503
504static struct vga_switcheroo_handler amdgpu_atpx_handler = { 504static const struct vga_switcheroo_handler amdgpu_atpx_handler = {
505 .switchto = amdgpu_atpx_switchto, 505 .switchto = amdgpu_atpx_switchto,
506 .power_state = amdgpu_atpx_power_state, 506 .power_state = amdgpu_atpx_power_state,
507 .init = amdgpu_atpx_init, 507 .init = amdgpu_atpx_init,
@@ -536,7 +536,7 @@ static bool amdgpu_atpx_detect(void)
536 536
537 if (has_atpx && vga_count == 2) { 537 if (has_atpx && vga_count == 2) {
538 acpi_get_name(amdgpu_atpx_priv.atpx.handle, ACPI_FULL_PATHNAME, &buffer); 538 acpi_get_name(amdgpu_atpx_priv.atpx.handle, ACPI_FULL_PATHNAME, &buffer);
539 printk(KERN_INFO "VGA switcheroo: detected switching method %s handle\n", 539 printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n",
540 acpi_method_name); 540 acpi_method_name);
541 amdgpu_atpx_priv.atpx_detected = true; 541 amdgpu_atpx_priv.atpx_detected = true;
542 return true; 542 return true;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c
index 02add0a508cb..c44c0c6afd1b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c
@@ -29,7 +29,6 @@
29#include "amdgpu.h" 29#include "amdgpu.h"
30#include "atom.h" 30#include "atom.h"
31 31
32#include <linux/vga_switcheroo.h>
33#include <linux/slab.h> 32#include <linux/slab.h>
34#include <linux/acpi.h> 33#include <linux/acpi.h>
35/* 34/*
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index fd16652aa277..dfc4d02c7a38 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -104,10 +104,11 @@ int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type,
104 } 104 }
105 break; 105 break;
106 case AMDGPU_HW_IP_DMA: 106 case AMDGPU_HW_IP_DMA:
107 if (ring < 2) { 107 if (ring < adev->sdma.num_instances) {
108 *out_ring = &adev->sdma[ring].ring; 108 *out_ring = &adev->sdma.instance[ring].ring;
109 } else { 109 } else {
110 DRM_ERROR("only two SDMA rings are supported\n"); 110 DRM_ERROR("only %d SDMA rings are supported\n",
111 adev->sdma.num_instances);
111 return -EINVAL; 112 return -EINVAL;
112 } 113 }
113 break; 114 break;
@@ -567,9 +568,24 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p,
567 if (r) 568 if (r)
568 return r; 569 return r;
569 } 570 }
571
572 }
573
574 r = amdgpu_vm_clear_invalids(adev, vm, &p->ibs[0].sync);
575
576 if (amdgpu_vm_debug && p->bo_list) {
577 /* Invalidate all BOs to test for userspace bugs */
578 for (i = 0; i < p->bo_list->num_entries; i++) {
579 /* ignore duplicates */
580 bo = p->bo_list->array[i].robj;
581 if (!bo)
582 continue;
583
584 amdgpu_vm_bo_invalidate(adev, bo);
585 }
570 } 586 }
571 587
572 return amdgpu_vm_clear_invalids(adev, vm, &p->ibs[0].sync); 588 return r;
573} 589}
574 590
575static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev, 591static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,
@@ -593,7 +609,6 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,
593 } 609 }
594 } 610 }
595 611
596 mutex_lock(&vm->mutex);
597 r = amdgpu_bo_vm_update_pte(parser, vm); 612 r = amdgpu_bo_vm_update_pte(parser, vm);
598 if (r) { 613 if (r) {
599 goto out; 614 goto out;
@@ -604,7 +619,6 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,
604 parser->filp); 619 parser->filp);
605 620
606out: 621out:
607 mutex_unlock(&vm->mutex);
608 return r; 622 return r;
609} 623}
610 624
@@ -812,15 +826,14 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
812{ 826{
813 struct amdgpu_device *adev = dev->dev_private; 827 struct amdgpu_device *adev = dev->dev_private;
814 union drm_amdgpu_cs *cs = data; 828 union drm_amdgpu_cs *cs = data;
829 struct amdgpu_fpriv *fpriv = filp->driver_priv;
830 struct amdgpu_vm *vm = &fpriv->vm;
815 struct amdgpu_cs_parser *parser; 831 struct amdgpu_cs_parser *parser;
816 bool reserved_buffers = false; 832 bool reserved_buffers = false;
817 int i, r; 833 int i, r;
818 834
819 down_read(&adev->exclusive_lock); 835 if (!adev->accel_working)
820 if (!adev->accel_working) {
821 up_read(&adev->exclusive_lock);
822 return -EBUSY; 836 return -EBUSY;
823 }
824 837
825 parser = amdgpu_cs_parser_create(adev, filp, NULL, NULL, 0); 838 parser = amdgpu_cs_parser_create(adev, filp, NULL, NULL, 0);
826 if (!parser) 839 if (!parser)
@@ -828,12 +841,11 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
828 r = amdgpu_cs_parser_init(parser, data); 841 r = amdgpu_cs_parser_init(parser, data);
829 if (r) { 842 if (r) {
830 DRM_ERROR("Failed to initialize parser !\n"); 843 DRM_ERROR("Failed to initialize parser !\n");
831 kfree(parser); 844 amdgpu_cs_parser_fini(parser, r, false);
832 up_read(&adev->exclusive_lock);
833 r = amdgpu_cs_handle_lockup(adev, r); 845 r = amdgpu_cs_handle_lockup(adev, r);
834 return r; 846 return r;
835 } 847 }
836 848 mutex_lock(&vm->mutex);
837 r = amdgpu_cs_parser_relocs(parser); 849 r = amdgpu_cs_parser_relocs(parser);
838 if (r == -ENOMEM) 850 if (r == -ENOMEM)
839 DRM_ERROR("Not enough memory for command submission!\n"); 851 DRM_ERROR("Not enough memory for command submission!\n");
@@ -864,8 +876,10 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
864 struct amdgpu_job *job; 876 struct amdgpu_job *job;
865 struct amdgpu_ring * ring = parser->ibs->ring; 877 struct amdgpu_ring * ring = parser->ibs->ring;
866 job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); 878 job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL);
867 if (!job) 879 if (!job) {
868 return -ENOMEM; 880 r = -ENOMEM;
881 goto out;
882 }
869 job->base.sched = &ring->sched; 883 job->base.sched = &ring->sched;
870 job->base.s_entity = &parser->ctx->rings[ring->idx].entity; 884 job->base.s_entity = &parser->ctx->rings[ring->idx].entity;
871 job->adev = parser->adev; 885 job->adev = parser->adev;
@@ -900,14 +914,14 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
900 914
901 mutex_unlock(&job->job_lock); 915 mutex_unlock(&job->job_lock);
902 amdgpu_cs_parser_fini_late(parser); 916 amdgpu_cs_parser_fini_late(parser);
903 up_read(&adev->exclusive_lock); 917 mutex_unlock(&vm->mutex);
904 return 0; 918 return 0;
905 } 919 }
906 920
907 cs->out.handle = parser->ibs[parser->num_ibs - 1].sequence; 921 cs->out.handle = parser->ibs[parser->num_ibs - 1].sequence;
908out: 922out:
909 amdgpu_cs_parser_fini(parser, r, reserved_buffers); 923 amdgpu_cs_parser_fini(parser, r, reserved_buffers);
910 up_read(&adev->exclusive_lock); 924 mutex_unlock(&vm->mutex);
911 r = amdgpu_cs_handle_lockup(adev, r); 925 r = amdgpu_cs_handle_lockup(adev, r);
912 return r; 926 return r;
913} 927}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
index e0b80ccdfe8a..fec65f01c031 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
@@ -69,6 +69,9 @@ void amdgpu_ctx_fini(struct amdgpu_ctx *ctx)
69 struct amdgpu_device *adev = ctx->adev; 69 struct amdgpu_device *adev = ctx->adev;
70 unsigned i, j; 70 unsigned i, j;
71 71
72 if (!adev)
73 return;
74
72 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) 75 for (i = 0; i < AMDGPU_MAX_RINGS; ++i)
73 for (j = 0; j < AMDGPU_CTX_MAX_CS_PENDING; ++j) 76 for (j = 0; j < AMDGPU_CTX_MAX_CS_PENDING; ++j)
74 fence_put(ctx->rings[i].fences[j]); 77 fence_put(ctx->rings[i].fences[j]);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 6068d8207d10..d5b421330145 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -57,6 +57,7 @@ static const char *amdgpu_asic_name[] = {
57 "TONGA", 57 "TONGA",
58 "FIJI", 58 "FIJI",
59 "CARRIZO", 59 "CARRIZO",
60 "STONEY",
60 "LAST", 61 "LAST",
61}; 62};
62 63
@@ -1022,7 +1023,7 @@ static void amdgpu_check_arguments(struct amdgpu_device *adev)
1022 * amdgpu_switcheroo_set_state - set switcheroo state 1023 * amdgpu_switcheroo_set_state - set switcheroo state
1023 * 1024 *
1024 * @pdev: pci dev pointer 1025 * @pdev: pci dev pointer
1025 * @state: vga switcheroo state 1026 * @state: vga_switcheroo state
1026 * 1027 *
1027 * Callback for the switcheroo driver. Suspends or resumes the 1028 * Callback for the switcheroo driver. Suspends or resumes the
1028 * the asics before or after it is powered up using ACPI methods. 1029 * the asics before or after it is powered up using ACPI methods.
@@ -1165,7 +1166,8 @@ static int amdgpu_early_init(struct amdgpu_device *adev)
1165 case CHIP_TONGA: 1166 case CHIP_TONGA:
1166 case CHIP_FIJI: 1167 case CHIP_FIJI:
1167 case CHIP_CARRIZO: 1168 case CHIP_CARRIZO:
1168 if (adev->asic_type == CHIP_CARRIZO) 1169 case CHIP_STONEY:
1170 if (adev->asic_type == CHIP_CARRIZO || adev->asic_type == CHIP_STONEY)
1169 adev->family = AMDGPU_FAMILY_CZ; 1171 adev->family = AMDGPU_FAMILY_CZ;
1170 else 1172 else
1171 adev->family = AMDGPU_FAMILY_VI; 1173 adev->family = AMDGPU_FAMILY_VI;
@@ -1418,7 +1420,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
1418 mutex_init(&adev->gfx.gpu_clock_mutex); 1420 mutex_init(&adev->gfx.gpu_clock_mutex);
1419 mutex_init(&adev->srbm_mutex); 1421 mutex_init(&adev->srbm_mutex);
1420 mutex_init(&adev->grbm_idx_mutex); 1422 mutex_init(&adev->grbm_idx_mutex);
1421 init_rwsem(&adev->exclusive_lock);
1422 mutex_init(&adev->mn_lock); 1423 mutex_init(&adev->mn_lock);
1423 hash_init(adev->mn_hash); 1424 hash_init(adev->mn_hash);
1424 1425
@@ -1657,11 +1658,21 @@ int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon)
1657 } 1658 }
1658 drm_modeset_unlock_all(dev); 1659 drm_modeset_unlock_all(dev);
1659 1660
1660 /* unpin the front buffers */ 1661 /* unpin the front buffers and cursors */
1661 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 1662 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
1663 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1662 struct amdgpu_framebuffer *rfb = to_amdgpu_framebuffer(crtc->primary->fb); 1664 struct amdgpu_framebuffer *rfb = to_amdgpu_framebuffer(crtc->primary->fb);
1663 struct amdgpu_bo *robj; 1665 struct amdgpu_bo *robj;
1664 1666
1667 if (amdgpu_crtc->cursor_bo) {
1668 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
1669 r = amdgpu_bo_reserve(aobj, false);
1670 if (r == 0) {
1671 amdgpu_bo_unpin(aobj);
1672 amdgpu_bo_unreserve(aobj);
1673 }
1674 }
1675
1665 if (rfb == NULL || rfb->obj == NULL) { 1676 if (rfb == NULL || rfb->obj == NULL) {
1666 continue; 1677 continue;
1667 } 1678 }
@@ -1713,6 +1724,7 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon)
1713{ 1724{
1714 struct drm_connector *connector; 1725 struct drm_connector *connector;
1715 struct amdgpu_device *adev = dev->dev_private; 1726 struct amdgpu_device *adev = dev->dev_private;
1727 struct drm_crtc *crtc;
1716 int r; 1728 int r;
1717 1729
1718 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) 1730 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
@@ -1746,6 +1758,24 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon)
1746 if (r) 1758 if (r)
1747 return r; 1759 return r;
1748 1760
1761 /* pin cursors */
1762 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
1763 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1764
1765 if (amdgpu_crtc->cursor_bo) {
1766 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
1767 r = amdgpu_bo_reserve(aobj, false);
1768 if (r == 0) {
1769 r = amdgpu_bo_pin(aobj,
1770 AMDGPU_GEM_DOMAIN_VRAM,
1771 &amdgpu_crtc->cursor_addr);
1772 if (r != 0)
1773 DRM_ERROR("Failed to pin cursor BO (%d)\n", r);
1774 amdgpu_bo_unreserve(aobj);
1775 }
1776 }
1777 }
1778
1749 /* blat the mode back in */ 1779 /* blat the mode back in */
1750 if (fbcon) { 1780 if (fbcon) {
1751 drm_helper_resume_force_mode(dev); 1781 drm_helper_resume_force_mode(dev);
@@ -1785,14 +1815,6 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
1785 int i, r; 1815 int i, r;
1786 int resched; 1816 int resched;
1787 1817
1788 down_write(&adev->exclusive_lock);
1789
1790 if (!adev->needs_reset) {
1791 up_write(&adev->exclusive_lock);
1792 return 0;
1793 }
1794
1795 adev->needs_reset = false;
1796 atomic_inc(&adev->gpu_reset_counter); 1818 atomic_inc(&adev->gpu_reset_counter);
1797 1819
1798 /* block TTM */ 1820 /* block TTM */
@@ -1856,7 +1878,6 @@ retry:
1856 dev_info(adev->dev, "GPU reset failed\n"); 1878 dev_info(adev->dev, "GPU reset failed\n");
1857 } 1879 }
1858 1880
1859 up_write(&adev->exclusive_lock);
1860 return r; 1881 return r;
1861} 1882}
1862 1883
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
index 6c9e0902a414..e173a5a02f0d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
@@ -47,11 +47,8 @@ static void amdgpu_flip_wait_fence(struct amdgpu_device *adev,
47 fence = to_amdgpu_fence(*f); 47 fence = to_amdgpu_fence(*f);
48 if (fence) { 48 if (fence) {
49 r = fence_wait(&fence->base, false); 49 r = fence_wait(&fence->base, false);
50 if (r == -EDEADLK) { 50 if (r == -EDEADLK)
51 up_read(&adev->exclusive_lock);
52 r = amdgpu_gpu_reset(adev); 51 r = amdgpu_gpu_reset(adev);
53 down_read(&adev->exclusive_lock);
54 }
55 } else 52 } else
56 r = fence_wait(*f, false); 53 r = fence_wait(*f, false);
57 54
@@ -77,7 +74,6 @@ static void amdgpu_flip_work_func(struct work_struct *__work)
77 unsigned long flags; 74 unsigned long flags;
78 unsigned i; 75 unsigned i;
79 76
80 down_read(&adev->exclusive_lock);
81 amdgpu_flip_wait_fence(adev, &work->excl); 77 amdgpu_flip_wait_fence(adev, &work->excl);
82 for (i = 0; i < work->shared_count; ++i) 78 for (i = 0; i < work->shared_count; ++i)
83 amdgpu_flip_wait_fence(adev, &work->shared[i]); 79 amdgpu_flip_wait_fence(adev, &work->shared[i]);
@@ -91,7 +87,6 @@ static void amdgpu_flip_work_func(struct work_struct *__work)
91 amdgpuCrtc->pflip_status = AMDGPU_FLIP_SUBMITTED; 87 amdgpuCrtc->pflip_status = AMDGPU_FLIP_SUBMITTED;
92 88
93 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); 89 spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
94 up_read(&adev->exclusive_lock);
95} 90}
96 91
97/* 92/*
@@ -715,7 +710,7 @@ bool amdgpu_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
715 * an optional accurate timestamp of when query happened. 710 * an optional accurate timestamp of when query happened.
716 * 711 *
717 * \param dev Device to query. 712 * \param dev Device to query.
718 * \param crtc Crtc to query. 713 * \param pipe Crtc to query.
719 * \param flags Flags from caller (DRM_CALLED_FROM_VBLIRQ or 0). 714 * \param flags Flags from caller (DRM_CALLED_FROM_VBLIRQ or 0).
720 * \param *vpos Location where vertical scanout position should be stored. 715 * \param *vpos Location where vertical scanout position should be stored.
721 * \param *hpos Location where horizontal scanout position should go. 716 * \param *hpos Location where horizontal scanout position should go.
@@ -738,8 +733,10 @@ bool amdgpu_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
738 * unknown small number of scanlines wrt. real scanout position. 733 * unknown small number of scanlines wrt. real scanout position.
739 * 734 *
740 */ 735 */
741int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, int crtc, unsigned int flags, 736int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
742 int *vpos, int *hpos, ktime_t *stime, ktime_t *etime) 737 unsigned int flags, int *vpos, int *hpos,
738 ktime_t *stime, ktime_t *etime,
739 const struct drm_display_mode *mode)
743{ 740{
744 u32 vbl = 0, position = 0; 741 u32 vbl = 0, position = 0;
745 int vbl_start, vbl_end, vtotal, ret = 0; 742 int vbl_start, vbl_end, vtotal, ret = 0;
@@ -753,7 +750,7 @@ int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, int crtc, unsigned int fl
753 if (stime) 750 if (stime)
754 *stime = ktime_get(); 751 *stime = ktime_get();
755 752
756 if (amdgpu_display_page_flip_get_scanoutpos(adev, crtc, &vbl, &position) == 0) 753 if (amdgpu_display_page_flip_get_scanoutpos(adev, pipe, &vbl, &position) == 0)
757 ret |= DRM_SCANOUTPOS_VALID; 754 ret |= DRM_SCANOUTPOS_VALID;
758 755
759 /* Get optional system timestamp after query. */ 756 /* Get optional system timestamp after query. */
@@ -775,7 +772,7 @@ int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, int crtc, unsigned int fl
775 } 772 }
776 else { 773 else {
777 /* No: Fake something reasonable which gives at least ok results. */ 774 /* No: Fake something reasonable which gives at least ok results. */
778 vbl_start = adev->mode_info.crtcs[crtc]->base.hwmode.crtc_vdisplay; 775 vbl_start = mode->crtc_vdisplay;
779 vbl_end = 0; 776 vbl_end = 0;
780 } 777 }
781 778
@@ -791,7 +788,7 @@ int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, int crtc, unsigned int fl
791 788
792 /* Inside "upper part" of vblank area? Apply corrective offset if so: */ 789 /* Inside "upper part" of vblank area? Apply corrective offset if so: */
793 if (in_vbl && (*vpos >= vbl_start)) { 790 if (in_vbl && (*vpos >= vbl_start)) {
794 vtotal = adev->mode_info.crtcs[crtc]->base.hwmode.crtc_vtotal; 791 vtotal = mode->crtc_vtotal;
795 *vpos = *vpos - vtotal; 792 *vpos = *vpos - vtotal;
796 } 793 }
797 794
@@ -813,8 +810,8 @@ int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, int crtc, unsigned int fl
813 * We only do this if DRM_CALLED_FROM_VBLIRQ. 810 * We only do this if DRM_CALLED_FROM_VBLIRQ.
814 */ 811 */
815 if ((flags & DRM_CALLED_FROM_VBLIRQ) && !in_vbl) { 812 if ((flags & DRM_CALLED_FROM_VBLIRQ) && !in_vbl) {
816 vbl_start = adev->mode_info.crtcs[crtc]->base.hwmode.crtc_vdisplay; 813 vbl_start = mode->crtc_vdisplay;
817 vtotal = adev->mode_info.crtcs[crtc]->base.hwmode.crtc_vtotal; 814 vtotal = mode->crtc_vtotal;
818 815
819 if (vbl_start - *vpos < vtotal / 100) { 816 if (vbl_start - *vpos < vtotal / 100) {
820 *vpos -= vtotal; 817 *vpos -= vtotal;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index b190c2a83680..0508c5cd103a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -73,13 +73,15 @@ int amdgpu_hard_reset = 0;
73unsigned amdgpu_ip_block_mask = 0xffffffff; 73unsigned amdgpu_ip_block_mask = 0xffffffff;
74int amdgpu_bapm = -1; 74int amdgpu_bapm = -1;
75int amdgpu_deep_color = 0; 75int amdgpu_deep_color = 0;
76int amdgpu_vm_size = 8; 76int amdgpu_vm_size = 64;
77int amdgpu_vm_block_size = -1; 77int amdgpu_vm_block_size = -1;
78int amdgpu_vm_fault_stop = 0;
79int amdgpu_vm_debug = 0;
78int amdgpu_exp_hw_support = 0; 80int amdgpu_exp_hw_support = 0;
79int amdgpu_enable_scheduler = 0; 81int amdgpu_enable_scheduler = 1;
80int amdgpu_sched_jobs = 16; 82int amdgpu_sched_jobs = 16;
81int amdgpu_sched_hw_submission = 2; 83int amdgpu_sched_hw_submission = 2;
82int amdgpu_enable_semaphores = 1; 84int amdgpu_enable_semaphores = 0;
83 85
84MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes"); 86MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes");
85module_param_named(vramlimit, amdgpu_vram_limit, int, 0600); 87module_param_named(vramlimit, amdgpu_vram_limit, int, 0600);
@@ -135,16 +137,22 @@ module_param_named(bapm, amdgpu_bapm, int, 0444);
135MODULE_PARM_DESC(deep_color, "Deep Color support (1 = enable, 0 = disable (default))"); 137MODULE_PARM_DESC(deep_color, "Deep Color support (1 = enable, 0 = disable (default))");
136module_param_named(deep_color, amdgpu_deep_color, int, 0444); 138module_param_named(deep_color, amdgpu_deep_color, int, 0444);
137 139
138MODULE_PARM_DESC(vm_size, "VM address space size in gigabytes (default 8GB)"); 140MODULE_PARM_DESC(vm_size, "VM address space size in gigabytes (default 64GB)");
139module_param_named(vm_size, amdgpu_vm_size, int, 0444); 141module_param_named(vm_size, amdgpu_vm_size, int, 0444);
140 142
141MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default depending on vm_size)"); 143MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default depending on vm_size)");
142module_param_named(vm_block_size, amdgpu_vm_block_size, int, 0444); 144module_param_named(vm_block_size, amdgpu_vm_block_size, int, 0444);
143 145
146MODULE_PARM_DESC(vm_fault_stop, "Stop on VM fault (0 = never (default), 1 = print first, 2 = always)");
147module_param_named(vm_fault_stop, amdgpu_vm_fault_stop, int, 0444);
148
149MODULE_PARM_DESC(vm_debug, "Debug VM handling (0 = disabled (default), 1 = enabled)");
150module_param_named(vm_debug, amdgpu_vm_debug, int, 0644);
151
144MODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))"); 152MODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))");
145module_param_named(exp_hw_support, amdgpu_exp_hw_support, int, 0444); 153module_param_named(exp_hw_support, amdgpu_exp_hw_support, int, 0444);
146 154
147MODULE_PARM_DESC(enable_scheduler, "enable SW GPU scheduler (1 = enable, 0 = disable ((default))"); 155MODULE_PARM_DESC(enable_scheduler, "enable SW GPU scheduler (1 = enable (default), 0 = disable)");
148module_param_named(enable_scheduler, amdgpu_enable_scheduler, int, 0444); 156module_param_named(enable_scheduler, amdgpu_enable_scheduler, int, 0444);
149 157
150MODULE_PARM_DESC(sched_jobs, "the max number of jobs supported in the sw queue (default 16)"); 158MODULE_PARM_DESC(sched_jobs, "the max number of jobs supported in the sw queue (default 16)");
@@ -153,7 +161,7 @@ module_param_named(sched_jobs, amdgpu_sched_jobs, int, 0444);
153MODULE_PARM_DESC(sched_hw_submission, "the max number of HW submissions (default 2)"); 161MODULE_PARM_DESC(sched_hw_submission, "the max number of HW submissions (default 2)");
154module_param_named(sched_hw_submission, amdgpu_sched_hw_submission, int, 0444); 162module_param_named(sched_hw_submission, amdgpu_sched_hw_submission, int, 0444);
155 163
156MODULE_PARM_DESC(enable_semaphores, "Enable semaphores (1 = enable (default), 0 = disable)"); 164MODULE_PARM_DESC(enable_semaphores, "Enable semaphores (1 = enable, 0 = disable (default))");
157module_param_named(enable_semaphores, amdgpu_enable_semaphores, int, 0644); 165module_param_named(enable_semaphores, amdgpu_enable_semaphores, int, 0644);
158 166
159static struct pci_device_id pciidlist[] = { 167static struct pci_device_id pciidlist[] = {
@@ -265,6 +273,8 @@ static struct pci_device_id pciidlist[] = {
265 {0x1002, 0x9875, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU}, 273 {0x1002, 0x9875, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
266 {0x1002, 0x9876, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU}, 274 {0x1002, 0x9876, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
267 {0x1002, 0x9877, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU}, 275 {0x1002, 0x9877, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
276 /* stoney */
277 {0x1002, 0x98E4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_STONEY|AMD_IS_APU},
268 278
269 {0, 0, 0} 279 {0, 0, 0}
270}; 280};
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
index 96290d9cddca..093a8c618931 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
@@ -207,6 +207,7 @@ static int amdgpufb_create(struct drm_fb_helper *helper,
207 } 207 }
208 208
209 info->par = rfbdev; 209 info->par = rfbdev;
210 info->skip_vt_switch = true;
210 211
211 ret = amdgpu_framebuffer_init(adev->ddev, &rfbdev->rfb, &mode_cmd, gobj); 212 ret = amdgpu_framebuffer_init(adev->ddev, &rfbdev->rfb, &mode_cmd, gobj);
212 if (ret) { 213 if (ret) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
index b3fc26c59787..257d72205bb5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
@@ -137,42 +137,6 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, void *owner,
137} 137}
138 138
139/** 139/**
140 * amdgpu_fence_check_signaled - callback from fence_queue
141 *
142 * this function is called with fence_queue lock held, which is also used
143 * for the fence locking itself, so unlocked variants are used for
144 * fence_signal, and remove_wait_queue.
145 */
146static int amdgpu_fence_check_signaled(wait_queue_t *wait, unsigned mode, int flags, void *key)
147{
148 struct amdgpu_fence *fence;
149 struct amdgpu_device *adev;
150 u64 seq;
151 int ret;
152
153 fence = container_of(wait, struct amdgpu_fence, fence_wake);
154 adev = fence->ring->adev;
155
156 /*
157 * We cannot use amdgpu_fence_process here because we're already
158 * in the waitqueue, in a call from wake_up_all.
159 */
160 seq = atomic64_read(&fence->ring->fence_drv.last_seq);
161 if (seq >= fence->seq) {
162 ret = fence_signal_locked(&fence->base);
163 if (!ret)
164 FENCE_TRACE(&fence->base, "signaled from irq context\n");
165 else
166 FENCE_TRACE(&fence->base, "was already signaled\n");
167
168 __remove_wait_queue(&fence->ring->fence_drv.fence_queue, &fence->fence_wake);
169 fence_put(&fence->base);
170 } else
171 FENCE_TRACE(&fence->base, "pending\n");
172 return 0;
173}
174
175/**
176 * amdgpu_fence_activity - check for fence activity 140 * amdgpu_fence_activity - check for fence activity
177 * 141 *
178 * @ring: pointer to struct amdgpu_ring 142 * @ring: pointer to struct amdgpu_ring
@@ -260,27 +224,8 @@ static void amdgpu_fence_check_lockup(struct work_struct *work)
260 lockup_work.work); 224 lockup_work.work);
261 ring = fence_drv->ring; 225 ring = fence_drv->ring;
262 226
263 if (!down_read_trylock(&ring->adev->exclusive_lock)) { 227 if (amdgpu_fence_activity(ring))
264 /* just reschedule the check if a reset is going on */
265 amdgpu_fence_schedule_check(ring);
266 return;
267 }
268
269 if (amdgpu_fence_activity(ring)) {
270 wake_up_all(&ring->fence_drv.fence_queue);
271 }
272 else if (amdgpu_ring_is_lockup(ring)) {
273 /* good news we believe it's a lockup */
274 dev_warn(ring->adev->dev, "GPU lockup (current fence id "
275 "0x%016llx last fence id 0x%016llx on ring %d)\n",
276 (uint64_t)atomic64_read(&fence_drv->last_seq),
277 fence_drv->sync_seq[ring->idx], ring->idx);
278
279 /* remember that we need an reset */
280 ring->adev->needs_reset = true;
281 wake_up_all(&ring->fence_drv.fence_queue); 228 wake_up_all(&ring->fence_drv.fence_queue);
282 }
283 up_read(&ring->adev->exclusive_lock);
284} 229}
285 230
286/** 231/**
@@ -324,50 +269,6 @@ static bool amdgpu_fence_seq_signaled(struct amdgpu_ring *ring, u64 seq)
324 return false; 269 return false;
325} 270}
326 271
327static bool amdgpu_fence_is_signaled(struct fence *f)
328{
329 struct amdgpu_fence *fence = to_amdgpu_fence(f);
330 struct amdgpu_ring *ring = fence->ring;
331 struct amdgpu_device *adev = ring->adev;
332
333 if (atomic64_read(&ring->fence_drv.last_seq) >= fence->seq)
334 return true;
335
336 if (down_read_trylock(&adev->exclusive_lock)) {
337 amdgpu_fence_process(ring);
338 up_read(&adev->exclusive_lock);
339
340 if (atomic64_read(&ring->fence_drv.last_seq) >= fence->seq)
341 return true;
342 }
343 return false;
344}
345
346/**
347 * amdgpu_fence_enable_signaling - enable signalling on fence
348 * @fence: fence
349 *
350 * This function is called with fence_queue lock held, and adds a callback
351 * to fence_queue that checks if this fence is signaled, and if so it
352 * signals the fence and removes itself.
353 */
354static bool amdgpu_fence_enable_signaling(struct fence *f)
355{
356 struct amdgpu_fence *fence = to_amdgpu_fence(f);
357 struct amdgpu_ring *ring = fence->ring;
358
359 if (atomic64_read(&ring->fence_drv.last_seq) >= fence->seq)
360 return false;
361
362 fence->fence_wake.flags = 0;
363 fence->fence_wake.private = NULL;
364 fence->fence_wake.func = amdgpu_fence_check_signaled;
365 __add_wait_queue(&ring->fence_drv.fence_queue, &fence->fence_wake);
366 fence_get(f);
367 FENCE_TRACE(&fence->base, "armed on ring %i!\n", ring->idx);
368 return true;
369}
370
371/* 272/*
372 * amdgpu_ring_wait_seq_timeout - wait for seq of the specific ring to signal 273 * amdgpu_ring_wait_seq_timeout - wait for seq of the specific ring to signal
373 * @ring: ring to wait on for the seq number 274 * @ring: ring to wait on for the seq number
@@ -380,7 +281,6 @@ static bool amdgpu_fence_enable_signaling(struct fence *f)
380 */ 281 */
381static int amdgpu_fence_ring_wait_seq(struct amdgpu_ring *ring, uint64_t seq) 282static int amdgpu_fence_ring_wait_seq(struct amdgpu_ring *ring, uint64_t seq)
382{ 283{
383 struct amdgpu_device *adev = ring->adev;
384 bool signaled = false; 284 bool signaled = false;
385 285
386 BUG_ON(!ring); 286 BUG_ON(!ring);
@@ -390,9 +290,9 @@ static int amdgpu_fence_ring_wait_seq(struct amdgpu_ring *ring, uint64_t seq)
390 if (atomic64_read(&ring->fence_drv.last_seq) >= seq) 290 if (atomic64_read(&ring->fence_drv.last_seq) >= seq)
391 return 0; 291 return 0;
392 292
293 amdgpu_fence_schedule_check(ring);
393 wait_event(ring->fence_drv.fence_queue, ( 294 wait_event(ring->fence_drv.fence_queue, (
394 (signaled = amdgpu_fence_seq_signaled(ring, seq)) 295 (signaled = amdgpu_fence_seq_signaled(ring, seq))));
395 || adev->needs_reset));
396 296
397 if (signaled) 297 if (signaled)
398 return 0; 298 return 0;
@@ -441,36 +341,6 @@ int amdgpu_fence_wait_empty(struct amdgpu_ring *ring)
441} 341}
442 342
443/** 343/**
444 * amdgpu_fence_ref - take a ref on a fence
445 *
446 * @fence: amdgpu fence object
447 *
448 * Take a reference on a fence (all asics).
449 * Returns the fence.
450 */
451struct amdgpu_fence *amdgpu_fence_ref(struct amdgpu_fence *fence)
452{
453 fence_get(&fence->base);
454 return fence;
455}
456
457/**
458 * amdgpu_fence_unref - remove a ref on a fence
459 *
460 * @fence: amdgpu fence object
461 *
462 * Remove a reference on a fence (all asics).
463 */
464void amdgpu_fence_unref(struct amdgpu_fence **fence)
465{
466 struct amdgpu_fence *tmp = *fence;
467
468 *fence = NULL;
469 if (tmp)
470 fence_put(&tmp->base);
471}
472
473/**
474 * amdgpu_fence_count_emitted - get the count of emitted fences 344 * amdgpu_fence_count_emitted - get the count of emitted fences
475 * 345 *
476 * @ring: ring the fence is associated with 346 * @ring: ring the fence is associated with
@@ -628,8 +498,20 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring)
628 init_waitqueue_head(&ring->fence_drv.fence_queue); 498 init_waitqueue_head(&ring->fence_drv.fence_queue);
629 499
630 if (amdgpu_enable_scheduler) { 500 if (amdgpu_enable_scheduler) {
501 long timeout = msecs_to_jiffies(amdgpu_lockup_timeout);
502 if (timeout == 0) {
503 /*
504 * FIXME:
505 * Delayed workqueue cannot use it directly,
506 * so the scheduler will not use delayed workqueue if
507 * MAX_SCHEDULE_TIMEOUT is set.
508 * Currently keep it simple and silly.
509 */
510 timeout = MAX_SCHEDULE_TIMEOUT;
511 }
631 r = amd_sched_init(&ring->sched, &amdgpu_sched_ops, 512 r = amd_sched_init(&ring->sched, &amdgpu_sched_ops,
632 amdgpu_sched_hw_submission, ring->name); 513 amdgpu_sched_hw_submission,
514 timeout, ring->name);
633 if (r) { 515 if (r) {
634 DRM_ERROR("Failed to create scheduler on ring %s.\n", 516 DRM_ERROR("Failed to create scheduler on ring %s.\n",
635 ring->name); 517 ring->name);
@@ -773,6 +655,115 @@ void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev)
773 } 655 }
774} 656}
775 657
658/*
659 * Common fence implementation
660 */
661
662static const char *amdgpu_fence_get_driver_name(struct fence *fence)
663{
664 return "amdgpu";
665}
666
667static const char *amdgpu_fence_get_timeline_name(struct fence *f)
668{
669 struct amdgpu_fence *fence = to_amdgpu_fence(f);
670 return (const char *)fence->ring->name;
671}
672
673/**
674 * amdgpu_fence_is_signaled - test if fence is signaled
675 *
676 * @f: fence to test
677 *
678 * Test the fence sequence number if it is already signaled. If it isn't
679 * signaled start fence processing. Returns True if the fence is signaled.
680 */
681static bool amdgpu_fence_is_signaled(struct fence *f)
682{
683 struct amdgpu_fence *fence = to_amdgpu_fence(f);
684 struct amdgpu_ring *ring = fence->ring;
685
686 if (atomic64_read(&ring->fence_drv.last_seq) >= fence->seq)
687 return true;
688
689 amdgpu_fence_process(ring);
690
691 if (atomic64_read(&ring->fence_drv.last_seq) >= fence->seq)
692 return true;
693
694 return false;
695}
696
697/**
698 * amdgpu_fence_check_signaled - callback from fence_queue
699 *
700 * this function is called with fence_queue lock held, which is also used
701 * for the fence locking itself, so unlocked variants are used for
702 * fence_signal, and remove_wait_queue.
703 */
704static int amdgpu_fence_check_signaled(wait_queue_t *wait, unsigned mode, int flags, void *key)
705{
706 struct amdgpu_fence *fence;
707 struct amdgpu_device *adev;
708 u64 seq;
709 int ret;
710
711 fence = container_of(wait, struct amdgpu_fence, fence_wake);
712 adev = fence->ring->adev;
713
714 /*
715 * We cannot use amdgpu_fence_process here because we're already
716 * in the waitqueue, in a call from wake_up_all.
717 */
718 seq = atomic64_read(&fence->ring->fence_drv.last_seq);
719 if (seq >= fence->seq) {
720 ret = fence_signal_locked(&fence->base);
721 if (!ret)
722 FENCE_TRACE(&fence->base, "signaled from irq context\n");
723 else
724 FENCE_TRACE(&fence->base, "was already signaled\n");
725
726 __remove_wait_queue(&fence->ring->fence_drv.fence_queue, &fence->fence_wake);
727 fence_put(&fence->base);
728 } else
729 FENCE_TRACE(&fence->base, "pending\n");
730 return 0;
731}
732
733/**
734 * amdgpu_fence_enable_signaling - enable signalling on fence
735 * @fence: fence
736 *
737 * This function is called with fence_queue lock held, and adds a callback
738 * to fence_queue that checks if this fence is signaled, and if so it
739 * signals the fence and removes itself.
740 */
741static bool amdgpu_fence_enable_signaling(struct fence *f)
742{
743 struct amdgpu_fence *fence = to_amdgpu_fence(f);
744 struct amdgpu_ring *ring = fence->ring;
745
746 if (atomic64_read(&ring->fence_drv.last_seq) >= fence->seq)
747 return false;
748
749 fence->fence_wake.flags = 0;
750 fence->fence_wake.private = NULL;
751 fence->fence_wake.func = amdgpu_fence_check_signaled;
752 __add_wait_queue(&ring->fence_drv.fence_queue, &fence->fence_wake);
753 fence_get(f);
754 amdgpu_fence_schedule_check(ring);
755 FENCE_TRACE(&fence->base, "armed on ring %i!\n", ring->idx);
756 return true;
757}
758
759const struct fence_ops amdgpu_fence_ops = {
760 .get_driver_name = amdgpu_fence_get_driver_name,
761 .get_timeline_name = amdgpu_fence_get_timeline_name,
762 .enable_signaling = amdgpu_fence_enable_signaling,
763 .signaled = amdgpu_fence_is_signaled,
764 .wait = fence_default_wait,
765 .release = NULL,
766};
776 767
777/* 768/*
778 * Fence debugfs 769 * Fence debugfs
@@ -823,141 +814,3 @@ int amdgpu_debugfs_fence_init(struct amdgpu_device *adev)
823#endif 814#endif
824} 815}
825 816
826static const char *amdgpu_fence_get_driver_name(struct fence *fence)
827{
828 return "amdgpu";
829}
830
831static const char *amdgpu_fence_get_timeline_name(struct fence *f)
832{
833 struct amdgpu_fence *fence = to_amdgpu_fence(f);
834 return (const char *)fence->ring->name;
835}
836
837static inline bool amdgpu_test_signaled(struct amdgpu_fence *fence)
838{
839 return test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags);
840}
841
842static bool amdgpu_test_signaled_any(struct fence **fences, uint32_t count)
843{
844 int idx;
845 struct fence *fence;
846
847 for (idx = 0; idx < count; ++idx) {
848 fence = fences[idx];
849 if (fence) {
850 if (test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->flags))
851 return true;
852 }
853 }
854 return false;
855}
856
857struct amdgpu_wait_cb {
858 struct fence_cb base;
859 struct task_struct *task;
860};
861
862static void amdgpu_fence_wait_cb(struct fence *fence, struct fence_cb *cb)
863{
864 struct amdgpu_wait_cb *wait =
865 container_of(cb, struct amdgpu_wait_cb, base);
866 wake_up_process(wait->task);
867}
868
869static signed long amdgpu_fence_default_wait(struct fence *f, bool intr,
870 signed long t)
871{
872 struct amdgpu_fence *fence = to_amdgpu_fence(f);
873 struct amdgpu_device *adev = fence->ring->adev;
874
875 return amdgpu_fence_wait_any(adev, &f, 1, intr, t);
876}
877
878/**
879 * Wait the fence array with timeout
880 *
881 * @adev: amdgpu device
882 * @array: the fence array with amdgpu fence pointer
883 * @count: the number of the fence array
884 * @intr: when sleep, set the current task interruptable or not
885 * @t: timeout to wait
886 *
887 * It will return when any fence is signaled or timeout.
888 */
889signed long amdgpu_fence_wait_any(struct amdgpu_device *adev,
890 struct fence **array, uint32_t count,
891 bool intr, signed long t)
892{
893 struct amdgpu_wait_cb *cb;
894 struct fence *fence;
895 unsigned idx;
896
897 BUG_ON(!array);
898
899 cb = kcalloc(count, sizeof(struct amdgpu_wait_cb), GFP_KERNEL);
900 if (cb == NULL) {
901 t = -ENOMEM;
902 goto err_free_cb;
903 }
904
905 for (idx = 0; idx < count; ++idx) {
906 fence = array[idx];
907 if (fence) {
908 cb[idx].task = current;
909 if (fence_add_callback(fence,
910 &cb[idx].base, amdgpu_fence_wait_cb)) {
911 /* The fence is already signaled */
912 goto fence_rm_cb;
913 }
914 }
915 }
916
917 while (t > 0) {
918 if (intr)
919 set_current_state(TASK_INTERRUPTIBLE);
920 else
921 set_current_state(TASK_UNINTERRUPTIBLE);
922
923 /*
924 * amdgpu_test_signaled_any must be called after
925 * set_current_state to prevent a race with wake_up_process
926 */
927 if (amdgpu_test_signaled_any(array, count))
928 break;
929
930 if (adev->needs_reset) {
931 t = -EDEADLK;
932 break;
933 }
934
935 t = schedule_timeout(t);
936
937 if (t > 0 && intr && signal_pending(current))
938 t = -ERESTARTSYS;
939 }
940
941 __set_current_state(TASK_RUNNING);
942
943fence_rm_cb:
944 for (idx = 0; idx < count; ++idx) {
945 fence = array[idx];
946 if (fence && cb[idx].base.func)
947 fence_remove_callback(fence, &cb[idx].base);
948 }
949
950err_free_cb:
951 kfree(cb);
952
953 return t;
954}
955
956const struct fence_ops amdgpu_fence_ops = {
957 .get_driver_name = amdgpu_fence_get_driver_name,
958 .get_timeline_name = amdgpu_fence_get_timeline_name,
959 .enable_signaling = amdgpu_fence_enable_signaling,
960 .signaled = amdgpu_fence_is_signaled,
961 .wait = amdgpu_fence_default_wait,
962 .release = NULL,
963};
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index 7297ca3a0ba7..087332858853 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -115,9 +115,10 @@ int amdgpu_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_pri
115 struct amdgpu_vm *vm = &fpriv->vm; 115 struct amdgpu_vm *vm = &fpriv->vm;
116 struct amdgpu_bo_va *bo_va; 116 struct amdgpu_bo_va *bo_va;
117 int r; 117 int r;
118 118 mutex_lock(&vm->mutex);
119 r = amdgpu_bo_reserve(rbo, false); 119 r = amdgpu_bo_reserve(rbo, false);
120 if (r) { 120 if (r) {
121 mutex_unlock(&vm->mutex);
121 return r; 122 return r;
122 } 123 }
123 124
@@ -128,7 +129,7 @@ int amdgpu_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_pri
128 ++bo_va->ref_count; 129 ++bo_va->ref_count;
129 } 130 }
130 amdgpu_bo_unreserve(rbo); 131 amdgpu_bo_unreserve(rbo);
131 132 mutex_unlock(&vm->mutex);
132 return 0; 133 return 0;
133} 134}
134 135
@@ -141,9 +142,10 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj,
141 struct amdgpu_vm *vm = &fpriv->vm; 142 struct amdgpu_vm *vm = &fpriv->vm;
142 struct amdgpu_bo_va *bo_va; 143 struct amdgpu_bo_va *bo_va;
143 int r; 144 int r;
144 145 mutex_lock(&vm->mutex);
145 r = amdgpu_bo_reserve(rbo, true); 146 r = amdgpu_bo_reserve(rbo, true);
146 if (r) { 147 if (r) {
148 mutex_unlock(&vm->mutex);
147 dev_err(adev->dev, "leaking bo va because " 149 dev_err(adev->dev, "leaking bo va because "
148 "we fail to reserve bo (%d)\n", r); 150 "we fail to reserve bo (%d)\n", r);
149 return; 151 return;
@@ -155,6 +157,7 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj,
155 } 157 }
156 } 158 }
157 amdgpu_bo_unreserve(rbo); 159 amdgpu_bo_unreserve(rbo);
160 mutex_unlock(&vm->mutex);
158} 161}
159 162
160static int amdgpu_gem_handle_lockup(struct amdgpu_device *adev, int r) 163static int amdgpu_gem_handle_lockup(struct amdgpu_device *adev, int r)
@@ -181,7 +184,6 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
181 bool kernel = false; 184 bool kernel = false;
182 int r; 185 int r;
183 186
184 down_read(&adev->exclusive_lock);
185 /* create a gem object to contain this object in */ 187 /* create a gem object to contain this object in */
186 if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS | 188 if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS |
187 AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) { 189 AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) {
@@ -214,11 +216,9 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
214 216
215 memset(args, 0, sizeof(*args)); 217 memset(args, 0, sizeof(*args));
216 args->out.handle = handle; 218 args->out.handle = handle;
217 up_read(&adev->exclusive_lock);
218 return 0; 219 return 0;
219 220
220error_unlock: 221error_unlock:
221 up_read(&adev->exclusive_lock);
222 r = amdgpu_gem_handle_lockup(adev, r); 222 r = amdgpu_gem_handle_lockup(adev, r);
223 return r; 223 return r;
224} 224}
@@ -250,8 +250,6 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
250 return -EACCES; 250 return -EACCES;
251 } 251 }
252 252
253 down_read(&adev->exclusive_lock);
254
255 /* create a gem object to contain this object in */ 253 /* create a gem object to contain this object in */
256 r = amdgpu_gem_object_create(adev, args->size, 0, 254 r = amdgpu_gem_object_create(adev, args->size, 0,
257 AMDGPU_GEM_DOMAIN_CPU, 0, 255 AMDGPU_GEM_DOMAIN_CPU, 0,
@@ -293,14 +291,12 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
293 goto handle_lockup; 291 goto handle_lockup;
294 292
295 args->handle = handle; 293 args->handle = handle;
296 up_read(&adev->exclusive_lock);
297 return 0; 294 return 0;
298 295
299release_object: 296release_object:
300 drm_gem_object_unreference_unlocked(gobj); 297 drm_gem_object_unreference_unlocked(gobj);
301 298
302handle_lockup: 299handle_lockup:
303 up_read(&adev->exclusive_lock);
304 r = amdgpu_gem_handle_lockup(adev, r); 300 r = amdgpu_gem_handle_lockup(adev, r);
305 301
306 return r; 302 return r;
@@ -488,18 +484,13 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,
488 goto error_unreserve; 484 goto error_unreserve;
489 } 485 }
490 486
491 mutex_lock(&bo_va->vm->mutex);
492 r = amdgpu_vm_clear_freed(adev, bo_va->vm); 487 r = amdgpu_vm_clear_freed(adev, bo_va->vm);
493 if (r) 488 if (r)
494 goto error_unlock; 489 goto error_unreserve;
495
496 490
497 if (operation == AMDGPU_VA_OP_MAP) 491 if (operation == AMDGPU_VA_OP_MAP)
498 r = amdgpu_vm_bo_update(adev, bo_va, &bo_va->bo->tbo.mem); 492 r = amdgpu_vm_bo_update(adev, bo_va, &bo_va->bo->tbo.mem);
499 493
500error_unlock:
501 mutex_unlock(&bo_va->vm->mutex);
502
503error_unreserve: 494error_unreserve:
504 ttm_eu_backoff_reservation(&ticket, &list); 495 ttm_eu_backoff_reservation(&ticket, &list);
505 496
@@ -556,10 +547,11 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
556 gobj = drm_gem_object_lookup(dev, filp, args->handle); 547 gobj = drm_gem_object_lookup(dev, filp, args->handle);
557 if (gobj == NULL) 548 if (gobj == NULL)
558 return -ENOENT; 549 return -ENOENT;
559 550 mutex_lock(&fpriv->vm.mutex);
560 rbo = gem_to_amdgpu_bo(gobj); 551 rbo = gem_to_amdgpu_bo(gobj);
561 r = amdgpu_bo_reserve(rbo, false); 552 r = amdgpu_bo_reserve(rbo, false);
562 if (r) { 553 if (r) {
554 mutex_unlock(&fpriv->vm.mutex);
563 drm_gem_object_unreference_unlocked(gobj); 555 drm_gem_object_unreference_unlocked(gobj);
564 return r; 556 return r;
565 } 557 }
@@ -567,6 +559,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
567 bo_va = amdgpu_vm_bo_find(&fpriv->vm, rbo); 559 bo_va = amdgpu_vm_bo_find(&fpriv->vm, rbo);
568 if (!bo_va) { 560 if (!bo_va) {
569 amdgpu_bo_unreserve(rbo); 561 amdgpu_bo_unreserve(rbo);
562 mutex_unlock(&fpriv->vm.mutex);
570 return -ENOENT; 563 return -ENOENT;
571 } 564 }
572 565
@@ -591,7 +584,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
591 584
592 if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE)) 585 if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE))
593 amdgpu_gem_va_update_vm(adev, bo_va, args->operation); 586 amdgpu_gem_va_update_vm(adev, bo_va, args->operation);
594 587 mutex_unlock(&fpriv->vm.mutex);
595 drm_gem_object_unreference_unlocked(gobj); 588 drm_gem_object_unreference_unlocked(gobj);
596 return r; 589 return r;
597} 590}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
index c439735ee670..e65987743871 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
@@ -95,7 +95,8 @@ void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib)
95{ 95{
96 amdgpu_sync_free(adev, &ib->sync, &ib->fence->base); 96 amdgpu_sync_free(adev, &ib->sync, &ib->fence->base);
97 amdgpu_sa_bo_free(adev, &ib->sa_bo, &ib->fence->base); 97 amdgpu_sa_bo_free(adev, &ib->sa_bo, &ib->fence->base);
98 amdgpu_fence_unref(&ib->fence); 98 if (ib->fence)
99 fence_put(&ib->fence->base);
99} 100}
100 101
101/** 102/**
@@ -298,7 +299,6 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)
298 r = amdgpu_ring_test_ib(ring); 299 r = amdgpu_ring_test_ib(ring);
299 if (r) { 300 if (r) {
300 ring->ready = false; 301 ring->ready = false;
301 adev->needs_reset = false;
302 302
303 if (ring == &adev->gfx.gfx_ring[0]) { 303 if (ring == &adev->gfx.gfx_ring[0]) {
304 /* oh, oh, that's really bad */ 304 /* oh, oh, that's really bad */
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 5d11e798230c..1618e2294a16 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -218,8 +218,8 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
218 break; 218 break;
219 case AMDGPU_HW_IP_DMA: 219 case AMDGPU_HW_IP_DMA:
220 type = AMD_IP_BLOCK_TYPE_SDMA; 220 type = AMD_IP_BLOCK_TYPE_SDMA;
221 ring_mask = adev->sdma[0].ring.ready ? 1 : 0; 221 for (i = 0; i < adev->sdma.num_instances; i++)
222 ring_mask |= ((adev->sdma[1].ring.ready ? 1 : 0) << 1); 222 ring_mask |= ((adev->sdma.instance[i].ring.ready ? 1 : 0) << i);
223 ib_start_alignment = AMDGPU_GPU_PAGE_SIZE; 223 ib_start_alignment = AMDGPU_GPU_PAGE_SIZE;
224 ib_size_alignment = 1; 224 ib_size_alignment = 1;
225 break; 225 break;
@@ -341,10 +341,10 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
341 fw_info.feature = 0; 341 fw_info.feature = 0;
342 break; 342 break;
343 case AMDGPU_INFO_FW_SDMA: 343 case AMDGPU_INFO_FW_SDMA:
344 if (info->query_fw.index >= 2) 344 if (info->query_fw.index >= adev->sdma.num_instances)
345 return -EINVAL; 345 return -EINVAL;
346 fw_info.ver = adev->sdma[info->query_fw.index].fw_version; 346 fw_info.ver = adev->sdma.instance[info->query_fw.index].fw_version;
347 fw_info.feature = adev->sdma[info->query_fw.index].feature_version; 347 fw_info.feature = adev->sdma.instance[info->query_fw.index].feature_version;
348 break; 348 break;
349 default: 349 default:
350 return -EINVAL; 350 return -EINVAL;
@@ -489,7 +489,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
489 * 489 *
490 * @dev: drm dev pointer 490 * @dev: drm dev pointer
491 * 491 *
492 * Switch vga switcheroo state after last close (all asics). 492 * Switch vga_switcheroo state after last close (all asics).
493 */ 493 */
494void amdgpu_driver_lastclose_kms(struct drm_device *dev) 494void amdgpu_driver_lastclose_kms(struct drm_device *dev)
495{ 495{
@@ -603,36 +603,36 @@ void amdgpu_driver_preclose_kms(struct drm_device *dev,
603 * amdgpu_get_vblank_counter_kms - get frame count 603 * amdgpu_get_vblank_counter_kms - get frame count
604 * 604 *
605 * @dev: drm dev pointer 605 * @dev: drm dev pointer
606 * @crtc: crtc to get the frame count from 606 * @pipe: crtc to get the frame count from
607 * 607 *
608 * Gets the frame count on the requested crtc (all asics). 608 * Gets the frame count on the requested crtc (all asics).
609 * Returns frame count on success, -EINVAL on failure. 609 * Returns frame count on success, -EINVAL on failure.
610 */ 610 */
611u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, int crtc) 611u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe)
612{ 612{
613 struct amdgpu_device *adev = dev->dev_private; 613 struct amdgpu_device *adev = dev->dev_private;
614 614
615 if (crtc < 0 || crtc >= adev->mode_info.num_crtc) { 615 if (pipe >= adev->mode_info.num_crtc) {
616 DRM_ERROR("Invalid crtc %d\n", crtc); 616 DRM_ERROR("Invalid crtc %u\n", pipe);
617 return -EINVAL; 617 return -EINVAL;
618 } 618 }
619 619
620 return amdgpu_display_vblank_get_counter(adev, crtc); 620 return amdgpu_display_vblank_get_counter(adev, pipe);
621} 621}
622 622
623/** 623/**
624 * amdgpu_enable_vblank_kms - enable vblank interrupt 624 * amdgpu_enable_vblank_kms - enable vblank interrupt
625 * 625 *
626 * @dev: drm dev pointer 626 * @dev: drm dev pointer
627 * @crtc: crtc to enable vblank interrupt for 627 * @pipe: crtc to enable vblank interrupt for
628 * 628 *
629 * Enable the interrupt on the requested crtc (all asics). 629 * Enable the interrupt on the requested crtc (all asics).
630 * Returns 0 on success, -EINVAL on failure. 630 * Returns 0 on success, -EINVAL on failure.
631 */ 631 */
632int amdgpu_enable_vblank_kms(struct drm_device *dev, int crtc) 632int amdgpu_enable_vblank_kms(struct drm_device *dev, unsigned int pipe)
633{ 633{
634 struct amdgpu_device *adev = dev->dev_private; 634 struct amdgpu_device *adev = dev->dev_private;
635 int idx = amdgpu_crtc_idx_to_irq_type(adev, crtc); 635 int idx = amdgpu_crtc_idx_to_irq_type(adev, pipe);
636 636
637 return amdgpu_irq_get(adev, &adev->crtc_irq, idx); 637 return amdgpu_irq_get(adev, &adev->crtc_irq, idx);
638} 638}
@@ -641,14 +641,14 @@ int amdgpu_enable_vblank_kms(struct drm_device *dev, int crtc)
641 * amdgpu_disable_vblank_kms - disable vblank interrupt 641 * amdgpu_disable_vblank_kms - disable vblank interrupt
642 * 642 *
643 * @dev: drm dev pointer 643 * @dev: drm dev pointer
644 * @crtc: crtc to disable vblank interrupt for 644 * @pipe: crtc to disable vblank interrupt for
645 * 645 *
646 * Disable the interrupt on the requested crtc (all asics). 646 * Disable the interrupt on the requested crtc (all asics).
647 */ 647 */
648void amdgpu_disable_vblank_kms(struct drm_device *dev, int crtc) 648void amdgpu_disable_vblank_kms(struct drm_device *dev, unsigned int pipe)
649{ 649{
650 struct amdgpu_device *adev = dev->dev_private; 650 struct amdgpu_device *adev = dev->dev_private;
651 int idx = amdgpu_crtc_idx_to_irq_type(adev, crtc); 651 int idx = amdgpu_crtc_idx_to_irq_type(adev, pipe);
652 652
653 amdgpu_irq_put(adev, &adev->crtc_irq, idx); 653 amdgpu_irq_put(adev, &adev->crtc_irq, idx);
654} 654}
@@ -666,41 +666,41 @@ void amdgpu_disable_vblank_kms(struct drm_device *dev, int crtc)
666 * scanout position. (all asics). 666 * scanout position. (all asics).
667 * Returns postive status flags on success, negative error on failure. 667 * Returns postive status flags on success, negative error on failure.
668 */ 668 */
669int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, int crtc, 669int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
670 int *max_error, 670 int *max_error,
671 struct timeval *vblank_time, 671 struct timeval *vblank_time,
672 unsigned flags) 672 unsigned flags)
673{ 673{
674 struct drm_crtc *drmcrtc; 674 struct drm_crtc *crtc;
675 struct amdgpu_device *adev = dev->dev_private; 675 struct amdgpu_device *adev = dev->dev_private;
676 676
677 if (crtc < 0 || crtc >= dev->num_crtcs) { 677 if (pipe >= dev->num_crtcs) {
678 DRM_ERROR("Invalid crtc %d\n", crtc); 678 DRM_ERROR("Invalid crtc %u\n", pipe);
679 return -EINVAL; 679 return -EINVAL;
680 } 680 }
681 681
682 /* Get associated drm_crtc: */ 682 /* Get associated drm_crtc: */
683 drmcrtc = &adev->mode_info.crtcs[crtc]->base; 683 crtc = &adev->mode_info.crtcs[pipe]->base;
684 684
685 /* Helper routine in DRM core does all the work: */ 685 /* Helper routine in DRM core does all the work: */
686 return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error, 686 return drm_calc_vbltimestamp_from_scanoutpos(dev, pipe, max_error,
687 vblank_time, flags, 687 vblank_time, flags,
688 drmcrtc, &drmcrtc->hwmode); 688 &crtc->hwmode);
689} 689}
690 690
691const struct drm_ioctl_desc amdgpu_ioctls_kms[] = { 691const struct drm_ioctl_desc amdgpu_ioctls_kms[] = {
692 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_CREATE, amdgpu_gem_create_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 692 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_CREATE, amdgpu_gem_create_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
693 DRM_IOCTL_DEF_DRV(AMDGPU_CTX, amdgpu_ctx_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 693 DRM_IOCTL_DEF_DRV(AMDGPU_CTX, amdgpu_ctx_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
694 DRM_IOCTL_DEF_DRV(AMDGPU_BO_LIST, amdgpu_bo_list_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 694 DRM_IOCTL_DEF_DRV(AMDGPU_BO_LIST, amdgpu_bo_list_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
695 /* KMS */ 695 /* KMS */
696 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_MMAP, amdgpu_gem_mmap_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 696 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_MMAP, amdgpu_gem_mmap_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
697 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_WAIT_IDLE, amdgpu_gem_wait_idle_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 697 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_WAIT_IDLE, amdgpu_gem_wait_idle_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
698 DRM_IOCTL_DEF_DRV(AMDGPU_CS, amdgpu_cs_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 698 DRM_IOCTL_DEF_DRV(AMDGPU_CS, amdgpu_cs_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
699 DRM_IOCTL_DEF_DRV(AMDGPU_INFO, amdgpu_info_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 699 DRM_IOCTL_DEF_DRV(AMDGPU_INFO, amdgpu_info_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
700 DRM_IOCTL_DEF_DRV(AMDGPU_WAIT_CS, amdgpu_cs_wait_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 700 DRM_IOCTL_DEF_DRV(AMDGPU_WAIT_CS, amdgpu_cs_wait_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
701 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_METADATA, amdgpu_gem_metadata_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 701 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_METADATA, amdgpu_gem_metadata_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
702 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_VA, amdgpu_gem_va_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 702 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_VA, amdgpu_gem_va_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
703 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_OP, amdgpu_gem_op_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 703 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_OP, amdgpu_gem_op_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
704 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_USERPTR, amdgpu_gem_userptr_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 704 DRM_IOCTL_DEF_DRV(AMDGPU_GEM_USERPTR, amdgpu_gem_userptr_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
705}; 705};
706int amdgpu_max_kms_ioctl = ARRAY_SIZE(amdgpu_ioctls_kms); 706int amdgpu_max_kms_ioctl = ARRAY_SIZE(amdgpu_ioctls_kms);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
index 7bd470d9ac30..b62c1710cab6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -373,6 +373,10 @@ struct amdgpu_crtc {
373 uint32_t crtc_offset; 373 uint32_t crtc_offset;
374 struct drm_gem_object *cursor_bo; 374 struct drm_gem_object *cursor_bo;
375 uint64_t cursor_addr; 375 uint64_t cursor_addr;
376 int cursor_x;
377 int cursor_y;
378 int cursor_hot_x;
379 int cursor_hot_y;
376 int cursor_width; 380 int cursor_width;
377 int cursor_height; 381 int cursor_height;
378 int max_cursor_width; 382 int max_cursor_width;
@@ -540,10 +544,10 @@ bool amdgpu_ddc_probe(struct amdgpu_connector *amdgpu_connector, bool use_aux);
540 544
541void amdgpu_encoder_set_active_device(struct drm_encoder *encoder); 545void amdgpu_encoder_set_active_device(struct drm_encoder *encoder);
542 546
543int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, int crtc, 547int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
544 unsigned int flags, 548 unsigned int flags, int *vpos, int *hpos,
545 int *vpos, int *hpos, ktime_t *stime, 549 ktime_t *stime, ktime_t *etime,
546 ktime_t *etime); 550 const struct drm_display_mode *mode);
547 551
548int amdgpu_framebuffer_init(struct drm_device *dev, 552int amdgpu_framebuffer_init(struct drm_device *dev,
549 struct amdgpu_framebuffer *rfb, 553 struct amdgpu_framebuffer *rfb,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 1a7708f365f3..0d524384ff79 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -132,6 +132,8 @@ static void amdgpu_ttm_placement_init(struct amdgpu_device *adev,
132 placements[c].fpfn = 0; 132 placements[c].fpfn = 0;
133 placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | 133 placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
134 TTM_PL_FLAG_VRAM; 134 TTM_PL_FLAG_VRAM;
135 if (!(flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED))
136 placements[c - 1].flags |= TTM_PL_FLAG_TOPDOWN;
135 } 137 }
136 138
137 if (domain & AMDGPU_GEM_DOMAIN_GTT) { 139 if (domain & AMDGPU_GEM_DOMAIN_GTT) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index 30dce235ddeb..78e9b0f14661 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -67,8 +67,6 @@ void amdgpu_ring_free_size(struct amdgpu_ring *ring)
67 if (!ring->ring_free_dw) { 67 if (!ring->ring_free_dw) {
68 /* this is an empty ring */ 68 /* this is an empty ring */
69 ring->ring_free_dw = ring->ring_size / 4; 69 ring->ring_free_dw = ring->ring_size / 4;
70 /* update lockup info to avoid false positive */
71 amdgpu_ring_lockup_update(ring);
72 } 70 }
73} 71}
74 72
@@ -209,46 +207,6 @@ void amdgpu_ring_unlock_undo(struct amdgpu_ring *ring)
209} 207}
210 208
211/** 209/**
212 * amdgpu_ring_lockup_update - update lockup variables
213 *
214 * @ring: amdgpu_ring structure holding ring information
215 *
216 * Update the last rptr value and timestamp (all asics).
217 */
218void amdgpu_ring_lockup_update(struct amdgpu_ring *ring)
219{
220 atomic_set(&ring->last_rptr, amdgpu_ring_get_rptr(ring));
221 atomic64_set(&ring->last_activity, jiffies_64);
222}
223
224/**
225 * amdgpu_ring_test_lockup() - check if ring is lockedup by recording information
226 * @ring: amdgpu_ring structure holding ring information
227 *
228 */
229bool amdgpu_ring_test_lockup(struct amdgpu_ring *ring)
230{
231 uint32_t rptr = amdgpu_ring_get_rptr(ring);
232 uint64_t last = atomic64_read(&ring->last_activity);
233 uint64_t elapsed;
234
235 if (rptr != atomic_read(&ring->last_rptr)) {
236 /* ring is still working, no lockup */
237 amdgpu_ring_lockup_update(ring);
238 return false;
239 }
240
241 elapsed = jiffies_to_msecs(jiffies_64 - last);
242 if (amdgpu_lockup_timeout && elapsed >= amdgpu_lockup_timeout) {
243 dev_err(ring->adev->dev, "ring %d stalled for more than %llumsec\n",
244 ring->idx, elapsed);
245 return true;
246 }
247 /* give a chance to the GPU ... */
248 return false;
249}
250
251/**
252 * amdgpu_ring_backup - Back up the content of a ring 210 * amdgpu_ring_backup - Back up the content of a ring
253 * 211 *
254 * @ring: the ring we want to back up 212 * @ring: the ring we want to back up
@@ -436,7 +394,6 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
436 if (amdgpu_debugfs_ring_init(adev, ring)) { 394 if (amdgpu_debugfs_ring_init(adev, ring)) {
437 DRM_ERROR("Failed to register debugfs file for rings !\n"); 395 DRM_ERROR("Failed to register debugfs file for rings !\n");
438 } 396 }
439 amdgpu_ring_lockup_update(ring);
440 return 0; 397 return 0;
441} 398}
442 399
@@ -479,6 +436,30 @@ void amdgpu_ring_fini(struct amdgpu_ring *ring)
479 } 436 }
480} 437}
481 438
439/**
440 * amdgpu_ring_from_fence - get ring from fence
441 *
442 * @f: fence structure
443 *
444 * Extract the ring a fence belongs to. Handles both scheduler as
445 * well as hardware fences.
446 */
447struct amdgpu_ring *amdgpu_ring_from_fence(struct fence *f)
448{
449 struct amdgpu_fence *a_fence;
450 struct amd_sched_fence *s_fence;
451
452 s_fence = to_amd_sched_fence(f);
453 if (s_fence)
454 return container_of(s_fence->sched, struct amdgpu_ring, sched);
455
456 a_fence = to_amdgpu_fence(f);
457 if (a_fence)
458 return a_fence->ring;
459
460 return NULL;
461}
462
482/* 463/*
483 * Debugfs info 464 * Debugfs info
484 */ 465 */
@@ -540,8 +521,8 @@ static int amdgpu_debugfs_ring_info(struct seq_file *m, void *data)
540static int amdgpu_gfx_index = offsetof(struct amdgpu_device, gfx.gfx_ring[0]); 521static int amdgpu_gfx_index = offsetof(struct amdgpu_device, gfx.gfx_ring[0]);
541static int cayman_cp1_index = offsetof(struct amdgpu_device, gfx.compute_ring[0]); 522static int cayman_cp1_index = offsetof(struct amdgpu_device, gfx.compute_ring[0]);
542static int cayman_cp2_index = offsetof(struct amdgpu_device, gfx.compute_ring[1]); 523static int cayman_cp2_index = offsetof(struct amdgpu_device, gfx.compute_ring[1]);
543static int amdgpu_dma1_index = offsetof(struct amdgpu_device, sdma[0].ring); 524static int amdgpu_dma1_index = offsetof(struct amdgpu_device, sdma.instance[0].ring);
544static int amdgpu_dma2_index = offsetof(struct amdgpu_device, sdma[1].ring); 525static int amdgpu_dma2_index = offsetof(struct amdgpu_device, sdma.instance[1].ring);
545static int r600_uvd_index = offsetof(struct amdgpu_device, uvd.ring); 526static int r600_uvd_index = offsetof(struct amdgpu_device, uvd.ring);
546static int si_vce1_index = offsetof(struct amdgpu_device, vce.ring[0]); 527static int si_vce1_index = offsetof(struct amdgpu_device, vce.ring[0]);
547static int si_vce2_index = offsetof(struct amdgpu_device, vce.ring[1]); 528static int si_vce2_index = offsetof(struct amdgpu_device, vce.ring[1]);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
index e90712443fe9..0212b31dc194 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
@@ -139,25 +139,6 @@ int amdgpu_sa_bo_manager_suspend(struct amdgpu_device *adev,
139 return r; 139 return r;
140} 140}
141 141
142static uint32_t amdgpu_sa_get_ring_from_fence(struct fence *f)
143{
144 struct amdgpu_fence *a_fence;
145 struct amd_sched_fence *s_fence;
146
147 s_fence = to_amd_sched_fence(f);
148 if (s_fence) {
149 struct amdgpu_ring *ring;
150
151 ring = container_of(s_fence->sched, struct amdgpu_ring, sched);
152 return ring->idx;
153 }
154
155 a_fence = to_amdgpu_fence(f);
156 if (a_fence)
157 return a_fence->ring->idx;
158 return 0;
159}
160
161static void amdgpu_sa_bo_remove_locked(struct amdgpu_sa_bo *sa_bo) 142static void amdgpu_sa_bo_remove_locked(struct amdgpu_sa_bo *sa_bo)
162{ 143{
163 struct amdgpu_sa_manager *sa_manager = sa_bo->manager; 144 struct amdgpu_sa_manager *sa_manager = sa_bo->manager;
@@ -318,7 +299,7 @@ static bool amdgpu_sa_bo_next_hole(struct amdgpu_sa_manager *sa_manager,
318 } 299 }
319 300
320 if (best_bo) { 301 if (best_bo) {
321 uint32_t idx = amdgpu_sa_get_ring_from_fence(best_bo->fence); 302 uint32_t idx = amdgpu_ring_from_fence(best_bo->fence)->idx;
322 ++tries[idx]; 303 ++tries[idx];
323 sa_manager->hole = best_bo->olist.prev; 304 sa_manager->hole = best_bo->olist.prev;
324 305
@@ -337,6 +318,7 @@ int amdgpu_sa_bo_new(struct amdgpu_device *adev,
337{ 318{
338 struct fence *fences[AMDGPU_MAX_RINGS]; 319 struct fence *fences[AMDGPU_MAX_RINGS];
339 unsigned tries[AMDGPU_MAX_RINGS]; 320 unsigned tries[AMDGPU_MAX_RINGS];
321 unsigned count;
340 int i, r; 322 int i, r;
341 signed long t; 323 signed long t;
342 324
@@ -371,13 +353,18 @@ int amdgpu_sa_bo_new(struct amdgpu_device *adev,
371 /* see if we can skip over some allocations */ 353 /* see if we can skip over some allocations */
372 } while (amdgpu_sa_bo_next_hole(sa_manager, fences, tries)); 354 } while (amdgpu_sa_bo_next_hole(sa_manager, fences, tries));
373 355
374 spin_unlock(&sa_manager->wq.lock); 356 for (i = 0, count = 0; i < AMDGPU_MAX_RINGS; ++i)
375 t = amdgpu_fence_wait_any(adev, fences, AMDGPU_MAX_RINGS, 357 if (fences[i])
376 false, MAX_SCHEDULE_TIMEOUT); 358 fences[count++] = fences[i];
377 r = (t > 0) ? 0 : t; 359
378 spin_lock(&sa_manager->wq.lock); 360 if (count) {
379 /* if we have nothing to wait for block */ 361 spin_unlock(&sa_manager->wq.lock);
380 if (r == -ENOENT) { 362 t = fence_wait_any_timeout(fences, count, false,
363 MAX_SCHEDULE_TIMEOUT);
364 r = (t > 0) ? 0 : t;
365 spin_lock(&sa_manager->wq.lock);
366 } else {
367 /* if we have nothing to wait for block */
381 r = wait_event_interruptible_locked( 368 r = wait_event_interruptible_locked(
382 sa_manager->wq, 369 sa_manager->wq,
383 amdgpu_sa_event(sa_manager, size, align) 370 amdgpu_sa_event(sa_manager, size, align)
@@ -406,7 +393,7 @@ void amdgpu_sa_bo_free(struct amdgpu_device *adev, struct amdgpu_sa_bo **sa_bo,
406 if (fence && !fence_is_signaled(fence)) { 393 if (fence && !fence_is_signaled(fence)) {
407 uint32_t idx; 394 uint32_t idx;
408 (*sa_bo)->fence = fence_get(fence); 395 (*sa_bo)->fence = fence_get(fence);
409 idx = amdgpu_sa_get_ring_from_fence(fence); 396 idx = amdgpu_ring_from_fence(fence)->idx;
410 list_add_tail(&(*sa_bo)->flist, &sa_manager->flist[idx]); 397 list_add_tail(&(*sa_bo)->flist, &sa_manager->flist[idx]);
411 } else { 398 } else {
412 amdgpu_sa_bo_remove_locked(*sa_bo); 399 amdgpu_sa_bo_remove_locked(*sa_bo);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
index 2e946b2cad88..dcf4a8aca680 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
@@ -54,7 +54,8 @@ static struct fence *amdgpu_sched_run_job(struct amd_sched_job *sched_job)
54 goto err; 54 goto err;
55 } 55 }
56 56
57 fence = amdgpu_fence_ref(job->ibs[job->num_ibs - 1].fence); 57 fence = job->ibs[job->num_ibs - 1].fence;
58 fence_get(&fence->base);
58 59
59err: 60err:
60 if (job->free_job) 61 if (job->free_job)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
index 4921de15b451..a6697fd05217 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
@@ -87,6 +87,15 @@ static bool amdgpu_sync_test_owner(struct fence *f, void *owner)
87 return false; 87 return false;
88} 88}
89 89
90static void amdgpu_sync_keep_later(struct fence **keep, struct fence *fence)
91{
92 if (*keep && fence_is_later(*keep, fence))
93 return;
94
95 fence_put(*keep);
96 *keep = fence_get(fence);
97}
98
90/** 99/**
91 * amdgpu_sync_fence - remember to sync to this fence 100 * amdgpu_sync_fence - remember to sync to this fence
92 * 101 *
@@ -99,35 +108,21 @@ int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync,
99{ 108{
100 struct amdgpu_sync_entry *e; 109 struct amdgpu_sync_entry *e;
101 struct amdgpu_fence *fence; 110 struct amdgpu_fence *fence;
102 struct amdgpu_fence *other;
103 struct fence *tmp, *later;
104 111
105 if (!f) 112 if (!f)
106 return 0; 113 return 0;
107 114
108 if (amdgpu_sync_same_dev(adev, f) && 115 if (amdgpu_sync_same_dev(adev, f) &&
109 amdgpu_sync_test_owner(f, AMDGPU_FENCE_OWNER_VM)) { 116 amdgpu_sync_test_owner(f, AMDGPU_FENCE_OWNER_VM))
110 if (sync->last_vm_update) { 117 amdgpu_sync_keep_later(&sync->last_vm_update, f);
111 tmp = sync->last_vm_update;
112 BUG_ON(f->context != tmp->context);
113 later = (f->seqno - tmp->seqno <= INT_MAX) ? f : tmp;
114 sync->last_vm_update = fence_get(later);
115 fence_put(tmp);
116 } else
117 sync->last_vm_update = fence_get(f);
118 }
119 118
120 fence = to_amdgpu_fence(f); 119 fence = to_amdgpu_fence(f);
121 if (!fence || fence->ring->adev != adev) { 120 if (!fence || fence->ring->adev != adev) {
122 hash_for_each_possible(sync->fences, e, node, f->context) { 121 hash_for_each_possible(sync->fences, e, node, f->context) {
123 struct fence *new;
124 if (unlikely(e->fence->context != f->context)) 122 if (unlikely(e->fence->context != f->context))
125 continue; 123 continue;
126 new = fence_get(fence_later(e->fence, f)); 124
127 if (new) { 125 amdgpu_sync_keep_later(&e->fence, f);
128 fence_put(e->fence);
129 e->fence = new;
130 }
131 return 0; 126 return 0;
132 } 127 }
133 128
@@ -140,10 +135,7 @@ int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync,
140 return 0; 135 return 0;
141 } 136 }
142 137
143 other = sync->sync_to[fence->ring->idx]; 138 amdgpu_sync_keep_later(&sync->sync_to[fence->ring->idx], f);
144 sync->sync_to[fence->ring->idx] = amdgpu_fence_ref(
145 amdgpu_fence_later(fence, other));
146 amdgpu_fence_unref(&other);
147 139
148 return 0; 140 return 0;
149} 141}
@@ -199,8 +191,8 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,
199 * for other VM updates and moves. 191 * for other VM updates and moves.
200 */ 192 */
201 fence_owner = amdgpu_sync_get_owner(f); 193 fence_owner = amdgpu_sync_get_owner(f);
202 if ((owner != AMDGPU_FENCE_OWNER_MOVE) && 194 if ((owner != AMDGPU_FENCE_OWNER_UNDEFINED) &&
203 (fence_owner != AMDGPU_FENCE_OWNER_MOVE) && 195 (fence_owner != AMDGPU_FENCE_OWNER_UNDEFINED) &&
204 ((owner == AMDGPU_FENCE_OWNER_VM) != 196 ((owner == AMDGPU_FENCE_OWNER_VM) !=
205 (fence_owner == AMDGPU_FENCE_OWNER_VM))) 197 (fence_owner == AMDGPU_FENCE_OWNER_VM)))
206 continue; 198 continue;
@@ -262,11 +254,11 @@ int amdgpu_sync_wait(struct amdgpu_sync *sync)
262 return 0; 254 return 0;
263 255
264 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 256 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
265 struct amdgpu_fence *fence = sync->sync_to[i]; 257 struct fence *fence = sync->sync_to[i];
266 if (!fence) 258 if (!fence)
267 continue; 259 continue;
268 260
269 r = fence_wait(&fence->base, false); 261 r = fence_wait(fence, false);
270 if (r) 262 if (r)
271 return r; 263 return r;
272 } 264 }
@@ -291,9 +283,14 @@ int amdgpu_sync_rings(struct amdgpu_sync *sync,
291 int i, r; 283 int i, r;
292 284
293 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 285 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
294 struct amdgpu_fence *fence = sync->sync_to[i];
295 struct amdgpu_semaphore *semaphore;
296 struct amdgpu_ring *other = adev->rings[i]; 286 struct amdgpu_ring *other = adev->rings[i];
287 struct amdgpu_semaphore *semaphore;
288 struct amdgpu_fence *fence;
289
290 if (!sync->sync_to[i])
291 continue;
292
293 fence = to_amdgpu_fence(sync->sync_to[i]);
297 294
298 /* check if we really need to sync */ 295 /* check if we really need to sync */
299 if (!amdgpu_fence_need_sync(fence, ring)) 296 if (!amdgpu_fence_need_sync(fence, ring))
@@ -378,7 +375,7 @@ void amdgpu_sync_free(struct amdgpu_device *adev,
378 amdgpu_semaphore_free(adev, &sync->semaphores[i], fence); 375 amdgpu_semaphore_free(adev, &sync->semaphores[i], fence);
379 376
380 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) 377 for (i = 0; i < AMDGPU_MAX_RINGS; ++i)
381 amdgpu_fence_unref(&sync->sync_to[i]); 378 fence_put(sync->sync_to[i]);
382 379
383 fence_put(sync->last_vm_update); 380 fence_put(sync->last_vm_update);
384} 381}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
index 961d7265c286..76ecbaf72a2e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
@@ -111,7 +111,7 @@ TRACE_EVENT(amdgpu_vm_bo_unmap,
111 __entry->offset, __entry->flags) 111 __entry->offset, __entry->flags)
112); 112);
113 113
114TRACE_EVENT(amdgpu_vm_bo_update, 114DECLARE_EVENT_CLASS(amdgpu_vm_mapping,
115 TP_PROTO(struct amdgpu_bo_va_mapping *mapping), 115 TP_PROTO(struct amdgpu_bo_va_mapping *mapping),
116 TP_ARGS(mapping), 116 TP_ARGS(mapping),
117 TP_STRUCT__entry( 117 TP_STRUCT__entry(
@@ -129,6 +129,16 @@ TRACE_EVENT(amdgpu_vm_bo_update,
129 __entry->soffset, __entry->eoffset, __entry->flags) 129 __entry->soffset, __entry->eoffset, __entry->flags)
130); 130);
131 131
132DEFINE_EVENT(amdgpu_vm_mapping, amdgpu_vm_bo_update,
133 TP_PROTO(struct amdgpu_bo_va_mapping *mapping),
134 TP_ARGS(mapping)
135);
136
137DEFINE_EVENT(amdgpu_vm_mapping, amdgpu_vm_bo_mapping,
138 TP_PROTO(struct amdgpu_bo_va_mapping *mapping),
139 TP_ARGS(mapping)
140);
141
132TRACE_EVENT(amdgpu_vm_set_page, 142TRACE_EVENT(amdgpu_vm_set_page,
133 TP_PROTO(uint64_t pe, uint64_t addr, unsigned count, 143 TP_PROTO(uint64_t pe, uint64_t addr, unsigned count,
134 uint32_t incr, uint32_t flags), 144 uint32_t incr, uint32_t flags),
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 364cbe975332..81bb8e9fc26d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -1041,7 +1041,7 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring,
1041 WARN_ON(ib->length_dw > num_dw); 1041 WARN_ON(ib->length_dw > num_dw);
1042 r = amdgpu_sched_ib_submit_kernel_helper(adev, ring, ib, 1, 1042 r = amdgpu_sched_ib_submit_kernel_helper(adev, ring, ib, 1,
1043 &amdgpu_vm_free_job, 1043 &amdgpu_vm_free_job,
1044 AMDGPU_FENCE_OWNER_MOVE, 1044 AMDGPU_FENCE_OWNER_UNDEFINED,
1045 fence); 1045 fence);
1046 if (r) 1046 if (r)
1047 goto error_free; 1047 goto error_free;
@@ -1072,6 +1072,11 @@ static int amdgpu_mm_dump_table(struct seq_file *m, void *data)
1072 spin_lock(&glob->lru_lock); 1072 spin_lock(&glob->lru_lock);
1073 ret = drm_mm_dump_table(m, mm); 1073 ret = drm_mm_dump_table(m, mm);
1074 spin_unlock(&glob->lru_lock); 1074 spin_unlock(&glob->lru_lock);
1075 if (ttm_pl == TTM_PL_VRAM)
1076 seq_printf(m, "man size:%llu pages, ram usage:%luMB, vis usage:%luMB\n",
1077 adev->mman.bdev.man[ttm_pl].size,
1078 atomic64_read(&adev->vram_usage) >> 20,
1079 atomic64_read(&adev->vram_vis_usage) >> 20);
1075 return ret; 1080 return ret;
1076} 1081}
1077 1082
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index d0312364d950..53f987aeeacf 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -53,6 +53,7 @@
53#define FIRMWARE_TONGA "amdgpu/tonga_uvd.bin" 53#define FIRMWARE_TONGA "amdgpu/tonga_uvd.bin"
54#define FIRMWARE_CARRIZO "amdgpu/carrizo_uvd.bin" 54#define FIRMWARE_CARRIZO "amdgpu/carrizo_uvd.bin"
55#define FIRMWARE_FIJI "amdgpu/fiji_uvd.bin" 55#define FIRMWARE_FIJI "amdgpu/fiji_uvd.bin"
56#define FIRMWARE_STONEY "amdgpu/stoney_uvd.bin"
56 57
57/** 58/**
58 * amdgpu_uvd_cs_ctx - Command submission parser context 59 * amdgpu_uvd_cs_ctx - Command submission parser context
@@ -83,6 +84,7 @@ MODULE_FIRMWARE(FIRMWARE_MULLINS);
83MODULE_FIRMWARE(FIRMWARE_TONGA); 84MODULE_FIRMWARE(FIRMWARE_TONGA);
84MODULE_FIRMWARE(FIRMWARE_CARRIZO); 85MODULE_FIRMWARE(FIRMWARE_CARRIZO);
85MODULE_FIRMWARE(FIRMWARE_FIJI); 86MODULE_FIRMWARE(FIRMWARE_FIJI);
87MODULE_FIRMWARE(FIRMWARE_STONEY);
86 88
87static void amdgpu_uvd_note_usage(struct amdgpu_device *adev); 89static void amdgpu_uvd_note_usage(struct amdgpu_device *adev);
88static void amdgpu_uvd_idle_work_handler(struct work_struct *work); 90static void amdgpu_uvd_idle_work_handler(struct work_struct *work);
@@ -124,6 +126,9 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
124 case CHIP_CARRIZO: 126 case CHIP_CARRIZO:
125 fw_name = FIRMWARE_CARRIZO; 127 fw_name = FIRMWARE_CARRIZO;
126 break; 128 break;
129 case CHIP_STONEY:
130 fw_name = FIRMWARE_STONEY;
131 break;
127 default: 132 default:
128 return -EINVAL; 133 return -EINVAL;
129 } 134 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index 74f2038ac747..03f0c3bae516 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -49,6 +49,7 @@
49#define FIRMWARE_TONGA "amdgpu/tonga_vce.bin" 49#define FIRMWARE_TONGA "amdgpu/tonga_vce.bin"
50#define FIRMWARE_CARRIZO "amdgpu/carrizo_vce.bin" 50#define FIRMWARE_CARRIZO "amdgpu/carrizo_vce.bin"
51#define FIRMWARE_FIJI "amdgpu/fiji_vce.bin" 51#define FIRMWARE_FIJI "amdgpu/fiji_vce.bin"
52#define FIRMWARE_STONEY "amdgpu/stoney_vce.bin"
52 53
53#ifdef CONFIG_DRM_AMDGPU_CIK 54#ifdef CONFIG_DRM_AMDGPU_CIK
54MODULE_FIRMWARE(FIRMWARE_BONAIRE); 55MODULE_FIRMWARE(FIRMWARE_BONAIRE);
@@ -60,6 +61,7 @@ MODULE_FIRMWARE(FIRMWARE_MULLINS);
60MODULE_FIRMWARE(FIRMWARE_TONGA); 61MODULE_FIRMWARE(FIRMWARE_TONGA);
61MODULE_FIRMWARE(FIRMWARE_CARRIZO); 62MODULE_FIRMWARE(FIRMWARE_CARRIZO);
62MODULE_FIRMWARE(FIRMWARE_FIJI); 63MODULE_FIRMWARE(FIRMWARE_FIJI);
64MODULE_FIRMWARE(FIRMWARE_STONEY);
63 65
64static void amdgpu_vce_idle_work_handler(struct work_struct *work); 66static void amdgpu_vce_idle_work_handler(struct work_struct *work);
65 67
@@ -106,6 +108,9 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
106 case CHIP_FIJI: 108 case CHIP_FIJI:
107 fw_name = FIRMWARE_FIJI; 109 fw_name = FIRMWARE_FIJI;
108 break; 110 break;
111 case CHIP_STONEY:
112 fw_name = FIRMWARE_STONEY;
113 break;
109 114
110 default: 115 default:
111 return -EINVAL; 116 return -EINVAL;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 53d551f2d839..633a32a48560 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -90,11 +90,9 @@ struct amdgpu_bo_list_entry *amdgpu_vm_get_bos(struct amdgpu_device *adev,
90 struct amdgpu_bo_list_entry *list; 90 struct amdgpu_bo_list_entry *list;
91 unsigned i, idx; 91 unsigned i, idx;
92 92
93 mutex_lock(&vm->mutex);
94 list = drm_malloc_ab(vm->max_pde_used + 2, 93 list = drm_malloc_ab(vm->max_pde_used + 2,
95 sizeof(struct amdgpu_bo_list_entry)); 94 sizeof(struct amdgpu_bo_list_entry));
96 if (!list) { 95 if (!list) {
97 mutex_unlock(&vm->mutex);
98 return NULL; 96 return NULL;
99 } 97 }
100 98
@@ -119,7 +117,6 @@ struct amdgpu_bo_list_entry *amdgpu_vm_get_bos(struct amdgpu_device *adev,
119 list[idx].tv.shared = true; 117 list[idx].tv.shared = true;
120 list_add(&list[idx++].tv.head, head); 118 list_add(&list[idx++].tv.head, head);
121 } 119 }
122 mutex_unlock(&vm->mutex);
123 120
124 return list; 121 return list;
125} 122}
@@ -138,7 +135,7 @@ struct amdgpu_bo_list_entry *amdgpu_vm_get_bos(struct amdgpu_device *adev,
138int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, 135int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
139 struct amdgpu_sync *sync) 136 struct amdgpu_sync *sync)
140{ 137{
141 struct amdgpu_fence *best[AMDGPU_MAX_RINGS] = {}; 138 struct fence *best[AMDGPU_MAX_RINGS] = {};
142 struct amdgpu_vm_id *vm_id = &vm->ids[ring->idx]; 139 struct amdgpu_vm_id *vm_id = &vm->ids[ring->idx];
143 struct amdgpu_device *adev = ring->adev; 140 struct amdgpu_device *adev = ring->adev;
144 141
@@ -147,15 +144,18 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
147 144
148 /* check if the id is still valid */ 145 /* check if the id is still valid */
149 if (vm_id->id && vm_id->last_id_use && 146 if (vm_id->id && vm_id->last_id_use &&
150 vm_id->last_id_use == adev->vm_manager.active[vm_id->id]) 147 vm_id->last_id_use == adev->vm_manager.active[vm_id->id]) {
148 trace_amdgpu_vm_grab_id(vm_id->id, ring->idx);
151 return 0; 149 return 0;
150 }
152 151
153 /* we definately need to flush */ 152 /* we definately need to flush */
154 vm_id->pd_gpu_addr = ~0ll; 153 vm_id->pd_gpu_addr = ~0ll;
155 154
156 /* skip over VMID 0, since it is the system VM */ 155 /* skip over VMID 0, since it is the system VM */
157 for (i = 1; i < adev->vm_manager.nvm; ++i) { 156 for (i = 1; i < adev->vm_manager.nvm; ++i) {
158 struct amdgpu_fence *fence = adev->vm_manager.active[i]; 157 struct fence *fence = adev->vm_manager.active[i];
158 struct amdgpu_ring *fring;
159 159
160 if (fence == NULL) { 160 if (fence == NULL) {
161 /* found a free one */ 161 /* found a free one */
@@ -164,21 +164,23 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
164 return 0; 164 return 0;
165 } 165 }
166 166
167 if (amdgpu_fence_is_earlier(fence, best[fence->ring->idx])) { 167 fring = amdgpu_ring_from_fence(fence);
168 best[fence->ring->idx] = fence; 168 if (best[fring->idx] == NULL ||
169 choices[fence->ring == ring ? 0 : 1] = i; 169 fence_is_later(best[fring->idx], fence)) {
170 best[fring->idx] = fence;
171 choices[fring == ring ? 0 : 1] = i;
170 } 172 }
171 } 173 }
172 174
173 for (i = 0; i < 2; ++i) { 175 for (i = 0; i < 2; ++i) {
174 if (choices[i]) { 176 if (choices[i]) {
175 struct amdgpu_fence *fence; 177 struct fence *fence;
176 178
177 fence = adev->vm_manager.active[choices[i]]; 179 fence = adev->vm_manager.active[choices[i]];
178 vm_id->id = choices[i]; 180 vm_id->id = choices[i];
179 181
180 trace_amdgpu_vm_grab_id(choices[i], ring->idx); 182 trace_amdgpu_vm_grab_id(choices[i], ring->idx);
181 return amdgpu_sync_fence(ring->adev, sync, &fence->base); 183 return amdgpu_sync_fence(ring->adev, sync, fence);
182 } 184 }
183 } 185 }
184 186
@@ -247,11 +249,11 @@ void amdgpu_vm_fence(struct amdgpu_device *adev,
247 unsigned ridx = fence->ring->idx; 249 unsigned ridx = fence->ring->idx;
248 unsigned vm_id = vm->ids[ridx].id; 250 unsigned vm_id = vm->ids[ridx].id;
249 251
250 amdgpu_fence_unref(&adev->vm_manager.active[vm_id]); 252 fence_put(adev->vm_manager.active[vm_id]);
251 adev->vm_manager.active[vm_id] = amdgpu_fence_ref(fence); 253 adev->vm_manager.active[vm_id] = fence_get(&fence->base);
252 254
253 amdgpu_fence_unref(&vm->ids[ridx].last_id_use); 255 fence_put(vm->ids[ridx].last_id_use);
254 vm->ids[ridx].last_id_use = amdgpu_fence_ref(fence); 256 vm->ids[ridx].last_id_use = fence_get(&fence->base);
255} 257}
256 258
257/** 259/**
@@ -852,6 +854,14 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
852 return r; 854 return r;
853 } 855 }
854 856
857 if (trace_amdgpu_vm_bo_mapping_enabled()) {
858 list_for_each_entry(mapping, &bo_va->valids, list)
859 trace_amdgpu_vm_bo_mapping(mapping);
860
861 list_for_each_entry(mapping, &bo_va->invalids, list)
862 trace_amdgpu_vm_bo_mapping(mapping);
863 }
864
855 spin_lock(&vm->status_lock); 865 spin_lock(&vm->status_lock);
856 list_splice_init(&bo_va->invalids, &bo_va->valids); 866 list_splice_init(&bo_va->invalids, &bo_va->valids);
857 list_del_init(&bo_va->vm_status); 867 list_del_init(&bo_va->vm_status);
@@ -962,9 +972,7 @@ struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev,
962 INIT_LIST_HEAD(&bo_va->invalids); 972 INIT_LIST_HEAD(&bo_va->invalids);
963 INIT_LIST_HEAD(&bo_va->vm_status); 973 INIT_LIST_HEAD(&bo_va->vm_status);
964 974
965 mutex_lock(&vm->mutex);
966 list_add_tail(&bo_va->bo_list, &bo->va); 975 list_add_tail(&bo_va->bo_list, &bo->va);
967 mutex_unlock(&vm->mutex);
968 976
969 return bo_va; 977 return bo_va;
970} 978}
@@ -1017,8 +1025,6 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
1017 return -EINVAL; 1025 return -EINVAL;
1018 } 1026 }
1019 1027
1020 mutex_lock(&vm->mutex);
1021
1022 saddr /= AMDGPU_GPU_PAGE_SIZE; 1028 saddr /= AMDGPU_GPU_PAGE_SIZE;
1023 eaddr /= AMDGPU_GPU_PAGE_SIZE; 1029 eaddr /= AMDGPU_GPU_PAGE_SIZE;
1024 1030
@@ -1032,14 +1038,14 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
1032 tmp->it.start, tmp->it.last + 1); 1038 tmp->it.start, tmp->it.last + 1);
1033 amdgpu_bo_unreserve(bo_va->bo); 1039 amdgpu_bo_unreserve(bo_va->bo);
1034 r = -EINVAL; 1040 r = -EINVAL;
1035 goto error_unlock; 1041 goto error;
1036 } 1042 }
1037 1043
1038 mapping = kmalloc(sizeof(*mapping), GFP_KERNEL); 1044 mapping = kmalloc(sizeof(*mapping), GFP_KERNEL);
1039 if (!mapping) { 1045 if (!mapping) {
1040 amdgpu_bo_unreserve(bo_va->bo); 1046 amdgpu_bo_unreserve(bo_va->bo);
1041 r = -ENOMEM; 1047 r = -ENOMEM;
1042 goto error_unlock; 1048 goto error;
1043 } 1049 }
1044 1050
1045 INIT_LIST_HEAD(&mapping->list); 1051 INIT_LIST_HEAD(&mapping->list);
@@ -1071,9 +1077,6 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
1071 if (vm->page_tables[pt_idx].bo) 1077 if (vm->page_tables[pt_idx].bo)
1072 continue; 1078 continue;
1073 1079
1074 /* drop mutex to allocate and clear page table */
1075 mutex_unlock(&vm->mutex);
1076
1077 ww_mutex_lock(&resv->lock, NULL); 1080 ww_mutex_lock(&resv->lock, NULL);
1078 r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8, 1081 r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8,
1079 AMDGPU_GPU_PAGE_SIZE, true, 1082 AMDGPU_GPU_PAGE_SIZE, true,
@@ -1090,32 +1093,19 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
1090 goto error_free; 1093 goto error_free;
1091 } 1094 }
1092 1095
1093 /* aquire mutex again */
1094 mutex_lock(&vm->mutex);
1095 if (vm->page_tables[pt_idx].bo) {
1096 /* someone else allocated the pt in the meantime */
1097 mutex_unlock(&vm->mutex);
1098 amdgpu_bo_unref(&pt);
1099 mutex_lock(&vm->mutex);
1100 continue;
1101 }
1102
1103 vm->page_tables[pt_idx].addr = 0; 1096 vm->page_tables[pt_idx].addr = 0;
1104 vm->page_tables[pt_idx].bo = pt; 1097 vm->page_tables[pt_idx].bo = pt;
1105 } 1098 }
1106 1099
1107 mutex_unlock(&vm->mutex);
1108 return 0; 1100 return 0;
1109 1101
1110error_free: 1102error_free:
1111 mutex_lock(&vm->mutex);
1112 list_del(&mapping->list); 1103 list_del(&mapping->list);
1113 interval_tree_remove(&mapping->it, &vm->va); 1104 interval_tree_remove(&mapping->it, &vm->va);
1114 trace_amdgpu_vm_bo_unmap(bo_va, mapping); 1105 trace_amdgpu_vm_bo_unmap(bo_va, mapping);
1115 kfree(mapping); 1106 kfree(mapping);
1116 1107
1117error_unlock: 1108error:
1118 mutex_unlock(&vm->mutex);
1119 return r; 1109 return r;
1120} 1110}
1121 1111
@@ -1160,7 +1150,6 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,
1160 } 1150 }
1161 } 1151 }
1162 1152
1163 mutex_lock(&vm->mutex);
1164 list_del(&mapping->list); 1153 list_del(&mapping->list);
1165 interval_tree_remove(&mapping->it, &vm->va); 1154 interval_tree_remove(&mapping->it, &vm->va);
1166 trace_amdgpu_vm_bo_unmap(bo_va, mapping); 1155 trace_amdgpu_vm_bo_unmap(bo_va, mapping);
@@ -1169,7 +1158,6 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,
1169 list_add(&mapping->list, &vm->freed); 1158 list_add(&mapping->list, &vm->freed);
1170 else 1159 else
1171 kfree(mapping); 1160 kfree(mapping);
1172 mutex_unlock(&vm->mutex);
1173 amdgpu_bo_unreserve(bo_va->bo); 1161 amdgpu_bo_unreserve(bo_va->bo);
1174 1162
1175 return 0; 1163 return 0;
@@ -1193,8 +1181,6 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
1193 1181
1194 list_del(&bo_va->bo_list); 1182 list_del(&bo_va->bo_list);
1195 1183
1196 mutex_lock(&vm->mutex);
1197
1198 spin_lock(&vm->status_lock); 1184 spin_lock(&vm->status_lock);
1199 list_del(&bo_va->vm_status); 1185 list_del(&bo_va->vm_status);
1200 spin_unlock(&vm->status_lock); 1186 spin_unlock(&vm->status_lock);
@@ -1213,8 +1199,6 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
1213 1199
1214 fence_put(bo_va->last_pt_update); 1200 fence_put(bo_va->last_pt_update);
1215 kfree(bo_va); 1201 kfree(bo_va);
1216
1217 mutex_unlock(&vm->mutex);
1218} 1202}
1219 1203
1220/** 1204/**
@@ -1332,7 +1316,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1332 1316
1333 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 1317 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
1334 fence_put(vm->ids[i].flushed_updates); 1318 fence_put(vm->ids[i].flushed_updates);
1335 amdgpu_fence_unref(&vm->ids[i].last_id_use); 1319 fence_put(vm->ids[i].last_id_use);
1336 } 1320 }
1337 1321
1338 mutex_destroy(&vm->mutex); 1322 mutex_destroy(&vm->mutex);
diff --git a/drivers/gpu/drm/amd/amdgpu/atom.c b/drivers/gpu/drm/amd/amdgpu/atom.c
index a0346a90d805..1b50e6c13fb3 100644
--- a/drivers/gpu/drm/amd/amdgpu/atom.c
+++ b/drivers/gpu/drm/amd/amdgpu/atom.c
@@ -685,6 +685,27 @@ static void atom_op_div(atom_exec_context *ctx, int *ptr, int arg)
685 } 685 }
686} 686}
687 687
688static void atom_op_div32(atom_exec_context *ctx, int *ptr, int arg)
689{
690 uint64_t val64;
691 uint8_t attr = U8((*ptr)++);
692 uint32_t dst, src;
693 SDEBUG(" src1: ");
694 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1);
695 SDEBUG(" src2: ");
696 src = atom_get_src(ctx, attr, ptr);
697 if (src != 0) {
698 val64 = dst;
699 val64 |= ((uint64_t)ctx->ctx->divmul[1]) << 32;
700 do_div(val64, src);
701 ctx->ctx->divmul[0] = lower_32_bits(val64);
702 ctx->ctx->divmul[1] = upper_32_bits(val64);
703 } else {
704 ctx->ctx->divmul[0] = 0;
705 ctx->ctx->divmul[1] = 0;
706 }
707}
708
688static void atom_op_eot(atom_exec_context *ctx, int *ptr, int arg) 709static void atom_op_eot(atom_exec_context *ctx, int *ptr, int arg)
689{ 710{
690 /* functionally, a nop */ 711 /* functionally, a nop */
@@ -788,6 +809,20 @@ static void atom_op_mul(atom_exec_context *ctx, int *ptr, int arg)
788 ctx->ctx->divmul[0] = dst * src; 809 ctx->ctx->divmul[0] = dst * src;
789} 810}
790 811
812static void atom_op_mul32(atom_exec_context *ctx, int *ptr, int arg)
813{
814 uint64_t val64;
815 uint8_t attr = U8((*ptr)++);
816 uint32_t dst, src;
817 SDEBUG(" src1: ");
818 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1);
819 SDEBUG(" src2: ");
820 src = atom_get_src(ctx, attr, ptr);
821 val64 = (uint64_t)dst * (uint64_t)src;
822 ctx->ctx->divmul[0] = lower_32_bits(val64);
823 ctx->ctx->divmul[1] = upper_32_bits(val64);
824}
825
791static void atom_op_nop(atom_exec_context *ctx, int *ptr, int arg) 826static void atom_op_nop(atom_exec_context *ctx, int *ptr, int arg)
792{ 827{
793 /* nothing */ 828 /* nothing */
@@ -1022,7 +1057,15 @@ static void atom_op_xor(atom_exec_context *ctx, int *ptr, int arg)
1022 1057
1023static void atom_op_debug(atom_exec_context *ctx, int *ptr, int arg) 1058static void atom_op_debug(atom_exec_context *ctx, int *ptr, int arg)
1024{ 1059{
1025 printk(KERN_INFO "unimplemented!\n"); 1060 uint8_t val = U8((*ptr)++);
1061 SDEBUG("DEBUG output: 0x%02X\n", val);
1062}
1063
1064static void atom_op_processds(atom_exec_context *ctx, int *ptr, int arg)
1065{
1066 uint16_t val = U16(*ptr);
1067 (*ptr) += val + 2;
1068 SDEBUG("PROCESSDS output: 0x%02X\n", val);
1026} 1069}
1027 1070
1028static struct { 1071static struct {
@@ -1151,7 +1194,13 @@ static struct {
1151 atom_op_shr, ATOM_ARG_FB}, { 1194 atom_op_shr, ATOM_ARG_FB}, {
1152 atom_op_shr, ATOM_ARG_PLL}, { 1195 atom_op_shr, ATOM_ARG_PLL}, {
1153 atom_op_shr, ATOM_ARG_MC}, { 1196 atom_op_shr, ATOM_ARG_MC}, {
1154atom_op_debug, 0},}; 1197 atom_op_debug, 0}, {
1198 atom_op_processds, 0}, {
1199 atom_op_mul32, ATOM_ARG_PS}, {
1200 atom_op_mul32, ATOM_ARG_WS}, {
1201 atom_op_div32, ATOM_ARG_PS}, {
1202 atom_op_div32, ATOM_ARG_WS},
1203};
1155 1204
1156static int amdgpu_atom_execute_table_locked(struct atom_context *ctx, int index, uint32_t * params) 1205static int amdgpu_atom_execute_table_locked(struct atom_context *ctx, int index, uint32_t * params)
1157{ 1206{
diff --git a/drivers/gpu/drm/amd/amdgpu/atom.h b/drivers/gpu/drm/amd/amdgpu/atom.h
index 09d0f8230708..fece8f45dc7a 100644
--- a/drivers/gpu/drm/amd/amdgpu/atom.h
+++ b/drivers/gpu/drm/amd/amdgpu/atom.h
@@ -60,7 +60,7 @@
60#define ATOM_CT_PS_MASK 0x7F 60#define ATOM_CT_PS_MASK 0x7F
61#define ATOM_CT_CODE_PTR 6 61#define ATOM_CT_CODE_PTR 6
62 62
63#define ATOM_OP_CNT 123 63#define ATOM_OP_CNT 127
64#define ATOM_OP_EOT 91 64#define ATOM_OP_EOT 91
65 65
66#define ATOM_CASE_MAGIC 0x63 66#define ATOM_CASE_MAGIC 0x63
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
index 9ea9de457da3..5f712ceddf08 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
@@ -96,7 +96,7 @@ static int cik_sdma_init_microcode(struct amdgpu_device *adev)
96{ 96{
97 const char *chip_name; 97 const char *chip_name;
98 char fw_name[30]; 98 char fw_name[30];
99 int err, i; 99 int err = 0, i;
100 100
101 DRM_DEBUG("\n"); 101 DRM_DEBUG("\n");
102 102
@@ -119,24 +119,24 @@ static int cik_sdma_init_microcode(struct amdgpu_device *adev)
119 default: BUG(); 119 default: BUG();
120 } 120 }
121 121
122 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 122 for (i = 0; i < adev->sdma.num_instances; i++) {
123 if (i == 0) 123 if (i == 0)
124 snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", chip_name); 124 snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", chip_name);
125 else 125 else
126 snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma1.bin", chip_name); 126 snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma1.bin", chip_name);
127 err = request_firmware(&adev->sdma[i].fw, fw_name, adev->dev); 127 err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev);
128 if (err) 128 if (err)
129 goto out; 129 goto out;
130 err = amdgpu_ucode_validate(adev->sdma[i].fw); 130 err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
131 } 131 }
132out: 132out:
133 if (err) { 133 if (err) {
134 printk(KERN_ERR 134 printk(KERN_ERR
135 "cik_sdma: Failed to load firmware \"%s\"\n", 135 "cik_sdma: Failed to load firmware \"%s\"\n",
136 fw_name); 136 fw_name);
137 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 137 for (i = 0; i < adev->sdma.num_instances; i++) {
138 release_firmware(adev->sdma[i].fw); 138 release_firmware(adev->sdma.instance[i].fw);
139 adev->sdma[i].fw = NULL; 139 adev->sdma.instance[i].fw = NULL;
140 } 140 }
141 } 141 }
142 return err; 142 return err;
@@ -168,7 +168,7 @@ static uint32_t cik_sdma_ring_get_rptr(struct amdgpu_ring *ring)
168static uint32_t cik_sdma_ring_get_wptr(struct amdgpu_ring *ring) 168static uint32_t cik_sdma_ring_get_wptr(struct amdgpu_ring *ring)
169{ 169{
170 struct amdgpu_device *adev = ring->adev; 170 struct amdgpu_device *adev = ring->adev;
171 u32 me = (ring == &adev->sdma[0].ring) ? 0 : 1; 171 u32 me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1;
172 172
173 return (RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me]) & 0x3fffc) >> 2; 173 return (RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me]) & 0x3fffc) >> 2;
174} 174}
@@ -183,14 +183,14 @@ static uint32_t cik_sdma_ring_get_wptr(struct amdgpu_ring *ring)
183static void cik_sdma_ring_set_wptr(struct amdgpu_ring *ring) 183static void cik_sdma_ring_set_wptr(struct amdgpu_ring *ring)
184{ 184{
185 struct amdgpu_device *adev = ring->adev; 185 struct amdgpu_device *adev = ring->adev;
186 u32 me = (ring == &adev->sdma[0].ring) ? 0 : 1; 186 u32 me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1;
187 187
188 WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], (ring->wptr << 2) & 0x3fffc); 188 WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], (ring->wptr << 2) & 0x3fffc);
189} 189}
190 190
191static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) 191static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
192{ 192{
193 struct amdgpu_sdma *sdma = amdgpu_get_sdma_instance(ring); 193 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring);
194 int i; 194 int i;
195 195
196 for (i = 0; i < count; i++) 196 for (i = 0; i < count; i++)
@@ -248,7 +248,7 @@ static void cik_sdma_ring_emit_hdp_flush(struct amdgpu_ring *ring)
248 SDMA_POLL_REG_MEM_EXTRA_FUNC(3)); /* == */ 248 SDMA_POLL_REG_MEM_EXTRA_FUNC(3)); /* == */
249 u32 ref_and_mask; 249 u32 ref_and_mask;
250 250
251 if (ring == &ring->adev->sdma[0].ring) 251 if (ring == &ring->adev->sdma.instance[0].ring)
252 ref_and_mask = GPU_HDP_FLUSH_DONE__SDMA0_MASK; 252 ref_and_mask = GPU_HDP_FLUSH_DONE__SDMA0_MASK;
253 else 253 else
254 ref_and_mask = GPU_HDP_FLUSH_DONE__SDMA1_MASK; 254 ref_and_mask = GPU_HDP_FLUSH_DONE__SDMA1_MASK;
@@ -327,8 +327,8 @@ static bool cik_sdma_ring_emit_semaphore(struct amdgpu_ring *ring,
327 */ 327 */
328static void cik_sdma_gfx_stop(struct amdgpu_device *adev) 328static void cik_sdma_gfx_stop(struct amdgpu_device *adev)
329{ 329{
330 struct amdgpu_ring *sdma0 = &adev->sdma[0].ring; 330 struct amdgpu_ring *sdma0 = &adev->sdma.instance[0].ring;
331 struct amdgpu_ring *sdma1 = &adev->sdma[1].ring; 331 struct amdgpu_ring *sdma1 = &adev->sdma.instance[1].ring;
332 u32 rb_cntl; 332 u32 rb_cntl;
333 int i; 333 int i;
334 334
@@ -336,7 +336,7 @@ static void cik_sdma_gfx_stop(struct amdgpu_device *adev)
336 (adev->mman.buffer_funcs_ring == sdma1)) 336 (adev->mman.buffer_funcs_ring == sdma1))
337 amdgpu_ttm_set_active_vram_size(adev, adev->mc.visible_vram_size); 337 amdgpu_ttm_set_active_vram_size(adev, adev->mc.visible_vram_size);
338 338
339 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 339 for (i = 0; i < adev->sdma.num_instances; i++) {
340 rb_cntl = RREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i]); 340 rb_cntl = RREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i]);
341 rb_cntl &= ~SDMA0_GFX_RB_CNTL__RB_ENABLE_MASK; 341 rb_cntl &= ~SDMA0_GFX_RB_CNTL__RB_ENABLE_MASK;
342 WREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i], rb_cntl); 342 WREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i], rb_cntl);
@@ -376,7 +376,7 @@ static void cik_sdma_enable(struct amdgpu_device *adev, bool enable)
376 cik_sdma_rlc_stop(adev); 376 cik_sdma_rlc_stop(adev);
377 } 377 }
378 378
379 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 379 for (i = 0; i < adev->sdma.num_instances; i++) {
380 me_cntl = RREG32(mmSDMA0_F32_CNTL + sdma_offsets[i]); 380 me_cntl = RREG32(mmSDMA0_F32_CNTL + sdma_offsets[i]);
381 if (enable) 381 if (enable)
382 me_cntl &= ~SDMA0_F32_CNTL__HALT_MASK; 382 me_cntl &= ~SDMA0_F32_CNTL__HALT_MASK;
@@ -402,8 +402,8 @@ static int cik_sdma_gfx_resume(struct amdgpu_device *adev)
402 u32 wb_offset; 402 u32 wb_offset;
403 int i, j, r; 403 int i, j, r;
404 404
405 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 405 for (i = 0; i < adev->sdma.num_instances; i++) {
406 ring = &adev->sdma[i].ring; 406 ring = &adev->sdma.instance[i].ring;
407 wb_offset = (ring->rptr_offs * 4); 407 wb_offset = (ring->rptr_offs * 4);
408 408
409 mutex_lock(&adev->srbm_mutex); 409 mutex_lock(&adev->srbm_mutex);
@@ -502,26 +502,25 @@ static int cik_sdma_load_microcode(struct amdgpu_device *adev)
502 u32 fw_size; 502 u32 fw_size;
503 int i, j; 503 int i, j;
504 504
505 if (!adev->sdma[0].fw || !adev->sdma[1].fw)
506 return -EINVAL;
507
508 /* halt the MEs */ 505 /* halt the MEs */
509 cik_sdma_enable(adev, false); 506 cik_sdma_enable(adev, false);
510 507
511 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 508 for (i = 0; i < adev->sdma.num_instances; i++) {
512 hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma[i].fw->data; 509 if (!adev->sdma.instance[i].fw)
510 return -EINVAL;
511 hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma.instance[i].fw->data;
513 amdgpu_ucode_print_sdma_hdr(&hdr->header); 512 amdgpu_ucode_print_sdma_hdr(&hdr->header);
514 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; 513 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
515 adev->sdma[i].fw_version = le32_to_cpu(hdr->header.ucode_version); 514 adev->sdma.instance[i].fw_version = le32_to_cpu(hdr->header.ucode_version);
516 adev->sdma[i].feature_version = le32_to_cpu(hdr->ucode_feature_version); 515 adev->sdma.instance[i].feature_version = le32_to_cpu(hdr->ucode_feature_version);
517 if (adev->sdma[i].feature_version >= 20) 516 if (adev->sdma.instance[i].feature_version >= 20)
518 adev->sdma[i].burst_nop = true; 517 adev->sdma.instance[i].burst_nop = true;
519 fw_data = (const __le32 *) 518 fw_data = (const __le32 *)
520 (adev->sdma[i].fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 519 (adev->sdma.instance[i].fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
521 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], 0); 520 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], 0);
522 for (j = 0; j < fw_size; j++) 521 for (j = 0; j < fw_size; j++)
523 WREG32(mmSDMA0_UCODE_DATA + sdma_offsets[i], le32_to_cpup(fw_data++)); 522 WREG32(mmSDMA0_UCODE_DATA + sdma_offsets[i], le32_to_cpup(fw_data++));
524 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], adev->sdma[i].fw_version); 523 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], adev->sdma.instance[i].fw_version);
525 } 524 }
526 525
527 return 0; 526 return 0;
@@ -830,7 +829,7 @@ static void cik_sdma_vm_set_pte_pde(struct amdgpu_ib *ib,
830 */ 829 */
831static void cik_sdma_vm_pad_ib(struct amdgpu_ib *ib) 830static void cik_sdma_vm_pad_ib(struct amdgpu_ib *ib)
832{ 831{
833 struct amdgpu_sdma *sdma = amdgpu_get_sdma_instance(ib->ring); 832 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ib->ring);
834 u32 pad_count; 833 u32 pad_count;
835 int i; 834 int i;
836 835
@@ -934,6 +933,8 @@ static int cik_sdma_early_init(void *handle)
934{ 933{
935 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 934 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
936 935
936 adev->sdma.num_instances = SDMA_MAX_INSTANCE;
937
937 cik_sdma_set_ring_funcs(adev); 938 cik_sdma_set_ring_funcs(adev);
938 cik_sdma_set_irq_funcs(adev); 939 cik_sdma_set_irq_funcs(adev);
939 cik_sdma_set_buffer_funcs(adev); 940 cik_sdma_set_buffer_funcs(adev);
@@ -946,7 +947,7 @@ static int cik_sdma_sw_init(void *handle)
946{ 947{
947 struct amdgpu_ring *ring; 948 struct amdgpu_ring *ring;
948 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 949 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
949 int r; 950 int r, i;
950 951
951 r = cik_sdma_init_microcode(adev); 952 r = cik_sdma_init_microcode(adev);
952 if (r) { 953 if (r) {
@@ -955,43 +956,33 @@ static int cik_sdma_sw_init(void *handle)
955 } 956 }
956 957
957 /* SDMA trap event */ 958 /* SDMA trap event */
958 r = amdgpu_irq_add_id(adev, 224, &adev->sdma_trap_irq); 959 r = amdgpu_irq_add_id(adev, 224, &adev->sdma.trap_irq);
959 if (r) 960 if (r)
960 return r; 961 return r;
961 962
962 /* SDMA Privileged inst */ 963 /* SDMA Privileged inst */
963 r = amdgpu_irq_add_id(adev, 241, &adev->sdma_illegal_inst_irq); 964 r = amdgpu_irq_add_id(adev, 241, &adev->sdma.illegal_inst_irq);
964 if (r) 965 if (r)
965 return r; 966 return r;
966 967
967 /* SDMA Privileged inst */ 968 /* SDMA Privileged inst */
968 r = amdgpu_irq_add_id(adev, 247, &adev->sdma_illegal_inst_irq); 969 r = amdgpu_irq_add_id(adev, 247, &adev->sdma.illegal_inst_irq);
969 if (r) 970 if (r)
970 return r; 971 return r;
971 972
972 ring = &adev->sdma[0].ring; 973 for (i = 0; i < adev->sdma.num_instances; i++) {
973 ring->ring_obj = NULL; 974 ring = &adev->sdma.instance[i].ring;
974 975 ring->ring_obj = NULL;
975 ring = &adev->sdma[1].ring; 976 sprintf(ring->name, "sdma%d", i);
976 ring->ring_obj = NULL; 977 r = amdgpu_ring_init(adev, ring, 256 * 1024,
977 978 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0), 0xf,
978 ring = &adev->sdma[0].ring; 979 &adev->sdma.trap_irq,
979 sprintf(ring->name, "sdma0"); 980 (i == 0) ?
980 r = amdgpu_ring_init(adev, ring, 256 * 1024, 981 AMDGPU_SDMA_IRQ_TRAP0 : AMDGPU_SDMA_IRQ_TRAP1,
981 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0), 0xf, 982 AMDGPU_RING_TYPE_SDMA);
982 &adev->sdma_trap_irq, AMDGPU_SDMA_IRQ_TRAP0, 983 if (r)
983 AMDGPU_RING_TYPE_SDMA); 984 return r;
984 if (r) 985 }
985 return r;
986
987 ring = &adev->sdma[1].ring;
988 sprintf(ring->name, "sdma1");
989 r = amdgpu_ring_init(adev, ring, 256 * 1024,
990 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0), 0xf,
991 &adev->sdma_trap_irq, AMDGPU_SDMA_IRQ_TRAP1,
992 AMDGPU_RING_TYPE_SDMA);
993 if (r)
994 return r;
995 986
996 return r; 987 return r;
997} 988}
@@ -999,9 +990,10 @@ static int cik_sdma_sw_init(void *handle)
999static int cik_sdma_sw_fini(void *handle) 990static int cik_sdma_sw_fini(void *handle)
1000{ 991{
1001 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 992 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
993 int i;
1002 994
1003 amdgpu_ring_fini(&adev->sdma[0].ring); 995 for (i = 0; i < adev->sdma.num_instances; i++)
1004 amdgpu_ring_fini(&adev->sdma[1].ring); 996 amdgpu_ring_fini(&adev->sdma.instance[i].ring);
1005 997
1006 return 0; 998 return 0;
1007} 999}
@@ -1078,7 +1070,7 @@ static void cik_sdma_print_status(void *handle)
1078 dev_info(adev->dev, "CIK SDMA registers\n"); 1070 dev_info(adev->dev, "CIK SDMA registers\n");
1079 dev_info(adev->dev, " SRBM_STATUS2=0x%08X\n", 1071 dev_info(adev->dev, " SRBM_STATUS2=0x%08X\n",
1080 RREG32(mmSRBM_STATUS2)); 1072 RREG32(mmSRBM_STATUS2));
1081 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 1073 for (i = 0; i < adev->sdma.num_instances; i++) {
1082 dev_info(adev->dev, " SDMA%d_STATUS_REG=0x%08X\n", 1074 dev_info(adev->dev, " SDMA%d_STATUS_REG=0x%08X\n",
1083 i, RREG32(mmSDMA0_STATUS_REG + sdma_offsets[i])); 1075 i, RREG32(mmSDMA0_STATUS_REG + sdma_offsets[i]));
1084 dev_info(adev->dev, " SDMA%d_ME_CNTL=0x%08X\n", 1076 dev_info(adev->dev, " SDMA%d_ME_CNTL=0x%08X\n",
@@ -1223,7 +1215,7 @@ static int cik_sdma_process_trap_irq(struct amdgpu_device *adev,
1223 case 0: 1215 case 0:
1224 switch (queue_id) { 1216 switch (queue_id) {
1225 case 0: 1217 case 0:
1226 amdgpu_fence_process(&adev->sdma[0].ring); 1218 amdgpu_fence_process(&adev->sdma.instance[0].ring);
1227 break; 1219 break;
1228 case 1: 1220 case 1:
1229 /* XXX compute */ 1221 /* XXX compute */
@@ -1236,7 +1228,7 @@ static int cik_sdma_process_trap_irq(struct amdgpu_device *adev,
1236 case 1: 1228 case 1:
1237 switch (queue_id) { 1229 switch (queue_id) {
1238 case 0: 1230 case 0:
1239 amdgpu_fence_process(&adev->sdma[1].ring); 1231 amdgpu_fence_process(&adev->sdma.instance[1].ring);
1240 break; 1232 break;
1241 case 1: 1233 case 1:
1242 /* XXX compute */ 1234 /* XXX compute */
@@ -1298,24 +1290,6 @@ const struct amd_ip_funcs cik_sdma_ip_funcs = {
1298 .set_powergating_state = cik_sdma_set_powergating_state, 1290 .set_powergating_state = cik_sdma_set_powergating_state,
1299}; 1291};
1300 1292
1301/**
1302 * cik_sdma_ring_is_lockup - Check if the DMA engine is locked up
1303 *
1304 * @ring: amdgpu_ring structure holding ring information
1305 *
1306 * Check if the async DMA engine is locked up (CIK).
1307 * Returns true if the engine appears to be locked up, false if not.
1308 */
1309static bool cik_sdma_ring_is_lockup(struct amdgpu_ring *ring)
1310{
1311
1312 if (cik_sdma_is_idle(ring->adev)) {
1313 amdgpu_ring_lockup_update(ring);
1314 return false;
1315 }
1316 return amdgpu_ring_test_lockup(ring);
1317}
1318
1319static const struct amdgpu_ring_funcs cik_sdma_ring_funcs = { 1293static const struct amdgpu_ring_funcs cik_sdma_ring_funcs = {
1320 .get_rptr = cik_sdma_ring_get_rptr, 1294 .get_rptr = cik_sdma_ring_get_rptr,
1321 .get_wptr = cik_sdma_ring_get_wptr, 1295 .get_wptr = cik_sdma_ring_get_wptr,
@@ -1328,14 +1302,15 @@ static const struct amdgpu_ring_funcs cik_sdma_ring_funcs = {
1328 .emit_hdp_flush = cik_sdma_ring_emit_hdp_flush, 1302 .emit_hdp_flush = cik_sdma_ring_emit_hdp_flush,
1329 .test_ring = cik_sdma_ring_test_ring, 1303 .test_ring = cik_sdma_ring_test_ring,
1330 .test_ib = cik_sdma_ring_test_ib, 1304 .test_ib = cik_sdma_ring_test_ib,
1331 .is_lockup = cik_sdma_ring_is_lockup,
1332 .insert_nop = cik_sdma_ring_insert_nop, 1305 .insert_nop = cik_sdma_ring_insert_nop,
1333}; 1306};
1334 1307
1335static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev) 1308static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev)
1336{ 1309{
1337 adev->sdma[0].ring.funcs = &cik_sdma_ring_funcs; 1310 int i;
1338 adev->sdma[1].ring.funcs = &cik_sdma_ring_funcs; 1311
1312 for (i = 0; i < adev->sdma.num_instances; i++)
1313 adev->sdma.instance[i].ring.funcs = &cik_sdma_ring_funcs;
1339} 1314}
1340 1315
1341static const struct amdgpu_irq_src_funcs cik_sdma_trap_irq_funcs = { 1316static const struct amdgpu_irq_src_funcs cik_sdma_trap_irq_funcs = {
@@ -1349,9 +1324,9 @@ static const struct amdgpu_irq_src_funcs cik_sdma_illegal_inst_irq_funcs = {
1349 1324
1350static void cik_sdma_set_irq_funcs(struct amdgpu_device *adev) 1325static void cik_sdma_set_irq_funcs(struct amdgpu_device *adev)
1351{ 1326{
1352 adev->sdma_trap_irq.num_types = AMDGPU_SDMA_IRQ_LAST; 1327 adev->sdma.trap_irq.num_types = AMDGPU_SDMA_IRQ_LAST;
1353 adev->sdma_trap_irq.funcs = &cik_sdma_trap_irq_funcs; 1328 adev->sdma.trap_irq.funcs = &cik_sdma_trap_irq_funcs;
1354 adev->sdma_illegal_inst_irq.funcs = &cik_sdma_illegal_inst_irq_funcs; 1329 adev->sdma.illegal_inst_irq.funcs = &cik_sdma_illegal_inst_irq_funcs;
1355} 1330}
1356 1331
1357/** 1332/**
@@ -1416,7 +1391,7 @@ static void cik_sdma_set_buffer_funcs(struct amdgpu_device *adev)
1416{ 1391{
1417 if (adev->mman.buffer_funcs == NULL) { 1392 if (adev->mman.buffer_funcs == NULL) {
1418 adev->mman.buffer_funcs = &cik_sdma_buffer_funcs; 1393 adev->mman.buffer_funcs = &cik_sdma_buffer_funcs;
1419 adev->mman.buffer_funcs_ring = &adev->sdma[0].ring; 1394 adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring;
1420 } 1395 }
1421} 1396}
1422 1397
@@ -1431,7 +1406,7 @@ static void cik_sdma_set_vm_pte_funcs(struct amdgpu_device *adev)
1431{ 1406{
1432 if (adev->vm_manager.vm_pte_funcs == NULL) { 1407 if (adev->vm_manager.vm_pte_funcs == NULL) {
1433 adev->vm_manager.vm_pte_funcs = &cik_sdma_vm_pte_funcs; 1408 adev->vm_manager.vm_pte_funcs = &cik_sdma_vm_pte_funcs;
1434 adev->vm_manager.vm_pte_funcs_ring = &adev->sdma[0].ring; 1409 adev->vm_manager.vm_pte_funcs_ring = &adev->sdma.instance[0].ring;
1435 adev->vm_manager.vm_pte_funcs_ring->is_pte_ring = true; 1410 adev->vm_manager.vm_pte_funcs_ring->is_pte_ring = true;
1436 } 1411 }
1437} 1412}
diff --git a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c
index 2e3373ed4c94..8035d4d6a4f5 100644
--- a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c
@@ -1264,6 +1264,7 @@ static void cz_apply_state_adjust_rules(struct amdgpu_device *adev,
1264 1264
1265static int cz_dpm_enable(struct amdgpu_device *adev) 1265static int cz_dpm_enable(struct amdgpu_device *adev)
1266{ 1266{
1267 const char *chip_name;
1267 int ret = 0; 1268 int ret = 0;
1268 1269
1269 /* renable will hang up SMU, so check first */ 1270 /* renable will hang up SMU, so check first */
@@ -1272,21 +1273,33 @@ static int cz_dpm_enable(struct amdgpu_device *adev)
1272 1273
1273 cz_program_voting_clients(adev); 1274 cz_program_voting_clients(adev);
1274 1275
1276 switch (adev->asic_type) {
1277 case CHIP_CARRIZO:
1278 chip_name = "carrizo";
1279 break;
1280 case CHIP_STONEY:
1281 chip_name = "stoney";
1282 break;
1283 default:
1284 BUG();
1285 }
1286
1287
1275 ret = cz_start_dpm(adev); 1288 ret = cz_start_dpm(adev);
1276 if (ret) { 1289 if (ret) {
1277 DRM_ERROR("Carrizo DPM enable failed\n"); 1290 DRM_ERROR("%s DPM enable failed\n", chip_name);
1278 return -EINVAL; 1291 return -EINVAL;
1279 } 1292 }
1280 1293
1281 ret = cz_program_bootup_state(adev); 1294 ret = cz_program_bootup_state(adev);
1282 if (ret) { 1295 if (ret) {
1283 DRM_ERROR("Carrizo bootup state program failed\n"); 1296 DRM_ERROR("%s bootup state program failed\n", chip_name);
1284 return -EINVAL; 1297 return -EINVAL;
1285 } 1298 }
1286 1299
1287 ret = cz_enable_didt(adev, true); 1300 ret = cz_enable_didt(adev, true);
1288 if (ret) { 1301 if (ret) {
1289 DRM_ERROR("Carrizo enable di/dt failed\n"); 1302 DRM_ERROR("%s enable di/dt failed\n", chip_name);
1290 return -EINVAL; 1303 return -EINVAL;
1291 } 1304 }
1292 1305
@@ -1353,7 +1366,7 @@ static int cz_dpm_disable(struct amdgpu_device *adev)
1353 1366
1354 ret = cz_enable_didt(adev, false); 1367 ret = cz_enable_didt(adev, false);
1355 if (ret) { 1368 if (ret) {
1356 DRM_ERROR("Carrizo disable di/dt failed\n"); 1369 DRM_ERROR("disable di/dt failed\n");
1357 return -EINVAL; 1370 return -EINVAL;
1358 } 1371 }
1359 1372
diff --git a/drivers/gpu/drm/amd/amdgpu/cz_smc.c b/drivers/gpu/drm/amd/amdgpu/cz_smc.c
index e33180d3314a..ac7fee7b7eca 100644
--- a/drivers/gpu/drm/amd/amdgpu/cz_smc.c
+++ b/drivers/gpu/drm/amd/amdgpu/cz_smc.c
@@ -312,13 +312,16 @@ int cz_smu_start(struct amdgpu_device *adev)
312 UCODE_ID_CP_MEC_JT1_MASK | 312 UCODE_ID_CP_MEC_JT1_MASK |
313 UCODE_ID_CP_MEC_JT2_MASK; 313 UCODE_ID_CP_MEC_JT2_MASK;
314 314
315 if (adev->asic_type == CHIP_STONEY)
316 fw_to_check &= ~(UCODE_ID_SDMA1_MASK | UCODE_ID_CP_MEC_JT2_MASK);
317
315 cz_smu_request_load_fw(adev); 318 cz_smu_request_load_fw(adev);
316 ret = cz_smu_check_fw_load_finish(adev, fw_to_check); 319 ret = cz_smu_check_fw_load_finish(adev, fw_to_check);
317 if (ret) 320 if (ret)
318 return ret; 321 return ret;
319 322
320 /* manually load MEC firmware for CZ */ 323 /* manually load MEC firmware for CZ */
321 if (adev->asic_type == CHIP_CARRIZO) { 324 if (adev->asic_type == CHIP_CARRIZO || adev->asic_type == CHIP_STONEY) {
322 ret = cz_load_mec_firmware(adev); 325 ret = cz_load_mec_firmware(adev);
323 if (ret) { 326 if (ret) {
324 dev_err(adev->dev, "(%d) Mec Firmware load failed\n", ret); 327 dev_err(adev->dev, "(%d) Mec Firmware load failed\n", ret);
@@ -336,6 +339,9 @@ int cz_smu_start(struct amdgpu_device *adev)
336 AMDGPU_CPMEC2_UCODE_LOADED | 339 AMDGPU_CPMEC2_UCODE_LOADED |
337 AMDGPU_CPRLC_UCODE_LOADED; 340 AMDGPU_CPRLC_UCODE_LOADED;
338 341
342 if (adev->asic_type == CHIP_STONEY)
343 adev->smu.fw_flags &= ~(AMDGPU_SDMA1_UCODE_LOADED | AMDGPU_CPMEC2_UCODE_LOADED);
344
339 return ret; 345 return ret;
340} 346}
341 347
@@ -601,8 +607,13 @@ static int cz_smu_construct_toc_for_vddgfx_exit(struct amdgpu_device *adev)
601 CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false); 607 CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false);
602 cz_smu_populate_single_ucode_load_task(adev, 608 cz_smu_populate_single_ucode_load_task(adev,
603 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false); 609 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
604 cz_smu_populate_single_ucode_load_task(adev, 610 if (adev->asic_type == CHIP_STONEY) {
611 cz_smu_populate_single_ucode_load_task(adev,
612 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
613 } else {
614 cz_smu_populate_single_ucode_load_task(adev,
605 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false); 615 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false);
616 }
606 cz_smu_populate_single_ucode_load_task(adev, 617 cz_smu_populate_single_ucode_load_task(adev,
607 CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, false); 618 CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, false);
608 } 619 }
@@ -642,8 +653,13 @@ static int cz_smu_construct_toc_for_bootup(struct amdgpu_device *adev)
642 if (adev->firmware.smu_load) { 653 if (adev->firmware.smu_load) {
643 cz_smu_populate_single_ucode_load_task(adev, 654 cz_smu_populate_single_ucode_load_task(adev,
644 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, false); 655 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, false);
645 cz_smu_populate_single_ucode_load_task(adev, 656 if (adev->asic_type == CHIP_STONEY) {
657 cz_smu_populate_single_ucode_load_task(adev,
658 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, false);
659 } else {
660 cz_smu_populate_single_ucode_load_task(adev,
646 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1, false); 661 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1, false);
662 }
647 cz_smu_populate_single_ucode_load_task(adev, 663 cz_smu_populate_single_ucode_load_task(adev,
648 CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE, false); 664 CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE, false);
649 cz_smu_populate_single_ucode_load_task(adev, 665 cz_smu_populate_single_ucode_load_task(adev,
@@ -652,8 +668,13 @@ static int cz_smu_construct_toc_for_bootup(struct amdgpu_device *adev)
652 CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false); 668 CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false);
653 cz_smu_populate_single_ucode_load_task(adev, 669 cz_smu_populate_single_ucode_load_task(adev,
654 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false); 670 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
655 cz_smu_populate_single_ucode_load_task(adev, 671 if (adev->asic_type == CHIP_STONEY) {
672 cz_smu_populate_single_ucode_load_task(adev,
673 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
674 } else {
675 cz_smu_populate_single_ucode_load_task(adev,
656 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false); 676 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false);
677 }
657 cz_smu_populate_single_ucode_load_task(adev, 678 cz_smu_populate_single_ucode_load_task(adev,
658 CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, true); 679 CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, true);
659 } 680 }
@@ -888,10 +909,18 @@ int cz_smu_init(struct amdgpu_device *adev)
888 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, 909 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0,
889 &priv->driver_buffer[priv->driver_buffer_length++])) 910 &priv->driver_buffer[priv->driver_buffer_length++]))
890 goto smu_init_failed; 911 goto smu_init_failed;
891 if (cz_smu_populate_single_firmware_entry(adev, 912
892 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1, 913 if (adev->asic_type == CHIP_STONEY) {
893 &priv->driver_buffer[priv->driver_buffer_length++])) 914 if (cz_smu_populate_single_firmware_entry(adev,
894 goto smu_init_failed; 915 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0,
916 &priv->driver_buffer[priv->driver_buffer_length++]))
917 goto smu_init_failed;
918 } else {
919 if (cz_smu_populate_single_firmware_entry(adev,
920 CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1,
921 &priv->driver_buffer[priv->driver_buffer_length++]))
922 goto smu_init_failed;
923 }
895 if (cz_smu_populate_single_firmware_entry(adev, 924 if (cz_smu_populate_single_firmware_entry(adev,
896 CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE, 925 CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE,
897 &priv->driver_buffer[priv->driver_buffer_length++])) 926 &priv->driver_buffer[priv->driver_buffer_length++]))
@@ -908,10 +937,17 @@ int cz_smu_init(struct amdgpu_device *adev)
908 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, 937 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1,
909 &priv->driver_buffer[priv->driver_buffer_length++])) 938 &priv->driver_buffer[priv->driver_buffer_length++]))
910 goto smu_init_failed; 939 goto smu_init_failed;
911 if (cz_smu_populate_single_firmware_entry(adev, 940 if (adev->asic_type == CHIP_STONEY) {
912 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, 941 if (cz_smu_populate_single_firmware_entry(adev,
913 &priv->driver_buffer[priv->driver_buffer_length++])) 942 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1,
914 goto smu_init_failed; 943 &priv->driver_buffer[priv->driver_buffer_length++]))
944 goto smu_init_failed;
945 } else {
946 if (cz_smu_populate_single_firmware_entry(adev,
947 CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2,
948 &priv->driver_buffer[priv->driver_buffer_length++]))
949 goto smu_init_failed;
950 }
915 if (cz_smu_populate_single_firmware_entry(adev, 951 if (cz_smu_populate_single_firmware_entry(adev,
916 CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, 952 CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G,
917 &priv->driver_buffer[priv->driver_buffer_length++])) 953 &priv->driver_buffer[priv->driver_buffer_length++]))
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
index d4c82b625727..cb0f7747e3dc 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
@@ -280,46 +280,22 @@ static void dce_v10_0_pageflip_interrupt_fini(struct amdgpu_device *adev)
280 * @crtc_id: crtc to cleanup pageflip on 280 * @crtc_id: crtc to cleanup pageflip on
281 * @crtc_base: new address of the crtc (GPU MC address) 281 * @crtc_base: new address of the crtc (GPU MC address)
282 * 282 *
283 * Does the actual pageflip (evergreen+). 283 * Triggers the actual pageflip by updating the primary
284 * During vblank we take the crtc lock and wait for the update_pending 284 * surface base address.
285 * bit to go high, when it does, we release the lock, and allow the
286 * double buffered update to take place.
287 * Returns the current update pending status.
288 */ 285 */
289static void dce_v10_0_page_flip(struct amdgpu_device *adev, 286static void dce_v10_0_page_flip(struct amdgpu_device *adev,
290 int crtc_id, u64 crtc_base) 287 int crtc_id, u64 crtc_base)
291{ 288{
292 struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; 289 struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
293 u32 tmp = RREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset);
294 int i;
295
296 /* Lock the graphics update lock */
297 tmp = REG_SET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK, 1);
298 WREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset, tmp);
299
300 /* update the scanout addresses */
301 WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
302 upper_32_bits(crtc_base));
303 WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
304 lower_32_bits(crtc_base));
305 290
291 /* update the primary scanout address */
306 WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset, 292 WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
307 upper_32_bits(crtc_base)); 293 upper_32_bits(crtc_base));
294 /* writing to the low address triggers the update */
308 WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset, 295 WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
309 lower_32_bits(crtc_base)); 296 lower_32_bits(crtc_base));
310 297 /* post the write */
311 /* Wait for update_pending to go high. */ 298 RREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset);
312 for (i = 0; i < adev->usec_timeout; i++) {
313 if (RREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset) &
314 GRPH_UPDATE__GRPH_SURFACE_UPDATE_PENDING_MASK)
315 break;
316 udelay(1);
317 }
318 DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
319
320 /* Unlock the lock, so double-buffering can take place inside vblank */
321 tmp = REG_SET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK, 0);
322 WREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset, tmp);
323} 299}
324 300
325static int dce_v10_0_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc, 301static int dce_v10_0_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc,
@@ -2517,26 +2493,19 @@ static void dce_v10_0_show_cursor(struct drm_crtc *crtc)
2517 struct amdgpu_device *adev = crtc->dev->dev_private; 2493 struct amdgpu_device *adev = crtc->dev->dev_private;
2518 u32 tmp; 2494 u32 tmp;
2519 2495
2496 WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
2497 upper_32_bits(amdgpu_crtc->cursor_addr));
2498 WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
2499 lower_32_bits(amdgpu_crtc->cursor_addr));
2500
2520 tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); 2501 tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);
2521 tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 1); 2502 tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 1);
2522 tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_MODE, 2); 2503 tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_MODE, 2);
2523 WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); 2504 WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
2524} 2505}
2525 2506
2526static void dce_v10_0_set_cursor(struct drm_crtc *crtc, struct drm_gem_object *obj, 2507static int dce_v10_0_cursor_move_locked(struct drm_crtc *crtc,
2527 uint64_t gpu_addr) 2508 int x, int y)
2528{
2529 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2530 struct amdgpu_device *adev = crtc->dev->dev_private;
2531
2532 WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
2533 upper_32_bits(gpu_addr));
2534 WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
2535 lower_32_bits(gpu_addr));
2536}
2537
2538static int dce_v10_0_crtc_cursor_move(struct drm_crtc *crtc,
2539 int x, int y)
2540{ 2509{
2541 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); 2510 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2542 struct amdgpu_device *adev = crtc->dev->dev_private; 2511 struct amdgpu_device *adev = crtc->dev->dev_private;
@@ -2556,26 +2525,40 @@ static int dce_v10_0_crtc_cursor_move(struct drm_crtc *crtc,
2556 y = 0; 2525 y = 0;
2557 } 2526 }
2558 2527
2559 dce_v10_0_lock_cursor(crtc, true);
2560 WREG32(mmCUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | y); 2528 WREG32(mmCUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | y);
2561 WREG32(mmCUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin << 16) | yorigin); 2529 WREG32(mmCUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin << 16) | yorigin);
2562 WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, 2530 WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset,
2563 ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc->cursor_height - 1)); 2531 ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc->cursor_height - 1));
2564 dce_v10_0_lock_cursor(crtc, false); 2532
2533 amdgpu_crtc->cursor_x = x;
2534 amdgpu_crtc->cursor_y = y;
2565 2535
2566 return 0; 2536 return 0;
2567} 2537}
2568 2538
2569static int dce_v10_0_crtc_cursor_set(struct drm_crtc *crtc, 2539static int dce_v10_0_crtc_cursor_move(struct drm_crtc *crtc,
2570 struct drm_file *file_priv, 2540 int x, int y)
2571 uint32_t handle, 2541{
2572 uint32_t width, 2542 int ret;
2573 uint32_t height) 2543
2544 dce_v10_0_lock_cursor(crtc, true);
2545 ret = dce_v10_0_cursor_move_locked(crtc, x, y);
2546 dce_v10_0_lock_cursor(crtc, false);
2547
2548 return ret;
2549}
2550
2551static int dce_v10_0_crtc_cursor_set2(struct drm_crtc *crtc,
2552 struct drm_file *file_priv,
2553 uint32_t handle,
2554 uint32_t width,
2555 uint32_t height,
2556 int32_t hot_x,
2557 int32_t hot_y)
2574{ 2558{
2575 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); 2559 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2576 struct drm_gem_object *obj; 2560 struct drm_gem_object *obj;
2577 struct amdgpu_bo *robj; 2561 struct amdgpu_bo *aobj;
2578 uint64_t gpu_addr;
2579 int ret; 2562 int ret;
2580 2563
2581 if (!handle) { 2564 if (!handle) {
@@ -2597,41 +2580,71 @@ static int dce_v10_0_crtc_cursor_set(struct drm_crtc *crtc,
2597 return -ENOENT; 2580 return -ENOENT;
2598 } 2581 }
2599 2582
2600 robj = gem_to_amdgpu_bo(obj); 2583 aobj = gem_to_amdgpu_bo(obj);
2601 ret = amdgpu_bo_reserve(robj, false); 2584 ret = amdgpu_bo_reserve(aobj, false);
2602 if (unlikely(ret != 0)) 2585 if (ret != 0) {
2603 goto fail; 2586 drm_gem_object_unreference_unlocked(obj);
2604 ret = amdgpu_bo_pin_restricted(robj, AMDGPU_GEM_DOMAIN_VRAM, 2587 return ret;
2605 0, 0, &gpu_addr); 2588 }
2606 amdgpu_bo_unreserve(robj); 2589
2607 if (ret) 2590 ret = amdgpu_bo_pin(aobj, AMDGPU_GEM_DOMAIN_VRAM, &amdgpu_crtc->cursor_addr);
2608 goto fail; 2591 amdgpu_bo_unreserve(aobj);
2592 if (ret) {
2593 DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret);
2594 drm_gem_object_unreference_unlocked(obj);
2595 return ret;
2596 }
2609 2597
2610 amdgpu_crtc->cursor_width = width; 2598 amdgpu_crtc->cursor_width = width;
2611 amdgpu_crtc->cursor_height = height; 2599 amdgpu_crtc->cursor_height = height;
2612 2600
2613 dce_v10_0_lock_cursor(crtc, true); 2601 dce_v10_0_lock_cursor(crtc, true);
2614 dce_v10_0_set_cursor(crtc, obj, gpu_addr); 2602
2603 if (hot_x != amdgpu_crtc->cursor_hot_x ||
2604 hot_y != amdgpu_crtc->cursor_hot_y) {
2605 int x, y;
2606
2607 x = amdgpu_crtc->cursor_x + amdgpu_crtc->cursor_hot_x - hot_x;
2608 y = amdgpu_crtc->cursor_y + amdgpu_crtc->cursor_hot_y - hot_y;
2609
2610 dce_v10_0_cursor_move_locked(crtc, x, y);
2611
2612 amdgpu_crtc->cursor_hot_x = hot_x;
2613 amdgpu_crtc->cursor_hot_y = hot_y;
2614 }
2615
2615 dce_v10_0_show_cursor(crtc); 2616 dce_v10_0_show_cursor(crtc);
2616 dce_v10_0_lock_cursor(crtc, false); 2617 dce_v10_0_lock_cursor(crtc, false);
2617 2618
2618unpin: 2619unpin:
2619 if (amdgpu_crtc->cursor_bo) { 2620 if (amdgpu_crtc->cursor_bo) {
2620 robj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo); 2621 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2621 ret = amdgpu_bo_reserve(robj, false); 2622 ret = amdgpu_bo_reserve(aobj, false);
2622 if (likely(ret == 0)) { 2623 if (likely(ret == 0)) {
2623 amdgpu_bo_unpin(robj); 2624 amdgpu_bo_unpin(aobj);
2624 amdgpu_bo_unreserve(robj); 2625 amdgpu_bo_unreserve(aobj);
2625 } 2626 }
2626 drm_gem_object_unreference_unlocked(amdgpu_crtc->cursor_bo); 2627 drm_gem_object_unreference_unlocked(amdgpu_crtc->cursor_bo);
2627 } 2628 }
2628 2629
2629 amdgpu_crtc->cursor_bo = obj; 2630 amdgpu_crtc->cursor_bo = obj;
2630 return 0; 2631 return 0;
2631fail: 2632}
2632 drm_gem_object_unreference_unlocked(obj);
2633 2633
2634 return ret; 2634static void dce_v10_0_cursor_reset(struct drm_crtc *crtc)
2635{
2636 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2637
2638 if (amdgpu_crtc->cursor_bo) {
2639 dce_v10_0_lock_cursor(crtc, true);
2640
2641 dce_v10_0_cursor_move_locked(crtc, amdgpu_crtc->cursor_x,
2642 amdgpu_crtc->cursor_y);
2643
2644 dce_v10_0_show_cursor(crtc);
2645
2646 dce_v10_0_lock_cursor(crtc, false);
2647 }
2635} 2648}
2636 2649
2637static void dce_v10_0_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, 2650static void dce_v10_0_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
@@ -2659,7 +2672,7 @@ static void dce_v10_0_crtc_destroy(struct drm_crtc *crtc)
2659} 2672}
2660 2673
2661static const struct drm_crtc_funcs dce_v10_0_crtc_funcs = { 2674static const struct drm_crtc_funcs dce_v10_0_crtc_funcs = {
2662 .cursor_set = dce_v10_0_crtc_cursor_set, 2675 .cursor_set2 = dce_v10_0_crtc_cursor_set2,
2663 .cursor_move = dce_v10_0_crtc_cursor_move, 2676 .cursor_move = dce_v10_0_crtc_cursor_move,
2664 .gamma_set = dce_v10_0_crtc_gamma_set, 2677 .gamma_set = dce_v10_0_crtc_gamma_set,
2665 .set_config = amdgpu_crtc_set_config, 2678 .set_config = amdgpu_crtc_set_config,
@@ -2793,6 +2806,7 @@ static int dce_v10_0_crtc_mode_set(struct drm_crtc *crtc,
2793 dce_v10_0_crtc_do_set_base(crtc, old_fb, x, y, 0); 2806 dce_v10_0_crtc_do_set_base(crtc, old_fb, x, y, 0);
2794 amdgpu_atombios_crtc_overscan_setup(crtc, mode, adjusted_mode); 2807 amdgpu_atombios_crtc_overscan_setup(crtc, mode, adjusted_mode);
2795 amdgpu_atombios_crtc_scaler_setup(crtc); 2808 amdgpu_atombios_crtc_scaler_setup(crtc);
2809 dce_v10_0_cursor_reset(crtc);
2796 /* update the hw version fpr dpm */ 2810 /* update the hw version fpr dpm */
2797 amdgpu_crtc->hw_mode = *adjusted_mode; 2811 amdgpu_crtc->hw_mode = *adjusted_mode;
2798 2812
@@ -3071,24 +3085,18 @@ static int dce_v10_0_suspend(void *handle)
3071 3085
3072 amdgpu_atombios_scratch_regs_save(adev); 3086 amdgpu_atombios_scratch_regs_save(adev);
3073 3087
3074 dce_v10_0_hpd_fini(adev); 3088 return dce_v10_0_hw_fini(handle);
3075
3076 dce_v10_0_pageflip_interrupt_fini(adev);
3077
3078 return 0;
3079} 3089}
3080 3090
3081static int dce_v10_0_resume(void *handle) 3091static int dce_v10_0_resume(void *handle)
3082{ 3092{
3083 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3093 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3094 int ret;
3084 3095
3085 dce_v10_0_init_golden_registers(adev); 3096 ret = dce_v10_0_hw_init(handle);
3086 3097
3087 amdgpu_atombios_scratch_regs_restore(adev); 3098 amdgpu_atombios_scratch_regs_restore(adev);
3088 3099
3089 /* init dig PHYs, disp eng pll */
3090 amdgpu_atombios_encoder_init_dig(adev);
3091 amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
3092 /* turn on the BL */ 3100 /* turn on the BL */
3093 if (adev->mode_info.bl_encoder) { 3101 if (adev->mode_info.bl_encoder) {
3094 u8 bl_level = amdgpu_display_backlight_get_level(adev, 3102 u8 bl_level = amdgpu_display_backlight_get_level(adev,
@@ -3097,12 +3105,7 @@ static int dce_v10_0_resume(void *handle)
3097 bl_level); 3105 bl_level);
3098 } 3106 }
3099 3107
3100 /* initialize hpd */ 3108 return ret;
3101 dce_v10_0_hpd_init(adev);
3102
3103 dce_v10_0_pageflip_interrupt_init(adev);
3104
3105 return 0;
3106} 3109}
3107 3110
3108static bool dce_v10_0_is_idle(void *handle) 3111static bool dce_v10_0_is_idle(void *handle)
@@ -3294,37 +3297,20 @@ static int dce_v10_0_set_pageflip_irq_state(struct amdgpu_device *adev,
3294 unsigned type, 3297 unsigned type,
3295 enum amdgpu_interrupt_state state) 3298 enum amdgpu_interrupt_state state)
3296{ 3299{
3297 u32 reg, reg_block; 3300 u32 reg;
3298 /* now deal with page flip IRQ */ 3301
3299 switch (type) { 3302 if (type >= adev->mode_info.num_crtc) {
3300 case AMDGPU_PAGEFLIP_IRQ_D1: 3303 DRM_ERROR("invalid pageflip crtc %d\n", type);
3301 reg_block = CRTC0_REGISTER_OFFSET; 3304 return -EINVAL;
3302 break;
3303 case AMDGPU_PAGEFLIP_IRQ_D2:
3304 reg_block = CRTC1_REGISTER_OFFSET;
3305 break;
3306 case AMDGPU_PAGEFLIP_IRQ_D3:
3307 reg_block = CRTC2_REGISTER_OFFSET;
3308 break;
3309 case AMDGPU_PAGEFLIP_IRQ_D4:
3310 reg_block = CRTC3_REGISTER_OFFSET;
3311 break;
3312 case AMDGPU_PAGEFLIP_IRQ_D5:
3313 reg_block = CRTC4_REGISTER_OFFSET;
3314 break;
3315 case AMDGPU_PAGEFLIP_IRQ_D6:
3316 reg_block = CRTC5_REGISTER_OFFSET;
3317 break;
3318 default:
3319 DRM_ERROR("invalid pageflip crtc %d\n", type);
3320 return -EINVAL;
3321 } 3305 }
3322 3306
3323 reg = RREG32(mmGRPH_INTERRUPT_CONTROL + reg_block); 3307 reg = RREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type]);
3324 if (state == AMDGPU_IRQ_STATE_DISABLE) 3308 if (state == AMDGPU_IRQ_STATE_DISABLE)
3325 WREG32(mmGRPH_INTERRUPT_CONTROL + reg_block, reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK); 3309 WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
3310 reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
3326 else 3311 else
3327 WREG32(mmGRPH_INTERRUPT_CONTROL + reg_block, reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK); 3312 WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
3313 reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
3328 3314
3329 return 0; 3315 return 0;
3330} 3316}
@@ -3333,7 +3319,6 @@ static int dce_v10_0_pageflip_irq(struct amdgpu_device *adev,
3333 struct amdgpu_irq_src *source, 3319 struct amdgpu_irq_src *source,
3334 struct amdgpu_iv_entry *entry) 3320 struct amdgpu_iv_entry *entry)
3335{ 3321{
3336 int reg_block;
3337 unsigned long flags; 3322 unsigned long flags;
3338 unsigned crtc_id; 3323 unsigned crtc_id;
3339 struct amdgpu_crtc *amdgpu_crtc; 3324 struct amdgpu_crtc *amdgpu_crtc;
@@ -3342,33 +3327,15 @@ static int dce_v10_0_pageflip_irq(struct amdgpu_device *adev,
3342 crtc_id = (entry->src_id - 8) >> 1; 3327 crtc_id = (entry->src_id - 8) >> 1;
3343 amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; 3328 amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
3344 3329
3345 /* ack the interrupt */ 3330 if (crtc_id >= adev->mode_info.num_crtc) {
3346 switch(crtc_id){ 3331 DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
3347 case AMDGPU_PAGEFLIP_IRQ_D1: 3332 return -EINVAL;
3348 reg_block = CRTC0_REGISTER_OFFSET;
3349 break;
3350 case AMDGPU_PAGEFLIP_IRQ_D2:
3351 reg_block = CRTC1_REGISTER_OFFSET;
3352 break;
3353 case AMDGPU_PAGEFLIP_IRQ_D3:
3354 reg_block = CRTC2_REGISTER_OFFSET;
3355 break;
3356 case AMDGPU_PAGEFLIP_IRQ_D4:
3357 reg_block = CRTC3_REGISTER_OFFSET;
3358 break;
3359 case AMDGPU_PAGEFLIP_IRQ_D5:
3360 reg_block = CRTC4_REGISTER_OFFSET;
3361 break;
3362 case AMDGPU_PAGEFLIP_IRQ_D6:
3363 reg_block = CRTC5_REGISTER_OFFSET;
3364 break;
3365 default:
3366 DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
3367 return -EINVAL;
3368 } 3333 }
3369 3334
3370 if (RREG32(mmGRPH_INTERRUPT_STATUS + reg_block) & GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK) 3335 if (RREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id]) &
3371 WREG32(mmGRPH_INTERRUPT_STATUS + reg_block, GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK); 3336 GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK)
3337 WREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id],
3338 GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK);
3372 3339
3373 /* IRQ could occur when in initial stage */ 3340 /* IRQ could occur when in initial stage */
3374 if (amdgpu_crtc == NULL) 3341 if (amdgpu_crtc == NULL)
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
index 7e1cf5e4eebf..5af3721851d6 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
@@ -126,6 +126,13 @@ static const u32 cz_mgcg_cgcg_init[] =
126 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000, 126 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
127}; 127};
128 128
129static const u32 stoney_golden_settings_a11[] =
130{
131 mmCRTC_DOUBLE_BUFFER_CONTROL, 0x00010101, 0x00010000,
132 mmFBC_MISC, 0x1f311fff, 0x14302000,
133};
134
135
129static void dce_v11_0_init_golden_registers(struct amdgpu_device *adev) 136static void dce_v11_0_init_golden_registers(struct amdgpu_device *adev)
130{ 137{
131 switch (adev->asic_type) { 138 switch (adev->asic_type) {
@@ -137,6 +144,11 @@ static void dce_v11_0_init_golden_registers(struct amdgpu_device *adev)
137 cz_golden_settings_a11, 144 cz_golden_settings_a11,
138 (const u32)ARRAY_SIZE(cz_golden_settings_a11)); 145 (const u32)ARRAY_SIZE(cz_golden_settings_a11));
139 break; 146 break;
147 case CHIP_STONEY:
148 amdgpu_program_register_sequence(adev,
149 stoney_golden_settings_a11,
150 (const u32)ARRAY_SIZE(stoney_golden_settings_a11));
151 break;
140 default: 152 default:
141 break; 153 break;
142 } 154 }
@@ -258,46 +270,22 @@ static void dce_v11_0_pageflip_interrupt_fini(struct amdgpu_device *adev)
258 * @crtc_id: crtc to cleanup pageflip on 270 * @crtc_id: crtc to cleanup pageflip on
259 * @crtc_base: new address of the crtc (GPU MC address) 271 * @crtc_base: new address of the crtc (GPU MC address)
260 * 272 *
261 * Does the actual pageflip (evergreen+). 273 * Triggers the actual pageflip by updating the primary
262 * During vblank we take the crtc lock and wait for the update_pending 274 * surface base address.
263 * bit to go high, when it does, we release the lock, and allow the
264 * double buffered update to take place.
265 * Returns the current update pending status.
266 */ 275 */
267static void dce_v11_0_page_flip(struct amdgpu_device *adev, 276static void dce_v11_0_page_flip(struct amdgpu_device *adev,
268 int crtc_id, u64 crtc_base) 277 int crtc_id, u64 crtc_base)
269{ 278{
270 struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; 279 struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
271 u32 tmp = RREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset);
272 int i;
273
274 /* Lock the graphics update lock */
275 tmp = REG_SET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK, 1);
276 WREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset, tmp);
277 280
278 /* update the scanout addresses */ 281 /* update the scanout addresses */
279 WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
280 upper_32_bits(crtc_base));
281 WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
282 lower_32_bits(crtc_base));
283
284 WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset, 282 WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
285 upper_32_bits(crtc_base)); 283 upper_32_bits(crtc_base));
284 /* writing to the low address triggers the update */
286 WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset, 285 WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
287 lower_32_bits(crtc_base)); 286 lower_32_bits(crtc_base));
288 287 /* post the write */
289 /* Wait for update_pending to go high. */ 288 RREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset);
290 for (i = 0; i < adev->usec_timeout; i++) {
291 if (RREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset) &
292 GRPH_UPDATE__GRPH_SURFACE_UPDATE_PENDING_MASK)
293 break;
294 udelay(1);
295 }
296 DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
297
298 /* Unlock the lock, so double-buffering can take place inside vblank */
299 tmp = REG_SET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK, 0);
300 WREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset, tmp);
301} 289}
302 290
303static int dce_v11_0_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc, 291static int dce_v11_0_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc,
@@ -2443,7 +2431,7 @@ static u32 dce_v11_0_pick_pll(struct drm_crtc *crtc)
2443 2431
2444 /* XXX need to determine what plls are available on each DCE11 part */ 2432 /* XXX need to determine what plls are available on each DCE11 part */
2445 pll_in_use = amdgpu_pll_get_use_mask(crtc); 2433 pll_in_use = amdgpu_pll_get_use_mask(crtc);
2446 if (adev->asic_type == CHIP_CARRIZO) { 2434 if (adev->asic_type == CHIP_CARRIZO || adev->asic_type == CHIP_STONEY) {
2447 if (!(pll_in_use & (1 << ATOM_PPLL1))) 2435 if (!(pll_in_use & (1 << ATOM_PPLL1)))
2448 return ATOM_PPLL1; 2436 return ATOM_PPLL1;
2449 if (!(pll_in_use & (1 << ATOM_PPLL0))) 2437 if (!(pll_in_use & (1 << ATOM_PPLL0)))
@@ -2494,26 +2482,19 @@ static void dce_v11_0_show_cursor(struct drm_crtc *crtc)
2494 struct amdgpu_device *adev = crtc->dev->dev_private; 2482 struct amdgpu_device *adev = crtc->dev->dev_private;
2495 u32 tmp; 2483 u32 tmp;
2496 2484
2485 WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
2486 upper_32_bits(amdgpu_crtc->cursor_addr));
2487 WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
2488 lower_32_bits(amdgpu_crtc->cursor_addr));
2489
2497 tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); 2490 tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);
2498 tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 1); 2491 tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 1);
2499 tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_MODE, 2); 2492 tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_MODE, 2);
2500 WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); 2493 WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
2501} 2494}
2502 2495
2503static void dce_v11_0_set_cursor(struct drm_crtc *crtc, struct drm_gem_object *obj, 2496static int dce_v11_0_cursor_move_locked(struct drm_crtc *crtc,
2504 uint64_t gpu_addr) 2497 int x, int y)
2505{
2506 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2507 struct amdgpu_device *adev = crtc->dev->dev_private;
2508
2509 WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
2510 upper_32_bits(gpu_addr));
2511 WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
2512 lower_32_bits(gpu_addr));
2513}
2514
2515static int dce_v11_0_crtc_cursor_move(struct drm_crtc *crtc,
2516 int x, int y)
2517{ 2498{
2518 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); 2499 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2519 struct amdgpu_device *adev = crtc->dev->dev_private; 2500 struct amdgpu_device *adev = crtc->dev->dev_private;
@@ -2533,26 +2514,40 @@ static int dce_v11_0_crtc_cursor_move(struct drm_crtc *crtc,
2533 y = 0; 2514 y = 0;
2534 } 2515 }
2535 2516
2536 dce_v11_0_lock_cursor(crtc, true);
2537 WREG32(mmCUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | y); 2517 WREG32(mmCUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | y);
2538 WREG32(mmCUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin << 16) | yorigin); 2518 WREG32(mmCUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin << 16) | yorigin);
2539 WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, 2519 WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset,
2540 ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc->cursor_height - 1)); 2520 ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc->cursor_height - 1));
2541 dce_v11_0_lock_cursor(crtc, false); 2521
2522 amdgpu_crtc->cursor_x = x;
2523 amdgpu_crtc->cursor_y = y;
2542 2524
2543 return 0; 2525 return 0;
2544} 2526}
2545 2527
2546static int dce_v11_0_crtc_cursor_set(struct drm_crtc *crtc, 2528static int dce_v11_0_crtc_cursor_move(struct drm_crtc *crtc,
2547 struct drm_file *file_priv, 2529 int x, int y)
2548 uint32_t handle, 2530{
2549 uint32_t width, 2531 int ret;
2550 uint32_t height) 2532
2533 dce_v11_0_lock_cursor(crtc, true);
2534 ret = dce_v11_0_cursor_move_locked(crtc, x, y);
2535 dce_v11_0_lock_cursor(crtc, false);
2536
2537 return ret;
2538}
2539
2540static int dce_v11_0_crtc_cursor_set2(struct drm_crtc *crtc,
2541 struct drm_file *file_priv,
2542 uint32_t handle,
2543 uint32_t width,
2544 uint32_t height,
2545 int32_t hot_x,
2546 int32_t hot_y)
2551{ 2547{
2552 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); 2548 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2553 struct drm_gem_object *obj; 2549 struct drm_gem_object *obj;
2554 struct amdgpu_bo *robj; 2550 struct amdgpu_bo *aobj;
2555 uint64_t gpu_addr;
2556 int ret; 2551 int ret;
2557 2552
2558 if (!handle) { 2553 if (!handle) {
@@ -2574,41 +2569,71 @@ static int dce_v11_0_crtc_cursor_set(struct drm_crtc *crtc,
2574 return -ENOENT; 2569 return -ENOENT;
2575 } 2570 }
2576 2571
2577 robj = gem_to_amdgpu_bo(obj); 2572 aobj = gem_to_amdgpu_bo(obj);
2578 ret = amdgpu_bo_reserve(robj, false); 2573 ret = amdgpu_bo_reserve(aobj, false);
2579 if (unlikely(ret != 0)) 2574 if (ret != 0) {
2580 goto fail; 2575 drm_gem_object_unreference_unlocked(obj);
2581 ret = amdgpu_bo_pin_restricted(robj, AMDGPU_GEM_DOMAIN_VRAM, 2576 return ret;
2582 0, 0, &gpu_addr); 2577 }
2583 amdgpu_bo_unreserve(robj); 2578
2584 if (ret) 2579 ret = amdgpu_bo_pin(aobj, AMDGPU_GEM_DOMAIN_VRAM, &amdgpu_crtc->cursor_addr);
2585 goto fail; 2580 amdgpu_bo_unreserve(aobj);
2581 if (ret) {
2582 DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret);
2583 drm_gem_object_unreference_unlocked(obj);
2584 return ret;
2585 }
2586 2586
2587 amdgpu_crtc->cursor_width = width; 2587 amdgpu_crtc->cursor_width = width;
2588 amdgpu_crtc->cursor_height = height; 2588 amdgpu_crtc->cursor_height = height;
2589 2589
2590 dce_v11_0_lock_cursor(crtc, true); 2590 dce_v11_0_lock_cursor(crtc, true);
2591 dce_v11_0_set_cursor(crtc, obj, gpu_addr); 2591
2592 if (hot_x != amdgpu_crtc->cursor_hot_x ||
2593 hot_y != amdgpu_crtc->cursor_hot_y) {
2594 int x, y;
2595
2596 x = amdgpu_crtc->cursor_x + amdgpu_crtc->cursor_hot_x - hot_x;
2597 y = amdgpu_crtc->cursor_y + amdgpu_crtc->cursor_hot_y - hot_y;
2598
2599 dce_v11_0_cursor_move_locked(crtc, x, y);
2600
2601 amdgpu_crtc->cursor_hot_x = hot_x;
2602 amdgpu_crtc->cursor_hot_y = hot_y;
2603 }
2604
2592 dce_v11_0_show_cursor(crtc); 2605 dce_v11_0_show_cursor(crtc);
2593 dce_v11_0_lock_cursor(crtc, false); 2606 dce_v11_0_lock_cursor(crtc, false);
2594 2607
2595unpin: 2608unpin:
2596 if (amdgpu_crtc->cursor_bo) { 2609 if (amdgpu_crtc->cursor_bo) {
2597 robj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo); 2610 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2598 ret = amdgpu_bo_reserve(robj, false); 2611 ret = amdgpu_bo_reserve(aobj, false);
2599 if (likely(ret == 0)) { 2612 if (likely(ret == 0)) {
2600 amdgpu_bo_unpin(robj); 2613 amdgpu_bo_unpin(aobj);
2601 amdgpu_bo_unreserve(robj); 2614 amdgpu_bo_unreserve(aobj);
2602 } 2615 }
2603 drm_gem_object_unreference_unlocked(amdgpu_crtc->cursor_bo); 2616 drm_gem_object_unreference_unlocked(amdgpu_crtc->cursor_bo);
2604 } 2617 }
2605 2618
2606 amdgpu_crtc->cursor_bo = obj; 2619 amdgpu_crtc->cursor_bo = obj;
2607 return 0; 2620 return 0;
2608fail: 2621}
2609 drm_gem_object_unreference_unlocked(obj);
2610 2622
2611 return ret; 2623static void dce_v11_0_cursor_reset(struct drm_crtc *crtc)
2624{
2625 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2626
2627 if (amdgpu_crtc->cursor_bo) {
2628 dce_v11_0_lock_cursor(crtc, true);
2629
2630 dce_v11_0_cursor_move_locked(crtc, amdgpu_crtc->cursor_x,
2631 amdgpu_crtc->cursor_y);
2632
2633 dce_v11_0_show_cursor(crtc);
2634
2635 dce_v11_0_lock_cursor(crtc, false);
2636 }
2612} 2637}
2613 2638
2614static void dce_v11_0_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, 2639static void dce_v11_0_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
@@ -2636,7 +2661,7 @@ static void dce_v11_0_crtc_destroy(struct drm_crtc *crtc)
2636} 2661}
2637 2662
2638static const struct drm_crtc_funcs dce_v11_0_crtc_funcs = { 2663static const struct drm_crtc_funcs dce_v11_0_crtc_funcs = {
2639 .cursor_set = dce_v11_0_crtc_cursor_set, 2664 .cursor_set2 = dce_v11_0_crtc_cursor_set2,
2640 .cursor_move = dce_v11_0_crtc_cursor_move, 2665 .cursor_move = dce_v11_0_crtc_cursor_move,
2641 .gamma_set = dce_v11_0_crtc_gamma_set, 2666 .gamma_set = dce_v11_0_crtc_gamma_set,
2642 .set_config = amdgpu_crtc_set_config, 2667 .set_config = amdgpu_crtc_set_config,
@@ -2770,6 +2795,7 @@ static int dce_v11_0_crtc_mode_set(struct drm_crtc *crtc,
2770 dce_v11_0_crtc_do_set_base(crtc, old_fb, x, y, 0); 2795 dce_v11_0_crtc_do_set_base(crtc, old_fb, x, y, 0);
2771 amdgpu_atombios_crtc_overscan_setup(crtc, mode, adjusted_mode); 2796 amdgpu_atombios_crtc_overscan_setup(crtc, mode, adjusted_mode);
2772 amdgpu_atombios_crtc_scaler_setup(crtc); 2797 amdgpu_atombios_crtc_scaler_setup(crtc);
2798 dce_v11_0_cursor_reset(crtc);
2773 /* update the hw version fpr dpm */ 2799 /* update the hw version fpr dpm */
2774 amdgpu_crtc->hw_mode = *adjusted_mode; 2800 amdgpu_crtc->hw_mode = *adjusted_mode;
2775 2801
@@ -2911,6 +2937,11 @@ static int dce_v11_0_early_init(void *handle)
2911 adev->mode_info.num_hpd = 6; 2937 adev->mode_info.num_hpd = 6;
2912 adev->mode_info.num_dig = 9; 2938 adev->mode_info.num_dig = 9;
2913 break; 2939 break;
2940 case CHIP_STONEY:
2941 adev->mode_info.num_crtc = 2;
2942 adev->mode_info.num_hpd = 6;
2943 adev->mode_info.num_dig = 9;
2944 break;
2914 default: 2945 default:
2915 /* FIXME: not supported yet */ 2946 /* FIXME: not supported yet */
2916 return -EINVAL; 2947 return -EINVAL;
@@ -3009,6 +3040,7 @@ static int dce_v11_0_hw_init(void *handle)
3009 dce_v11_0_init_golden_registers(adev); 3040 dce_v11_0_init_golden_registers(adev);
3010 3041
3011 /* init dig PHYs, disp eng pll */ 3042 /* init dig PHYs, disp eng pll */
3043 amdgpu_atombios_crtc_powergate_init(adev);
3012 amdgpu_atombios_encoder_init_dig(adev); 3044 amdgpu_atombios_encoder_init_dig(adev);
3013 amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk); 3045 amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
3014 3046
@@ -3046,25 +3078,18 @@ static int dce_v11_0_suspend(void *handle)
3046 3078
3047 amdgpu_atombios_scratch_regs_save(adev); 3079 amdgpu_atombios_scratch_regs_save(adev);
3048 3080
3049 dce_v11_0_hpd_fini(adev); 3081 return dce_v11_0_hw_fini(handle);
3050
3051 dce_v11_0_pageflip_interrupt_fini(adev);
3052
3053 return 0;
3054} 3082}
3055 3083
3056static int dce_v11_0_resume(void *handle) 3084static int dce_v11_0_resume(void *handle)
3057{ 3085{
3058 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3086 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3087 int ret;
3059 3088
3060 dce_v11_0_init_golden_registers(adev); 3089 ret = dce_v11_0_hw_init(handle);
3061 3090
3062 amdgpu_atombios_scratch_regs_restore(adev); 3091 amdgpu_atombios_scratch_regs_restore(adev);
3063 3092
3064 /* init dig PHYs, disp eng pll */
3065 amdgpu_atombios_crtc_powergate_init(adev);
3066 amdgpu_atombios_encoder_init_dig(adev);
3067 amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
3068 /* turn on the BL */ 3093 /* turn on the BL */
3069 if (adev->mode_info.bl_encoder) { 3094 if (adev->mode_info.bl_encoder) {
3070 u8 bl_level = amdgpu_display_backlight_get_level(adev, 3095 u8 bl_level = amdgpu_display_backlight_get_level(adev,
@@ -3073,12 +3098,7 @@ static int dce_v11_0_resume(void *handle)
3073 bl_level); 3098 bl_level);
3074 } 3099 }
3075 3100
3076 /* initialize hpd */ 3101 return ret;
3077 dce_v11_0_hpd_init(adev);
3078
3079 dce_v11_0_pageflip_interrupt_init(adev);
3080
3081 return 0;
3082} 3102}
3083 3103
3084static bool dce_v11_0_is_idle(void *handle) 3104static bool dce_v11_0_is_idle(void *handle)
@@ -3270,37 +3290,20 @@ static int dce_v11_0_set_pageflip_irq_state(struct amdgpu_device *adev,
3270 unsigned type, 3290 unsigned type,
3271 enum amdgpu_interrupt_state state) 3291 enum amdgpu_interrupt_state state)
3272{ 3292{
3273 u32 reg, reg_block; 3293 u32 reg;
3274 /* now deal with page flip IRQ */ 3294
3275 switch (type) { 3295 if (type >= adev->mode_info.num_crtc) {
3276 case AMDGPU_PAGEFLIP_IRQ_D1: 3296 DRM_ERROR("invalid pageflip crtc %d\n", type);
3277 reg_block = CRTC0_REGISTER_OFFSET; 3297 return -EINVAL;
3278 break;
3279 case AMDGPU_PAGEFLIP_IRQ_D2:
3280 reg_block = CRTC1_REGISTER_OFFSET;
3281 break;
3282 case AMDGPU_PAGEFLIP_IRQ_D3:
3283 reg_block = CRTC2_REGISTER_OFFSET;
3284 break;
3285 case AMDGPU_PAGEFLIP_IRQ_D4:
3286 reg_block = CRTC3_REGISTER_OFFSET;
3287 break;
3288 case AMDGPU_PAGEFLIP_IRQ_D5:
3289 reg_block = CRTC4_REGISTER_OFFSET;
3290 break;
3291 case AMDGPU_PAGEFLIP_IRQ_D6:
3292 reg_block = CRTC5_REGISTER_OFFSET;
3293 break;
3294 default:
3295 DRM_ERROR("invalid pageflip crtc %d\n", type);
3296 return -EINVAL;
3297 } 3298 }
3298 3299
3299 reg = RREG32(mmGRPH_INTERRUPT_CONTROL + reg_block); 3300 reg = RREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type]);
3300 if (state == AMDGPU_IRQ_STATE_DISABLE) 3301 if (state == AMDGPU_IRQ_STATE_DISABLE)
3301 WREG32(mmGRPH_INTERRUPT_CONTROL + reg_block, reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK); 3302 WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
3303 reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
3302 else 3304 else
3303 WREG32(mmGRPH_INTERRUPT_CONTROL + reg_block, reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK); 3305 WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
3306 reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
3304 3307
3305 return 0; 3308 return 0;
3306} 3309}
@@ -3309,7 +3312,6 @@ static int dce_v11_0_pageflip_irq(struct amdgpu_device *adev,
3309 struct amdgpu_irq_src *source, 3312 struct amdgpu_irq_src *source,
3310 struct amdgpu_iv_entry *entry) 3313 struct amdgpu_iv_entry *entry)
3311{ 3314{
3312 int reg_block;
3313 unsigned long flags; 3315 unsigned long flags;
3314 unsigned crtc_id; 3316 unsigned crtc_id;
3315 struct amdgpu_crtc *amdgpu_crtc; 3317 struct amdgpu_crtc *amdgpu_crtc;
@@ -3318,33 +3320,15 @@ static int dce_v11_0_pageflip_irq(struct amdgpu_device *adev,
3318 crtc_id = (entry->src_id - 8) >> 1; 3320 crtc_id = (entry->src_id - 8) >> 1;
3319 amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; 3321 amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
3320 3322
3321 /* ack the interrupt */ 3323 if (crtc_id >= adev->mode_info.num_crtc) {
3322 switch(crtc_id){ 3324 DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
3323 case AMDGPU_PAGEFLIP_IRQ_D1: 3325 return -EINVAL;
3324 reg_block = CRTC0_REGISTER_OFFSET;
3325 break;
3326 case AMDGPU_PAGEFLIP_IRQ_D2:
3327 reg_block = CRTC1_REGISTER_OFFSET;
3328 break;
3329 case AMDGPU_PAGEFLIP_IRQ_D3:
3330 reg_block = CRTC2_REGISTER_OFFSET;
3331 break;
3332 case AMDGPU_PAGEFLIP_IRQ_D4:
3333 reg_block = CRTC3_REGISTER_OFFSET;
3334 break;
3335 case AMDGPU_PAGEFLIP_IRQ_D5:
3336 reg_block = CRTC4_REGISTER_OFFSET;
3337 break;
3338 case AMDGPU_PAGEFLIP_IRQ_D6:
3339 reg_block = CRTC5_REGISTER_OFFSET;
3340 break;
3341 default:
3342 DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
3343 return -EINVAL;
3344 } 3326 }
3345 3327
3346 if (RREG32(mmGRPH_INTERRUPT_STATUS + reg_block) & GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK) 3328 if (RREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id]) &
3347 WREG32(mmGRPH_INTERRUPT_STATUS + reg_block, GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK); 3329 GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK)
3330 WREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id],
3331 GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK);
3348 3332
3349 /* IRQ could occur when in initial stage */ 3333 /* IRQ could occur when in initial stage */
3350 if(amdgpu_crtc == NULL) 3334 if(amdgpu_crtc == NULL)
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
index 34b9c2a9d8d4..4f7b49a6dc50 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
@@ -229,46 +229,22 @@ static void dce_v8_0_pageflip_interrupt_fini(struct amdgpu_device *adev)
229 * @crtc_id: crtc to cleanup pageflip on 229 * @crtc_id: crtc to cleanup pageflip on
230 * @crtc_base: new address of the crtc (GPU MC address) 230 * @crtc_base: new address of the crtc (GPU MC address)
231 * 231 *
232 * Does the actual pageflip (evergreen+). 232 * Triggers the actual pageflip by updating the primary
233 * During vblank we take the crtc lock and wait for the update_pending 233 * surface base address.
234 * bit to go high, when it does, we release the lock, and allow the
235 * double buffered update to take place.
236 * Returns the current update pending status.
237 */ 234 */
238static void dce_v8_0_page_flip(struct amdgpu_device *adev, 235static void dce_v8_0_page_flip(struct amdgpu_device *adev,
239 int crtc_id, u64 crtc_base) 236 int crtc_id, u64 crtc_base)
240{ 237{
241 struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; 238 struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
242 u32 tmp = RREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset);
243 int i;
244
245 /* Lock the graphics update lock */
246 tmp |= GRPH_UPDATE__GRPH_UPDATE_LOCK_MASK;
247 WREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset, tmp);
248
249 /* update the scanout addresses */
250 WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
251 upper_32_bits(crtc_base));
252 WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
253 (u32)crtc_base);
254 239
240 /* update the primary scanout addresses */
255 WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset, 241 WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
256 upper_32_bits(crtc_base)); 242 upper_32_bits(crtc_base));
243 /* writing to the low address triggers the update */
257 WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset, 244 WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
258 (u32)crtc_base); 245 lower_32_bits(crtc_base));
259 246 /* post the write */
260 /* Wait for update_pending to go high. */ 247 RREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset);
261 for (i = 0; i < adev->usec_timeout; i++) {
262 if (RREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset) &
263 GRPH_UPDATE__GRPH_SURFACE_UPDATE_PENDING_MASK)
264 break;
265 udelay(1);
266 }
267 DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
268
269 /* Unlock the lock, so double-buffering can take place inside vblank */
270 tmp &= ~GRPH_UPDATE__GRPH_UPDATE_LOCK_MASK;
271 WREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset, tmp);
272} 248}
273 249
274static int dce_v8_0_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc, 250static int dce_v8_0_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc,
@@ -2429,26 +2405,19 @@ static void dce_v8_0_show_cursor(struct drm_crtc *crtc)
2429 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); 2405 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2430 struct amdgpu_device *adev = crtc->dev->dev_private; 2406 struct amdgpu_device *adev = crtc->dev->dev_private;
2431 2407
2408 WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
2409 upper_32_bits(amdgpu_crtc->cursor_addr));
2410 WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
2411 lower_32_bits(amdgpu_crtc->cursor_addr));
2412
2432 WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, 2413 WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset,
2433 CUR_CONTROL__CURSOR_EN_MASK | 2414 CUR_CONTROL__CURSOR_EN_MASK |
2434 (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | 2415 (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) |
2435 (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT)); 2416 (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));
2436} 2417}
2437 2418
2438static void dce_v8_0_set_cursor(struct drm_crtc *crtc, struct drm_gem_object *obj, 2419static int dce_v8_0_cursor_move_locked(struct drm_crtc *crtc,
2439 uint64_t gpu_addr) 2420 int x, int y)
2440{
2441 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2442 struct amdgpu_device *adev = crtc->dev->dev_private;
2443
2444 WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
2445 upper_32_bits(gpu_addr));
2446 WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
2447 gpu_addr & 0xffffffff);
2448}
2449
2450static int dce_v8_0_crtc_cursor_move(struct drm_crtc *crtc,
2451 int x, int y)
2452{ 2421{
2453 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); 2422 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2454 struct amdgpu_device *adev = crtc->dev->dev_private; 2423 struct amdgpu_device *adev = crtc->dev->dev_private;
@@ -2468,26 +2437,40 @@ static int dce_v8_0_crtc_cursor_move(struct drm_crtc *crtc,
2468 y = 0; 2437 y = 0;
2469 } 2438 }
2470 2439
2471 dce_v8_0_lock_cursor(crtc, true);
2472 WREG32(mmCUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | y); 2440 WREG32(mmCUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | y);
2473 WREG32(mmCUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin << 16) | yorigin); 2441 WREG32(mmCUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin << 16) | yorigin);
2474 WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, 2442 WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset,
2475 ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc->cursor_height - 1)); 2443 ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc->cursor_height - 1));
2476 dce_v8_0_lock_cursor(crtc, false); 2444
2445 amdgpu_crtc->cursor_x = x;
2446 amdgpu_crtc->cursor_y = y;
2477 2447
2478 return 0; 2448 return 0;
2479} 2449}
2480 2450
2481static int dce_v8_0_crtc_cursor_set(struct drm_crtc *crtc, 2451static int dce_v8_0_crtc_cursor_move(struct drm_crtc *crtc,
2482 struct drm_file *file_priv, 2452 int x, int y)
2483 uint32_t handle, 2453{
2484 uint32_t width, 2454 int ret;
2485 uint32_t height) 2455
2456 dce_v8_0_lock_cursor(crtc, true);
2457 ret = dce_v8_0_cursor_move_locked(crtc, x, y);
2458 dce_v8_0_lock_cursor(crtc, false);
2459
2460 return ret;
2461}
2462
2463static int dce_v8_0_crtc_cursor_set2(struct drm_crtc *crtc,
2464 struct drm_file *file_priv,
2465 uint32_t handle,
2466 uint32_t width,
2467 uint32_t height,
2468 int32_t hot_x,
2469 int32_t hot_y)
2486{ 2470{
2487 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); 2471 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2488 struct drm_gem_object *obj; 2472 struct drm_gem_object *obj;
2489 struct amdgpu_bo *robj; 2473 struct amdgpu_bo *aobj;
2490 uint64_t gpu_addr;
2491 int ret; 2474 int ret;
2492 2475
2493 if (!handle) { 2476 if (!handle) {
@@ -2509,41 +2492,71 @@ static int dce_v8_0_crtc_cursor_set(struct drm_crtc *crtc,
2509 return -ENOENT; 2492 return -ENOENT;
2510 } 2493 }
2511 2494
2512 robj = gem_to_amdgpu_bo(obj); 2495 aobj = gem_to_amdgpu_bo(obj);
2513 ret = amdgpu_bo_reserve(robj, false); 2496 ret = amdgpu_bo_reserve(aobj, false);
2514 if (unlikely(ret != 0)) 2497 if (ret != 0) {
2515 goto fail; 2498 drm_gem_object_unreference_unlocked(obj);
2516 ret = amdgpu_bo_pin_restricted(robj, AMDGPU_GEM_DOMAIN_VRAM, 2499 return ret;
2517 0, 0, &gpu_addr); 2500 }
2518 amdgpu_bo_unreserve(robj); 2501
2519 if (ret) 2502 ret = amdgpu_bo_pin(aobj, AMDGPU_GEM_DOMAIN_VRAM, &amdgpu_crtc->cursor_addr);
2520 goto fail; 2503 amdgpu_bo_unreserve(aobj);
2504 if (ret) {
2505 DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret);
2506 drm_gem_object_unreference_unlocked(obj);
2507 return ret;
2508 }
2521 2509
2522 amdgpu_crtc->cursor_width = width; 2510 amdgpu_crtc->cursor_width = width;
2523 amdgpu_crtc->cursor_height = height; 2511 amdgpu_crtc->cursor_height = height;
2524 2512
2525 dce_v8_0_lock_cursor(crtc, true); 2513 dce_v8_0_lock_cursor(crtc, true);
2526 dce_v8_0_set_cursor(crtc, obj, gpu_addr); 2514
2515 if (hot_x != amdgpu_crtc->cursor_hot_x ||
2516 hot_y != amdgpu_crtc->cursor_hot_y) {
2517 int x, y;
2518
2519 x = amdgpu_crtc->cursor_x + amdgpu_crtc->cursor_hot_x - hot_x;
2520 y = amdgpu_crtc->cursor_y + amdgpu_crtc->cursor_hot_y - hot_y;
2521
2522 dce_v8_0_cursor_move_locked(crtc, x, y);
2523
2524 amdgpu_crtc->cursor_hot_x = hot_x;
2525 amdgpu_crtc->cursor_hot_y = hot_y;
2526 }
2527
2527 dce_v8_0_show_cursor(crtc); 2528 dce_v8_0_show_cursor(crtc);
2528 dce_v8_0_lock_cursor(crtc, false); 2529 dce_v8_0_lock_cursor(crtc, false);
2529 2530
2530unpin: 2531unpin:
2531 if (amdgpu_crtc->cursor_bo) { 2532 if (amdgpu_crtc->cursor_bo) {
2532 robj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo); 2533 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2533 ret = amdgpu_bo_reserve(robj, false); 2534 ret = amdgpu_bo_reserve(aobj, false);
2534 if (likely(ret == 0)) { 2535 if (likely(ret == 0)) {
2535 amdgpu_bo_unpin(robj); 2536 amdgpu_bo_unpin(aobj);
2536 amdgpu_bo_unreserve(robj); 2537 amdgpu_bo_unreserve(aobj);
2537 } 2538 }
2538 drm_gem_object_unreference_unlocked(amdgpu_crtc->cursor_bo); 2539 drm_gem_object_unreference_unlocked(amdgpu_crtc->cursor_bo);
2539 } 2540 }
2540 2541
2541 amdgpu_crtc->cursor_bo = obj; 2542 amdgpu_crtc->cursor_bo = obj;
2542 return 0; 2543 return 0;
2543fail: 2544}
2544 drm_gem_object_unreference_unlocked(obj);
2545 2545
2546 return ret; 2546static void dce_v8_0_cursor_reset(struct drm_crtc *crtc)
2547{
2548 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2549
2550 if (amdgpu_crtc->cursor_bo) {
2551 dce_v8_0_lock_cursor(crtc, true);
2552
2553 dce_v8_0_cursor_move_locked(crtc, amdgpu_crtc->cursor_x,
2554 amdgpu_crtc->cursor_y);
2555
2556 dce_v8_0_show_cursor(crtc);
2557
2558 dce_v8_0_lock_cursor(crtc, false);
2559 }
2547} 2560}
2548 2561
2549static void dce_v8_0_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, 2562static void dce_v8_0_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
@@ -2571,7 +2584,7 @@ static void dce_v8_0_crtc_destroy(struct drm_crtc *crtc)
2571} 2584}
2572 2585
2573static const struct drm_crtc_funcs dce_v8_0_crtc_funcs = { 2586static const struct drm_crtc_funcs dce_v8_0_crtc_funcs = {
2574 .cursor_set = dce_v8_0_crtc_cursor_set, 2587 .cursor_set2 = dce_v8_0_crtc_cursor_set2,
2575 .cursor_move = dce_v8_0_crtc_cursor_move, 2588 .cursor_move = dce_v8_0_crtc_cursor_move,
2576 .gamma_set = dce_v8_0_crtc_gamma_set, 2589 .gamma_set = dce_v8_0_crtc_gamma_set,
2577 .set_config = amdgpu_crtc_set_config, 2590 .set_config = amdgpu_crtc_set_config,
@@ -2712,6 +2725,7 @@ static int dce_v8_0_crtc_mode_set(struct drm_crtc *crtc,
2712 dce_v8_0_crtc_do_set_base(crtc, old_fb, x, y, 0); 2725 dce_v8_0_crtc_do_set_base(crtc, old_fb, x, y, 0);
2713 amdgpu_atombios_crtc_overscan_setup(crtc, mode, adjusted_mode); 2726 amdgpu_atombios_crtc_overscan_setup(crtc, mode, adjusted_mode);
2714 amdgpu_atombios_crtc_scaler_setup(crtc); 2727 amdgpu_atombios_crtc_scaler_setup(crtc);
2728 dce_v8_0_cursor_reset(crtc);
2715 /* update the hw version fpr dpm */ 2729 /* update the hw version fpr dpm */
2716 amdgpu_crtc->hw_mode = *adjusted_mode; 2730 amdgpu_crtc->hw_mode = *adjusted_mode;
2717 2731
@@ -2979,22 +2993,18 @@ static int dce_v8_0_suspend(void *handle)
2979 2993
2980 amdgpu_atombios_scratch_regs_save(adev); 2994 amdgpu_atombios_scratch_regs_save(adev);
2981 2995
2982 dce_v8_0_hpd_fini(adev); 2996 return dce_v8_0_hw_fini(handle);
2983
2984 dce_v8_0_pageflip_interrupt_fini(adev);
2985
2986 return 0;
2987} 2997}
2988 2998
2989static int dce_v8_0_resume(void *handle) 2999static int dce_v8_0_resume(void *handle)
2990{ 3000{
2991 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3001 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3002 int ret;
3003
3004 ret = dce_v8_0_hw_init(handle);
2992 3005
2993 amdgpu_atombios_scratch_regs_restore(adev); 3006 amdgpu_atombios_scratch_regs_restore(adev);
2994 3007
2995 /* init dig PHYs, disp eng pll */
2996 amdgpu_atombios_encoder_init_dig(adev);
2997 amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
2998 /* turn on the BL */ 3008 /* turn on the BL */
2999 if (adev->mode_info.bl_encoder) { 3009 if (adev->mode_info.bl_encoder) {
3000 u8 bl_level = amdgpu_display_backlight_get_level(adev, 3010 u8 bl_level = amdgpu_display_backlight_get_level(adev,
@@ -3003,12 +3013,7 @@ static int dce_v8_0_resume(void *handle)
3003 bl_level); 3013 bl_level);
3004 } 3014 }
3005 3015
3006 /* initialize hpd */ 3016 return ret;
3007 dce_v8_0_hpd_init(adev);
3008
3009 dce_v8_0_pageflip_interrupt_init(adev);
3010
3011 return 0;
3012} 3017}
3013 3018
3014static bool dce_v8_0_is_idle(void *handle) 3019static bool dce_v8_0_is_idle(void *handle)
@@ -3301,37 +3306,20 @@ static int dce_v8_0_set_pageflip_interrupt_state(struct amdgpu_device *adev,
3301 unsigned type, 3306 unsigned type,
3302 enum amdgpu_interrupt_state state) 3307 enum amdgpu_interrupt_state state)
3303{ 3308{
3304 u32 reg, reg_block; 3309 u32 reg;
3305 /* now deal with page flip IRQ */ 3310
3306 switch (type) { 3311 if (type >= adev->mode_info.num_crtc) {
3307 case AMDGPU_PAGEFLIP_IRQ_D1: 3312 DRM_ERROR("invalid pageflip crtc %d\n", type);
3308 reg_block = CRTC0_REGISTER_OFFSET; 3313 return -EINVAL;
3309 break;
3310 case AMDGPU_PAGEFLIP_IRQ_D2:
3311 reg_block = CRTC1_REGISTER_OFFSET;
3312 break;
3313 case AMDGPU_PAGEFLIP_IRQ_D3:
3314 reg_block = CRTC2_REGISTER_OFFSET;
3315 break;
3316 case AMDGPU_PAGEFLIP_IRQ_D4:
3317 reg_block = CRTC3_REGISTER_OFFSET;
3318 break;
3319 case AMDGPU_PAGEFLIP_IRQ_D5:
3320 reg_block = CRTC4_REGISTER_OFFSET;
3321 break;
3322 case AMDGPU_PAGEFLIP_IRQ_D6:
3323 reg_block = CRTC5_REGISTER_OFFSET;
3324 break;
3325 default:
3326 DRM_ERROR("invalid pageflip crtc %d\n", type);
3327 return -EINVAL;
3328 } 3314 }
3329 3315
3330 reg = RREG32(mmGRPH_INTERRUPT_CONTROL + reg_block); 3316 reg = RREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type]);
3331 if (state == AMDGPU_IRQ_STATE_DISABLE) 3317 if (state == AMDGPU_IRQ_STATE_DISABLE)
3332 WREG32(mmGRPH_INTERRUPT_CONTROL + reg_block, reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK); 3318 WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
3319 reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
3333 else 3320 else
3334 WREG32(mmGRPH_INTERRUPT_CONTROL + reg_block, reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK); 3321 WREG32(mmGRPH_INTERRUPT_CONTROL + crtc_offsets[type],
3322 reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
3335 3323
3336 return 0; 3324 return 0;
3337} 3325}
@@ -3340,7 +3328,6 @@ static int dce_v8_0_pageflip_irq(struct amdgpu_device *adev,
3340 struct amdgpu_irq_src *source, 3328 struct amdgpu_irq_src *source,
3341 struct amdgpu_iv_entry *entry) 3329 struct amdgpu_iv_entry *entry)
3342{ 3330{
3343 int reg_block;
3344 unsigned long flags; 3331 unsigned long flags;
3345 unsigned crtc_id; 3332 unsigned crtc_id;
3346 struct amdgpu_crtc *amdgpu_crtc; 3333 struct amdgpu_crtc *amdgpu_crtc;
@@ -3349,33 +3336,15 @@ static int dce_v8_0_pageflip_irq(struct amdgpu_device *adev,
3349 crtc_id = (entry->src_id - 8) >> 1; 3336 crtc_id = (entry->src_id - 8) >> 1;
3350 amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; 3337 amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
3351 3338
3352 /* ack the interrupt */ 3339 if (crtc_id >= adev->mode_info.num_crtc) {
3353 switch(crtc_id){ 3340 DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
3354 case AMDGPU_PAGEFLIP_IRQ_D1: 3341 return -EINVAL;
3355 reg_block = CRTC0_REGISTER_OFFSET;
3356 break;
3357 case AMDGPU_PAGEFLIP_IRQ_D2:
3358 reg_block = CRTC1_REGISTER_OFFSET;
3359 break;
3360 case AMDGPU_PAGEFLIP_IRQ_D3:
3361 reg_block = CRTC2_REGISTER_OFFSET;
3362 break;
3363 case AMDGPU_PAGEFLIP_IRQ_D4:
3364 reg_block = CRTC3_REGISTER_OFFSET;
3365 break;
3366 case AMDGPU_PAGEFLIP_IRQ_D5:
3367 reg_block = CRTC4_REGISTER_OFFSET;
3368 break;
3369 case AMDGPU_PAGEFLIP_IRQ_D6:
3370 reg_block = CRTC5_REGISTER_OFFSET;
3371 break;
3372 default:
3373 DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
3374 return -EINVAL;
3375 } 3342 }
3376 3343
3377 if (RREG32(mmGRPH_INTERRUPT_STATUS + reg_block) & GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK) 3344 if (RREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id]) &
3378 WREG32(mmGRPH_INTERRUPT_STATUS + reg_block, GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK); 3345 GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK)
3346 WREG32(mmGRPH_INTERRUPT_STATUS + crtc_offsets[crtc_id],
3347 GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK);
3379 3348
3380 /* IRQ could occur when in initial stage */ 3349 /* IRQ could occur when in initial stage */
3381 if (amdgpu_crtc == NULL) 3350 if (amdgpu_crtc == NULL)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index e992bf2ff66c..72793f93e2fc 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -5542,24 +5542,6 @@ const struct amd_ip_funcs gfx_v7_0_ip_funcs = {
5542 .set_powergating_state = gfx_v7_0_set_powergating_state, 5542 .set_powergating_state = gfx_v7_0_set_powergating_state,
5543}; 5543};
5544 5544
5545/**
5546 * gfx_v7_0_ring_is_lockup - check if the 3D engine is locked up
5547 *
5548 * @adev: amdgpu_device pointer
5549 * @ring: amdgpu_ring structure holding ring information
5550 *
5551 * Check if the 3D engine is locked up (CIK).
5552 * Returns true if the engine is locked, false if not.
5553 */
5554static bool gfx_v7_0_ring_is_lockup(struct amdgpu_ring *ring)
5555{
5556 if (gfx_v7_0_is_idle(ring->adev)) {
5557 amdgpu_ring_lockup_update(ring);
5558 return false;
5559 }
5560 return amdgpu_ring_test_lockup(ring);
5561}
5562
5563static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = { 5545static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = {
5564 .get_rptr = gfx_v7_0_ring_get_rptr_gfx, 5546 .get_rptr = gfx_v7_0_ring_get_rptr_gfx,
5565 .get_wptr = gfx_v7_0_ring_get_wptr_gfx, 5547 .get_wptr = gfx_v7_0_ring_get_wptr_gfx,
@@ -5573,7 +5555,6 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = {
5573 .emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush, 5555 .emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush,
5574 .test_ring = gfx_v7_0_ring_test_ring, 5556 .test_ring = gfx_v7_0_ring_test_ring,
5575 .test_ib = gfx_v7_0_ring_test_ib, 5557 .test_ib = gfx_v7_0_ring_test_ib,
5576 .is_lockup = gfx_v7_0_ring_is_lockup,
5577 .insert_nop = amdgpu_ring_insert_nop, 5558 .insert_nop = amdgpu_ring_insert_nop,
5578}; 5559};
5579 5560
@@ -5590,7 +5571,6 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {
5590 .emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush, 5571 .emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush,
5591 .test_ring = gfx_v7_0_ring_test_ring, 5572 .test_ring = gfx_v7_0_ring_test_ring,
5592 .test_ib = gfx_v7_0_ring_test_ib, 5573 .test_ib = gfx_v7_0_ring_test_ib,
5593 .is_lockup = gfx_v7_0_ring_is_lockup,
5594 .insert_nop = amdgpu_ring_insert_nop, 5574 .insert_nop = amdgpu_ring_insert_nop,
5595}; 5575};
5596 5576
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index cb4f68f53f24..6776cf756d40 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -73,6 +73,12 @@ MODULE_FIRMWARE("amdgpu/carrizo_mec.bin");
73MODULE_FIRMWARE("amdgpu/carrizo_mec2.bin"); 73MODULE_FIRMWARE("amdgpu/carrizo_mec2.bin");
74MODULE_FIRMWARE("amdgpu/carrizo_rlc.bin"); 74MODULE_FIRMWARE("amdgpu/carrizo_rlc.bin");
75 75
76MODULE_FIRMWARE("amdgpu/stoney_ce.bin");
77MODULE_FIRMWARE("amdgpu/stoney_pfp.bin");
78MODULE_FIRMWARE("amdgpu/stoney_me.bin");
79MODULE_FIRMWARE("amdgpu/stoney_mec.bin");
80MODULE_FIRMWARE("amdgpu/stoney_rlc.bin");
81
76MODULE_FIRMWARE("amdgpu/tonga_ce.bin"); 82MODULE_FIRMWARE("amdgpu/tonga_ce.bin");
77MODULE_FIRMWARE("amdgpu/tonga_pfp.bin"); 83MODULE_FIRMWARE("amdgpu/tonga_pfp.bin");
78MODULE_FIRMWARE("amdgpu/tonga_me.bin"); 84MODULE_FIRMWARE("amdgpu/tonga_me.bin");
@@ -229,11 +235,13 @@ static const u32 fiji_golden_common_all[] =
229 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, 235 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
230 mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x3a00161a, 236 mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x3a00161a,
231 mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x0000002e, 237 mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x0000002e,
232 mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003, 238 mmGB_ADDR_CONFIG, 0xffffffff, 0x22011003,
233 mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800, 239 mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
234 mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800, 240 mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
235 mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00007FBF, 241 mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00007FBF,
236 mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00007FAF 242 mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00007FAF,
243 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
244 mmSPI_CONFIG_CNTL_1, 0x0000000f, 0x00000009,
237}; 245};
238 246
239static const u32 golden_settings_fiji_a10[] = 247static const u32 golden_settings_fiji_a10[] =
@@ -241,24 +249,26 @@ static const u32 golden_settings_fiji_a10[] =
241 mmCB_HW_CONTROL_3, 0x000001ff, 0x00000040, 249 mmCB_HW_CONTROL_3, 0x000001ff, 0x00000040,
242 mmDB_DEBUG2, 0xf00fffff, 0x00000400, 250 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
243 mmPA_SC_ENHANCE, 0xffffffff, 0x20000001, 251 mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
244 mmPA_SC_FIFO_DEPTH_CNTL, 0x000003ff, 0x00000100,
245 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000, 252 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
253 mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0001003c,
254 mmSQ_RANDOM_WAVE_PRI, 0x001fffff, 0x000006fd,
246 mmTA_CNTL_AUX, 0x000f000f, 0x000b0000, 255 mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
247 mmTCC_CTRL, 0x00100000, 0xf30fff7f, 256 mmTCC_CTRL, 0x00100000, 0xf31fff7f,
257 mmTCC_EXE_DISABLE, 0x00000002, 0x00000002,
248 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000ff, 258 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000ff,
249 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x7d6cf5e4, 259 mmVGT_RESET_DEBUG, 0x00000004, 0x00000004,
250 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x3928b1a0,
251}; 260};
252 261
253static const u32 fiji_mgcg_cgcg_init[] = 262static const u32 fiji_mgcg_cgcg_init[] =
254{ 263{
255 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xffffffc0, 264 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xffffffff,
256 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000, 265 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
257 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100, 266 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
258 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100, 267 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
259 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100, 268 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
260 mmCGTT_CPC_CLK_CTRL, 0xffffffff, 0x00000100, 269 mmCGTT_CPC_CLK_CTRL, 0xffffffff, 0x00000100,
261 mmCGTT_CPF_CLK_CTRL, 0xffffffff, 0x40000100, 270 mmCGTT_CPF_CLK_CTRL, 0xffffffff, 0x40000100,
271 mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
262 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100, 272 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
263 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100, 273 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
264 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100, 274 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
@@ -286,6 +296,10 @@ static const u32 fiji_mgcg_cgcg_init[] =
286 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96e00200, 296 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96e00200,
287 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100, 297 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
288 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003c, 298 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003c,
299 mmPCIE_INDEX, 0xffffffff, 0x0140001c,
300 mmPCIE_DATA, 0x000f0000, 0x00000000,
301 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
302 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
289 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001, 303 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
290}; 304};
291 305
@@ -493,6 +507,42 @@ static const u32 cz_mgcg_cgcg_init[] =
493 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001, 507 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
494}; 508};
495 509
510static const u32 stoney_golden_settings_a11[] =
511{
512 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
513 mmGB_GPU_ID, 0x0000000f, 0x00000000,
514 mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
515 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
516 mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0001003c,
517 mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
518 mmTCC_CTRL, 0x00100000, 0xf31fff7f,
519 mmTCC_EXE_DISABLE, 0x00000002, 0x00000002,
520 mmTCP_ADDR_CONFIG, 0x0000000f, 0x000000f1,
521 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x10101010,
522};
523
524static const u32 stoney_golden_common_all[] =
525{
526 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
527 mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x00000000,
528 mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x00000000,
529 mmGB_ADDR_CONFIG, 0xffffffff, 0x12010001,
530 mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
531 mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
532 mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00007FBF,
533 mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00007FAF,
534};
535
536static const u32 stoney_mgcg_cgcg_init[] =
537{
538 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
539 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
540 mmCP_MEM_SLP_CNTL, 0xffffffff, 0x00020201,
541 mmRLC_MEM_SLP_CNTL, 0xffffffff, 0x00020201,
542 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
543 mmATC_MISC_CG, 0xffffffff, 0x000c0200,
544};
545
496static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev); 546static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev);
497static void gfx_v8_0_set_irq_funcs(struct amdgpu_device *adev); 547static void gfx_v8_0_set_irq_funcs(struct amdgpu_device *adev);
498static void gfx_v8_0_set_gds_init(struct amdgpu_device *adev); 548static void gfx_v8_0_set_gds_init(struct amdgpu_device *adev);
@@ -545,6 +595,17 @@ static void gfx_v8_0_init_golden_registers(struct amdgpu_device *adev)
545 cz_golden_common_all, 595 cz_golden_common_all,
546 (const u32)ARRAY_SIZE(cz_golden_common_all)); 596 (const u32)ARRAY_SIZE(cz_golden_common_all));
547 break; 597 break;
598 case CHIP_STONEY:
599 amdgpu_program_register_sequence(adev,
600 stoney_mgcg_cgcg_init,
601 (const u32)ARRAY_SIZE(stoney_mgcg_cgcg_init));
602 amdgpu_program_register_sequence(adev,
603 stoney_golden_settings_a11,
604 (const u32)ARRAY_SIZE(stoney_golden_settings_a11));
605 amdgpu_program_register_sequence(adev,
606 stoney_golden_common_all,
607 (const u32)ARRAY_SIZE(stoney_golden_common_all));
608 break;
548 default: 609 default:
549 break; 610 break;
550 } 611 }
@@ -691,6 +752,9 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
691 case CHIP_FIJI: 752 case CHIP_FIJI:
692 chip_name = "fiji"; 753 chip_name = "fiji";
693 break; 754 break;
755 case CHIP_STONEY:
756 chip_name = "stoney";
757 break;
694 default: 758 default:
695 BUG(); 759 BUG();
696 } 760 }
@@ -748,21 +812,23 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
748 adev->gfx.mec_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); 812 adev->gfx.mec_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
749 adev->gfx.mec_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); 813 adev->gfx.mec_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
750 814
751 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); 815 if (adev->asic_type != CHIP_STONEY) {
752 err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); 816 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name);
753 if (!err) { 817 err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
754 err = amdgpu_ucode_validate(adev->gfx.mec2_fw); 818 if (!err) {
755 if (err) 819 err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
756 goto out; 820 if (err)
757 cp_hdr = (const struct gfx_firmware_header_v1_0 *) 821 goto out;
758 adev->gfx.mec2_fw->data; 822 cp_hdr = (const struct gfx_firmware_header_v1_0 *)
759 adev->gfx.mec2_fw_version = le32_to_cpu( 823 adev->gfx.mec2_fw->data;
760 cp_hdr->header.ucode_version); 824 adev->gfx.mec2_fw_version =
761 adev->gfx.mec2_feature_version = le32_to_cpu( 825 le32_to_cpu(cp_hdr->header.ucode_version);
762 cp_hdr->ucode_feature_version); 826 adev->gfx.mec2_feature_version =
763 } else { 827 le32_to_cpu(cp_hdr->ucode_feature_version);
764 err = 0; 828 } else {
765 adev->gfx.mec2_fw = NULL; 829 err = 0;
830 adev->gfx.mec2_fw = NULL;
831 }
766 } 832 }
767 833
768 if (adev->firmware.smu_load) { 834 if (adev->firmware.smu_load) {
@@ -903,6 +969,232 @@ static int gfx_v8_0_mec_init(struct amdgpu_device *adev)
903 return 0; 969 return 0;
904} 970}
905 971
972static void gfx_v8_0_gpu_early_init(struct amdgpu_device *adev)
973{
974 u32 gb_addr_config;
975 u32 mc_shared_chmap, mc_arb_ramcfg;
976 u32 dimm00_addr_map, dimm01_addr_map, dimm10_addr_map, dimm11_addr_map;
977 u32 tmp;
978
979 switch (adev->asic_type) {
980 case CHIP_TOPAZ:
981 adev->gfx.config.max_shader_engines = 1;
982 adev->gfx.config.max_tile_pipes = 2;
983 adev->gfx.config.max_cu_per_sh = 6;
984 adev->gfx.config.max_sh_per_se = 1;
985 adev->gfx.config.max_backends_per_se = 2;
986 adev->gfx.config.max_texture_channel_caches = 2;
987 adev->gfx.config.max_gprs = 256;
988 adev->gfx.config.max_gs_threads = 32;
989 adev->gfx.config.max_hw_contexts = 8;
990
991 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
992 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
993 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
994 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
995 gb_addr_config = TOPAZ_GB_ADDR_CONFIG_GOLDEN;
996 break;
997 case CHIP_FIJI:
998 adev->gfx.config.max_shader_engines = 4;
999 adev->gfx.config.max_tile_pipes = 16;
1000 adev->gfx.config.max_cu_per_sh = 16;
1001 adev->gfx.config.max_sh_per_se = 1;
1002 adev->gfx.config.max_backends_per_se = 4;
1003 adev->gfx.config.max_texture_channel_caches = 8;
1004 adev->gfx.config.max_gprs = 256;
1005 adev->gfx.config.max_gs_threads = 32;
1006 adev->gfx.config.max_hw_contexts = 8;
1007
1008 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1009 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1010 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1011 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1012 gb_addr_config = TONGA_GB_ADDR_CONFIG_GOLDEN;
1013 break;
1014 case CHIP_TONGA:
1015 adev->gfx.config.max_shader_engines = 4;
1016 adev->gfx.config.max_tile_pipes = 8;
1017 adev->gfx.config.max_cu_per_sh = 8;
1018 adev->gfx.config.max_sh_per_se = 1;
1019 adev->gfx.config.max_backends_per_se = 2;
1020 adev->gfx.config.max_texture_channel_caches = 8;
1021 adev->gfx.config.max_gprs = 256;
1022 adev->gfx.config.max_gs_threads = 32;
1023 adev->gfx.config.max_hw_contexts = 8;
1024
1025 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1026 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1027 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1028 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1029 gb_addr_config = TONGA_GB_ADDR_CONFIG_GOLDEN;
1030 break;
1031 case CHIP_CARRIZO:
1032 adev->gfx.config.max_shader_engines = 1;
1033 adev->gfx.config.max_tile_pipes = 2;
1034 adev->gfx.config.max_sh_per_se = 1;
1035 adev->gfx.config.max_backends_per_se = 2;
1036
1037 switch (adev->pdev->revision) {
1038 case 0xc4:
1039 case 0x84:
1040 case 0xc8:
1041 case 0xcc:
1042 case 0xe1:
1043 case 0xe3:
1044 /* B10 */
1045 adev->gfx.config.max_cu_per_sh = 8;
1046 break;
1047 case 0xc5:
1048 case 0x81:
1049 case 0x85:
1050 case 0xc9:
1051 case 0xcd:
1052 case 0xe2:
1053 case 0xe4:
1054 /* B8 */
1055 adev->gfx.config.max_cu_per_sh = 6;
1056 break;
1057 case 0xc6:
1058 case 0xca:
1059 case 0xce:
1060 case 0x88:
1061 /* B6 */
1062 adev->gfx.config.max_cu_per_sh = 6;
1063 break;
1064 case 0xc7:
1065 case 0x87:
1066 case 0xcb:
1067 case 0xe5:
1068 case 0x89:
1069 default:
1070 /* B4 */
1071 adev->gfx.config.max_cu_per_sh = 4;
1072 break;
1073 }
1074
1075 adev->gfx.config.max_texture_channel_caches = 2;
1076 adev->gfx.config.max_gprs = 256;
1077 adev->gfx.config.max_gs_threads = 32;
1078 adev->gfx.config.max_hw_contexts = 8;
1079
1080 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1081 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1082 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1083 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1084 gb_addr_config = CARRIZO_GB_ADDR_CONFIG_GOLDEN;
1085 break;
1086 case CHIP_STONEY:
1087 adev->gfx.config.max_shader_engines = 1;
1088 adev->gfx.config.max_tile_pipes = 2;
1089 adev->gfx.config.max_sh_per_se = 1;
1090 adev->gfx.config.max_backends_per_se = 1;
1091
1092 switch (adev->pdev->revision) {
1093 case 0xc0:
1094 case 0xc1:
1095 case 0xc2:
1096 case 0xc4:
1097 case 0xc8:
1098 case 0xc9:
1099 adev->gfx.config.max_cu_per_sh = 3;
1100 break;
1101 case 0xd0:
1102 case 0xd1:
1103 case 0xd2:
1104 default:
1105 adev->gfx.config.max_cu_per_sh = 2;
1106 break;
1107 }
1108
1109 adev->gfx.config.max_texture_channel_caches = 2;
1110 adev->gfx.config.max_gprs = 256;
1111 adev->gfx.config.max_gs_threads = 16;
1112 adev->gfx.config.max_hw_contexts = 8;
1113
1114 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1115 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1116 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1117 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1118 gb_addr_config = CARRIZO_GB_ADDR_CONFIG_GOLDEN;
1119 break;
1120 default:
1121 adev->gfx.config.max_shader_engines = 2;
1122 adev->gfx.config.max_tile_pipes = 4;
1123 adev->gfx.config.max_cu_per_sh = 2;
1124 adev->gfx.config.max_sh_per_se = 1;
1125 adev->gfx.config.max_backends_per_se = 2;
1126 adev->gfx.config.max_texture_channel_caches = 4;
1127 adev->gfx.config.max_gprs = 256;
1128 adev->gfx.config.max_gs_threads = 32;
1129 adev->gfx.config.max_hw_contexts = 8;
1130
1131 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1132 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1133 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1134 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1135 gb_addr_config = TONGA_GB_ADDR_CONFIG_GOLDEN;
1136 break;
1137 }
1138
1139 mc_shared_chmap = RREG32(mmMC_SHARED_CHMAP);
1140 adev->gfx.config.mc_arb_ramcfg = RREG32(mmMC_ARB_RAMCFG);
1141 mc_arb_ramcfg = adev->gfx.config.mc_arb_ramcfg;
1142
1143 adev->gfx.config.num_tile_pipes = adev->gfx.config.max_tile_pipes;
1144 adev->gfx.config.mem_max_burst_length_bytes = 256;
1145 if (adev->flags & AMD_IS_APU) {
1146 /* Get memory bank mapping mode. */
1147 tmp = RREG32(mmMC_FUS_DRAM0_BANK_ADDR_MAPPING);
1148 dimm00_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM0_BANK_ADDR_MAPPING, DIMM0ADDRMAP);
1149 dimm01_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM0_BANK_ADDR_MAPPING, DIMM1ADDRMAP);
1150
1151 tmp = RREG32(mmMC_FUS_DRAM1_BANK_ADDR_MAPPING);
1152 dimm10_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM1_BANK_ADDR_MAPPING, DIMM0ADDRMAP);
1153 dimm11_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM1_BANK_ADDR_MAPPING, DIMM1ADDRMAP);
1154
1155 /* Validate settings in case only one DIMM installed. */
1156 if ((dimm00_addr_map == 0) || (dimm00_addr_map == 3) || (dimm00_addr_map == 4) || (dimm00_addr_map > 12))
1157 dimm00_addr_map = 0;
1158 if ((dimm01_addr_map == 0) || (dimm01_addr_map == 3) || (dimm01_addr_map == 4) || (dimm01_addr_map > 12))
1159 dimm01_addr_map = 0;
1160 if ((dimm10_addr_map == 0) || (dimm10_addr_map == 3) || (dimm10_addr_map == 4) || (dimm10_addr_map > 12))
1161 dimm10_addr_map = 0;
1162 if ((dimm11_addr_map == 0) || (dimm11_addr_map == 3) || (dimm11_addr_map == 4) || (dimm11_addr_map > 12))
1163 dimm11_addr_map = 0;
1164
1165 /* If DIMM Addr map is 8GB, ROW size should be 2KB. Otherwise 1KB. */
1166 /* If ROW size(DIMM1) != ROW size(DMIMM0), ROW size should be larger one. */
1167 if ((dimm00_addr_map == 11) || (dimm01_addr_map == 11) || (dimm10_addr_map == 11) || (dimm11_addr_map == 11))
1168 adev->gfx.config.mem_row_size_in_kb = 2;
1169 else
1170 adev->gfx.config.mem_row_size_in_kb = 1;
1171 } else {
1172 tmp = REG_GET_FIELD(mc_arb_ramcfg, MC_ARB_RAMCFG, NOOFCOLS);
1173 adev->gfx.config.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
1174 if (adev->gfx.config.mem_row_size_in_kb > 4)
1175 adev->gfx.config.mem_row_size_in_kb = 4;
1176 }
1177
1178 adev->gfx.config.shader_engine_tile_size = 32;
1179 adev->gfx.config.num_gpus = 1;
1180 adev->gfx.config.multi_gpu_tile_size = 64;
1181
1182 /* fix up row size */
1183 switch (adev->gfx.config.mem_row_size_in_kb) {
1184 case 1:
1185 default:
1186 gb_addr_config = REG_SET_FIELD(gb_addr_config, GB_ADDR_CONFIG, ROW_SIZE, 0);
1187 break;
1188 case 2:
1189 gb_addr_config = REG_SET_FIELD(gb_addr_config, GB_ADDR_CONFIG, ROW_SIZE, 1);
1190 break;
1191 case 4:
1192 gb_addr_config = REG_SET_FIELD(gb_addr_config, GB_ADDR_CONFIG, ROW_SIZE, 2);
1193 break;
1194 }
1195 adev->gfx.config.gb_addr_config = gb_addr_config;
1196}
1197
906static int gfx_v8_0_sw_init(void *handle) 1198static int gfx_v8_0_sw_init(void *handle)
907{ 1199{
908 int i, r; 1200 int i, r;
@@ -1010,6 +1302,8 @@ static int gfx_v8_0_sw_init(void *handle)
1010 1302
1011 adev->gfx.ce_ram_size = 0x8000; 1303 adev->gfx.ce_ram_size = 0x8000;
1012 1304
1305 gfx_v8_0_gpu_early_init(adev);
1306
1013 return 0; 1307 return 0;
1014} 1308}
1015 1309
@@ -1610,6 +1904,273 @@ static void gfx_v8_0_tiling_mode_table_init(struct amdgpu_device *adev)
1610 WREG32(mmGB_MACROTILE_MODE0 + reg_offset, gb_tile_moden); 1904 WREG32(mmGB_MACROTILE_MODE0 + reg_offset, gb_tile_moden);
1611 } 1905 }
1612 break; 1906 break;
1907 case CHIP_STONEY:
1908 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
1909 switch (reg_offset) {
1910 case 0:
1911 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1912 PIPE_CONFIG(ADDR_SURF_P2) |
1913 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
1914 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
1915 break;
1916 case 1:
1917 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1918 PIPE_CONFIG(ADDR_SURF_P2) |
1919 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
1920 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
1921 break;
1922 case 2:
1923 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1924 PIPE_CONFIG(ADDR_SURF_P2) |
1925 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
1926 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
1927 break;
1928 case 3:
1929 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1930 PIPE_CONFIG(ADDR_SURF_P2) |
1931 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
1932 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
1933 break;
1934 case 4:
1935 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1936 PIPE_CONFIG(ADDR_SURF_P2) |
1937 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
1938 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
1939 break;
1940 case 5:
1941 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
1942 PIPE_CONFIG(ADDR_SURF_P2) |
1943 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
1944 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
1945 break;
1946 case 6:
1947 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
1948 PIPE_CONFIG(ADDR_SURF_P2) |
1949 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
1950 MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
1951 break;
1952 case 8:
1953 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
1954 PIPE_CONFIG(ADDR_SURF_P2));
1955 break;
1956 case 9:
1957 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
1958 PIPE_CONFIG(ADDR_SURF_P2) |
1959 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
1960 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1961 break;
1962 case 10:
1963 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1964 PIPE_CONFIG(ADDR_SURF_P2) |
1965 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
1966 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1967 break;
1968 case 11:
1969 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
1970 PIPE_CONFIG(ADDR_SURF_P2) |
1971 MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
1972 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
1973 break;
1974 case 13:
1975 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
1976 PIPE_CONFIG(ADDR_SURF_P2) |
1977 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
1978 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1979 break;
1980 case 14:
1981 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
1982 PIPE_CONFIG(ADDR_SURF_P2) |
1983 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
1984 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1985 break;
1986 case 15:
1987 gb_tile_moden = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
1988 PIPE_CONFIG(ADDR_SURF_P2) |
1989 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
1990 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
1991 break;
1992 case 16:
1993 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
1994 PIPE_CONFIG(ADDR_SURF_P2) |
1995 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
1996 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
1997 break;
1998 case 18:
1999 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
2000 PIPE_CONFIG(ADDR_SURF_P2) |
2001 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2002 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2003 break;
2004 case 19:
2005 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
2006 PIPE_CONFIG(ADDR_SURF_P2) |
2007 MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2008 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2009 break;
2010 case 20:
2011 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
2012 PIPE_CONFIG(ADDR_SURF_P2) |
2013 MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2014 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2015 break;
2016 case 21:
2017 gb_tile_moden = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
2018 PIPE_CONFIG(ADDR_SURF_P2) |
2019 MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2020 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2021 break;
2022 case 22:
2023 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
2024 PIPE_CONFIG(ADDR_SURF_P2) |
2025 MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2026 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2027 break;
2028 case 24:
2029 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
2030 PIPE_CONFIG(ADDR_SURF_P2) |
2031 MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
2032 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2033 break;
2034 case 25:
2035 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
2036 PIPE_CONFIG(ADDR_SURF_P2) |
2037 MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2038 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2039 break;
2040 case 26:
2041 gb_tile_moden = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
2042 PIPE_CONFIG(ADDR_SURF_P2) |
2043 MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
2044 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
2045 break;
2046 case 27:
2047 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
2048 PIPE_CONFIG(ADDR_SURF_P2) |
2049 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2050 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2051 break;
2052 case 28:
2053 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
2054 PIPE_CONFIG(ADDR_SURF_P2) |
2055 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2056 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
2057 break;
2058 case 29:
2059 gb_tile_moden = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
2060 PIPE_CONFIG(ADDR_SURF_P2) |
2061 MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
2062 SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
2063 break;
2064 case 7:
2065 case 12:
2066 case 17:
2067 case 23:
2068 /* unused idx */
2069 continue;
2070 default:
2071 gb_tile_moden = 0;
2072 break;
2073 };
2074 adev->gfx.config.tile_mode_array[reg_offset] = gb_tile_moden;
2075 WREG32(mmGB_TILE_MODE0 + reg_offset, gb_tile_moden);
2076 }
2077 for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) {
2078 switch (reg_offset) {
2079 case 0:
2080 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2081 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2082 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2083 NUM_BANKS(ADDR_SURF_8_BANK));
2084 break;
2085 case 1:
2086 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2087 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2088 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2089 NUM_BANKS(ADDR_SURF_8_BANK));
2090 break;
2091 case 2:
2092 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2093 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2094 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2095 NUM_BANKS(ADDR_SURF_8_BANK));
2096 break;
2097 case 3:
2098 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2099 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2100 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2101 NUM_BANKS(ADDR_SURF_8_BANK));
2102 break;
2103 case 4:
2104 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2105 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2106 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2107 NUM_BANKS(ADDR_SURF_8_BANK));
2108 break;
2109 case 5:
2110 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2111 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2112 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2113 NUM_BANKS(ADDR_SURF_8_BANK));
2114 break;
2115 case 6:
2116 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2117 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2118 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2119 NUM_BANKS(ADDR_SURF_8_BANK));
2120 break;
2121 case 8:
2122 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
2123 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
2124 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2125 NUM_BANKS(ADDR_SURF_16_BANK));
2126 break;
2127 case 9:
2128 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) |
2129 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2130 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2131 NUM_BANKS(ADDR_SURF_16_BANK));
2132 break;
2133 case 10:
2134 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2135 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
2136 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2137 NUM_BANKS(ADDR_SURF_16_BANK));
2138 break;
2139 case 11:
2140 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
2141 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2142 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2143 NUM_BANKS(ADDR_SURF_16_BANK));
2144 break;
2145 case 12:
2146 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2147 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
2148 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2149 NUM_BANKS(ADDR_SURF_16_BANK));
2150 break;
2151 case 13:
2152 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2153 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2154 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
2155 NUM_BANKS(ADDR_SURF_16_BANK));
2156 break;
2157 case 14:
2158 gb_tile_moden = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
2159 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
2160 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
2161 NUM_BANKS(ADDR_SURF_8_BANK));
2162 break;
2163 case 7:
2164 /* unused idx */
2165 continue;
2166 default:
2167 gb_tile_moden = 0;
2168 break;
2169 };
2170 adev->gfx.config.macrotile_mode_array[reg_offset] = gb_tile_moden;
2171 WREG32(mmGB_MACROTILE_MODE0 + reg_offset, gb_tile_moden);
2172 }
2173 break;
1613 case CHIP_CARRIZO: 2174 case CHIP_CARRIZO:
1614 default: 2175 default:
1615 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) { 2176 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
@@ -2043,203 +2604,23 @@ static void gfx_v8_0_init_compute_vmid(struct amdgpu_device *adev)
2043 2604
2044static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) 2605static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
2045{ 2606{
2046 u32 gb_addr_config;
2047 u32 mc_shared_chmap, mc_arb_ramcfg;
2048 u32 dimm00_addr_map, dimm01_addr_map, dimm10_addr_map, dimm11_addr_map;
2049 u32 tmp; 2607 u32 tmp;
2050 int i; 2608 int i;
2051 2609
2052 switch (adev->asic_type) {
2053 case CHIP_TOPAZ:
2054 adev->gfx.config.max_shader_engines = 1;
2055 adev->gfx.config.max_tile_pipes = 2;
2056 adev->gfx.config.max_cu_per_sh = 6;
2057 adev->gfx.config.max_sh_per_se = 1;
2058 adev->gfx.config.max_backends_per_se = 2;
2059 adev->gfx.config.max_texture_channel_caches = 2;
2060 adev->gfx.config.max_gprs = 256;
2061 adev->gfx.config.max_gs_threads = 32;
2062 adev->gfx.config.max_hw_contexts = 8;
2063
2064 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
2065 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
2066 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
2067 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
2068 gb_addr_config = TOPAZ_GB_ADDR_CONFIG_GOLDEN;
2069 break;
2070 case CHIP_FIJI:
2071 adev->gfx.config.max_shader_engines = 4;
2072 adev->gfx.config.max_tile_pipes = 16;
2073 adev->gfx.config.max_cu_per_sh = 16;
2074 adev->gfx.config.max_sh_per_se = 1;
2075 adev->gfx.config.max_backends_per_se = 4;
2076 adev->gfx.config.max_texture_channel_caches = 8;
2077 adev->gfx.config.max_gprs = 256;
2078 adev->gfx.config.max_gs_threads = 32;
2079 adev->gfx.config.max_hw_contexts = 8;
2080
2081 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
2082 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
2083 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
2084 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
2085 gb_addr_config = TONGA_GB_ADDR_CONFIG_GOLDEN;
2086 break;
2087 case CHIP_TONGA:
2088 adev->gfx.config.max_shader_engines = 4;
2089 adev->gfx.config.max_tile_pipes = 8;
2090 adev->gfx.config.max_cu_per_sh = 8;
2091 adev->gfx.config.max_sh_per_se = 1;
2092 adev->gfx.config.max_backends_per_se = 2;
2093 adev->gfx.config.max_texture_channel_caches = 8;
2094 adev->gfx.config.max_gprs = 256;
2095 adev->gfx.config.max_gs_threads = 32;
2096 adev->gfx.config.max_hw_contexts = 8;
2097
2098 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
2099 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
2100 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
2101 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
2102 gb_addr_config = TONGA_GB_ADDR_CONFIG_GOLDEN;
2103 break;
2104 case CHIP_CARRIZO:
2105 adev->gfx.config.max_shader_engines = 1;
2106 adev->gfx.config.max_tile_pipes = 2;
2107 adev->gfx.config.max_sh_per_se = 1;
2108 adev->gfx.config.max_backends_per_se = 2;
2109
2110 switch (adev->pdev->revision) {
2111 case 0xc4:
2112 case 0x84:
2113 case 0xc8:
2114 case 0xcc:
2115 /* B10 */
2116 adev->gfx.config.max_cu_per_sh = 8;
2117 break;
2118 case 0xc5:
2119 case 0x81:
2120 case 0x85:
2121 case 0xc9:
2122 case 0xcd:
2123 /* B8 */
2124 adev->gfx.config.max_cu_per_sh = 6;
2125 break;
2126 case 0xc6:
2127 case 0xca:
2128 case 0xce:
2129 /* B6 */
2130 adev->gfx.config.max_cu_per_sh = 6;
2131 break;
2132 case 0xc7:
2133 case 0x87:
2134 case 0xcb:
2135 default:
2136 /* B4 */
2137 adev->gfx.config.max_cu_per_sh = 4;
2138 break;
2139 }
2140
2141 adev->gfx.config.max_texture_channel_caches = 2;
2142 adev->gfx.config.max_gprs = 256;
2143 adev->gfx.config.max_gs_threads = 32;
2144 adev->gfx.config.max_hw_contexts = 8;
2145
2146 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
2147 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
2148 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
2149 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
2150 gb_addr_config = CARRIZO_GB_ADDR_CONFIG_GOLDEN;
2151 break;
2152 default:
2153 adev->gfx.config.max_shader_engines = 2;
2154 adev->gfx.config.max_tile_pipes = 4;
2155 adev->gfx.config.max_cu_per_sh = 2;
2156 adev->gfx.config.max_sh_per_se = 1;
2157 adev->gfx.config.max_backends_per_se = 2;
2158 adev->gfx.config.max_texture_channel_caches = 4;
2159 adev->gfx.config.max_gprs = 256;
2160 adev->gfx.config.max_gs_threads = 32;
2161 adev->gfx.config.max_hw_contexts = 8;
2162
2163 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
2164 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
2165 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
2166 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
2167 gb_addr_config = TONGA_GB_ADDR_CONFIG_GOLDEN;
2168 break;
2169 }
2170
2171 tmp = RREG32(mmGRBM_CNTL); 2610 tmp = RREG32(mmGRBM_CNTL);
2172 tmp = REG_SET_FIELD(tmp, GRBM_CNTL, READ_TIMEOUT, 0xff); 2611 tmp = REG_SET_FIELD(tmp, GRBM_CNTL, READ_TIMEOUT, 0xff);
2173 WREG32(mmGRBM_CNTL, tmp); 2612 WREG32(mmGRBM_CNTL, tmp);
2174 2613
2175 mc_shared_chmap = RREG32(mmMC_SHARED_CHMAP); 2614 WREG32(mmGB_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
2176 adev->gfx.config.mc_arb_ramcfg = RREG32(mmMC_ARB_RAMCFG); 2615 WREG32(mmHDP_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
2177 mc_arb_ramcfg = adev->gfx.config.mc_arb_ramcfg; 2616 WREG32(mmDMIF_ADDR_CALC, adev->gfx.config.gb_addr_config);
2178
2179 adev->gfx.config.num_tile_pipes = adev->gfx.config.max_tile_pipes;
2180 adev->gfx.config.mem_max_burst_length_bytes = 256;
2181 if (adev->flags & AMD_IS_APU) {
2182 /* Get memory bank mapping mode. */
2183 tmp = RREG32(mmMC_FUS_DRAM0_BANK_ADDR_MAPPING);
2184 dimm00_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM0_BANK_ADDR_MAPPING, DIMM0ADDRMAP);
2185 dimm01_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM0_BANK_ADDR_MAPPING, DIMM1ADDRMAP);
2186
2187 tmp = RREG32(mmMC_FUS_DRAM1_BANK_ADDR_MAPPING);
2188 dimm10_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM1_BANK_ADDR_MAPPING, DIMM0ADDRMAP);
2189 dimm11_addr_map = REG_GET_FIELD(tmp, MC_FUS_DRAM1_BANK_ADDR_MAPPING, DIMM1ADDRMAP);
2190
2191 /* Validate settings in case only one DIMM installed. */
2192 if ((dimm00_addr_map == 0) || (dimm00_addr_map == 3) || (dimm00_addr_map == 4) || (dimm00_addr_map > 12))
2193 dimm00_addr_map = 0;
2194 if ((dimm01_addr_map == 0) || (dimm01_addr_map == 3) || (dimm01_addr_map == 4) || (dimm01_addr_map > 12))
2195 dimm01_addr_map = 0;
2196 if ((dimm10_addr_map == 0) || (dimm10_addr_map == 3) || (dimm10_addr_map == 4) || (dimm10_addr_map > 12))
2197 dimm10_addr_map = 0;
2198 if ((dimm11_addr_map == 0) || (dimm11_addr_map == 3) || (dimm11_addr_map == 4) || (dimm11_addr_map > 12))
2199 dimm11_addr_map = 0;
2200
2201 /* If DIMM Addr map is 8GB, ROW size should be 2KB. Otherwise 1KB. */
2202 /* If ROW size(DIMM1) != ROW size(DMIMM0), ROW size should be larger one. */
2203 if ((dimm00_addr_map == 11) || (dimm01_addr_map == 11) || (dimm10_addr_map == 11) || (dimm11_addr_map == 11))
2204 adev->gfx.config.mem_row_size_in_kb = 2;
2205 else
2206 adev->gfx.config.mem_row_size_in_kb = 1;
2207 } else {
2208 tmp = REG_GET_FIELD(mc_arb_ramcfg, MC_ARB_RAMCFG, NOOFCOLS);
2209 adev->gfx.config.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
2210 if (adev->gfx.config.mem_row_size_in_kb > 4)
2211 adev->gfx.config.mem_row_size_in_kb = 4;
2212 }
2213
2214 adev->gfx.config.shader_engine_tile_size = 32;
2215 adev->gfx.config.num_gpus = 1;
2216 adev->gfx.config.multi_gpu_tile_size = 64;
2217
2218 /* fix up row size */
2219 switch (adev->gfx.config.mem_row_size_in_kb) {
2220 case 1:
2221 default:
2222 gb_addr_config = REG_SET_FIELD(gb_addr_config, GB_ADDR_CONFIG, ROW_SIZE, 0);
2223 break;
2224 case 2:
2225 gb_addr_config = REG_SET_FIELD(gb_addr_config, GB_ADDR_CONFIG, ROW_SIZE, 1);
2226 break;
2227 case 4:
2228 gb_addr_config = REG_SET_FIELD(gb_addr_config, GB_ADDR_CONFIG, ROW_SIZE, 2);
2229 break;
2230 }
2231 adev->gfx.config.gb_addr_config = gb_addr_config;
2232
2233 WREG32(mmGB_ADDR_CONFIG, gb_addr_config);
2234 WREG32(mmHDP_ADDR_CONFIG, gb_addr_config);
2235 WREG32(mmDMIF_ADDR_CALC, gb_addr_config);
2236 WREG32(mmSDMA0_TILING_CONFIG + SDMA0_REGISTER_OFFSET, 2617 WREG32(mmSDMA0_TILING_CONFIG + SDMA0_REGISTER_OFFSET,
2237 gb_addr_config & 0x70); 2618 adev->gfx.config.gb_addr_config & 0x70);
2238 WREG32(mmSDMA0_TILING_CONFIG + SDMA1_REGISTER_OFFSET, 2619 WREG32(mmSDMA0_TILING_CONFIG + SDMA1_REGISTER_OFFSET,
2239 gb_addr_config & 0x70); 2620 adev->gfx.config.gb_addr_config & 0x70);
2240 WREG32(mmUVD_UDEC_ADDR_CONFIG, gb_addr_config); 2621 WREG32(mmUVD_UDEC_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
2241 WREG32(mmUVD_UDEC_DB_ADDR_CONFIG, gb_addr_config); 2622 WREG32(mmUVD_UDEC_DB_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
2242 WREG32(mmUVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config); 2623 WREG32(mmUVD_UDEC_DBW_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
2243 2624
2244 gfx_v8_0_tiling_mode_table_init(adev); 2625 gfx_v8_0_tiling_mode_table_init(adev);
2245 2626
@@ -2256,13 +2637,13 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
2256 if (i == 0) { 2637 if (i == 0) {
2257 tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, DEFAULT_MTYPE, MTYPE_UC); 2638 tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, DEFAULT_MTYPE, MTYPE_UC);
2258 tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, APE1_MTYPE, MTYPE_UC); 2639 tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, APE1_MTYPE, MTYPE_UC);
2259 tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, ALIGNMENT_MODE, 2640 tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, ALIGNMENT_MODE,
2260 SH_MEM_ALIGNMENT_MODE_UNALIGNED); 2641 SH_MEM_ALIGNMENT_MODE_UNALIGNED);
2261 WREG32(mmSH_MEM_CONFIG, tmp); 2642 WREG32(mmSH_MEM_CONFIG, tmp);
2262 } else { 2643 } else {
2263 tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, DEFAULT_MTYPE, MTYPE_NC); 2644 tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, DEFAULT_MTYPE, MTYPE_NC);
2264 tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, APE1_MTYPE, MTYPE_NC); 2645 tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, APE1_MTYPE, MTYPE_NC);
2265 tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, ALIGNMENT_MODE, 2646 tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, ALIGNMENT_MODE,
2266 SH_MEM_ALIGNMENT_MODE_UNALIGNED); 2647 SH_MEM_ALIGNMENT_MODE_UNALIGNED);
2267 WREG32(mmSH_MEM_CONFIG, tmp); 2648 WREG32(mmSH_MEM_CONFIG, tmp);
2268 } 2649 }
@@ -2377,7 +2758,7 @@ static void gfx_v8_0_rlc_start(struct amdgpu_device *adev)
2377 WREG32(mmRLC_CNTL, tmp); 2758 WREG32(mmRLC_CNTL, tmp);
2378 2759
2379 /* carrizo do enable cp interrupt after cp inited */ 2760 /* carrizo do enable cp interrupt after cp inited */
2380 if (adev->asic_type != CHIP_CARRIZO) 2761 if (!(adev->flags & AMD_IS_APU))
2381 gfx_v8_0_enable_gui_idle_interrupt(adev, true); 2762 gfx_v8_0_enable_gui_idle_interrupt(adev, true);
2382 2763
2383 udelay(50); 2764 udelay(50);
@@ -2599,6 +2980,10 @@ static int gfx_v8_0_cp_gfx_start(struct amdgpu_device *adev)
2599 amdgpu_ring_write(ring, 0x00000002); 2980 amdgpu_ring_write(ring, 0x00000002);
2600 amdgpu_ring_write(ring, 0x00000000); 2981 amdgpu_ring_write(ring, 0x00000000);
2601 break; 2982 break;
2983 case CHIP_STONEY:
2984 amdgpu_ring_write(ring, 0x00000000);
2985 amdgpu_ring_write(ring, 0x00000000);
2986 break;
2602 default: 2987 default:
2603 BUG(); 2988 BUG();
2604 } 2989 }
@@ -3233,7 +3618,8 @@ static int gfx_v8_0_cp_compute_resume(struct amdgpu_device *adev)
3233 /* enable the doorbell if requested */ 3618 /* enable the doorbell if requested */
3234 if (use_doorbell) { 3619 if (use_doorbell) {
3235 if ((adev->asic_type == CHIP_CARRIZO) || 3620 if ((adev->asic_type == CHIP_CARRIZO) ||
3236 (adev->asic_type == CHIP_FIJI)) { 3621 (adev->asic_type == CHIP_FIJI) ||
3622 (adev->asic_type == CHIP_STONEY)) {
3237 WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, 3623 WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER,
3238 AMDGPU_DOORBELL_KIQ << 2); 3624 AMDGPU_DOORBELL_KIQ << 2);
3239 WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, 3625 WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER,
@@ -3305,7 +3691,7 @@ static int gfx_v8_0_cp_resume(struct amdgpu_device *adev)
3305{ 3691{
3306 int r; 3692 int r;
3307 3693
3308 if (adev->asic_type != CHIP_CARRIZO) 3694 if (!(adev->flags & AMD_IS_APU))
3309 gfx_v8_0_enable_gui_idle_interrupt(adev, false); 3695 gfx_v8_0_enable_gui_idle_interrupt(adev, false);
3310 3696
3311 if (!adev->firmware.smu_load) { 3697 if (!adev->firmware.smu_load) {
@@ -4068,15 +4454,6 @@ static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
4068 } 4454 }
4069} 4455}
4070 4456
4071static bool gfx_v8_0_ring_is_lockup(struct amdgpu_ring *ring)
4072{
4073 if (gfx_v8_0_is_idle(ring->adev)) {
4074 amdgpu_ring_lockup_update(ring);
4075 return false;
4076 }
4077 return amdgpu_ring_test_lockup(ring);
4078}
4079
4080static u32 gfx_v8_0_ring_get_rptr_compute(struct amdgpu_ring *ring) 4457static u32 gfx_v8_0_ring_get_rptr_compute(struct amdgpu_ring *ring)
4081{ 4458{
4082 return ring->adev->wb.wb[ring->rptr_offs]; 4459 return ring->adev->wb.wb[ring->rptr_offs];
@@ -4107,6 +4484,7 @@ static void gfx_v8_0_ring_emit_fence_compute(struct amdgpu_ring *ring,
4107 amdgpu_ring_write(ring, PACKET3(PACKET3_RELEASE_MEM, 5)); 4484 amdgpu_ring_write(ring, PACKET3(PACKET3_RELEASE_MEM, 5));
4108 amdgpu_ring_write(ring, (EOP_TCL1_ACTION_EN | 4485 amdgpu_ring_write(ring, (EOP_TCL1_ACTION_EN |
4109 EOP_TC_ACTION_EN | 4486 EOP_TC_ACTION_EN |
4487 EOP_TC_WB_ACTION_EN |
4110 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | 4488 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
4111 EVENT_INDEX(5))); 4489 EVENT_INDEX(5)));
4112 amdgpu_ring_write(ring, DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0)); 4490 amdgpu_ring_write(ring, DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0));
@@ -4357,7 +4735,6 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = {
4357 .emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush, 4735 .emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush,
4358 .test_ring = gfx_v8_0_ring_test_ring, 4736 .test_ring = gfx_v8_0_ring_test_ring,
4359 .test_ib = gfx_v8_0_ring_test_ib, 4737 .test_ib = gfx_v8_0_ring_test_ib,
4360 .is_lockup = gfx_v8_0_ring_is_lockup,
4361 .insert_nop = amdgpu_ring_insert_nop, 4738 .insert_nop = amdgpu_ring_insert_nop,
4362}; 4739};
4363 4740
@@ -4374,7 +4751,6 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = {
4374 .emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush, 4751 .emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush,
4375 .test_ring = gfx_v8_0_ring_test_ring, 4752 .test_ring = gfx_v8_0_ring_test_ring,
4376 .test_ib = gfx_v8_0_ring_test_ib, 4753 .test_ib = gfx_v8_0_ring_test_ib,
4377 .is_lockup = gfx_v8_0_ring_is_lockup,
4378 .insert_nop = amdgpu_ring_insert_nop, 4754 .insert_nop = amdgpu_ring_insert_nop,
4379}; 4755};
4380 4756
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index fab5471d25d7..85bbcdc73fff 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -436,6 +436,33 @@ static int gmc_v7_0_gart_set_pte_pde(struct amdgpu_device *adev,
436} 436}
437 437
438/** 438/**
439 * gmc_v8_0_set_fault_enable_default - update VM fault handling
440 *
441 * @adev: amdgpu_device pointer
442 * @value: true redirects VM faults to the default page
443 */
444static void gmc_v7_0_set_fault_enable_default(struct amdgpu_device *adev,
445 bool value)
446{
447 u32 tmp;
448
449 tmp = RREG32(mmVM_CONTEXT1_CNTL);
450 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
451 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
452 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
453 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
454 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
455 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, value);
456 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
457 VALID_PROTECTION_FAULT_ENABLE_DEFAULT, value);
458 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
459 READ_PROTECTION_FAULT_ENABLE_DEFAULT, value);
460 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
461 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
462 WREG32(mmVM_CONTEXT1_CNTL, tmp);
463}
464
465/**
439 * gmc_v7_0_gart_enable - gart enable 466 * gmc_v7_0_gart_enable - gart enable
440 * 467 *
441 * @adev: amdgpu_device pointer 468 * @adev: amdgpu_device pointer
@@ -523,15 +550,13 @@ static int gmc_v7_0_gart_enable(struct amdgpu_device *adev)
523 tmp = RREG32(mmVM_CONTEXT1_CNTL); 550 tmp = RREG32(mmVM_CONTEXT1_CNTL);
524 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1); 551 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1);
525 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH, 1); 552 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH, 1);
526 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
527 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
528 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
529 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
530 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
531 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
532 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_BLOCK_SIZE, 553 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_BLOCK_SIZE,
533 amdgpu_vm_block_size - 9); 554 amdgpu_vm_block_size - 9);
534 WREG32(mmVM_CONTEXT1_CNTL, tmp); 555 WREG32(mmVM_CONTEXT1_CNTL, tmp);
556 if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS)
557 gmc_v7_0_set_fault_enable_default(adev, false);
558 else
559 gmc_v7_0_set_fault_enable_default(adev, true);
535 560
536 if (adev->asic_type == CHIP_KAVERI) { 561 if (adev->asic_type == CHIP_KAVERI) {
537 tmp = RREG32(mmCHUB_CONTROL); 562 tmp = RREG32(mmCHUB_CONTROL);
@@ -940,7 +965,7 @@ static int gmc_v7_0_sw_fini(void *handle)
940 965
941 if (adev->vm_manager.enabled) { 966 if (adev->vm_manager.enabled) {
942 for (i = 0; i < AMDGPU_NUM_VM; ++i) 967 for (i = 0; i < AMDGPU_NUM_VM; ++i)
943 amdgpu_fence_unref(&adev->vm_manager.active[i]); 968 fence_put(adev->vm_manager.active[i]);
944 gmc_v7_0_vm_fini(adev); 969 gmc_v7_0_vm_fini(adev);
945 adev->vm_manager.enabled = false; 970 adev->vm_manager.enabled = false;
946 } 971 }
@@ -990,7 +1015,7 @@ static int gmc_v7_0_suspend(void *handle)
990 1015
991 if (adev->vm_manager.enabled) { 1016 if (adev->vm_manager.enabled) {
992 for (i = 0; i < AMDGPU_NUM_VM; ++i) 1017 for (i = 0; i < AMDGPU_NUM_VM; ++i)
993 amdgpu_fence_unref(&adev->vm_manager.active[i]); 1018 fence_put(adev->vm_manager.active[i]);
994 gmc_v7_0_vm_fini(adev); 1019 gmc_v7_0_vm_fini(adev);
995 adev->vm_manager.enabled = false; 1020 adev->vm_manager.enabled = false;
996 } 1021 }
@@ -1268,6 +1293,9 @@ static int gmc_v7_0_process_interrupt(struct amdgpu_device *adev,
1268 if (!addr && !status) 1293 if (!addr && !status)
1269 return 0; 1294 return 0;
1270 1295
1296 if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_FIRST)
1297 gmc_v7_0_set_fault_enable_default(adev, false);
1298
1271 dev_err(adev->dev, "GPU fault detected: %d 0x%08x\n", 1299 dev_err(adev->dev, "GPU fault detected: %d 0x%08x\n",
1272 entry->src_id, entry->src_data); 1300 entry->src_id, entry->src_data);
1273 dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", 1301 dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index 7bc9e9fcf3d2..1bcc4e74e3b4 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -93,6 +93,12 @@ static const u32 cz_mgcg_cgcg_init[] =
93 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104 93 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104
94}; 94};
95 95
96static const u32 stoney_mgcg_cgcg_init[] =
97{
98 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104
99};
100
101
96static void gmc_v8_0_init_golden_registers(struct amdgpu_device *adev) 102static void gmc_v8_0_init_golden_registers(struct amdgpu_device *adev)
97{ 103{
98 switch (adev->asic_type) { 104 switch (adev->asic_type) {
@@ -125,6 +131,11 @@ static void gmc_v8_0_init_golden_registers(struct amdgpu_device *adev)
125 cz_mgcg_cgcg_init, 131 cz_mgcg_cgcg_init,
126 (const u32)ARRAY_SIZE(cz_mgcg_cgcg_init)); 132 (const u32)ARRAY_SIZE(cz_mgcg_cgcg_init));
127 break; 133 break;
134 case CHIP_STONEY:
135 amdgpu_program_register_sequence(adev,
136 stoney_mgcg_cgcg_init,
137 (const u32)ARRAY_SIZE(stoney_mgcg_cgcg_init));
138 break;
128 default: 139 default:
129 break; 140 break;
130 } 141 }
@@ -228,6 +239,7 @@ static int gmc_v8_0_init_microcode(struct amdgpu_device *adev)
228 chip_name = "fiji"; 239 chip_name = "fiji";
229 break; 240 break;
230 case CHIP_CARRIZO: 241 case CHIP_CARRIZO:
242 case CHIP_STONEY:
231 return 0; 243 return 0;
232 default: BUG(); 244 default: BUG();
233 } 245 }
@@ -550,6 +562,35 @@ static int gmc_v8_0_gart_set_pte_pde(struct amdgpu_device *adev,
550} 562}
551 563
552/** 564/**
565 * gmc_v8_0_set_fault_enable_default - update VM fault handling
566 *
567 * @adev: amdgpu_device pointer
568 * @value: true redirects VM faults to the default page
569 */
570static void gmc_v8_0_set_fault_enable_default(struct amdgpu_device *adev,
571 bool value)
572{
573 u32 tmp;
574
575 tmp = RREG32(mmVM_CONTEXT1_CNTL);
576 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
577 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
578 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
579 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
580 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
581 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, value);
582 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
583 VALID_PROTECTION_FAULT_ENABLE_DEFAULT, value);
584 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
585 READ_PROTECTION_FAULT_ENABLE_DEFAULT, value);
586 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
587 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
588 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
589 EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
590 WREG32(mmVM_CONTEXT1_CNTL, tmp);
591}
592
593/**
553 * gmc_v8_0_gart_enable - gart enable 594 * gmc_v8_0_gart_enable - gart enable
554 * 595 *
555 * @adev: amdgpu_device pointer 596 * @adev: amdgpu_device pointer
@@ -663,6 +704,10 @@ static int gmc_v8_0_gart_enable(struct amdgpu_device *adev)
663 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_BLOCK_SIZE, 704 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_BLOCK_SIZE,
664 amdgpu_vm_block_size - 9); 705 amdgpu_vm_block_size - 9);
665 WREG32(mmVM_CONTEXT1_CNTL, tmp); 706 WREG32(mmVM_CONTEXT1_CNTL, tmp);
707 if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS)
708 gmc_v8_0_set_fault_enable_default(adev, false);
709 else
710 gmc_v8_0_set_fault_enable_default(adev, true);
666 711
667 gmc_v8_0_gart_flush_gpu_tlb(adev, 0); 712 gmc_v8_0_gart_flush_gpu_tlb(adev, 0);
668 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 713 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
@@ -939,7 +984,7 @@ static int gmc_v8_0_sw_fini(void *handle)
939 984
940 if (adev->vm_manager.enabled) { 985 if (adev->vm_manager.enabled) {
941 for (i = 0; i < AMDGPU_NUM_VM; ++i) 986 for (i = 0; i < AMDGPU_NUM_VM; ++i)
942 amdgpu_fence_unref(&adev->vm_manager.active[i]); 987 fence_put(adev->vm_manager.active[i]);
943 gmc_v8_0_vm_fini(adev); 988 gmc_v8_0_vm_fini(adev);
944 adev->vm_manager.enabled = false; 989 adev->vm_manager.enabled = false;
945 } 990 }
@@ -991,7 +1036,7 @@ static int gmc_v8_0_suspend(void *handle)
991 1036
992 if (adev->vm_manager.enabled) { 1037 if (adev->vm_manager.enabled) {
993 for (i = 0; i < AMDGPU_NUM_VM; ++i) 1038 for (i = 0; i < AMDGPU_NUM_VM; ++i)
994 amdgpu_fence_unref(&adev->vm_manager.active[i]); 1039 fence_put(adev->vm_manager.active[i]);
995 gmc_v8_0_vm_fini(adev); 1040 gmc_v8_0_vm_fini(adev);
996 adev->vm_manager.enabled = false; 1041 adev->vm_manager.enabled = false;
997 } 1042 }
@@ -1268,6 +1313,9 @@ static int gmc_v8_0_process_interrupt(struct amdgpu_device *adev,
1268 if (!addr && !status) 1313 if (!addr && !status)
1269 return 0; 1314 return 0;
1270 1315
1316 if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_FIRST)
1317 gmc_v8_0_set_fault_enable_default(adev, false);
1318
1271 dev_err(adev->dev, "GPU fault detected: %d 0x%08x\n", 1319 dev_err(adev->dev, "GPU fault detected: %d 0x%08x\n",
1272 entry->src_id, entry->src_data); 1320 entry->src_id, entry->src_data);
1273 dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", 1321 dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
index 14e87234171a..2cf50180cc51 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
@@ -118,7 +118,7 @@ static int sdma_v2_4_init_microcode(struct amdgpu_device *adev)
118{ 118{
119 const char *chip_name; 119 const char *chip_name;
120 char fw_name[30]; 120 char fw_name[30];
121 int err, i; 121 int err = 0, i;
122 struct amdgpu_firmware_info *info = NULL; 122 struct amdgpu_firmware_info *info = NULL;
123 const struct common_firmware_header *header = NULL; 123 const struct common_firmware_header *header = NULL;
124 const struct sdma_firmware_header_v1_0 *hdr; 124 const struct sdma_firmware_header_v1_0 *hdr;
@@ -132,27 +132,27 @@ static int sdma_v2_4_init_microcode(struct amdgpu_device *adev)
132 default: BUG(); 132 default: BUG();
133 } 133 }
134 134
135 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 135 for (i = 0; i < adev->sdma.num_instances; i++) {
136 if (i == 0) 136 if (i == 0)
137 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name); 137 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name);
138 else 138 else
139 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name); 139 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name);
140 err = request_firmware(&adev->sdma[i].fw, fw_name, adev->dev); 140 err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev);
141 if (err) 141 if (err)
142 goto out; 142 goto out;
143 err = amdgpu_ucode_validate(adev->sdma[i].fw); 143 err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
144 if (err) 144 if (err)
145 goto out; 145 goto out;
146 hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma[i].fw->data; 146 hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma.instance[i].fw->data;
147 adev->sdma[i].fw_version = le32_to_cpu(hdr->header.ucode_version); 147 adev->sdma.instance[i].fw_version = le32_to_cpu(hdr->header.ucode_version);
148 adev->sdma[i].feature_version = le32_to_cpu(hdr->ucode_feature_version); 148 adev->sdma.instance[i].feature_version = le32_to_cpu(hdr->ucode_feature_version);
149 if (adev->sdma[i].feature_version >= 20) 149 if (adev->sdma.instance[i].feature_version >= 20)
150 adev->sdma[i].burst_nop = true; 150 adev->sdma.instance[i].burst_nop = true;
151 151
152 if (adev->firmware.smu_load) { 152 if (adev->firmware.smu_load) {
153 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i]; 153 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i];
154 info->ucode_id = AMDGPU_UCODE_ID_SDMA0 + i; 154 info->ucode_id = AMDGPU_UCODE_ID_SDMA0 + i;
155 info->fw = adev->sdma[i].fw; 155 info->fw = adev->sdma.instance[i].fw;
156 header = (const struct common_firmware_header *)info->fw->data; 156 header = (const struct common_firmware_header *)info->fw->data;
157 adev->firmware.fw_size += 157 adev->firmware.fw_size +=
158 ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); 158 ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
@@ -164,9 +164,9 @@ out:
164 printk(KERN_ERR 164 printk(KERN_ERR
165 "sdma_v2_4: Failed to load firmware \"%s\"\n", 165 "sdma_v2_4: Failed to load firmware \"%s\"\n",
166 fw_name); 166 fw_name);
167 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 167 for (i = 0; i < adev->sdma.num_instances; i++) {
168 release_firmware(adev->sdma[i].fw); 168 release_firmware(adev->sdma.instance[i].fw);
169 adev->sdma[i].fw = NULL; 169 adev->sdma.instance[i].fw = NULL;
170 } 170 }
171 } 171 }
172 return err; 172 return err;
@@ -199,7 +199,7 @@ static uint32_t sdma_v2_4_ring_get_rptr(struct amdgpu_ring *ring)
199static uint32_t sdma_v2_4_ring_get_wptr(struct amdgpu_ring *ring) 199static uint32_t sdma_v2_4_ring_get_wptr(struct amdgpu_ring *ring)
200{ 200{
201 struct amdgpu_device *adev = ring->adev; 201 struct amdgpu_device *adev = ring->adev;
202 int me = (ring == &ring->adev->sdma[0].ring) ? 0 : 1; 202 int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1;
203 u32 wptr = RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me]) >> 2; 203 u32 wptr = RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me]) >> 2;
204 204
205 return wptr; 205 return wptr;
@@ -215,14 +215,14 @@ static uint32_t sdma_v2_4_ring_get_wptr(struct amdgpu_ring *ring)
215static void sdma_v2_4_ring_set_wptr(struct amdgpu_ring *ring) 215static void sdma_v2_4_ring_set_wptr(struct amdgpu_ring *ring)
216{ 216{
217 struct amdgpu_device *adev = ring->adev; 217 struct amdgpu_device *adev = ring->adev;
218 int me = (ring == &ring->adev->sdma[0].ring) ? 0 : 1; 218 int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1;
219 219
220 WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], ring->wptr << 2); 220 WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], ring->wptr << 2);
221} 221}
222 222
223static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) 223static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
224{ 224{
225 struct amdgpu_sdma *sdma = amdgpu_get_sdma_instance(ring); 225 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring);
226 int i; 226 int i;
227 227
228 for (i = 0; i < count; i++) 228 for (i = 0; i < count; i++)
@@ -284,7 +284,7 @@ static void sdma_v2_4_ring_emit_hdp_flush(struct amdgpu_ring *ring)
284{ 284{
285 u32 ref_and_mask = 0; 285 u32 ref_and_mask = 0;
286 286
287 if (ring == &ring->adev->sdma[0].ring) 287 if (ring == &ring->adev->sdma.instance[0].ring)
288 ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA0, 1); 288 ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA0, 1);
289 else 289 else
290 ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA1, 1); 290 ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA1, 1);
@@ -368,8 +368,8 @@ static bool sdma_v2_4_ring_emit_semaphore(struct amdgpu_ring *ring,
368 */ 368 */
369static void sdma_v2_4_gfx_stop(struct amdgpu_device *adev) 369static void sdma_v2_4_gfx_stop(struct amdgpu_device *adev)
370{ 370{
371 struct amdgpu_ring *sdma0 = &adev->sdma[0].ring; 371 struct amdgpu_ring *sdma0 = &adev->sdma.instance[0].ring;
372 struct amdgpu_ring *sdma1 = &adev->sdma[1].ring; 372 struct amdgpu_ring *sdma1 = &adev->sdma.instance[1].ring;
373 u32 rb_cntl, ib_cntl; 373 u32 rb_cntl, ib_cntl;
374 int i; 374 int i;
375 375
@@ -377,7 +377,7 @@ static void sdma_v2_4_gfx_stop(struct amdgpu_device *adev)
377 (adev->mman.buffer_funcs_ring == sdma1)) 377 (adev->mman.buffer_funcs_ring == sdma1))
378 amdgpu_ttm_set_active_vram_size(adev, adev->mc.visible_vram_size); 378 amdgpu_ttm_set_active_vram_size(adev, adev->mc.visible_vram_size);
379 379
380 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 380 for (i = 0; i < adev->sdma.num_instances; i++) {
381 rb_cntl = RREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i]); 381 rb_cntl = RREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i]);
382 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 0); 382 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 0);
383 WREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i], rb_cntl); 383 WREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i], rb_cntl);
@@ -419,7 +419,7 @@ static void sdma_v2_4_enable(struct amdgpu_device *adev, bool enable)
419 sdma_v2_4_rlc_stop(adev); 419 sdma_v2_4_rlc_stop(adev);
420 } 420 }
421 421
422 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 422 for (i = 0; i < adev->sdma.num_instances; i++) {
423 f32_cntl = RREG32(mmSDMA0_F32_CNTL + sdma_offsets[i]); 423 f32_cntl = RREG32(mmSDMA0_F32_CNTL + sdma_offsets[i]);
424 if (enable) 424 if (enable)
425 f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_F32_CNTL, HALT, 0); 425 f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_F32_CNTL, HALT, 0);
@@ -445,8 +445,8 @@ static int sdma_v2_4_gfx_resume(struct amdgpu_device *adev)
445 u32 wb_offset; 445 u32 wb_offset;
446 int i, j, r; 446 int i, j, r;
447 447
448 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 448 for (i = 0; i < adev->sdma.num_instances; i++) {
449 ring = &adev->sdma[i].ring; 449 ring = &adev->sdma.instance[i].ring;
450 wb_offset = (ring->rptr_offs * 4); 450 wb_offset = (ring->rptr_offs * 4);
451 451
452 mutex_lock(&adev->srbm_mutex); 452 mutex_lock(&adev->srbm_mutex);
@@ -545,29 +545,23 @@ static int sdma_v2_4_load_microcode(struct amdgpu_device *adev)
545 const __le32 *fw_data; 545 const __le32 *fw_data;
546 u32 fw_size; 546 u32 fw_size;
547 int i, j; 547 int i, j;
548 bool smc_loads_fw = false; /* XXX fix me */
549
550 if (!adev->sdma[0].fw || !adev->sdma[1].fw)
551 return -EINVAL;
552 548
553 /* halt the MEs */ 549 /* halt the MEs */
554 sdma_v2_4_enable(adev, false); 550 sdma_v2_4_enable(adev, false);
555 551
556 if (smc_loads_fw) { 552 for (i = 0; i < adev->sdma.num_instances; i++) {
557 /* XXX query SMC for fw load complete */ 553 if (!adev->sdma.instance[i].fw)
558 } else { 554 return -EINVAL;
559 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 555 hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma.instance[i].fw->data;
560 hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma[i].fw->data; 556 amdgpu_ucode_print_sdma_hdr(&hdr->header);
561 amdgpu_ucode_print_sdma_hdr(&hdr->header); 557 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
562 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; 558 fw_data = (const __le32 *)
563 fw_data = (const __le32 *) 559 (adev->sdma.instance[i].fw->data +
564 (adev->sdma[i].fw->data + 560 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
565 le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 561 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], 0);
566 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], 0); 562 for (j = 0; j < fw_size; j++)
567 for (j = 0; j < fw_size; j++) 563 WREG32(mmSDMA0_UCODE_DATA + sdma_offsets[i], le32_to_cpup(fw_data++));
568 WREG32(mmSDMA0_UCODE_DATA + sdma_offsets[i], le32_to_cpup(fw_data++)); 564 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], adev->sdma.instance[i].fw_version);
569 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], adev->sdma[i].fw_version);
570 }
571 } 565 }
572 566
573 return 0; 567 return 0;
@@ -894,7 +888,7 @@ static void sdma_v2_4_vm_set_pte_pde(struct amdgpu_ib *ib,
894 */ 888 */
895static void sdma_v2_4_vm_pad_ib(struct amdgpu_ib *ib) 889static void sdma_v2_4_vm_pad_ib(struct amdgpu_ib *ib)
896{ 890{
897 struct amdgpu_sdma *sdma = amdgpu_get_sdma_instance(ib->ring); 891 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ib->ring);
898 u32 pad_count; 892 u32 pad_count;
899 int i; 893 int i;
900 894
@@ -952,6 +946,8 @@ static int sdma_v2_4_early_init(void *handle)
952{ 946{
953 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 947 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
954 948
949 adev->sdma.num_instances = SDMA_MAX_INSTANCE;
950
955 sdma_v2_4_set_ring_funcs(adev); 951 sdma_v2_4_set_ring_funcs(adev);
956 sdma_v2_4_set_buffer_funcs(adev); 952 sdma_v2_4_set_buffer_funcs(adev);
957 sdma_v2_4_set_vm_pte_funcs(adev); 953 sdma_v2_4_set_vm_pte_funcs(adev);
@@ -963,21 +959,21 @@ static int sdma_v2_4_early_init(void *handle)
963static int sdma_v2_4_sw_init(void *handle) 959static int sdma_v2_4_sw_init(void *handle)
964{ 960{
965 struct amdgpu_ring *ring; 961 struct amdgpu_ring *ring;
966 int r; 962 int r, i;
967 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 963 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
968 964
969 /* SDMA trap event */ 965 /* SDMA trap event */
970 r = amdgpu_irq_add_id(adev, 224, &adev->sdma_trap_irq); 966 r = amdgpu_irq_add_id(adev, 224, &adev->sdma.trap_irq);
971 if (r) 967 if (r)
972 return r; 968 return r;
973 969
974 /* SDMA Privileged inst */ 970 /* SDMA Privileged inst */
975 r = amdgpu_irq_add_id(adev, 241, &adev->sdma_illegal_inst_irq); 971 r = amdgpu_irq_add_id(adev, 241, &adev->sdma.illegal_inst_irq);
976 if (r) 972 if (r)
977 return r; 973 return r;
978 974
979 /* SDMA Privileged inst */ 975 /* SDMA Privileged inst */
980 r = amdgpu_irq_add_id(adev, 247, &adev->sdma_illegal_inst_irq); 976 r = amdgpu_irq_add_id(adev, 247, &adev->sdma.illegal_inst_irq);
981 if (r) 977 if (r)
982 return r; 978 return r;
983 979
@@ -987,31 +983,20 @@ static int sdma_v2_4_sw_init(void *handle)
987 return r; 983 return r;
988 } 984 }
989 985
990 ring = &adev->sdma[0].ring; 986 for (i = 0; i < adev->sdma.num_instances; i++) {
991 ring->ring_obj = NULL; 987 ring = &adev->sdma.instance[i].ring;
992 ring->use_doorbell = false; 988 ring->ring_obj = NULL;
993 989 ring->use_doorbell = false;
994 ring = &adev->sdma[1].ring; 990 sprintf(ring->name, "sdma%d", i);
995 ring->ring_obj = NULL; 991 r = amdgpu_ring_init(adev, ring, 256 * 1024,
996 ring->use_doorbell = false; 992 SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 0xf,
997 993 &adev->sdma.trap_irq,
998 ring = &adev->sdma[0].ring; 994 (i == 0) ?
999 sprintf(ring->name, "sdma0"); 995 AMDGPU_SDMA_IRQ_TRAP0 : AMDGPU_SDMA_IRQ_TRAP1,
1000 r = amdgpu_ring_init(adev, ring, 256 * 1024, 996 AMDGPU_RING_TYPE_SDMA);
1001 SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 0xf, 997 if (r)
1002 &adev->sdma_trap_irq, AMDGPU_SDMA_IRQ_TRAP0, 998 return r;
1003 AMDGPU_RING_TYPE_SDMA); 999 }
1004 if (r)
1005 return r;
1006
1007 ring = &adev->sdma[1].ring;
1008 sprintf(ring->name, "sdma1");
1009 r = amdgpu_ring_init(adev, ring, 256 * 1024,
1010 SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 0xf,
1011 &adev->sdma_trap_irq, AMDGPU_SDMA_IRQ_TRAP1,
1012 AMDGPU_RING_TYPE_SDMA);
1013 if (r)
1014 return r;
1015 1000
1016 return r; 1001 return r;
1017} 1002}
@@ -1019,9 +1004,10 @@ static int sdma_v2_4_sw_init(void *handle)
1019static int sdma_v2_4_sw_fini(void *handle) 1004static int sdma_v2_4_sw_fini(void *handle)
1020{ 1005{
1021 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1006 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1007 int i;
1022 1008
1023 amdgpu_ring_fini(&adev->sdma[0].ring); 1009 for (i = 0; i < adev->sdma.num_instances; i++)
1024 amdgpu_ring_fini(&adev->sdma[1].ring); 1010 amdgpu_ring_fini(&adev->sdma.instance[i].ring);
1025 1011
1026 return 0; 1012 return 0;
1027} 1013}
@@ -1100,7 +1086,7 @@ static void sdma_v2_4_print_status(void *handle)
1100 dev_info(adev->dev, "VI SDMA registers\n"); 1086 dev_info(adev->dev, "VI SDMA registers\n");
1101 dev_info(adev->dev, " SRBM_STATUS2=0x%08X\n", 1087 dev_info(adev->dev, " SRBM_STATUS2=0x%08X\n",
1102 RREG32(mmSRBM_STATUS2)); 1088 RREG32(mmSRBM_STATUS2));
1103 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 1089 for (i = 0; i < adev->sdma.num_instances; i++) {
1104 dev_info(adev->dev, " SDMA%d_STATUS_REG=0x%08X\n", 1090 dev_info(adev->dev, " SDMA%d_STATUS_REG=0x%08X\n",
1105 i, RREG32(mmSDMA0_STATUS_REG + sdma_offsets[i])); 1091 i, RREG32(mmSDMA0_STATUS_REG + sdma_offsets[i]));
1106 dev_info(adev->dev, " SDMA%d_F32_CNTL=0x%08X\n", 1092 dev_info(adev->dev, " SDMA%d_F32_CNTL=0x%08X\n",
@@ -1243,7 +1229,7 @@ static int sdma_v2_4_process_trap_irq(struct amdgpu_device *adev,
1243 case 0: 1229 case 0:
1244 switch (queue_id) { 1230 switch (queue_id) {
1245 case 0: 1231 case 0:
1246 amdgpu_fence_process(&adev->sdma[0].ring); 1232 amdgpu_fence_process(&adev->sdma.instance[0].ring);
1247 break; 1233 break;
1248 case 1: 1234 case 1:
1249 /* XXX compute */ 1235 /* XXX compute */
@@ -1256,7 +1242,7 @@ static int sdma_v2_4_process_trap_irq(struct amdgpu_device *adev,
1256 case 1: 1242 case 1:
1257 switch (queue_id) { 1243 switch (queue_id) {
1258 case 0: 1244 case 0:
1259 amdgpu_fence_process(&adev->sdma[1].ring); 1245 amdgpu_fence_process(&adev->sdma.instance[1].ring);
1260 break; 1246 break;
1261 case 1: 1247 case 1:
1262 /* XXX compute */ 1248 /* XXX compute */
@@ -1309,24 +1295,6 @@ const struct amd_ip_funcs sdma_v2_4_ip_funcs = {
1309 .set_powergating_state = sdma_v2_4_set_powergating_state, 1295 .set_powergating_state = sdma_v2_4_set_powergating_state,
1310}; 1296};
1311 1297
1312/**
1313 * sdma_v2_4_ring_is_lockup - Check if the DMA engine is locked up
1314 *
1315 * @ring: amdgpu_ring structure holding ring information
1316 *
1317 * Check if the async DMA engine is locked up (VI).
1318 * Returns true if the engine appears to be locked up, false if not.
1319 */
1320static bool sdma_v2_4_ring_is_lockup(struct amdgpu_ring *ring)
1321{
1322
1323 if (sdma_v2_4_is_idle(ring->adev)) {
1324 amdgpu_ring_lockup_update(ring);
1325 return false;
1326 }
1327 return amdgpu_ring_test_lockup(ring);
1328}
1329
1330static const struct amdgpu_ring_funcs sdma_v2_4_ring_funcs = { 1298static const struct amdgpu_ring_funcs sdma_v2_4_ring_funcs = {
1331 .get_rptr = sdma_v2_4_ring_get_rptr, 1299 .get_rptr = sdma_v2_4_ring_get_rptr,
1332 .get_wptr = sdma_v2_4_ring_get_wptr, 1300 .get_wptr = sdma_v2_4_ring_get_wptr,
@@ -1339,14 +1307,15 @@ static const struct amdgpu_ring_funcs sdma_v2_4_ring_funcs = {
1339 .emit_hdp_flush = sdma_v2_4_ring_emit_hdp_flush, 1307 .emit_hdp_flush = sdma_v2_4_ring_emit_hdp_flush,
1340 .test_ring = sdma_v2_4_ring_test_ring, 1308 .test_ring = sdma_v2_4_ring_test_ring,
1341 .test_ib = sdma_v2_4_ring_test_ib, 1309 .test_ib = sdma_v2_4_ring_test_ib,
1342 .is_lockup = sdma_v2_4_ring_is_lockup,
1343 .insert_nop = sdma_v2_4_ring_insert_nop, 1310 .insert_nop = sdma_v2_4_ring_insert_nop,
1344}; 1311};
1345 1312
1346static void sdma_v2_4_set_ring_funcs(struct amdgpu_device *adev) 1313static void sdma_v2_4_set_ring_funcs(struct amdgpu_device *adev)
1347{ 1314{
1348 adev->sdma[0].ring.funcs = &sdma_v2_4_ring_funcs; 1315 int i;
1349 adev->sdma[1].ring.funcs = &sdma_v2_4_ring_funcs; 1316
1317 for (i = 0; i < adev->sdma.num_instances; i++)
1318 adev->sdma.instance[i].ring.funcs = &sdma_v2_4_ring_funcs;
1350} 1319}
1351 1320
1352static const struct amdgpu_irq_src_funcs sdma_v2_4_trap_irq_funcs = { 1321static const struct amdgpu_irq_src_funcs sdma_v2_4_trap_irq_funcs = {
@@ -1360,9 +1329,9 @@ static const struct amdgpu_irq_src_funcs sdma_v2_4_illegal_inst_irq_funcs = {
1360 1329
1361static void sdma_v2_4_set_irq_funcs(struct amdgpu_device *adev) 1330static void sdma_v2_4_set_irq_funcs(struct amdgpu_device *adev)
1362{ 1331{
1363 adev->sdma_trap_irq.num_types = AMDGPU_SDMA_IRQ_LAST; 1332 adev->sdma.trap_irq.num_types = AMDGPU_SDMA_IRQ_LAST;
1364 adev->sdma_trap_irq.funcs = &sdma_v2_4_trap_irq_funcs; 1333 adev->sdma.trap_irq.funcs = &sdma_v2_4_trap_irq_funcs;
1365 adev->sdma_illegal_inst_irq.funcs = &sdma_v2_4_illegal_inst_irq_funcs; 1334 adev->sdma.illegal_inst_irq.funcs = &sdma_v2_4_illegal_inst_irq_funcs;
1366} 1335}
1367 1336
1368/** 1337/**
@@ -1428,7 +1397,7 @@ static void sdma_v2_4_set_buffer_funcs(struct amdgpu_device *adev)
1428{ 1397{
1429 if (adev->mman.buffer_funcs == NULL) { 1398 if (adev->mman.buffer_funcs == NULL) {
1430 adev->mman.buffer_funcs = &sdma_v2_4_buffer_funcs; 1399 adev->mman.buffer_funcs = &sdma_v2_4_buffer_funcs;
1431 adev->mman.buffer_funcs_ring = &adev->sdma[0].ring; 1400 adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring;
1432 } 1401 }
1433} 1402}
1434 1403
@@ -1443,7 +1412,7 @@ static void sdma_v2_4_set_vm_pte_funcs(struct amdgpu_device *adev)
1443{ 1412{
1444 if (adev->vm_manager.vm_pte_funcs == NULL) { 1413 if (adev->vm_manager.vm_pte_funcs == NULL) {
1445 adev->vm_manager.vm_pte_funcs = &sdma_v2_4_vm_pte_funcs; 1414 adev->vm_manager.vm_pte_funcs = &sdma_v2_4_vm_pte_funcs;
1446 adev->vm_manager.vm_pte_funcs_ring = &adev->sdma[0].ring; 1415 adev->vm_manager.vm_pte_funcs_ring = &adev->sdma.instance[0].ring;
1447 adev->vm_manager.vm_pte_funcs_ring->is_pte_ring = true; 1416 adev->vm_manager.vm_pte_funcs_ring->is_pte_ring = true;
1448 } 1417 }
1449} 1418}
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
index 9bfe92df15f7..7253132f04b8 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
@@ -55,6 +55,7 @@ MODULE_FIRMWARE("amdgpu/carrizo_sdma.bin");
55MODULE_FIRMWARE("amdgpu/carrizo_sdma1.bin"); 55MODULE_FIRMWARE("amdgpu/carrizo_sdma1.bin");
56MODULE_FIRMWARE("amdgpu/fiji_sdma.bin"); 56MODULE_FIRMWARE("amdgpu/fiji_sdma.bin");
57MODULE_FIRMWARE("amdgpu/fiji_sdma1.bin"); 57MODULE_FIRMWARE("amdgpu/fiji_sdma1.bin");
58MODULE_FIRMWARE("amdgpu/stoney_sdma.bin");
58 59
59static const u32 sdma_offsets[SDMA_MAX_INSTANCE] = 60static const u32 sdma_offsets[SDMA_MAX_INSTANCE] =
60{ 61{
@@ -122,6 +123,19 @@ static const u32 cz_mgcg_cgcg_init[] =
122 mmSDMA1_CLK_CTRL, 0xff000ff0, 0x00000100 123 mmSDMA1_CLK_CTRL, 0xff000ff0, 0x00000100
123}; 124};
124 125
126static const u32 stoney_golden_settings_a11[] =
127{
128 mmSDMA0_GFX_IB_CNTL, 0x00000100, 0x00000100,
129 mmSDMA0_POWER_CNTL, 0x00000800, 0x0003c800,
130 mmSDMA0_RLC0_IB_CNTL, 0x00000100, 0x00000100,
131 mmSDMA0_RLC1_IB_CNTL, 0x00000100, 0x00000100,
132};
133
134static const u32 stoney_mgcg_cgcg_init[] =
135{
136 mmSDMA0_CLK_CTRL, 0xffffffff, 0x00000100,
137};
138
125/* 139/*
126 * sDMA - System DMA 140 * sDMA - System DMA
127 * Starting with CIK, the GPU has new asynchronous 141 * Starting with CIK, the GPU has new asynchronous
@@ -166,6 +180,14 @@ static void sdma_v3_0_init_golden_registers(struct amdgpu_device *adev)
166 cz_golden_settings_a11, 180 cz_golden_settings_a11,
167 (const u32)ARRAY_SIZE(cz_golden_settings_a11)); 181 (const u32)ARRAY_SIZE(cz_golden_settings_a11));
168 break; 182 break;
183 case CHIP_STONEY:
184 amdgpu_program_register_sequence(adev,
185 stoney_mgcg_cgcg_init,
186 (const u32)ARRAY_SIZE(stoney_mgcg_cgcg_init));
187 amdgpu_program_register_sequence(adev,
188 stoney_golden_settings_a11,
189 (const u32)ARRAY_SIZE(stoney_golden_settings_a11));
190 break;
169 default: 191 default:
170 break; 192 break;
171 } 193 }
@@ -184,7 +206,7 @@ static int sdma_v3_0_init_microcode(struct amdgpu_device *adev)
184{ 206{
185 const char *chip_name; 207 const char *chip_name;
186 char fw_name[30]; 208 char fw_name[30];
187 int err, i; 209 int err = 0, i;
188 struct amdgpu_firmware_info *info = NULL; 210 struct amdgpu_firmware_info *info = NULL;
189 const struct common_firmware_header *header = NULL; 211 const struct common_firmware_header *header = NULL;
190 const struct sdma_firmware_header_v1_0 *hdr; 212 const struct sdma_firmware_header_v1_0 *hdr;
@@ -201,30 +223,33 @@ static int sdma_v3_0_init_microcode(struct amdgpu_device *adev)
201 case CHIP_CARRIZO: 223 case CHIP_CARRIZO:
202 chip_name = "carrizo"; 224 chip_name = "carrizo";
203 break; 225 break;
226 case CHIP_STONEY:
227 chip_name = "stoney";
228 break;
204 default: BUG(); 229 default: BUG();
205 } 230 }
206 231
207 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 232 for (i = 0; i < adev->sdma.num_instances; i++) {
208 if (i == 0) 233 if (i == 0)
209 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name); 234 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma.bin", chip_name);
210 else 235 else
211 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name); 236 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sdma1.bin", chip_name);
212 err = request_firmware(&adev->sdma[i].fw, fw_name, adev->dev); 237 err = request_firmware(&adev->sdma.instance[i].fw, fw_name, adev->dev);
213 if (err) 238 if (err)
214 goto out; 239 goto out;
215 err = amdgpu_ucode_validate(adev->sdma[i].fw); 240 err = amdgpu_ucode_validate(adev->sdma.instance[i].fw);
216 if (err) 241 if (err)
217 goto out; 242 goto out;
218 hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma[i].fw->data; 243 hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma.instance[i].fw->data;
219 adev->sdma[i].fw_version = le32_to_cpu(hdr->header.ucode_version); 244 adev->sdma.instance[i].fw_version = le32_to_cpu(hdr->header.ucode_version);
220 adev->sdma[i].feature_version = le32_to_cpu(hdr->ucode_feature_version); 245 adev->sdma.instance[i].feature_version = le32_to_cpu(hdr->ucode_feature_version);
221 if (adev->sdma[i].feature_version >= 20) 246 if (adev->sdma.instance[i].feature_version >= 20)
222 adev->sdma[i].burst_nop = true; 247 adev->sdma.instance[i].burst_nop = true;
223 248
224 if (adev->firmware.smu_load) { 249 if (adev->firmware.smu_load) {
225 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i]; 250 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i];
226 info->ucode_id = AMDGPU_UCODE_ID_SDMA0 + i; 251 info->ucode_id = AMDGPU_UCODE_ID_SDMA0 + i;
227 info->fw = adev->sdma[i].fw; 252 info->fw = adev->sdma.instance[i].fw;
228 header = (const struct common_firmware_header *)info->fw->data; 253 header = (const struct common_firmware_header *)info->fw->data;
229 adev->firmware.fw_size += 254 adev->firmware.fw_size +=
230 ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); 255 ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
@@ -235,9 +260,9 @@ out:
235 printk(KERN_ERR 260 printk(KERN_ERR
236 "sdma_v3_0: Failed to load firmware \"%s\"\n", 261 "sdma_v3_0: Failed to load firmware \"%s\"\n",
237 fw_name); 262 fw_name);
238 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 263 for (i = 0; i < adev->sdma.num_instances; i++) {
239 release_firmware(adev->sdma[i].fw); 264 release_firmware(adev->sdma.instance[i].fw);
240 adev->sdma[i].fw = NULL; 265 adev->sdma.instance[i].fw = NULL;
241 } 266 }
242 } 267 }
243 return err; 268 return err;
@@ -276,7 +301,7 @@ static uint32_t sdma_v3_0_ring_get_wptr(struct amdgpu_ring *ring)
276 /* XXX check if swapping is necessary on BE */ 301 /* XXX check if swapping is necessary on BE */
277 wptr = ring->adev->wb.wb[ring->wptr_offs] >> 2; 302 wptr = ring->adev->wb.wb[ring->wptr_offs] >> 2;
278 } else { 303 } else {
279 int me = (ring == &ring->adev->sdma[0].ring) ? 0 : 1; 304 int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1;
280 305
281 wptr = RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me]) >> 2; 306 wptr = RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me]) >> 2;
282 } 307 }
@@ -300,7 +325,7 @@ static void sdma_v3_0_ring_set_wptr(struct amdgpu_ring *ring)
300 adev->wb.wb[ring->wptr_offs] = ring->wptr << 2; 325 adev->wb.wb[ring->wptr_offs] = ring->wptr << 2;
301 WDOORBELL32(ring->doorbell_index, ring->wptr << 2); 326 WDOORBELL32(ring->doorbell_index, ring->wptr << 2);
302 } else { 327 } else {
303 int me = (ring == &ring->adev->sdma[0].ring) ? 0 : 1; 328 int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1;
304 329
305 WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], ring->wptr << 2); 330 WREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[me], ring->wptr << 2);
306 } 331 }
@@ -308,7 +333,7 @@ static void sdma_v3_0_ring_set_wptr(struct amdgpu_ring *ring)
308 333
309static void sdma_v3_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) 334static void sdma_v3_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
310{ 335{
311 struct amdgpu_sdma *sdma = amdgpu_get_sdma_instance(ring); 336 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring);
312 int i; 337 int i;
313 338
314 for (i = 0; i < count; i++) 339 for (i = 0; i < count; i++)
@@ -369,7 +394,7 @@ static void sdma_v3_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
369{ 394{
370 u32 ref_and_mask = 0; 395 u32 ref_and_mask = 0;
371 396
372 if (ring == &ring->adev->sdma[0].ring) 397 if (ring == &ring->adev->sdma.instance[0].ring)
373 ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA0, 1); 398 ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA0, 1);
374 else 399 else
375 ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA1, 1); 400 ref_and_mask = REG_SET_FIELD(ref_and_mask, GPU_HDP_FLUSH_DONE, SDMA1, 1);
@@ -454,8 +479,8 @@ static bool sdma_v3_0_ring_emit_semaphore(struct amdgpu_ring *ring,
454 */ 479 */
455static void sdma_v3_0_gfx_stop(struct amdgpu_device *adev) 480static void sdma_v3_0_gfx_stop(struct amdgpu_device *adev)
456{ 481{
457 struct amdgpu_ring *sdma0 = &adev->sdma[0].ring; 482 struct amdgpu_ring *sdma0 = &adev->sdma.instance[0].ring;
458 struct amdgpu_ring *sdma1 = &adev->sdma[1].ring; 483 struct amdgpu_ring *sdma1 = &adev->sdma.instance[1].ring;
459 u32 rb_cntl, ib_cntl; 484 u32 rb_cntl, ib_cntl;
460 int i; 485 int i;
461 486
@@ -463,7 +488,7 @@ static void sdma_v3_0_gfx_stop(struct amdgpu_device *adev)
463 (adev->mman.buffer_funcs_ring == sdma1)) 488 (adev->mman.buffer_funcs_ring == sdma1))
464 amdgpu_ttm_set_active_vram_size(adev, adev->mc.visible_vram_size); 489 amdgpu_ttm_set_active_vram_size(adev, adev->mc.visible_vram_size);
465 490
466 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 491 for (i = 0; i < adev->sdma.num_instances; i++) {
467 rb_cntl = RREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i]); 492 rb_cntl = RREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i]);
468 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 0); 493 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 0);
469 WREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i], rb_cntl); 494 WREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i], rb_cntl);
@@ -500,7 +525,7 @@ static void sdma_v3_0_ctx_switch_enable(struct amdgpu_device *adev, bool enable)
500 u32 f32_cntl; 525 u32 f32_cntl;
501 int i; 526 int i;
502 527
503 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 528 for (i = 0; i < adev->sdma.num_instances; i++) {
504 f32_cntl = RREG32(mmSDMA0_CNTL + sdma_offsets[i]); 529 f32_cntl = RREG32(mmSDMA0_CNTL + sdma_offsets[i]);
505 if (enable) 530 if (enable)
506 f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_CNTL, 531 f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_CNTL,
@@ -530,7 +555,7 @@ static void sdma_v3_0_enable(struct amdgpu_device *adev, bool enable)
530 sdma_v3_0_rlc_stop(adev); 555 sdma_v3_0_rlc_stop(adev);
531 } 556 }
532 557
533 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 558 for (i = 0; i < adev->sdma.num_instances; i++) {
534 f32_cntl = RREG32(mmSDMA0_F32_CNTL + sdma_offsets[i]); 559 f32_cntl = RREG32(mmSDMA0_F32_CNTL + sdma_offsets[i]);
535 if (enable) 560 if (enable)
536 f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_F32_CNTL, HALT, 0); 561 f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_F32_CNTL, HALT, 0);
@@ -557,8 +582,8 @@ static int sdma_v3_0_gfx_resume(struct amdgpu_device *adev)
557 u32 doorbell; 582 u32 doorbell;
558 int i, j, r; 583 int i, j, r;
559 584
560 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 585 for (i = 0; i < adev->sdma.num_instances; i++) {
561 ring = &adev->sdma[i].ring; 586 ring = &adev->sdma.instance[i].ring;
562 wb_offset = (ring->rptr_offs * 4); 587 wb_offset = (ring->rptr_offs * 4);
563 588
564 mutex_lock(&adev->srbm_mutex); 589 mutex_lock(&adev->srbm_mutex);
@@ -669,23 +694,22 @@ static int sdma_v3_0_load_microcode(struct amdgpu_device *adev)
669 u32 fw_size; 694 u32 fw_size;
670 int i, j; 695 int i, j;
671 696
672 if (!adev->sdma[0].fw || !adev->sdma[1].fw)
673 return -EINVAL;
674
675 /* halt the MEs */ 697 /* halt the MEs */
676 sdma_v3_0_enable(adev, false); 698 sdma_v3_0_enable(adev, false);
677 699
678 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 700 for (i = 0; i < adev->sdma.num_instances; i++) {
679 hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma[i].fw->data; 701 if (!adev->sdma.instance[i].fw)
702 return -EINVAL;
703 hdr = (const struct sdma_firmware_header_v1_0 *)adev->sdma.instance[i].fw->data;
680 amdgpu_ucode_print_sdma_hdr(&hdr->header); 704 amdgpu_ucode_print_sdma_hdr(&hdr->header);
681 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; 705 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
682 fw_data = (const __le32 *) 706 fw_data = (const __le32 *)
683 (adev->sdma[i].fw->data + 707 (adev->sdma.instance[i].fw->data +
684 le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 708 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
685 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], 0); 709 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], 0);
686 for (j = 0; j < fw_size; j++) 710 for (j = 0; j < fw_size; j++)
687 WREG32(mmSDMA0_UCODE_DATA + sdma_offsets[i], le32_to_cpup(fw_data++)); 711 WREG32(mmSDMA0_UCODE_DATA + sdma_offsets[i], le32_to_cpup(fw_data++));
688 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], adev->sdma[i].fw_version); 712 WREG32(mmSDMA0_UCODE_ADDR + sdma_offsets[i], adev->sdma.instance[i].fw_version);
689 } 713 }
690 714
691 return 0; 715 return 0;
@@ -701,21 +725,21 @@ static int sdma_v3_0_load_microcode(struct amdgpu_device *adev)
701 */ 725 */
702static int sdma_v3_0_start(struct amdgpu_device *adev) 726static int sdma_v3_0_start(struct amdgpu_device *adev)
703{ 727{
704 int r; 728 int r, i;
705 729
706 if (!adev->firmware.smu_load) { 730 if (!adev->firmware.smu_load) {
707 r = sdma_v3_0_load_microcode(adev); 731 r = sdma_v3_0_load_microcode(adev);
708 if (r) 732 if (r)
709 return r; 733 return r;
710 } else { 734 } else {
711 r = adev->smu.smumgr_funcs->check_fw_load_finish(adev, 735 for (i = 0; i < adev->sdma.num_instances; i++) {
712 AMDGPU_UCODE_ID_SDMA0); 736 r = adev->smu.smumgr_funcs->check_fw_load_finish(adev,
713 if (r) 737 (i == 0) ?
714 return -EINVAL; 738 AMDGPU_UCODE_ID_SDMA0 :
715 r = adev->smu.smumgr_funcs->check_fw_load_finish(adev, 739 AMDGPU_UCODE_ID_SDMA1);
716 AMDGPU_UCODE_ID_SDMA1); 740 if (r)
717 if (r) 741 return -EINVAL;
718 return -EINVAL; 742 }
719 } 743 }
720 744
721 /* unhalt the MEs */ 745 /* unhalt the MEs */
@@ -1013,7 +1037,7 @@ static void sdma_v3_0_vm_set_pte_pde(struct amdgpu_ib *ib,
1013 */ 1037 */
1014static void sdma_v3_0_vm_pad_ib(struct amdgpu_ib *ib) 1038static void sdma_v3_0_vm_pad_ib(struct amdgpu_ib *ib)
1015{ 1039{
1016 struct amdgpu_sdma *sdma = amdgpu_get_sdma_instance(ib->ring); 1040 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ib->ring);
1017 u32 pad_count; 1041 u32 pad_count;
1018 int i; 1042 int i;
1019 1043
@@ -1071,6 +1095,15 @@ static int sdma_v3_0_early_init(void *handle)
1071{ 1095{
1072 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1096 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1073 1097
1098 switch (adev->asic_type) {
1099 case CHIP_STONEY:
1100 adev->sdma.num_instances = 1;
1101 break;
1102 default:
1103 adev->sdma.num_instances = SDMA_MAX_INSTANCE;
1104 break;
1105 }
1106
1074 sdma_v3_0_set_ring_funcs(adev); 1107 sdma_v3_0_set_ring_funcs(adev);
1075 sdma_v3_0_set_buffer_funcs(adev); 1108 sdma_v3_0_set_buffer_funcs(adev);
1076 sdma_v3_0_set_vm_pte_funcs(adev); 1109 sdma_v3_0_set_vm_pte_funcs(adev);
@@ -1082,21 +1115,21 @@ static int sdma_v3_0_early_init(void *handle)
1082static int sdma_v3_0_sw_init(void *handle) 1115static int sdma_v3_0_sw_init(void *handle)
1083{ 1116{
1084 struct amdgpu_ring *ring; 1117 struct amdgpu_ring *ring;
1085 int r; 1118 int r, i;
1086 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1119 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1087 1120
1088 /* SDMA trap event */ 1121 /* SDMA trap event */
1089 r = amdgpu_irq_add_id(adev, 224, &adev->sdma_trap_irq); 1122 r = amdgpu_irq_add_id(adev, 224, &adev->sdma.trap_irq);
1090 if (r) 1123 if (r)
1091 return r; 1124 return r;
1092 1125
1093 /* SDMA Privileged inst */ 1126 /* SDMA Privileged inst */
1094 r = amdgpu_irq_add_id(adev, 241, &adev->sdma_illegal_inst_irq); 1127 r = amdgpu_irq_add_id(adev, 241, &adev->sdma.illegal_inst_irq);
1095 if (r) 1128 if (r)
1096 return r; 1129 return r;
1097 1130
1098 /* SDMA Privileged inst */ 1131 /* SDMA Privileged inst */
1099 r = amdgpu_irq_add_id(adev, 247, &adev->sdma_illegal_inst_irq); 1132 r = amdgpu_irq_add_id(adev, 247, &adev->sdma.illegal_inst_irq);
1100 if (r) 1133 if (r)
1101 return r; 1134 return r;
1102 1135
@@ -1106,33 +1139,23 @@ static int sdma_v3_0_sw_init(void *handle)
1106 return r; 1139 return r;
1107 } 1140 }
1108 1141
1109 ring = &adev->sdma[0].ring; 1142 for (i = 0; i < adev->sdma.num_instances; i++) {
1110 ring->ring_obj = NULL; 1143 ring = &adev->sdma.instance[i].ring;
1111 ring->use_doorbell = true; 1144 ring->ring_obj = NULL;
1112 ring->doorbell_index = AMDGPU_DOORBELL_sDMA_ENGINE0; 1145 ring->use_doorbell = true;
1113 1146 ring->doorbell_index = (i == 0) ?
1114 ring = &adev->sdma[1].ring; 1147 AMDGPU_DOORBELL_sDMA_ENGINE0 : AMDGPU_DOORBELL_sDMA_ENGINE1;
1115 ring->ring_obj = NULL; 1148
1116 ring->use_doorbell = true; 1149 sprintf(ring->name, "sdma%d", i);
1117 ring->doorbell_index = AMDGPU_DOORBELL_sDMA_ENGINE1; 1150 r = amdgpu_ring_init(adev, ring, 256 * 1024,
1118 1151 SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 0xf,
1119 ring = &adev->sdma[0].ring; 1152 &adev->sdma.trap_irq,
1120 sprintf(ring->name, "sdma0"); 1153 (i == 0) ?
1121 r = amdgpu_ring_init(adev, ring, 256 * 1024, 1154 AMDGPU_SDMA_IRQ_TRAP0 : AMDGPU_SDMA_IRQ_TRAP1,
1122 SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 0xf, 1155 AMDGPU_RING_TYPE_SDMA);
1123 &adev->sdma_trap_irq, AMDGPU_SDMA_IRQ_TRAP0, 1156 if (r)
1124 AMDGPU_RING_TYPE_SDMA); 1157 return r;
1125 if (r) 1158 }
1126 return r;
1127
1128 ring = &adev->sdma[1].ring;
1129 sprintf(ring->name, "sdma1");
1130 r = amdgpu_ring_init(adev, ring, 256 * 1024,
1131 SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 0xf,
1132 &adev->sdma_trap_irq, AMDGPU_SDMA_IRQ_TRAP1,
1133 AMDGPU_RING_TYPE_SDMA);
1134 if (r)
1135 return r;
1136 1159
1137 return r; 1160 return r;
1138} 1161}
@@ -1140,9 +1163,10 @@ static int sdma_v3_0_sw_init(void *handle)
1140static int sdma_v3_0_sw_fini(void *handle) 1163static int sdma_v3_0_sw_fini(void *handle)
1141{ 1164{
1142 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1165 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1166 int i;
1143 1167
1144 amdgpu_ring_fini(&adev->sdma[0].ring); 1168 for (i = 0; i < adev->sdma.num_instances; i++)
1145 amdgpu_ring_fini(&adev->sdma[1].ring); 1169 amdgpu_ring_fini(&adev->sdma.instance[i].ring);
1146 1170
1147 return 0; 1171 return 0;
1148} 1172}
@@ -1222,7 +1246,7 @@ static void sdma_v3_0_print_status(void *handle)
1222 dev_info(adev->dev, "VI SDMA registers\n"); 1246 dev_info(adev->dev, "VI SDMA registers\n");
1223 dev_info(adev->dev, " SRBM_STATUS2=0x%08X\n", 1247 dev_info(adev->dev, " SRBM_STATUS2=0x%08X\n",
1224 RREG32(mmSRBM_STATUS2)); 1248 RREG32(mmSRBM_STATUS2));
1225 for (i = 0; i < SDMA_MAX_INSTANCE; i++) { 1249 for (i = 0; i < adev->sdma.num_instances; i++) {
1226 dev_info(adev->dev, " SDMA%d_STATUS_REG=0x%08X\n", 1250 dev_info(adev->dev, " SDMA%d_STATUS_REG=0x%08X\n",
1227 i, RREG32(mmSDMA0_STATUS_REG + sdma_offsets[i])); 1251 i, RREG32(mmSDMA0_STATUS_REG + sdma_offsets[i]));
1228 dev_info(adev->dev, " SDMA%d_F32_CNTL=0x%08X\n", 1252 dev_info(adev->dev, " SDMA%d_F32_CNTL=0x%08X\n",
@@ -1367,7 +1391,7 @@ static int sdma_v3_0_process_trap_irq(struct amdgpu_device *adev,
1367 case 0: 1391 case 0:
1368 switch (queue_id) { 1392 switch (queue_id) {
1369 case 0: 1393 case 0:
1370 amdgpu_fence_process(&adev->sdma[0].ring); 1394 amdgpu_fence_process(&adev->sdma.instance[0].ring);
1371 break; 1395 break;
1372 case 1: 1396 case 1:
1373 /* XXX compute */ 1397 /* XXX compute */
@@ -1380,7 +1404,7 @@ static int sdma_v3_0_process_trap_irq(struct amdgpu_device *adev,
1380 case 1: 1404 case 1:
1381 switch (queue_id) { 1405 switch (queue_id) {
1382 case 0: 1406 case 0:
1383 amdgpu_fence_process(&adev->sdma[1].ring); 1407 amdgpu_fence_process(&adev->sdma.instance[1].ring);
1384 break; 1408 break;
1385 case 1: 1409 case 1:
1386 /* XXX compute */ 1410 /* XXX compute */
@@ -1432,24 +1456,6 @@ const struct amd_ip_funcs sdma_v3_0_ip_funcs = {
1432 .set_powergating_state = sdma_v3_0_set_powergating_state, 1456 .set_powergating_state = sdma_v3_0_set_powergating_state,
1433}; 1457};
1434 1458
1435/**
1436 * sdma_v3_0_ring_is_lockup - Check if the DMA engine is locked up
1437 *
1438 * @ring: amdgpu_ring structure holding ring information
1439 *
1440 * Check if the async DMA engine is locked up (VI).
1441 * Returns true if the engine appears to be locked up, false if not.
1442 */
1443static bool sdma_v3_0_ring_is_lockup(struct amdgpu_ring *ring)
1444{
1445
1446 if (sdma_v3_0_is_idle(ring->adev)) {
1447 amdgpu_ring_lockup_update(ring);
1448 return false;
1449 }
1450 return amdgpu_ring_test_lockup(ring);
1451}
1452
1453static const struct amdgpu_ring_funcs sdma_v3_0_ring_funcs = { 1459static const struct amdgpu_ring_funcs sdma_v3_0_ring_funcs = {
1454 .get_rptr = sdma_v3_0_ring_get_rptr, 1460 .get_rptr = sdma_v3_0_ring_get_rptr,
1455 .get_wptr = sdma_v3_0_ring_get_wptr, 1461 .get_wptr = sdma_v3_0_ring_get_wptr,
@@ -1462,14 +1468,15 @@ static const struct amdgpu_ring_funcs sdma_v3_0_ring_funcs = {
1462 .emit_hdp_flush = sdma_v3_0_ring_emit_hdp_flush, 1468 .emit_hdp_flush = sdma_v3_0_ring_emit_hdp_flush,
1463 .test_ring = sdma_v3_0_ring_test_ring, 1469 .test_ring = sdma_v3_0_ring_test_ring,
1464 .test_ib = sdma_v3_0_ring_test_ib, 1470 .test_ib = sdma_v3_0_ring_test_ib,
1465 .is_lockup = sdma_v3_0_ring_is_lockup,
1466 .insert_nop = sdma_v3_0_ring_insert_nop, 1471 .insert_nop = sdma_v3_0_ring_insert_nop,
1467}; 1472};
1468 1473
1469static void sdma_v3_0_set_ring_funcs(struct amdgpu_device *adev) 1474static void sdma_v3_0_set_ring_funcs(struct amdgpu_device *adev)
1470{ 1475{
1471 adev->sdma[0].ring.funcs = &sdma_v3_0_ring_funcs; 1476 int i;
1472 adev->sdma[1].ring.funcs = &sdma_v3_0_ring_funcs; 1477
1478 for (i = 0; i < adev->sdma.num_instances; i++)
1479 adev->sdma.instance[i].ring.funcs = &sdma_v3_0_ring_funcs;
1473} 1480}
1474 1481
1475static const struct amdgpu_irq_src_funcs sdma_v3_0_trap_irq_funcs = { 1482static const struct amdgpu_irq_src_funcs sdma_v3_0_trap_irq_funcs = {
@@ -1483,9 +1490,9 @@ static const struct amdgpu_irq_src_funcs sdma_v3_0_illegal_inst_irq_funcs = {
1483 1490
1484static void sdma_v3_0_set_irq_funcs(struct amdgpu_device *adev) 1491static void sdma_v3_0_set_irq_funcs(struct amdgpu_device *adev)
1485{ 1492{
1486 adev->sdma_trap_irq.num_types = AMDGPU_SDMA_IRQ_LAST; 1493 adev->sdma.trap_irq.num_types = AMDGPU_SDMA_IRQ_LAST;
1487 adev->sdma_trap_irq.funcs = &sdma_v3_0_trap_irq_funcs; 1494 adev->sdma.trap_irq.funcs = &sdma_v3_0_trap_irq_funcs;
1488 adev->sdma_illegal_inst_irq.funcs = &sdma_v3_0_illegal_inst_irq_funcs; 1495 adev->sdma.illegal_inst_irq.funcs = &sdma_v3_0_illegal_inst_irq_funcs;
1489} 1496}
1490 1497
1491/** 1498/**
@@ -1551,7 +1558,7 @@ static void sdma_v3_0_set_buffer_funcs(struct amdgpu_device *adev)
1551{ 1558{
1552 if (adev->mman.buffer_funcs == NULL) { 1559 if (adev->mman.buffer_funcs == NULL) {
1553 adev->mman.buffer_funcs = &sdma_v3_0_buffer_funcs; 1560 adev->mman.buffer_funcs = &sdma_v3_0_buffer_funcs;
1554 adev->mman.buffer_funcs_ring = &adev->sdma[0].ring; 1561 adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring;
1555 } 1562 }
1556} 1563}
1557 1564
@@ -1566,7 +1573,7 @@ static void sdma_v3_0_set_vm_pte_funcs(struct amdgpu_device *adev)
1566{ 1573{
1567 if (adev->vm_manager.vm_pte_funcs == NULL) { 1574 if (adev->vm_manager.vm_pte_funcs == NULL) {
1568 adev->vm_manager.vm_pte_funcs = &sdma_v3_0_vm_pte_funcs; 1575 adev->vm_manager.vm_pte_funcs = &sdma_v3_0_vm_pte_funcs;
1569 adev->vm_manager.vm_pte_funcs_ring = &adev->sdma[0].ring; 1576 adev->vm_manager.vm_pte_funcs_ring = &adev->sdma.instance[0].ring;
1570 adev->vm_manager.vm_pte_funcs_ring->is_pte_ring = true; 1577 adev->vm_manager.vm_pte_funcs_ring->is_pte_ring = true;
1571 } 1578 }
1572} 1579}
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
index ed50dd725788..5e9f73af83a8 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
@@ -885,7 +885,6 @@ static const struct amdgpu_ring_funcs uvd_v4_2_ring_funcs = {
885 .emit_semaphore = uvd_v4_2_ring_emit_semaphore, 885 .emit_semaphore = uvd_v4_2_ring_emit_semaphore,
886 .test_ring = uvd_v4_2_ring_test_ring, 886 .test_ring = uvd_v4_2_ring_test_ring,
887 .test_ib = uvd_v4_2_ring_test_ib, 887 .test_ib = uvd_v4_2_ring_test_ib,
888 .is_lockup = amdgpu_ring_test_lockup,
889 .insert_nop = amdgpu_ring_insert_nop, 888 .insert_nop = amdgpu_ring_insert_nop,
890}; 889};
891 890
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
index 9ad8b9906c0b..38864f562981 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
@@ -824,7 +824,6 @@ static const struct amdgpu_ring_funcs uvd_v5_0_ring_funcs = {
824 .emit_semaphore = uvd_v5_0_ring_emit_semaphore, 824 .emit_semaphore = uvd_v5_0_ring_emit_semaphore,
825 .test_ring = uvd_v5_0_ring_test_ring, 825 .test_ring = uvd_v5_0_ring_test_ring,
826 .test_ib = uvd_v5_0_ring_test_ib, 826 .test_ib = uvd_v5_0_ring_test_ib,
827 .is_lockup = amdgpu_ring_test_lockup,
828 .insert_nop = amdgpu_ring_insert_nop, 827 .insert_nop = amdgpu_ring_insert_nop,
829}; 828};
830 829
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
index 7e9934fa4193..121915bbc3b6 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
@@ -808,7 +808,6 @@ static const struct amdgpu_ring_funcs uvd_v6_0_ring_funcs = {
808 .emit_semaphore = uvd_v6_0_ring_emit_semaphore, 808 .emit_semaphore = uvd_v6_0_ring_emit_semaphore,
809 .test_ring = uvd_v6_0_ring_test_ring, 809 .test_ring = uvd_v6_0_ring_test_ring,
810 .test_ib = uvd_v6_0_ring_test_ib, 810 .test_ib = uvd_v6_0_ring_test_ib,
811 .is_lockup = amdgpu_ring_test_lockup,
812 .insert_nop = amdgpu_ring_insert_nop, 811 .insert_nop = amdgpu_ring_insert_nop,
813}; 812};
814 813
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
index cd16df543f64..52ac7a8f1e58 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
@@ -642,7 +642,6 @@ static const struct amdgpu_ring_funcs vce_v2_0_ring_funcs = {
642 .emit_semaphore = amdgpu_vce_ring_emit_semaphore, 642 .emit_semaphore = amdgpu_vce_ring_emit_semaphore,
643 .test_ring = amdgpu_vce_ring_test_ring, 643 .test_ring = amdgpu_vce_ring_test_ring,
644 .test_ib = amdgpu_vce_ring_test_ib, 644 .test_ib = amdgpu_vce_ring_test_ib,
645 .is_lockup = amdgpu_ring_test_lockup,
646 .insert_nop = amdgpu_ring_insert_nop, 645 .insert_nop = amdgpu_ring_insert_nop,
647}; 646};
648 647
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
index f0656dfb53f3..6a52db6ad8d7 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
@@ -205,8 +205,9 @@ static unsigned vce_v3_0_get_harvest_config(struct amdgpu_device *adev)
205 u32 tmp; 205 u32 tmp;
206 unsigned ret; 206 unsigned ret;
207 207
208 /* Fiji is single pipe */ 208 /* Fiji, Stoney are single pipe */
209 if (adev->asic_type == CHIP_FIJI) { 209 if ((adev->asic_type == CHIP_FIJI) ||
210 (adev->asic_type == CHIP_STONEY)){
210 ret = AMDGPU_VCE_HARVEST_VCE1; 211 ret = AMDGPU_VCE_HARVEST_VCE1;
211 return ret; 212 return ret;
212 } 213 }
@@ -643,7 +644,6 @@ static const struct amdgpu_ring_funcs vce_v3_0_ring_funcs = {
643 .emit_semaphore = amdgpu_vce_ring_emit_semaphore, 644 .emit_semaphore = amdgpu_vce_ring_emit_semaphore,
644 .test_ring = amdgpu_vce_ring_test_ring, 645 .test_ring = amdgpu_vce_ring_test_ring,
645 .test_ib = amdgpu_vce_ring_test_ib, 646 .test_ib = amdgpu_vce_ring_test_ib,
646 .is_lockup = amdgpu_ring_test_lockup,
647 .insert_nop = amdgpu_ring_insert_nop, 647 .insert_nop = amdgpu_ring_insert_nop,
648}; 648};
649 649
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c
index 0bac8702e934..2adc1c855e85 100644
--- a/drivers/gpu/drm/amd/amdgpu/vi.c
+++ b/drivers/gpu/drm/amd/amdgpu/vi.c
@@ -232,6 +232,13 @@ static const u32 cz_mgcg_cgcg_init[] =
232 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, 232 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
233}; 233};
234 234
235static const u32 stoney_mgcg_cgcg_init[] =
236{
237 mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00000100,
238 mmHDP_XDP_CGTT_BLK_CTRL, 0xffffffff, 0x00000104,
239 mmHDP_HOST_PATH_CNTL, 0xffffffff, 0x0f000027,
240};
241
235static void vi_init_golden_registers(struct amdgpu_device *adev) 242static void vi_init_golden_registers(struct amdgpu_device *adev)
236{ 243{
237 /* Some of the registers might be dependent on GRBM_GFX_INDEX */ 244 /* Some of the registers might be dependent on GRBM_GFX_INDEX */
@@ -258,6 +265,11 @@ static void vi_init_golden_registers(struct amdgpu_device *adev)
258 cz_mgcg_cgcg_init, 265 cz_mgcg_cgcg_init,
259 (const u32)ARRAY_SIZE(cz_mgcg_cgcg_init)); 266 (const u32)ARRAY_SIZE(cz_mgcg_cgcg_init));
260 break; 267 break;
268 case CHIP_STONEY:
269 amdgpu_program_register_sequence(adev,
270 stoney_mgcg_cgcg_init,
271 (const u32)ARRAY_SIZE(stoney_mgcg_cgcg_init));
272 break;
261 default: 273 default:
262 break; 274 break;
263 } 275 }
@@ -488,6 +500,7 @@ static int vi_read_register(struct amdgpu_device *adev, u32 se_num,
488 case CHIP_FIJI: 500 case CHIP_FIJI:
489 case CHIP_TONGA: 501 case CHIP_TONGA:
490 case CHIP_CARRIZO: 502 case CHIP_CARRIZO:
503 case CHIP_STONEY:
491 asic_register_table = cz_allowed_read_registers; 504 asic_register_table = cz_allowed_read_registers;
492 size = ARRAY_SIZE(cz_allowed_read_registers); 505 size = ARRAY_SIZE(cz_allowed_read_registers);
493 break; 506 break;
@@ -543,8 +556,10 @@ static void vi_print_gpu_status_regs(struct amdgpu_device *adev)
543 RREG32(mmSRBM_STATUS2)); 556 RREG32(mmSRBM_STATUS2));
544 dev_info(adev->dev, " SDMA0_STATUS_REG = 0x%08X\n", 557 dev_info(adev->dev, " SDMA0_STATUS_REG = 0x%08X\n",
545 RREG32(mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET)); 558 RREG32(mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET));
546 dev_info(adev->dev, " SDMA1_STATUS_REG = 0x%08X\n", 559 if (adev->sdma.num_instances > 1) {
547 RREG32(mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET)); 560 dev_info(adev->dev, " SDMA1_STATUS_REG = 0x%08X\n",
561 RREG32(mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET));
562 }
548 dev_info(adev->dev, " CP_STAT = 0x%08x\n", RREG32(mmCP_STAT)); 563 dev_info(adev->dev, " CP_STAT = 0x%08x\n", RREG32(mmCP_STAT));
549 dev_info(adev->dev, " CP_STALLED_STAT1 = 0x%08x\n", 564 dev_info(adev->dev, " CP_STALLED_STAT1 = 0x%08x\n",
550 RREG32(mmCP_STALLED_STAT1)); 565 RREG32(mmCP_STALLED_STAT1));
@@ -639,9 +654,11 @@ u32 vi_gpu_check_soft_reset(struct amdgpu_device *adev)
639 reset_mask |= AMDGPU_RESET_DMA; 654 reset_mask |= AMDGPU_RESET_DMA;
640 655
641 /* SDMA1_STATUS_REG */ 656 /* SDMA1_STATUS_REG */
642 tmp = RREG32(mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET); 657 if (adev->sdma.num_instances > 1) {
643 if (!(tmp & SDMA0_STATUS_REG__IDLE_MASK)) 658 tmp = RREG32(mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET);
644 reset_mask |= AMDGPU_RESET_DMA1; 659 if (!(tmp & SDMA0_STATUS_REG__IDLE_MASK))
660 reset_mask |= AMDGPU_RESET_DMA1;
661 }
645#if 0 662#if 0
646 /* VCE_STATUS */ 663 /* VCE_STATUS */
647 if (adev->asic_type != CHIP_TOPAZ) { 664 if (adev->asic_type != CHIP_TOPAZ) {
@@ -1319,6 +1336,7 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
1319 adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks); 1336 adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks);
1320 break; 1337 break;
1321 case CHIP_CARRIZO: 1338 case CHIP_CARRIZO:
1339 case CHIP_STONEY:
1322 adev->ip_blocks = cz_ip_blocks; 1340 adev->ip_blocks = cz_ip_blocks;
1323 adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks); 1341 adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks);
1324 break; 1342 break;
@@ -1330,11 +1348,18 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
1330 return 0; 1348 return 0;
1331} 1349}
1332 1350
1351#define ATI_REV_ID_FUSE_MACRO__ADDRESS 0xC0014044
1352#define ATI_REV_ID_FUSE_MACRO__SHIFT 9
1353#define ATI_REV_ID_FUSE_MACRO__MASK 0x00001E00
1354
1333static uint32_t vi_get_rev_id(struct amdgpu_device *adev) 1355static uint32_t vi_get_rev_id(struct amdgpu_device *adev)
1334{ 1356{
1335 if (adev->asic_type == CHIP_TOPAZ) 1357 if (adev->asic_type == CHIP_TOPAZ)
1336 return (RREG32(mmPCIE_EFUSE4) & PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID_MASK) 1358 return (RREG32(mmPCIE_EFUSE4) & PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID_MASK)
1337 >> PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID__SHIFT; 1359 >> PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID__SHIFT;
1360 else if (adev->flags & AMD_IS_APU)
1361 return (RREG32_SMC(ATI_REV_ID_FUSE_MACRO__ADDRESS) & ATI_REV_ID_FUSE_MACRO__MASK)
1362 >> ATI_REV_ID_FUSE_MACRO__SHIFT;
1338 else 1363 else
1339 return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK) 1364 return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1340 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT; 1365 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
@@ -1388,32 +1413,35 @@ static int vi_common_early_init(void *handle)
1388 adev->cg_flags = 0; 1413 adev->cg_flags = 0;
1389 adev->pg_flags = 0; 1414 adev->pg_flags = 0;
1390 adev->external_rev_id = 0x1; 1415 adev->external_rev_id = 0x1;
1391 if (amdgpu_smc_load_fw && smc_enabled)
1392 adev->firmware.smu_load = true;
1393 break; 1416 break;
1394 case CHIP_FIJI: 1417 case CHIP_FIJI:
1418 adev->has_uvd = true;
1419 adev->cg_flags = 0;
1420 adev->pg_flags = 0;
1421 adev->external_rev_id = adev->rev_id + 0x3c;
1422 break;
1395 case CHIP_TONGA: 1423 case CHIP_TONGA:
1396 adev->has_uvd = true; 1424 adev->has_uvd = true;
1397 adev->cg_flags = 0; 1425 adev->cg_flags = 0;
1398 adev->pg_flags = 0; 1426 adev->pg_flags = 0;
1399 adev->external_rev_id = adev->rev_id + 0x14; 1427 adev->external_rev_id = adev->rev_id + 0x14;
1400 if (amdgpu_smc_load_fw && smc_enabled)
1401 adev->firmware.smu_load = true;
1402 break; 1428 break;
1403 case CHIP_CARRIZO: 1429 case CHIP_CARRIZO:
1430 case CHIP_STONEY:
1404 adev->has_uvd = true; 1431 adev->has_uvd = true;
1405 adev->cg_flags = 0; 1432 adev->cg_flags = 0;
1406 /* Disable UVD pg */ 1433 /* Disable UVD pg */
1407 adev->pg_flags = /* AMDGPU_PG_SUPPORT_UVD | */AMDGPU_PG_SUPPORT_VCE; 1434 adev->pg_flags = /* AMDGPU_PG_SUPPORT_UVD | */AMDGPU_PG_SUPPORT_VCE;
1408 adev->external_rev_id = adev->rev_id + 0x1; 1435 adev->external_rev_id = adev->rev_id + 0x1;
1409 if (amdgpu_smc_load_fw && smc_enabled)
1410 adev->firmware.smu_load = true;
1411 break; 1436 break;
1412 default: 1437 default:
1413 /* FIXME: not supported yet */ 1438 /* FIXME: not supported yet */
1414 return -EINVAL; 1439 return -EINVAL;
1415 } 1440 }
1416 1441
1442 if (amdgpu_smc_load_fw && smc_enabled)
1443 adev->firmware.smu_load = true;
1444
1417 return 0; 1445 return 0;
1418} 1446}
1419 1447