aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorSean Paul <seanpaul@chromium.org>2017-05-18 09:24:30 -0400
committerSean Paul <seanpaul@chromium.org>2017-05-18 09:24:30 -0400
commit6b7781b42dc9bc9bcd1523b6c24b876cdda0bef3 (patch)
treeee55c67e4ea30b9eb44f301ba0bde2e631a26162 /drivers/gpu/drm
parent52d9d38c183bf0e09601d875ea31bb53c05dd8cf (diff)
parente98c58e55f68f8785aebfab1f8c9a03d8de0afe1 (diff)
Merge remote-tracking branch 'airlied/drm-next' into drm-misc-next
Picking up drm-next @ 4.12-rc1 in order to apply Michal Hocko's vmalloc patch set Signed-off-by: Sean Paul <seanpaul@chromium.org>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h16
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c20
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c13
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c208
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c104
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_display.c140
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c68
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c9
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c21
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h15
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c23
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c12
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c229
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h18
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h37
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c36
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c10
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c14
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c46
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c155
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h21
-rw-r--r--drivers/gpu/drm/amd/amdgpu/ci_dpm.c30
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v10_0.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v11_0.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v6_0.c13
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v8_0.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_virtual.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c10
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c12
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c22
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c517
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c23
-rw-r--r--drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/mmsch_v1_0.h57
-rw-r--r--drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c9
-rw-r--r--drivers/gpu/drm/amd/amdgpu/psp_v3_1.c86
-rw-r--r--drivers/gpu/drm/amd/amdgpu/psp_v3_1.h4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c222
-rw-r--r--drivers/gpu/drm/amd/amdgpu/soc15.c9
-rw-r--r--drivers/gpu/drm/amd/amdgpu/soc15_common.h20
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c466
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v4_0.c224
-rw-r--r--drivers/gpu/drm/amd/include/amd_shared.h6
-rw-r--r--drivers/gpu/drm/amd/include/cgs_common.h270
-rw-r--r--drivers/gpu/drm/amd/powerplay/amd_powerplay.c4
-rw-r--r--drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.c2
-rw-r--r--drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c5
-rw-r--r--drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.h1
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c10
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c49
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h39
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c64
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c9
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.h2
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c408
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h3
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.c27
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.h1
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c4
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c80
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.h2
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h2
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/hwmgr.h4
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/smu9_driver_if.h18
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/vega10_ppsmc.h5
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c226
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.h2
-rw-r--r--drivers/gpu/drm/amd/scheduler/gpu_scheduler.c23
-rw-r--r--drivers/gpu/drm/amd/scheduler/gpu_scheduler.h2
-rw-r--r--drivers/gpu/drm/drm_edid.c8
-rw-r--r--drivers/gpu/drm/drm_fb_helper.c2
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_dump.c4
-rw-r--r--drivers/gpu/drm/exynos/exynos_hdmi.c19
-rw-r--r--drivers/gpu/drm/gma500/gtt.c1
-rw-r--r--drivers/gpu/drm/gma500/psb_drv.c1
-rw-r--r--drivers/gpu/drm/i915/Kconfig.debug13
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c2
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c2
-rw-r--r--drivers/gpu/drm/i915/i915_gem_request.h2
-rw-r--r--drivers/gpu/drm/i915/intel_sprite.c7
-rw-r--r--drivers/gpu/drm/i915/selftests/mock_gem_device.c2
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_gem.c4
-rw-r--r--drivers/gpu/drm/nouveau/nv50_display.c29
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/core/object.c2
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c1
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c2
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/therm/fan.c2
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/therm/fantog.c2
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/therm/temp.c2
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c59
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv04.c2
-rw-r--r--drivers/gpu/drm/radeon/cik.c29
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c18
-rw-r--r--drivers/gpu/drm/radeon/r420.c8
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c10
-rw-r--r--drivers/gpu/drm/radeon/radeon_gart.c3
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_test.c7
-rw-r--r--drivers/gpu/drm/radeon/radeon_uvd.c2
-rw-r--r--drivers/gpu/drm/radeon/si.c29
-rw-r--r--drivers/gpu/drm/sti/sti_compositor.c2
-rw-r--r--drivers/gpu/drm/sti/sti_hdmi.c11
-rw-r--r--drivers/gpu/drm/sti/sti_hdmi.h3
-rw-r--r--drivers/gpu/drm/tegra/Kconfig1
-rw-r--r--drivers/gpu/drm/tegra/Makefile4
-rw-r--r--drivers/gpu/drm/tegra/drm.c283
-rw-r--r--drivers/gpu/drm/tegra/drm.h15
-rw-r--r--drivers/gpu/drm/tegra/falcon.c259
-rw-r--r--drivers/gpu/drm/tegra/falcon.h127
-rw-r--r--drivers/gpu/drm/tegra/fb.c23
-rw-r--r--drivers/gpu/drm/tegra/gem.c12
-rw-r--r--drivers/gpu/drm/tegra/vic.c396
-rw-r--r--drivers/gpu/drm/tegra/vic.h31
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo.c3
-rw-r--r--drivers/gpu/drm/ttm/ttm_page_alloc.c3
-rw-r--r--drivers/gpu/drm/ttm/ttm_page_alloc_dma.c3
-rw-r--r--drivers/gpu/drm/ttm/ttm_tt.c3
-rw-r--r--drivers/gpu/drm/udl/udl_fb.c2
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_kms.c3
136 files changed, 3557 insertions, 2196 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 01156987f1d2..77ff68f9932b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -110,6 +110,7 @@ extern int amdgpu_pos_buf_per_se;
110extern int amdgpu_cntl_sb_buf_per_se; 110extern int amdgpu_cntl_sb_buf_per_se;
111extern int amdgpu_param_buf_per_se; 111extern int amdgpu_param_buf_per_se;
112 112
113#define AMDGPU_DEFAULT_GTT_SIZE_MB 3072ULL /* 3GB by default */
113#define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000 114#define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000
114#define AMDGPU_MAX_USEC_TIMEOUT 100000 /* 100 ms */ 115#define AMDGPU_MAX_USEC_TIMEOUT 100000 /* 100 ms */
115#define AMDGPU_FENCE_JIFFIES_TIMEOUT (HZ / 2) 116#define AMDGPU_FENCE_JIFFIES_TIMEOUT (HZ / 2)
@@ -966,6 +967,8 @@ struct amdgpu_gfx_config {
966 unsigned mc_arb_ramcfg; 967 unsigned mc_arb_ramcfg;
967 unsigned gb_addr_config; 968 unsigned gb_addr_config;
968 unsigned num_rbs; 969 unsigned num_rbs;
970 unsigned gs_vgt_table_depth;
971 unsigned gs_prim_buffer_depth;
969 972
970 uint32_t tile_mode_array[32]; 973 uint32_t tile_mode_array[32];
971 uint32_t macrotile_mode_array[16]; 974 uint32_t macrotile_mode_array[16];
@@ -980,6 +983,7 @@ struct amdgpu_gfx_config {
980struct amdgpu_cu_info { 983struct amdgpu_cu_info {
981 uint32_t number; /* total active CU number */ 984 uint32_t number; /* total active CU number */
982 uint32_t ao_cu_mask; 985 uint32_t ao_cu_mask;
986 uint32_t wave_front_size;
983 uint32_t bitmap[4][4]; 987 uint32_t bitmap[4][4];
984}; 988};
985 989
@@ -1000,10 +1004,10 @@ struct amdgpu_ngg_buf {
1000}; 1004};
1001 1005
1002enum { 1006enum {
1003 PRIM = 0, 1007 NGG_PRIM = 0,
1004 POS, 1008 NGG_POS,
1005 CNTL, 1009 NGG_CNTL,
1006 PARAM, 1010 NGG_PARAM,
1007 NGG_BUF_MAX 1011 NGG_BUF_MAX
1008}; 1012};
1009 1013
@@ -1125,6 +1129,7 @@ struct amdgpu_job {
1125 void *owner; 1129 void *owner;
1126 uint64_t fence_ctx; /* the fence_context this job uses */ 1130 uint64_t fence_ctx; /* the fence_context this job uses */
1127 bool vm_needs_flush; 1131 bool vm_needs_flush;
1132 bool need_pipeline_sync;
1128 unsigned vm_id; 1133 unsigned vm_id;
1129 uint64_t vm_pd_addr; 1134 uint64_t vm_pd_addr;
1130 uint32_t gds_base, gds_size; 1135 uint32_t gds_base, gds_size;
@@ -1704,9 +1709,6 @@ void amdgpu_mm_wdoorbell64(struct amdgpu_device *adev, u32 index, u64 v);
1704#define WREG32_FIELD_OFFSET(reg, offset, field, val) \ 1709#define WREG32_FIELD_OFFSET(reg, offset, field, val) \
1705 WREG32(mm##reg + offset, (RREG32(mm##reg + offset) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field)) 1710 WREG32(mm##reg + offset, (RREG32(mm##reg + offset) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field))
1706 1711
1707#define WREG32_FIELD15(ip, idx, reg, field, val) \
1708 WREG32(SOC15_REG_OFFSET(ip, idx, mm##reg), (RREG32(SOC15_REG_OFFSET(ip, idx, mm##reg)) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field))
1709
1710/* 1712/*
1711 * BIOS helpers. 1713 * BIOS helpers.
1712 */ 1714 */
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
index ad4329922f79..1cf78f4dd339 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
@@ -1727,6 +1727,12 @@ void amdgpu_atombios_scratch_regs_restore(struct amdgpu_device *adev)
1727{ 1727{
1728 int i; 1728 int i;
1729 1729
1730 /*
1731 * VBIOS will check ASIC_INIT_COMPLETE bit to decide if
1732 * execute ASIC_Init posting via driver
1733 */
1734 adev->bios_scratch[7] &= ~ATOM_S7_ASIC_INIT_COMPLETE_MASK;
1735
1730 for (i = 0; i < AMDGPU_BIOS_NUM_SCRATCH; i++) 1736 for (i = 0; i < AMDGPU_BIOS_NUM_SCRATCH; i++)
1731 WREG32(mmBIOS_SCRATCH_0 + i, adev->bios_scratch[i]); 1737 WREG32(mmBIOS_SCRATCH_0 + i, adev->bios_scratch[i]);
1732} 1738}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
index 4b9abd68e04f..4bdda56fccee 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
@@ -26,6 +26,7 @@
26#include "atomfirmware.h" 26#include "atomfirmware.h"
27#include "amdgpu_atomfirmware.h" 27#include "amdgpu_atomfirmware.h"
28#include "atom.h" 28#include "atom.h"
29#include "atombios.h"
29 30
30#define get_index_into_master_table(master_table, table_name) (offsetof(struct master_table, table_name) / sizeof(uint16_t)) 31#define get_index_into_master_table(master_table, table_name) (offsetof(struct master_table, table_name) / sizeof(uint16_t))
31 32
@@ -77,10 +78,29 @@ void amdgpu_atomfirmware_scratch_regs_restore(struct amdgpu_device *adev)
77{ 78{
78 int i; 79 int i;
79 80
81 /*
82 * VBIOS will check ASIC_INIT_COMPLETE bit to decide if
83 * execute ASIC_Init posting via driver
84 */
85 adev->bios_scratch[7] &= ~ATOM_S7_ASIC_INIT_COMPLETE_MASK;
86
80 for (i = 0; i < AMDGPU_BIOS_NUM_SCRATCH; i++) 87 for (i = 0; i < AMDGPU_BIOS_NUM_SCRATCH; i++)
81 WREG32(adev->bios_scratch_reg_offset + i, adev->bios_scratch[i]); 88 WREG32(adev->bios_scratch_reg_offset + i, adev->bios_scratch[i]);
82} 89}
83 90
91void amdgpu_atomfirmware_scratch_regs_engine_hung(struct amdgpu_device *adev,
92 bool hung)
93{
94 u32 tmp = RREG32(adev->bios_scratch_reg_offset + 3);
95
96 if (hung)
97 tmp |= ATOM_S3_ASIC_GUI_ENGINE_HUNG;
98 else
99 tmp &= ~ATOM_S3_ASIC_GUI_ENGINE_HUNG;
100
101 WREG32(adev->bios_scratch_reg_offset + 3, tmp);
102}
103
84int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev) 104int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev)
85{ 105{
86 struct atom_context *ctx = adev->mode_info.atom_context; 106 struct atom_context *ctx = adev->mode_info.atom_context;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h
index d0c4dcd7fa96..a2c3ebe22c71 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h
@@ -28,6 +28,8 @@ bool amdgpu_atomfirmware_gpu_supports_virtualization(struct amdgpu_device *adev)
28void amdgpu_atomfirmware_scratch_regs_init(struct amdgpu_device *adev); 28void amdgpu_atomfirmware_scratch_regs_init(struct amdgpu_device *adev);
29void amdgpu_atomfirmware_scratch_regs_save(struct amdgpu_device *adev); 29void amdgpu_atomfirmware_scratch_regs_save(struct amdgpu_device *adev);
30void amdgpu_atomfirmware_scratch_regs_restore(struct amdgpu_device *adev); 30void amdgpu_atomfirmware_scratch_regs_restore(struct amdgpu_device *adev);
31void amdgpu_atomfirmware_scratch_regs_engine_hung(struct amdgpu_device *adev,
32 bool hung);
31int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev); 33int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev);
32 34
33#endif 35#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
index cc97eee93226..1beae5b930d0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
@@ -117,8 +117,13 @@ static void amdgpu_benchmark_move(struct amdgpu_device *adev, unsigned size,
117 } 117 }
118 118
119out_cleanup: 119out_cleanup:
120 /* Check error value now. The value can be overwritten when clean up.*/
121 if (r) {
122 DRM_ERROR("Error while benchmarking BO move.\n");
123 }
124
120 if (sobj) { 125 if (sobj) {
121 r = amdgpu_bo_reserve(sobj, false); 126 r = amdgpu_bo_reserve(sobj, true);
122 if (likely(r == 0)) { 127 if (likely(r == 0)) {
123 amdgpu_bo_unpin(sobj); 128 amdgpu_bo_unpin(sobj);
124 amdgpu_bo_unreserve(sobj); 129 amdgpu_bo_unreserve(sobj);
@@ -126,17 +131,13 @@ out_cleanup:
126 amdgpu_bo_unref(&sobj); 131 amdgpu_bo_unref(&sobj);
127 } 132 }
128 if (dobj) { 133 if (dobj) {
129 r = amdgpu_bo_reserve(dobj, false); 134 r = amdgpu_bo_reserve(dobj, true);
130 if (likely(r == 0)) { 135 if (likely(r == 0)) {
131 amdgpu_bo_unpin(dobj); 136 amdgpu_bo_unpin(dobj);
132 amdgpu_bo_unreserve(dobj); 137 amdgpu_bo_unreserve(dobj);
133 } 138 }
134 amdgpu_bo_unref(&dobj); 139 amdgpu_bo_unref(&dobj);
135 } 140 }
136
137 if (r) {
138 DRM_ERROR("Error while benchmarking BO move.\n");
139 }
140} 141}
141 142
142void amdgpu_benchmark(struct amdgpu_device *adev, int test_number) 143void amdgpu_benchmark(struct amdgpu_device *adev, int test_number)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
index 1c7e6c28f93a..c6dba1eaefbd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
@@ -42,82 +42,6 @@ struct amdgpu_cgs_device {
42 struct amdgpu_device *adev = \ 42 struct amdgpu_device *adev = \
43 ((struct amdgpu_cgs_device *)cgs_device)->adev 43 ((struct amdgpu_cgs_device *)cgs_device)->adev
44 44
45static int amdgpu_cgs_gpu_mem_info(struct cgs_device *cgs_device, enum cgs_gpu_mem_type type,
46 uint64_t *mc_start, uint64_t *mc_size,
47 uint64_t *mem_size)
48{
49 CGS_FUNC_ADEV;
50 switch(type) {
51 case CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB:
52 case CGS_GPU_MEM_TYPE__VISIBLE_FB:
53 *mc_start = 0;
54 *mc_size = adev->mc.visible_vram_size;
55 *mem_size = adev->mc.visible_vram_size - adev->vram_pin_size;
56 break;
57 case CGS_GPU_MEM_TYPE__INVISIBLE_CONTIG_FB:
58 case CGS_GPU_MEM_TYPE__INVISIBLE_FB:
59 *mc_start = adev->mc.visible_vram_size;
60 *mc_size = adev->mc.real_vram_size - adev->mc.visible_vram_size;
61 *mem_size = *mc_size;
62 break;
63 case CGS_GPU_MEM_TYPE__GART_CACHEABLE:
64 case CGS_GPU_MEM_TYPE__GART_WRITECOMBINE:
65 *mc_start = adev->mc.gtt_start;
66 *mc_size = adev->mc.gtt_size;
67 *mem_size = adev->mc.gtt_size - adev->gart_pin_size;
68 break;
69 default:
70 return -EINVAL;
71 }
72
73 return 0;
74}
75
76static int amdgpu_cgs_gmap_kmem(struct cgs_device *cgs_device, void *kmem,
77 uint64_t size,
78 uint64_t min_offset, uint64_t max_offset,
79 cgs_handle_t *kmem_handle, uint64_t *mcaddr)
80{
81 CGS_FUNC_ADEV;
82 int ret;
83 struct amdgpu_bo *bo;
84 struct page *kmem_page = vmalloc_to_page(kmem);
85 int npages = ALIGN(size, PAGE_SIZE) >> PAGE_SHIFT;
86
87 struct sg_table *sg = drm_prime_pages_to_sg(&kmem_page, npages);
88 ret = amdgpu_bo_create(adev, size, PAGE_SIZE, false,
89 AMDGPU_GEM_DOMAIN_GTT, 0, sg, NULL, &bo);
90 if (ret)
91 return ret;
92 ret = amdgpu_bo_reserve(bo, false);
93 if (unlikely(ret != 0))
94 return ret;
95
96 /* pin buffer into GTT */
97 ret = amdgpu_bo_pin_restricted(bo, AMDGPU_GEM_DOMAIN_GTT,
98 min_offset, max_offset, mcaddr);
99 amdgpu_bo_unreserve(bo);
100
101 *kmem_handle = (cgs_handle_t)bo;
102 return ret;
103}
104
105static int amdgpu_cgs_gunmap_kmem(struct cgs_device *cgs_device, cgs_handle_t kmem_handle)
106{
107 struct amdgpu_bo *obj = (struct amdgpu_bo *)kmem_handle;
108
109 if (obj) {
110 int r = amdgpu_bo_reserve(obj, false);
111 if (likely(r == 0)) {
112 amdgpu_bo_unpin(obj);
113 amdgpu_bo_unreserve(obj);
114 }
115 amdgpu_bo_unref(&obj);
116
117 }
118 return 0;
119}
120
121static int amdgpu_cgs_alloc_gpu_mem(struct cgs_device *cgs_device, 45static int amdgpu_cgs_alloc_gpu_mem(struct cgs_device *cgs_device,
122 enum cgs_gpu_mem_type type, 46 enum cgs_gpu_mem_type type,
123 uint64_t size, uint64_t align, 47 uint64_t size, uint64_t align,
@@ -215,7 +139,7 @@ static int amdgpu_cgs_free_gpu_mem(struct cgs_device *cgs_device, cgs_handle_t h
215 struct amdgpu_bo *obj = (struct amdgpu_bo *)handle; 139 struct amdgpu_bo *obj = (struct amdgpu_bo *)handle;
216 140
217 if (obj) { 141 if (obj) {
218 int r = amdgpu_bo_reserve(obj, false); 142 int r = amdgpu_bo_reserve(obj, true);
219 if (likely(r == 0)) { 143 if (likely(r == 0)) {
220 amdgpu_bo_kunmap(obj); 144 amdgpu_bo_kunmap(obj);
221 amdgpu_bo_unpin(obj); 145 amdgpu_bo_unpin(obj);
@@ -239,7 +163,7 @@ static int amdgpu_cgs_gmap_gpu_mem(struct cgs_device *cgs_device, cgs_handle_t h
239 min_offset = obj->placements[0].fpfn << PAGE_SHIFT; 163 min_offset = obj->placements[0].fpfn << PAGE_SHIFT;
240 max_offset = obj->placements[0].lpfn << PAGE_SHIFT; 164 max_offset = obj->placements[0].lpfn << PAGE_SHIFT;
241 165
242 r = amdgpu_bo_reserve(obj, false); 166 r = amdgpu_bo_reserve(obj, true);
243 if (unlikely(r != 0)) 167 if (unlikely(r != 0))
244 return r; 168 return r;
245 r = amdgpu_bo_pin_restricted(obj, obj->prefered_domains, 169 r = amdgpu_bo_pin_restricted(obj, obj->prefered_domains,
@@ -252,7 +176,7 @@ static int amdgpu_cgs_gunmap_gpu_mem(struct cgs_device *cgs_device, cgs_handle_t
252{ 176{
253 int r; 177 int r;
254 struct amdgpu_bo *obj = (struct amdgpu_bo *)handle; 178 struct amdgpu_bo *obj = (struct amdgpu_bo *)handle;
255 r = amdgpu_bo_reserve(obj, false); 179 r = amdgpu_bo_reserve(obj, true);
256 if (unlikely(r != 0)) 180 if (unlikely(r != 0))
257 return r; 181 return r;
258 r = amdgpu_bo_unpin(obj); 182 r = amdgpu_bo_unpin(obj);
@@ -265,7 +189,7 @@ static int amdgpu_cgs_kmap_gpu_mem(struct cgs_device *cgs_device, cgs_handle_t h
265{ 189{
266 int r; 190 int r;
267 struct amdgpu_bo *obj = (struct amdgpu_bo *)handle; 191 struct amdgpu_bo *obj = (struct amdgpu_bo *)handle;
268 r = amdgpu_bo_reserve(obj, false); 192 r = amdgpu_bo_reserve(obj, true);
269 if (unlikely(r != 0)) 193 if (unlikely(r != 0))
270 return r; 194 return r;
271 r = amdgpu_bo_kmap(obj, map); 195 r = amdgpu_bo_kmap(obj, map);
@@ -277,7 +201,7 @@ static int amdgpu_cgs_kunmap_gpu_mem(struct cgs_device *cgs_device, cgs_handle_t
277{ 201{
278 int r; 202 int r;
279 struct amdgpu_bo *obj = (struct amdgpu_bo *)handle; 203 struct amdgpu_bo *obj = (struct amdgpu_bo *)handle;
280 r = amdgpu_bo_reserve(obj, false); 204 r = amdgpu_bo_reserve(obj, true);
281 if (unlikely(r != 0)) 205 if (unlikely(r != 0))
282 return r; 206 return r;
283 amdgpu_bo_kunmap(obj); 207 amdgpu_bo_kunmap(obj);
@@ -349,62 +273,6 @@ static void amdgpu_cgs_write_ind_register(struct cgs_device *cgs_device,
349 WARN(1, "Invalid indirect register space"); 273 WARN(1, "Invalid indirect register space");
350} 274}
351 275
352static uint8_t amdgpu_cgs_read_pci_config_byte(struct cgs_device *cgs_device, unsigned addr)
353{
354 CGS_FUNC_ADEV;
355 uint8_t val;
356 int ret = pci_read_config_byte(adev->pdev, addr, &val);
357 if (WARN(ret, "pci_read_config_byte error"))
358 return 0;
359 return val;
360}
361
362static uint16_t amdgpu_cgs_read_pci_config_word(struct cgs_device *cgs_device, unsigned addr)
363{
364 CGS_FUNC_ADEV;
365 uint16_t val;
366 int ret = pci_read_config_word(adev->pdev, addr, &val);
367 if (WARN(ret, "pci_read_config_word error"))
368 return 0;
369 return val;
370}
371
372static uint32_t amdgpu_cgs_read_pci_config_dword(struct cgs_device *cgs_device,
373 unsigned addr)
374{
375 CGS_FUNC_ADEV;
376 uint32_t val;
377 int ret = pci_read_config_dword(adev->pdev, addr, &val);
378 if (WARN(ret, "pci_read_config_dword error"))
379 return 0;
380 return val;
381}
382
383static void amdgpu_cgs_write_pci_config_byte(struct cgs_device *cgs_device, unsigned addr,
384 uint8_t value)
385{
386 CGS_FUNC_ADEV;
387 int ret = pci_write_config_byte(adev->pdev, addr, value);
388 WARN(ret, "pci_write_config_byte error");
389}
390
391static void amdgpu_cgs_write_pci_config_word(struct cgs_device *cgs_device, unsigned addr,
392 uint16_t value)
393{
394 CGS_FUNC_ADEV;
395 int ret = pci_write_config_word(adev->pdev, addr, value);
396 WARN(ret, "pci_write_config_word error");
397}
398
399static void amdgpu_cgs_write_pci_config_dword(struct cgs_device *cgs_device, unsigned addr,
400 uint32_t value)
401{
402 CGS_FUNC_ADEV;
403 int ret = pci_write_config_dword(adev->pdev, addr, value);
404 WARN(ret, "pci_write_config_dword error");
405}
406
407
408static int amdgpu_cgs_get_pci_resource(struct cgs_device *cgs_device, 276static int amdgpu_cgs_get_pci_resource(struct cgs_device *cgs_device,
409 enum cgs_resource_type resource_type, 277 enum cgs_resource_type resource_type,
410 uint64_t size, 278 uint64_t size,
@@ -477,56 +345,6 @@ static int amdgpu_cgs_atom_exec_cmd_table(struct cgs_device *cgs_device, unsigne
477 adev->mode_info.atom_context, table, args); 345 adev->mode_info.atom_context, table, args);
478} 346}
479 347
480static int amdgpu_cgs_create_pm_request(struct cgs_device *cgs_device, cgs_handle_t *request)
481{
482 /* TODO */
483 return 0;
484}
485
486static int amdgpu_cgs_destroy_pm_request(struct cgs_device *cgs_device, cgs_handle_t request)
487{
488 /* TODO */
489 return 0;
490}
491
492static int amdgpu_cgs_set_pm_request(struct cgs_device *cgs_device, cgs_handle_t request,
493 int active)
494{
495 /* TODO */
496 return 0;
497}
498
499static int amdgpu_cgs_pm_request_clock(struct cgs_device *cgs_device, cgs_handle_t request,
500 enum cgs_clock clock, unsigned freq)
501{
502 /* TODO */
503 return 0;
504}
505
506static int amdgpu_cgs_pm_request_engine(struct cgs_device *cgs_device, cgs_handle_t request,
507 enum cgs_engine engine, int powered)
508{
509 /* TODO */
510 return 0;
511}
512
513
514
515static int amdgpu_cgs_pm_query_clock_limits(struct cgs_device *cgs_device,
516 enum cgs_clock clock,
517 struct cgs_clock_limits *limits)
518{
519 /* TODO */
520 return 0;
521}
522
523static int amdgpu_cgs_set_camera_voltages(struct cgs_device *cgs_device, uint32_t mask,
524 const uint32_t *voltages)
525{
526 DRM_ERROR("not implemented");
527 return -EPERM;
528}
529
530struct cgs_irq_params { 348struct cgs_irq_params {
531 unsigned src_id; 349 unsigned src_id;
532 cgs_irq_source_set_func_t set; 350 cgs_irq_source_set_func_t set;
@@ -1269,9 +1087,6 @@ static int amdgpu_cgs_call_acpi_method(struct cgs_device *cgs_device,
1269} 1087}
1270 1088
1271static const struct cgs_ops amdgpu_cgs_ops = { 1089static const struct cgs_ops amdgpu_cgs_ops = {
1272 .gpu_mem_info = amdgpu_cgs_gpu_mem_info,
1273 .gmap_kmem = amdgpu_cgs_gmap_kmem,
1274 .gunmap_kmem = amdgpu_cgs_gunmap_kmem,
1275 .alloc_gpu_mem = amdgpu_cgs_alloc_gpu_mem, 1090 .alloc_gpu_mem = amdgpu_cgs_alloc_gpu_mem,
1276 .free_gpu_mem = amdgpu_cgs_free_gpu_mem, 1091 .free_gpu_mem = amdgpu_cgs_free_gpu_mem,
1277 .gmap_gpu_mem = amdgpu_cgs_gmap_gpu_mem, 1092 .gmap_gpu_mem = amdgpu_cgs_gmap_gpu_mem,
@@ -1282,23 +1097,10 @@ static const struct cgs_ops amdgpu_cgs_ops = {
1282 .write_register = amdgpu_cgs_write_register, 1097 .write_register = amdgpu_cgs_write_register,
1283 .read_ind_register = amdgpu_cgs_read_ind_register, 1098 .read_ind_register = amdgpu_cgs_read_ind_register,
1284 .write_ind_register = amdgpu_cgs_write_ind_register, 1099 .write_ind_register = amdgpu_cgs_write_ind_register,
1285 .read_pci_config_byte = amdgpu_cgs_read_pci_config_byte,
1286 .read_pci_config_word = amdgpu_cgs_read_pci_config_word,
1287 .read_pci_config_dword = amdgpu_cgs_read_pci_config_dword,
1288 .write_pci_config_byte = amdgpu_cgs_write_pci_config_byte,
1289 .write_pci_config_word = amdgpu_cgs_write_pci_config_word,
1290 .write_pci_config_dword = amdgpu_cgs_write_pci_config_dword,
1291 .get_pci_resource = amdgpu_cgs_get_pci_resource, 1100 .get_pci_resource = amdgpu_cgs_get_pci_resource,
1292 .atom_get_data_table = amdgpu_cgs_atom_get_data_table, 1101 .atom_get_data_table = amdgpu_cgs_atom_get_data_table,
1293 .atom_get_cmd_table_revs = amdgpu_cgs_atom_get_cmd_table_revs, 1102 .atom_get_cmd_table_revs = amdgpu_cgs_atom_get_cmd_table_revs,
1294 .atom_exec_cmd_table = amdgpu_cgs_atom_exec_cmd_table, 1103 .atom_exec_cmd_table = amdgpu_cgs_atom_exec_cmd_table,
1295 .create_pm_request = amdgpu_cgs_create_pm_request,
1296 .destroy_pm_request = amdgpu_cgs_destroy_pm_request,
1297 .set_pm_request = amdgpu_cgs_set_pm_request,
1298 .pm_request_clock = amdgpu_cgs_pm_request_clock,
1299 .pm_request_engine = amdgpu_cgs_pm_request_engine,
1300 .pm_query_clock_limits = amdgpu_cgs_pm_query_clock_limits,
1301 .set_camera_voltages = amdgpu_cgs_set_camera_voltages,
1302 .get_firmware_info = amdgpu_cgs_get_firmware_info, 1104 .get_firmware_info = amdgpu_cgs_get_firmware_info,
1303 .rel_firmware = amdgpu_cgs_rel_firmware, 1105 .rel_firmware = amdgpu_cgs_rel_firmware,
1304 .set_powergating_state = amdgpu_cgs_set_powergating_state, 1106 .set_powergating_state = amdgpu_cgs_set_powergating_state,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index ec71b9320561..4e6b9501ab0a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -1074,6 +1074,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
1074 cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring, p->fence); 1074 cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring, p->fence);
1075 job->uf_sequence = cs->out.handle; 1075 job->uf_sequence = cs->out.handle;
1076 amdgpu_job_free_resources(job); 1076 amdgpu_job_free_resources(job);
1077 amdgpu_cs_parser_fini(p, 0, true);
1077 1078
1078 trace_amdgpu_cs_ioctl(job); 1079 trace_amdgpu_cs_ioctl(job);
1079 amd_sched_entity_push_job(&job->base); 1080 amd_sched_entity_push_job(&job->base);
@@ -1129,7 +1130,10 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
1129 goto out; 1130 goto out;
1130 1131
1131 r = amdgpu_cs_submit(&parser, cs); 1132 r = amdgpu_cs_submit(&parser, cs);
1133 if (r)
1134 goto out;
1132 1135
1136 return 0;
1133out: 1137out:
1134 amdgpu_cs_parser_fini(&parser, r, reserved_buffers); 1138 amdgpu_cs_parser_fini(&parser, r, reserved_buffers);
1135 return r; 1139 return r;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
index cf0500671353..90d1ac8a80f8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
@@ -273,6 +273,9 @@ struct dma_fence *amdgpu_ctx_get_fence(struct amdgpu_ctx *ctx,
273 273
274 spin_lock(&ctx->ring_lock); 274 spin_lock(&ctx->ring_lock);
275 275
276 if (seq == ~0ull)
277 seq = ctx->rings[ring->idx].sequence - 1;
278
276 if (seq >= cring->sequence) { 279 if (seq >= cring->sequence) {
277 spin_unlock(&ctx->ring_lock); 280 spin_unlock(&ctx->ring_lock);
278 return ERR_PTR(-EINVAL); 281 return ERR_PTR(-EINVAL);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 483660742f75..43ca16b6eee2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -53,7 +53,6 @@
53#include "bif/bif_4_1_d.h" 53#include "bif/bif_4_1_d.h"
54#include <linux/pci.h> 54#include <linux/pci.h>
55#include <linux/firmware.h> 55#include <linux/firmware.h>
56#include "amdgpu_pm.h"
57 56
58static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev); 57static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev);
59static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev); 58static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev);
@@ -350,7 +349,7 @@ static void amdgpu_vram_scratch_fini(struct amdgpu_device *adev)
350 if (adev->vram_scratch.robj == NULL) { 349 if (adev->vram_scratch.robj == NULL) {
351 return; 350 return;
352 } 351 }
353 r = amdgpu_bo_reserve(adev->vram_scratch.robj, false); 352 r = amdgpu_bo_reserve(adev->vram_scratch.robj, true);
354 if (likely(r == 0)) { 353 if (likely(r == 0)) {
355 amdgpu_bo_kunmap(adev->vram_scratch.robj); 354 amdgpu_bo_kunmap(adev->vram_scratch.robj);
356 amdgpu_bo_unpin(adev->vram_scratch.robj); 355 amdgpu_bo_unpin(adev->vram_scratch.robj);
@@ -422,12 +421,11 @@ static int amdgpu_doorbell_init(struct amdgpu_device *adev)
422 if (adev->doorbell.num_doorbells == 0) 421 if (adev->doorbell.num_doorbells == 0)
423 return -EINVAL; 422 return -EINVAL;
424 423
425 adev->doorbell.ptr = ioremap(adev->doorbell.base, adev->doorbell.num_doorbells * sizeof(u32)); 424 adev->doorbell.ptr = ioremap(adev->doorbell.base,
426 if (adev->doorbell.ptr == NULL) { 425 adev->doorbell.num_doorbells *
426 sizeof(u32));
427 if (adev->doorbell.ptr == NULL)
427 return -ENOMEM; 428 return -ENOMEM;
428 }
429 DRM_INFO("doorbell mmio base: 0x%08X\n", (uint32_t)adev->doorbell.base);
430 DRM_INFO("doorbell mmio size: %u\n", (unsigned)adev->doorbell.size);
431 429
432 return 0; 430 return 0;
433} 431}
@@ -1584,9 +1582,6 @@ static int amdgpu_late_init(struct amdgpu_device *adev)
1584 } 1582 }
1585 } 1583 }
1586 1584
1587 amdgpu_dpm_enable_uvd(adev, false);
1588 amdgpu_dpm_enable_vce(adev, false);
1589
1590 return 0; 1585 return 0;
1591} 1586}
1592 1587
@@ -1854,7 +1849,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
1854 1849
1855 /* mutex initialization are all done here so we 1850 /* mutex initialization are all done here so we
1856 * can recall function without having locking issues */ 1851 * can recall function without having locking issues */
1857 mutex_init(&adev->vm_manager.lock);
1858 atomic_set(&adev->irq.ih.lock, 0); 1852 atomic_set(&adev->irq.ih.lock, 0);
1859 mutex_init(&adev->firmware.mutex); 1853 mutex_init(&adev->firmware.mutex);
1860 mutex_init(&adev->pm.mutex); 1854 mutex_init(&adev->pm.mutex);
@@ -2071,7 +2065,8 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
2071 2065
2072 DRM_INFO("amdgpu: finishing device.\n"); 2066 DRM_INFO("amdgpu: finishing device.\n");
2073 adev->shutdown = true; 2067 adev->shutdown = true;
2074 drm_crtc_force_disable_all(adev->ddev); 2068 if (adev->mode_info.mode_config_initialized)
2069 drm_crtc_force_disable_all(adev->ddev);
2075 /* evict vram memory */ 2070 /* evict vram memory */
2076 amdgpu_bo_evict_vram(adev); 2071 amdgpu_bo_evict_vram(adev);
2077 amdgpu_ib_pool_fini(adev); 2072 amdgpu_ib_pool_fini(adev);
@@ -2146,7 +2141,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
2146 2141
2147 if (amdgpu_crtc->cursor_bo) { 2142 if (amdgpu_crtc->cursor_bo) {
2148 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo); 2143 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2149 r = amdgpu_bo_reserve(aobj, false); 2144 r = amdgpu_bo_reserve(aobj, true);
2150 if (r == 0) { 2145 if (r == 0) {
2151 amdgpu_bo_unpin(aobj); 2146 amdgpu_bo_unpin(aobj);
2152 amdgpu_bo_unreserve(aobj); 2147 amdgpu_bo_unreserve(aobj);
@@ -2159,7 +2154,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
2159 robj = gem_to_amdgpu_bo(rfb->obj); 2154 robj = gem_to_amdgpu_bo(rfb->obj);
2160 /* don't unpin kernel fb objects */ 2155 /* don't unpin kernel fb objects */
2161 if (!amdgpu_fbdev_robj_is_fb(adev, robj)) { 2156 if (!amdgpu_fbdev_robj_is_fb(adev, robj)) {
2162 r = amdgpu_bo_reserve(robj, false); 2157 r = amdgpu_bo_reserve(robj, true);
2163 if (r == 0) { 2158 if (r == 0) {
2164 amdgpu_bo_unpin(robj); 2159 amdgpu_bo_unpin(robj);
2165 amdgpu_bo_unreserve(robj); 2160 amdgpu_bo_unreserve(robj);
@@ -2216,7 +2211,7 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
2216 struct drm_connector *connector; 2211 struct drm_connector *connector;
2217 struct amdgpu_device *adev = dev->dev_private; 2212 struct amdgpu_device *adev = dev->dev_private;
2218 struct drm_crtc *crtc; 2213 struct drm_crtc *crtc;
2219 int r; 2214 int r = 0;
2220 2215
2221 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) 2216 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
2222 return 0; 2217 return 0;
@@ -2228,11 +2223,8 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
2228 pci_set_power_state(dev->pdev, PCI_D0); 2223 pci_set_power_state(dev->pdev, PCI_D0);
2229 pci_restore_state(dev->pdev); 2224 pci_restore_state(dev->pdev);
2230 r = pci_enable_device(dev->pdev); 2225 r = pci_enable_device(dev->pdev);
2231 if (r) { 2226 if (r)
2232 if (fbcon) 2227 goto unlock;
2233 console_unlock();
2234 return r;
2235 }
2236 } 2228 }
2237 if (adev->is_atom_fw) 2229 if (adev->is_atom_fw)
2238 amdgpu_atomfirmware_scratch_regs_restore(adev); 2230 amdgpu_atomfirmware_scratch_regs_restore(adev);
@@ -2249,7 +2241,7 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
2249 r = amdgpu_resume(adev); 2241 r = amdgpu_resume(adev);
2250 if (r) { 2242 if (r) {
2251 DRM_ERROR("amdgpu_resume failed (%d).\n", r); 2243 DRM_ERROR("amdgpu_resume failed (%d).\n", r);
2252 return r; 2244 goto unlock;
2253 } 2245 }
2254 amdgpu_fence_driver_resume(adev); 2246 amdgpu_fence_driver_resume(adev);
2255 2247
@@ -2260,11 +2252,8 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
2260 } 2252 }
2261 2253
2262 r = amdgpu_late_init(adev); 2254 r = amdgpu_late_init(adev);
2263 if (r) { 2255 if (r)
2264 if (fbcon) 2256 goto unlock;
2265 console_unlock();
2266 return r;
2267 }
2268 2257
2269 /* pin cursors */ 2258 /* pin cursors */
2270 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 2259 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
@@ -2272,7 +2261,7 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
2272 2261
2273 if (amdgpu_crtc->cursor_bo) { 2262 if (amdgpu_crtc->cursor_bo) {
2274 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo); 2263 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2275 r = amdgpu_bo_reserve(aobj, false); 2264 r = amdgpu_bo_reserve(aobj, true);
2276 if (r == 0) { 2265 if (r == 0) {
2277 r = amdgpu_bo_pin(aobj, 2266 r = amdgpu_bo_pin(aobj,
2278 AMDGPU_GEM_DOMAIN_VRAM, 2267 AMDGPU_GEM_DOMAIN_VRAM,
@@ -2314,12 +2303,14 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
2314 dev->dev->power.disable_depth--; 2303 dev->dev->power.disable_depth--;
2315#endif 2304#endif
2316 2305
2317 if (fbcon) { 2306 if (fbcon)
2318 amdgpu_fbdev_set_suspend(adev, 0); 2307 amdgpu_fbdev_set_suspend(adev, 0);
2308
2309unlock:
2310 if (fbcon)
2319 console_unlock(); 2311 console_unlock();
2320 }
2321 2312
2322 return 0; 2313 return r;
2323} 2314}
2324 2315
2325static bool amdgpu_check_soft_reset(struct amdgpu_device *adev) 2316static bool amdgpu_check_soft_reset(struct amdgpu_device *adev)
@@ -2430,25 +2421,37 @@ static int amdgpu_recover_vram_from_shadow(struct amdgpu_device *adev,
2430 uint32_t domain; 2421 uint32_t domain;
2431 int r; 2422 int r;
2432 2423
2433 if (!bo->shadow) 2424 if (!bo->shadow)
2434 return 0; 2425 return 0;
2426
2427 r = amdgpu_bo_reserve(bo, true);
2428 if (r)
2429 return r;
2430 domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
2431 /* if bo has been evicted, then no need to recover */
2432 if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
2433 r = amdgpu_bo_validate(bo->shadow);
2434 if (r) {
2435 DRM_ERROR("bo validate failed!\n");
2436 goto err;
2437 }
2435 2438
2436 r = amdgpu_bo_reserve(bo, false); 2439 r = amdgpu_ttm_bind(&bo->shadow->tbo, &bo->shadow->tbo.mem);
2437 if (r) 2440 if (r) {
2438 return r; 2441 DRM_ERROR("%p bind failed\n", bo->shadow);
2439 domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type); 2442 goto err;
2440 /* if bo has been evicted, then no need to recover */ 2443 }
2441 if (domain == AMDGPU_GEM_DOMAIN_VRAM) { 2444
2442 r = amdgpu_bo_restore_from_shadow(adev, ring, bo, 2445 r = amdgpu_bo_restore_from_shadow(adev, ring, bo,
2443 NULL, fence, true); 2446 NULL, fence, true);
2444 if (r) { 2447 if (r) {
2445 DRM_ERROR("recover page table failed!\n"); 2448 DRM_ERROR("recover page table failed!\n");
2446 goto err; 2449 goto err;
2447 } 2450 }
2448 } 2451 }
2449err: 2452err:
2450 amdgpu_bo_unreserve(bo); 2453 amdgpu_bo_unreserve(bo);
2451 return r; 2454 return r;
2452} 2455}
2453 2456
2454/** 2457/**
@@ -2520,6 +2523,7 @@ int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary)
2520 ring = adev->mman.buffer_funcs_ring; 2523 ring = adev->mman.buffer_funcs_ring;
2521 mutex_lock(&adev->shadow_list_lock); 2524 mutex_lock(&adev->shadow_list_lock);
2522 list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) { 2525 list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) {
2526 next = NULL;
2523 amdgpu_recover_vram_from_shadow(adev, ring, bo, &next); 2527 amdgpu_recover_vram_from_shadow(adev, ring, bo, &next);
2524 if (fence) { 2528 if (fence) {
2525 r = dma_fence_wait(fence, false); 2529 r = dma_fence_wait(fence, false);
@@ -2593,7 +2597,7 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
2593 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 2597 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2594 struct amdgpu_ring *ring = adev->rings[i]; 2598 struct amdgpu_ring *ring = adev->rings[i];
2595 2599
2596 if (!ring) 2600 if (!ring || !ring->sched.thread)
2597 continue; 2601 continue;
2598 kthread_park(ring->sched.thread); 2602 kthread_park(ring->sched.thread);
2599 amd_sched_hw_job_reset(&ring->sched); 2603 amd_sched_hw_job_reset(&ring->sched);
@@ -2666,6 +2670,7 @@ retry:
2666 DRM_INFO("recover vram bo from shadow\n"); 2670 DRM_INFO("recover vram bo from shadow\n");
2667 mutex_lock(&adev->shadow_list_lock); 2671 mutex_lock(&adev->shadow_list_lock);
2668 list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) { 2672 list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) {
2673 next = NULL;
2669 amdgpu_recover_vram_from_shadow(adev, ring, bo, &next); 2674 amdgpu_recover_vram_from_shadow(adev, ring, bo, &next);
2670 if (fence) { 2675 if (fence) {
2671 r = dma_fence_wait(fence, false); 2676 r = dma_fence_wait(fence, false);
@@ -2688,7 +2693,8 @@ retry:
2688 } 2693 }
2689 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 2694 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2690 struct amdgpu_ring *ring = adev->rings[i]; 2695 struct amdgpu_ring *ring = adev->rings[i];
2691 if (!ring) 2696
2697 if (!ring || !ring->sched.thread)
2692 continue; 2698 continue;
2693 2699
2694 amd_sched_job_recovery(&ring->sched); 2700 amd_sched_job_recovery(&ring->sched);
@@ -2697,7 +2703,7 @@ retry:
2697 } else { 2703 } else {
2698 dev_err(adev->dev, "asic resume failed (%d).\n", r); 2704 dev_err(adev->dev, "asic resume failed (%d).\n", r);
2699 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 2705 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2700 if (adev->rings[i]) { 2706 if (adev->rings[i] && adev->rings[i]->sched.thread) {
2701 kthread_unpark(adev->rings[i]->sched.thread); 2707 kthread_unpark(adev->rings[i]->sched.thread);
2702 } 2708 }
2703 } 2709 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
index 96926a221bd5..cdf2ab20166a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
@@ -123,7 +123,7 @@ static void amdgpu_unpin_work_func(struct work_struct *__work)
123 int r; 123 int r;
124 124
125 /* unpin of the old buffer */ 125 /* unpin of the old buffer */
126 r = amdgpu_bo_reserve(work->old_abo, false); 126 r = amdgpu_bo_reserve(work->old_abo, true);
127 if (likely(r == 0)) { 127 if (likely(r == 0)) {
128 r = amdgpu_bo_unpin(work->old_abo); 128 r = amdgpu_bo_unpin(work->old_abo);
129 if (unlikely(r != 0)) { 129 if (unlikely(r != 0)) {
@@ -138,52 +138,11 @@ static void amdgpu_unpin_work_func(struct work_struct *__work)
138 kfree(work); 138 kfree(work);
139} 139}
140 140
141 141int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
142static void amdgpu_flip_work_cleanup(struct amdgpu_flip_work *work) 142 struct drm_framebuffer *fb,
143{ 143 struct drm_pending_vblank_event *event,
144 int i; 144 uint32_t page_flip_flags, uint32_t target,
145 145 struct drm_modeset_acquire_ctx *ctx)
146 amdgpu_bo_unref(&work->old_abo);
147 dma_fence_put(work->excl);
148 for (i = 0; i < work->shared_count; ++i)
149 dma_fence_put(work->shared[i]);
150 kfree(work->shared);
151 kfree(work);
152}
153
154static void amdgpu_flip_cleanup_unreserve(struct amdgpu_flip_work *work,
155 struct amdgpu_bo *new_abo)
156{
157 amdgpu_bo_unreserve(new_abo);
158 amdgpu_flip_work_cleanup(work);
159}
160
161static void amdgpu_flip_cleanup_unpin(struct amdgpu_flip_work *work,
162 struct amdgpu_bo *new_abo)
163{
164 if (unlikely(amdgpu_bo_unpin(new_abo) != 0))
165 DRM_ERROR("failed to unpin new abo in error path\n");
166 amdgpu_flip_cleanup_unreserve(work, new_abo);
167}
168
169void amdgpu_crtc_cleanup_flip_ctx(struct amdgpu_flip_work *work,
170 struct amdgpu_bo *new_abo)
171{
172 if (unlikely(amdgpu_bo_reserve(new_abo, false) != 0)) {
173 DRM_ERROR("failed to reserve new abo in error path\n");
174 amdgpu_flip_work_cleanup(work);
175 return;
176 }
177 amdgpu_flip_cleanup_unpin(work, new_abo);
178}
179
180int amdgpu_crtc_prepare_flip(struct drm_crtc *crtc,
181 struct drm_framebuffer *fb,
182 struct drm_pending_vblank_event *event,
183 uint32_t page_flip_flags,
184 uint32_t target,
185 struct amdgpu_flip_work **work_p,
186 struct amdgpu_bo **new_abo_p)
187{ 146{
188 struct drm_device *dev = crtc->dev; 147 struct drm_device *dev = crtc->dev;
189 struct amdgpu_device *adev = dev->dev_private; 148 struct amdgpu_device *adev = dev->dev_private;
@@ -196,7 +155,7 @@ int amdgpu_crtc_prepare_flip(struct drm_crtc *crtc,
196 unsigned long flags; 155 unsigned long flags;
197 u64 tiling_flags; 156 u64 tiling_flags;
198 u64 base; 157 u64 base;
199 int r; 158 int i, r;
200 159
201 work = kzalloc(sizeof *work, GFP_KERNEL); 160 work = kzalloc(sizeof *work, GFP_KERNEL);
202 if (work == NULL) 161 if (work == NULL)
@@ -257,80 +216,41 @@ int amdgpu_crtc_prepare_flip(struct drm_crtc *crtc,
257 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); 216 spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
258 r = -EBUSY; 217 r = -EBUSY;
259 goto pflip_cleanup; 218 goto pflip_cleanup;
260
261 } 219 }
262 spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
263
264 *work_p = work;
265 *new_abo_p = new_abo;
266
267 return 0;
268
269pflip_cleanup:
270 amdgpu_crtc_cleanup_flip_ctx(work, new_abo);
271 return r;
272
273unpin:
274 amdgpu_flip_cleanup_unpin(work, new_abo);
275 return r;
276
277unreserve:
278 amdgpu_flip_cleanup_unreserve(work, new_abo);
279 return r;
280 220
281cleanup:
282 amdgpu_flip_work_cleanup(work);
283 return r;
284
285}
286
287void amdgpu_crtc_submit_flip(struct drm_crtc *crtc,
288 struct drm_framebuffer *fb,
289 struct amdgpu_flip_work *work,
290 struct amdgpu_bo *new_abo)
291{
292 unsigned long flags;
293 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
294
295 spin_lock_irqsave(&crtc->dev->event_lock, flags);
296 amdgpu_crtc->pflip_status = AMDGPU_FLIP_PENDING; 221 amdgpu_crtc->pflip_status = AMDGPU_FLIP_PENDING;
297 amdgpu_crtc->pflip_works = work; 222 amdgpu_crtc->pflip_works = work;
298 223
224
225 DRM_DEBUG_DRIVER("crtc:%d[%p], pflip_stat:AMDGPU_FLIP_PENDING, work: %p,\n",
226 amdgpu_crtc->crtc_id, amdgpu_crtc, work);
299 /* update crtc fb */ 227 /* update crtc fb */
300 crtc->primary->fb = fb; 228 crtc->primary->fb = fb;
301 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); 229 spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
302
303 DRM_DEBUG_DRIVER(
304 "crtc:%d[%p], pflip_stat:AMDGPU_FLIP_PENDING, work: %p,\n",
305 amdgpu_crtc->crtc_id, amdgpu_crtc, work);
306
307 amdgpu_flip_work_func(&work->flip_work.work); 230 amdgpu_flip_work_func(&work->flip_work.work);
308} 231 return 0;
309
310int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
311 struct drm_framebuffer *fb,
312 struct drm_pending_vblank_event *event,
313 uint32_t page_flip_flags,
314 uint32_t target,
315 struct drm_modeset_acquire_ctx *ctx)
316{
317 struct amdgpu_bo *new_abo;
318 struct amdgpu_flip_work *work;
319 int r;
320 232
321 r = amdgpu_crtc_prepare_flip(crtc, 233pflip_cleanup:
322 fb, 234 if (unlikely(amdgpu_bo_reserve(new_abo, false) != 0)) {
323 event, 235 DRM_ERROR("failed to reserve new abo in error path\n");
324 page_flip_flags, 236 goto cleanup;
325 target, 237 }
326 &work, 238unpin:
327 &new_abo); 239 if (unlikely(amdgpu_bo_unpin(new_abo) != 0)) {
328 if (r) 240 DRM_ERROR("failed to unpin new abo in error path\n");
329 return r; 241 }
242unreserve:
243 amdgpu_bo_unreserve(new_abo);
330 244
331 amdgpu_crtc_submit_flip(crtc, fb, work, new_abo); 245cleanup:
246 amdgpu_bo_unref(&work->old_abo);
247 dma_fence_put(work->excl);
248 for (i = 0; i < work->shared_count; ++i)
249 dma_fence_put(work->shared[i]);
250 kfree(work->shared);
251 kfree(work);
332 252
333 return 0; 253 return r;
334} 254}
335 255
336int amdgpu_crtc_set_config(struct drm_mode_set *set, 256int amdgpu_crtc_set_config(struct drm_mode_set *set,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 2a4113bbc18a..31eddd85eb40 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -63,9 +63,11 @@
63 * - 3.11.0 - Add support for sensor query info (clocks, temp, etc). 63 * - 3.11.0 - Add support for sensor query info (clocks, temp, etc).
64 * - 3.12.0 - Add query for double offchip LDS buffers 64 * - 3.12.0 - Add query for double offchip LDS buffers
65 * - 3.13.0 - Add PRT support 65 * - 3.13.0 - Add PRT support
66 * - 3.14.0 - Fix race in amdgpu_ctx_get_fence() and note new functionality
67 * - 3.15.0 - Export more gpu info for gfx9
66 */ 68 */
67#define KMS_DRIVER_MAJOR 3 69#define KMS_DRIVER_MAJOR 3
68#define KMS_DRIVER_MINOR 13 70#define KMS_DRIVER_MINOR 15
69#define KMS_DRIVER_PATCHLEVEL 0 71#define KMS_DRIVER_PATCHLEVEL 0
70 72
71int amdgpu_vram_limit = 0; 73int amdgpu_vram_limit = 0;
@@ -453,7 +455,9 @@ static const struct pci_device_id pciidlist[] = {
453 {0x1002, 0x6861, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT}, 455 {0x1002, 0x6861, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT},
454 {0x1002, 0x6862, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT}, 456 {0x1002, 0x6862, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT},
455 {0x1002, 0x6863, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT}, 457 {0x1002, 0x6863, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT},
458 {0x1002, 0x6864, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT},
456 {0x1002, 0x6867, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT}, 459 {0x1002, 0x6867, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT},
460 {0x1002, 0x6868, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT},
457 {0x1002, 0x686c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT}, 461 {0x1002, 0x686c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT},
458 {0x1002, 0x687f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT}, 462 {0x1002, 0x687f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10|AMD_EXP_HW_SUPPORT},
459 {0, 0, 0} 463 {0, 0, 0}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
index a48142d930c6..236d9950221b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
@@ -112,7 +112,7 @@ static void amdgpufb_destroy_pinned_object(struct drm_gem_object *gobj)
112 struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj); 112 struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
113 int ret; 113 int ret;
114 114
115 ret = amdgpu_bo_reserve(abo, false); 115 ret = amdgpu_bo_reserve(abo, true);
116 if (likely(ret == 0)) { 116 if (likely(ret == 0)) {
117 amdgpu_bo_kunmap(abo); 117 amdgpu_bo_kunmap(abo);
118 amdgpu_bo_unpin(abo); 118 amdgpu_bo_unpin(abo);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index 6d691abe889c..902e6015abca 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -27,6 +27,9 @@
27 */ 27 */
28#include <drm/drmP.h> 28#include <drm/drmP.h>
29#include <drm/amdgpu_drm.h> 29#include <drm/amdgpu_drm.h>
30#ifdef CONFIG_X86
31#include <asm/set_memory.h>
32#endif
30#include "amdgpu.h" 33#include "amdgpu.h"
31 34
32/* 35/*
@@ -183,7 +186,7 @@ void amdgpu_gart_table_vram_unpin(struct amdgpu_device *adev)
183 if (adev->gart.robj == NULL) { 186 if (adev->gart.robj == NULL) {
184 return; 187 return;
185 } 188 }
186 r = amdgpu_bo_reserve(adev->gart.robj, false); 189 r = amdgpu_bo_reserve(adev->gart.robj, true);
187 if (likely(r == 0)) { 190 if (likely(r == 0)) {
188 amdgpu_bo_kunmap(adev->gart.robj); 191 amdgpu_bo_kunmap(adev->gart.robj);
189 amdgpu_bo_unpin(adev->gart.robj); 192 amdgpu_bo_unpin(adev->gart.robj);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index 03a9c5cad222..94cb91cf93eb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -139,6 +139,35 @@ int amdgpu_gem_object_open(struct drm_gem_object *obj,
139 return 0; 139 return 0;
140} 140}
141 141
142static int amdgpu_gem_vm_check(void *param, struct amdgpu_bo *bo)
143{
144 /* if anything is swapped out don't swap it in here,
145 just abort and wait for the next CS */
146 if (!amdgpu_bo_gpu_accessible(bo))
147 return -ERESTARTSYS;
148
149 if (bo->shadow && !amdgpu_bo_gpu_accessible(bo->shadow))
150 return -ERESTARTSYS;
151
152 return 0;
153}
154
155static bool amdgpu_gem_vm_ready(struct amdgpu_device *adev,
156 struct amdgpu_vm *vm,
157 struct list_head *list)
158{
159 struct ttm_validate_buffer *entry;
160
161 list_for_each_entry(entry, list, head) {
162 struct amdgpu_bo *bo =
163 container_of(entry->bo, struct amdgpu_bo, tbo);
164 if (amdgpu_gem_vm_check(NULL, bo))
165 return false;
166 }
167
168 return !amdgpu_vm_validate_pt_bos(adev, vm, amdgpu_gem_vm_check, NULL);
169}
170
142void amdgpu_gem_object_close(struct drm_gem_object *obj, 171void amdgpu_gem_object_close(struct drm_gem_object *obj,
143 struct drm_file *file_priv) 172 struct drm_file *file_priv)
144{ 173{
@@ -148,15 +177,13 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj,
148 struct amdgpu_vm *vm = &fpriv->vm; 177 struct amdgpu_vm *vm = &fpriv->vm;
149 178
150 struct amdgpu_bo_list_entry vm_pd; 179 struct amdgpu_bo_list_entry vm_pd;
151 struct list_head list, duplicates; 180 struct list_head list;
152 struct ttm_validate_buffer tv; 181 struct ttm_validate_buffer tv;
153 struct ww_acquire_ctx ticket; 182 struct ww_acquire_ctx ticket;
154 struct amdgpu_bo_va *bo_va; 183 struct amdgpu_bo_va *bo_va;
155 struct dma_fence *fence = NULL;
156 int r; 184 int r;
157 185
158 INIT_LIST_HEAD(&list); 186 INIT_LIST_HEAD(&list);
159 INIT_LIST_HEAD(&duplicates);
160 187
161 tv.bo = &bo->tbo; 188 tv.bo = &bo->tbo;
162 tv.shared = true; 189 tv.shared = true;
@@ -164,16 +191,18 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj,
164 191
165 amdgpu_vm_get_pd_bo(vm, &list, &vm_pd); 192 amdgpu_vm_get_pd_bo(vm, &list, &vm_pd);
166 193
167 r = ttm_eu_reserve_buffers(&ticket, &list, false, &duplicates); 194 r = ttm_eu_reserve_buffers(&ticket, &list, false, NULL);
168 if (r) { 195 if (r) {
169 dev_err(adev->dev, "leaking bo va because " 196 dev_err(adev->dev, "leaking bo va because "
170 "we fail to reserve bo (%d)\n", r); 197 "we fail to reserve bo (%d)\n", r);
171 return; 198 return;
172 } 199 }
173 bo_va = amdgpu_vm_bo_find(vm, bo); 200 bo_va = amdgpu_vm_bo_find(vm, bo);
174 if (bo_va) { 201 if (bo_va && --bo_va->ref_count == 0) {
175 if (--bo_va->ref_count == 0) { 202 amdgpu_vm_bo_rmv(adev, bo_va);
176 amdgpu_vm_bo_rmv(adev, bo_va); 203
204 if (amdgpu_gem_vm_ready(adev, vm, &list)) {
205 struct dma_fence *fence = NULL;
177 206
178 r = amdgpu_vm_clear_freed(adev, vm, &fence); 207 r = amdgpu_vm_clear_freed(adev, vm, &fence);
179 if (unlikely(r)) { 208 if (unlikely(r)) {
@@ -502,19 +531,6 @@ out:
502 return r; 531 return r;
503} 532}
504 533
505static int amdgpu_gem_va_check(void *param, struct amdgpu_bo *bo)
506{
507 /* if anything is swapped out don't swap it in here,
508 just abort and wait for the next CS */
509 if (!amdgpu_bo_gpu_accessible(bo))
510 return -ERESTARTSYS;
511
512 if (bo->shadow && !amdgpu_bo_gpu_accessible(bo->shadow))
513 return -ERESTARTSYS;
514
515 return 0;
516}
517
518/** 534/**
519 * amdgpu_gem_va_update_vm -update the bo_va in its VM 535 * amdgpu_gem_va_update_vm -update the bo_va in its VM
520 * 536 *
@@ -533,19 +549,9 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,
533 struct list_head *list, 549 struct list_head *list,
534 uint32_t operation) 550 uint32_t operation)
535{ 551{
536 struct ttm_validate_buffer *entry;
537 int r = -ERESTARTSYS; 552 int r = -ERESTARTSYS;
538 553
539 list_for_each_entry(entry, list, head) { 554 if (!amdgpu_gem_vm_ready(adev, vm, list))
540 struct amdgpu_bo *bo =
541 container_of(entry->bo, struct amdgpu_bo, tbo);
542 if (amdgpu_gem_va_check(NULL, bo))
543 goto error;
544 }
545
546 r = amdgpu_vm_validate_pt_bos(adev, vm, amdgpu_gem_va_check,
547 NULL);
548 if (r)
549 goto error; 555 goto error;
550 556
551 r = amdgpu_vm_update_directories(adev, vm); 557 r = amdgpu_vm_update_directories(adev, vm);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
index 0335c2f331e9..f7d22c44034d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
@@ -134,6 +134,15 @@ int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man,
134 return r; 134 return r;
135} 135}
136 136
137void amdgpu_gtt_mgr_print(struct seq_file *m, struct ttm_mem_type_manager *man)
138{
139 struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev);
140 struct amdgpu_gtt_mgr *mgr = man->priv;
141
142 seq_printf(m, "man size:%llu pages, gtt available:%llu pages, usage:%lluMB\n",
143 man->size, mgr->available, (u64)atomic64_read(&adev->gtt_usage) >> 20);
144
145}
137/** 146/**
138 * amdgpu_gtt_mgr_new - allocate a new node 147 * amdgpu_gtt_mgr_new - allocate a new node
139 * 148 *
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
index aab857d89d03..6e4ae0d983c2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
@@ -160,6 +160,8 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
160 dev_err(adev->dev, "scheduling IB failed (%d).\n", r); 160 dev_err(adev->dev, "scheduling IB failed (%d).\n", r);
161 return r; 161 return r;
162 } 162 }
163 if (ring->funcs->emit_pipeline_sync && job && job->need_pipeline_sync)
164 amdgpu_ring_emit_pipeline_sync(ring);
163 165
164 if (vm) { 166 if (vm) {
165 r = amdgpu_vm_flush(ring, job); 167 r = amdgpu_vm_flush(ring, job);
@@ -217,7 +219,8 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
217 if (r) { 219 if (r) {
218 dev_err(adev->dev, "failed to emit fence (%d)\n", r); 220 dev_err(adev->dev, "failed to emit fence (%d)\n", r);
219 if (job && job->vm_id) 221 if (job && job->vm_id)
220 amdgpu_vm_reset_id(adev, job->vm_id); 222 amdgpu_vm_reset_id(adev, ring->funcs->vmhub,
223 job->vm_id);
221 amdgpu_ring_undo(ring); 224 amdgpu_ring_undo(ring);
222 return r; 225 return r;
223 } 226 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index 86a12424c162..7570f2439a11 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -57,6 +57,7 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
57 (*job)->vm = vm; 57 (*job)->vm = vm;
58 (*job)->ibs = (void *)&(*job)[1]; 58 (*job)->ibs = (void *)&(*job)[1];
59 (*job)->num_ibs = num_ibs; 59 (*job)->num_ibs = num_ibs;
60 (*job)->need_pipeline_sync = false;
60 61
61 amdgpu_sync_create(&(*job)->sync); 62 amdgpu_sync_create(&(*job)->sync);
62 63
@@ -139,7 +140,7 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
139 140
140 struct dma_fence *fence = amdgpu_sync_get_fence(&job->sync); 141 struct dma_fence *fence = amdgpu_sync_get_fence(&job->sync);
141 142
142 if (fence == NULL && vm && !job->vm_id) { 143 while (fence == NULL && vm && !job->vm_id) {
143 struct amdgpu_ring *ring = job->ring; 144 struct amdgpu_ring *ring = job->ring;
144 int r; 145 int r;
145 146
@@ -152,6 +153,9 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
152 fence = amdgpu_sync_get_fence(&job->sync); 153 fence = amdgpu_sync_get_fence(&job->sync);
153 } 154 }
154 155
156 if (amd_sched_dependency_optimized(fence, sched_job->s_entity))
157 job->need_pipeline_sync = true;
158
155 return fence; 159 return fence;
156} 160}
157 161
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 40f45ba71b86..dca4be970d13 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -545,11 +545,22 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
545 adev->gfx.config.double_offchip_lds_buf; 545 adev->gfx.config.double_offchip_lds_buf;
546 546
547 if (amdgpu_ngg) { 547 if (amdgpu_ngg) {
548 dev_info.prim_buf_gpu_addr = adev->gfx.ngg.buf[PRIM].gpu_addr; 548 dev_info.prim_buf_gpu_addr = adev->gfx.ngg.buf[NGG_PRIM].gpu_addr;
549 dev_info.pos_buf_gpu_addr = adev->gfx.ngg.buf[POS].gpu_addr; 549 dev_info.prim_buf_size = adev->gfx.ngg.buf[NGG_PRIM].size;
550 dev_info.cntl_sb_buf_gpu_addr = adev->gfx.ngg.buf[CNTL].gpu_addr; 550 dev_info.pos_buf_gpu_addr = adev->gfx.ngg.buf[NGG_POS].gpu_addr;
551 dev_info.param_buf_gpu_addr = adev->gfx.ngg.buf[PARAM].gpu_addr; 551 dev_info.pos_buf_size = adev->gfx.ngg.buf[NGG_POS].size;
552 dev_info.cntl_sb_buf_gpu_addr = adev->gfx.ngg.buf[NGG_CNTL].gpu_addr;
553 dev_info.cntl_sb_buf_size = adev->gfx.ngg.buf[NGG_CNTL].size;
554 dev_info.param_buf_gpu_addr = adev->gfx.ngg.buf[NGG_PARAM].gpu_addr;
555 dev_info.param_buf_size = adev->gfx.ngg.buf[NGG_PARAM].size;
552 } 556 }
557 dev_info.wave_front_size = adev->gfx.cu_info.wave_front_size;
558 dev_info.num_shader_visible_vgprs = adev->gfx.config.max_gprs;
559 dev_info.num_cu_per_sh = adev->gfx.config.max_cu_per_sh;
560 dev_info.num_tcc_blocks = adev->gfx.config.max_texture_channel_caches;
561 dev_info.gs_vgt_table_depth = adev->gfx.config.gs_vgt_table_depth;
562 dev_info.gs_prim_buffer_depth = adev->gfx.config.gs_prim_buffer_depth;
563 dev_info.max_gs_waves_per_vgt = adev->gfx.config.max_gs_threads;
553 564
554 return copy_to_user(out, &dev_info, 565 return copy_to_user(out, &dev_info,
555 min((size_t)size, sizeof(dev_info))) ? -EFAULT : 0; 566 min((size_t)size, sizeof(dev_info))) ? -EFAULT : 0;
@@ -810,7 +821,7 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
810 821
811 if (amdgpu_sriov_vf(adev)) { 822 if (amdgpu_sriov_vf(adev)) {
812 /* TODO: how to handle reserve failure */ 823 /* TODO: how to handle reserve failure */
813 BUG_ON(amdgpu_bo_reserve(adev->virt.csa_obj, false)); 824 BUG_ON(amdgpu_bo_reserve(adev->virt.csa_obj, true));
814 amdgpu_vm_bo_rmv(adev, fpriv->vm.csa_bo_va); 825 amdgpu_vm_bo_rmv(adev, fpriv->vm.csa_bo_va);
815 fpriv->vm.csa_bo_va = NULL; 826 fpriv->vm.csa_bo_va = NULL;
816 amdgpu_bo_unreserve(adev->virt.csa_obj); 827 amdgpu_bo_unreserve(adev->virt.csa_obj);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
index 20d6522fd7b4..43a9d3aec6c4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -600,21 +600,6 @@ int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
600 struct drm_pending_vblank_event *event, 600 struct drm_pending_vblank_event *event,
601 uint32_t page_flip_flags, uint32_t target, 601 uint32_t page_flip_flags, uint32_t target,
602 struct drm_modeset_acquire_ctx *ctx); 602 struct drm_modeset_acquire_ctx *ctx);
603void amdgpu_crtc_cleanup_flip_ctx(struct amdgpu_flip_work *work,
604 struct amdgpu_bo *new_abo);
605int amdgpu_crtc_prepare_flip(struct drm_crtc *crtc,
606 struct drm_framebuffer *fb,
607 struct drm_pending_vblank_event *event,
608 uint32_t page_flip_flags,
609 uint32_t target,
610 struct amdgpu_flip_work **work,
611 struct amdgpu_bo **new_abo);
612
613void amdgpu_crtc_submit_flip(struct drm_crtc *crtc,
614 struct drm_framebuffer *fb,
615 struct amdgpu_flip_work *work,
616 struct amdgpu_bo *new_abo);
617
618extern const struct drm_mode_config_funcs amdgpu_mode_funcs; 603extern const struct drm_mode_config_funcs amdgpu_mode_funcs;
619 604
620#endif 605#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index cb89fff863c0..365883d7948d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -295,7 +295,7 @@ void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
295 if (*bo == NULL) 295 if (*bo == NULL)
296 return; 296 return;
297 297
298 if (likely(amdgpu_bo_reserve(*bo, false) == 0)) { 298 if (likely(amdgpu_bo_reserve(*bo, true) == 0)) {
299 if (cpu_addr) 299 if (cpu_addr)
300 amdgpu_bo_kunmap(*bo); 300 amdgpu_bo_kunmap(*bo);
301 301
@@ -543,6 +543,27 @@ err:
543 return r; 543 return r;
544} 544}
545 545
546int amdgpu_bo_validate(struct amdgpu_bo *bo)
547{
548 uint32_t domain;
549 int r;
550
551 if (bo->pin_count)
552 return 0;
553
554 domain = bo->prefered_domains;
555
556retry:
557 amdgpu_ttm_placement_from_domain(bo, domain);
558 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
559 if (unlikely(r == -ENOMEM) && domain != bo->allowed_domains) {
560 domain = bo->allowed_domains;
561 goto retry;
562 }
563
564 return r;
565}
566
546int amdgpu_bo_restore_from_shadow(struct amdgpu_device *adev, 567int amdgpu_bo_restore_from_shadow(struct amdgpu_device *adev,
547 struct amdgpu_ring *ring, 568 struct amdgpu_ring *ring,
548 struct amdgpu_bo *bo, 569 struct amdgpu_bo *bo,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index 15a723adca76..382485115b06 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -175,6 +175,7 @@ int amdgpu_bo_backup_to_shadow(struct amdgpu_device *adev,
175 struct amdgpu_bo *bo, 175 struct amdgpu_bo *bo,
176 struct reservation_object *resv, 176 struct reservation_object *resv,
177 struct dma_fence **fence, bool direct); 177 struct dma_fence **fence, bool direct);
178int amdgpu_bo_validate(struct amdgpu_bo *bo);
178int amdgpu_bo_restore_from_shadow(struct amdgpu_device *adev, 179int amdgpu_bo_restore_from_shadow(struct amdgpu_device *adev,
179 struct amdgpu_ring *ring, 180 struct amdgpu_ring *ring,
180 struct amdgpu_bo *bo, 181 struct amdgpu_bo *bo,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
index 990fde2cf4fd..7df503aedb69 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
@@ -867,8 +867,7 @@ static ssize_t amdgpu_hwmon_get_pwm1_enable(struct device *dev,
867 867
868 pwm_mode = amdgpu_dpm_get_fan_control_mode(adev); 868 pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
869 869
870 /* never 0 (full-speed), fuse or smc-controlled always */ 870 return sprintf(buf, "%i\n", pwm_mode);
871 return sprintf(buf, "%i\n", pwm_mode == FDO_PWM_MODE_STATIC ? 1 : 2);
872} 871}
873 872
874static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev, 873static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev,
@@ -887,14 +886,7 @@ static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev,
887 if (err) 886 if (err)
888 return err; 887 return err;
889 888
890 switch (value) { 889 amdgpu_dpm_set_fan_control_mode(adev, value);
891 case 1: /* manual, percent-based */
892 amdgpu_dpm_set_fan_control_mode(adev, FDO_PWM_MODE_STATIC);
893 break;
894 default: /* disable */
895 amdgpu_dpm_set_fan_control_mode(adev, 0);
896 break;
897 }
898 890
899 return count; 891 return count;
900} 892}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
index 3826d5aea0a6..6bdc866570ab 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
@@ -113,7 +113,7 @@ void amdgpu_gem_prime_unpin(struct drm_gem_object *obj)
113 struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); 113 struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
114 int ret = 0; 114 int ret = 0;
115 115
116 ret = amdgpu_bo_reserve(bo, false); 116 ret = amdgpu_bo_reserve(bo, true);
117 if (unlikely(ret != 0)) 117 if (unlikely(ret != 0))
118 return; 118 return;
119 119
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index e6cf91ca5761..596e3957bdd9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -55,6 +55,8 @@ static int psp_sw_init(void *handle)
55 psp->bootloader_load_sos = psp_v3_1_bootloader_load_sos; 55 psp->bootloader_load_sos = psp_v3_1_bootloader_load_sos;
56 psp->prep_cmd_buf = psp_v3_1_prep_cmd_buf; 56 psp->prep_cmd_buf = psp_v3_1_prep_cmd_buf;
57 psp->ring_init = psp_v3_1_ring_init; 57 psp->ring_init = psp_v3_1_ring_init;
58 psp->ring_create = psp_v3_1_ring_create;
59 psp->ring_destroy = psp_v3_1_ring_destroy;
58 psp->cmd_submit = psp_v3_1_cmd_submit; 60 psp->cmd_submit = psp_v3_1_cmd_submit;
59 psp->compare_sram_data = psp_v3_1_compare_sram_data; 61 psp->compare_sram_data = psp_v3_1_compare_sram_data;
60 psp->smu_reload_quirk = psp_v3_1_smu_reload_quirk; 62 psp->smu_reload_quirk = psp_v3_1_smu_reload_quirk;
@@ -152,11 +154,6 @@ static void psp_prep_tmr_cmd_buf(struct psp_gfx_cmd_resp *cmd,
152static int psp_tmr_init(struct psp_context *psp) 154static int psp_tmr_init(struct psp_context *psp)
153{ 155{
154 int ret; 156 int ret;
155 struct psp_gfx_cmd_resp *cmd;
156
157 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
158 if (!cmd)
159 return -ENOMEM;
160 157
161 /* 158 /*
162 * Allocate 3M memory aligned to 1M from Frame Buffer (local 159 * Allocate 3M memory aligned to 1M from Frame Buffer (local
@@ -168,22 +165,30 @@ static int psp_tmr_init(struct psp_context *psp)
168 ret = amdgpu_bo_create_kernel(psp->adev, 0x300000, 0x100000, 165 ret = amdgpu_bo_create_kernel(psp->adev, 0x300000, 0x100000,
169 AMDGPU_GEM_DOMAIN_VRAM, 166 AMDGPU_GEM_DOMAIN_VRAM,
170 &psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf); 167 &psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf);
171 if (ret) 168
172 goto failed; 169 return ret;
170}
171
172static int psp_tmr_load(struct psp_context *psp)
173{
174 int ret;
175 struct psp_gfx_cmd_resp *cmd;
176
177 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
178 if (!cmd)
179 return -ENOMEM;
173 180
174 psp_prep_tmr_cmd_buf(cmd, psp->tmr_mc_addr, 0x300000); 181 psp_prep_tmr_cmd_buf(cmd, psp->tmr_mc_addr, 0x300000);
175 182
176 ret = psp_cmd_submit_buf(psp, NULL, cmd, 183 ret = psp_cmd_submit_buf(psp, NULL, cmd,
177 psp->fence_buf_mc_addr, 1); 184 psp->fence_buf_mc_addr, 1);
178 if (ret) 185 if (ret)
179 goto failed_mem; 186 goto failed;
180 187
181 kfree(cmd); 188 kfree(cmd);
182 189
183 return 0; 190 return 0;
184 191
185failed_mem:
186 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf);
187failed: 192failed:
188 kfree(cmd); 193 kfree(cmd);
189 return ret; 194 return ret;
@@ -203,104 +208,78 @@ static void psp_prep_asd_cmd_buf(struct psp_gfx_cmd_resp *cmd,
203 cmd->cmd.cmd_load_ta.cmd_buf_len = shared_size; 208 cmd->cmd.cmd_load_ta.cmd_buf_len = shared_size;
204} 209}
205 210
206static int psp_asd_load(struct psp_context *psp) 211static int psp_asd_init(struct psp_context *psp)
207{ 212{
208 int ret; 213 int ret;
209 struct amdgpu_bo *asd_bo, *asd_shared_bo;
210 uint64_t asd_mc_addr, asd_shared_mc_addr;
211 void *asd_buf, *asd_shared_buf;
212 struct psp_gfx_cmd_resp *cmd;
213
214 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
215 if (!cmd)
216 return -ENOMEM;
217 214
218 /* 215 /*
219 * Allocate 16k memory aligned to 4k from Frame Buffer (local 216 * Allocate 16k memory aligned to 4k from Frame Buffer (local
220 * physical) for shared ASD <-> Driver 217 * physical) for shared ASD <-> Driver
221 */ 218 */
222 ret = amdgpu_bo_create_kernel(psp->adev, PSP_ASD_SHARED_MEM_SIZE, PAGE_SIZE, 219 ret = amdgpu_bo_create_kernel(psp->adev, PSP_ASD_SHARED_MEM_SIZE,
223 AMDGPU_GEM_DOMAIN_VRAM, 220 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
224 &asd_shared_bo, &asd_shared_mc_addr, &asd_buf); 221 &psp->asd_shared_bo,
225 if (ret) 222 &psp->asd_shared_mc_addr,
226 goto failed; 223 &psp->asd_shared_buf);
227 224
228 /* 225 return ret;
229 * Allocate 256k memory aligned to 4k from Frame Buffer (local 226}
230 * physical) for ASD firmware 227
231 */ 228static int psp_asd_load(struct psp_context *psp)
232 ret = amdgpu_bo_create_kernel(psp->adev, PSP_ASD_BIN_SIZE, PAGE_SIZE, 229{
233 AMDGPU_GEM_DOMAIN_VRAM, 230 int ret;
234 &asd_bo, &asd_mc_addr, &asd_buf); 231 struct psp_gfx_cmd_resp *cmd;
235 if (ret) 232
236 goto failed_mem; 233 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
234 if (!cmd)
235 return -ENOMEM;
237 236
238 memcpy(asd_buf, psp->asd_start_addr, psp->asd_ucode_size); 237 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
238 memcpy(psp->fw_pri_buf, psp->asd_start_addr, psp->asd_ucode_size);
239 239
240 psp_prep_asd_cmd_buf(cmd, asd_mc_addr, asd_shared_mc_addr, 240 psp_prep_asd_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->asd_shared_mc_addr,
241 psp->asd_ucode_size, PSP_ASD_SHARED_MEM_SIZE); 241 psp->asd_ucode_size, PSP_ASD_SHARED_MEM_SIZE);
242 242
243 ret = psp_cmd_submit_buf(psp, NULL, cmd, 243 ret = psp_cmd_submit_buf(psp, NULL, cmd,
244 psp->fence_buf_mc_addr, 2); 244 psp->fence_buf_mc_addr, 2);
245 if (ret)
246 goto failed_mem1;
247 245
248 amdgpu_bo_free_kernel(&asd_bo, &asd_mc_addr, &asd_buf);
249 amdgpu_bo_free_kernel(&asd_shared_bo, &asd_shared_mc_addr, &asd_shared_buf);
250 kfree(cmd); 246 kfree(cmd);
251 247
252 return 0;
253
254failed_mem1:
255 amdgpu_bo_free_kernel(&asd_bo, &asd_mc_addr, &asd_buf);
256failed_mem:
257 amdgpu_bo_free_kernel(&asd_shared_bo, &asd_shared_mc_addr, &asd_shared_buf);
258failed:
259 kfree(cmd);
260 return ret; 248 return ret;
261} 249}
262 250
263static int psp_load_fw(struct amdgpu_device *adev) 251static int psp_hw_start(struct psp_context *psp)
264{ 252{
265 int ret; 253 int ret;
266 struct psp_gfx_cmd_resp *cmd;
267 int i;
268 struct amdgpu_firmware_info *ucode;
269 struct psp_context *psp = &adev->psp;
270
271 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
272 if (!cmd)
273 return -ENOMEM;
274 254
275 ret = psp_bootloader_load_sysdrv(psp); 255 ret = psp_bootloader_load_sysdrv(psp);
276 if (ret) 256 if (ret)
277 goto failed; 257 return ret;
278 258
279 ret = psp_bootloader_load_sos(psp); 259 ret = psp_bootloader_load_sos(psp);
280 if (ret) 260 if (ret)
281 goto failed; 261 return ret;
282
283 ret = psp_ring_init(psp, PSP_RING_TYPE__KM);
284 if (ret)
285 goto failed;
286 262
287 ret = amdgpu_bo_create_kernel(adev, PSP_FENCE_BUFFER_SIZE, PAGE_SIZE, 263 ret = psp_ring_create(psp, PSP_RING_TYPE__KM);
288 AMDGPU_GEM_DOMAIN_VRAM,
289 &psp->fence_buf_bo,
290 &psp->fence_buf_mc_addr,
291 &psp->fence_buf);
292 if (ret) 264 if (ret)
293 goto failed; 265 return ret;
294
295 memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE);
296 266
297 ret = psp_tmr_init(psp); 267 ret = psp_tmr_load(psp);
298 if (ret) 268 if (ret)
299 goto failed_mem; 269 return ret;
300 270
301 ret = psp_asd_load(psp); 271 ret = psp_asd_load(psp);
302 if (ret) 272 if (ret)
303 goto failed_mem; 273 return ret;
274
275 return 0;
276}
277
278static int psp_np_fw_load(struct psp_context *psp)
279{
280 int i, ret;
281 struct amdgpu_firmware_info *ucode;
282 struct amdgpu_device* adev = psp->adev;
304 283
305 for (i = 0; i < adev->firmware.max_ucodes; i++) { 284 for (i = 0; i < adev->firmware.max_ucodes; i++) {
306 ucode = &adev->firmware.ucode[i]; 285 ucode = &adev->firmware.ucode[i];
@@ -310,15 +289,21 @@ static int psp_load_fw(struct amdgpu_device *adev)
310 if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC && 289 if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC &&
311 psp_smu_reload_quirk(psp)) 290 psp_smu_reload_quirk(psp))
312 continue; 291 continue;
292 if (amdgpu_sriov_vf(adev) &&
293 (ucode->ucode_id == AMDGPU_UCODE_ID_SDMA0
294 || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA1
295 || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_G))
296 /*skip ucode loading in SRIOV VF */
297 continue;
313 298
314 ret = psp_prep_cmd_buf(ucode, cmd); 299 ret = psp_prep_cmd_buf(ucode, psp->cmd);
315 if (ret) 300 if (ret)
316 goto failed_mem; 301 return ret;
317 302
318 ret = psp_cmd_submit_buf(psp, ucode, cmd, 303 ret = psp_cmd_submit_buf(psp, ucode, psp->cmd,
319 psp->fence_buf_mc_addr, i + 3); 304 psp->fence_buf_mc_addr, i + 3);
320 if (ret) 305 if (ret)
321 goto failed_mem; 306 return ret;
322 307
323#if 0 308#if 0
324 /* check if firmware loaded sucessfully */ 309 /* check if firmware loaded sucessfully */
@@ -327,8 +312,59 @@ static int psp_load_fw(struct amdgpu_device *adev)
327#endif 312#endif
328 } 313 }
329 314
330 amdgpu_bo_free_kernel(&psp->fence_buf_bo, 315 return 0;
331 &psp->fence_buf_mc_addr, &psp->fence_buf); 316}
317
318static int psp_load_fw(struct amdgpu_device *adev)
319{
320 int ret;
321 struct psp_context *psp = &adev->psp;
322 struct psp_gfx_cmd_resp *cmd;
323
324 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
325 if (!cmd)
326 return -ENOMEM;
327
328 psp->cmd = cmd;
329
330 ret = amdgpu_bo_create_kernel(adev, PSP_1_MEG, PSP_1_MEG,
331 AMDGPU_GEM_DOMAIN_GTT,
332 &psp->fw_pri_bo,
333 &psp->fw_pri_mc_addr,
334 &psp->fw_pri_buf);
335 if (ret)
336 goto failed;
337
338 ret = amdgpu_bo_create_kernel(adev, PSP_FENCE_BUFFER_SIZE, PAGE_SIZE,
339 AMDGPU_GEM_DOMAIN_VRAM,
340 &psp->fence_buf_bo,
341 &psp->fence_buf_mc_addr,
342 &psp->fence_buf);
343 if (ret)
344 goto failed_mem1;
345
346 memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE);
347
348 ret = psp_ring_init(psp, PSP_RING_TYPE__KM);
349 if (ret)
350 goto failed_mem1;
351
352 ret = psp_tmr_init(psp);
353 if (ret)
354 goto failed_mem;
355
356 ret = psp_asd_init(psp);
357 if (ret)
358 goto failed_mem;
359
360 ret = psp_hw_start(psp);
361 if (ret)
362 goto failed_mem;
363
364 ret = psp_np_fw_load(psp);
365 if (ret)
366 goto failed_mem;
367
332 kfree(cmd); 368 kfree(cmd);
333 369
334 return 0; 370 return 0;
@@ -336,6 +372,9 @@ static int psp_load_fw(struct amdgpu_device *adev)
336failed_mem: 372failed_mem:
337 amdgpu_bo_free_kernel(&psp->fence_buf_bo, 373 amdgpu_bo_free_kernel(&psp->fence_buf_bo,
338 &psp->fence_buf_mc_addr, &psp->fence_buf); 374 &psp->fence_buf_mc_addr, &psp->fence_buf);
375failed_mem1:
376 amdgpu_bo_free_kernel(&psp->fw_pri_bo,
377 &psp->fw_pri_mc_addr, &psp->fw_pri_buf);
339failed: 378failed:
340 kfree(cmd); 379 kfree(cmd);
341 return ret; 380 return ret;
@@ -379,12 +418,24 @@ static int psp_hw_fini(void *handle)
379 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 418 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
380 struct psp_context *psp = &adev->psp; 419 struct psp_context *psp = &adev->psp;
381 420
382 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) 421 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
383 amdgpu_ucode_fini_bo(adev); 422 return 0;
423
424 amdgpu_ucode_fini_bo(adev);
425
426 psp_ring_destroy(psp, PSP_RING_TYPE__KM);
384 427
385 if (psp->tmr_buf) 428 if (psp->tmr_buf)
386 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf); 429 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf);
387 430
431 if (psp->fw_pri_buf)
432 amdgpu_bo_free_kernel(&psp->fw_pri_bo,
433 &psp->fw_pri_mc_addr, &psp->fw_pri_buf);
434
435 if (psp->fence_buf_bo)
436 amdgpu_bo_free_kernel(&psp->fence_buf_bo,
437 &psp->fence_buf_mc_addr, &psp->fence_buf);
438
388 return 0; 439 return 0;
389} 440}
390 441
@@ -397,18 +448,30 @@ static int psp_resume(void *handle)
397{ 448{
398 int ret; 449 int ret;
399 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 450 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
451 struct psp_context *psp = &adev->psp;
400 452
401 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) 453 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
402 return 0; 454 return 0;
403 455
456 DRM_INFO("PSP is resuming...\n");
457
404 mutex_lock(&adev->firmware.mutex); 458 mutex_lock(&adev->firmware.mutex);
405 459
406 ret = psp_load_fw(adev); 460 ret = psp_hw_start(psp);
407 if (ret) 461 if (ret)
408 DRM_ERROR("PSP resume failed\n"); 462 goto failed;
463
464 ret = psp_np_fw_load(psp);
465 if (ret)
466 goto failed;
409 467
410 mutex_unlock(&adev->firmware.mutex); 468 mutex_unlock(&adev->firmware.mutex);
411 469
470 return 0;
471
472failed:
473 DRM_ERROR("PSP resume failed\n");
474 mutex_unlock(&adev->firmware.mutex);
412 return ret; 475 return ret;
413} 476}
414 477
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
index e9f35e025b59..0301e4e0b297 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
@@ -30,8 +30,8 @@
30 30
31#define PSP_FENCE_BUFFER_SIZE 0x1000 31#define PSP_FENCE_BUFFER_SIZE 0x1000
32#define PSP_CMD_BUFFER_SIZE 0x1000 32#define PSP_CMD_BUFFER_SIZE 0x1000
33#define PSP_ASD_BIN_SIZE 0x40000
34#define PSP_ASD_SHARED_MEM_SIZE 0x4000 33#define PSP_ASD_SHARED_MEM_SIZE 0x4000
34#define PSP_1_MEG 0x100000
35 35
36enum psp_ring_type 36enum psp_ring_type
37{ 37{
@@ -57,6 +57,7 @@ struct psp_context
57{ 57{
58 struct amdgpu_device *adev; 58 struct amdgpu_device *adev;
59 struct psp_ring km_ring; 59 struct psp_ring km_ring;
60 struct psp_gfx_cmd_resp *cmd;
60 61
61 int (*init_microcode)(struct psp_context *psp); 62 int (*init_microcode)(struct psp_context *psp);
62 int (*bootloader_load_sysdrv)(struct psp_context *psp); 63 int (*bootloader_load_sysdrv)(struct psp_context *psp);
@@ -64,6 +65,9 @@ struct psp_context
64 int (*prep_cmd_buf)(struct amdgpu_firmware_info *ucode, 65 int (*prep_cmd_buf)(struct amdgpu_firmware_info *ucode,
65 struct psp_gfx_cmd_resp *cmd); 66 struct psp_gfx_cmd_resp *cmd);
66 int (*ring_init)(struct psp_context *psp, enum psp_ring_type ring_type); 67 int (*ring_init)(struct psp_context *psp, enum psp_ring_type ring_type);
68 int (*ring_create)(struct psp_context *psp, enum psp_ring_type ring_type);
69 int (*ring_destroy)(struct psp_context *psp,
70 enum psp_ring_type ring_type);
67 int (*cmd_submit)(struct psp_context *psp, struct amdgpu_firmware_info *ucode, 71 int (*cmd_submit)(struct psp_context *psp, struct amdgpu_firmware_info *ucode,
68 uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, int index); 72 uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, int index);
69 bool (*compare_sram_data)(struct psp_context *psp, 73 bool (*compare_sram_data)(struct psp_context *psp,
@@ -71,6 +75,11 @@ struct psp_context
71 enum AMDGPU_UCODE_ID ucode_type); 75 enum AMDGPU_UCODE_ID ucode_type);
72 bool (*smu_reload_quirk)(struct psp_context *psp); 76 bool (*smu_reload_quirk)(struct psp_context *psp);
73 77
78 /* fence buffer */
79 struct amdgpu_bo *fw_pri_bo;
80 uint64_t fw_pri_mc_addr;
81 void *fw_pri_buf;
82
74 /* sos firmware */ 83 /* sos firmware */
75 const struct firmware *sos_fw; 84 const struct firmware *sos_fw;
76 uint32_t sos_fw_version; 85 uint32_t sos_fw_version;
@@ -85,12 +94,15 @@ struct psp_context
85 uint64_t tmr_mc_addr; 94 uint64_t tmr_mc_addr;
86 void *tmr_buf; 95 void *tmr_buf;
87 96
88 /* asd firmware */ 97 /* asd firmware and buffer */
89 const struct firmware *asd_fw; 98 const struct firmware *asd_fw;
90 uint32_t asd_fw_version; 99 uint32_t asd_fw_version;
91 uint32_t asd_feature_version; 100 uint32_t asd_feature_version;
92 uint32_t asd_ucode_size; 101 uint32_t asd_ucode_size;
93 uint8_t *asd_start_addr; 102 uint8_t *asd_start_addr;
103 struct amdgpu_bo *asd_shared_bo;
104 uint64_t asd_shared_mc_addr;
105 void *asd_shared_buf;
94 106
95 /* fence buffer */ 107 /* fence buffer */
96 struct amdgpu_bo *fence_buf_bo; 108 struct amdgpu_bo *fence_buf_bo;
@@ -105,6 +117,8 @@ struct amdgpu_psp_funcs {
105 117
106#define psp_prep_cmd_buf(ucode, type) (psp)->prep_cmd_buf((ucode), (type)) 118#define psp_prep_cmd_buf(ucode, type) (psp)->prep_cmd_buf((ucode), (type))
107#define psp_ring_init(psp, type) (psp)->ring_init((psp), (type)) 119#define psp_ring_init(psp, type) (psp)->ring_init((psp), (type))
120#define psp_ring_create(psp, type) (psp)->ring_create((psp), (type))
121#define psp_ring_destroy(psp, type) ((psp)->ring_destroy((psp), (type)))
108#define psp_cmd_submit(psp, ucode, cmd_mc, fence_mc, index) \ 122#define psp_cmd_submit(psp, ucode, cmd_mc, fence_mc, index) \
109 (psp)->cmd_submit((psp), (ucode), (cmd_mc), (fence_mc), (index)) 123 (psp)->cmd_submit((psp), (ucode), (cmd_mc), (fence_mc), (index))
110#define psp_compare_sram_data(psp, ucode, type) \ 124#define psp_compare_sram_data(psp, ucode, type) \
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
index 63e56398ca9a..944443c5b90a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
@@ -99,6 +99,7 @@ struct amdgpu_ring_funcs {
99 uint32_t align_mask; 99 uint32_t align_mask;
100 u32 nop; 100 u32 nop;
101 bool support_64bit_ptrs; 101 bool support_64bit_ptrs;
102 unsigned vmhub;
102 103
103 /* ring read/write ptr handling */ 104 /* ring read/write ptr handling */
104 u64 (*get_rptr)(struct amdgpu_ring *ring); 105 u64 (*get_rptr)(struct amdgpu_ring *ring);
@@ -178,6 +179,7 @@ struct amdgpu_ring {
178 unsigned cond_exe_offs; 179 unsigned cond_exe_offs;
179 u64 cond_exe_gpu_addr; 180 u64 cond_exe_gpu_addr;
180 volatile u32 *cond_exe_cpu_addr; 181 volatile u32 *cond_exe_cpu_addr;
182 unsigned vm_inv_eng;
181#if defined(CONFIG_DEBUG_FS) 183#if defined(CONFIG_DEBUG_FS)
182 struct dentry *ent; 184 struct dentry *ent;
183#endif 185#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
index de9f919ae336..5ca75a456ad2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
@@ -130,7 +130,7 @@ int amdgpu_sa_bo_manager_suspend(struct amdgpu_device *adev,
130 return -EINVAL; 130 return -EINVAL;
131 } 131 }
132 132
133 r = amdgpu_bo_reserve(sa_manager->bo, false); 133 r = amdgpu_bo_reserve(sa_manager->bo, true);
134 if (!r) { 134 if (!r) {
135 amdgpu_bo_kunmap(sa_manager->bo); 135 amdgpu_bo_kunmap(sa_manager->bo);
136 amdgpu_bo_unpin(sa_manager->bo); 136 amdgpu_bo_unpin(sa_manager->bo);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
index ee9d0f346d75..8601904e670a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
@@ -190,26 +190,29 @@ TRACE_EVENT(amdgpu_sched_run_job,
190 190
191 191
192TRACE_EVENT(amdgpu_vm_grab_id, 192TRACE_EVENT(amdgpu_vm_grab_id,
193 TP_PROTO(struct amdgpu_vm *vm, int ring, struct amdgpu_job *job), 193 TP_PROTO(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
194 struct amdgpu_job *job),
194 TP_ARGS(vm, ring, job), 195 TP_ARGS(vm, ring, job),
195 TP_STRUCT__entry( 196 TP_STRUCT__entry(
196 __field(struct amdgpu_vm *, vm) 197 __field(struct amdgpu_vm *, vm)
197 __field(u32, ring) 198 __field(u32, ring)
198 __field(u32, vmid) 199 __field(u32, vm_id)
200 __field(u32, vm_hub)
199 __field(u64, pd_addr) 201 __field(u64, pd_addr)
200 __field(u32, needs_flush) 202 __field(u32, needs_flush)
201 ), 203 ),
202 204
203 TP_fast_assign( 205 TP_fast_assign(
204 __entry->vm = vm; 206 __entry->vm = vm;
205 __entry->ring = ring; 207 __entry->ring = ring->idx;
206 __entry->vmid = job->vm_id; 208 __entry->vm_id = job->vm_id;
209 __entry->vm_hub = ring->funcs->vmhub,
207 __entry->pd_addr = job->vm_pd_addr; 210 __entry->pd_addr = job->vm_pd_addr;
208 __entry->needs_flush = job->vm_needs_flush; 211 __entry->needs_flush = job->vm_needs_flush;
209 ), 212 ),
210 TP_printk("vm=%p, ring=%u, id=%u, pd_addr=%010Lx needs_flush=%u", 213 TP_printk("vm=%p, ring=%u, id=%u, hub=%u, pd_addr=%010Lx needs_flush=%u",
211 __entry->vm, __entry->ring, __entry->vmid, 214 __entry->vm, __entry->ring, __entry->vm_id,
212 __entry->pd_addr, __entry->needs_flush) 215 __entry->vm_hub, __entry->pd_addr, __entry->needs_flush)
213); 216);
214 217
215TRACE_EVENT(amdgpu_vm_bo_map, 218TRACE_EVENT(amdgpu_vm_bo_map,
@@ -331,21 +334,25 @@ TRACE_EVENT(amdgpu_vm_copy_ptes,
331); 334);
332 335
333TRACE_EVENT(amdgpu_vm_flush, 336TRACE_EVENT(amdgpu_vm_flush,
334 TP_PROTO(uint64_t pd_addr, unsigned ring, unsigned id), 337 TP_PROTO(struct amdgpu_ring *ring, unsigned vm_id,
335 TP_ARGS(pd_addr, ring, id), 338 uint64_t pd_addr),
339 TP_ARGS(ring, vm_id, pd_addr),
336 TP_STRUCT__entry( 340 TP_STRUCT__entry(
337 __field(u64, pd_addr)
338 __field(u32, ring) 341 __field(u32, ring)
339 __field(u32, id) 342 __field(u32, vm_id)
343 __field(u32, vm_hub)
344 __field(u64, pd_addr)
340 ), 345 ),
341 346
342 TP_fast_assign( 347 TP_fast_assign(
348 __entry->ring = ring->idx;
349 __entry->vm_id = vm_id;
350 __entry->vm_hub = ring->funcs->vmhub;
343 __entry->pd_addr = pd_addr; 351 __entry->pd_addr = pd_addr;
344 __entry->ring = ring;
345 __entry->id = id;
346 ), 352 ),
347 TP_printk("ring=%u, id=%u, pd_addr=%010Lx", 353 TP_printk("ring=%u, id=%u, hub=%u, pd_addr=%010Lx",
348 __entry->ring, __entry->id, __entry->pd_addr) 354 __entry->ring, __entry->vm_id,
355 __entry->vm_hub,__entry->pd_addr)
349); 356);
350 357
351TRACE_EVENT(amdgpu_bo_list_set, 358TRACE_EVENT(amdgpu_bo_list_set,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 6a3028c13580..b5fa003c1341 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -203,7 +203,9 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
203 abo = container_of(bo, struct amdgpu_bo, tbo); 203 abo = container_of(bo, struct amdgpu_bo, tbo);
204 switch (bo->mem.mem_type) { 204 switch (bo->mem.mem_type) {
205 case TTM_PL_VRAM: 205 case TTM_PL_VRAM:
206 if (adev->mman.buffer_funcs_ring->ready == false) { 206 if (adev->mman.buffer_funcs &&
207 adev->mman.buffer_funcs_ring &&
208 adev->mman.buffer_funcs_ring->ready == false) {
207 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU); 209 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
208 } else { 210 } else {
209 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT); 211 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT);
@@ -763,7 +765,7 @@ int amdgpu_ttm_recover_gart(struct amdgpu_device *adev)
763{ 765{
764 struct amdgpu_ttm_tt *gtt, *tmp; 766 struct amdgpu_ttm_tt *gtt, *tmp;
765 struct ttm_mem_reg bo_mem; 767 struct ttm_mem_reg bo_mem;
766 uint32_t flags; 768 uint64_t flags;
767 int r; 769 int r;
768 770
769 bo_mem.mem_type = TTM_PL_TT; 771 bo_mem.mem_type = TTM_PL_TT;
@@ -1038,11 +1040,17 @@ uint64_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,
1038static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo, 1040static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
1039 const struct ttm_place *place) 1041 const struct ttm_place *place)
1040{ 1042{
1041 if (bo->mem.mem_type == TTM_PL_VRAM && 1043 unsigned long num_pages = bo->mem.num_pages;
1042 bo->mem.start == AMDGPU_BO_INVALID_OFFSET) { 1044 struct drm_mm_node *node = bo->mem.mm_node;
1043 unsigned long num_pages = bo->mem.num_pages; 1045
1044 struct drm_mm_node *node = bo->mem.mm_node; 1046 if (bo->mem.start != AMDGPU_BO_INVALID_OFFSET)
1047 return ttm_bo_eviction_valuable(bo, place);
1048
1049 switch (bo->mem.mem_type) {
1050 case TTM_PL_TT:
1051 return true;
1045 1052
1053 case TTM_PL_VRAM:
1046 /* Check each drm MM node individually */ 1054 /* Check each drm MM node individually */
1047 while (num_pages) { 1055 while (num_pages) {
1048 if (place->fpfn < (node->start + node->size) && 1056 if (place->fpfn < (node->start + node->size) &&
@@ -1052,8 +1060,10 @@ static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
1052 num_pages -= node->size; 1060 num_pages -= node->size;
1053 ++node; 1061 ++node;
1054 } 1062 }
1063 break;
1055 1064
1056 return false; 1065 default:
1066 break;
1057 } 1067 }
1058 1068
1059 return ttm_bo_eviction_valuable(bo, place); 1069 return ttm_bo_eviction_valuable(bo, place);
@@ -1188,7 +1198,7 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
1188 return; 1198 return;
1189 amdgpu_ttm_debugfs_fini(adev); 1199 amdgpu_ttm_debugfs_fini(adev);
1190 if (adev->stollen_vga_memory) { 1200 if (adev->stollen_vga_memory) {
1191 r = amdgpu_bo_reserve(adev->stollen_vga_memory, false); 1201 r = amdgpu_bo_reserve(adev->stollen_vga_memory, true);
1192 if (r == 0) { 1202 if (r == 0) {
1193 amdgpu_bo_unpin(adev->stollen_vga_memory); 1203 amdgpu_bo_unpin(adev->stollen_vga_memory);
1194 amdgpu_bo_unreserve(adev->stollen_vga_memory); 1204 amdgpu_bo_unreserve(adev->stollen_vga_memory);
@@ -1401,6 +1411,8 @@ error_free:
1401 1411
1402#if defined(CONFIG_DEBUG_FS) 1412#if defined(CONFIG_DEBUG_FS)
1403 1413
1414extern void amdgpu_gtt_mgr_print(struct seq_file *m, struct ttm_mem_type_manager
1415 *man);
1404static int amdgpu_mm_dump_table(struct seq_file *m, void *data) 1416static int amdgpu_mm_dump_table(struct seq_file *m, void *data)
1405{ 1417{
1406 struct drm_info_node *node = (struct drm_info_node *)m->private; 1418 struct drm_info_node *node = (struct drm_info_node *)m->private;
@@ -1414,11 +1426,17 @@ static int amdgpu_mm_dump_table(struct seq_file *m, void *data)
1414 spin_lock(&glob->lru_lock); 1426 spin_lock(&glob->lru_lock);
1415 drm_mm_print(mm, &p); 1427 drm_mm_print(mm, &p);
1416 spin_unlock(&glob->lru_lock); 1428 spin_unlock(&glob->lru_lock);
1417 if (ttm_pl == TTM_PL_VRAM) 1429 switch (ttm_pl) {
1430 case TTM_PL_VRAM:
1418 seq_printf(m, "man size:%llu pages, ram usage:%lluMB, vis usage:%lluMB\n", 1431 seq_printf(m, "man size:%llu pages, ram usage:%lluMB, vis usage:%lluMB\n",
1419 adev->mman.bdev.man[ttm_pl].size, 1432 adev->mman.bdev.man[ttm_pl].size,
1420 (u64)atomic64_read(&adev->vram_usage) >> 20, 1433 (u64)atomic64_read(&adev->vram_usage) >> 20,
1421 (u64)atomic64_read(&adev->vram_vis_usage) >> 20); 1434 (u64)atomic64_read(&adev->vram_vis_usage) >> 20);
1435 break;
1436 case TTM_PL_TT:
1437 amdgpu_gtt_mgr_print(m, &adev->mman.bdev.man[TTM_PL_TT]);
1438 break;
1439 }
1422 return 0; 1440 return 0;
1423} 1441}
1424 1442
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
index a1891c93cdbf..dfd1c98efa7c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
@@ -382,10 +382,14 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev)
382 * if SMU loaded firmware, it needn't add SMC, UVD, and VCE 382 * if SMU loaded firmware, it needn't add SMC, UVD, and VCE
383 * ucode info here 383 * ucode info here
384 */ 384 */
385 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) 385 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
386 adev->firmware.max_ucodes = AMDGPU_UCODE_ID_MAXIMUM - 4; 386 if (amdgpu_sriov_vf(adev))
387 else 387 adev->firmware.max_ucodes = AMDGPU_UCODE_ID_MAXIMUM - 3;
388 else
389 adev->firmware.max_ucodes = AMDGPU_UCODE_ID_MAXIMUM - 4;
390 } else {
388 adev->firmware.max_ucodes = AMDGPU_UCODE_ID_MAXIMUM; 391 adev->firmware.max_ucodes = AMDGPU_UCODE_ID_MAXIMUM;
392 }
389 393
390 for (i = 0; i < adev->firmware.max_ucodes; i++) { 394 for (i = 0; i < adev->firmware.max_ucodes; i++) {
391 ucode = &adev->firmware.ucode[i]; 395 ucode = &adev->firmware.ucode[i];
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index c853400805d1..735c38d7db0d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -955,11 +955,11 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring)
955 struct amdgpu_device *adev = ring->adev; 955 struct amdgpu_device *adev = ring->adev;
956 uint32_t rptr = amdgpu_ring_get_rptr(ring); 956 uint32_t rptr = amdgpu_ring_get_rptr(ring);
957 unsigned i; 957 unsigned i;
958 int r; 958 int r, timeout = adev->usec_timeout;
959 959
960 /* TODO: remove it if VCE can work for sriov */ 960 /* workaround VCE ring test slow issue for sriov*/
961 if (amdgpu_sriov_vf(adev)) 961 if (amdgpu_sriov_vf(adev))
962 return 0; 962 timeout *= 10;
963 963
964 r = amdgpu_ring_alloc(ring, 16); 964 r = amdgpu_ring_alloc(ring, 16);
965 if (r) { 965 if (r) {
@@ -970,13 +970,13 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring)
970 amdgpu_ring_write(ring, VCE_CMD_END); 970 amdgpu_ring_write(ring, VCE_CMD_END);
971 amdgpu_ring_commit(ring); 971 amdgpu_ring_commit(ring);
972 972
973 for (i = 0; i < adev->usec_timeout; i++) { 973 for (i = 0; i < timeout; i++) {
974 if (amdgpu_ring_get_rptr(ring) != rptr) 974 if (amdgpu_ring_get_rptr(ring) != rptr)
975 break; 975 break;
976 DRM_UDELAY(1); 976 DRM_UDELAY(1);
977 } 977 }
978 978
979 if (i < adev->usec_timeout) { 979 if (i < timeout) {
980 DRM_INFO("ring test on %d succeeded in %d usecs\n", 980 DRM_INFO("ring test on %d succeeded in %d usecs\n",
981 ring->idx, i); 981 ring->idx, i);
982 } else { 982 } else {
@@ -999,10 +999,6 @@ int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout)
999 struct dma_fence *fence = NULL; 999 struct dma_fence *fence = NULL;
1000 long r; 1000 long r;
1001 1001
1002 /* TODO: remove it if VCE can work for sriov */
1003 if (amdgpu_sriov_vf(ring->adev))
1004 return 0;
1005
1006 /* skip vce ring1/2 ib test for now, since it's not reliable */ 1002 /* skip vce ring1/2 ib test for now, since it's not reliable */
1007 if (ring != &ring->adev->vce.ring[0]) 1003 if (ring != &ring->adev->vce.ring[0])
1008 return 0; 1004 return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
index ba8b8ae6234f..6bf5cea294f2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
@@ -225,3 +225,49 @@ int amdgpu_virt_reset_gpu(struct amdgpu_device *adev)
225 225
226 return 0; 226 return 0;
227} 227}
228
229/**
230 * amdgpu_virt_alloc_mm_table() - alloc memory for mm table
231 * @amdgpu: amdgpu device.
232 * MM table is used by UVD and VCE for its initialization
233 * Return: Zero if allocate success.
234 */
235int amdgpu_virt_alloc_mm_table(struct amdgpu_device *adev)
236{
237 int r;
238
239 if (!amdgpu_sriov_vf(adev) || adev->virt.mm_table.gpu_addr)
240 return 0;
241
242 r = amdgpu_bo_create_kernel(adev, PAGE_SIZE, PAGE_SIZE,
243 AMDGPU_GEM_DOMAIN_VRAM,
244 &adev->virt.mm_table.bo,
245 &adev->virt.mm_table.gpu_addr,
246 (void *)&adev->virt.mm_table.cpu_addr);
247 if (r) {
248 DRM_ERROR("failed to alloc mm table and error = %d.\n", r);
249 return r;
250 }
251
252 memset((void *)adev->virt.mm_table.cpu_addr, 0, PAGE_SIZE);
253 DRM_INFO("MM table gpu addr = 0x%llx, cpu addr = %p.\n",
254 adev->virt.mm_table.gpu_addr,
255 adev->virt.mm_table.cpu_addr);
256 return 0;
257}
258
259/**
260 * amdgpu_virt_free_mm_table() - free mm table memory
261 * @amdgpu: amdgpu device.
262 * Free MM table memory
263 */
264void amdgpu_virt_free_mm_table(struct amdgpu_device *adev)
265{
266 if (!amdgpu_sriov_vf(adev) || !adev->virt.mm_table.gpu_addr)
267 return;
268
269 amdgpu_bo_free_kernel(&adev->virt.mm_table.bo,
270 &adev->virt.mm_table.gpu_addr,
271 (void *)&adev->virt.mm_table.cpu_addr);
272 adev->virt.mm_table.gpu_addr = 0;
273}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
index 1ee0a190b33b..a8ed162cc0bc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
@@ -98,5 +98,7 @@ int amdgpu_virt_request_full_gpu(struct amdgpu_device *adev, bool init);
98int amdgpu_virt_release_full_gpu(struct amdgpu_device *adev, bool init); 98int amdgpu_virt_release_full_gpu(struct amdgpu_device *adev, bool init);
99int amdgpu_virt_reset_gpu(struct amdgpu_device *adev); 99int amdgpu_virt_reset_gpu(struct amdgpu_device *adev);
100int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary); 100int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary);
101int amdgpu_virt_alloc_mm_table(struct amdgpu_device *adev);
102void amdgpu_virt_free_mm_table(struct amdgpu_device *adev);
101 103
102#endif 104#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 7ed5302b511a..07ff3b1514f1 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -406,6 +406,8 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
406 struct amdgpu_job *job) 406 struct amdgpu_job *job)
407{ 407{
408 struct amdgpu_device *adev = ring->adev; 408 struct amdgpu_device *adev = ring->adev;
409 unsigned vmhub = ring->funcs->vmhub;
410 struct amdgpu_vm_id_manager *id_mgr = &adev->vm_manager.id_mgr[vmhub];
409 uint64_t fence_context = adev->fence_context + ring->idx; 411 uint64_t fence_context = adev->fence_context + ring->idx;
410 struct dma_fence *updates = sync->last_vm_update; 412 struct dma_fence *updates = sync->last_vm_update;
411 struct amdgpu_vm_id *id, *idle; 413 struct amdgpu_vm_id *id, *idle;
@@ -413,16 +415,15 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
413 unsigned i; 415 unsigned i;
414 int r = 0; 416 int r = 0;
415 417
416 fences = kmalloc_array(sizeof(void *), adev->vm_manager.num_ids, 418 fences = kmalloc_array(sizeof(void *), id_mgr->num_ids, GFP_KERNEL);
417 GFP_KERNEL);
418 if (!fences) 419 if (!fences)
419 return -ENOMEM; 420 return -ENOMEM;
420 421
421 mutex_lock(&adev->vm_manager.lock); 422 mutex_lock(&id_mgr->lock);
422 423
423 /* Check if we have an idle VMID */ 424 /* Check if we have an idle VMID */
424 i = 0; 425 i = 0;
425 list_for_each_entry(idle, &adev->vm_manager.ids_lru, list) { 426 list_for_each_entry(idle, &id_mgr->ids_lru, list) {
426 fences[i] = amdgpu_sync_peek_fence(&idle->active, ring); 427 fences[i] = amdgpu_sync_peek_fence(&idle->active, ring);
427 if (!fences[i]) 428 if (!fences[i])
428 break; 429 break;
@@ -430,7 +431,7 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
430 } 431 }
431 432
432 /* If we can't find a idle VMID to use, wait till one becomes available */ 433 /* If we can't find a idle VMID to use, wait till one becomes available */
433 if (&idle->list == &adev->vm_manager.ids_lru) { 434 if (&idle->list == &id_mgr->ids_lru) {
434 u64 fence_context = adev->vm_manager.fence_context + ring->idx; 435 u64 fence_context = adev->vm_manager.fence_context + ring->idx;
435 unsigned seqno = ++adev->vm_manager.seqno[ring->idx]; 436 unsigned seqno = ++adev->vm_manager.seqno[ring->idx];
436 struct dma_fence_array *array; 437 struct dma_fence_array *array;
@@ -455,25 +456,19 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
455 if (r) 456 if (r)
456 goto error; 457 goto error;
457 458
458 mutex_unlock(&adev->vm_manager.lock); 459 mutex_unlock(&id_mgr->lock);
459 return 0; 460 return 0;
460 461
461 } 462 }
462 kfree(fences); 463 kfree(fences);
463 464
464 job->vm_needs_flush = true; 465 job->vm_needs_flush = false;
465 /* Check if we can use a VMID already assigned to this VM */ 466 /* Check if we can use a VMID already assigned to this VM */
466 i = ring->idx; 467 list_for_each_entry_reverse(id, &id_mgr->ids_lru, list) {
467 do {
468 struct dma_fence *flushed; 468 struct dma_fence *flushed;
469 469 bool needs_flush = false;
470 id = vm->ids[i++];
471 if (i == AMDGPU_MAX_RINGS)
472 i = 0;
473 470
474 /* Check all the prerequisites to using this VMID */ 471 /* Check all the prerequisites to using this VMID */
475 if (!id)
476 continue;
477 if (amdgpu_vm_had_gpu_reset(adev, id)) 472 if (amdgpu_vm_had_gpu_reset(adev, id))
478 continue; 473 continue;
479 474
@@ -483,16 +478,17 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
483 if (job->vm_pd_addr != id->pd_gpu_addr) 478 if (job->vm_pd_addr != id->pd_gpu_addr)
484 continue; 479 continue;
485 480
486 if (!id->last_flush) 481 if (!id->last_flush ||
487 continue; 482 (id->last_flush->context != fence_context &&
488 483 !dma_fence_is_signaled(id->last_flush)))
489 if (id->last_flush->context != fence_context && 484 needs_flush = true;
490 !dma_fence_is_signaled(id->last_flush))
491 continue;
492 485
493 flushed = id->flushed_updates; 486 flushed = id->flushed_updates;
494 if (updates && 487 if (updates && (!flushed || dma_fence_is_later(updates, flushed)))
495 (!flushed || dma_fence_is_later(updates, flushed))) 488 needs_flush = true;
489
490 /* Concurrent flushes are only possible starting with Vega10 */
491 if (adev->asic_type < CHIP_VEGA10 && needs_flush)
496 continue; 492 continue;
497 493
498 /* Good we can use this VMID. Remember this submission as 494 /* Good we can use this VMID. Remember this submission as
@@ -502,17 +498,17 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
502 if (r) 498 if (r)
503 goto error; 499 goto error;
504 500
505 list_move_tail(&id->list, &adev->vm_manager.ids_lru); 501 if (updates && (!flushed || dma_fence_is_later(updates, flushed))) {
506 vm->ids[ring->idx] = id; 502 dma_fence_put(id->flushed_updates);
507 503 id->flushed_updates = dma_fence_get(updates);
508 job->vm_id = id - adev->vm_manager.ids; 504 }
509 job->vm_needs_flush = false;
510 trace_amdgpu_vm_grab_id(vm, ring->idx, job);
511 505
512 mutex_unlock(&adev->vm_manager.lock); 506 if (needs_flush)
513 return 0; 507 goto needs_flush;
508 else
509 goto no_flush_needed;
514 510
515 } while (i != ring->idx); 511 };
516 512
517 /* Still no ID to use? Then use the idle one found earlier */ 513 /* Still no ID to use? Then use the idle one found earlier */
518 id = idle; 514 id = idle;
@@ -522,23 +518,25 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
522 if (r) 518 if (r)
523 goto error; 519 goto error;
524 520
525 dma_fence_put(id->last_flush); 521 id->pd_gpu_addr = job->vm_pd_addr;
526 id->last_flush = NULL;
527
528 dma_fence_put(id->flushed_updates); 522 dma_fence_put(id->flushed_updates);
529 id->flushed_updates = dma_fence_get(updates); 523 id->flushed_updates = dma_fence_get(updates);
530
531 id->pd_gpu_addr = job->vm_pd_addr;
532 id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter); 524 id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter);
533 list_move_tail(&id->list, &adev->vm_manager.ids_lru);
534 atomic64_set(&id->owner, vm->client_id); 525 atomic64_set(&id->owner, vm->client_id);
535 vm->ids[ring->idx] = id;
536 526
537 job->vm_id = id - adev->vm_manager.ids; 527needs_flush:
538 trace_amdgpu_vm_grab_id(vm, ring->idx, job); 528 job->vm_needs_flush = true;
529 dma_fence_put(id->last_flush);
530 id->last_flush = NULL;
531
532no_flush_needed:
533 list_move_tail(&id->list, &id_mgr->ids_lru);
534
535 job->vm_id = id - id_mgr->ids;
536 trace_amdgpu_vm_grab_id(vm, ring, job);
539 537
540error: 538error:
541 mutex_unlock(&adev->vm_manager.lock); 539 mutex_unlock(&id_mgr->lock);
542 return r; 540 return r;
543} 541}
544 542
@@ -590,7 +588,9 @@ static u64 amdgpu_vm_adjust_mc_addr(struct amdgpu_device *adev, u64 mc_addr)
590int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job) 588int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job)
591{ 589{
592 struct amdgpu_device *adev = ring->adev; 590 struct amdgpu_device *adev = ring->adev;
593 struct amdgpu_vm_id *id = &adev->vm_manager.ids[job->vm_id]; 591 unsigned vmhub = ring->funcs->vmhub;
592 struct amdgpu_vm_id_manager *id_mgr = &adev->vm_manager.id_mgr[vmhub];
593 struct amdgpu_vm_id *id = &id_mgr->ids[job->vm_id];
594 bool gds_switch_needed = ring->funcs->emit_gds_switch && ( 594 bool gds_switch_needed = ring->funcs->emit_gds_switch && (
595 id->gds_base != job->gds_base || 595 id->gds_base != job->gds_base ||
596 id->gds_size != job->gds_size || 596 id->gds_size != job->gds_size ||
@@ -614,24 +614,24 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job)
614 if (ring->funcs->init_cond_exec) 614 if (ring->funcs->init_cond_exec)
615 patch_offset = amdgpu_ring_init_cond_exec(ring); 615 patch_offset = amdgpu_ring_init_cond_exec(ring);
616 616
617 if (ring->funcs->emit_pipeline_sync) 617 if (ring->funcs->emit_pipeline_sync && !job->need_pipeline_sync)
618 amdgpu_ring_emit_pipeline_sync(ring); 618 amdgpu_ring_emit_pipeline_sync(ring);
619 619
620 if (ring->funcs->emit_vm_flush && vm_flush_needed) { 620 if (ring->funcs->emit_vm_flush && vm_flush_needed) {
621 u64 pd_addr = amdgpu_vm_adjust_mc_addr(adev, job->vm_pd_addr); 621 u64 pd_addr = amdgpu_vm_adjust_mc_addr(adev, job->vm_pd_addr);
622 struct dma_fence *fence; 622 struct dma_fence *fence;
623 623
624 trace_amdgpu_vm_flush(pd_addr, ring->idx, job->vm_id); 624 trace_amdgpu_vm_flush(ring, job->vm_id, pd_addr);
625 amdgpu_ring_emit_vm_flush(ring, job->vm_id, pd_addr); 625 amdgpu_ring_emit_vm_flush(ring, job->vm_id, pd_addr);
626 626
627 r = amdgpu_fence_emit(ring, &fence); 627 r = amdgpu_fence_emit(ring, &fence);
628 if (r) 628 if (r)
629 return r; 629 return r;
630 630
631 mutex_lock(&adev->vm_manager.lock); 631 mutex_lock(&id_mgr->lock);
632 dma_fence_put(id->last_flush); 632 dma_fence_put(id->last_flush);
633 id->last_flush = fence; 633 id->last_flush = fence;
634 mutex_unlock(&adev->vm_manager.lock); 634 mutex_unlock(&id_mgr->lock);
635 } 635 }
636 636
637 if (gds_switch_needed) { 637 if (gds_switch_needed) {
@@ -666,9 +666,11 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job)
666 * 666 *
667 * Reset saved GDW, GWS and OA to force switch on next flush. 667 * Reset saved GDW, GWS and OA to force switch on next flush.
668 */ 668 */
669void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id) 669void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vmhub,
670 unsigned vmid)
670{ 671{
671 struct amdgpu_vm_id *id = &adev->vm_manager.ids[vm_id]; 672 struct amdgpu_vm_id_manager *id_mgr = &adev->vm_manager.id_mgr[vmhub];
673 struct amdgpu_vm_id *id = &id_mgr->ids[vmid];
672 674
673 id->gds_base = 0; 675 id->gds_base = 0;
674 id->gds_size = 0; 676 id->gds_size = 0;
@@ -1336,6 +1338,12 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
1336 flags &= ~AMDGPU_PTE_MTYPE_MASK; 1338 flags &= ~AMDGPU_PTE_MTYPE_MASK;
1337 flags |= (mapping->flags & AMDGPU_PTE_MTYPE_MASK); 1339 flags |= (mapping->flags & AMDGPU_PTE_MTYPE_MASK);
1338 1340
1341 if ((mapping->flags & AMDGPU_PTE_PRT) &&
1342 (adev->asic_type >= CHIP_VEGA10)) {
1343 flags |= AMDGPU_PTE_PRT;
1344 flags &= ~AMDGPU_PTE_VALID;
1345 }
1346
1339 trace_amdgpu_vm_bo_update(mapping); 1347 trace_amdgpu_vm_bo_update(mapping);
1340 1348
1341 pfn = mapping->offset >> PAGE_SHIFT; 1349 pfn = mapping->offset >> PAGE_SHIFT;
@@ -1629,8 +1637,9 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
1629 struct amdgpu_bo_va_mapping, list); 1637 struct amdgpu_bo_va_mapping, list);
1630 list_del(&mapping->list); 1638 list_del(&mapping->list);
1631 1639
1632 r = amdgpu_vm_bo_split_mapping(adev, NULL, 0, NULL, vm, mapping, 1640 r = amdgpu_vm_bo_update_mapping(adev, NULL, 0, NULL, vm,
1633 0, 0, &f); 1641 mapping->start, mapping->last,
1642 0, 0, &f);
1634 amdgpu_vm_free_mapping(adev, vm, mapping, f); 1643 amdgpu_vm_free_mapping(adev, vm, mapping, f);
1635 if (r) { 1644 if (r) {
1636 dma_fence_put(f); 1645 dma_fence_put(f);
@@ -2117,10 +2126,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
2117 unsigned ring_instance; 2126 unsigned ring_instance;
2118 struct amdgpu_ring *ring; 2127 struct amdgpu_ring *ring;
2119 struct amd_sched_rq *rq; 2128 struct amd_sched_rq *rq;
2120 int i, r; 2129 int r;
2121 2130
2122 for (i = 0; i < AMDGPU_MAX_RINGS; ++i)
2123 vm->ids[i] = NULL;
2124 vm->va = RB_ROOT; 2131 vm->va = RB_ROOT;
2125 vm->client_id = atomic64_inc_return(&adev->vm_manager.client_counter); 2132 vm->client_id = atomic64_inc_return(&adev->vm_manager.client_counter);
2126 spin_lock_init(&vm->status_lock); 2133 spin_lock_init(&vm->status_lock);
@@ -2241,16 +2248,21 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
2241 */ 2248 */
2242void amdgpu_vm_manager_init(struct amdgpu_device *adev) 2249void amdgpu_vm_manager_init(struct amdgpu_device *adev)
2243{ 2250{
2244 unsigned i; 2251 unsigned i, j;
2252
2253 for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) {
2254 struct amdgpu_vm_id_manager *id_mgr =
2255 &adev->vm_manager.id_mgr[i];
2245 2256
2246 INIT_LIST_HEAD(&adev->vm_manager.ids_lru); 2257 mutex_init(&id_mgr->lock);
2258 INIT_LIST_HEAD(&id_mgr->ids_lru);
2247 2259
2248 /* skip over VMID 0, since it is the system VM */ 2260 /* skip over VMID 0, since it is the system VM */
2249 for (i = 1; i < adev->vm_manager.num_ids; ++i) { 2261 for (j = 1; j < id_mgr->num_ids; ++j) {
2250 amdgpu_vm_reset_id(adev, i); 2262 amdgpu_vm_reset_id(adev, i, j);
2251 amdgpu_sync_create(&adev->vm_manager.ids[i].active); 2263 amdgpu_sync_create(&id_mgr->ids[i].active);
2252 list_add_tail(&adev->vm_manager.ids[i].list, 2264 list_add_tail(&id_mgr->ids[j].list, &id_mgr->ids_lru);
2253 &adev->vm_manager.ids_lru); 2265 }
2254 } 2266 }
2255 2267
2256 adev->vm_manager.fence_context = 2268 adev->vm_manager.fence_context =
@@ -2258,6 +2270,7 @@ void amdgpu_vm_manager_init(struct amdgpu_device *adev)
2258 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) 2270 for (i = 0; i < AMDGPU_MAX_RINGS; ++i)
2259 adev->vm_manager.seqno[i] = 0; 2271 adev->vm_manager.seqno[i] = 0;
2260 2272
2273
2261 atomic_set(&adev->vm_manager.vm_pte_next_ring, 0); 2274 atomic_set(&adev->vm_manager.vm_pte_next_ring, 0);
2262 atomic64_set(&adev->vm_manager.client_counter, 0); 2275 atomic64_set(&adev->vm_manager.client_counter, 0);
2263 spin_lock_init(&adev->vm_manager.prt_lock); 2276 spin_lock_init(&adev->vm_manager.prt_lock);
@@ -2273,13 +2286,19 @@ void amdgpu_vm_manager_init(struct amdgpu_device *adev)
2273 */ 2286 */
2274void amdgpu_vm_manager_fini(struct amdgpu_device *adev) 2287void amdgpu_vm_manager_fini(struct amdgpu_device *adev)
2275{ 2288{
2276 unsigned i; 2289 unsigned i, j;
2277 2290
2278 for (i = 0; i < AMDGPU_NUM_VM; ++i) { 2291 for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) {
2279 struct amdgpu_vm_id *id = &adev->vm_manager.ids[i]; 2292 struct amdgpu_vm_id_manager *id_mgr =
2293 &adev->vm_manager.id_mgr[i];
2280 2294
2281 amdgpu_sync_free(&adev->vm_manager.ids[i].active); 2295 mutex_destroy(&id_mgr->lock);
2282 dma_fence_put(id->flushed_updates); 2296 for (j = 0; j < AMDGPU_NUM_VM; ++j) {
2283 dma_fence_put(id->last_flush); 2297 struct amdgpu_vm_id *id = &id_mgr->ids[j];
2298
2299 amdgpu_sync_free(&id->active);
2300 dma_fence_put(id->flushed_updates);
2301 dma_fence_put(id->last_flush);
2302 }
2284 } 2303 }
2285} 2304}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index d9e57290dc71..d97e28b4bdc4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -65,7 +65,8 @@ struct amdgpu_bo_list_entry;
65 65
66#define AMDGPU_PTE_FRAG(x) ((x & 0x1fULL) << 7) 66#define AMDGPU_PTE_FRAG(x) ((x & 0x1fULL) << 7)
67 67
68#define AMDGPU_PTE_PRT (1ULL << 63) 68/* TILED for VEGA10, reserved for older ASICs */
69#define AMDGPU_PTE_PRT (1ULL << 51)
69 70
70/* VEGA10 only */ 71/* VEGA10 only */
71#define AMDGPU_PTE_MTYPE(a) ((uint64_t)a << 57) 72#define AMDGPU_PTE_MTYPE(a) ((uint64_t)a << 57)
@@ -114,9 +115,6 @@ struct amdgpu_vm {
114 struct dma_fence *last_dir_update; 115 struct dma_fence *last_dir_update;
115 uint64_t last_eviction_counter; 116 uint64_t last_eviction_counter;
116 117
117 /* for id and flush management per ring */
118 struct amdgpu_vm_id *ids[AMDGPU_MAX_RINGS];
119
120 /* protecting freed */ 118 /* protecting freed */
121 spinlock_t freed_lock; 119 spinlock_t freed_lock;
122 120
@@ -149,12 +147,16 @@ struct amdgpu_vm_id {
149 uint32_t oa_size; 147 uint32_t oa_size;
150}; 148};
151 149
150struct amdgpu_vm_id_manager {
151 struct mutex lock;
152 unsigned num_ids;
153 struct list_head ids_lru;
154 struct amdgpu_vm_id ids[AMDGPU_NUM_VM];
155};
156
152struct amdgpu_vm_manager { 157struct amdgpu_vm_manager {
153 /* Handling of VMIDs */ 158 /* Handling of VMIDs */
154 struct mutex lock; 159 struct amdgpu_vm_id_manager id_mgr[AMDGPU_MAX_VMHUBS];
155 unsigned num_ids;
156 struct list_head ids_lru;
157 struct amdgpu_vm_id ids[AMDGPU_NUM_VM];
158 160
159 /* Handling of VM fences */ 161 /* Handling of VM fences */
160 u64 fence_context; 162 u64 fence_context;
@@ -200,7 +202,8 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
200 struct amdgpu_sync *sync, struct dma_fence *fence, 202 struct amdgpu_sync *sync, struct dma_fence *fence,
201 struct amdgpu_job *job); 203 struct amdgpu_job *job);
202int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job); 204int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job);
203void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id); 205void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vmhub,
206 unsigned vmid);
204int amdgpu_vm_update_directories(struct amdgpu_device *adev, 207int amdgpu_vm_update_directories(struct amdgpu_device *adev,
205 struct amdgpu_vm *vm); 208 struct amdgpu_vm *vm);
206int amdgpu_vm_clear_freed(struct amdgpu_device *adev, 209int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
index 625b7fb3253e..00e56a28b593 100644
--- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
@@ -1267,30 +1267,33 @@ static int ci_dpm_set_fan_speed_percent(struct amdgpu_device *adev,
1267 1267
1268static void ci_dpm_set_fan_control_mode(struct amdgpu_device *adev, u32 mode) 1268static void ci_dpm_set_fan_control_mode(struct amdgpu_device *adev, u32 mode)
1269{ 1269{
1270 if (mode) { 1270 switch (mode) {
1271 /* stop auto-manage */ 1271 case AMD_FAN_CTRL_NONE:
1272 if (adev->pm.dpm.fan.ucode_fan_control) 1272 if (adev->pm.dpm.fan.ucode_fan_control)
1273 ci_fan_ctrl_stop_smc_fan_control(adev); 1273 ci_fan_ctrl_stop_smc_fan_control(adev);
1274 ci_fan_ctrl_set_static_mode(adev, mode); 1274 ci_dpm_set_fan_speed_percent(adev, 100);
1275 } else { 1275 break;
1276 /* restart auto-manage */ 1276 case AMD_FAN_CTRL_MANUAL:
1277 if (adev->pm.dpm.fan.ucode_fan_control)
1278 ci_fan_ctrl_stop_smc_fan_control(adev);
1279 break;
1280 case AMD_FAN_CTRL_AUTO:
1277 if (adev->pm.dpm.fan.ucode_fan_control) 1281 if (adev->pm.dpm.fan.ucode_fan_control)
1278 ci_thermal_start_smc_fan_control(adev); 1282 ci_thermal_start_smc_fan_control(adev);
1279 else 1283 break;
1280 ci_fan_ctrl_set_default_mode(adev); 1284 default:
1285 break;
1281 } 1286 }
1282} 1287}
1283 1288
1284static u32 ci_dpm_get_fan_control_mode(struct amdgpu_device *adev) 1289static u32 ci_dpm_get_fan_control_mode(struct amdgpu_device *adev)
1285{ 1290{
1286 struct ci_power_info *pi = ci_get_pi(adev); 1291 struct ci_power_info *pi = ci_get_pi(adev);
1287 u32 tmp;
1288 1292
1289 if (pi->fan_is_controlled_by_smc) 1293 if (pi->fan_is_controlled_by_smc)
1290 return 0; 1294 return AMD_FAN_CTRL_AUTO;
1291 1295 else
1292 tmp = RREG32_SMC(ixCG_FDO_CTRL2) & CG_FDO_CTRL2__FDO_PWM_MODE_MASK; 1296 return AMD_FAN_CTRL_MANUAL;
1293 return (tmp >> CG_FDO_CTRL2__FDO_PWM_MODE__SHIFT);
1294} 1297}
1295 1298
1296#if 0 1299#if 0
@@ -3036,6 +3039,7 @@ static int ci_populate_single_memory_level(struct amdgpu_device *adev,
3036 memory_clock, 3039 memory_clock,
3037 &memory_level->MinVddcPhases); 3040 &memory_level->MinVddcPhases);
3038 3041
3042 memory_level->EnabledForActivity = 1;
3039 memory_level->EnabledForThrottle = 1; 3043 memory_level->EnabledForThrottle = 1;
3040 memory_level->UpH = 0; 3044 memory_level->UpH = 0;
3041 memory_level->DownH = 100; 3045 memory_level->DownH = 100;
@@ -3468,8 +3472,6 @@ static int ci_populate_all_memory_levels(struct amdgpu_device *adev)
3468 return ret; 3472 return ret;
3469 } 3473 }
3470 3474
3471 pi->smc_state_table.MemoryLevel[0].EnabledForActivity = 1;
3472
3473 if ((dpm_table->mclk_table.count >= 2) && 3475 if ((dpm_table->mclk_table.count >= 2) &&
3474 ((adev->pdev->device == 0x67B0) || (adev->pdev->device == 0x67B1))) { 3476 ((adev->pdev->device == 0x67B0) || (adev->pdev->device == 0x67B1))) {
3475 pi->smc_state_table.MemoryLevel[1].MinVddc = 3477 pi->smc_state_table.MemoryLevel[1].MinVddc =
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
index 85033be526f3..3c62c45f43a1 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
@@ -2230,7 +2230,7 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
2230 if (!atomic && fb && fb != crtc->primary->fb) { 2230 if (!atomic && fb && fb != crtc->primary->fb) {
2231 amdgpu_fb = to_amdgpu_framebuffer(fb); 2231 amdgpu_fb = to_amdgpu_framebuffer(fb);
2232 abo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2232 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2233 r = amdgpu_bo_reserve(abo, false); 2233 r = amdgpu_bo_reserve(abo, true);
2234 if (unlikely(r != 0)) 2234 if (unlikely(r != 0))
2235 return r; 2235 return r;
2236 amdgpu_bo_unpin(abo); 2236 amdgpu_bo_unpin(abo);
@@ -2589,7 +2589,7 @@ static int dce_v10_0_crtc_cursor_set2(struct drm_crtc *crtc,
2589unpin: 2589unpin:
2590 if (amdgpu_crtc->cursor_bo) { 2590 if (amdgpu_crtc->cursor_bo) {
2591 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo); 2591 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2592 ret = amdgpu_bo_reserve(aobj, false); 2592 ret = amdgpu_bo_reserve(aobj, true);
2593 if (likely(ret == 0)) { 2593 if (likely(ret == 0)) {
2594 amdgpu_bo_unpin(aobj); 2594 amdgpu_bo_unpin(aobj);
2595 amdgpu_bo_unreserve(aobj); 2595 amdgpu_bo_unreserve(aobj);
@@ -2720,7 +2720,7 @@ static void dce_v10_0_crtc_disable(struct drm_crtc *crtc)
2720 2720
2721 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb); 2721 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb);
2722 abo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2722 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2723 r = amdgpu_bo_reserve(abo, false); 2723 r = amdgpu_bo_reserve(abo, true);
2724 if (unlikely(r)) 2724 if (unlikely(r))
2725 DRM_ERROR("failed to reserve abo before unpin\n"); 2725 DRM_ERROR("failed to reserve abo before unpin\n");
2726 else { 2726 else {
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
index ab976162cece..c8ed0facddcd 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
@@ -2214,7 +2214,7 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
2214 if (!atomic && fb && fb != crtc->primary->fb) { 2214 if (!atomic && fb && fb != crtc->primary->fb) {
2215 amdgpu_fb = to_amdgpu_framebuffer(fb); 2215 amdgpu_fb = to_amdgpu_framebuffer(fb);
2216 abo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2216 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2217 r = amdgpu_bo_reserve(abo, false); 2217 r = amdgpu_bo_reserve(abo, true);
2218 if (unlikely(r != 0)) 2218 if (unlikely(r != 0))
2219 return r; 2219 return r;
2220 amdgpu_bo_unpin(abo); 2220 amdgpu_bo_unpin(abo);
@@ -2609,7 +2609,7 @@ static int dce_v11_0_crtc_cursor_set2(struct drm_crtc *crtc,
2609unpin: 2609unpin:
2610 if (amdgpu_crtc->cursor_bo) { 2610 if (amdgpu_crtc->cursor_bo) {
2611 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo); 2611 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2612 ret = amdgpu_bo_reserve(aobj, false); 2612 ret = amdgpu_bo_reserve(aobj, true);
2613 if (likely(ret == 0)) { 2613 if (likely(ret == 0)) {
2614 amdgpu_bo_unpin(aobj); 2614 amdgpu_bo_unpin(aobj);
2615 amdgpu_bo_unreserve(aobj); 2615 amdgpu_bo_unreserve(aobj);
@@ -2740,7 +2740,7 @@ static void dce_v11_0_crtc_disable(struct drm_crtc *crtc)
2740 2740
2741 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb); 2741 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb);
2742 abo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2742 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2743 r = amdgpu_bo_reserve(abo, false); 2743 r = amdgpu_bo_reserve(abo, true);
2744 if (unlikely(r)) 2744 if (unlikely(r))
2745 DRM_ERROR("failed to reserve abo before unpin\n"); 2745 DRM_ERROR("failed to reserve abo before unpin\n");
2746 else { 2746 else {
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
index 0a3f7b74ee13..3f3a25493327 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
@@ -979,7 +979,7 @@ static void dce_v6_0_program_watermarks(struct amdgpu_device *adev,
979 u32 priority_a_mark = 0, priority_b_mark = 0; 979 u32 priority_a_mark = 0, priority_b_mark = 0;
980 u32 priority_a_cnt = PRIORITY_OFF; 980 u32 priority_a_cnt = PRIORITY_OFF;
981 u32 priority_b_cnt = PRIORITY_OFF; 981 u32 priority_b_cnt = PRIORITY_OFF;
982 u32 tmp, arb_control3; 982 u32 tmp, arb_control3, lb_vblank_lead_lines = 0;
983 fixed20_12 a, b, c; 983 fixed20_12 a, b, c;
984 984
985 if (amdgpu_crtc->base.enabled && num_heads && mode) { 985 if (amdgpu_crtc->base.enabled && num_heads && mode) {
@@ -1091,6 +1091,8 @@ static void dce_v6_0_program_watermarks(struct amdgpu_device *adev,
1091 c.full = dfixed_div(c, a); 1091 c.full = dfixed_div(c, a);
1092 priority_b_mark = dfixed_trunc(c); 1092 priority_b_mark = dfixed_trunc(c);
1093 priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK; 1093 priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
1094
1095 lb_vblank_lead_lines = DIV_ROUND_UP(lb_size, mode->crtc_hdisplay);
1094 } 1096 }
1095 1097
1096 /* select wm A */ 1098 /* select wm A */
@@ -1120,6 +1122,9 @@ static void dce_v6_0_program_watermarks(struct amdgpu_device *adev,
1120 /* save values for DPM */ 1122 /* save values for DPM */
1121 amdgpu_crtc->line_time = line_time; 1123 amdgpu_crtc->line_time = line_time;
1122 amdgpu_crtc->wm_high = latency_watermark_a; 1124 amdgpu_crtc->wm_high = latency_watermark_a;
1125
1126 /* Save number of lines the linebuffer leads before the scanout */
1127 amdgpu_crtc->lb_vblank_lead_lines = lb_vblank_lead_lines;
1123} 1128}
1124 1129
1125/* watermark setup */ 1130/* watermark setup */
@@ -1640,7 +1645,7 @@ static int dce_v6_0_crtc_do_set_base(struct drm_crtc *crtc,
1640 if (!atomic && fb && fb != crtc->primary->fb) { 1645 if (!atomic && fb && fb != crtc->primary->fb) {
1641 amdgpu_fb = to_amdgpu_framebuffer(fb); 1646 amdgpu_fb = to_amdgpu_framebuffer(fb);
1642 abo = gem_to_amdgpu_bo(amdgpu_fb->obj); 1647 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
1643 r = amdgpu_bo_reserve(abo, false); 1648 r = amdgpu_bo_reserve(abo, true);
1644 if (unlikely(r != 0)) 1649 if (unlikely(r != 0))
1645 return r; 1650 return r;
1646 amdgpu_bo_unpin(abo); 1651 amdgpu_bo_unpin(abo);
@@ -1957,7 +1962,7 @@ static int dce_v6_0_crtc_cursor_set2(struct drm_crtc *crtc,
1957unpin: 1962unpin:
1958 if (amdgpu_crtc->cursor_bo) { 1963 if (amdgpu_crtc->cursor_bo) {
1959 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo); 1964 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
1960 ret = amdgpu_bo_reserve(aobj, false); 1965 ret = amdgpu_bo_reserve(aobj, true);
1961 if (likely(ret == 0)) { 1966 if (likely(ret == 0)) {
1962 amdgpu_bo_unpin(aobj); 1967 amdgpu_bo_unpin(aobj);
1963 amdgpu_bo_unreserve(aobj); 1968 amdgpu_bo_unreserve(aobj);
@@ -2083,7 +2088,7 @@ static void dce_v6_0_crtc_disable(struct drm_crtc *crtc)
2083 2088
2084 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb); 2089 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb);
2085 abo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2090 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2086 r = amdgpu_bo_reserve(abo, false); 2091 r = amdgpu_bo_reserve(abo, true);
2087 if (unlikely(r)) 2092 if (unlikely(r))
2088 DRM_ERROR("failed to reserve abo before unpin\n"); 2093 DRM_ERROR("failed to reserve abo before unpin\n");
2089 else { 2094 else {
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
index 3543fcbfcc9a..3e90c19b9c7f 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
@@ -2089,7 +2089,7 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
2089 if (!atomic && fb && fb != crtc->primary->fb) { 2089 if (!atomic && fb && fb != crtc->primary->fb) {
2090 amdgpu_fb = to_amdgpu_framebuffer(fb); 2090 amdgpu_fb = to_amdgpu_framebuffer(fb);
2091 abo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2091 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2092 r = amdgpu_bo_reserve(abo, false); 2092 r = amdgpu_bo_reserve(abo, true);
2093 if (unlikely(r != 0)) 2093 if (unlikely(r != 0))
2094 return r; 2094 return r;
2095 amdgpu_bo_unpin(abo); 2095 amdgpu_bo_unpin(abo);
@@ -2440,7 +2440,7 @@ static int dce_v8_0_crtc_cursor_set2(struct drm_crtc *crtc,
2440unpin: 2440unpin:
2441 if (amdgpu_crtc->cursor_bo) { 2441 if (amdgpu_crtc->cursor_bo) {
2442 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo); 2442 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2443 ret = amdgpu_bo_reserve(aobj, false); 2443 ret = amdgpu_bo_reserve(aobj, true);
2444 if (likely(ret == 0)) { 2444 if (likely(ret == 0)) {
2445 amdgpu_bo_unpin(aobj); 2445 amdgpu_bo_unpin(aobj);
2446 amdgpu_bo_unreserve(aobj); 2446 amdgpu_bo_unreserve(aobj);
@@ -2571,7 +2571,7 @@ static void dce_v8_0_crtc_disable(struct drm_crtc *crtc)
2571 2571
2572 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb); 2572 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb);
2573 abo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2573 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2574 r = amdgpu_bo_reserve(abo, false); 2574 r = amdgpu_bo_reserve(abo, true);
2575 if (unlikely(r)) 2575 if (unlikely(r))
2576 DRM_ERROR("failed to reserve abo before unpin\n"); 2576 DRM_ERROR("failed to reserve abo before unpin\n");
2577 else { 2577 else {
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
index 4c536644de24..90bb08309a53 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
@@ -248,7 +248,7 @@ static void dce_virtual_crtc_disable(struct drm_crtc *crtc)
248 248
249 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb); 249 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb);
250 abo = gem_to_amdgpu_bo(amdgpu_fb->obj); 250 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
251 r = amdgpu_bo_reserve(abo, false); 251 r = amdgpu_bo_reserve(abo, true);
252 if (unlikely(r)) 252 if (unlikely(r))
253 DRM_ERROR("failed to reserve abo before unpin\n"); 253 DRM_ERROR("failed to reserve abo before unpin\n");
254 else { 254 else {
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
index 4c4874fdf59f..a125f9d44577 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
@@ -1579,7 +1579,7 @@ static void gfx_v6_0_setup_spi(struct amdgpu_device *adev)
1579 1579
1580static void gfx_v6_0_config_init(struct amdgpu_device *adev) 1580static void gfx_v6_0_config_init(struct amdgpu_device *adev)
1581{ 1581{
1582 adev->gfx.config.double_offchip_lds_buf = 1; 1582 adev->gfx.config.double_offchip_lds_buf = 0;
1583} 1583}
1584 1584
1585static void gfx_v6_0_gpu_init(struct amdgpu_device *adev) 1585static void gfx_v6_0_gpu_init(struct amdgpu_device *adev)
@@ -2437,7 +2437,7 @@ static void gfx_v6_0_rlc_fini(struct amdgpu_device *adev)
2437 int r; 2437 int r;
2438 2438
2439 if (adev->gfx.rlc.save_restore_obj) { 2439 if (adev->gfx.rlc.save_restore_obj) {
2440 r = amdgpu_bo_reserve(adev->gfx.rlc.save_restore_obj, false); 2440 r = amdgpu_bo_reserve(adev->gfx.rlc.save_restore_obj, true);
2441 if (unlikely(r != 0)) 2441 if (unlikely(r != 0))
2442 dev_warn(adev->dev, "(%d) reserve RLC sr bo failed\n", r); 2442 dev_warn(adev->dev, "(%d) reserve RLC sr bo failed\n", r);
2443 amdgpu_bo_unpin(adev->gfx.rlc.save_restore_obj); 2443 amdgpu_bo_unpin(adev->gfx.rlc.save_restore_obj);
@@ -2448,7 +2448,7 @@ static void gfx_v6_0_rlc_fini(struct amdgpu_device *adev)
2448 } 2448 }
2449 2449
2450 if (adev->gfx.rlc.clear_state_obj) { 2450 if (adev->gfx.rlc.clear_state_obj) {
2451 r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false); 2451 r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, true);
2452 if (unlikely(r != 0)) 2452 if (unlikely(r != 0))
2453 dev_warn(adev->dev, "(%d) reserve RLC c bo failed\n", r); 2453 dev_warn(adev->dev, "(%d) reserve RLC c bo failed\n", r);
2454 amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj); 2454 amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
@@ -2459,7 +2459,7 @@ static void gfx_v6_0_rlc_fini(struct amdgpu_device *adev)
2459 } 2459 }
2460 2460
2461 if (adev->gfx.rlc.cp_table_obj) { 2461 if (adev->gfx.rlc.cp_table_obj) {
2462 r = amdgpu_bo_reserve(adev->gfx.rlc.cp_table_obj, false); 2462 r = amdgpu_bo_reserve(adev->gfx.rlc.cp_table_obj, true);
2463 if (unlikely(r != 0)) 2463 if (unlikely(r != 0))
2464 dev_warn(adev->dev, "(%d) reserve RLC cp table bo failed\n", r); 2464 dev_warn(adev->dev, "(%d) reserve RLC cp table bo failed\n", r);
2465 amdgpu_bo_unpin(adev->gfx.rlc.cp_table_obj); 2465 amdgpu_bo_unpin(adev->gfx.rlc.cp_table_obj);
@@ -3292,7 +3292,7 @@ static int gfx_v6_0_sw_init(void *handle)
3292 ring->me = 1; 3292 ring->me = 1;
3293 ring->pipe = i; 3293 ring->pipe = i;
3294 ring->queue = i; 3294 ring->queue = i;
3295 sprintf(ring->name, "comp %d.%d.%d", ring->me, ring->pipe, ring->queue); 3295 sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);
3296 irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe; 3296 irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe;
3297 r = amdgpu_ring_init(adev, ring, 1024, 3297 r = amdgpu_ring_init(adev, ring, 1024,
3298 &adev->gfx.eop_irq, irq_type); 3298 &adev->gfx.eop_irq, irq_type);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index fa92b04f6b78..f7414cabd4ff 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -1935,7 +1935,7 @@ static void gfx_v7_0_gpu_init(struct amdgpu_device *adev)
1935 INDEX_STRIDE, 3); 1935 INDEX_STRIDE, 3);
1936 1936
1937 mutex_lock(&adev->srbm_mutex); 1937 mutex_lock(&adev->srbm_mutex);
1938 for (i = 0; i < adev->vm_manager.num_ids; i++) { 1938 for (i = 0; i < adev->vm_manager.id_mgr[0].num_ids; i++) {
1939 if (i == 0) 1939 if (i == 0)
1940 sh_mem_base = 0; 1940 sh_mem_base = 0;
1941 else 1941 else
@@ -2792,7 +2792,7 @@ static void gfx_v7_0_cp_compute_fini(struct amdgpu_device *adev)
2792 struct amdgpu_ring *ring = &adev->gfx.compute_ring[i]; 2792 struct amdgpu_ring *ring = &adev->gfx.compute_ring[i];
2793 2793
2794 if (ring->mqd_obj) { 2794 if (ring->mqd_obj) {
2795 r = amdgpu_bo_reserve(ring->mqd_obj, false); 2795 r = amdgpu_bo_reserve(ring->mqd_obj, true);
2796 if (unlikely(r != 0)) 2796 if (unlikely(r != 0))
2797 dev_warn(adev->dev, "(%d) reserve MQD bo failed\n", r); 2797 dev_warn(adev->dev, "(%d) reserve MQD bo failed\n", r);
2798 2798
@@ -2810,7 +2810,7 @@ static void gfx_v7_0_mec_fini(struct amdgpu_device *adev)
2810 int r; 2810 int r;
2811 2811
2812 if (adev->gfx.mec.hpd_eop_obj) { 2812 if (adev->gfx.mec.hpd_eop_obj) {
2813 r = amdgpu_bo_reserve(adev->gfx.mec.hpd_eop_obj, false); 2813 r = amdgpu_bo_reserve(adev->gfx.mec.hpd_eop_obj, true);
2814 if (unlikely(r != 0)) 2814 if (unlikely(r != 0))
2815 dev_warn(adev->dev, "(%d) reserve HPD EOP bo failed\n", r); 2815 dev_warn(adev->dev, "(%d) reserve HPD EOP bo failed\n", r);
2816 amdgpu_bo_unpin(adev->gfx.mec.hpd_eop_obj); 2816 amdgpu_bo_unpin(adev->gfx.mec.hpd_eop_obj);
@@ -3359,7 +3359,7 @@ static void gfx_v7_0_rlc_fini(struct amdgpu_device *adev)
3359 3359
3360 /* save restore block */ 3360 /* save restore block */
3361 if (adev->gfx.rlc.save_restore_obj) { 3361 if (adev->gfx.rlc.save_restore_obj) {
3362 r = amdgpu_bo_reserve(adev->gfx.rlc.save_restore_obj, false); 3362 r = amdgpu_bo_reserve(adev->gfx.rlc.save_restore_obj, true);
3363 if (unlikely(r != 0)) 3363 if (unlikely(r != 0))
3364 dev_warn(adev->dev, "(%d) reserve RLC sr bo failed\n", r); 3364 dev_warn(adev->dev, "(%d) reserve RLC sr bo failed\n", r);
3365 amdgpu_bo_unpin(adev->gfx.rlc.save_restore_obj); 3365 amdgpu_bo_unpin(adev->gfx.rlc.save_restore_obj);
@@ -3371,7 +3371,7 @@ static void gfx_v7_0_rlc_fini(struct amdgpu_device *adev)
3371 3371
3372 /* clear state block */ 3372 /* clear state block */
3373 if (adev->gfx.rlc.clear_state_obj) { 3373 if (adev->gfx.rlc.clear_state_obj) {
3374 r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false); 3374 r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, true);
3375 if (unlikely(r != 0)) 3375 if (unlikely(r != 0))
3376 dev_warn(adev->dev, "(%d) reserve RLC c bo failed\n", r); 3376 dev_warn(adev->dev, "(%d) reserve RLC c bo failed\n", r);
3377 amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj); 3377 amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
@@ -3383,7 +3383,7 @@ static void gfx_v7_0_rlc_fini(struct amdgpu_device *adev)
3383 3383
3384 /* clear state block */ 3384 /* clear state block */
3385 if (adev->gfx.rlc.cp_table_obj) { 3385 if (adev->gfx.rlc.cp_table_obj) {
3386 r = amdgpu_bo_reserve(adev->gfx.rlc.cp_table_obj, false); 3386 r = amdgpu_bo_reserve(adev->gfx.rlc.cp_table_obj, true);
3387 if (unlikely(r != 0)) 3387 if (unlikely(r != 0))
3388 dev_warn(adev->dev, "(%d) reserve RLC cp table bo failed\n", r); 3388 dev_warn(adev->dev, "(%d) reserve RLC cp table bo failed\n", r);
3389 amdgpu_bo_unpin(adev->gfx.rlc.cp_table_obj); 3389 amdgpu_bo_unpin(adev->gfx.rlc.cp_table_obj);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 3493b537c052..404d12785853 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -1239,7 +1239,7 @@ static void gfx_v8_0_rlc_fini(struct amdgpu_device *adev)
1239 1239
1240 /* clear state block */ 1240 /* clear state block */
1241 if (adev->gfx.rlc.clear_state_obj) { 1241 if (adev->gfx.rlc.clear_state_obj) {
1242 r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false); 1242 r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, true);
1243 if (unlikely(r != 0)) 1243 if (unlikely(r != 0))
1244 dev_warn(adev->dev, "(%d) reserve RLC cbs bo failed\n", r); 1244 dev_warn(adev->dev, "(%d) reserve RLC cbs bo failed\n", r);
1245 amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj); 1245 amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
@@ -1250,7 +1250,7 @@ static void gfx_v8_0_rlc_fini(struct amdgpu_device *adev)
1250 1250
1251 /* jump table block */ 1251 /* jump table block */
1252 if (adev->gfx.rlc.cp_table_obj) { 1252 if (adev->gfx.rlc.cp_table_obj) {
1253 r = amdgpu_bo_reserve(adev->gfx.rlc.cp_table_obj, false); 1253 r = amdgpu_bo_reserve(adev->gfx.rlc.cp_table_obj, true);
1254 if (unlikely(r != 0)) 1254 if (unlikely(r != 0))
1255 dev_warn(adev->dev, "(%d) reserve RLC cp table bo failed\n", r); 1255 dev_warn(adev->dev, "(%d) reserve RLC cp table bo failed\n", r);
1256 amdgpu_bo_unpin(adev->gfx.rlc.cp_table_obj); 1256 amdgpu_bo_unpin(adev->gfx.rlc.cp_table_obj);
@@ -1363,7 +1363,7 @@ static void gfx_v8_0_mec_fini(struct amdgpu_device *adev)
1363 int r; 1363 int r;
1364 1364
1365 if (adev->gfx.mec.hpd_eop_obj) { 1365 if (adev->gfx.mec.hpd_eop_obj) {
1366 r = amdgpu_bo_reserve(adev->gfx.mec.hpd_eop_obj, false); 1366 r = amdgpu_bo_reserve(adev->gfx.mec.hpd_eop_obj, true);
1367 if (unlikely(r != 0)) 1367 if (unlikely(r != 0))
1368 dev_warn(adev->dev, "(%d) reserve HPD EOP bo failed\n", r); 1368 dev_warn(adev->dev, "(%d) reserve HPD EOP bo failed\n", r);
1369 amdgpu_bo_unpin(adev->gfx.mec.hpd_eop_obj); 1369 amdgpu_bo_unpin(adev->gfx.mec.hpd_eop_obj);
@@ -1490,7 +1490,7 @@ static int gfx_v8_0_kiq_init(struct amdgpu_device *adev)
1490 1490
1491 memset(hpd, 0, MEC_HPD_SIZE); 1491 memset(hpd, 0, MEC_HPD_SIZE);
1492 1492
1493 r = amdgpu_bo_reserve(kiq->eop_obj, false); 1493 r = amdgpu_bo_reserve(kiq->eop_obj, true);
1494 if (unlikely(r != 0)) 1494 if (unlikely(r != 0))
1495 dev_warn(adev->dev, "(%d) reserve kiq eop bo failed\n", r); 1495 dev_warn(adev->dev, "(%d) reserve kiq eop bo failed\n", r);
1496 amdgpu_bo_kunmap(kiq->eop_obj); 1496 amdgpu_bo_kunmap(kiq->eop_obj);
@@ -1932,6 +1932,7 @@ static int gfx_v8_0_gpu_early_init(struct amdgpu_device *adev)
1932 case 0xca: 1932 case 0xca:
1933 case 0xce: 1933 case 0xce:
1934 case 0x88: 1934 case 0x88:
1935 case 0xe6:
1935 /* B6 */ 1936 /* B6 */
1936 adev->gfx.config.max_cu_per_sh = 6; 1937 adev->gfx.config.max_cu_per_sh = 6;
1937 break; 1938 break;
@@ -1964,17 +1965,28 @@ static int gfx_v8_0_gpu_early_init(struct amdgpu_device *adev)
1964 adev->gfx.config.max_backends_per_se = 1; 1965 adev->gfx.config.max_backends_per_se = 1;
1965 1966
1966 switch (adev->pdev->revision) { 1967 switch (adev->pdev->revision) {
1968 case 0x80:
1969 case 0x81:
1967 case 0xc0: 1970 case 0xc0:
1968 case 0xc1: 1971 case 0xc1:
1969 case 0xc2: 1972 case 0xc2:
1970 case 0xc4: 1973 case 0xc4:
1971 case 0xc8: 1974 case 0xc8:
1972 case 0xc9: 1975 case 0xc9:
1976 case 0xd6:
1977 case 0xda:
1978 case 0xe9:
1979 case 0xea:
1973 adev->gfx.config.max_cu_per_sh = 3; 1980 adev->gfx.config.max_cu_per_sh = 3;
1974 break; 1981 break;
1982 case 0x83:
1975 case 0xd0: 1983 case 0xd0:
1976 case 0xd1: 1984 case 0xd1:
1977 case 0xd2: 1985 case 0xd2:
1986 case 0xd4:
1987 case 0xdb:
1988 case 0xe1:
1989 case 0xe2:
1978 default: 1990 default:
1979 adev->gfx.config.max_cu_per_sh = 2; 1991 adev->gfx.config.max_cu_per_sh = 2;
1980 break; 1992 break;
@@ -3890,7 +3902,7 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
3890 sh_static_mem_cfg = REG_SET_FIELD(sh_static_mem_cfg, SH_STATIC_MEM_CONFIG, 3902 sh_static_mem_cfg = REG_SET_FIELD(sh_static_mem_cfg, SH_STATIC_MEM_CONFIG,
3891 INDEX_STRIDE, 3); 3903 INDEX_STRIDE, 3);
3892 mutex_lock(&adev->srbm_mutex); 3904 mutex_lock(&adev->srbm_mutex);
3893 for (i = 0; i < adev->vm_manager.num_ids; i++) { 3905 for (i = 0; i < adev->vm_manager.id_mgr[0].num_ids; i++) {
3894 vi_srbm_select(adev, 0, 0, 0, i); 3906 vi_srbm_select(adev, 0, 0, 0, i);
3895 /* CP and shaders */ 3907 /* CP and shaders */
3896 if (i == 0) { 3908 if (i == 0) {
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
index 71537818563d..125b11950071 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
@@ -39,7 +39,6 @@
39 39
40#define GFX9_NUM_GFX_RINGS 1 40#define GFX9_NUM_GFX_RINGS 1
41#define GFX9_NUM_COMPUTE_RINGS 8 41#define GFX9_NUM_COMPUTE_RINGS 8
42#define GFX9_NUM_SE 4
43#define RLCG_UCODE_LOADING_START_ADDRESS 0x2000 42#define RLCG_UCODE_LOADING_START_ADDRESS 0x2000
44 43
45MODULE_FIRMWARE("amdgpu/vega10_ce.bin"); 44MODULE_FIRMWARE("amdgpu/vega10_ce.bin");
@@ -453,7 +452,7 @@ static void gfx_v9_0_mec_fini(struct amdgpu_device *adev)
453 int r; 452 int r;
454 453
455 if (adev->gfx.mec.hpd_eop_obj) { 454 if (adev->gfx.mec.hpd_eop_obj) {
456 r = amdgpu_bo_reserve(adev->gfx.mec.hpd_eop_obj, false); 455 r = amdgpu_bo_reserve(adev->gfx.mec.hpd_eop_obj, true);
457 if (unlikely(r != 0)) 456 if (unlikely(r != 0))
458 dev_warn(adev->dev, "(%d) reserve HPD EOP bo failed\n", r); 457 dev_warn(adev->dev, "(%d) reserve HPD EOP bo failed\n", r);
459 amdgpu_bo_unpin(adev->gfx.mec.hpd_eop_obj); 458 amdgpu_bo_unpin(adev->gfx.mec.hpd_eop_obj);
@@ -463,7 +462,7 @@ static void gfx_v9_0_mec_fini(struct amdgpu_device *adev)
463 adev->gfx.mec.hpd_eop_obj = NULL; 462 adev->gfx.mec.hpd_eop_obj = NULL;
464 } 463 }
465 if (adev->gfx.mec.mec_fw_obj) { 464 if (adev->gfx.mec.mec_fw_obj) {
466 r = amdgpu_bo_reserve(adev->gfx.mec.mec_fw_obj, false); 465 r = amdgpu_bo_reserve(adev->gfx.mec.mec_fw_obj, true);
467 if (unlikely(r != 0)) 466 if (unlikely(r != 0))
468 dev_warn(adev->dev, "(%d) reserve mec firmware bo failed\n", r); 467 dev_warn(adev->dev, "(%d) reserve mec firmware bo failed\n", r);
469 amdgpu_bo_unpin(adev->gfx.mec.mec_fw_obj); 468 amdgpu_bo_unpin(adev->gfx.mec.mec_fw_obj);
@@ -599,7 +598,7 @@ static int gfx_v9_0_kiq_init(struct amdgpu_device *adev)
599 598
600 memset(hpd, 0, MEC_HPD_SIZE); 599 memset(hpd, 0, MEC_HPD_SIZE);
601 600
602 r = amdgpu_bo_reserve(kiq->eop_obj, false); 601 r = amdgpu_bo_reserve(kiq->eop_obj, true);
603 if (unlikely(r != 0)) 602 if (unlikely(r != 0))
604 dev_warn(adev->dev, "(%d) reserve kiq eop bo failed\n", r); 603 dev_warn(adev->dev, "(%d) reserve kiq eop bo failed\n", r);
605 amdgpu_bo_kunmap(kiq->eop_obj); 604 amdgpu_bo_kunmap(kiq->eop_obj);
@@ -631,7 +630,6 @@ static int gfx_v9_0_kiq_init_ring(struct amdgpu_device *adev,
631 ring->pipe = 1; 630 ring->pipe = 1;
632 } 631 }
633 632
634 irq->data = ring;
635 ring->queue = 0; 633 ring->queue = 0;
636 ring->eop_gpu_addr = kiq->eop_gpu_addr; 634 ring->eop_gpu_addr = kiq->eop_gpu_addr;
637 sprintf(ring->name, "kiq %d.%d.%d", ring->me, ring->pipe, ring->queue); 635 sprintf(ring->name, "kiq %d.%d.%d", ring->me, ring->pipe, ring->queue);
@@ -647,7 +645,6 @@ static void gfx_v9_0_kiq_free_ring(struct amdgpu_ring *ring,
647{ 645{
648 amdgpu_wb_free(ring->adev, ring->adev->virt.reg_val_offs); 646 amdgpu_wb_free(ring->adev, ring->adev->virt.reg_val_offs);
649 amdgpu_ring_fini(ring); 647 amdgpu_ring_fini(ring);
650 irq->data = NULL;
651} 648}
652 649
653/* create MQD for each compute queue */ 650/* create MQD for each compute queue */
@@ -705,19 +702,19 @@ static void gfx_v9_0_compute_mqd_sw_fini(struct amdgpu_device *adev)
705 702
706static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address) 703static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address)
707{ 704{
708 WREG32(SOC15_REG_OFFSET(GC, 0, mmSQ_IND_INDEX), 705 WREG32_SOC15(GC, 0, mmSQ_IND_INDEX,
709 (wave << SQ_IND_INDEX__WAVE_ID__SHIFT) | 706 (wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |
710 (simd << SQ_IND_INDEX__SIMD_ID__SHIFT) | 707 (simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |
711 (address << SQ_IND_INDEX__INDEX__SHIFT) | 708 (address << SQ_IND_INDEX__INDEX__SHIFT) |
712 (SQ_IND_INDEX__FORCE_READ_MASK)); 709 (SQ_IND_INDEX__FORCE_READ_MASK));
713 return RREG32(SOC15_REG_OFFSET(GC, 0, mmSQ_IND_DATA)); 710 return RREG32_SOC15(GC, 0, mmSQ_IND_DATA);
714} 711}
715 712
716static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd, 713static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd,
717 uint32_t wave, uint32_t thread, 714 uint32_t wave, uint32_t thread,
718 uint32_t regno, uint32_t num, uint32_t *out) 715 uint32_t regno, uint32_t num, uint32_t *out)
719{ 716{
720 WREG32(SOC15_REG_OFFSET(GC, 0, mmSQ_IND_INDEX), 717 WREG32_SOC15(GC, 0, mmSQ_IND_INDEX,
721 (wave << SQ_IND_INDEX__WAVE_ID__SHIFT) | 718 (wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |
722 (simd << SQ_IND_INDEX__SIMD_ID__SHIFT) | 719 (simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |
723 (regno << SQ_IND_INDEX__INDEX__SHIFT) | 720 (regno << SQ_IND_INDEX__INDEX__SHIFT) |
@@ -725,7 +722,7 @@ static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd,
725 (SQ_IND_INDEX__FORCE_READ_MASK) | 722 (SQ_IND_INDEX__FORCE_READ_MASK) |
726 (SQ_IND_INDEX__AUTO_INCR_MASK)); 723 (SQ_IND_INDEX__AUTO_INCR_MASK));
727 while (num--) 724 while (num--)
728 *(out++) = RREG32(SOC15_REG_OFFSET(GC, 0, mmSQ_IND_DATA)); 725 *(out++) = RREG32_SOC15(GC, 0, mmSQ_IND_DATA);
729} 726}
730 727
731static void gfx_v9_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields) 728static void gfx_v9_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields)
@@ -774,7 +771,6 @@ static void gfx_v9_0_gpu_early_init(struct amdgpu_device *adev)
774 switch (adev->asic_type) { 771 switch (adev->asic_type) {
775 case CHIP_VEGA10: 772 case CHIP_VEGA10:
776 adev->gfx.config.max_shader_engines = 4; 773 adev->gfx.config.max_shader_engines = 4;
777 adev->gfx.config.max_tile_pipes = 8; //??
778 adev->gfx.config.max_cu_per_sh = 16; 774 adev->gfx.config.max_cu_per_sh = 16;
779 adev->gfx.config.max_sh_per_se = 1; 775 adev->gfx.config.max_sh_per_se = 1;
780 adev->gfx.config.max_backends_per_se = 4; 776 adev->gfx.config.max_backends_per_se = 4;
@@ -787,6 +783,8 @@ static void gfx_v9_0_gpu_early_init(struct amdgpu_device *adev)
787 adev->gfx.config.sc_prim_fifo_size_backend = 0x100; 783 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
788 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30; 784 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
789 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0; 785 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0;
786 adev->gfx.config.gs_vgt_table_depth = 32;
787 adev->gfx.config.gs_prim_buffer_depth = 1792;
790 gb_addr_config = VEGA10_GB_ADDR_CONFIG_GOLDEN; 788 gb_addr_config = VEGA10_GB_ADDR_CONFIG_GOLDEN;
791 break; 789 break;
792 default: 790 default:
@@ -801,6 +799,10 @@ static void gfx_v9_0_gpu_early_init(struct amdgpu_device *adev)
801 adev->gfx.config.gb_addr_config, 799 adev->gfx.config.gb_addr_config,
802 GB_ADDR_CONFIG, 800 GB_ADDR_CONFIG,
803 NUM_PIPES); 801 NUM_PIPES);
802
803 adev->gfx.config.max_tile_pipes =
804 adev->gfx.config.gb_addr_config_fields.num_pipes;
805
804 adev->gfx.config.gb_addr_config_fields.num_banks = 1 << 806 adev->gfx.config.gb_addr_config_fields.num_banks = 1 <<
805 REG_GET_FIELD( 807 REG_GET_FIELD(
806 adev->gfx.config.gb_addr_config, 808 adev->gfx.config.gb_addr_config,
@@ -841,7 +843,7 @@ static int gfx_v9_0_ngg_create_buf(struct amdgpu_device *adev,
841 } 843 }
842 size_se = size_se ? size_se : default_size_se; 844 size_se = size_se ? size_se : default_size_se;
843 845
844 ngg_buf->size = size_se * GFX9_NUM_SE; 846 ngg_buf->size = size_se * adev->gfx.config.max_shader_engines;
845 r = amdgpu_bo_create_kernel(adev, ngg_buf->size, 847 r = amdgpu_bo_create_kernel(adev, ngg_buf->size,
846 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM, 848 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
847 &ngg_buf->bo, 849 &ngg_buf->bo,
@@ -888,7 +890,7 @@ static int gfx_v9_0_ngg_init(struct amdgpu_device *adev)
888 adev->gfx.ngg.gds_reserve_addr += adev->gds.mem.gfx_partition_size; 890 adev->gfx.ngg.gds_reserve_addr += adev->gds.mem.gfx_partition_size;
889 891
890 /* Primitive Buffer */ 892 /* Primitive Buffer */
891 r = gfx_v9_0_ngg_create_buf(adev, &adev->gfx.ngg.buf[PRIM], 893 r = gfx_v9_0_ngg_create_buf(adev, &adev->gfx.ngg.buf[NGG_PRIM],
892 amdgpu_prim_buf_per_se, 894 amdgpu_prim_buf_per_se,
893 64 * 1024); 895 64 * 1024);
894 if (r) { 896 if (r) {
@@ -897,7 +899,7 @@ static int gfx_v9_0_ngg_init(struct amdgpu_device *adev)
897 } 899 }
898 900
899 /* Position Buffer */ 901 /* Position Buffer */
900 r = gfx_v9_0_ngg_create_buf(adev, &adev->gfx.ngg.buf[POS], 902 r = gfx_v9_0_ngg_create_buf(adev, &adev->gfx.ngg.buf[NGG_POS],
901 amdgpu_pos_buf_per_se, 903 amdgpu_pos_buf_per_se,
902 256 * 1024); 904 256 * 1024);
903 if (r) { 905 if (r) {
@@ -906,7 +908,7 @@ static int gfx_v9_0_ngg_init(struct amdgpu_device *adev)
906 } 908 }
907 909
908 /* Control Sideband */ 910 /* Control Sideband */
909 r = gfx_v9_0_ngg_create_buf(adev, &adev->gfx.ngg.buf[CNTL], 911 r = gfx_v9_0_ngg_create_buf(adev, &adev->gfx.ngg.buf[NGG_CNTL],
910 amdgpu_cntl_sb_buf_per_se, 912 amdgpu_cntl_sb_buf_per_se,
911 256); 913 256);
912 if (r) { 914 if (r) {
@@ -918,7 +920,7 @@ static int gfx_v9_0_ngg_init(struct amdgpu_device *adev)
918 if (amdgpu_param_buf_per_se <= 0) 920 if (amdgpu_param_buf_per_se <= 0)
919 goto out; 921 goto out;
920 922
921 r = gfx_v9_0_ngg_create_buf(adev, &adev->gfx.ngg.buf[PARAM], 923 r = gfx_v9_0_ngg_create_buf(adev, &adev->gfx.ngg.buf[NGG_PARAM],
922 amdgpu_param_buf_per_se, 924 amdgpu_param_buf_per_se,
923 512 * 1024); 925 512 * 1024);
924 if (r) { 926 if (r) {
@@ -947,47 +949,47 @@ static int gfx_v9_0_ngg_en(struct amdgpu_device *adev)
947 949
948 /* Program buffer size */ 950 /* Program buffer size */
949 data = 0; 951 data = 0;
950 size = adev->gfx.ngg.buf[PRIM].size / 256; 952 size = adev->gfx.ngg.buf[NGG_PRIM].size / 256;
951 data = REG_SET_FIELD(data, WD_BUF_RESOURCE_1, INDEX_BUF_SIZE, size); 953 data = REG_SET_FIELD(data, WD_BUF_RESOURCE_1, INDEX_BUF_SIZE, size);
952 954
953 size = adev->gfx.ngg.buf[POS].size / 256; 955 size = adev->gfx.ngg.buf[NGG_POS].size / 256;
954 data = REG_SET_FIELD(data, WD_BUF_RESOURCE_1, POS_BUF_SIZE, size); 956 data = REG_SET_FIELD(data, WD_BUF_RESOURCE_1, POS_BUF_SIZE, size);
955 957
956 WREG32(SOC15_REG_OFFSET(GC, 0, mmWD_BUF_RESOURCE_1), data); 958 WREG32_SOC15(GC, 0, mmWD_BUF_RESOURCE_1, data);
957 959
958 data = 0; 960 data = 0;
959 size = adev->gfx.ngg.buf[CNTL].size / 256; 961 size = adev->gfx.ngg.buf[NGG_CNTL].size / 256;
960 data = REG_SET_FIELD(data, WD_BUF_RESOURCE_2, CNTL_SB_BUF_SIZE, size); 962 data = REG_SET_FIELD(data, WD_BUF_RESOURCE_2, CNTL_SB_BUF_SIZE, size);
961 963
962 size = adev->gfx.ngg.buf[PARAM].size / 1024; 964 size = adev->gfx.ngg.buf[NGG_PARAM].size / 1024;
963 data = REG_SET_FIELD(data, WD_BUF_RESOURCE_2, PARAM_BUF_SIZE, size); 965 data = REG_SET_FIELD(data, WD_BUF_RESOURCE_2, PARAM_BUF_SIZE, size);
964 966
965 WREG32(SOC15_REG_OFFSET(GC, 0, mmWD_BUF_RESOURCE_2), data); 967 WREG32_SOC15(GC, 0, mmWD_BUF_RESOURCE_2, data);
966 968
967 /* Program buffer base address */ 969 /* Program buffer base address */
968 base = lower_32_bits(adev->gfx.ngg.buf[PRIM].gpu_addr); 970 base = lower_32_bits(adev->gfx.ngg.buf[NGG_PRIM].gpu_addr);
969 data = REG_SET_FIELD(0, WD_INDEX_BUF_BASE, BASE, base); 971 data = REG_SET_FIELD(0, WD_INDEX_BUF_BASE, BASE, base);
970 WREG32(SOC15_REG_OFFSET(GC, 0, mmWD_INDEX_BUF_BASE), data); 972 WREG32_SOC15(GC, 0, mmWD_INDEX_BUF_BASE, data);
971 973
972 base = upper_32_bits(adev->gfx.ngg.buf[PRIM].gpu_addr); 974 base = upper_32_bits(adev->gfx.ngg.buf[NGG_PRIM].gpu_addr);
973 data = REG_SET_FIELD(0, WD_INDEX_BUF_BASE_HI, BASE_HI, base); 975 data = REG_SET_FIELD(0, WD_INDEX_BUF_BASE_HI, BASE_HI, base);
974 WREG32(SOC15_REG_OFFSET(GC, 0, mmWD_INDEX_BUF_BASE_HI), data); 976 WREG32_SOC15(GC, 0, mmWD_INDEX_BUF_BASE_HI, data);
975 977
976 base = lower_32_bits(adev->gfx.ngg.buf[POS].gpu_addr); 978 base = lower_32_bits(adev->gfx.ngg.buf[NGG_POS].gpu_addr);
977 data = REG_SET_FIELD(0, WD_POS_BUF_BASE, BASE, base); 979 data = REG_SET_FIELD(0, WD_POS_BUF_BASE, BASE, base);
978 WREG32(SOC15_REG_OFFSET(GC, 0, mmWD_POS_BUF_BASE), data); 980 WREG32_SOC15(GC, 0, mmWD_POS_BUF_BASE, data);
979 981
980 base = upper_32_bits(adev->gfx.ngg.buf[POS].gpu_addr); 982 base = upper_32_bits(adev->gfx.ngg.buf[NGG_POS].gpu_addr);
981 data = REG_SET_FIELD(0, WD_POS_BUF_BASE_HI, BASE_HI, base); 983 data = REG_SET_FIELD(0, WD_POS_BUF_BASE_HI, BASE_HI, base);
982 WREG32(SOC15_REG_OFFSET(GC, 0, mmWD_POS_BUF_BASE_HI), data); 984 WREG32_SOC15(GC, 0, mmWD_POS_BUF_BASE_HI, data);
983 985
984 base = lower_32_bits(adev->gfx.ngg.buf[CNTL].gpu_addr); 986 base = lower_32_bits(adev->gfx.ngg.buf[NGG_CNTL].gpu_addr);
985 data = REG_SET_FIELD(0, WD_CNTL_SB_BUF_BASE, BASE, base); 987 data = REG_SET_FIELD(0, WD_CNTL_SB_BUF_BASE, BASE, base);
986 WREG32(SOC15_REG_OFFSET(GC, 0, mmWD_CNTL_SB_BUF_BASE), data); 988 WREG32_SOC15(GC, 0, mmWD_CNTL_SB_BUF_BASE, data);
987 989
988 base = upper_32_bits(adev->gfx.ngg.buf[CNTL].gpu_addr); 990 base = upper_32_bits(adev->gfx.ngg.buf[NGG_CNTL].gpu_addr);
989 data = REG_SET_FIELD(0, WD_CNTL_SB_BUF_BASE_HI, BASE_HI, base); 991 data = REG_SET_FIELD(0, WD_CNTL_SB_BUF_BASE_HI, BASE_HI, base);
990 WREG32(SOC15_REG_OFFSET(GC, 0, mmWD_CNTL_SB_BUF_BASE_HI), data); 992 WREG32_SOC15(GC, 0, mmWD_CNTL_SB_BUF_BASE_HI, data);
991 993
992 /* Clear GDS reserved memory */ 994 /* Clear GDS reserved memory */
993 r = amdgpu_ring_alloc(ring, 17); 995 r = amdgpu_ring_alloc(ring, 17);
@@ -1096,7 +1098,7 @@ static int gfx_v9_0_sw_init(void *handle)
1096 ring->pipe = i / 8; 1098 ring->pipe = i / 8;
1097 ring->queue = i % 8; 1099 ring->queue = i % 8;
1098 ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr + (i * MEC_HPD_SIZE); 1100 ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr + (i * MEC_HPD_SIZE);
1099 sprintf(ring->name, "comp %d.%d.%d", ring->me, ring->pipe, ring->queue); 1101 sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);
1100 irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe; 1102 irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe;
1101 /* type-2 packets are deprecated on MEC, use type-3 instead */ 1103 /* type-2 packets are deprecated on MEC, use type-3 instead */
1102 r = amdgpu_ring_init(adev, ring, 1024, 1104 r = amdgpu_ring_init(adev, ring, 1024,
@@ -1203,7 +1205,7 @@ static void gfx_v9_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh
1203 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num); 1205 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);
1204 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num); 1206 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);
1205 } 1207 }
1206 WREG32( SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_INDEX), data); 1208 WREG32_SOC15(GC, 0, mmGRBM_GFX_INDEX, data);
1207} 1209}
1208 1210
1209static u32 gfx_v9_0_create_bitmask(u32 bit_width) 1211static u32 gfx_v9_0_create_bitmask(u32 bit_width)
@@ -1215,8 +1217,8 @@ static u32 gfx_v9_0_get_rb_active_bitmap(struct amdgpu_device *adev)
1215{ 1217{
1216 u32 data, mask; 1218 u32 data, mask;
1217 1219
1218 data = RREG32(SOC15_REG_OFFSET(GC, 0, mmCC_RB_BACKEND_DISABLE)); 1220 data = RREG32_SOC15(GC, 0, mmCC_RB_BACKEND_DISABLE);
1219 data |= RREG32(SOC15_REG_OFFSET(GC, 0, mmGC_USER_RB_BACKEND_DISABLE)); 1221 data |= RREG32_SOC15(GC, 0, mmGC_USER_RB_BACKEND_DISABLE);
1220 1222
1221 data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK; 1223 data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK;
1222 data >>= GC_USER_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT; 1224 data >>= GC_USER_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT;
@@ -1276,8 +1278,8 @@ static void gfx_v9_0_init_compute_vmid(struct amdgpu_device *adev)
1276 for (i = FIRST_COMPUTE_VMID; i < LAST_COMPUTE_VMID; i++) { 1278 for (i = FIRST_COMPUTE_VMID; i < LAST_COMPUTE_VMID; i++) {
1277 soc15_grbm_select(adev, 0, 0, 0, i); 1279 soc15_grbm_select(adev, 0, 0, 0, i);
1278 /* CP and shaders */ 1280 /* CP and shaders */
1279 WREG32(SOC15_REG_OFFSET(GC, 0, mmSH_MEM_CONFIG), sh_mem_config); 1281 WREG32_SOC15(GC, 0, mmSH_MEM_CONFIG, sh_mem_config);
1280 WREG32(SOC15_REG_OFFSET(GC, 0, mmSH_MEM_BASES), sh_mem_bases); 1282 WREG32_SOC15(GC, 0, mmSH_MEM_BASES, sh_mem_bases);
1281 } 1283 }
1282 soc15_grbm_select(adev, 0, 0, 0, 0); 1284 soc15_grbm_select(adev, 0, 0, 0, 0);
1283 mutex_unlock(&adev->srbm_mutex); 1285 mutex_unlock(&adev->srbm_mutex);
@@ -1304,8 +1306,8 @@ static void gfx_v9_0_gpu_init(struct amdgpu_device *adev)
1304 tmp = 0; 1306 tmp = 0;
1305 tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, ALIGNMENT_MODE, 1307 tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, ALIGNMENT_MODE,
1306 SH_MEM_ALIGNMENT_MODE_UNALIGNED); 1308 SH_MEM_ALIGNMENT_MODE_UNALIGNED);
1307 WREG32(SOC15_REG_OFFSET(GC, 0, mmSH_MEM_CONFIG), tmp); 1309 WREG32_SOC15(GC, 0, mmSH_MEM_CONFIG, tmp);
1308 WREG32(SOC15_REG_OFFSET(GC, 0, mmSH_MEM_BASES), 0); 1310 WREG32_SOC15(GC, 0, mmSH_MEM_BASES, 0);
1309 } 1311 }
1310 soc15_grbm_select(adev, 0, 0, 0, 0); 1312 soc15_grbm_select(adev, 0, 0, 0, 0);
1311 1313
@@ -1320,7 +1322,7 @@ static void gfx_v9_0_gpu_init(struct amdgpu_device *adev)
1320 */ 1322 */
1321 gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 1323 gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1322 1324
1323 WREG32(SOC15_REG_OFFSET(GC, 0, mmPA_SC_FIFO_SIZE), 1325 WREG32_SOC15(GC, 0, mmPA_SC_FIFO_SIZE,
1324 (adev->gfx.config.sc_prim_fifo_size_frontend << 1326 (adev->gfx.config.sc_prim_fifo_size_frontend <<
1325 PA_SC_FIFO_SIZE__SC_FRONTEND_PRIM_FIFO_SIZE__SHIFT) | 1327 PA_SC_FIFO_SIZE__SC_FRONTEND_PRIM_FIFO_SIZE__SHIFT) |
1326 (adev->gfx.config.sc_prim_fifo_size_backend << 1328 (adev->gfx.config.sc_prim_fifo_size_backend <<
@@ -1343,7 +1345,7 @@ static void gfx_v9_0_wait_for_rlc_serdes(struct amdgpu_device *adev)
1343 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { 1345 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
1344 gfx_v9_0_select_se_sh(adev, i, j, 0xffffffff); 1346 gfx_v9_0_select_se_sh(adev, i, j, 0xffffffff);
1345 for (k = 0; k < adev->usec_timeout; k++) { 1347 for (k = 0; k < adev->usec_timeout; k++) {
1346 if (RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SERDES_CU_MASTER_BUSY)) == 0) 1348 if (RREG32_SOC15(GC, 0, mmRLC_SERDES_CU_MASTER_BUSY) == 0)
1347 break; 1349 break;
1348 udelay(1); 1350 udelay(1);
1349 } 1351 }
@@ -1357,7 +1359,7 @@ static void gfx_v9_0_wait_for_rlc_serdes(struct amdgpu_device *adev)
1357 RLC_SERDES_NONCU_MASTER_BUSY__TC0_MASTER_BUSY_MASK | 1359 RLC_SERDES_NONCU_MASTER_BUSY__TC0_MASTER_BUSY_MASK |
1358 RLC_SERDES_NONCU_MASTER_BUSY__TC1_MASTER_BUSY_MASK; 1360 RLC_SERDES_NONCU_MASTER_BUSY__TC1_MASTER_BUSY_MASK;
1359 for (k = 0; k < adev->usec_timeout; k++) { 1361 for (k = 0; k < adev->usec_timeout; k++) {
1360 if ((RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SERDES_NONCU_MASTER_BUSY)) & mask) == 0) 1362 if ((RREG32_SOC15(GC, 0, mmRLC_SERDES_NONCU_MASTER_BUSY) & mask) == 0)
1361 break; 1363 break;
1362 udelay(1); 1364 udelay(1);
1363 } 1365 }
@@ -1366,7 +1368,7 @@ static void gfx_v9_0_wait_for_rlc_serdes(struct amdgpu_device *adev)
1366static void gfx_v9_0_enable_gui_idle_interrupt(struct amdgpu_device *adev, 1368static void gfx_v9_0_enable_gui_idle_interrupt(struct amdgpu_device *adev,
1367 bool enable) 1369 bool enable)
1368{ 1370{
1369 u32 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0)); 1371 u32 tmp = RREG32_SOC15(GC, 0, mmCP_INT_CNTL_RING0);
1370 1372
1371 if (enable) 1373 if (enable)
1372 return; 1374 return;
@@ -1376,15 +1378,15 @@ static void gfx_v9_0_enable_gui_idle_interrupt(struct amdgpu_device *adev,
1376 tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CMP_BUSY_INT_ENABLE, enable ? 1 : 0); 1378 tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CMP_BUSY_INT_ENABLE, enable ? 1 : 0);
1377 tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, GFX_IDLE_INT_ENABLE, enable ? 1 : 0); 1379 tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, GFX_IDLE_INT_ENABLE, enable ? 1 : 0);
1378 1380
1379 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0), tmp); 1381 WREG32_SOC15(GC, 0, mmCP_INT_CNTL_RING0, tmp);
1380} 1382}
1381 1383
1382void gfx_v9_0_rlc_stop(struct amdgpu_device *adev) 1384void gfx_v9_0_rlc_stop(struct amdgpu_device *adev)
1383{ 1385{
1384 u32 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CNTL)); 1386 u32 tmp = RREG32_SOC15(GC, 0, mmRLC_CNTL);
1385 1387
1386 tmp = REG_SET_FIELD(tmp, RLC_CNTL, RLC_ENABLE_F32, 0); 1388 tmp = REG_SET_FIELD(tmp, RLC_CNTL, RLC_ENABLE_F32, 0);
1387 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CNTL), tmp); 1389 WREG32_SOC15(GC, 0, mmRLC_CNTL, tmp);
1388 1390
1389 gfx_v9_0_enable_gui_idle_interrupt(adev, false); 1391 gfx_v9_0_enable_gui_idle_interrupt(adev, false);
1390 1392
@@ -1415,17 +1417,17 @@ static void gfx_v9_0_rlc_start(struct amdgpu_device *adev)
1415 1417
1416#ifdef AMDGPU_RLC_DEBUG_RETRY 1418#ifdef AMDGPU_RLC_DEBUG_RETRY
1417 /* RLC_GPM_GENERAL_6 : RLC Ucode version */ 1419 /* RLC_GPM_GENERAL_6 : RLC Ucode version */
1418 rlc_ucode_ver = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_GENERAL_6)); 1420 rlc_ucode_ver = RREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_6);
1419 if(rlc_ucode_ver == 0x108) { 1421 if(rlc_ucode_ver == 0x108) {
1420 DRM_INFO("Using rlc debug ucode. mmRLC_GPM_GENERAL_6 ==0x08%x / fw_ver == %i \n", 1422 DRM_INFO("Using rlc debug ucode. mmRLC_GPM_GENERAL_6 ==0x08%x / fw_ver == %i \n",
1421 rlc_ucode_ver, adev->gfx.rlc_fw_version); 1423 rlc_ucode_ver, adev->gfx.rlc_fw_version);
1422 /* RLC_GPM_TIMER_INT_3 : Timer interval in RefCLK cycles, 1424 /* RLC_GPM_TIMER_INT_3 : Timer interval in RefCLK cycles,
1423 * default is 0x9C4 to create a 100us interval */ 1425 * default is 0x9C4 to create a 100us interval */
1424 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_TIMER_INT_3), 0x9C4); 1426 WREG32_SOC15(GC, 0, mmRLC_GPM_TIMER_INT_3, 0x9C4);
1425 /* RLC_GPM_GENERAL_12 : Minimum gap between wptr and rptr 1427 /* RLC_GPM_GENERAL_12 : Minimum gap between wptr and rptr
1426 * to disable the page fault retry interrupts, default is 1428 * to disable the page fault retry interrupts, default is
1427 * 0x100 (256) */ 1429 * 0x100 (256) */
1428 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_GENERAL_12), 0x100); 1430 WREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_12, 0x100);
1429 } 1431 }
1430#endif 1432#endif
1431} 1433}
@@ -1446,11 +1448,11 @@ static int gfx_v9_0_rlc_load_microcode(struct amdgpu_device *adev)
1446 le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 1448 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1447 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; 1449 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
1448 1450
1449 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_ADDR), 1451 WREG32_SOC15(GC, 0, mmRLC_GPM_UCODE_ADDR,
1450 RLCG_UCODE_LOADING_START_ADDRESS); 1452 RLCG_UCODE_LOADING_START_ADDRESS);
1451 for (i = 0; i < fw_size; i++) 1453 for (i = 0; i < fw_size; i++)
1452 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_DATA), le32_to_cpup(fw_data++)); 1454 WREG32_SOC15(GC, 0, mmRLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++));
1453 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_ADDR), adev->gfx.rlc_fw_version); 1455 WREG32_SOC15(GC, 0, mmRLC_GPM_UCODE_ADDR, adev->gfx.rlc_fw_version);
1454 1456
1455 return 0; 1457 return 0;
1456} 1458}
@@ -1465,10 +1467,10 @@ static int gfx_v9_0_rlc_resume(struct amdgpu_device *adev)
1465 gfx_v9_0_rlc_stop(adev); 1467 gfx_v9_0_rlc_stop(adev);
1466 1468
1467 /* disable CG */ 1469 /* disable CG */
1468 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL), 0); 1470 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, 0);
1469 1471
1470 /* disable PG */ 1472 /* disable PG */
1471 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL), 0); 1473 WREG32_SOC15(GC, 0, mmRLC_PG_CNTL, 0);
1472 1474
1473 gfx_v9_0_rlc_reset(adev); 1475 gfx_v9_0_rlc_reset(adev);
1474 1476
@@ -1487,7 +1489,7 @@ static int gfx_v9_0_rlc_resume(struct amdgpu_device *adev)
1487static void gfx_v9_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable) 1489static void gfx_v9_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)
1488{ 1490{
1489 int i; 1491 int i;
1490 u32 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_ME_CNTL)); 1492 u32 tmp = RREG32_SOC15(GC, 0, mmCP_ME_CNTL);
1491 1493
1492 tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, enable ? 0 : 1); 1494 tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, enable ? 0 : 1);
1493 tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, enable ? 0 : 1); 1495 tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, enable ? 0 : 1);
@@ -1496,7 +1498,7 @@ static void gfx_v9_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)
1496 for (i = 0; i < adev->gfx.num_gfx_rings; i++) 1498 for (i = 0; i < adev->gfx.num_gfx_rings; i++)
1497 adev->gfx.gfx_ring[i].ready = false; 1499 adev->gfx.gfx_ring[i].ready = false;
1498 } 1500 }
1499 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_ME_CNTL), tmp); 1501 WREG32_SOC15(GC, 0, mmCP_ME_CNTL, tmp);
1500 udelay(50); 1502 udelay(50);
1501} 1503}
1502 1504
@@ -1529,30 +1531,30 @@ static int gfx_v9_0_cp_gfx_load_microcode(struct amdgpu_device *adev)
1529 (adev->gfx.pfp_fw->data + 1531 (adev->gfx.pfp_fw->data +
1530 le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes)); 1532 le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes));
1531 fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4; 1533 fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4;
1532 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_ADDR), 0); 1534 WREG32_SOC15(GC, 0, mmCP_PFP_UCODE_ADDR, 0);
1533 for (i = 0; i < fw_size; i++) 1535 for (i = 0; i < fw_size; i++)
1534 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_DATA), le32_to_cpup(fw_data++)); 1536 WREG32_SOC15(GC, 0, mmCP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
1535 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_ADDR), adev->gfx.pfp_fw_version); 1537 WREG32_SOC15(GC, 0, mmCP_PFP_UCODE_ADDR, adev->gfx.pfp_fw_version);
1536 1538
1537 /* CE */ 1539 /* CE */
1538 fw_data = (const __le32 *) 1540 fw_data = (const __le32 *)
1539 (adev->gfx.ce_fw->data + 1541 (adev->gfx.ce_fw->data +
1540 le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes)); 1542 le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes));
1541 fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4; 1543 fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4;
1542 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_ADDR), 0); 1544 WREG32_SOC15(GC, 0, mmCP_CE_UCODE_ADDR, 0);
1543 for (i = 0; i < fw_size; i++) 1545 for (i = 0; i < fw_size; i++)
1544 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_DATA), le32_to_cpup(fw_data++)); 1546 WREG32_SOC15(GC, 0, mmCP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
1545 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_ADDR), adev->gfx.ce_fw_version); 1547 WREG32_SOC15(GC, 0, mmCP_CE_UCODE_ADDR, adev->gfx.ce_fw_version);
1546 1548
1547 /* ME */ 1549 /* ME */
1548 fw_data = (const __le32 *) 1550 fw_data = (const __le32 *)
1549 (adev->gfx.me_fw->data + 1551 (adev->gfx.me_fw->data +
1550 le32_to_cpu(me_hdr->header.ucode_array_offset_bytes)); 1552 le32_to_cpu(me_hdr->header.ucode_array_offset_bytes));
1551 fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4; 1553 fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4;
1552 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_ME_RAM_WADDR), 0); 1554 WREG32_SOC15(GC, 0, mmCP_ME_RAM_WADDR, 0);
1553 for (i = 0; i < fw_size; i++) 1555 for (i = 0; i < fw_size; i++)
1554 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_ME_RAM_DATA), le32_to_cpup(fw_data++)); 1556 WREG32_SOC15(GC, 0, mmCP_ME_RAM_DATA, le32_to_cpup(fw_data++));
1555 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_ME_RAM_WADDR), adev->gfx.me_fw_version); 1557 WREG32_SOC15(GC, 0, mmCP_ME_RAM_WADDR, adev->gfx.me_fw_version);
1556 1558
1557 return 0; 1559 return 0;
1558} 1560}
@@ -1594,8 +1596,8 @@ static int gfx_v9_0_cp_gfx_start(struct amdgpu_device *adev)
1594 int r, i; 1596 int r, i;
1595 1597
1596 /* init the CP */ 1598 /* init the CP */
1597 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MAX_CONTEXT), adev->gfx.config.max_hw_contexts - 1); 1599 WREG32_SOC15(GC, 0, mmCP_MAX_CONTEXT, adev->gfx.config.max_hw_contexts - 1);
1598 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_DEVICE_ID), 1); 1600 WREG32_SOC15(GC, 0, mmCP_DEVICE_ID, 1);
1599 1601
1600 gfx_v9_0_cp_gfx_enable(adev, true); 1602 gfx_v9_0_cp_gfx_enable(adev, true);
1601 1603
@@ -1650,10 +1652,10 @@ static int gfx_v9_0_cp_gfx_resume(struct amdgpu_device *adev)
1650 u64 rb_addr, rptr_addr, wptr_gpu_addr; 1652 u64 rb_addr, rptr_addr, wptr_gpu_addr;
1651 1653
1652 /* Set the write pointer delay */ 1654 /* Set the write pointer delay */
1653 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_WPTR_DELAY), 0); 1655 WREG32_SOC15(GC, 0, mmCP_RB_WPTR_DELAY, 0);
1654 1656
1655 /* set the RB to use vmid 0 */ 1657 /* set the RB to use vmid 0 */
1656 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_VMID), 0); 1658 WREG32_SOC15(GC, 0, mmCP_RB_VMID, 0);
1657 1659
1658 /* Set ring buffer size */ 1660 /* Set ring buffer size */
1659 ring = &adev->gfx.gfx_ring[0]; 1661 ring = &adev->gfx.gfx_ring[0];
@@ -1663,30 +1665,30 @@ static int gfx_v9_0_cp_gfx_resume(struct amdgpu_device *adev)
1663#ifdef __BIG_ENDIAN 1665#ifdef __BIG_ENDIAN
1664 tmp = REG_SET_FIELD(tmp, CP_RB0_CNTL, BUF_SWAP, 1); 1666 tmp = REG_SET_FIELD(tmp, CP_RB0_CNTL, BUF_SWAP, 1);
1665#endif 1667#endif
1666 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_CNTL), tmp); 1668 WREG32_SOC15(GC, 0, mmCP_RB0_CNTL, tmp);
1667 1669
1668 /* Initialize the ring buffer's write pointers */ 1670 /* Initialize the ring buffer's write pointers */
1669 ring->wptr = 0; 1671 ring->wptr = 0;
1670 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_WPTR), lower_32_bits(ring->wptr)); 1672 WREG32_SOC15(GC, 0, mmCP_RB0_WPTR, lower_32_bits(ring->wptr));
1671 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_WPTR_HI), upper_32_bits(ring->wptr)); 1673 WREG32_SOC15(GC, 0, mmCP_RB0_WPTR_HI, upper_32_bits(ring->wptr));
1672 1674
1673 /* set the wb address wether it's enabled or not */ 1675 /* set the wb address wether it's enabled or not */
1674 rptr_addr = adev->wb.gpu_addr + (ring->rptr_offs * 4); 1676 rptr_addr = adev->wb.gpu_addr + (ring->rptr_offs * 4);
1675 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_RPTR_ADDR), lower_32_bits(rptr_addr)); 1677 WREG32_SOC15(GC, 0, mmCP_RB0_RPTR_ADDR, lower_32_bits(rptr_addr));
1676 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_RPTR_ADDR_HI), upper_32_bits(rptr_addr) & CP_RB_RPTR_ADDR_HI__RB_RPTR_ADDR_HI_MASK); 1678 WREG32_SOC15(GC, 0, mmCP_RB0_RPTR_ADDR_HI, upper_32_bits(rptr_addr) & CP_RB_RPTR_ADDR_HI__RB_RPTR_ADDR_HI_MASK);
1677 1679
1678 wptr_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4); 1680 wptr_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);
1679 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_WPTR_POLL_ADDR_LO), lower_32_bits(wptr_gpu_addr)); 1681 WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_ADDR_LO, lower_32_bits(wptr_gpu_addr));
1680 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_WPTR_POLL_ADDR_HI), upper_32_bits(wptr_gpu_addr)); 1682 WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_ADDR_HI, upper_32_bits(wptr_gpu_addr));
1681 1683
1682 mdelay(1); 1684 mdelay(1);
1683 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_CNTL), tmp); 1685 WREG32_SOC15(GC, 0, mmCP_RB0_CNTL, tmp);
1684 1686
1685 rb_addr = ring->gpu_addr >> 8; 1687 rb_addr = ring->gpu_addr >> 8;
1686 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_BASE), rb_addr); 1688 WREG32_SOC15(GC, 0, mmCP_RB0_BASE, rb_addr);
1687 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_BASE_HI), upper_32_bits(rb_addr)); 1689 WREG32_SOC15(GC, 0, mmCP_RB0_BASE_HI, upper_32_bits(rb_addr));
1688 1690
1689 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_DOORBELL_CONTROL)); 1691 tmp = RREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_CONTROL);
1690 if (ring->use_doorbell) { 1692 if (ring->use_doorbell) {
1691 tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL, 1693 tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL,
1692 DOORBELL_OFFSET, ring->doorbell_index); 1694 DOORBELL_OFFSET, ring->doorbell_index);
@@ -1695,13 +1697,13 @@ static int gfx_v9_0_cp_gfx_resume(struct amdgpu_device *adev)
1695 } else { 1697 } else {
1696 tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL, DOORBELL_EN, 0); 1698 tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL, DOORBELL_EN, 0);
1697 } 1699 }
1698 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_DOORBELL_CONTROL), tmp); 1700 WREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_CONTROL, tmp);
1699 1701
1700 tmp = REG_SET_FIELD(0, CP_RB_DOORBELL_RANGE_LOWER, 1702 tmp = REG_SET_FIELD(0, CP_RB_DOORBELL_RANGE_LOWER,
1701 DOORBELL_RANGE_LOWER, ring->doorbell_index); 1703 DOORBELL_RANGE_LOWER, ring->doorbell_index);
1702 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_DOORBELL_RANGE_LOWER), tmp); 1704 WREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_RANGE_LOWER, tmp);
1703 1705
1704 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_DOORBELL_RANGE_UPPER), 1706 WREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_RANGE_UPPER,
1705 CP_RB_DOORBELL_RANGE_UPPER__DOORBELL_RANGE_UPPER_MASK); 1707 CP_RB_DOORBELL_RANGE_UPPER__DOORBELL_RANGE_UPPER_MASK);
1706 1708
1707 1709
@@ -1717,9 +1719,9 @@ static void gfx_v9_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)
1717 int i; 1719 int i;
1718 1720
1719 if (enable) { 1721 if (enable) {
1720 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEC_CNTL), 0); 1722 WREG32_SOC15(GC, 0, mmCP_MEC_CNTL, 0);
1721 } else { 1723 } else {
1722 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEC_CNTL), 1724 WREG32_SOC15(GC, 0, mmCP_MEC_CNTL,
1723 (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); 1725 (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK));
1724 for (i = 0; i < adev->gfx.num_compute_rings; i++) 1726 for (i = 0; i < adev->gfx.num_compute_rings; i++)
1725 adev->gfx.compute_ring[i].ready = false; 1727 adev->gfx.compute_ring[i].ready = false;
@@ -1756,21 +1758,21 @@ static int gfx_v9_0_cp_compute_load_microcode(struct amdgpu_device *adev)
1756 tmp = 0; 1758 tmp = 0;
1757 tmp = REG_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, VMID, 0); 1759 tmp = REG_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, VMID, 0);
1758 tmp = REG_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, CACHE_POLICY, 0); 1760 tmp = REG_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, CACHE_POLICY, 0);
1759 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_CPC_IC_BASE_CNTL), tmp); 1761 WREG32_SOC15(GC, 0, mmCP_CPC_IC_BASE_CNTL, tmp);
1760 1762
1761 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_CPC_IC_BASE_LO), 1763 WREG32_SOC15(GC, 0, mmCP_CPC_IC_BASE_LO,
1762 adev->gfx.mec.mec_fw_gpu_addr & 0xFFFFF000); 1764 adev->gfx.mec.mec_fw_gpu_addr & 0xFFFFF000);
1763 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_CPC_IC_BASE_HI), 1765 WREG32_SOC15(GC, 0, mmCP_CPC_IC_BASE_HI,
1764 upper_32_bits(adev->gfx.mec.mec_fw_gpu_addr)); 1766 upper_32_bits(adev->gfx.mec.mec_fw_gpu_addr));
1765 1767
1766 /* MEC1 */ 1768 /* MEC1 */
1767 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_ADDR), 1769 WREG32_SOC15(GC, 0, mmCP_MEC_ME1_UCODE_ADDR,
1768 mec_hdr->jt_offset); 1770 mec_hdr->jt_offset);
1769 for (i = 0; i < mec_hdr->jt_size; i++) 1771 for (i = 0; i < mec_hdr->jt_size; i++)
1770 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_DATA), 1772 WREG32_SOC15(GC, 0, mmCP_MEC_ME1_UCODE_DATA,
1771 le32_to_cpup(fw_data + mec_hdr->jt_offset + i)); 1773 le32_to_cpup(fw_data + mec_hdr->jt_offset + i));
1772 1774
1773 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_ADDR), 1775 WREG32_SOC15(GC, 0, mmCP_MEC_ME1_UCODE_ADDR,
1774 adev->gfx.mec_fw_version); 1776 adev->gfx.mec_fw_version);
1775 /* Todo : Loading MEC2 firmware is only necessary if MEC2 should run different microcode than MEC1. */ 1777 /* Todo : Loading MEC2 firmware is only necessary if MEC2 should run different microcode than MEC1. */
1776 1778
@@ -1785,7 +1787,7 @@ static void gfx_v9_0_cp_compute_fini(struct amdgpu_device *adev)
1785 struct amdgpu_ring *ring = &adev->gfx.compute_ring[i]; 1787 struct amdgpu_ring *ring = &adev->gfx.compute_ring[i];
1786 1788
1787 if (ring->mqd_obj) { 1789 if (ring->mqd_obj) {
1788 r = amdgpu_bo_reserve(ring->mqd_obj, false); 1790 r = amdgpu_bo_reserve(ring->mqd_obj, true);
1789 if (unlikely(r != 0)) 1791 if (unlikely(r != 0))
1790 dev_warn(adev->dev, "(%d) reserve MQD bo failed\n", r); 1792 dev_warn(adev->dev, "(%d) reserve MQD bo failed\n", r);
1791 1793
@@ -1823,12 +1825,12 @@ static void gfx_v9_0_kiq_setting(struct amdgpu_ring *ring)
1823 struct amdgpu_device *adev = ring->adev; 1825 struct amdgpu_device *adev = ring->adev;
1824 1826
1825 /* tell RLC which is KIQ queue */ 1827 /* tell RLC which is KIQ queue */
1826 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CP_SCHEDULERS)); 1828 tmp = RREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS);
1827 tmp &= 0xffffff00; 1829 tmp &= 0xffffff00;
1828 tmp |= (ring->me << 5) | (ring->pipe << 3) | (ring->queue); 1830 tmp |= (ring->me << 5) | (ring->pipe << 3) | (ring->queue);
1829 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CP_SCHEDULERS), tmp); 1831 WREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS, tmp);
1830 tmp |= 0x80; 1832 tmp |= 0x80;
1831 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CP_SCHEDULERS), tmp); 1833 WREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS, tmp);
1832} 1834}
1833 1835
1834static void gfx_v9_0_kiq_enable(struct amdgpu_ring *ring) 1836static void gfx_v9_0_kiq_enable(struct amdgpu_ring *ring)
@@ -1898,14 +1900,14 @@ static int gfx_v9_0_mqd_init(struct amdgpu_ring *ring)
1898 mqd->cp_hqd_eop_base_addr_hi = upper_32_bits(eop_base_addr); 1900 mqd->cp_hqd_eop_base_addr_hi = upper_32_bits(eop_base_addr);
1899 1901
1900 /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */ 1902 /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
1901 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_EOP_CONTROL)); 1903 tmp = RREG32_SOC15(GC, 0, mmCP_HQD_EOP_CONTROL);
1902 tmp = REG_SET_FIELD(tmp, CP_HQD_EOP_CONTROL, EOP_SIZE, 1904 tmp = REG_SET_FIELD(tmp, CP_HQD_EOP_CONTROL, EOP_SIZE,
1903 (order_base_2(MEC_HPD_SIZE / 4) - 1)); 1905 (order_base_2(MEC_HPD_SIZE / 4) - 1));
1904 1906
1905 mqd->cp_hqd_eop_control = tmp; 1907 mqd->cp_hqd_eop_control = tmp;
1906 1908
1907 /* enable doorbell? */ 1909 /* enable doorbell? */
1908 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL)); 1910 tmp = RREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL);
1909 1911
1910 if (ring->use_doorbell) { 1912 if (ring->use_doorbell) {
1911 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, 1913 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
@@ -1935,7 +1937,7 @@ static int gfx_v9_0_mqd_init(struct amdgpu_ring *ring)
1935 mqd->cp_mqd_base_addr_hi = upper_32_bits(ring->mqd_gpu_addr); 1937 mqd->cp_mqd_base_addr_hi = upper_32_bits(ring->mqd_gpu_addr);
1936 1938
1937 /* set MQD vmid to 0 */ 1939 /* set MQD vmid to 0 */
1938 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MQD_CONTROL)); 1940 tmp = RREG32_SOC15(GC, 0, mmCP_MQD_CONTROL);
1939 tmp = REG_SET_FIELD(tmp, CP_MQD_CONTROL, VMID, 0); 1941 tmp = REG_SET_FIELD(tmp, CP_MQD_CONTROL, VMID, 0);
1940 mqd->cp_mqd_control = tmp; 1942 mqd->cp_mqd_control = tmp;
1941 1943
@@ -1945,7 +1947,7 @@ static int gfx_v9_0_mqd_init(struct amdgpu_ring *ring)
1945 mqd->cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr); 1947 mqd->cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr);
1946 1948
1947 /* set up the HQD, this is similar to CP_RB0_CNTL */ 1949 /* set up the HQD, this is similar to CP_RB0_CNTL */
1948 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_CONTROL)); 1950 tmp = RREG32_SOC15(GC, 0, mmCP_HQD_PQ_CONTROL);
1949 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, QUEUE_SIZE, 1951 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, QUEUE_SIZE,
1950 (order_base_2(ring->ring_size / 4) - 1)); 1952 (order_base_2(ring->ring_size / 4) - 1));
1951 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE, 1953 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE,
@@ -1973,7 +1975,7 @@ static int gfx_v9_0_mqd_init(struct amdgpu_ring *ring)
1973 tmp = 0; 1975 tmp = 0;
1974 /* enable the doorbell if requested */ 1976 /* enable the doorbell if requested */
1975 if (ring->use_doorbell) { 1977 if (ring->use_doorbell) {
1976 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL)); 1978 tmp = RREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL);
1977 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, 1979 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
1978 DOORBELL_OFFSET, ring->doorbell_index); 1980 DOORBELL_OFFSET, ring->doorbell_index);
1979 1981
@@ -1989,15 +1991,20 @@ static int gfx_v9_0_mqd_init(struct amdgpu_ring *ring)
1989 1991
1990 /* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */ 1992 /* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */
1991 ring->wptr = 0; 1993 ring->wptr = 0;
1992 mqd->cp_hqd_pq_rptr = RREG32(mmCP_HQD_PQ_RPTR); 1994 mqd->cp_hqd_pq_rptr = RREG32_SOC15(GC, 0, mmCP_HQD_PQ_RPTR);
1993 1995
1994 /* set the vmid for the queue */ 1996 /* set the vmid for the queue */
1995 mqd->cp_hqd_vmid = 0; 1997 mqd->cp_hqd_vmid = 0;
1996 1998
1997 tmp = RREG32(mmCP_HQD_PERSISTENT_STATE); 1999 tmp = RREG32_SOC15(GC, 0, mmCP_HQD_PERSISTENT_STATE);
1998 tmp = REG_SET_FIELD(tmp, CP_HQD_PERSISTENT_STATE, PRELOAD_SIZE, 0x53); 2000 tmp = REG_SET_FIELD(tmp, CP_HQD_PERSISTENT_STATE, PRELOAD_SIZE, 0x53);
1999 mqd->cp_hqd_persistent_state = tmp; 2001 mqd->cp_hqd_persistent_state = tmp;
2000 2002
2003 /* set MIN_IB_AVAIL_SIZE */
2004 tmp = RREG32_SOC15(GC, 0, mmCP_HQD_IB_CONTROL);
2005 tmp = REG_SET_FIELD(tmp, CP_HQD_IB_CONTROL, MIN_IB_AVAIL_SIZE, 3);
2006 mqd->cp_hqd_ib_control = tmp;
2007
2001 /* activate the queue */ 2008 /* activate the queue */
2002 mqd->cp_hqd_active = 1; 2009 mqd->cp_hqd_active = 1;
2003 2010
@@ -2013,94 +2020,94 @@ static int gfx_v9_0_kiq_init_register(struct amdgpu_ring *ring)
2013 /* disable wptr polling */ 2020 /* disable wptr polling */
2014 WREG32_FIELD15(GC, 0, CP_PQ_WPTR_POLL_CNTL, EN, 0); 2021 WREG32_FIELD15(GC, 0, CP_PQ_WPTR_POLL_CNTL, EN, 0);
2015 2022
2016 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_EOP_BASE_ADDR), 2023 WREG32_SOC15(GC, 0, mmCP_HQD_EOP_BASE_ADDR,
2017 mqd->cp_hqd_eop_base_addr_lo); 2024 mqd->cp_hqd_eop_base_addr_lo);
2018 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_EOP_BASE_ADDR_HI), 2025 WREG32_SOC15(GC, 0, mmCP_HQD_EOP_BASE_ADDR_HI,
2019 mqd->cp_hqd_eop_base_addr_hi); 2026 mqd->cp_hqd_eop_base_addr_hi);
2020 2027
2021 /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */ 2028 /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
2022 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_EOP_CONTROL), 2029 WREG32_SOC15(GC, 0, mmCP_HQD_EOP_CONTROL,
2023 mqd->cp_hqd_eop_control); 2030 mqd->cp_hqd_eop_control);
2024 2031
2025 /* enable doorbell? */ 2032 /* enable doorbell? */
2026 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL), 2033 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL,
2027 mqd->cp_hqd_pq_doorbell_control); 2034 mqd->cp_hqd_pq_doorbell_control);
2028 2035
2029 /* disable the queue if it's active */ 2036 /* disable the queue if it's active */
2030 if (RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE)) & 1) { 2037 if (RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE) & 1) {
2031 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_DEQUEUE_REQUEST), 1); 2038 WREG32_SOC15(GC, 0, mmCP_HQD_DEQUEUE_REQUEST, 1);
2032 for (j = 0; j < adev->usec_timeout; j++) { 2039 for (j = 0; j < adev->usec_timeout; j++) {
2033 if (!(RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE)) & 1)) 2040 if (!(RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE) & 1))
2034 break; 2041 break;
2035 udelay(1); 2042 udelay(1);
2036 } 2043 }
2037 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_DEQUEUE_REQUEST), 2044 WREG32_SOC15(GC, 0, mmCP_HQD_DEQUEUE_REQUEST,
2038 mqd->cp_hqd_dequeue_request); 2045 mqd->cp_hqd_dequeue_request);
2039 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_RPTR), 2046 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_RPTR,
2040 mqd->cp_hqd_pq_rptr); 2047 mqd->cp_hqd_pq_rptr);
2041 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_LO), 2048 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_LO,
2042 mqd->cp_hqd_pq_wptr_lo); 2049 mqd->cp_hqd_pq_wptr_lo);
2043 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_HI), 2050 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_HI,
2044 mqd->cp_hqd_pq_wptr_hi); 2051 mqd->cp_hqd_pq_wptr_hi);
2045 } 2052 }
2046 2053
2047 /* set the pointer to the MQD */ 2054 /* set the pointer to the MQD */
2048 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MQD_BASE_ADDR), 2055 WREG32_SOC15(GC, 0, mmCP_MQD_BASE_ADDR,
2049 mqd->cp_mqd_base_addr_lo); 2056 mqd->cp_mqd_base_addr_lo);
2050 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MQD_BASE_ADDR_HI), 2057 WREG32_SOC15(GC, 0, mmCP_MQD_BASE_ADDR_HI,
2051 mqd->cp_mqd_base_addr_hi); 2058 mqd->cp_mqd_base_addr_hi);
2052 2059
2053 /* set MQD vmid to 0 */ 2060 /* set MQD vmid to 0 */
2054 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MQD_CONTROL), 2061 WREG32_SOC15(GC, 0, mmCP_MQD_CONTROL,
2055 mqd->cp_mqd_control); 2062 mqd->cp_mqd_control);
2056 2063
2057 /* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */ 2064 /* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
2058 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_BASE), 2065 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_BASE,
2059 mqd->cp_hqd_pq_base_lo); 2066 mqd->cp_hqd_pq_base_lo);
2060 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_BASE_HI), 2067 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_BASE_HI,
2061 mqd->cp_hqd_pq_base_hi); 2068 mqd->cp_hqd_pq_base_hi);
2062 2069
2063 /* set up the HQD, this is similar to CP_RB0_CNTL */ 2070 /* set up the HQD, this is similar to CP_RB0_CNTL */
2064 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_CONTROL), 2071 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_CONTROL,
2065 mqd->cp_hqd_pq_control); 2072 mqd->cp_hqd_pq_control);
2066 2073
2067 /* set the wb address whether it's enabled or not */ 2074 /* set the wb address whether it's enabled or not */
2068 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_RPTR_REPORT_ADDR), 2075 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_RPTR_REPORT_ADDR,
2069 mqd->cp_hqd_pq_rptr_report_addr_lo); 2076 mqd->cp_hqd_pq_rptr_report_addr_lo);
2070 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_RPTR_REPORT_ADDR_HI), 2077 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_RPTR_REPORT_ADDR_HI,
2071 mqd->cp_hqd_pq_rptr_report_addr_hi); 2078 mqd->cp_hqd_pq_rptr_report_addr_hi);
2072 2079
2073 /* only used if CP_PQ_WPTR_POLL_CNTL.CP_PQ_WPTR_POLL_CNTL__EN_MASK=1 */ 2080 /* only used if CP_PQ_WPTR_POLL_CNTL.CP_PQ_WPTR_POLL_CNTL__EN_MASK=1 */
2074 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR), 2081 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR,
2075 mqd->cp_hqd_pq_wptr_poll_addr_lo); 2082 mqd->cp_hqd_pq_wptr_poll_addr_lo);
2076 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI), 2083 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI,
2077 mqd->cp_hqd_pq_wptr_poll_addr_hi); 2084 mqd->cp_hqd_pq_wptr_poll_addr_hi);
2078 2085
2079 /* enable the doorbell if requested */ 2086 /* enable the doorbell if requested */
2080 if (ring->use_doorbell) { 2087 if (ring->use_doorbell) {
2081 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEC_DOORBELL_RANGE_LOWER), 2088 WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_LOWER,
2082 (AMDGPU_DOORBELL64_KIQ *2) << 2); 2089 (AMDGPU_DOORBELL64_KIQ *2) << 2);
2083 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEC_DOORBELL_RANGE_UPPER), 2090 WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_UPPER,
2084 (AMDGPU_DOORBELL64_USERQUEUE_END * 2) << 2); 2091 (AMDGPU_DOORBELL64_USERQUEUE_END * 2) << 2);
2085 } 2092 }
2086 2093
2087 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL), 2094 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL,
2088 mqd->cp_hqd_pq_doorbell_control); 2095 mqd->cp_hqd_pq_doorbell_control);
2089 2096
2090 /* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */ 2097 /* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */
2091 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_LO), 2098 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_LO,
2092 mqd->cp_hqd_pq_wptr_lo); 2099 mqd->cp_hqd_pq_wptr_lo);
2093 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_HI), 2100 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_HI,
2094 mqd->cp_hqd_pq_wptr_hi); 2101 mqd->cp_hqd_pq_wptr_hi);
2095 2102
2096 /* set the vmid for the queue */ 2103 /* set the vmid for the queue */
2097 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_VMID), mqd->cp_hqd_vmid); 2104 WREG32_SOC15(GC, 0, mmCP_HQD_VMID, mqd->cp_hqd_vmid);
2098 2105
2099 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PERSISTENT_STATE), 2106 WREG32_SOC15(GC, 0, mmCP_HQD_PERSISTENT_STATE,
2100 mqd->cp_hqd_persistent_state); 2107 mqd->cp_hqd_persistent_state);
2101 2108
2102 /* activate the queue */ 2109 /* activate the queue */
2103 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE), 2110 WREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE,
2104 mqd->cp_hqd_active); 2111 mqd->cp_hqd_active);
2105 2112
2106 if (ring->use_doorbell) 2113 if (ring->use_doorbell)
@@ -2323,7 +2330,7 @@ static bool gfx_v9_0_is_idle(void *handle)
2323{ 2330{
2324 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2331 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2325 2332
2326 if (REG_GET_FIELD(RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS)), 2333 if (REG_GET_FIELD(RREG32_SOC15(GC, 0, mmGRBM_STATUS),
2327 GRBM_STATUS, GUI_ACTIVE)) 2334 GRBM_STATUS, GUI_ACTIVE))
2328 return false; 2335 return false;
2329 else 2336 else
@@ -2338,7 +2345,7 @@ static int gfx_v9_0_wait_for_idle(void *handle)
2338 2345
2339 for (i = 0; i < adev->usec_timeout; i++) { 2346 for (i = 0; i < adev->usec_timeout; i++) {
2340 /* read MC_STATUS */ 2347 /* read MC_STATUS */
2341 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS)) & 2348 tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS) &
2342 GRBM_STATUS__GUI_ACTIVE_MASK; 2349 GRBM_STATUS__GUI_ACTIVE_MASK;
2343 2350
2344 if (!REG_GET_FIELD(tmp, GRBM_STATUS, GUI_ACTIVE)) 2351 if (!REG_GET_FIELD(tmp, GRBM_STATUS, GUI_ACTIVE))
@@ -2355,7 +2362,7 @@ static int gfx_v9_0_soft_reset(void *handle)
2355 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2362 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2356 2363
2357 /* GRBM_STATUS */ 2364 /* GRBM_STATUS */
2358 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS)); 2365 tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS);
2359 if (tmp & (GRBM_STATUS__PA_BUSY_MASK | GRBM_STATUS__SC_BUSY_MASK | 2366 if (tmp & (GRBM_STATUS__PA_BUSY_MASK | GRBM_STATUS__SC_BUSY_MASK |
2360 GRBM_STATUS__BCI_BUSY_MASK | GRBM_STATUS__SX_BUSY_MASK | 2367 GRBM_STATUS__BCI_BUSY_MASK | GRBM_STATUS__SX_BUSY_MASK |
2361 GRBM_STATUS__TA_BUSY_MASK | GRBM_STATUS__VGT_BUSY_MASK | 2368 GRBM_STATUS__TA_BUSY_MASK | GRBM_STATUS__VGT_BUSY_MASK |
@@ -2374,7 +2381,7 @@ static int gfx_v9_0_soft_reset(void *handle)
2374 } 2381 }
2375 2382
2376 /* GRBM_STATUS2 */ 2383 /* GRBM_STATUS2 */
2377 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS2)); 2384 tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS2);
2378 if (REG_GET_FIELD(tmp, GRBM_STATUS2, RLC_BUSY)) 2385 if (REG_GET_FIELD(tmp, GRBM_STATUS2, RLC_BUSY))
2379 grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, 2386 grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
2380 GRBM_SOFT_RESET, SOFT_RESET_RLC, 1); 2387 GRBM_SOFT_RESET, SOFT_RESET_RLC, 1);
@@ -2391,17 +2398,17 @@ static int gfx_v9_0_soft_reset(void *handle)
2391 gfx_v9_0_cp_compute_enable(adev, false); 2398 gfx_v9_0_cp_compute_enable(adev, false);
2392 2399
2393 if (grbm_soft_reset) { 2400 if (grbm_soft_reset) {
2394 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_SOFT_RESET)); 2401 tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
2395 tmp |= grbm_soft_reset; 2402 tmp |= grbm_soft_reset;
2396 dev_info(adev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp); 2403 dev_info(adev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
2397 WREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_SOFT_RESET), tmp); 2404 WREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET, tmp);
2398 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_SOFT_RESET)); 2405 tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
2399 2406
2400 udelay(50); 2407 udelay(50);
2401 2408
2402 tmp &= ~grbm_soft_reset; 2409 tmp &= ~grbm_soft_reset;
2403 WREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_SOFT_RESET), tmp); 2410 WREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET, tmp);
2404 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_SOFT_RESET)); 2411 tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
2405 } 2412 }
2406 2413
2407 /* Wait a little for things to settle down */ 2414 /* Wait a little for things to settle down */
@@ -2415,9 +2422,9 @@ static uint64_t gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device *adev)
2415 uint64_t clock; 2422 uint64_t clock;
2416 2423
2417 mutex_lock(&adev->gfx.gpu_clock_mutex); 2424 mutex_lock(&adev->gfx.gpu_clock_mutex);
2418 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CAPTURE_GPU_CLOCK_COUNT), 1); 2425 WREG32_SOC15(GC, 0, mmRLC_CAPTURE_GPU_CLOCK_COUNT, 1);
2419 clock = (uint64_t)RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPU_CLOCK_COUNT_LSB)) | 2426 clock = (uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_LSB) |
2420 ((uint64_t)RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPU_CLOCK_COUNT_MSB)) << 32ULL); 2427 ((uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
2421 mutex_unlock(&adev->gfx.gpu_clock_mutex); 2428 mutex_unlock(&adev->gfx.gpu_clock_mutex);
2422 return clock; 2429 return clock;
2423} 2430}
@@ -2497,7 +2504,7 @@ static void gfx_v9_0_enter_rlc_safe_mode(struct amdgpu_device *adev)
2497 return; 2504 return;
2498 2505
2499 /* if RLC is not enabled, do nothing */ 2506 /* if RLC is not enabled, do nothing */
2500 rlc_setting = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CNTL)); 2507 rlc_setting = RREG32_SOC15(GC, 0, mmRLC_CNTL);
2501 if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK)) 2508 if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK))
2502 return; 2509 return;
2503 2510
@@ -2506,7 +2513,7 @@ static void gfx_v9_0_enter_rlc_safe_mode(struct amdgpu_device *adev)
2506 AMD_CG_SUPPORT_GFX_3D_CGCG)) { 2513 AMD_CG_SUPPORT_GFX_3D_CGCG)) {
2507 data = RLC_SAFE_MODE__CMD_MASK; 2514 data = RLC_SAFE_MODE__CMD_MASK;
2508 data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT); 2515 data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT);
2509 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SAFE_MODE), data); 2516 WREG32_SOC15(GC, 0, mmRLC_SAFE_MODE, data);
2510 2517
2511 /* wait for RLC_SAFE_MODE */ 2518 /* wait for RLC_SAFE_MODE */
2512 for (i = 0; i < adev->usec_timeout; i++) { 2519 for (i = 0; i < adev->usec_timeout; i++) {
@@ -2526,7 +2533,7 @@ static void gfx_v9_0_exit_rlc_safe_mode(struct amdgpu_device *adev)
2526 return; 2533 return;
2527 2534
2528 /* if RLC is not enabled, do nothing */ 2535 /* if RLC is not enabled, do nothing */
2529 rlc_setting = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CNTL)); 2536 rlc_setting = RREG32_SOC15(GC, 0, mmRLC_CNTL);
2530 if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK)) 2537 if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK))
2531 return; 2538 return;
2532 2539
@@ -2537,7 +2544,7 @@ static void gfx_v9_0_exit_rlc_safe_mode(struct amdgpu_device *adev)
2537 * mode. 2544 * mode.
2538 */ 2545 */
2539 data = RLC_SAFE_MODE__CMD_MASK; 2546 data = RLC_SAFE_MODE__CMD_MASK;
2540 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SAFE_MODE), data); 2547 WREG32_SOC15(GC, 0, mmRLC_SAFE_MODE, data);
2541 adev->gfx.rlc.in_safe_mode = false; 2548 adev->gfx.rlc.in_safe_mode = false;
2542 } 2549 }
2543} 2550}
@@ -2550,7 +2557,7 @@ static void gfx_v9_0_update_medium_grain_clock_gating(struct amdgpu_device *adev
2550 /* It is disabled by HW by default */ 2557 /* It is disabled by HW by default */
2551 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) { 2558 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) {
2552 /* 1 - RLC_CGTT_MGCG_OVERRIDE */ 2559 /* 1 - RLC_CGTT_MGCG_OVERRIDE */
2553 def = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE)); 2560 def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE);
2554 data &= ~(RLC_CGTT_MGCG_OVERRIDE__CPF_CGTT_SCLK_OVERRIDE_MASK | 2561 data &= ~(RLC_CGTT_MGCG_OVERRIDE__CPF_CGTT_SCLK_OVERRIDE_MASK |
2555 RLC_CGTT_MGCG_OVERRIDE__GRBM_CGTT_SCLK_OVERRIDE_MASK | 2562 RLC_CGTT_MGCG_OVERRIDE__GRBM_CGTT_SCLK_OVERRIDE_MASK |
2556 RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK | 2563 RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK |
@@ -2560,48 +2567,48 @@ static void gfx_v9_0_update_medium_grain_clock_gating(struct amdgpu_device *adev
2560 data |= RLC_CGTT_MGCG_OVERRIDE__RLC_CGTT_SCLK_OVERRIDE_MASK; 2567 data |= RLC_CGTT_MGCG_OVERRIDE__RLC_CGTT_SCLK_OVERRIDE_MASK;
2561 2568
2562 if (def != data) 2569 if (def != data)
2563 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE), data); 2570 WREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE, data);
2564 2571
2565 /* MGLS is a global flag to control all MGLS in GFX */ 2572 /* MGLS is a global flag to control all MGLS in GFX */
2566 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) { 2573 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) {
2567 /* 2 - RLC memory Light sleep */ 2574 /* 2 - RLC memory Light sleep */
2568 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_RLC_LS) { 2575 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_RLC_LS) {
2569 def = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_MEM_SLP_CNTL)); 2576 def = data = RREG32_SOC15(GC, 0, mmRLC_MEM_SLP_CNTL);
2570 data |= RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK; 2577 data |= RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK;
2571 if (def != data) 2578 if (def != data)
2572 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_MEM_SLP_CNTL), data); 2579 WREG32_SOC15(GC, 0, mmRLC_MEM_SLP_CNTL, data);
2573 } 2580 }
2574 /* 3 - CP memory Light sleep */ 2581 /* 3 - CP memory Light sleep */
2575 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) { 2582 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) {
2576 def = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEM_SLP_CNTL)); 2583 def = data = RREG32_SOC15(GC, 0, mmCP_MEM_SLP_CNTL);
2577 data |= CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK; 2584 data |= CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK;
2578 if (def != data) 2585 if (def != data)
2579 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEM_SLP_CNTL), data); 2586 WREG32_SOC15(GC, 0, mmCP_MEM_SLP_CNTL, data);
2580 } 2587 }
2581 } 2588 }
2582 } else { 2589 } else {
2583 /* 1 - MGCG_OVERRIDE */ 2590 /* 1 - MGCG_OVERRIDE */
2584 def = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE)); 2591 def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE);
2585 data |= (RLC_CGTT_MGCG_OVERRIDE__CPF_CGTT_SCLK_OVERRIDE_MASK | 2592 data |= (RLC_CGTT_MGCG_OVERRIDE__CPF_CGTT_SCLK_OVERRIDE_MASK |
2586 RLC_CGTT_MGCG_OVERRIDE__RLC_CGTT_SCLK_OVERRIDE_MASK | 2593 RLC_CGTT_MGCG_OVERRIDE__RLC_CGTT_SCLK_OVERRIDE_MASK |
2587 RLC_CGTT_MGCG_OVERRIDE__GRBM_CGTT_SCLK_OVERRIDE_MASK | 2594 RLC_CGTT_MGCG_OVERRIDE__GRBM_CGTT_SCLK_OVERRIDE_MASK |
2588 RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK | 2595 RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK |
2589 RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGLS_OVERRIDE_MASK); 2596 RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGLS_OVERRIDE_MASK);
2590 if (def != data) 2597 if (def != data)
2591 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE), data); 2598 WREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE, data);
2592 2599
2593 /* 2 - disable MGLS in RLC */ 2600 /* 2 - disable MGLS in RLC */
2594 data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_MEM_SLP_CNTL)); 2601 data = RREG32_SOC15(GC, 0, mmRLC_MEM_SLP_CNTL);
2595 if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK) { 2602 if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK) {
2596 data &= ~RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK; 2603 data &= ~RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK;
2597 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_MEM_SLP_CNTL), data); 2604 WREG32_SOC15(GC, 0, mmRLC_MEM_SLP_CNTL, data);
2598 } 2605 }
2599 2606
2600 /* 3 - disable MGLS in CP */ 2607 /* 3 - disable MGLS in CP */
2601 data = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEM_SLP_CNTL)); 2608 data = RREG32_SOC15(GC, 0, mmCP_MEM_SLP_CNTL);
2602 if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK) { 2609 if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK) {
2603 data &= ~CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK; 2610 data &= ~CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK;
2604 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEM_SLP_CNTL), data); 2611 WREG32_SOC15(GC, 0, mmCP_MEM_SLP_CNTL, data);
2605 } 2612 }
2606 } 2613 }
2607} 2614}
@@ -2616,37 +2623,37 @@ static void gfx_v9_0_update_3d_clock_gating(struct amdgpu_device *adev,
2616 /* Enable 3D CGCG/CGLS */ 2623 /* Enable 3D CGCG/CGLS */
2617 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGCG)) { 2624 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGCG)) {
2618 /* write cmd to clear cgcg/cgls ov */ 2625 /* write cmd to clear cgcg/cgls ov */
2619 def = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE)); 2626 def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE);
2620 /* unset CGCG override */ 2627 /* unset CGCG override */
2621 data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_GFX3D_CG_OVERRIDE_MASK; 2628 data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_GFX3D_CG_OVERRIDE_MASK;
2622 /* update CGCG and CGLS override bits */ 2629 /* update CGCG and CGLS override bits */
2623 if (def != data) 2630 if (def != data)
2624 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE), data); 2631 WREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE, data);
2625 /* enable 3Dcgcg FSM(0x0020003f) */ 2632 /* enable 3Dcgcg FSM(0x0020003f) */
2626 def = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D)); 2633 def = RREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D);
2627 data = (0x2000 << RLC_CGCG_CGLS_CTRL_3D__CGCG_GFX_IDLE_THRESHOLD__SHIFT) | 2634 data = (0x2000 << RLC_CGCG_CGLS_CTRL_3D__CGCG_GFX_IDLE_THRESHOLD__SHIFT) |
2628 RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK; 2635 RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK;
2629 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGLS) 2636 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGLS)
2630 data |= (0x000F << RLC_CGCG_CGLS_CTRL_3D__CGLS_REP_COMPANSAT_DELAY__SHIFT) | 2637 data |= (0x000F << RLC_CGCG_CGLS_CTRL_3D__CGLS_REP_COMPANSAT_DELAY__SHIFT) |
2631 RLC_CGCG_CGLS_CTRL_3D__CGLS_EN_MASK; 2638 RLC_CGCG_CGLS_CTRL_3D__CGLS_EN_MASK;
2632 if (def != data) 2639 if (def != data)
2633 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D), data); 2640 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D, data);
2634 2641
2635 /* set IDLE_POLL_COUNT(0x00900100) */ 2642 /* set IDLE_POLL_COUNT(0x00900100) */
2636 def = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_WPTR_POLL_CNTL)); 2643 def = RREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_CNTL);
2637 data = (0x0100 << CP_RB_WPTR_POLL_CNTL__POLL_FREQUENCY__SHIFT) | 2644 data = (0x0100 << CP_RB_WPTR_POLL_CNTL__POLL_FREQUENCY__SHIFT) |
2638 (0x0090 << CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT); 2645 (0x0090 << CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT);
2639 if (def != data) 2646 if (def != data)
2640 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_WPTR_POLL_CNTL), data); 2647 WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_CNTL, data);
2641 } else { 2648 } else {
2642 /* Disable CGCG/CGLS */ 2649 /* Disable CGCG/CGLS */
2643 def = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D)); 2650 def = data = RREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D);
2644 /* disable cgcg, cgls should be disabled */ 2651 /* disable cgcg, cgls should be disabled */
2645 data &= ~(RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK | 2652 data &= ~(RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK |
2646 RLC_CGCG_CGLS_CTRL_3D__CGLS_EN_MASK); 2653 RLC_CGCG_CGLS_CTRL_3D__CGLS_EN_MASK);
2647 /* disable cgcg and cgls in FSM */ 2654 /* disable cgcg and cgls in FSM */
2648 if (def != data) 2655 if (def != data)
2649 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D), data); 2656 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D, data);
2650 } 2657 }
2651 2658
2652 adev->gfx.rlc.funcs->exit_safe_mode(adev); 2659 adev->gfx.rlc.funcs->exit_safe_mode(adev);
@@ -2660,7 +2667,7 @@ static void gfx_v9_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev
2660 adev->gfx.rlc.funcs->enter_safe_mode(adev); 2667 adev->gfx.rlc.funcs->enter_safe_mode(adev);
2661 2668
2662 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) { 2669 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {
2663 def = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE)); 2670 def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE);
2664 /* unset CGCG override */ 2671 /* unset CGCG override */
2665 data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGCG_OVERRIDE_MASK; 2672 data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGCG_OVERRIDE_MASK;
2666 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS) 2673 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS)
@@ -2669,31 +2676,31 @@ static void gfx_v9_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev
2669 data |= RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGLS_OVERRIDE_MASK; 2676 data |= RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGLS_OVERRIDE_MASK;
2670 /* update CGCG and CGLS override bits */ 2677 /* update CGCG and CGLS override bits */
2671 if (def != data) 2678 if (def != data)
2672 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE), data); 2679 WREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE, data);
2673 2680
2674 /* enable cgcg FSM(0x0020003F) */ 2681 /* enable cgcg FSM(0x0020003F) */
2675 def = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL)); 2682 def = RREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL);
2676 data = (0x2000 << RLC_CGCG_CGLS_CTRL__CGCG_GFX_IDLE_THRESHOLD__SHIFT) | 2683 data = (0x2000 << RLC_CGCG_CGLS_CTRL__CGCG_GFX_IDLE_THRESHOLD__SHIFT) |
2677 RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK; 2684 RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK;
2678 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS) 2685 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS)
2679 data |= (0x000F << RLC_CGCG_CGLS_CTRL__CGLS_REP_COMPANSAT_DELAY__SHIFT) | 2686 data |= (0x000F << RLC_CGCG_CGLS_CTRL__CGLS_REP_COMPANSAT_DELAY__SHIFT) |
2680 RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK; 2687 RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK;
2681 if (def != data) 2688 if (def != data)
2682 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL), data); 2689 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, data);
2683 2690
2684 /* set IDLE_POLL_COUNT(0x00900100) */ 2691 /* set IDLE_POLL_COUNT(0x00900100) */
2685 def = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_WPTR_POLL_CNTL)); 2692 def = RREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_CNTL);
2686 data = (0x0100 << CP_RB_WPTR_POLL_CNTL__POLL_FREQUENCY__SHIFT) | 2693 data = (0x0100 << CP_RB_WPTR_POLL_CNTL__POLL_FREQUENCY__SHIFT) |
2687 (0x0090 << CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT); 2694 (0x0090 << CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT);
2688 if (def != data) 2695 if (def != data)
2689 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_WPTR_POLL_CNTL), data); 2696 WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_CNTL, data);
2690 } else { 2697 } else {
2691 def = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL)); 2698 def = data = RREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL);
2692 /* reset CGCG/CGLS bits */ 2699 /* reset CGCG/CGLS bits */
2693 data &= ~(RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK | RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK); 2700 data &= ~(RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK | RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK);
2694 /* disable cgcg and cgls in FSM */ 2701 /* disable cgcg and cgls in FSM */
2695 if (def != data) 2702 if (def != data)
2696 WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL), data); 2703 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, data);
2697 } 2704 }
2698 2705
2699 adev->gfx.rlc.funcs->exit_safe_mode(adev); 2706 adev->gfx.rlc.funcs->exit_safe_mode(adev);
@@ -2740,6 +2747,9 @@ static int gfx_v9_0_set_clockgating_state(void *handle,
2740{ 2747{
2741 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2748 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2742 2749
2750 if (amdgpu_sriov_vf(adev))
2751 return 0;
2752
2743 switch (adev->asic_type) { 2753 switch (adev->asic_type) {
2744 case CHIP_VEGA10: 2754 case CHIP_VEGA10:
2745 gfx_v9_0_update_gfx_clock_gating(adev, 2755 gfx_v9_0_update_gfx_clock_gating(adev,
@@ -2760,12 +2770,12 @@ static void gfx_v9_0_get_clockgating_state(void *handle, u32 *flags)
2760 *flags = 0; 2770 *flags = 0;
2761 2771
2762 /* AMD_CG_SUPPORT_GFX_MGCG */ 2772 /* AMD_CG_SUPPORT_GFX_MGCG */
2763 data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE)); 2773 data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE);
2764 if (!(data & RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK)) 2774 if (!(data & RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK))
2765 *flags |= AMD_CG_SUPPORT_GFX_MGCG; 2775 *flags |= AMD_CG_SUPPORT_GFX_MGCG;
2766 2776
2767 /* AMD_CG_SUPPORT_GFX_CGCG */ 2777 /* AMD_CG_SUPPORT_GFX_CGCG */
2768 data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL)); 2778 data = RREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL);
2769 if (data & RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK) 2779 if (data & RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK)
2770 *flags |= AMD_CG_SUPPORT_GFX_CGCG; 2780 *flags |= AMD_CG_SUPPORT_GFX_CGCG;
2771 2781
@@ -2774,17 +2784,17 @@ static void gfx_v9_0_get_clockgating_state(void *handle, u32 *flags)
2774 *flags |= AMD_CG_SUPPORT_GFX_CGLS; 2784 *flags |= AMD_CG_SUPPORT_GFX_CGLS;
2775 2785
2776 /* AMD_CG_SUPPORT_GFX_RLC_LS */ 2786 /* AMD_CG_SUPPORT_GFX_RLC_LS */
2777 data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_MEM_SLP_CNTL)); 2787 data = RREG32_SOC15(GC, 0, mmRLC_MEM_SLP_CNTL);
2778 if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK) 2788 if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK)
2779 *flags |= AMD_CG_SUPPORT_GFX_RLC_LS | AMD_CG_SUPPORT_GFX_MGLS; 2789 *flags |= AMD_CG_SUPPORT_GFX_RLC_LS | AMD_CG_SUPPORT_GFX_MGLS;
2780 2790
2781 /* AMD_CG_SUPPORT_GFX_CP_LS */ 2791 /* AMD_CG_SUPPORT_GFX_CP_LS */
2782 data = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEM_SLP_CNTL)); 2792 data = RREG32_SOC15(GC, 0, mmCP_MEM_SLP_CNTL);
2783 if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK) 2793 if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK)
2784 *flags |= AMD_CG_SUPPORT_GFX_CP_LS | AMD_CG_SUPPORT_GFX_MGLS; 2794 *flags |= AMD_CG_SUPPORT_GFX_CP_LS | AMD_CG_SUPPORT_GFX_MGLS;
2785 2795
2786 /* AMD_CG_SUPPORT_GFX_3D_CGCG */ 2796 /* AMD_CG_SUPPORT_GFX_3D_CGCG */
2787 data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D)); 2797 data = RREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D);
2788 if (data & RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK) 2798 if (data & RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK)
2789 *flags |= AMD_CG_SUPPORT_GFX_3D_CGCG; 2799 *flags |= AMD_CG_SUPPORT_GFX_3D_CGCG;
2790 2800
@@ -2807,8 +2817,8 @@ static u64 gfx_v9_0_ring_get_wptr_gfx(struct amdgpu_ring *ring)
2807 if (ring->use_doorbell) { 2817 if (ring->use_doorbell) {
2808 wptr = atomic64_read((atomic64_t *)&adev->wb.wb[ring->wptr_offs]); 2818 wptr = atomic64_read((atomic64_t *)&adev->wb.wb[ring->wptr_offs]);
2809 } else { 2819 } else {
2810 wptr = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_WPTR)); 2820 wptr = RREG32_SOC15(GC, 0, mmCP_RB0_WPTR);
2811 wptr += (u64)RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_WPTR_HI)) << 32; 2821 wptr += (u64)RREG32_SOC15(GC, 0, mmCP_RB0_WPTR_HI) << 32;
2812 } 2822 }
2813 2823
2814 return wptr; 2824 return wptr;
@@ -2823,8 +2833,8 @@ static void gfx_v9_0_ring_set_wptr_gfx(struct amdgpu_ring *ring)
2823 atomic64_set((atomic64_t*)&adev->wb.wb[ring->wptr_offs], ring->wptr); 2833 atomic64_set((atomic64_t*)&adev->wb.wb[ring->wptr_offs], ring->wptr);
2824 WDOORBELL64(ring->doorbell_index, ring->wptr); 2834 WDOORBELL64(ring->doorbell_index, ring->wptr);
2825 } else { 2835 } else {
2826 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_WPTR), lower_32_bits(ring->wptr)); 2836 WREG32_SOC15(GC, 0, mmCP_RB0_WPTR, lower_32_bits(ring->wptr));
2827 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_WPTR_HI), upper_32_bits(ring->wptr)); 2837 WREG32_SOC15(GC, 0, mmCP_RB0_WPTR_HI, upper_32_bits(ring->wptr));
2828 } 2838 }
2829} 2839}
2830 2840
@@ -2956,35 +2966,29 @@ static void gfx_v9_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
2956static void gfx_v9_0_ring_emit_vm_flush(struct amdgpu_ring *ring, 2966static void gfx_v9_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
2957 unsigned vm_id, uint64_t pd_addr) 2967 unsigned vm_id, uint64_t pd_addr)
2958{ 2968{
2969 struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
2959 int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX); 2970 int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX);
2960 uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); 2971 uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id);
2961 unsigned eng = ring->idx; 2972 unsigned eng = ring->vm_inv_eng;
2962 unsigned i;
2963 2973
2964 pd_addr = pd_addr | 0x1; /* valid bit */ 2974 pd_addr = pd_addr | 0x1; /* valid bit */
2965 /* now only use physical base address of PDE and valid */ 2975 /* now only use physical base address of PDE and valid */
2966 BUG_ON(pd_addr & 0xFFFF00000000003EULL); 2976 BUG_ON(pd_addr & 0xFFFF00000000003EULL);
2967 2977
2968 for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { 2978 gfx_v9_0_write_data_to_reg(ring, usepfp, true,
2969 struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; 2979 hub->ctx0_ptb_addr_lo32 + (2 * vm_id),
2970 2980 lower_32_bits(pd_addr));
2971 gfx_v9_0_write_data_to_reg(ring, usepfp, true,
2972 hub->ctx0_ptb_addr_lo32
2973 + (2 * vm_id),
2974 lower_32_bits(pd_addr));
2975 2981
2976 gfx_v9_0_write_data_to_reg(ring, usepfp, true, 2982 gfx_v9_0_write_data_to_reg(ring, usepfp, true,
2977 hub->ctx0_ptb_addr_hi32 2983 hub->ctx0_ptb_addr_hi32 + (2 * vm_id),
2978 + (2 * vm_id), 2984 upper_32_bits(pd_addr));
2979 upper_32_bits(pd_addr));
2980 2985
2981 gfx_v9_0_write_data_to_reg(ring, usepfp, true, 2986 gfx_v9_0_write_data_to_reg(ring, usepfp, true,
2982 hub->vm_inv_eng0_req + eng, req); 2987 hub->vm_inv_eng0_req + eng, req);
2983 2988
2984 /* wait for the invalidate to complete */ 2989 /* wait for the invalidate to complete */
2985 gfx_v9_0_wait_reg_mem(ring, 0, 0, 0, hub->vm_inv_eng0_ack + 2990 gfx_v9_0_wait_reg_mem(ring, 0, 0, 0, hub->vm_inv_eng0_ack +
2986 eng, 0, 1 << vm_id, 1 << vm_id, 0x20); 2991 eng, 0, 1 << vm_id, 1 << vm_id, 0x20);
2987 }
2988 2992
2989 /* compute doesn't have PFP */ 2993 /* compute doesn't have PFP */
2990 if (usepfp) { 2994 if (usepfp) {
@@ -3373,9 +3377,7 @@ static int gfx_v9_0_kiq_set_interrupt_state(struct amdgpu_device *adev,
3373 enum amdgpu_interrupt_state state) 3377 enum amdgpu_interrupt_state state)
3374{ 3378{
3375 uint32_t tmp, target; 3379 uint32_t tmp, target;
3376 struct amdgpu_ring *ring = (struct amdgpu_ring *)src->data; 3380 struct amdgpu_ring *ring = &(adev->gfx.kiq.ring);
3377
3378 BUG_ON(!ring || (ring->funcs->type != AMDGPU_RING_TYPE_KIQ));
3379 3381
3380 if (ring->me == 1) 3382 if (ring->me == 1)
3381 target = SOC15_REG_OFFSET(GC, 0, mmCP_ME1_PIPE0_INT_CNTL); 3383 target = SOC15_REG_OFFSET(GC, 0, mmCP_ME1_PIPE0_INT_CNTL);
@@ -3386,20 +3388,20 @@ static int gfx_v9_0_kiq_set_interrupt_state(struct amdgpu_device *adev,
3386 switch (type) { 3388 switch (type) {
3387 case AMDGPU_CP_KIQ_IRQ_DRIVER0: 3389 case AMDGPU_CP_KIQ_IRQ_DRIVER0:
3388 if (state == AMDGPU_IRQ_STATE_DISABLE) { 3390 if (state == AMDGPU_IRQ_STATE_DISABLE) {
3389 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCPC_INT_CNTL)); 3391 tmp = RREG32_SOC15(GC, 0, mmCPC_INT_CNTL);
3390 tmp = REG_SET_FIELD(tmp, CPC_INT_CNTL, 3392 tmp = REG_SET_FIELD(tmp, CPC_INT_CNTL,
3391 GENERIC2_INT_ENABLE, 0); 3393 GENERIC2_INT_ENABLE, 0);
3392 WREG32(SOC15_REG_OFFSET(GC, 0, mmCPC_INT_CNTL), tmp); 3394 WREG32_SOC15(GC, 0, mmCPC_INT_CNTL, tmp);
3393 3395
3394 tmp = RREG32(target); 3396 tmp = RREG32(target);
3395 tmp = REG_SET_FIELD(tmp, CP_ME2_PIPE0_INT_CNTL, 3397 tmp = REG_SET_FIELD(tmp, CP_ME2_PIPE0_INT_CNTL,
3396 GENERIC2_INT_ENABLE, 0); 3398 GENERIC2_INT_ENABLE, 0);
3397 WREG32(target, tmp); 3399 WREG32(target, tmp);
3398 } else { 3400 } else {
3399 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCPC_INT_CNTL)); 3401 tmp = RREG32_SOC15(GC, 0, mmCPC_INT_CNTL);
3400 tmp = REG_SET_FIELD(tmp, CPC_INT_CNTL, 3402 tmp = REG_SET_FIELD(tmp, CPC_INT_CNTL,
3401 GENERIC2_INT_ENABLE, 1); 3403 GENERIC2_INT_ENABLE, 1);
3402 WREG32(SOC15_REG_OFFSET(GC, 0, mmCPC_INT_CNTL), tmp); 3404 WREG32_SOC15(GC, 0, mmCPC_INT_CNTL, tmp);
3403 3405
3404 tmp = RREG32(target); 3406 tmp = RREG32(target);
3405 tmp = REG_SET_FIELD(tmp, CP_ME2_PIPE0_INT_CNTL, 3407 tmp = REG_SET_FIELD(tmp, CP_ME2_PIPE0_INT_CNTL,
@@ -3419,9 +3421,7 @@ static int gfx_v9_0_kiq_irq(struct amdgpu_device *adev,
3419 struct amdgpu_iv_entry *entry) 3421 struct amdgpu_iv_entry *entry)
3420{ 3422{
3421 u8 me_id, pipe_id, queue_id; 3423 u8 me_id, pipe_id, queue_id;
3422 struct amdgpu_ring *ring = (struct amdgpu_ring *)source->data; 3424 struct amdgpu_ring *ring = &(adev->gfx.kiq.ring);
3423
3424 BUG_ON(!ring || (ring->funcs->type != AMDGPU_RING_TYPE_KIQ));
3425 3425
3426 me_id = (entry->ring_id & 0x0c) >> 2; 3426 me_id = (entry->ring_id & 0x0c) >> 2;
3427 pipe_id = (entry->ring_id & 0x03) >> 0; 3427 pipe_id = (entry->ring_id & 0x03) >> 0;
@@ -3456,13 +3456,14 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_gfx = {
3456 .align_mask = 0xff, 3456 .align_mask = 0xff,
3457 .nop = PACKET3(PACKET3_NOP, 0x3FFF), 3457 .nop = PACKET3(PACKET3_NOP, 0x3FFF),
3458 .support_64bit_ptrs = true, 3458 .support_64bit_ptrs = true,
3459 .vmhub = AMDGPU_GFXHUB,
3459 .get_rptr = gfx_v9_0_ring_get_rptr_gfx, 3460 .get_rptr = gfx_v9_0_ring_get_rptr_gfx,
3460 .get_wptr = gfx_v9_0_ring_get_wptr_gfx, 3461 .get_wptr = gfx_v9_0_ring_get_wptr_gfx,
3461 .set_wptr = gfx_v9_0_ring_set_wptr_gfx, 3462 .set_wptr = gfx_v9_0_ring_set_wptr_gfx,
3462 .emit_frame_size = /* totally 242 maximum if 16 IBs */ 3463 .emit_frame_size = /* totally 242 maximum if 16 IBs */
3463 5 + /* COND_EXEC */ 3464 5 + /* COND_EXEC */
3464 7 + /* PIPELINE_SYNC */ 3465 7 + /* PIPELINE_SYNC */
3465 46 + /* VM_FLUSH */ 3466 24 + /* VM_FLUSH */
3466 8 + /* FENCE for VM_FLUSH */ 3467 8 + /* FENCE for VM_FLUSH */
3467 20 + /* GDS switch */ 3468 20 + /* GDS switch */
3468 4 + /* double SWITCH_BUFFER, 3469 4 + /* double SWITCH_BUFFER,
@@ -3500,6 +3501,7 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {
3500 .align_mask = 0xff, 3501 .align_mask = 0xff,
3501 .nop = PACKET3(PACKET3_NOP, 0x3FFF), 3502 .nop = PACKET3(PACKET3_NOP, 0x3FFF),
3502 .support_64bit_ptrs = true, 3503 .support_64bit_ptrs = true,
3504 .vmhub = AMDGPU_GFXHUB,
3503 .get_rptr = gfx_v9_0_ring_get_rptr_compute, 3505 .get_rptr = gfx_v9_0_ring_get_rptr_compute,
3504 .get_wptr = gfx_v9_0_ring_get_wptr_compute, 3506 .get_wptr = gfx_v9_0_ring_get_wptr_compute,
3505 .set_wptr = gfx_v9_0_ring_set_wptr_compute, 3507 .set_wptr = gfx_v9_0_ring_set_wptr_compute,
@@ -3508,7 +3510,7 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {
3508 7 + /* gfx_v9_0_ring_emit_hdp_flush */ 3510 7 + /* gfx_v9_0_ring_emit_hdp_flush */
3509 5 + /* gfx_v9_0_ring_emit_hdp_invalidate */ 3511 5 + /* gfx_v9_0_ring_emit_hdp_invalidate */
3510 7 + /* gfx_v9_0_ring_emit_pipeline_sync */ 3512 7 + /* gfx_v9_0_ring_emit_pipeline_sync */
3511 64 + /* gfx_v9_0_ring_emit_vm_flush */ 3513 24 + /* gfx_v9_0_ring_emit_vm_flush */
3512 8 + 8 + 8, /* gfx_v9_0_ring_emit_fence x3 for user fence, vm fence */ 3514 8 + 8 + 8, /* gfx_v9_0_ring_emit_fence x3 for user fence, vm fence */
3513 .emit_ib_size = 4, /* gfx_v9_0_ring_emit_ib_compute */ 3515 .emit_ib_size = 4, /* gfx_v9_0_ring_emit_ib_compute */
3514 .emit_ib = gfx_v9_0_ring_emit_ib_compute, 3516 .emit_ib = gfx_v9_0_ring_emit_ib_compute,
@@ -3529,6 +3531,7 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_kiq = {
3529 .align_mask = 0xff, 3531 .align_mask = 0xff,
3530 .nop = PACKET3(PACKET3_NOP, 0x3FFF), 3532 .nop = PACKET3(PACKET3_NOP, 0x3FFF),
3531 .support_64bit_ptrs = true, 3533 .support_64bit_ptrs = true,
3534 .vmhub = AMDGPU_GFXHUB,
3532 .get_rptr = gfx_v9_0_ring_get_rptr_compute, 3535 .get_rptr = gfx_v9_0_ring_get_rptr_compute,
3533 .get_wptr = gfx_v9_0_ring_get_wptr_compute, 3536 .get_wptr = gfx_v9_0_ring_get_wptr_compute,
3534 .set_wptr = gfx_v9_0_ring_set_wptr_compute, 3537 .set_wptr = gfx_v9_0_ring_set_wptr_compute,
@@ -3537,7 +3540,7 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_kiq = {
3537 7 + /* gfx_v9_0_ring_emit_hdp_flush */ 3540 7 + /* gfx_v9_0_ring_emit_hdp_flush */
3538 5 + /* gfx_v9_0_ring_emit_hdp_invalidate */ 3541 5 + /* gfx_v9_0_ring_emit_hdp_invalidate */
3539 7 + /* gfx_v9_0_ring_emit_pipeline_sync */ 3542 7 + /* gfx_v9_0_ring_emit_pipeline_sync */
3540 64 + /* gfx_v9_0_ring_emit_vm_flush */ 3543 24 + /* gfx_v9_0_ring_emit_vm_flush */
3541 8 + 8 + 8, /* gfx_v9_0_ring_emit_fence_kiq x3 for user fence, vm fence */ 3544 8 + 8 + 8, /* gfx_v9_0_ring_emit_fence_kiq x3 for user fence, vm fence */
3542 .emit_ib_size = 4, /* gfx_v9_0_ring_emit_ib_compute */ 3545 .emit_ib_size = 4, /* gfx_v9_0_ring_emit_ib_compute */
3543 .emit_ib = gfx_v9_0_ring_emit_ib_compute, 3546 .emit_ib = gfx_v9_0_ring_emit_ib_compute,
@@ -3612,7 +3615,7 @@ static void gfx_v9_0_set_rlc_funcs(struct amdgpu_device *adev)
3612static void gfx_v9_0_set_gds_init(struct amdgpu_device *adev) 3615static void gfx_v9_0_set_gds_init(struct amdgpu_device *adev)
3613{ 3616{
3614 /* init asci gds info */ 3617 /* init asci gds info */
3615 adev->gds.mem.total_size = RREG32(SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_SIZE)); 3618 adev->gds.mem.total_size = RREG32_SOC15(GC, 0, mmGDS_VMID0_SIZE);
3616 adev->gds.gws.total_size = 64; 3619 adev->gds.gws.total_size = 64;
3617 adev->gds.oa.total_size = 16; 3620 adev->gds.oa.total_size = 16;
3618 3621
@@ -3641,8 +3644,8 @@ static u32 gfx_v9_0_get_cu_active_bitmap(struct amdgpu_device *adev)
3641{ 3644{
3642 u32 data, mask; 3645 u32 data, mask;
3643 3646
3644 data = RREG32(SOC15_REG_OFFSET(GC, 0, mmCC_GC_SHADER_ARRAY_CONFIG)); 3647 data = RREG32_SOC15(GC, 0, mmCC_GC_SHADER_ARRAY_CONFIG);
3645 data |= RREG32(SOC15_REG_OFFSET(GC, 0, mmGC_USER_SHADER_ARRAY_CONFIG)); 3648 data |= RREG32_SOC15(GC, 0, mmGC_USER_SHADER_ARRAY_CONFIG);
3646 3649
3647 data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK; 3650 data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK;
3648 data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT; 3651 data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT;
@@ -3763,25 +3766,25 @@ static int gfx_v9_0_init_queue(struct amdgpu_ring *ring)
3763 eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr + (ring->queue * MEC_HPD_SIZE); 3766 eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr + (ring->queue * MEC_HPD_SIZE);
3764 eop_gpu_addr >>= 8; 3767 eop_gpu_addr >>= 8;
3765 3768
3766 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_EOP_BASE_ADDR), lower_32_bits(eop_gpu_addr)); 3769 WREG32_SOC15(GC, 0, mmCP_HQD_EOP_BASE_ADDR, lower_32_bits(eop_gpu_addr));
3767 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_EOP_BASE_ADDR_HI), upper_32_bits(eop_gpu_addr)); 3770 WREG32_SOC15(GC, 0, mmCP_HQD_EOP_BASE_ADDR_HI, upper_32_bits(eop_gpu_addr));
3768 mqd->cp_hqd_eop_base_addr_lo = lower_32_bits(eop_gpu_addr); 3771 mqd->cp_hqd_eop_base_addr_lo = lower_32_bits(eop_gpu_addr);
3769 mqd->cp_hqd_eop_base_addr_hi = upper_32_bits(eop_gpu_addr); 3772 mqd->cp_hqd_eop_base_addr_hi = upper_32_bits(eop_gpu_addr);
3770 3773
3771 /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */ 3774 /* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
3772 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_EOP_CONTROL)); 3775 tmp = RREG32_SOC15(GC, 0, mmCP_HQD_EOP_CONTROL);
3773 tmp = REG_SET_FIELD(tmp, CP_HQD_EOP_CONTROL, EOP_SIZE, 3776 tmp = REG_SET_FIELD(tmp, CP_HQD_EOP_CONTROL, EOP_SIZE,
3774 (order_base_2(MEC_HPD_SIZE / 4) - 1)); 3777 (order_base_2(MEC_HPD_SIZE / 4) - 1));
3775 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_EOP_CONTROL), tmp); 3778 WREG32_SOC15(GC, 0, mmCP_HQD_EOP_CONTROL, tmp);
3776 3779
3777 /* enable doorbell? */ 3780 /* enable doorbell? */
3778 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL)); 3781 tmp = RREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL);
3779 if (use_doorbell) 3782 if (use_doorbell)
3780 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_EN, 1); 3783 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_EN, 1);
3781 else 3784 else
3782 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_EN, 0); 3785 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_EN, 0);
3783 3786
3784 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL), tmp); 3787 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL, tmp);
3785 mqd->cp_hqd_pq_doorbell_control = tmp; 3788 mqd->cp_hqd_pq_doorbell_control = tmp;
3786 3789
3787 /* disable the queue if it's active */ 3790 /* disable the queue if it's active */
@@ -3790,40 +3793,40 @@ static int gfx_v9_0_init_queue(struct amdgpu_ring *ring)
3790 mqd->cp_hqd_pq_rptr = 0; 3793 mqd->cp_hqd_pq_rptr = 0;
3791 mqd->cp_hqd_pq_wptr_lo = 0; 3794 mqd->cp_hqd_pq_wptr_lo = 0;
3792 mqd->cp_hqd_pq_wptr_hi = 0; 3795 mqd->cp_hqd_pq_wptr_hi = 0;
3793 if (RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE)) & 1) { 3796 if (RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE) & 1) {
3794 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_DEQUEUE_REQUEST), 1); 3797 WREG32_SOC15(GC, 0, mmCP_HQD_DEQUEUE_REQUEST, 1);
3795 for (j = 0; j < adev->usec_timeout; j++) { 3798 for (j = 0; j < adev->usec_timeout; j++) {
3796 if (!(RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE)) & 1)) 3799 if (!(RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE) & 1))
3797 break; 3800 break;
3798 udelay(1); 3801 udelay(1);
3799 } 3802 }
3800 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_DEQUEUE_REQUEST), mqd->cp_hqd_dequeue_request); 3803 WREG32_SOC15(GC, 0, mmCP_HQD_DEQUEUE_REQUEST, mqd->cp_hqd_dequeue_request);
3801 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_RPTR), mqd->cp_hqd_pq_rptr); 3804 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_RPTR, mqd->cp_hqd_pq_rptr);
3802 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_LO), mqd->cp_hqd_pq_wptr_lo); 3805 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_LO, mqd->cp_hqd_pq_wptr_lo);
3803 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_HI), mqd->cp_hqd_pq_wptr_hi); 3806 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_HI, mqd->cp_hqd_pq_wptr_hi);
3804 } 3807 }
3805 3808
3806 /* set the pointer to the MQD */ 3809 /* set the pointer to the MQD */
3807 mqd->cp_mqd_base_addr_lo = mqd_gpu_addr & 0xfffffffc; 3810 mqd->cp_mqd_base_addr_lo = mqd_gpu_addr & 0xfffffffc;
3808 mqd->cp_mqd_base_addr_hi = upper_32_bits(mqd_gpu_addr); 3811 mqd->cp_mqd_base_addr_hi = upper_32_bits(mqd_gpu_addr);
3809 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MQD_BASE_ADDR), mqd->cp_mqd_base_addr_lo); 3812 WREG32_SOC15(GC, 0, mmCP_MQD_BASE_ADDR, mqd->cp_mqd_base_addr_lo);
3810 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MQD_BASE_ADDR_HI), mqd->cp_mqd_base_addr_hi); 3813 WREG32_SOC15(GC, 0, mmCP_MQD_BASE_ADDR_HI, mqd->cp_mqd_base_addr_hi);
3811 3814
3812 /* set MQD vmid to 0 */ 3815 /* set MQD vmid to 0 */
3813 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MQD_CONTROL)); 3816 tmp = RREG32_SOC15(GC, 0, mmCP_MQD_CONTROL);
3814 tmp = REG_SET_FIELD(tmp, CP_MQD_CONTROL, VMID, 0); 3817 tmp = REG_SET_FIELD(tmp, CP_MQD_CONTROL, VMID, 0);
3815 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MQD_CONTROL), tmp); 3818 WREG32_SOC15(GC, 0, mmCP_MQD_CONTROL, tmp);
3816 mqd->cp_mqd_control = tmp; 3819 mqd->cp_mqd_control = tmp;
3817 3820
3818 /* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */ 3821 /* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
3819 hqd_gpu_addr = ring->gpu_addr >> 8; 3822 hqd_gpu_addr = ring->gpu_addr >> 8;
3820 mqd->cp_hqd_pq_base_lo = hqd_gpu_addr; 3823 mqd->cp_hqd_pq_base_lo = hqd_gpu_addr;
3821 mqd->cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr); 3824 mqd->cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr);
3822 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_BASE), mqd->cp_hqd_pq_base_lo); 3825 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_BASE, mqd->cp_hqd_pq_base_lo);
3823 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_BASE_HI), mqd->cp_hqd_pq_base_hi); 3826 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_BASE_HI, mqd->cp_hqd_pq_base_hi);
3824 3827
3825 /* set up the HQD, this is similar to CP_RB0_CNTL */ 3828 /* set up the HQD, this is similar to CP_RB0_CNTL */
3826 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_CONTROL)); 3829 tmp = RREG32_SOC15(GC, 0, mmCP_HQD_PQ_CONTROL);
3827 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, QUEUE_SIZE, 3830 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, QUEUE_SIZE,
3828 (order_base_2(ring->ring_size / 4) - 1)); 3831 (order_base_2(ring->ring_size / 4) - 1));
3829 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE, 3832 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE,
@@ -3835,7 +3838,7 @@ static int gfx_v9_0_init_queue(struct amdgpu_ring *ring)
3835 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, ROQ_PQ_IB_FLIP, 0); 3838 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, ROQ_PQ_IB_FLIP, 0);
3836 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1); 3839 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1);
3837 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1); 3840 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1);
3838 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_CONTROL), tmp); 3841 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_CONTROL, tmp);
3839 mqd->cp_hqd_pq_control = tmp; 3842 mqd->cp_hqd_pq_control = tmp;
3840 3843
3841 /* set the wb address wether it's enabled or not */ 3844 /* set the wb address wether it's enabled or not */
@@ -3843,27 +3846,27 @@ static int gfx_v9_0_init_queue(struct amdgpu_ring *ring)
3843 mqd->cp_hqd_pq_rptr_report_addr_lo = wb_gpu_addr & 0xfffffffc; 3846 mqd->cp_hqd_pq_rptr_report_addr_lo = wb_gpu_addr & 0xfffffffc;
3844 mqd->cp_hqd_pq_rptr_report_addr_hi = 3847 mqd->cp_hqd_pq_rptr_report_addr_hi =
3845 upper_32_bits(wb_gpu_addr) & 0xffff; 3848 upper_32_bits(wb_gpu_addr) & 0xffff;
3846 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_RPTR_REPORT_ADDR), 3849 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_RPTR_REPORT_ADDR,
3847 mqd->cp_hqd_pq_rptr_report_addr_lo); 3850 mqd->cp_hqd_pq_rptr_report_addr_lo);
3848 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_RPTR_REPORT_ADDR_HI), 3851 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_RPTR_REPORT_ADDR_HI,
3849 mqd->cp_hqd_pq_rptr_report_addr_hi); 3852 mqd->cp_hqd_pq_rptr_report_addr_hi);
3850 3853
3851 /* only used if CP_PQ_WPTR_POLL_CNTL.CP_PQ_WPTR_POLL_CNTL__EN_MASK=1 */ 3854 /* only used if CP_PQ_WPTR_POLL_CNTL.CP_PQ_WPTR_POLL_CNTL__EN_MASK=1 */
3852 wb_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4); 3855 wb_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);
3853 mqd->cp_hqd_pq_wptr_poll_addr_lo = wb_gpu_addr & 0xfffffffc; 3856 mqd->cp_hqd_pq_wptr_poll_addr_lo = wb_gpu_addr & 0xfffffffc;
3854 mqd->cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits(wb_gpu_addr) & 0xffff; 3857 mqd->cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits(wb_gpu_addr) & 0xffff;
3855 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR), 3858 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR,
3856 mqd->cp_hqd_pq_wptr_poll_addr_lo); 3859 mqd->cp_hqd_pq_wptr_poll_addr_lo);
3857 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI), 3860 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI,
3858 mqd->cp_hqd_pq_wptr_poll_addr_hi); 3861 mqd->cp_hqd_pq_wptr_poll_addr_hi);
3859 3862
3860 /* enable the doorbell if requested */ 3863 /* enable the doorbell if requested */
3861 if (use_doorbell) { 3864 if (use_doorbell) {
3862 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEC_DOORBELL_RANGE_LOWER), 3865 WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_LOWER,
3863 (AMDGPU_DOORBELL64_KIQ * 2) << 2); 3866 (AMDGPU_DOORBELL64_KIQ * 2) << 2);
3864 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEC_DOORBELL_RANGE_UPPER), 3867 WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_UPPER,
3865 (AMDGPU_DOORBELL64_MEC_RING7 * 2) << 2); 3868 (AMDGPU_DOORBELL64_MEC_RING7 * 2) << 2);
3866 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL)); 3869 tmp = RREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL);
3867 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, 3870 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
3868 DOORBELL_OFFSET, ring->doorbell_index); 3871 DOORBELL_OFFSET, ring->doorbell_index);
3869 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_EN, 1); 3872 tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_EN, 1);
@@ -3874,25 +3877,25 @@ static int gfx_v9_0_init_queue(struct amdgpu_ring *ring)
3874 } else { 3877 } else {
3875 mqd->cp_hqd_pq_doorbell_control = 0; 3878 mqd->cp_hqd_pq_doorbell_control = 0;
3876 } 3879 }
3877 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL), 3880 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL,
3878 mqd->cp_hqd_pq_doorbell_control); 3881 mqd->cp_hqd_pq_doorbell_control);
3879 3882
3880 /* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */ 3883 /* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */
3881 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_LO), mqd->cp_hqd_pq_wptr_lo); 3884 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_LO, mqd->cp_hqd_pq_wptr_lo);
3882 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_HI), mqd->cp_hqd_pq_wptr_hi); 3885 WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_HI, mqd->cp_hqd_pq_wptr_hi);
3883 3886
3884 /* set the vmid for the queue */ 3887 /* set the vmid for the queue */
3885 mqd->cp_hqd_vmid = 0; 3888 mqd->cp_hqd_vmid = 0;
3886 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_VMID), mqd->cp_hqd_vmid); 3889 WREG32_SOC15(GC, 0, mmCP_HQD_VMID, mqd->cp_hqd_vmid);
3887 3890
3888 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PERSISTENT_STATE)); 3891 tmp = RREG32_SOC15(GC, 0, mmCP_HQD_PERSISTENT_STATE);
3889 tmp = REG_SET_FIELD(tmp, CP_HQD_PERSISTENT_STATE, PRELOAD_SIZE, 0x53); 3892 tmp = REG_SET_FIELD(tmp, CP_HQD_PERSISTENT_STATE, PRELOAD_SIZE, 0x53);
3890 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PERSISTENT_STATE), tmp); 3893 WREG32_SOC15(GC, 0, mmCP_HQD_PERSISTENT_STATE, tmp);
3891 mqd->cp_hqd_persistent_state = tmp; 3894 mqd->cp_hqd_persistent_state = tmp;
3892 3895
3893 /* activate the queue */ 3896 /* activate the queue */
3894 mqd->cp_hqd_active = 1; 3897 mqd->cp_hqd_active = 1;
3895 WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE), mqd->cp_hqd_active); 3898 WREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE, mqd->cp_hqd_active);
3896 3899
3897 soc15_grbm_select(adev, 0, 0, 0, 0); 3900 soc15_grbm_select(adev, 0, 0, 0, 0);
3898 mutex_unlock(&adev->srbm_mutex); 3901 mutex_unlock(&adev->srbm_mutex);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
index 1713d257ed4a..2a3983036a30 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
@@ -346,7 +346,8 @@ static int gmc_v6_0_mc_init(struct amdgpu_device *adev)
346 * size equal to the 1024 or vram, whichever is larger. 346 * size equal to the 1024 or vram, whichever is larger.
347 */ 347 */
348 if (amdgpu_gart_size == -1) 348 if (amdgpu_gart_size == -1)
349 adev->mc.gtt_size = max((1024ULL << 20), adev->mc.mc_vram_size); 349 adev->mc.gtt_size = max((AMDGPU_DEFAULT_GTT_SIZE_MB << 20),
350 adev->mc.mc_vram_size);
350 else 351 else
351 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20; 352 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20;
352 353
@@ -621,7 +622,7 @@ static int gmc_v6_0_vm_init(struct amdgpu_device *adev)
621 * amdgpu graphics/compute will use VMIDs 1-7 622 * amdgpu graphics/compute will use VMIDs 1-7
622 * amdkfd will use VMIDs 8-15 623 * amdkfd will use VMIDs 8-15
623 */ 624 */
624 adev->vm_manager.num_ids = AMDGPU_NUM_OF_VMIDS; 625 adev->vm_manager.id_mgr[0].num_ids = AMDGPU_NUM_OF_VMIDS;
625 adev->vm_manager.num_level = 1; 626 adev->vm_manager.num_level = 1;
626 amdgpu_vm_manager_init(adev); 627 amdgpu_vm_manager_init(adev);
627 628
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index a84997fa8d7c..6d347c1d2516 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -395,7 +395,8 @@ static int gmc_v7_0_mc_init(struct amdgpu_device *adev)
395 * size equal to the 1024 or vram, whichever is larger. 395 * size equal to the 1024 or vram, whichever is larger.
396 */ 396 */
397 if (amdgpu_gart_size == -1) 397 if (amdgpu_gart_size == -1)
398 adev->mc.gtt_size = max((1024ULL << 20), adev->mc.mc_vram_size); 398 adev->mc.gtt_size = max((AMDGPU_DEFAULT_GTT_SIZE_MB << 20),
399 adev->mc.mc_vram_size);
399 else 400 else
400 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20; 401 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20;
401 402
@@ -746,7 +747,7 @@ static int gmc_v7_0_vm_init(struct amdgpu_device *adev)
746 * amdgpu graphics/compute will use VMIDs 1-7 747 * amdgpu graphics/compute will use VMIDs 1-7
747 * amdkfd will use VMIDs 8-15 748 * amdkfd will use VMIDs 8-15
748 */ 749 */
749 adev->vm_manager.num_ids = AMDGPU_NUM_OF_VMIDS; 750 adev->vm_manager.id_mgr[0].num_ids = AMDGPU_NUM_OF_VMIDS;
750 adev->vm_manager.num_level = 1; 751 adev->vm_manager.num_level = 1;
751 amdgpu_vm_manager_init(adev); 752 amdgpu_vm_manager_init(adev);
752 753
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index 094c69dddd6a..2784ff49cf56 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -557,7 +557,8 @@ static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
557 * size equal to the 1024 or vram, whichever is larger. 557 * size equal to the 1024 or vram, whichever is larger.
558 */ 558 */
559 if (amdgpu_gart_size == -1) 559 if (amdgpu_gart_size == -1)
560 adev->mc.gtt_size = max((1024ULL << 20), adev->mc.mc_vram_size); 560 adev->mc.gtt_size = max((AMDGPU_DEFAULT_GTT_SIZE_MB << 20),
561 adev->mc.mc_vram_size);
561 else 562 else
562 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20; 563 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20;
563 564
@@ -949,7 +950,7 @@ static int gmc_v8_0_vm_init(struct amdgpu_device *adev)
949 * amdgpu graphics/compute will use VMIDs 1-7 950 * amdgpu graphics/compute will use VMIDs 1-7
950 * amdkfd will use VMIDs 8-15 951 * amdkfd will use VMIDs 8-15
951 */ 952 */
952 adev->vm_manager.num_ids = AMDGPU_NUM_OF_VMIDS; 953 adev->vm_manager.id_mgr[0].num_ids = AMDGPU_NUM_OF_VMIDS;
953 adev->vm_manager.num_level = 1; 954 adev->vm_manager.num_level = 1;
954 amdgpu_vm_manager_init(adev); 955 amdgpu_vm_manager_init(adev);
955 956
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index 3b045e0b114e..dc1e1c1d6b24 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -386,6 +386,23 @@ static int gmc_v9_0_early_init(void *handle)
386static int gmc_v9_0_late_init(void *handle) 386static int gmc_v9_0_late_init(void *handle)
387{ 387{
388 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 388 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
389 unsigned vm_inv_eng[AMDGPU_MAX_VMHUBS] = { 3, 3 };
390 unsigned i;
391
392 for(i = 0; i < adev->num_rings; ++i) {
393 struct amdgpu_ring *ring = adev->rings[i];
394 unsigned vmhub = ring->funcs->vmhub;
395
396 ring->vm_inv_eng = vm_inv_eng[vmhub]++;
397 dev_info(adev->dev, "ring %u(%s) uses VM inv eng %u on hub %u\n",
398 ring->idx, ring->name, ring->vm_inv_eng,
399 ring->funcs->vmhub);
400 }
401
402 /* Engine 17 is used for GART flushes */
403 for(i = 0; i < AMDGPU_MAX_VMHUBS; ++i)
404 BUG_ON(vm_inv_eng[i] > 17);
405
389 return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0); 406 return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0);
390} 407}
391 408
@@ -469,7 +486,8 @@ static int gmc_v9_0_mc_init(struct amdgpu_device *adev)
469 * size equal to the 1024 or vram, whichever is larger. 486 * size equal to the 1024 or vram, whichever is larger.
470 */ 487 */
471 if (amdgpu_gart_size == -1) 488 if (amdgpu_gart_size == -1)
472 adev->mc.gtt_size = max((1024ULL << 20), adev->mc.mc_vram_size); 489 adev->mc.gtt_size = max((AMDGPU_DEFAULT_GTT_SIZE_MB << 20),
490 adev->mc.mc_vram_size);
473 else 491 else
474 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20; 492 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20;
475 493
@@ -519,7 +537,8 @@ static int gmc_v9_0_vm_init(struct amdgpu_device *adev)
519 * amdgpu graphics/compute will use VMIDs 1-7 537 * amdgpu graphics/compute will use VMIDs 1-7
520 * amdkfd will use VMIDs 8-15 538 * amdkfd will use VMIDs 8-15
521 */ 539 */
522 adev->vm_manager.num_ids = AMDGPU_NUM_OF_VMIDS; 540 adev->vm_manager.id_mgr[AMDGPU_GFXHUB].num_ids = AMDGPU_NUM_OF_VMIDS;
541 adev->vm_manager.id_mgr[AMDGPU_MMHUB].num_ids = AMDGPU_NUM_OF_VMIDS;
523 542
524 /* TODO: fix num_level for APU when updating vm size and block size */ 543 /* TODO: fix num_level for APU when updating vm size and block size */
525 if (adev->flags & AMD_IS_APU) 544 if (adev->flags & AMD_IS_APU)
diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
index 62684510ddcd..dbfe48d1207a 100644
--- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
@@ -511,6 +511,9 @@ static int mmhub_v1_0_set_clockgating_state(void *handle,
511{ 511{
512 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 512 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
513 513
514 if (amdgpu_sriov_vf(adev))
515 return 0;
516
514 switch (adev->asic_type) { 517 switch (adev->asic_type) {
515 case CHIP_VEGA10: 518 case CHIP_VEGA10:
516 mmhub_v1_0_update_medium_grain_clock_gating(adev, 519 mmhub_v1_0_update_medium_grain_clock_gating(adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/mmsch_v1_0.h b/drivers/gpu/drm/amd/amdgpu/mmsch_v1_0.h
index 5f0fc8bf16a9..8af0bddf85e4 100644
--- a/drivers/gpu/drm/amd/amdgpu/mmsch_v1_0.h
+++ b/drivers/gpu/drm/amd/amdgpu/mmsch_v1_0.h
@@ -84,4 +84,61 @@ struct mmsch_v1_0_cmd_indirect_write {
84 uint32_t reg_value; 84 uint32_t reg_value;
85}; 85};
86 86
87static inline void mmsch_v1_0_insert_direct_wt(struct mmsch_v1_0_cmd_direct_write *direct_wt,
88 uint32_t *init_table,
89 uint32_t reg_offset,
90 uint32_t value)
91{
92 direct_wt->cmd_header.reg_offset = reg_offset;
93 direct_wt->reg_value = value;
94 memcpy((void *)init_table, direct_wt, sizeof(struct mmsch_v1_0_cmd_direct_write));
95}
96
97static inline void mmsch_v1_0_insert_direct_rd_mod_wt(struct mmsch_v1_0_cmd_direct_read_modify_write *direct_rd_mod_wt,
98 uint32_t *init_table,
99 uint32_t reg_offset,
100 uint32_t mask, uint32_t data)
101{
102 direct_rd_mod_wt->cmd_header.reg_offset = reg_offset;
103 direct_rd_mod_wt->mask_value = mask;
104 direct_rd_mod_wt->write_data = data;
105 memcpy((void *)init_table, direct_rd_mod_wt,
106 sizeof(struct mmsch_v1_0_cmd_direct_read_modify_write));
107}
108
109static inline void mmsch_v1_0_insert_direct_poll(struct mmsch_v1_0_cmd_direct_polling *direct_poll,
110 uint32_t *init_table,
111 uint32_t reg_offset,
112 uint32_t mask, uint32_t wait)
113{
114 direct_poll->cmd_header.reg_offset = reg_offset;
115 direct_poll->mask_value = mask;
116 direct_poll->wait_value = wait;
117 memcpy((void *)init_table, direct_poll, sizeof(struct mmsch_v1_0_cmd_direct_polling));
118}
119
120#define MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(reg, mask, data) { \
121 mmsch_v1_0_insert_direct_rd_mod_wt(&direct_rd_mod_wt, \
122 init_table, (reg), \
123 (mask), (data)); \
124 init_table += sizeof(struct mmsch_v1_0_cmd_direct_read_modify_write)/4; \
125 table_size += sizeof(struct mmsch_v1_0_cmd_direct_read_modify_write)/4; \
126}
127
128#define MMSCH_V1_0_INSERT_DIRECT_WT(reg, value) { \
129 mmsch_v1_0_insert_direct_wt(&direct_wt, \
130 init_table, (reg), \
131 (value)); \
132 init_table += sizeof(struct mmsch_v1_0_cmd_direct_write)/4; \
133 table_size += sizeof(struct mmsch_v1_0_cmd_direct_write)/4; \
134}
135
136#define MMSCH_V1_0_INSERT_DIRECT_POLL(reg, mask, wait) { \
137 mmsch_v1_0_insert_direct_poll(&direct_poll, \
138 init_table, (reg), \
139 (mask), (wait)); \
140 init_table += sizeof(struct mmsch_v1_0_cmd_direct_polling)/4; \
141 table_size += sizeof(struct mmsch_v1_0_cmd_direct_polling)/4; \
142}
143
87#endif 144#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c
index 70a3dd13cb02..7bdc51b02326 100644
--- a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c
+++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c
@@ -368,9 +368,12 @@ static int xgpu_vi_mailbox_rcv_msg(struct amdgpu_device *adev,
368 u32 reg; 368 u32 reg;
369 u32 mask = REG_FIELD_MASK(MAILBOX_CONTROL, RCV_MSG_VALID); 369 u32 mask = REG_FIELD_MASK(MAILBOX_CONTROL, RCV_MSG_VALID);
370 370
371 reg = RREG32_NO_KIQ(mmMAILBOX_CONTROL); 371 /* workaround: host driver doesn't set VALID for CMPL now */
372 if (!(reg & mask)) 372 if (event != IDH_FLR_NOTIFICATION_CMPL) {
373 return -ENOENT; 373 reg = RREG32_NO_KIQ(mmMAILBOX_CONTROL);
374 if (!(reg & mask))
375 return -ENOENT;
376 }
374 377
375 reg = RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW0); 378 reg = RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW0);
376 if (reg != event) 379 if (reg != event)
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
index 5b4432cb7c9a..eef89abc0cee 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
@@ -166,11 +166,8 @@ int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp)
166{ 166{
167 int ret; 167 int ret;
168 uint32_t psp_gfxdrv_command_reg = 0; 168 uint32_t psp_gfxdrv_command_reg = 0;
169 struct amdgpu_bo *psp_sysdrv;
170 void *psp_sysdrv_virt = NULL;
171 uint64_t psp_sysdrv_mem;
172 struct amdgpu_device *adev = psp->adev; 169 struct amdgpu_device *adev = psp->adev;
173 uint32_t size, sol_reg; 170 uint32_t sol_reg;
174 171
175 /* Check sOS sign of life register to confirm sys driver and sOS 172 /* Check sOS sign of life register to confirm sys driver and sOS
176 * are already been loaded. 173 * are already been loaded.
@@ -185,27 +182,14 @@ int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp)
185 if (ret) 182 if (ret)
186 return ret; 183 return ret;
187 184
188 /* 185 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
189 * Create a 1 meg GART memory to store the psp sys driver
190 * binary with a 1 meg aligned address
191 */
192 size = (psp->sys_bin_size + (PSP_BOOTLOADER_1_MEG_ALIGNMENT - 1)) &
193 (~(PSP_BOOTLOADER_1_MEG_ALIGNMENT - 1));
194
195 ret = amdgpu_bo_create_kernel(adev, size, PSP_BOOTLOADER_1_MEG_ALIGNMENT,
196 AMDGPU_GEM_DOMAIN_GTT,
197 &psp_sysdrv,
198 &psp_sysdrv_mem,
199 &psp_sysdrv_virt);
200 if (ret)
201 return ret;
202 186
203 /* Copy PSP System Driver binary to memory */ 187 /* Copy PSP System Driver binary to memory */
204 memcpy(psp_sysdrv_virt, psp->sys_start_addr, psp->sys_bin_size); 188 memcpy(psp->fw_pri_buf, psp->sys_start_addr, psp->sys_bin_size);
205 189
206 /* Provide the sys driver to bootrom */ 190 /* Provide the sys driver to bootrom */
207 WREG32(SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_36), 191 WREG32(SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_36),
208 (uint32_t)(psp_sysdrv_mem >> 20)); 192 (uint32_t)(psp->fw_pri_mc_addr >> 20));
209 psp_gfxdrv_command_reg = 1 << 16; 193 psp_gfxdrv_command_reg = 1 << 16;
210 WREG32(SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35), 194 WREG32(SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
211 psp_gfxdrv_command_reg); 195 psp_gfxdrv_command_reg);
@@ -216,8 +200,6 @@ int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp)
216 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35), 200 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
217 0x80000000, 0x80000000, false); 201 0x80000000, 0x80000000, false);
218 202
219 amdgpu_bo_free_kernel(&psp_sysdrv, &psp_sysdrv_mem, &psp_sysdrv_virt);
220
221 return ret; 203 return ret;
222} 204}
223 205
@@ -225,11 +207,8 @@ int psp_v3_1_bootloader_load_sos(struct psp_context *psp)
225{ 207{
226 int ret; 208 int ret;
227 unsigned int psp_gfxdrv_command_reg = 0; 209 unsigned int psp_gfxdrv_command_reg = 0;
228 struct amdgpu_bo *psp_sos;
229 void *psp_sos_virt = NULL;
230 uint64_t psp_sos_mem;
231 struct amdgpu_device *adev = psp->adev; 210 struct amdgpu_device *adev = psp->adev;
232 uint32_t size, sol_reg; 211 uint32_t sol_reg;
233 212
234 /* Check sOS sign of life register to confirm sys driver and sOS 213 /* Check sOS sign of life register to confirm sys driver and sOS
235 * are already been loaded. 214 * are already been loaded.
@@ -244,23 +223,14 @@ int psp_v3_1_bootloader_load_sos(struct psp_context *psp)
244 if (ret) 223 if (ret)
245 return ret; 224 return ret;
246 225
247 size = (psp->sos_bin_size + (PSP_BOOTLOADER_1_MEG_ALIGNMENT - 1)) & 226 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
248 (~((uint64_t)PSP_BOOTLOADER_1_MEG_ALIGNMENT - 1));
249
250 ret = amdgpu_bo_create_kernel(adev, size, PSP_BOOTLOADER_1_MEG_ALIGNMENT,
251 AMDGPU_GEM_DOMAIN_GTT,
252 &psp_sos,
253 &psp_sos_mem,
254 &psp_sos_virt);
255 if (ret)
256 return ret;
257 227
258 /* Copy Secure OS binary to PSP memory */ 228 /* Copy Secure OS binary to PSP memory */
259 memcpy(psp_sos_virt, psp->sos_start_addr, psp->sos_bin_size); 229 memcpy(psp->fw_pri_buf, psp->sos_start_addr, psp->sos_bin_size);
260 230
261 /* Provide the PSP secure OS to bootrom */ 231 /* Provide the PSP secure OS to bootrom */
262 WREG32(SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_36), 232 WREG32(SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_36),
263 (uint32_t)(psp_sos_mem >> 20)); 233 (uint32_t)(psp->fw_pri_mc_addr >> 20));
264 psp_gfxdrv_command_reg = 2 << 16; 234 psp_gfxdrv_command_reg = 2 << 16;
265 WREG32(SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35), 235 WREG32(SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
266 psp_gfxdrv_command_reg); 236 psp_gfxdrv_command_reg);
@@ -273,8 +243,6 @@ int psp_v3_1_bootloader_load_sos(struct psp_context *psp)
273 0, true); 243 0, true);
274#endif 244#endif
275 245
276 amdgpu_bo_free_kernel(&psp_sos, &psp_sos_mem, &psp_sos_virt);
277
278 return ret; 246 return ret;
279} 247}
280 248
@@ -300,7 +268,6 @@ int psp_v3_1_prep_cmd_buf(struct amdgpu_firmware_info *ucode, struct psp_gfx_cmd
300int psp_v3_1_ring_init(struct psp_context *psp, enum psp_ring_type ring_type) 268int psp_v3_1_ring_init(struct psp_context *psp, enum psp_ring_type ring_type)
301{ 269{
302 int ret = 0; 270 int ret = 0;
303 unsigned int psp_ring_reg = 0;
304 struct psp_ring *ring; 271 struct psp_ring *ring;
305 struct amdgpu_device *adev = psp->adev; 272 struct amdgpu_device *adev = psp->adev;
306 273
@@ -320,6 +287,16 @@ int psp_v3_1_ring_init(struct psp_context *psp, enum psp_ring_type ring_type)
320 return ret; 287 return ret;
321 } 288 }
322 289
290 return 0;
291}
292
293int psp_v3_1_ring_create(struct psp_context *psp, enum psp_ring_type ring_type)
294{
295 int ret = 0;
296 unsigned int psp_ring_reg = 0;
297 struct psp_ring *ring = &psp->km_ring;
298 struct amdgpu_device *adev = psp->adev;
299
323 /* Write low address of the ring to C2PMSG_69 */ 300 /* Write low address of the ring to C2PMSG_69 */
324 psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr); 301 psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr);
325 WREG32(SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_69), psp_ring_reg); 302 WREG32(SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_69), psp_ring_reg);
@@ -344,6 +321,33 @@ int psp_v3_1_ring_init(struct psp_context *psp, enum psp_ring_type ring_type)
344 return ret; 321 return ret;
345} 322}
346 323
324int psp_v3_1_ring_destroy(struct psp_context *psp, enum psp_ring_type ring_type)
325{
326 int ret = 0;
327 struct psp_ring *ring;
328 unsigned int psp_ring_reg = 0;
329 struct amdgpu_device *adev = psp->adev;
330
331 ring = &psp->km_ring;
332
333 /* Write the ring destroy command to C2PMSG_64 */
334 psp_ring_reg = 3 << 16;
335 WREG32(SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64), psp_ring_reg);
336
337 /* there might be handshake issue with hardware which needs delay */
338 mdelay(20);
339
340 /* Wait for response flag (bit 31) in C2PMSG_64 */
341 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
342 0x80000000, 0x80000000, false);
343
344 if (ring->ring_mem)
345 amdgpu_bo_free_kernel(&adev->firmware.rbuf,
346 &ring->ring_mem_mc_addr,
347 (void **)&ring->ring_mem);
348 return ret;
349}
350
347int psp_v3_1_cmd_submit(struct psp_context *psp, 351int psp_v3_1_cmd_submit(struct psp_context *psp,
348 struct amdgpu_firmware_info *ucode, 352 struct amdgpu_firmware_info *ucode,
349 uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 353 uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr,
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.h b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.h
index e82eff741a08..9dcd0b25c4c6 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.h
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.h
@@ -39,6 +39,10 @@ extern int psp_v3_1_prep_cmd_buf(struct amdgpu_firmware_info *ucode,
39 struct psp_gfx_cmd_resp *cmd); 39 struct psp_gfx_cmd_resp *cmd);
40extern int psp_v3_1_ring_init(struct psp_context *psp, 40extern int psp_v3_1_ring_init(struct psp_context *psp,
41 enum psp_ring_type ring_type); 41 enum psp_ring_type ring_type);
42extern int psp_v3_1_ring_create(struct psp_context *psp,
43 enum psp_ring_type ring_type);
44extern int psp_v3_1_ring_destroy(struct psp_context *psp,
45 enum psp_ring_type ring_type);
42extern int psp_v3_1_cmd_submit(struct psp_context *psp, 46extern int psp_v3_1_cmd_submit(struct psp_context *psp,
43 struct amdgpu_firmware_info *ucode, 47 struct amdgpu_firmware_info *ucode,
44 uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 48 uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr,
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
index 21f38d882335..ecc70a730a54 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
@@ -48,8 +48,7 @@ static void sdma_v4_0_set_buffer_funcs(struct amdgpu_device *adev);
48static void sdma_v4_0_set_vm_pte_funcs(struct amdgpu_device *adev); 48static void sdma_v4_0_set_vm_pte_funcs(struct amdgpu_device *adev);
49static void sdma_v4_0_set_irq_funcs(struct amdgpu_device *adev); 49static void sdma_v4_0_set_irq_funcs(struct amdgpu_device *adev);
50 50
51static const u32 golden_settings_sdma_4[] = 51static const u32 golden_settings_sdma_4[] = {
52{
53 SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_CHICKEN_BITS), 0xfe931f07, 0x02831f07, 52 SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_CHICKEN_BITS), 0xfe931f07, 0x02831f07,
54 SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_CLK_CTRL), 0xff000ff0, 0x3f000100, 53 SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_CLK_CTRL), 0xff000ff0, 0x3f000100,
55 SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GFX_IB_CNTL), 0x800f0100, 0x00000100, 54 SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GFX_IB_CNTL), 0x800f0100, 0x00000100,
@@ -76,8 +75,7 @@ static const u32 golden_settings_sdma_4[] =
76 SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_UTCL1_PAGE), 0x000003ff, 0x000003c0 75 SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_UTCL1_PAGE), 0x000003ff, 0x000003c0
77}; 76};
78 77
79static const u32 golden_settings_sdma_vg10[] = 78static const u32 golden_settings_sdma_vg10[] = {
80{
81 SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG), 0x0018773f, 0x00104002, 79 SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG), 0x0018773f, 0x00104002,
82 SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ), 0x0018773f, 0x00104002, 80 SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ), 0x0018773f, 0x00104002,
83 SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG), 0x0018773f, 0x00104002, 81 SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG), 0x0018773f, 0x00104002,
@@ -87,16 +85,17 @@ static const u32 golden_settings_sdma_vg10[] =
87static u32 sdma_v4_0_get_reg_offset(u32 instance, u32 internal_offset) 85static u32 sdma_v4_0_get_reg_offset(u32 instance, u32 internal_offset)
88{ 86{
89 u32 base = 0; 87 u32 base = 0;
88
90 switch (instance) { 89 switch (instance) {
91 case 0: 90 case 0:
92 base = SDMA0_BASE.instance[0].segment[0]; 91 base = SDMA0_BASE.instance[0].segment[0];
93 break; 92 break;
94 case 1: 93 case 1:
95 base = SDMA1_BASE.instance[0].segment[0]; 94 base = SDMA1_BASE.instance[0].segment[0];
96 break; 95 break;
97 default: 96 default:
98 BUG(); 97 BUG();
99 break; 98 break;
100 } 99 }
101 100
102 return base + internal_offset; 101 return base + internal_offset;
@@ -159,7 +158,8 @@ static int sdma_v4_0_init_microcode(struct amdgpu_device *adev)
159 case CHIP_VEGA10: 158 case CHIP_VEGA10:
160 chip_name = "vega10"; 159 chip_name = "vega10";
161 break; 160 break;
162 default: BUG(); 161 default:
162 BUG();
163 } 163 }
164 164
165 for (i = 0; i < adev->sdma.num_instances; i++) { 165 for (i = 0; i < adev->sdma.num_instances; i++) {
@@ -179,7 +179,7 @@ static int sdma_v4_0_init_microcode(struct amdgpu_device *adev)
179 if (adev->sdma.instance[i].feature_version >= 20) 179 if (adev->sdma.instance[i].feature_version >= 20)
180 adev->sdma.instance[i].burst_nop = true; 180 adev->sdma.instance[i].burst_nop = true;
181 DRM_DEBUG("psp_load == '%s'\n", 181 DRM_DEBUG("psp_load == '%s'\n",
182 adev->firmware.load_type == AMDGPU_FW_LOAD_PSP? "true": "false"); 182 adev->firmware.load_type == AMDGPU_FW_LOAD_PSP ? "true" : "false");
183 183
184 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { 184 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
185 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i]; 185 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i];
@@ -192,9 +192,7 @@ static int sdma_v4_0_init_microcode(struct amdgpu_device *adev)
192 } 192 }
193out: 193out:
194 if (err) { 194 if (err) {
195 printk(KERN_ERR 195 DRM_ERROR("sdma_v4_0: Failed to load firmware \"%s\"\n", fw_name);
196 "sdma_v4_0: Failed to load firmware \"%s\"\n",
197 fw_name);
198 for (i = 0; i < adev->sdma.num_instances; i++) { 196 for (i = 0; i < adev->sdma.num_instances; i++) {
199 release_firmware(adev->sdma.instance[i].fw); 197 release_firmware(adev->sdma.instance[i].fw);
200 adev->sdma.instance[i].fw = NULL; 198 adev->sdma.instance[i].fw = NULL;
@@ -212,10 +210,10 @@ out:
212 */ 210 */
213static uint64_t sdma_v4_0_ring_get_rptr(struct amdgpu_ring *ring) 211static uint64_t sdma_v4_0_ring_get_rptr(struct amdgpu_ring *ring)
214{ 212{
215 u64* rptr; 213 u64 *rptr;
216 214
217 /* XXX check if swapping is necessary on BE */ 215 /* XXX check if swapping is necessary on BE */
218 rptr =((u64*)&ring->adev->wb.wb[ring->rptr_offs]); 216 rptr = ((u64 *)&ring->adev->wb.wb[ring->rptr_offs]);
219 217
220 DRM_DEBUG("rptr before shift == 0x%016llx\n", *rptr); 218 DRM_DEBUG("rptr before shift == 0x%016llx\n", *rptr);
221 return ((*rptr) >> 2); 219 return ((*rptr) >> 2);
@@ -231,19 +229,20 @@ static uint64_t sdma_v4_0_ring_get_rptr(struct amdgpu_ring *ring)
231static uint64_t sdma_v4_0_ring_get_wptr(struct amdgpu_ring *ring) 229static uint64_t sdma_v4_0_ring_get_wptr(struct amdgpu_ring *ring)
232{ 230{
233 struct amdgpu_device *adev = ring->adev; 231 struct amdgpu_device *adev = ring->adev;
234 u64* wptr = NULL; 232 u64 *wptr = NULL;
235 uint64_t local_wptr=0; 233 uint64_t local_wptr = 0;
236 234
237 if (ring->use_doorbell) { 235 if (ring->use_doorbell) {
238 /* XXX check if swapping is necessary on BE */ 236 /* XXX check if swapping is necessary on BE */
239 wptr = ((u64*)&adev->wb.wb[ring->wptr_offs]); 237 wptr = ((u64 *)&adev->wb.wb[ring->wptr_offs]);
240 DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", *wptr); 238 DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", *wptr);
241 *wptr = (*wptr) >> 2; 239 *wptr = (*wptr) >> 2;
242 DRM_DEBUG("wptr/doorbell after shift == 0x%016llx\n", *wptr); 240 DRM_DEBUG("wptr/doorbell after shift == 0x%016llx\n", *wptr);
243 } else { 241 } else {
244 u32 lowbit, highbit; 242 u32 lowbit, highbit;
245 int me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1; 243 int me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1;
246 wptr=&local_wptr; 244
245 wptr = &local_wptr;
247 lowbit = RREG32(sdma_v4_0_get_reg_offset(me, mmSDMA0_GFX_RB_WPTR)) >> 2; 246 lowbit = RREG32(sdma_v4_0_get_reg_offset(me, mmSDMA0_GFX_RB_WPTR)) >> 2;
248 highbit = RREG32(sdma_v4_0_get_reg_offset(me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2; 247 highbit = RREG32(sdma_v4_0_get_reg_offset(me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2;
249 248
@@ -285,12 +284,13 @@ static void sdma_v4_0_ring_set_wptr(struct amdgpu_ring *ring)
285 WDOORBELL64(ring->doorbell_index, ring->wptr << 2); 284 WDOORBELL64(ring->doorbell_index, ring->wptr << 2);
286 } else { 285 } else {
287 int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1; 286 int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1;
287
288 DRM_DEBUG("Not using doorbell -- " 288 DRM_DEBUG("Not using doorbell -- "
289 "mmSDMA%i_GFX_RB_WPTR == 0x%08x " 289 "mmSDMA%i_GFX_RB_WPTR == 0x%08x "
290 "mmSDMA%i_GFX_RB_WPTR_HI == 0x%08x \n", 290 "mmSDMA%i_GFX_RB_WPTR_HI == 0x%08x\n",
291 me,
292 me, 291 me,
293 lower_32_bits(ring->wptr << 2), 292 lower_32_bits(ring->wptr << 2),
293 me,
294 upper_32_bits(ring->wptr << 2)); 294 upper_32_bits(ring->wptr << 2));
295 WREG32(sdma_v4_0_get_reg_offset(me, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr << 2)); 295 WREG32(sdma_v4_0_get_reg_offset(me, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr << 2));
296 WREG32(sdma_v4_0_get_reg_offset(me, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr << 2)); 296 WREG32(sdma_v4_0_get_reg_offset(me, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr << 2));
@@ -319,22 +319,22 @@ static void sdma_v4_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
319 * Schedule an IB in the DMA ring (VEGA10). 319 * Schedule an IB in the DMA ring (VEGA10).
320 */ 320 */
321static void sdma_v4_0_ring_emit_ib(struct amdgpu_ring *ring, 321static void sdma_v4_0_ring_emit_ib(struct amdgpu_ring *ring,
322 struct amdgpu_ib *ib, 322 struct amdgpu_ib *ib,
323 unsigned vm_id, bool ctx_switch) 323 unsigned vm_id, bool ctx_switch)
324{ 324{
325 u32 vmid = vm_id & 0xf; 325 u32 vmid = vm_id & 0xf;
326 326
327 /* IB packet must end on a 8 DW boundary */ 327 /* IB packet must end on a 8 DW boundary */
328 sdma_v4_0_ring_insert_nop(ring, (10 - (lower_32_bits(ring->wptr) & 7)) % 8); 328 sdma_v4_0_ring_insert_nop(ring, (10 - (lower_32_bits(ring->wptr) & 7)) % 8);
329 329
330 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_INDIRECT) | 330 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_INDIRECT) |
331 SDMA_PKT_INDIRECT_HEADER_VMID(vmid)); 331 SDMA_PKT_INDIRECT_HEADER_VMID(vmid));
332 /* base must be 32 byte aligned */ 332 /* base must be 32 byte aligned */
333 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr) & 0xffffffe0); 333 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr) & 0xffffffe0);
334 amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr)); 334 amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr));
335 amdgpu_ring_write(ring, ib->length_dw); 335 amdgpu_ring_write(ring, ib->length_dw);
336 amdgpu_ring_write(ring, 0); 336 amdgpu_ring_write(ring, 0);
337 amdgpu_ring_write(ring, 0); 337 amdgpu_ring_write(ring, 0);
338 338
339} 339}
340 340
@@ -523,7 +523,7 @@ static int sdma_v4_0_gfx_resume(struct amdgpu_device *adev)
523 u32 doorbell; 523 u32 doorbell;
524 u32 doorbell_offset; 524 u32 doorbell_offset;
525 u32 temp; 525 u32 temp;
526 int i,r; 526 int i, r;
527 527
528 for (i = 0; i < adev->sdma.num_instances; i++) { 528 for (i = 0; i < adev->sdma.num_instances; i++) {
529 ring = &adev->sdma.instance[i].ring; 529 ring = &adev->sdma.instance[i].ring;
@@ -572,7 +572,7 @@ static int sdma_v4_0_gfx_resume(struct amdgpu_device *adev)
572 doorbell = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_DOORBELL)); 572 doorbell = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_DOORBELL));
573 doorbell_offset = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_DOORBELL_OFFSET)); 573 doorbell_offset = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_DOORBELL_OFFSET));
574 574
575 if (ring->use_doorbell){ 575 if (ring->use_doorbell) {
576 doorbell = REG_SET_FIELD(doorbell, SDMA0_GFX_DOORBELL, ENABLE, 1); 576 doorbell = REG_SET_FIELD(doorbell, SDMA0_GFX_DOORBELL, ENABLE, 1);
577 doorbell_offset = REG_SET_FIELD(doorbell_offset, SDMA0_GFX_DOORBELL_OFFSET, 577 doorbell_offset = REG_SET_FIELD(doorbell_offset, SDMA0_GFX_DOORBELL_OFFSET,
578 OFFSET, ring->doorbell_index); 578 OFFSET, ring->doorbell_index);
@@ -694,9 +694,7 @@ static int sdma_v4_0_load_microcode(struct amdgpu_device *adev)
694 694
695 695
696 for (j = 0; j < fw_size; j++) 696 for (j = 0; j < fw_size; j++)
697 {
698 WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_UCODE_DATA), le32_to_cpup(fw_data++)); 697 WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_UCODE_DATA), le32_to_cpup(fw_data++));
699 }
700 698
701 WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_UCODE_ADDR), adev->sdma.instance[i].fw_version); 699 WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_UCODE_ADDR), adev->sdma.instance[i].fw_version);
702 } 700 }
@@ -744,10 +742,8 @@ static int sdma_v4_0_start(struct amdgpu_device *adev)
744 if (r) 742 if (r)
745 return r; 743 return r;
746 r = sdma_v4_0_rlc_resume(adev); 744 r = sdma_v4_0_rlc_resume(adev);
747 if (r)
748 return r;
749 745
750 return 0; 746 return r;
751} 747}
752 748
753/** 749/**
@@ -797,9 +793,8 @@ static int sdma_v4_0_ring_test_ring(struct amdgpu_ring *ring)
797 793
798 for (i = 0; i < adev->usec_timeout; i++) { 794 for (i = 0; i < adev->usec_timeout; i++) {
799 tmp = le32_to_cpu(adev->wb.wb[index]); 795 tmp = le32_to_cpu(adev->wb.wb[index]);
800 if (tmp == 0xDEADBEEF) { 796 if (tmp == 0xDEADBEEF)
801 break; 797 break;
802 }
803 DRM_UDELAY(1); 798 DRM_UDELAY(1);
804 } 799 }
805 800
@@ -864,29 +859,29 @@ static int sdma_v4_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
864 if (r) 859 if (r)
865 goto err1; 860 goto err1;
866 861
867 r = dma_fence_wait_timeout(f, false, timeout); 862 r = dma_fence_wait_timeout(f, false, timeout);
868 if (r == 0) { 863 if (r == 0) {
869 DRM_ERROR("amdgpu: IB test timed out\n"); 864 DRM_ERROR("amdgpu: IB test timed out\n");
870 r = -ETIMEDOUT; 865 r = -ETIMEDOUT;
871 goto err1; 866 goto err1;
872 } else if (r < 0) { 867 } else if (r < 0) {
873 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r); 868 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
874 goto err1; 869 goto err1;
875 } 870 }
876 tmp = le32_to_cpu(adev->wb.wb[index]); 871 tmp = le32_to_cpu(adev->wb.wb[index]);
877 if (tmp == 0xDEADBEEF) { 872 if (tmp == 0xDEADBEEF) {
878 DRM_INFO("ib test on ring %d succeeded\n", ring->idx); 873 DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
879 r = 0; 874 r = 0;
880 } else { 875 } else {
881 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp); 876 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
882 r = -EINVAL; 877 r = -EINVAL;
883 } 878 }
884err1: 879err1:
885 amdgpu_ib_free(adev, &ib, NULL); 880 amdgpu_ib_free(adev, &ib, NULL);
886 dma_fence_put(f); 881 dma_fence_put(f);
887err0: 882err0:
888 amdgpu_wb_free(adev, index); 883 amdgpu_wb_free(adev, index);
889 return r; 884 return r;
890} 885}
891 886
892 887
@@ -1039,44 +1034,40 @@ static void sdma_v4_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
1039static void sdma_v4_0_ring_emit_vm_flush(struct amdgpu_ring *ring, 1034static void sdma_v4_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
1040 unsigned vm_id, uint64_t pd_addr) 1035 unsigned vm_id, uint64_t pd_addr)
1041{ 1036{
1037 struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
1042 uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); 1038 uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id);
1043 unsigned eng = ring->idx; 1039 unsigned eng = ring->vm_inv_eng;
1044 unsigned i;
1045 1040
1046 pd_addr = pd_addr | 0x1; /* valid bit */ 1041 pd_addr = pd_addr | 0x1; /* valid bit */
1047 /* now only use physical base address of PDE and valid */ 1042 /* now only use physical base address of PDE and valid */
1048 BUG_ON(pd_addr & 0xFFFF00000000003EULL); 1043 BUG_ON(pd_addr & 0xFFFF00000000003EULL);
1049 1044
1050 for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { 1045 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) |
1051 struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; 1046 SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf));
1052 1047 amdgpu_ring_write(ring, hub->ctx0_ptb_addr_lo32 + vm_id * 2);
1053 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | 1048 amdgpu_ring_write(ring, lower_32_bits(pd_addr));
1054 SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); 1049
1055 amdgpu_ring_write(ring, hub->ctx0_ptb_addr_lo32 + vm_id * 2); 1050 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) |
1056 amdgpu_ring_write(ring, lower_32_bits(pd_addr)); 1051 SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf));
1057 1052 amdgpu_ring_write(ring, hub->ctx0_ptb_addr_hi32 + vm_id * 2);
1058 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | 1053 amdgpu_ring_write(ring, upper_32_bits(pd_addr));
1059 SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); 1054
1060 amdgpu_ring_write(ring, hub->ctx0_ptb_addr_hi32 + vm_id * 2); 1055 /* flush TLB */
1061 amdgpu_ring_write(ring, upper_32_bits(pd_addr)); 1056 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) |
1062 1057 SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf));
1063 /* flush TLB */ 1058 amdgpu_ring_write(ring, hub->vm_inv_eng0_req + eng);
1064 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | 1059 amdgpu_ring_write(ring, req);
1065 SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); 1060
1066 amdgpu_ring_write(ring, hub->vm_inv_eng0_req + eng); 1061 /* wait for flush */
1067 amdgpu_ring_write(ring, req); 1062 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_POLL_REGMEM) |
1068 1063 SDMA_PKT_POLL_REGMEM_HEADER_HDP_FLUSH(0) |
1069 /* wait for flush */ 1064 SDMA_PKT_POLL_REGMEM_HEADER_FUNC(3)); /* equal */
1070 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_POLL_REGMEM) | 1065 amdgpu_ring_write(ring, (hub->vm_inv_eng0_ack + eng) << 2);
1071 SDMA_PKT_POLL_REGMEM_HEADER_HDP_FLUSH(0) | 1066 amdgpu_ring_write(ring, 0);
1072 SDMA_PKT_POLL_REGMEM_HEADER_FUNC(3)); /* equal */ 1067 amdgpu_ring_write(ring, 1 << vm_id); /* reference */
1073 amdgpu_ring_write(ring, (hub->vm_inv_eng0_ack + eng) << 2); 1068 amdgpu_ring_write(ring, 1 << vm_id); /* mask */
1074 amdgpu_ring_write(ring, 0); 1069 amdgpu_ring_write(ring, SDMA_PKT_POLL_REGMEM_DW5_RETRY_COUNT(0xfff) |
1075 amdgpu_ring_write(ring, 1 << vm_id); /* reference */ 1070 SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(10));
1076 amdgpu_ring_write(ring, 1 << vm_id); /* mask */
1077 amdgpu_ring_write(ring, SDMA_PKT_POLL_REGMEM_DW5_RETRY_COUNT(0xfff) |
1078 SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(10));
1079 }
1080} 1071}
1081 1072
1082static int sdma_v4_0_early_init(void *handle) 1073static int sdma_v4_0_early_init(void *handle)
@@ -1162,8 +1153,6 @@ static int sdma_v4_0_hw_init(void *handle)
1162 sdma_v4_0_init_golden_registers(adev); 1153 sdma_v4_0_init_golden_registers(adev);
1163 1154
1164 r = sdma_v4_0_start(adev); 1155 r = sdma_v4_0_start(adev);
1165 if (r)
1166 return r;
1167 1156
1168 return r; 1157 return r;
1169} 1158}
@@ -1199,10 +1188,12 @@ static bool sdma_v4_0_is_idle(void *handle)
1199{ 1188{
1200 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1189 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1201 u32 i; 1190 u32 i;
1191
1202 for (i = 0; i < adev->sdma.num_instances; i++) { 1192 for (i = 0; i < adev->sdma.num_instances; i++) {
1203 u32 tmp = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_STATUS_REG)); 1193 u32 tmp = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_STATUS_REG));
1194
1204 if (!(tmp & SDMA0_STATUS_REG__IDLE_MASK)) 1195 if (!(tmp & SDMA0_STATUS_REG__IDLE_MASK))
1205 return false; 1196 return false;
1206 } 1197 }
1207 1198
1208 return true; 1199 return true;
@@ -1211,8 +1202,9 @@ static bool sdma_v4_0_is_idle(void *handle)
1211static int sdma_v4_0_wait_for_idle(void *handle) 1202static int sdma_v4_0_wait_for_idle(void *handle)
1212{ 1203{
1213 unsigned i; 1204 unsigned i;
1214 u32 sdma0,sdma1; 1205 u32 sdma0, sdma1;
1215 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1206 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1207
1216 for (i = 0; i < adev->usec_timeout; i++) { 1208 for (i = 0; i < adev->usec_timeout; i++) {
1217 sdma0 = RREG32(sdma_v4_0_get_reg_offset(0, mmSDMA0_STATUS_REG)); 1209 sdma0 = RREG32(sdma_v4_0_get_reg_offset(0, mmSDMA0_STATUS_REG));
1218 sdma1 = RREG32(sdma_v4_0_get_reg_offset(1, mmSDMA0_STATUS_REG)); 1210 sdma1 = RREG32(sdma_v4_0_get_reg_offset(1, mmSDMA0_STATUS_REG));
@@ -1240,7 +1232,7 @@ static int sdma_v4_0_set_trap_irq_state(struct amdgpu_device *adev,
1240 1232
1241 u32 reg_offset = (type == AMDGPU_SDMA_IRQ_TRAP0) ? 1233 u32 reg_offset = (type == AMDGPU_SDMA_IRQ_TRAP0) ?
1242 sdma_v4_0_get_reg_offset(0, mmSDMA0_CNTL) : 1234 sdma_v4_0_get_reg_offset(0, mmSDMA0_CNTL) :
1243 sdma_v4_0_get_reg_offset(1, mmSDMA0_CNTL); 1235 sdma_v4_0_get_reg_offset(1, mmSDMA0_CNTL);
1244 1236
1245 sdma_cntl = RREG32(reg_offset); 1237 sdma_cntl = RREG32(reg_offset);
1246 sdma_cntl = REG_SET_FIELD(sdma_cntl, SDMA0_CNTL, TRAP_ENABLE, 1238 sdma_cntl = REG_SET_FIELD(sdma_cntl, SDMA0_CNTL, TRAP_ENABLE,
@@ -1332,7 +1324,7 @@ static void sdma_v4_0_update_medium_grain_clock_gating(
1332 SDMA1_CLK_CTRL__SOFT_OVERRIDE2_MASK | 1324 SDMA1_CLK_CTRL__SOFT_OVERRIDE2_MASK |
1333 SDMA1_CLK_CTRL__SOFT_OVERRIDE1_MASK | 1325 SDMA1_CLK_CTRL__SOFT_OVERRIDE1_MASK |
1334 SDMA1_CLK_CTRL__SOFT_OVERRIDE0_MASK); 1326 SDMA1_CLK_CTRL__SOFT_OVERRIDE0_MASK);
1335 if(def != data) 1327 if (def != data)
1336 WREG32(SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_CLK_CTRL), data); 1328 WREG32(SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_CLK_CTRL), data);
1337 } 1329 }
1338 } else { 1330 } else {
@@ -1382,17 +1374,17 @@ static void sdma_v4_0_update_medium_grain_light_sleep(
1382 1374
1383 /* 1-not override: enable sdma1 mem light sleep */ 1375 /* 1-not override: enable sdma1 mem light sleep */
1384 if (adev->asic_type == CHIP_VEGA10) { 1376 if (adev->asic_type == CHIP_VEGA10) {
1385 def = data = RREG32(SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_POWER_CNTL)); 1377 def = data = RREG32(SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_POWER_CNTL));
1386 data |= SDMA1_POWER_CNTL__MEM_POWER_OVERRIDE_MASK; 1378 data |= SDMA1_POWER_CNTL__MEM_POWER_OVERRIDE_MASK;
1387 if (def != data) 1379 if (def != data)
1388 WREG32(SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_POWER_CNTL), data); 1380 WREG32(SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_POWER_CNTL), data);
1389 } 1381 }
1390 } else { 1382 } else {
1391 /* 0-override:disable sdma0 mem light sleep */ 1383 /* 0-override:disable sdma0 mem light sleep */
1392 def = data = RREG32(SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_POWER_CNTL)); 1384 def = data = RREG32(SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_POWER_CNTL));
1393 data &= ~SDMA0_POWER_CNTL__MEM_POWER_OVERRIDE_MASK; 1385 data &= ~SDMA0_POWER_CNTL__MEM_POWER_OVERRIDE_MASK;
1394 if (def != data) 1386 if (def != data)
1395 WREG32(SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_POWER_CNTL), data); 1387 WREG32(SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_POWER_CNTL), data);
1396 1388
1397 /* 0-override:disable sdma1 mem light sleep */ 1389 /* 0-override:disable sdma1 mem light sleep */
1398 if (adev->asic_type == CHIP_VEGA10) { 1390 if (adev->asic_type == CHIP_VEGA10) {
@@ -1473,6 +1465,7 @@ static const struct amdgpu_ring_funcs sdma_v4_0_ring_funcs = {
1473 .align_mask = 0xf, 1465 .align_mask = 0xf,
1474 .nop = SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 1466 .nop = SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP),
1475 .support_64bit_ptrs = true, 1467 .support_64bit_ptrs = true,
1468 .vmhub = AMDGPU_MMHUB,
1476 .get_rptr = sdma_v4_0_ring_get_rptr, 1469 .get_rptr = sdma_v4_0_ring_get_rptr,
1477 .get_wptr = sdma_v4_0_ring_get_wptr, 1470 .get_wptr = sdma_v4_0_ring_get_wptr,
1478 .set_wptr = sdma_v4_0_ring_set_wptr, 1471 .set_wptr = sdma_v4_0_ring_set_wptr,
@@ -1480,7 +1473,7 @@ static const struct amdgpu_ring_funcs sdma_v4_0_ring_funcs = {
1480 6 + /* sdma_v4_0_ring_emit_hdp_flush */ 1473 6 + /* sdma_v4_0_ring_emit_hdp_flush */
1481 3 + /* sdma_v4_0_ring_emit_hdp_invalidate */ 1474 3 + /* sdma_v4_0_ring_emit_hdp_invalidate */
1482 6 + /* sdma_v4_0_ring_emit_pipeline_sync */ 1475 6 + /* sdma_v4_0_ring_emit_pipeline_sync */
1483 36 + /* sdma_v4_0_ring_emit_vm_flush */ 1476 18 + /* sdma_v4_0_ring_emit_vm_flush */
1484 10 + 10 + 10, /* sdma_v4_0_ring_emit_fence x3 for user fence, vm fence */ 1477 10 + 10 + 10, /* sdma_v4_0_ring_emit_fence x3 for user fence, vm fence */
1485 .emit_ib_size = 7 + 6, /* sdma_v4_0_ring_emit_ib */ 1478 .emit_ib_size = 7 + 6, /* sdma_v4_0_ring_emit_ib */
1486 .emit_ib = sdma_v4_0_ring_emit_ib, 1479 .emit_ib = sdma_v4_0_ring_emit_ib,
@@ -1606,8 +1599,7 @@ static void sdma_v4_0_set_vm_pte_funcs(struct amdgpu_device *adev)
1606 } 1599 }
1607} 1600}
1608 1601
1609const struct amdgpu_ip_block_version sdma_v4_0_ip_block = 1602const struct amdgpu_ip_block_version sdma_v4_0_ip_block = {
1610{
1611 .type = AMD_IP_BLOCK_TYPE_SDMA, 1603 .type = AMD_IP_BLOCK_TYPE_SDMA,
1612 .major = 4, 1604 .major = 4,
1613 .minor = 0, 1605 .minor = 0,
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c
index 1da98e610e37..e945f8b07487 100644
--- a/drivers/gpu/drm/amd/amdgpu/soc15.c
+++ b/drivers/gpu/drm/amd/amdgpu/soc15.c
@@ -25,7 +25,7 @@
25#include <linux/module.h> 25#include <linux/module.h>
26#include <drm/drmP.h> 26#include <drm/drmP.h>
27#include "amdgpu.h" 27#include "amdgpu.h"
28#include "amdgpu_atombios.h" 28#include "amdgpu_atomfirmware.h"
29#include "amdgpu_ih.h" 29#include "amdgpu_ih.h"
30#include "amdgpu_uvd.h" 30#include "amdgpu_uvd.h"
31#include "amdgpu_vce.h" 31#include "amdgpu_vce.h"
@@ -405,11 +405,11 @@ static void soc15_gpu_pci_config_reset(struct amdgpu_device *adev)
405 405
406static int soc15_asic_reset(struct amdgpu_device *adev) 406static int soc15_asic_reset(struct amdgpu_device *adev)
407{ 407{
408 amdgpu_atombios_scratch_regs_engine_hung(adev, true); 408 amdgpu_atomfirmware_scratch_regs_engine_hung(adev, true);
409 409
410 soc15_gpu_pci_config_reset(adev); 410 soc15_gpu_pci_config_reset(adev);
411 411
412 amdgpu_atombios_scratch_regs_engine_hung(adev, false); 412 amdgpu_atomfirmware_scratch_regs_engine_hung(adev, false);
413 413
414 return 0; 414 return 0;
415} 415}
@@ -505,8 +505,7 @@ int soc15_set_ip_blocks(struct amdgpu_device *adev)
505 amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 505 amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
506 amdgpu_ip_block_add(adev, &gfx_v9_0_ip_block); 506 amdgpu_ip_block_add(adev, &gfx_v9_0_ip_block);
507 amdgpu_ip_block_add(adev, &sdma_v4_0_ip_block); 507 amdgpu_ip_block_add(adev, &sdma_v4_0_ip_block);
508 if (!amdgpu_sriov_vf(adev)) 508 amdgpu_ip_block_add(adev, &uvd_v7_0_ip_block);
509 amdgpu_ip_block_add(adev, &uvd_v7_0_ip_block);
510 amdgpu_ip_block_add(adev, &vce_v4_0_ip_block); 509 amdgpu_ip_block_add(adev, &vce_v4_0_ip_block);
511 break; 510 break;
512 default: 511 default:
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15_common.h b/drivers/gpu/drm/amd/amdgpu/soc15_common.h
index 2b96c806baa1..e8df6d820dbe 100644
--- a/drivers/gpu/drm/amd/amdgpu/soc15_common.h
+++ b/drivers/gpu/drm/amd/amdgpu/soc15_common.h
@@ -45,13 +45,31 @@ struct nbio_pcie_index_data {
45 u32 index_offset; 45 u32 index_offset;
46 u32 data_offset; 46 u32 data_offset;
47}; 47};
48// Register Access Macro 48
49/* Register Access Macros */
49#define SOC15_REG_OFFSET(ip, inst, reg) (0 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG0 + reg : \ 50#define SOC15_REG_OFFSET(ip, inst, reg) (0 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG0 + reg : \
50 (1 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG1 + reg : \ 51 (1 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG1 + reg : \
51 (2 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG2 + reg : \ 52 (2 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG2 + reg : \
52 (3 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG3 + reg : \ 53 (3 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG3 + reg : \
53 (ip##_BASE__INST##inst##_SEG4 + reg))))) 54 (ip##_BASE__INST##inst##_SEG4 + reg)))))
54 55
56#define WREG32_FIELD15(ip, idx, reg, field, val) \
57 WREG32(SOC15_REG_OFFSET(ip, idx, mm##reg), (RREG32(SOC15_REG_OFFSET(ip, idx, mm##reg)) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field))
58
59#define RREG32_SOC15(ip, inst, reg) \
60 RREG32( (0 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG0 + reg : \
61 (1 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG1 + reg : \
62 (2 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG2 + reg : \
63 (3 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG3 + reg : \
64 (ip##_BASE__INST##inst##_SEG4 + reg))))))
65
66#define WREG32_SOC15(ip, inst, reg, value) \
67 WREG32( (0 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG0 + reg : \
68 (1 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG1 + reg : \
69 (2 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG2 + reg : \
70 (3 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG3 + reg : \
71 (ip##_BASE__INST##inst##_SEG4 + reg))))), value)
72
55#endif 73#endif
56 74
57 75
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
index 9bcf01469282..eca8f6e01e97 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
@@ -27,10 +27,14 @@
27#include "amdgpu_uvd.h" 27#include "amdgpu_uvd.h"
28#include "soc15d.h" 28#include "soc15d.h"
29#include "soc15_common.h" 29#include "soc15_common.h"
30#include "mmsch_v1_0.h"
30 31
31#include "vega10/soc15ip.h" 32#include "vega10/soc15ip.h"
32#include "vega10/UVD/uvd_7_0_offset.h" 33#include "vega10/UVD/uvd_7_0_offset.h"
33#include "vega10/UVD/uvd_7_0_sh_mask.h" 34#include "vega10/UVD/uvd_7_0_sh_mask.h"
35#include "vega10/VCE/vce_4_0_offset.h"
36#include "vega10/VCE/vce_4_0_default.h"
37#include "vega10/VCE/vce_4_0_sh_mask.h"
34#include "vega10/NBIF/nbif_6_1_offset.h" 38#include "vega10/NBIF/nbif_6_1_offset.h"
35#include "vega10/HDP/hdp_4_0_offset.h" 39#include "vega10/HDP/hdp_4_0_offset.h"
36#include "vega10/MMHUB/mmhub_1_0_offset.h" 40#include "vega10/MMHUB/mmhub_1_0_offset.h"
@@ -41,6 +45,7 @@ static void uvd_v7_0_set_enc_ring_funcs(struct amdgpu_device *adev);
41static void uvd_v7_0_set_irq_funcs(struct amdgpu_device *adev); 45static void uvd_v7_0_set_irq_funcs(struct amdgpu_device *adev);
42static int uvd_v7_0_start(struct amdgpu_device *adev); 46static int uvd_v7_0_start(struct amdgpu_device *adev);
43static void uvd_v7_0_stop(struct amdgpu_device *adev); 47static void uvd_v7_0_stop(struct amdgpu_device *adev);
48static int uvd_v7_0_sriov_start(struct amdgpu_device *adev);
44 49
45/** 50/**
46 * uvd_v7_0_ring_get_rptr - get read pointer 51 * uvd_v7_0_ring_get_rptr - get read pointer
@@ -98,6 +103,9 @@ static uint64_t uvd_v7_0_enc_ring_get_wptr(struct amdgpu_ring *ring)
98{ 103{
99 struct amdgpu_device *adev = ring->adev; 104 struct amdgpu_device *adev = ring->adev;
100 105
106 if (ring->use_doorbell)
107 return adev->wb.wb[ring->wptr_offs];
108
101 if (ring == &adev->uvd.ring_enc[0]) 109 if (ring == &adev->uvd.ring_enc[0])
102 return RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_WPTR)); 110 return RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_WPTR));
103 else 111 else
@@ -129,6 +137,13 @@ static void uvd_v7_0_enc_ring_set_wptr(struct amdgpu_ring *ring)
129{ 137{
130 struct amdgpu_device *adev = ring->adev; 138 struct amdgpu_device *adev = ring->adev;
131 139
140 if (ring->use_doorbell) {
141 /* XXX check if swapping is necessary on BE */
142 adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
143 WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));
144 return;
145 }
146
132 if (ring == &adev->uvd.ring_enc[0]) 147 if (ring == &adev->uvd.ring_enc[0])
133 WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_WPTR), 148 WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_WPTR),
134 lower_32_bits(ring->wptr)); 149 lower_32_bits(ring->wptr));
@@ -353,7 +368,10 @@ static int uvd_v7_0_early_init(void *handle)
353{ 368{
354 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 369 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
355 370
356 adev->uvd.num_enc_rings = 2; 371 if (amdgpu_sriov_vf(adev))
372 adev->uvd.num_enc_rings = 1;
373 else
374 adev->uvd.num_enc_rings = 2;
357 uvd_v7_0_set_ring_funcs(adev); 375 uvd_v7_0_set_ring_funcs(adev);
358 uvd_v7_0_set_enc_ring_funcs(adev); 376 uvd_v7_0_set_enc_ring_funcs(adev);
359 uvd_v7_0_set_irq_funcs(adev); 377 uvd_v7_0_set_irq_funcs(adev);
@@ -406,21 +424,31 @@ static int uvd_v7_0_sw_init(void *handle)
406 r = amdgpu_uvd_resume(adev); 424 r = amdgpu_uvd_resume(adev);
407 if (r) 425 if (r)
408 return r; 426 return r;
427 if (!amdgpu_sriov_vf(adev)) {
428 ring = &adev->uvd.ring;
429 sprintf(ring->name, "uvd");
430 r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0);
431 if (r)
432 return r;
433 }
409 434
410 ring = &adev->uvd.ring;
411 sprintf(ring->name, "uvd");
412 r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0);
413 if (r)
414 return r;
415 435
416 for (i = 0; i < adev->uvd.num_enc_rings; ++i) { 436 for (i = 0; i < adev->uvd.num_enc_rings; ++i) {
417 ring = &adev->uvd.ring_enc[i]; 437 ring = &adev->uvd.ring_enc[i];
418 sprintf(ring->name, "uvd_enc%d", i); 438 sprintf(ring->name, "uvd_enc%d", i);
439 if (amdgpu_sriov_vf(adev)) {
440 ring->use_doorbell = true;
441 ring->doorbell_index = AMDGPU_DOORBELL64_UVD_RING0_1 * 2;
442 }
419 r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0); 443 r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0);
420 if (r) 444 if (r)
421 return r; 445 return r;
422 } 446 }
423 447
448 r = amdgpu_virt_alloc_mm_table(adev);
449 if (r)
450 return r;
451
424 return r; 452 return r;
425} 453}
426 454
@@ -429,6 +457,8 @@ static int uvd_v7_0_sw_fini(void *handle)
429 int i, r; 457 int i, r;
430 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 458 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
431 459
460 amdgpu_virt_free_mm_table(adev);
461
432 r = amdgpu_uvd_suspend(adev); 462 r = amdgpu_uvd_suspend(adev);
433 if (r) 463 if (r)
434 return r; 464 return r;
@@ -455,48 +485,53 @@ static int uvd_v7_0_hw_init(void *handle)
455 uint32_t tmp; 485 uint32_t tmp;
456 int i, r; 486 int i, r;
457 487
458 r = uvd_v7_0_start(adev); 488 if (amdgpu_sriov_vf(adev))
489 r = uvd_v7_0_sriov_start(adev);
490 else
491 r = uvd_v7_0_start(adev);
459 if (r) 492 if (r)
460 goto done; 493 goto done;
461 494
462 ring->ready = true; 495 if (!amdgpu_sriov_vf(adev)) {
463 r = amdgpu_ring_test_ring(ring); 496 ring->ready = true;
464 if (r) { 497 r = amdgpu_ring_test_ring(ring);
465 ring->ready = false; 498 if (r) {
466 goto done; 499 ring->ready = false;
467 } 500 goto done;
501 }
468 502
469 r = amdgpu_ring_alloc(ring, 10); 503 r = amdgpu_ring_alloc(ring, 10);
470 if (r) { 504 if (r) {
471 DRM_ERROR("amdgpu: ring failed to lock UVD ring (%d).\n", r); 505 DRM_ERROR("amdgpu: ring failed to lock UVD ring (%d).\n", r);
472 goto done; 506 goto done;
473 } 507 }
474 508
475 tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0, 509 tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0,
476 mmUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL), 0); 510 mmUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL), 0);
477 amdgpu_ring_write(ring, tmp); 511 amdgpu_ring_write(ring, tmp);
478 amdgpu_ring_write(ring, 0xFFFFF); 512 amdgpu_ring_write(ring, 0xFFFFF);
479 513
480 tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0, 514 tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0,
481 mmUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL), 0); 515 mmUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL), 0);
482 amdgpu_ring_write(ring, tmp); 516 amdgpu_ring_write(ring, tmp);
483 amdgpu_ring_write(ring, 0xFFFFF); 517 amdgpu_ring_write(ring, 0xFFFFF);
484 518
485 tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0, 519 tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0,
486 mmUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL), 0); 520 mmUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL), 0);
487 amdgpu_ring_write(ring, tmp); 521 amdgpu_ring_write(ring, tmp);
488 amdgpu_ring_write(ring, 0xFFFFF); 522 amdgpu_ring_write(ring, 0xFFFFF);
489 523
490 /* Clear timeout status bits */ 524 /* Clear timeout status bits */
491 amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0, 525 amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0,
492 mmUVD_SEMA_TIMEOUT_STATUS), 0)); 526 mmUVD_SEMA_TIMEOUT_STATUS), 0));
493 amdgpu_ring_write(ring, 0x8); 527 amdgpu_ring_write(ring, 0x8);
494 528
495 amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0, 529 amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0,
496 mmUVD_SEMA_CNTL), 0)); 530 mmUVD_SEMA_CNTL), 0));
497 amdgpu_ring_write(ring, 3); 531 amdgpu_ring_write(ring, 3);
498 532
499 amdgpu_ring_commit(ring); 533 amdgpu_ring_commit(ring);
534 }
500 535
501 for (i = 0; i < adev->uvd.num_enc_rings; ++i) { 536 for (i = 0; i < adev->uvd.num_enc_rings; ++i) {
502 ring = &adev->uvd.ring_enc[i]; 537 ring = &adev->uvd.ring_enc[i];
@@ -618,6 +653,241 @@ static void uvd_v7_0_mc_resume(struct amdgpu_device *adev)
618 WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_GP_SCRATCH4), adev->uvd.max_handles); 653 WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_GP_SCRATCH4), adev->uvd.max_handles);
619} 654}
620 655
656static int uvd_v7_0_mmsch_start(struct amdgpu_device *adev,
657 struct amdgpu_mm_table *table)
658{
659 uint32_t data = 0, loop;
660 uint64_t addr = table->gpu_addr;
661 struct mmsch_v1_0_init_header *header = (struct mmsch_v1_0_init_header *)table->cpu_addr;
662 uint32_t size;
663
664 size = header->header_size + header->vce_table_size + header->uvd_table_size;
665
666 /* 1, write to vce_mmsch_vf_ctx_addr_lo/hi register with GPU mc addr of memory descriptor location */
667 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_CTX_ADDR_LO), lower_32_bits(addr));
668 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_CTX_ADDR_HI), upper_32_bits(addr));
669
670 /* 2, update vmid of descriptor */
671 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_VMID));
672 data &= ~VCE_MMSCH_VF_VMID__VF_CTX_VMID_MASK;
673 data |= (0 << VCE_MMSCH_VF_VMID__VF_CTX_VMID__SHIFT); /* use domain0 for MM scheduler */
674 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_VMID), data);
675
676 /* 3, notify mmsch about the size of this descriptor */
677 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_CTX_SIZE), size);
678
679 /* 4, set resp to zero */
680 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_MAILBOX_RESP), 0);
681
682 /* 5, kick off the initialization and wait until VCE_MMSCH_VF_MAILBOX_RESP becomes non-zero */
683 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_MAILBOX_HOST), 0x10000001);
684
685 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_MAILBOX_RESP));
686 loop = 1000;
687 while ((data & 0x10000002) != 0x10000002) {
688 udelay(10);
689 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_MAILBOX_RESP));
690 loop--;
691 if (!loop)
692 break;
693 }
694
695 if (!loop) {
696 dev_err(adev->dev, "failed to init MMSCH, mmVCE_MMSCH_VF_MAILBOX_RESP = %x\n", data);
697 return -EBUSY;
698 }
699
700 return 0;
701}
702
703static int uvd_v7_0_sriov_start(struct amdgpu_device *adev)
704{
705 struct amdgpu_ring *ring;
706 uint32_t offset, size, tmp;
707 uint32_t table_size = 0;
708 struct mmsch_v1_0_cmd_direct_write direct_wt = { {0} };
709 struct mmsch_v1_0_cmd_direct_read_modify_write direct_rd_mod_wt = { {0} };
710 struct mmsch_v1_0_cmd_direct_polling direct_poll = { {0} };
711 struct mmsch_v1_0_cmd_end end = { {0} };
712 uint32_t *init_table = adev->virt.mm_table.cpu_addr;
713 struct mmsch_v1_0_init_header *header = (struct mmsch_v1_0_init_header *)init_table;
714
715 direct_wt.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_WRITE;
716 direct_rd_mod_wt.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE;
717 direct_poll.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_POLLING;
718 end.cmd_header.command_type = MMSCH_COMMAND__END;
719
720 if (header->uvd_table_offset == 0 && header->uvd_table_size == 0) {
721 header->version = MMSCH_VERSION;
722 header->header_size = sizeof(struct mmsch_v1_0_init_header) >> 2;
723
724 if (header->vce_table_offset == 0 && header->vce_table_size == 0)
725 header->uvd_table_offset = header->header_size;
726 else
727 header->uvd_table_offset = header->vce_table_size + header->vce_table_offset;
728
729 init_table += header->uvd_table_offset;
730
731 ring = &adev->uvd.ring;
732 size = AMDGPU_GPU_PAGE_ALIGN(adev->uvd.fw->size + 4);
733
734 /* disable clock gating */
735 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_POWER_STATUS),
736 ~UVD_POWER_STATUS__UVD_PG_MODE_MASK, 0);
737 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_STATUS),
738 0xFFFFFFFF, 0x00000004);
739 /* mc resume*/
740 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
741 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
742 lower_32_bits(adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].mc_addr));
743 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
744 upper_32_bits(adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].mc_addr));
745 offset = 0;
746 } else {
747 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
748 lower_32_bits(adev->uvd.gpu_addr));
749 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
750 upper_32_bits(adev->uvd.gpu_addr));
751 offset = size;
752 }
753
754 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0),
755 AMDGPU_UVD_FIRMWARE_OFFSET >> 3);
756 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_SIZE0), size);
757
758 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW),
759 lower_32_bits(adev->uvd.gpu_addr + offset));
760 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH),
761 upper_32_bits(adev->uvd.gpu_addr + offset));
762 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1), (1 << 21));
763 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_SIZE1), AMDGPU_UVD_HEAP_SIZE);
764
765 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW),
766 lower_32_bits(adev->uvd.gpu_addr + offset + AMDGPU_UVD_HEAP_SIZE));
767 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH),
768 upper_32_bits(adev->uvd.gpu_addr + offset + AMDGPU_UVD_HEAP_SIZE));
769 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2), (2 << 21));
770 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_SIZE2),
771 AMDGPU_UVD_STACK_SIZE + (AMDGPU_UVD_SESSION_SIZE * 40));
772
773 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_UDEC_ADDR_CONFIG),
774 adev->gfx.config.gb_addr_config);
775 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_UDEC_DB_ADDR_CONFIG),
776 adev->gfx.config.gb_addr_config);
777 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_UDEC_DBW_ADDR_CONFIG),
778 adev->gfx.config.gb_addr_config);
779 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_GP_SCRATCH4), adev->uvd.max_handles);
780 /* mc resume end*/
781
782 /* disable clock gating */
783 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_CGC_CTRL),
784 ~UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK, 0);
785
786 /* disable interupt */
787 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN),
788 ~UVD_MASTINT_EN__VCPU_EN_MASK, 0);
789
790 /* stall UMC and register bus before resetting VCPU */
791 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2),
792 ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK,
793 UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
794
795 /* put LMI, VCPU, RBC etc... into reset */
796 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET),
797 (uint32_t)(UVD_SOFT_RESET__LMI_SOFT_RESET_MASK |
798 UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK |
799 UVD_SOFT_RESET__LBSI_SOFT_RESET_MASK |
800 UVD_SOFT_RESET__RBC_SOFT_RESET_MASK |
801 UVD_SOFT_RESET__CSM_SOFT_RESET_MASK |
802 UVD_SOFT_RESET__CXW_SOFT_RESET_MASK |
803 UVD_SOFT_RESET__TAP_SOFT_RESET_MASK |
804 UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK));
805
806 /* initialize UVD memory controller */
807 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL),
808 (uint32_t)((0x40 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) |
809 UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK |
810 UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK |
811 UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK |
812 UVD_LMI_CTRL__REQ_MODE_MASK |
813 0x00100000L));
814
815 /* disable byte swapping */
816 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_SWAP_CNTL), 0);
817 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_MP_SWAP_CNTL), 0);
818
819 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_MPC_SET_MUXA0), 0x40c2040);
820 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_MPC_SET_MUXA1), 0x0);
821 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_MPC_SET_MUXB0), 0x40c2040);
822 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_MPC_SET_MUXB1), 0x0);
823 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_MPC_SET_ALU), 0);
824 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_MPC_SET_MUX), 0x88);
825
826 /* take all subblocks out of reset, except VCPU */
827 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET),
828 UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
829
830 /* enable VCPU clock */
831 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CNTL),
832 UVD_VCPU_CNTL__CLK_EN_MASK);
833
834 /* enable UMC */
835 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2),
836 ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, 0);
837
838 /* boot up the VCPU */
839 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET), 0);
840
841 MMSCH_V1_0_INSERT_DIRECT_POLL(SOC15_REG_OFFSET(UVD, 0, mmUVD_STATUS), 0x02, 0x02);
842
843 /* enable master interrupt */
844 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN),
845 ~(UVD_MASTINT_EN__VCPU_EN_MASK|UVD_MASTINT_EN__SYS_EN_MASK),
846 (UVD_MASTINT_EN__VCPU_EN_MASK|UVD_MASTINT_EN__SYS_EN_MASK));
847
848 /* clear the bit 4 of UVD_STATUS */
849 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_STATUS),
850 ~(2 << UVD_STATUS__VCPU_REPORT__SHIFT), 0);
851
852 /* force RBC into idle state */
853 size = order_base_2(ring->ring_size);
854 tmp = REG_SET_FIELD(0, UVD_RBC_RB_CNTL, RB_BUFSZ, size);
855 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_BLKSZ, 1);
856 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1);
857 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_WPTR_POLL_EN, 0);
858 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1);
859 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1);
860 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_CNTL), tmp);
861
862 /* set the write pointer delay */
863 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_WPTR_CNTL), 0);
864
865 /* set the wb address */
866 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_RPTR_ADDR),
867 (upper_32_bits(ring->gpu_addr) >> 2));
868
869 /* programm the RB_BASE for ring buffer */
870 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW),
871 lower_32_bits(ring->gpu_addr));
872 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH),
873 upper_32_bits(ring->gpu_addr));
874
875 ring->wptr = 0;
876 ring = &adev->uvd.ring_enc[0];
877 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_BASE_LO), ring->gpu_addr);
878 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_BASE_HI), upper_32_bits(ring->gpu_addr));
879 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_SIZE), ring->ring_size / 4);
880
881 /* add end packet */
882 memcpy((void *)init_table, &end, sizeof(struct mmsch_v1_0_cmd_end));
883 table_size += sizeof(struct mmsch_v1_0_cmd_end) / 4;
884 header->uvd_table_size = table_size;
885
886 return uvd_v7_0_mmsch_start(adev, &adev->virt.mm_table);
887 }
888 return -EINVAL; /* already initializaed ? */
889}
890
621/** 891/**
622 * uvd_v7_0_start - start UVD block 892 * uvd_v7_0_start - start UVD block
623 * 893 *
@@ -1034,42 +1304,38 @@ static void uvd_v7_0_vm_reg_wait(struct amdgpu_ring *ring,
1034static void uvd_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring, 1304static void uvd_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
1035 unsigned vm_id, uint64_t pd_addr) 1305 unsigned vm_id, uint64_t pd_addr)
1036{ 1306{
1307 struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
1037 uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); 1308 uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id);
1038 uint32_t data0, data1, mask; 1309 uint32_t data0, data1, mask;
1039 unsigned eng = ring->idx; 1310 unsigned eng = ring->vm_inv_eng;
1040 unsigned i;
1041 1311
1042 pd_addr = pd_addr | 0x1; /* valid bit */ 1312 pd_addr = pd_addr | 0x1; /* valid bit */
1043 /* now only use physical base address of PDE and valid */ 1313 /* now only use physical base address of PDE and valid */
1044 BUG_ON(pd_addr & 0xFFFF00000000003EULL); 1314 BUG_ON(pd_addr & 0xFFFF00000000003EULL);
1045 1315
1046 for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { 1316 data0 = (hub->ctx0_ptb_addr_hi32 + vm_id * 2) << 2;
1047 struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; 1317 data1 = upper_32_bits(pd_addr);
1048 1318 uvd_v7_0_vm_reg_write(ring, data0, data1);
1049 data0 = (hub->ctx0_ptb_addr_hi32 + vm_id * 2) << 2; 1319
1050 data1 = upper_32_bits(pd_addr); 1320 data0 = (hub->ctx0_ptb_addr_lo32 + vm_id * 2) << 2;
1051 uvd_v7_0_vm_reg_write(ring, data0, data1); 1321 data1 = lower_32_bits(pd_addr);
1052 1322 uvd_v7_0_vm_reg_write(ring, data0, data1);
1053 data0 = (hub->ctx0_ptb_addr_lo32 + vm_id * 2) << 2; 1323
1054 data1 = lower_32_bits(pd_addr); 1324 data0 = (hub->ctx0_ptb_addr_lo32 + vm_id * 2) << 2;
1055 uvd_v7_0_vm_reg_write(ring, data0, data1); 1325 data1 = lower_32_bits(pd_addr);
1056 1326 mask = 0xffffffff;
1057 data0 = (hub->ctx0_ptb_addr_lo32 + vm_id * 2) << 2; 1327 uvd_v7_0_vm_reg_wait(ring, data0, data1, mask);
1058 data1 = lower_32_bits(pd_addr); 1328
1059 mask = 0xffffffff; 1329 /* flush TLB */
1060 uvd_v7_0_vm_reg_wait(ring, data0, data1, mask); 1330 data0 = (hub->vm_inv_eng0_req + eng) << 2;
1061 1331 data1 = req;
1062 /* flush TLB */ 1332 uvd_v7_0_vm_reg_write(ring, data0, data1);
1063 data0 = (hub->vm_inv_eng0_req + eng) << 2; 1333
1064 data1 = req; 1334 /* wait for flush */
1065 uvd_v7_0_vm_reg_write(ring, data0, data1); 1335 data0 = (hub->vm_inv_eng0_ack + eng) << 2;
1066 1336 data1 = 1 << vm_id;
1067 /* wait for flush */ 1337 mask = 1 << vm_id;
1068 data0 = (hub->vm_inv_eng0_ack + eng) << 2; 1338 uvd_v7_0_vm_reg_wait(ring, data0, data1, mask);
1069 data1 = 1 << vm_id;
1070 mask = 1 << vm_id;
1071 uvd_v7_0_vm_reg_wait(ring, data0, data1, mask);
1072 }
1073} 1339}
1074 1340
1075static void uvd_v7_0_enc_ring_insert_end(struct amdgpu_ring *ring) 1341static void uvd_v7_0_enc_ring_insert_end(struct amdgpu_ring *ring)
@@ -1080,44 +1346,37 @@ static void uvd_v7_0_enc_ring_insert_end(struct amdgpu_ring *ring)
1080static void uvd_v7_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring, 1346static void uvd_v7_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring,
1081 unsigned int vm_id, uint64_t pd_addr) 1347 unsigned int vm_id, uint64_t pd_addr)
1082{ 1348{
1349 struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
1083 uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); 1350 uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id);
1084 unsigned eng = ring->idx; 1351 unsigned eng = ring->vm_inv_eng;
1085 unsigned i;
1086 1352
1087 pd_addr = pd_addr | 0x1; /* valid bit */ 1353 pd_addr = pd_addr | 0x1; /* valid bit */
1088 /* now only use physical base address of PDE and valid */ 1354 /* now only use physical base address of PDE and valid */
1089 BUG_ON(pd_addr & 0xFFFF00000000003EULL); 1355 BUG_ON(pd_addr & 0xFFFF00000000003EULL);
1090 1356
1091 for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { 1357 amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WRITE);
1092 struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; 1358 amdgpu_ring_write(ring, (hub->ctx0_ptb_addr_hi32 + vm_id * 2) << 2);
1093 1359 amdgpu_ring_write(ring, upper_32_bits(pd_addr));
1094 amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WRITE); 1360
1095 amdgpu_ring_write(ring, 1361 amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WRITE);
1096 (hub->ctx0_ptb_addr_hi32 + vm_id * 2) << 2); 1362 amdgpu_ring_write(ring, (hub->ctx0_ptb_addr_lo32 + vm_id * 2) << 2);
1097 amdgpu_ring_write(ring, upper_32_bits(pd_addr)); 1363 amdgpu_ring_write(ring, lower_32_bits(pd_addr));
1098 1364
1099 amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WRITE); 1365 amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WAIT);
1100 amdgpu_ring_write(ring, 1366 amdgpu_ring_write(ring, (hub->ctx0_ptb_addr_lo32 + vm_id * 2) << 2);
1101 (hub->ctx0_ptb_addr_lo32 + vm_id * 2) << 2); 1367 amdgpu_ring_write(ring, 0xffffffff);
1102 amdgpu_ring_write(ring, lower_32_bits(pd_addr)); 1368 amdgpu_ring_write(ring, lower_32_bits(pd_addr));
1103 1369
1104 amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WAIT); 1370 /* flush TLB */
1105 amdgpu_ring_write(ring, 1371 amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WRITE);
1106 (hub->ctx0_ptb_addr_lo32 + vm_id * 2) << 2); 1372 amdgpu_ring_write(ring, (hub->vm_inv_eng0_req + eng) << 2);
1107 amdgpu_ring_write(ring, 0xffffffff); 1373 amdgpu_ring_write(ring, req);
1108 amdgpu_ring_write(ring, lower_32_bits(pd_addr)); 1374
1109 1375 /* wait for flush */
1110 /* flush TLB */ 1376 amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WAIT);
1111 amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WRITE); 1377 amdgpu_ring_write(ring, (hub->vm_inv_eng0_ack + eng) << 2);
1112 amdgpu_ring_write(ring, (hub->vm_inv_eng0_req + eng) << 2); 1378 amdgpu_ring_write(ring, 1 << vm_id);
1113 amdgpu_ring_write(ring, req); 1379 amdgpu_ring_write(ring, 1 << vm_id);
1114
1115 /* wait for flush */
1116 amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WAIT);
1117 amdgpu_ring_write(ring, (hub->vm_inv_eng0_ack + eng) << 2);
1118 amdgpu_ring_write(ring, 1 << vm_id);
1119 amdgpu_ring_write(ring, 1 << vm_id);
1120 }
1121} 1380}
1122 1381
1123#if 0 1382#if 0
@@ -1240,7 +1499,8 @@ static int uvd_v7_0_process_interrupt(struct amdgpu_device *adev,
1240 amdgpu_fence_process(&adev->uvd.ring_enc[0]); 1499 amdgpu_fence_process(&adev->uvd.ring_enc[0]);
1241 break; 1500 break;
1242 case 120: 1501 case 120:
1243 amdgpu_fence_process(&adev->uvd.ring_enc[1]); 1502 if (!amdgpu_sriov_vf(adev))
1503 amdgpu_fence_process(&adev->uvd.ring_enc[1]);
1244 break; 1504 break;
1245 default: 1505 default:
1246 DRM_ERROR("Unhandled interrupt: %d %d\n", 1506 DRM_ERROR("Unhandled interrupt: %d %d\n",
@@ -1448,13 +1708,14 @@ static const struct amdgpu_ring_funcs uvd_v7_0_ring_vm_funcs = {
1448 .align_mask = 0xf, 1708 .align_mask = 0xf,
1449 .nop = PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP), 0), 1709 .nop = PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP), 0),
1450 .support_64bit_ptrs = false, 1710 .support_64bit_ptrs = false,
1711 .vmhub = AMDGPU_MMHUB,
1451 .get_rptr = uvd_v7_0_ring_get_rptr, 1712 .get_rptr = uvd_v7_0_ring_get_rptr,
1452 .get_wptr = uvd_v7_0_ring_get_wptr, 1713 .get_wptr = uvd_v7_0_ring_get_wptr,
1453 .set_wptr = uvd_v7_0_ring_set_wptr, 1714 .set_wptr = uvd_v7_0_ring_set_wptr,
1454 .emit_frame_size = 1715 .emit_frame_size =
1455 2 + /* uvd_v7_0_ring_emit_hdp_flush */ 1716 2 + /* uvd_v7_0_ring_emit_hdp_flush */
1456 2 + /* uvd_v7_0_ring_emit_hdp_invalidate */ 1717 2 + /* uvd_v7_0_ring_emit_hdp_invalidate */
1457 34 * AMDGPU_MAX_VMHUBS + /* uvd_v7_0_ring_emit_vm_flush */ 1718 34 + /* uvd_v7_0_ring_emit_vm_flush */
1458 14 + 14, /* uvd_v7_0_ring_emit_fence x2 vm fence */ 1719 14 + 14, /* uvd_v7_0_ring_emit_fence x2 vm fence */
1459 .emit_ib_size = 8, /* uvd_v7_0_ring_emit_ib */ 1720 .emit_ib_size = 8, /* uvd_v7_0_ring_emit_ib */
1460 .emit_ib = uvd_v7_0_ring_emit_ib, 1721 .emit_ib = uvd_v7_0_ring_emit_ib,
@@ -1475,11 +1736,12 @@ static const struct amdgpu_ring_funcs uvd_v7_0_enc_ring_vm_funcs = {
1475 .align_mask = 0x3f, 1736 .align_mask = 0x3f,
1476 .nop = HEVC_ENC_CMD_NO_OP, 1737 .nop = HEVC_ENC_CMD_NO_OP,
1477 .support_64bit_ptrs = false, 1738 .support_64bit_ptrs = false,
1739 .vmhub = AMDGPU_MMHUB,
1478 .get_rptr = uvd_v7_0_enc_ring_get_rptr, 1740 .get_rptr = uvd_v7_0_enc_ring_get_rptr,
1479 .get_wptr = uvd_v7_0_enc_ring_get_wptr, 1741 .get_wptr = uvd_v7_0_enc_ring_get_wptr,
1480 .set_wptr = uvd_v7_0_enc_ring_set_wptr, 1742 .set_wptr = uvd_v7_0_enc_ring_set_wptr,
1481 .emit_frame_size = 1743 .emit_frame_size =
1482 17 * AMDGPU_MAX_VMHUBS + /* uvd_v7_0_enc_ring_emit_vm_flush */ 1744 17 + /* uvd_v7_0_enc_ring_emit_vm_flush */
1483 5 + 5 + /* uvd_v7_0_enc_ring_emit_fence x2 vm fence */ 1745 5 + 5 + /* uvd_v7_0_enc_ring_emit_fence x2 vm fence */
1484 1, /* uvd_v7_0_enc_ring_insert_end */ 1746 1, /* uvd_v7_0_enc_ring_insert_end */
1485 .emit_ib_size = 5, /* uvd_v7_0_enc_ring_emit_ib */ 1747 .emit_ib_size = 5, /* uvd_v7_0_enc_ring_emit_ib */
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
index edde5fe938d6..139f964196b4 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
@@ -49,63 +49,6 @@ static void vce_v4_0_mc_resume(struct amdgpu_device *adev);
49static void vce_v4_0_set_ring_funcs(struct amdgpu_device *adev); 49static void vce_v4_0_set_ring_funcs(struct amdgpu_device *adev);
50static void vce_v4_0_set_irq_funcs(struct amdgpu_device *adev); 50static void vce_v4_0_set_irq_funcs(struct amdgpu_device *adev);
51 51
52static inline void mmsch_insert_direct_wt(struct mmsch_v1_0_cmd_direct_write *direct_wt,
53 uint32_t *init_table,
54 uint32_t reg_offset,
55 uint32_t value)
56{
57 direct_wt->cmd_header.reg_offset = reg_offset;
58 direct_wt->reg_value = value;
59 memcpy((void *)init_table, direct_wt, sizeof(struct mmsch_v1_0_cmd_direct_write));
60}
61
62static inline void mmsch_insert_direct_rd_mod_wt(struct mmsch_v1_0_cmd_direct_read_modify_write *direct_rd_mod_wt,
63 uint32_t *init_table,
64 uint32_t reg_offset,
65 uint32_t mask, uint32_t data)
66{
67 direct_rd_mod_wt->cmd_header.reg_offset = reg_offset;
68 direct_rd_mod_wt->mask_value = mask;
69 direct_rd_mod_wt->write_data = data;
70 memcpy((void *)init_table, direct_rd_mod_wt,
71 sizeof(struct mmsch_v1_0_cmd_direct_read_modify_write));
72}
73
74static inline void mmsch_insert_direct_poll(struct mmsch_v1_0_cmd_direct_polling *direct_poll,
75 uint32_t *init_table,
76 uint32_t reg_offset,
77 uint32_t mask, uint32_t wait)
78{
79 direct_poll->cmd_header.reg_offset = reg_offset;
80 direct_poll->mask_value = mask;
81 direct_poll->wait_value = wait;
82 memcpy((void *)init_table, direct_poll, sizeof(struct mmsch_v1_0_cmd_direct_polling));
83}
84
85#define INSERT_DIRECT_RD_MOD_WT(reg, mask, data) { \
86 mmsch_insert_direct_rd_mod_wt(&direct_rd_mod_wt, \
87 init_table, (reg), \
88 (mask), (data)); \
89 init_table += sizeof(struct mmsch_v1_0_cmd_direct_read_modify_write)/4; \
90 table_size += sizeof(struct mmsch_v1_0_cmd_direct_read_modify_write)/4; \
91}
92
93#define INSERT_DIRECT_WT(reg, value) { \
94 mmsch_insert_direct_wt(&direct_wt, \
95 init_table, (reg), \
96 (value)); \
97 init_table += sizeof(struct mmsch_v1_0_cmd_direct_write)/4; \
98 table_size += sizeof(struct mmsch_v1_0_cmd_direct_write)/4; \
99}
100
101#define INSERT_DIRECT_POLL(reg, mask, wait) { \
102 mmsch_insert_direct_poll(&direct_poll, \
103 init_table, (reg), \
104 (mask), (wait)); \
105 init_table += sizeof(struct mmsch_v1_0_cmd_direct_polling)/4; \
106 table_size += sizeof(struct mmsch_v1_0_cmd_direct_polling)/4; \
107}
108
109/** 52/**
110 * vce_v4_0_ring_get_rptr - get read pointer 53 * vce_v4_0_ring_get_rptr - get read pointer
111 * 54 *
@@ -280,60 +223,73 @@ static int vce_v4_0_sriov_start(struct amdgpu_device *adev)
280 init_table += header->vce_table_offset; 223 init_table += header->vce_table_offset;
281 224
282 ring = &adev->vce.ring[0]; 225 ring = &adev->vce.ring[0];
283 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_RPTR), ring->wptr); 226 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_BASE_LO),
284 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR), ring->wptr); 227 lower_32_bits(ring->gpu_addr));
285 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_BASE_LO), lower_32_bits(ring->gpu_addr)); 228 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_BASE_HI),
286 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_BASE_HI), upper_32_bits(ring->gpu_addr)); 229 upper_32_bits(ring->gpu_addr));
287 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_SIZE), ring->ring_size / 4); 230 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_SIZE),
231 ring->ring_size / 4);
288 232
289 /* BEGING OF MC_RESUME */ 233 /* BEGING OF MC_RESUME */
290 INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_CLOCK_GATING_A), ~(1 << 16), 0); 234 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_CTRL), 0x398000);
291 INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_CLOCK_GATING), ~0xFF9FF000, 0x1FF000); 235 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_CACHE_CTRL), ~0x1, 0);
292 INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_REG_CLOCK_GATING), ~0x3F, 0x3F); 236 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_SWAP_CNTL), 0);
293 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_CLOCK_GATING_B), 0x1FF); 237 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_SWAP_CNTL1), 0);
294 238 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VM_CTRL), 0);
295 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_CTRL), 0x398000); 239
296 INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_CACHE_CTRL), ~0x1, 0); 240 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
297 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_SWAP_CNTL), 0); 241 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR0),
298 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_SWAP_CNTL1), 0); 242 adev->firmware.ucode[AMDGPU_UCODE_ID_VCE].mc_addr >> 8);
299 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VM_CTRL), 0); 243 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR1),
300 244 adev->firmware.ucode[AMDGPU_UCODE_ID_VCE].mc_addr >> 8);
301 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR0), adev->vce.gpu_addr >> 8); 245 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR2),
302 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR1), adev->vce.gpu_addr >> 8); 246 adev->firmware.ucode[AMDGPU_UCODE_ID_VCE].mc_addr >> 8);
303 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR2), adev->vce.gpu_addr >> 8); 247 } else {
248 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR0),
249 adev->vce.gpu_addr >> 8);
250 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR1),
251 adev->vce.gpu_addr >> 8);
252 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR2),
253 adev->vce.gpu_addr >> 8);
254 }
304 255
305 offset = AMDGPU_VCE_FIRMWARE_OFFSET; 256 offset = AMDGPU_VCE_FIRMWARE_OFFSET;
306 size = VCE_V4_0_FW_SIZE; 257 size = VCE_V4_0_FW_SIZE;
307 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET0), offset & 0x7FFFFFFF); 258 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET0),
308 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_SIZE0), size); 259 offset & 0x7FFFFFFF);
260 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_SIZE0), size);
309 261
310 offset += size; 262 offset += size;
311 size = VCE_V4_0_STACK_SIZE; 263 size = VCE_V4_0_STACK_SIZE;
312 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET1), offset & 0x7FFFFFFF); 264 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET1),
313 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_SIZE1), size); 265 offset & 0x7FFFFFFF);
266 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_SIZE1), size);
314 267
315 offset += size; 268 offset += size;
316 size = VCE_V4_0_DATA_SIZE; 269 size = VCE_V4_0_DATA_SIZE;
317 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET2), offset & 0x7FFFFFFF); 270 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET2),
318 INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_SIZE2), size); 271 offset & 0x7FFFFFFF);
272 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_SIZE2), size);
319 273
320 INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_CTRL2), ~0x100, 0); 274 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_CTRL2), ~0x100, 0);
321 INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_SYS_INT_EN), 275 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_SYS_INT_EN),
322 0xffffffff, VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK); 276 0xffffffff, VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK);
323 277
324 /* end of MC_RESUME */ 278 /* end of MC_RESUME */
325 INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CNTL), 279 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS),
326 ~0x200001, VCE_VCPU_CNTL__CLK_EN_MASK); 280 VCE_STATUS__JOB_BUSY_MASK, ~VCE_STATUS__JOB_BUSY_MASK);
327 INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_SOFT_RESET), 281 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CNTL),
328 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK, 0); 282 ~0x200001, VCE_VCPU_CNTL__CLK_EN_MASK);
283 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_SOFT_RESET),
284 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK, 0);
329 285
330 INSERT_DIRECT_POLL(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS), 286 MMSCH_V1_0_INSERT_DIRECT_POLL(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS),
331 VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK, 287 VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK,
332 VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK); 288 VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK);
333 289
334 /* clear BUSY flag */ 290 /* clear BUSY flag */
335 INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS), 291 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS),
336 ~VCE_STATUS__JOB_BUSY_MASK, 0); 292 ~VCE_STATUS__JOB_BUSY_MASK, 0);
337 293
338 /* add end packet */ 294 /* add end packet */
339 memcpy((void *)init_table, &end, sizeof(struct mmsch_v1_0_cmd_end)); 295 memcpy((void *)init_table, &end, sizeof(struct mmsch_v1_0_cmd_end));
@@ -494,20 +450,9 @@ static int vce_v4_0_sw_init(void *handle)
494 return r; 450 return r;
495 } 451 }
496 452
497 if (amdgpu_sriov_vf(adev)) { 453 r = amdgpu_virt_alloc_mm_table(adev);
498 r = amdgpu_bo_create_kernel(adev, PAGE_SIZE, PAGE_SIZE, 454 if (r)
499 AMDGPU_GEM_DOMAIN_VRAM,
500 &adev->virt.mm_table.bo,
501 &adev->virt.mm_table.gpu_addr,
502 (void *)&adev->virt.mm_table.cpu_addr);
503 if (!r) {
504 memset((void *)adev->virt.mm_table.cpu_addr, 0, PAGE_SIZE);
505 printk("mm table gpu addr = 0x%llx, cpu addr = %p. \n",
506 adev->virt.mm_table.gpu_addr,
507 adev->virt.mm_table.cpu_addr);
508 }
509 return r; 455 return r;
510 }
511 456
512 return r; 457 return r;
513} 458}
@@ -518,10 +463,7 @@ static int vce_v4_0_sw_fini(void *handle)
518 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 463 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
519 464
520 /* free MM table */ 465 /* free MM table */
521 if (amdgpu_sriov_vf(adev)) 466 amdgpu_virt_free_mm_table(adev);
522 amdgpu_bo_free_kernel(&adev->virt.mm_table.bo,
523 &adev->virt.mm_table.gpu_addr,
524 (void *)&adev->virt.mm_table.cpu_addr);
525 467
526 r = amdgpu_vce_suspend(adev); 468 r = amdgpu_vce_suspend(adev);
527 if (r) 469 if (r)
@@ -973,44 +915,37 @@ static void vce_v4_0_ring_insert_end(struct amdgpu_ring *ring)
973static void vce_v4_0_emit_vm_flush(struct amdgpu_ring *ring, 915static void vce_v4_0_emit_vm_flush(struct amdgpu_ring *ring,
974 unsigned int vm_id, uint64_t pd_addr) 916 unsigned int vm_id, uint64_t pd_addr)
975{ 917{
918 struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
976 uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); 919 uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id);
977 unsigned eng = ring->idx; 920 unsigned eng = ring->vm_inv_eng;
978 unsigned i;
979 921
980 pd_addr = pd_addr | 0x1; /* valid bit */ 922 pd_addr = pd_addr | 0x1; /* valid bit */
981 /* now only use physical base address of PDE and valid */ 923 /* now only use physical base address of PDE and valid */
982 BUG_ON(pd_addr & 0xFFFF00000000003EULL); 924 BUG_ON(pd_addr & 0xFFFF00000000003EULL);
983 925
984 for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { 926 amdgpu_ring_write(ring, VCE_CMD_REG_WRITE);
985 struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; 927 amdgpu_ring_write(ring, (hub->ctx0_ptb_addr_hi32 + vm_id * 2) << 2);
986 928 amdgpu_ring_write(ring, upper_32_bits(pd_addr));
987 amdgpu_ring_write(ring, VCE_CMD_REG_WRITE); 929
988 amdgpu_ring_write(ring, 930 amdgpu_ring_write(ring, VCE_CMD_REG_WRITE);
989 (hub->ctx0_ptb_addr_hi32 + vm_id * 2) << 2); 931 amdgpu_ring_write(ring, (hub->ctx0_ptb_addr_lo32 + vm_id * 2) << 2);
990 amdgpu_ring_write(ring, upper_32_bits(pd_addr)); 932 amdgpu_ring_write(ring, lower_32_bits(pd_addr));
991 933
992 amdgpu_ring_write(ring, VCE_CMD_REG_WRITE); 934 amdgpu_ring_write(ring, VCE_CMD_REG_WAIT);
993 amdgpu_ring_write(ring, 935 amdgpu_ring_write(ring, (hub->ctx0_ptb_addr_lo32 + vm_id * 2) << 2);
994 (hub->ctx0_ptb_addr_lo32 + vm_id * 2) << 2); 936 amdgpu_ring_write(ring, 0xffffffff);
995 amdgpu_ring_write(ring, lower_32_bits(pd_addr)); 937 amdgpu_ring_write(ring, lower_32_bits(pd_addr));
996 938
997 amdgpu_ring_write(ring, VCE_CMD_REG_WAIT); 939 /* flush TLB */
998 amdgpu_ring_write(ring, 940 amdgpu_ring_write(ring, VCE_CMD_REG_WRITE);
999 (hub->ctx0_ptb_addr_lo32 + vm_id * 2) << 2); 941 amdgpu_ring_write(ring, (hub->vm_inv_eng0_req + eng) << 2);
1000 amdgpu_ring_write(ring, 0xffffffff); 942 amdgpu_ring_write(ring, req);
1001 amdgpu_ring_write(ring, lower_32_bits(pd_addr)); 943
1002 944 /* wait for flush */
1003 /* flush TLB */ 945 amdgpu_ring_write(ring, VCE_CMD_REG_WAIT);
1004 amdgpu_ring_write(ring, VCE_CMD_REG_WRITE); 946 amdgpu_ring_write(ring, (hub->vm_inv_eng0_ack + eng) << 2);
1005 amdgpu_ring_write(ring, (hub->vm_inv_eng0_req + eng) << 2); 947 amdgpu_ring_write(ring, 1 << vm_id);
1006 amdgpu_ring_write(ring, req); 948 amdgpu_ring_write(ring, 1 << vm_id);
1007
1008 /* wait for flush */
1009 amdgpu_ring_write(ring, VCE_CMD_REG_WAIT);
1010 amdgpu_ring_write(ring, (hub->vm_inv_eng0_ack + eng) << 2);
1011 amdgpu_ring_write(ring, 1 << vm_id);
1012 amdgpu_ring_write(ring, 1 << vm_id);
1013 }
1014} 949}
1015 950
1016static int vce_v4_0_set_interrupt_state(struct amdgpu_device *adev, 951static int vce_v4_0_set_interrupt_state(struct amdgpu_device *adev,
@@ -1078,12 +1013,13 @@ static const struct amdgpu_ring_funcs vce_v4_0_ring_vm_funcs = {
1078 .align_mask = 0x3f, 1013 .align_mask = 0x3f,
1079 .nop = VCE_CMD_NO_OP, 1014 .nop = VCE_CMD_NO_OP,
1080 .support_64bit_ptrs = false, 1015 .support_64bit_ptrs = false,
1016 .vmhub = AMDGPU_MMHUB,
1081 .get_rptr = vce_v4_0_ring_get_rptr, 1017 .get_rptr = vce_v4_0_ring_get_rptr,
1082 .get_wptr = vce_v4_0_ring_get_wptr, 1018 .get_wptr = vce_v4_0_ring_get_wptr,
1083 .set_wptr = vce_v4_0_ring_set_wptr, 1019 .set_wptr = vce_v4_0_ring_set_wptr,
1084 .parse_cs = amdgpu_vce_ring_parse_cs_vm, 1020 .parse_cs = amdgpu_vce_ring_parse_cs_vm,
1085 .emit_frame_size = 1021 .emit_frame_size =
1086 17 * AMDGPU_MAX_VMHUBS + /* vce_v4_0_emit_vm_flush */ 1022 17 + /* vce_v4_0_emit_vm_flush */
1087 5 + 5 + /* amdgpu_vce_ring_emit_fence x2 vm fence */ 1023 5 + 5 + /* amdgpu_vce_ring_emit_fence x2 vm fence */
1088 1, /* vce_v4_0_ring_insert_end */ 1024 1, /* vce_v4_0_ring_insert_end */
1089 .emit_ib_size = 5, /* vce_v4_0_ring_emit_ib */ 1025 .emit_ib_size = 5, /* vce_v4_0_ring_emit_ib */
diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h
index 2ccf44e580de..1d1ac1ef94f7 100644
--- a/drivers/gpu/drm/amd/include/amd_shared.h
+++ b/drivers/gpu/drm/amd/include/amd_shared.h
@@ -138,6 +138,12 @@ struct amd_pp_profile {
138 uint8_t down_hyst; 138 uint8_t down_hyst;
139}; 139};
140 140
141enum amd_fan_ctrl_mode {
142 AMD_FAN_CTRL_NONE = 0,
143 AMD_FAN_CTRL_MANUAL = 1,
144 AMD_FAN_CTRL_AUTO = 2,
145};
146
141/* CG flags */ 147/* CG flags */
142#define AMD_CG_SUPPORT_GFX_MGCG (1 << 0) 148#define AMD_CG_SUPPORT_GFX_MGCG (1 << 0)
143#define AMD_CG_SUPPORT_GFX_MGLS (1 << 1) 149#define AMD_CG_SUPPORT_GFX_MGLS (1 << 1)
diff --git a/drivers/gpu/drm/amd/include/cgs_common.h b/drivers/gpu/drm/amd/include/cgs_common.h
index 17b9d41f3e87..0a94f749e3c0 100644
--- a/drivers/gpu/drm/amd/include/cgs_common.h
+++ b/drivers/gpu/drm/amd/include/cgs_common.h
@@ -54,20 +54,6 @@ enum cgs_ind_reg {
54}; 54};
55 55
56/** 56/**
57 * enum cgs_clock - Clocks controlled by the SMU
58 */
59enum cgs_clock {
60 CGS_CLOCK__SCLK,
61 CGS_CLOCK__MCLK,
62 CGS_CLOCK__VCLK,
63 CGS_CLOCK__DCLK,
64 CGS_CLOCK__ECLK,
65 CGS_CLOCK__ACLK,
66 CGS_CLOCK__ICLK,
67 /* ... */
68};
69
70/**
71 * enum cgs_engine - Engines that can be statically power-gated 57 * enum cgs_engine - Engines that can be statically power-gated
72 */ 58 */
73enum cgs_engine { 59enum cgs_engine {
@@ -81,15 +67,6 @@ enum cgs_engine {
81 /* ... */ 67 /* ... */
82}; 68};
83 69
84/**
85 * enum cgs_voltage_planes - Voltage planes for external camera HW
86 */
87enum cgs_voltage_planes {
88 CGS_VOLTAGE_PLANE__SENSOR0,
89 CGS_VOLTAGE_PLANE__SENSOR1,
90 /* ... */
91};
92
93/* 70/*
94 * enum cgs_ucode_id - Firmware types for different IPs 71 * enum cgs_ucode_id - Firmware types for different IPs
95 */ 72 */
@@ -147,17 +124,6 @@ enum cgs_resource_type {
147}; 124};
148 125
149/** 126/**
150 * struct cgs_clock_limits - Clock limits
151 *
152 * Clocks are specified in 10KHz units.
153 */
154struct cgs_clock_limits {
155 unsigned min; /**< Minimum supported frequency */
156 unsigned max; /**< Maxumim supported frequency */
157 unsigned sustainable; /**< Thermally sustainable frequency */
158};
159
160/**
161 * struct cgs_firmware_info - Firmware information 127 * struct cgs_firmware_info - Firmware information
162 */ 128 */
163struct cgs_firmware_info { 129struct cgs_firmware_info {
@@ -221,54 +187,6 @@ struct cgs_acpi_method_info {
221}; 187};
222 188
223/** 189/**
224 * cgs_gpu_mem_info() - Return information about memory heaps
225 * @cgs_device: opaque device handle
226 * @type: memory type
227 * @mc_start: Start MC address of the heap (output)
228 * @mc_size: MC address space size (output)
229 * @mem_size: maximum amount of memory available for allocation (output)
230 *
231 * This function returns information about memory heaps. The type
232 * parameter is used to select the memory heap. The mc_start and
233 * mc_size for GART heaps may be bigger than the memory available for
234 * allocation.
235 *
236 * mc_start and mc_size are undefined for non-contiguous FB memory
237 * types, since buffers allocated with these types may or may not be
238 * GART mapped.
239 *
240 * Return: 0 on success, -errno otherwise
241 */
242typedef int (*cgs_gpu_mem_info_t)(struct cgs_device *cgs_device, enum cgs_gpu_mem_type type,
243 uint64_t *mc_start, uint64_t *mc_size,
244 uint64_t *mem_size);
245
246/**
247 * cgs_gmap_kmem() - map kernel memory to GART aperture
248 * @cgs_device: opaque device handle
249 * @kmem: pointer to kernel memory
250 * @size: size to map
251 * @min_offset: minimum offset from start of GART aperture
252 * @max_offset: maximum offset from start of GART aperture
253 * @kmem_handle: kernel memory handle (output)
254 * @mcaddr: MC address (output)
255 *
256 * Return: 0 on success, -errno otherwise
257 */
258typedef int (*cgs_gmap_kmem_t)(struct cgs_device *cgs_device, void *kmem, uint64_t size,
259 uint64_t min_offset, uint64_t max_offset,
260 cgs_handle_t *kmem_handle, uint64_t *mcaddr);
261
262/**
263 * cgs_gunmap_kmem() - unmap kernel memory
264 * @cgs_device: opaque device handle
265 * @kmem_handle: kernel memory handle returned by gmap_kmem
266 *
267 * Return: 0 on success, -errno otherwise
268 */
269typedef int (*cgs_gunmap_kmem_t)(struct cgs_device *cgs_device, cgs_handle_t kmem_handle);
270
271/**
272 * cgs_alloc_gpu_mem() - Allocate GPU memory 190 * cgs_alloc_gpu_mem() - Allocate GPU memory
273 * @cgs_device: opaque device handle 191 * @cgs_device: opaque device handle
274 * @type: memory type 192 * @type: memory type
@@ -392,62 +310,6 @@ typedef void (*cgs_write_ind_register_t)(struct cgs_device *cgs_device, enum cgs
392 unsigned index, uint32_t value); 310 unsigned index, uint32_t value);
393 311
394/** 312/**
395 * cgs_read_pci_config_byte() - Read byte from PCI configuration space
396 * @cgs_device: opaque device handle
397 * @addr: address
398 *
399 * Return: Value read
400 */
401typedef uint8_t (*cgs_read_pci_config_byte_t)(struct cgs_device *cgs_device, unsigned addr);
402
403/**
404 * cgs_read_pci_config_word() - Read word from PCI configuration space
405 * @cgs_device: opaque device handle
406 * @addr: address, must be word-aligned
407 *
408 * Return: Value read
409 */
410typedef uint16_t (*cgs_read_pci_config_word_t)(struct cgs_device *cgs_device, unsigned addr);
411
412/**
413 * cgs_read_pci_config_dword() - Read dword from PCI configuration space
414 * @cgs_device: opaque device handle
415 * @addr: address, must be dword-aligned
416 *
417 * Return: Value read
418 */
419typedef uint32_t (*cgs_read_pci_config_dword_t)(struct cgs_device *cgs_device,
420 unsigned addr);
421
422/**
423 * cgs_write_pci_config_byte() - Write byte to PCI configuration space
424 * @cgs_device: opaque device handle
425 * @addr: address
426 * @value: value to write
427 */
428typedef void (*cgs_write_pci_config_byte_t)(struct cgs_device *cgs_device, unsigned addr,
429 uint8_t value);
430
431/**
432 * cgs_write_pci_config_word() - Write byte to PCI configuration space
433 * @cgs_device: opaque device handle
434 * @addr: address, must be word-aligned
435 * @value: value to write
436 */
437typedef void (*cgs_write_pci_config_word_t)(struct cgs_device *cgs_device, unsigned addr,
438 uint16_t value);
439
440/**
441 * cgs_write_pci_config_dword() - Write byte to PCI configuration space
442 * @cgs_device: opaque device handle
443 * @addr: address, must be dword-aligned
444 * @value: value to write
445 */
446typedef void (*cgs_write_pci_config_dword_t)(struct cgs_device *cgs_device, unsigned addr,
447 uint32_t value);
448
449
450/**
451 * cgs_get_pci_resource() - provide access to a device resource (PCI BAR) 313 * cgs_get_pci_resource() - provide access to a device resource (PCI BAR)
452 * @cgs_device: opaque device handle 314 * @cgs_device: opaque device handle
453 * @resource_type: Type of Resource (MMIO, IO, ROM, FB, DOORBELL) 315 * @resource_type: Type of Resource (MMIO, IO, ROM, FB, DOORBELL)
@@ -501,87 +363,6 @@ typedef int (*cgs_atom_exec_cmd_table_t)(struct cgs_device *cgs_device,
501 unsigned table, void *args); 363 unsigned table, void *args);
502 364
503/** 365/**
504 * cgs_create_pm_request() - Create a power management request
505 * @cgs_device: opaque device handle
506 * @request: handle of created PM request (output)
507 *
508 * Return: 0 on success, -errno otherwise
509 */
510typedef int (*cgs_create_pm_request_t)(struct cgs_device *cgs_device, cgs_handle_t *request);
511
512/**
513 * cgs_destroy_pm_request() - Destroy a power management request
514 * @cgs_device: opaque device handle
515 * @request: handle of created PM request
516 *
517 * Return: 0 on success, -errno otherwise
518 */
519typedef int (*cgs_destroy_pm_request_t)(struct cgs_device *cgs_device, cgs_handle_t request);
520
521/**
522 * cgs_set_pm_request() - Activate or deactiveate a PM request
523 * @cgs_device: opaque device handle
524 * @request: PM request handle
525 * @active: 0 = deactivate, non-0 = activate
526 *
527 * While a PM request is active, its minimum clock requests are taken
528 * into account as the requested engines are powered up. When the
529 * request is inactive, the engines may be powered down and clocks may
530 * be lower, depending on other PM requests by other driver
531 * components.
532 *
533 * Return: 0 on success, -errno otherwise
534 */
535typedef int (*cgs_set_pm_request_t)(struct cgs_device *cgs_device, cgs_handle_t request,
536 int active);
537
538/**
539 * cgs_pm_request_clock() - Request a minimum frequency for a specific clock
540 * @cgs_device: opaque device handle
541 * @request: PM request handle
542 * @clock: which clock?
543 * @freq: requested min. frequency in 10KHz units (0 to clear request)
544 *
545 * Return: 0 on success, -errno otherwise
546 */
547typedef int (*cgs_pm_request_clock_t)(struct cgs_device *cgs_device, cgs_handle_t request,
548 enum cgs_clock clock, unsigned freq);
549
550/**
551 * cgs_pm_request_engine() - Request an engine to be powered up
552 * @cgs_device: opaque device handle
553 * @request: PM request handle
554 * @engine: which engine?
555 * @powered: 0 = powered down, non-0 = powered up
556 *
557 * Return: 0 on success, -errno otherwise
558 */
559typedef int (*cgs_pm_request_engine_t)(struct cgs_device *cgs_device, cgs_handle_t request,
560 enum cgs_engine engine, int powered);
561
562/**
563 * cgs_pm_query_clock_limits() - Query clock frequency limits
564 * @cgs_device: opaque device handle
565 * @clock: which clock?
566 * @limits: clock limits
567 *
568 * Return: 0 on success, -errno otherwise
569 */
570typedef int (*cgs_pm_query_clock_limits_t)(struct cgs_device *cgs_device,
571 enum cgs_clock clock,
572 struct cgs_clock_limits *limits);
573
574/**
575 * cgs_set_camera_voltages() - Apply specific voltages to PMIC voltage planes
576 * @cgs_device: opaque device handle
577 * @mask: bitmask of voltages to change (1<<CGS_VOLTAGE_PLANE__xyz|...)
578 * @voltages: pointer to array of voltage values in 1mV units
579 *
580 * Return: 0 on success, -errno otherwise
581 */
582typedef int (*cgs_set_camera_voltages_t)(struct cgs_device *cgs_device, uint32_t mask,
583 const uint32_t *voltages);
584/**
585 * cgs_get_firmware_info - Get the firmware information from core driver 366 * cgs_get_firmware_info - Get the firmware information from core driver
586 * @cgs_device: opaque device handle 367 * @cgs_device: opaque device handle
587 * @type: the firmware type 368 * @type: the firmware type
@@ -627,9 +408,6 @@ typedef int (*cgs_enter_safe_mode)(struct cgs_device *cgs_device, bool en);
627 408
628struct cgs_ops { 409struct cgs_ops {
629 /* memory management calls (similar to KFD interface) */ 410 /* memory management calls (similar to KFD interface) */
630 cgs_gpu_mem_info_t gpu_mem_info;
631 cgs_gmap_kmem_t gmap_kmem;
632 cgs_gunmap_kmem_t gunmap_kmem;
633 cgs_alloc_gpu_mem_t alloc_gpu_mem; 411 cgs_alloc_gpu_mem_t alloc_gpu_mem;
634 cgs_free_gpu_mem_t free_gpu_mem; 412 cgs_free_gpu_mem_t free_gpu_mem;
635 cgs_gmap_gpu_mem_t gmap_gpu_mem; 413 cgs_gmap_gpu_mem_t gmap_gpu_mem;
@@ -641,27 +419,12 @@ struct cgs_ops {
641 cgs_write_register_t write_register; 419 cgs_write_register_t write_register;
642 cgs_read_ind_register_t read_ind_register; 420 cgs_read_ind_register_t read_ind_register;
643 cgs_write_ind_register_t write_ind_register; 421 cgs_write_ind_register_t write_ind_register;
644 /* PCI configuration space access */
645 cgs_read_pci_config_byte_t read_pci_config_byte;
646 cgs_read_pci_config_word_t read_pci_config_word;
647 cgs_read_pci_config_dword_t read_pci_config_dword;
648 cgs_write_pci_config_byte_t write_pci_config_byte;
649 cgs_write_pci_config_word_t write_pci_config_word;
650 cgs_write_pci_config_dword_t write_pci_config_dword;
651 /* PCI resources */ 422 /* PCI resources */
652 cgs_get_pci_resource_t get_pci_resource; 423 cgs_get_pci_resource_t get_pci_resource;
653 /* ATOM BIOS */ 424 /* ATOM BIOS */
654 cgs_atom_get_data_table_t atom_get_data_table; 425 cgs_atom_get_data_table_t atom_get_data_table;
655 cgs_atom_get_cmd_table_revs_t atom_get_cmd_table_revs; 426 cgs_atom_get_cmd_table_revs_t atom_get_cmd_table_revs;
656 cgs_atom_exec_cmd_table_t atom_exec_cmd_table; 427 cgs_atom_exec_cmd_table_t atom_exec_cmd_table;
657 /* Power management */
658 cgs_create_pm_request_t create_pm_request;
659 cgs_destroy_pm_request_t destroy_pm_request;
660 cgs_set_pm_request_t set_pm_request;
661 cgs_pm_request_clock_t pm_request_clock;
662 cgs_pm_request_engine_t pm_request_engine;
663 cgs_pm_query_clock_limits_t pm_query_clock_limits;
664 cgs_set_camera_voltages_t set_camera_voltages;
665 /* Firmware Info */ 428 /* Firmware Info */
666 cgs_get_firmware_info get_firmware_info; 429 cgs_get_firmware_info get_firmware_info;
667 cgs_rel_firmware rel_firmware; 430 cgs_rel_firmware rel_firmware;
@@ -696,12 +459,6 @@ struct cgs_device
696#define CGS_OS_CALL(func,dev,...) \ 459#define CGS_OS_CALL(func,dev,...) \
697 (((struct cgs_device *)dev)->os_ops->func(dev, ##__VA_ARGS__)) 460 (((struct cgs_device *)dev)->os_ops->func(dev, ##__VA_ARGS__))
698 461
699#define cgs_gpu_mem_info(dev,type,mc_start,mc_size,mem_size) \
700 CGS_CALL(gpu_mem_info,dev,type,mc_start,mc_size,mem_size)
701#define cgs_gmap_kmem(dev,kmem,size,min_off,max_off,kmem_handle,mcaddr) \
702 CGS_CALL(gmap_kmem,dev,kmem,size,min_off,max_off,kmem_handle,mcaddr)
703#define cgs_gunmap_kmem(dev,kmem_handle) \
704 CGS_CALL(gunmap_kmem,dev,keme_handle)
705#define cgs_alloc_gpu_mem(dev,type,size,align,min_off,max_off,handle) \ 462#define cgs_alloc_gpu_mem(dev,type,size,align,min_off,max_off,handle) \
706 CGS_CALL(alloc_gpu_mem,dev,type,size,align,min_off,max_off,handle) 463 CGS_CALL(alloc_gpu_mem,dev,type,size,align,min_off,max_off,handle)
707#define cgs_free_gpu_mem(dev,handle) \ 464#define cgs_free_gpu_mem(dev,handle) \
@@ -724,19 +481,6 @@ struct cgs_device
724#define cgs_write_ind_register(dev,space,index,value) \ 481#define cgs_write_ind_register(dev,space,index,value) \
725 CGS_CALL(write_ind_register,dev,space,index,value) 482 CGS_CALL(write_ind_register,dev,space,index,value)
726 483
727#define cgs_read_pci_config_byte(dev,addr) \
728 CGS_CALL(read_pci_config_byte,dev,addr)
729#define cgs_read_pci_config_word(dev,addr) \
730 CGS_CALL(read_pci_config_word,dev,addr)
731#define cgs_read_pci_config_dword(dev,addr) \
732 CGS_CALL(read_pci_config_dword,dev,addr)
733#define cgs_write_pci_config_byte(dev,addr,value) \
734 CGS_CALL(write_pci_config_byte,dev,addr,value)
735#define cgs_write_pci_config_word(dev,addr,value) \
736 CGS_CALL(write_pci_config_word,dev,addr,value)
737#define cgs_write_pci_config_dword(dev,addr,value) \
738 CGS_CALL(write_pci_config_dword,dev,addr,value)
739
740#define cgs_atom_get_data_table(dev,table,size,frev,crev) \ 484#define cgs_atom_get_data_table(dev,table,size,frev,crev) \
741 CGS_CALL(atom_get_data_table,dev,table,size,frev,crev) 485 CGS_CALL(atom_get_data_table,dev,table,size,frev,crev)
742#define cgs_atom_get_cmd_table_revs(dev,table,frev,crev) \ 486#define cgs_atom_get_cmd_table_revs(dev,table,frev,crev) \
@@ -744,20 +488,6 @@ struct cgs_device
744#define cgs_atom_exec_cmd_table(dev,table,args) \ 488#define cgs_atom_exec_cmd_table(dev,table,args) \
745 CGS_CALL(atom_exec_cmd_table,dev,table,args) 489 CGS_CALL(atom_exec_cmd_table,dev,table,args)
746 490
747#define cgs_create_pm_request(dev,request) \
748 CGS_CALL(create_pm_request,dev,request)
749#define cgs_destroy_pm_request(dev,request) \
750 CGS_CALL(destroy_pm_request,dev,request)
751#define cgs_set_pm_request(dev,request,active) \
752 CGS_CALL(set_pm_request,dev,request,active)
753#define cgs_pm_request_clock(dev,request,clock,freq) \
754 CGS_CALL(pm_request_clock,dev,request,clock,freq)
755#define cgs_pm_request_engine(dev,request,engine,powered) \
756 CGS_CALL(pm_request_engine,dev,request,engine,powered)
757#define cgs_pm_query_clock_limits(dev,clock,limits) \
758 CGS_CALL(pm_query_clock_limits,dev,clock,limits)
759#define cgs_set_camera_voltages(dev,mask,voltages) \
760 CGS_CALL(set_camera_voltages,dev,mask,voltages)
761#define cgs_get_firmware_info(dev, type, info) \ 491#define cgs_get_firmware_info(dev, type, info) \
762 CGS_CALL(get_firmware_info, dev, type, info) 492 CGS_CALL(get_firmware_info, dev, type, info)
763#define cgs_rel_firmware(dev, type) \ 493#define cgs_rel_firmware(dev, type) \
diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
index 9da5b0bb66d8..f73e80c4bf33 100644
--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
+++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
@@ -251,7 +251,9 @@ static int pp_suspend(void *handle)
251 251
252 ret = pp_check(pp_handle); 252 ret = pp_check(pp_handle);
253 253
254 if (ret != 0) 254 if (ret == PP_DPM_DISABLED)
255 return 0;
256 else if (ret != 0)
255 return ret; 257 return ret;
256 258
257 eventmgr = pp_handle->eventmgr; 259 eventmgr = pp_handle->eventmgr;
diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.c
index 9ef2d90e2886..b82c43af59ab 100644
--- a/drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.c
+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.c
@@ -219,7 +219,7 @@ const pem_event_action notify_smu_suspend_tasks[] = {
219}; 219};
220 220
221const pem_event_action disable_smc_firmware_ctf_tasks[] = { 221const pem_event_action disable_smc_firmware_ctf_tasks[] = {
222 /* PEM_Task_DisableSMCFirmwareCTF,*/ 222 pem_task_disable_smc_firmware_ctf,
223 NULL 223 NULL
224}; 224};
225 225
diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c
index e04216ec7ee1..8c4ebaae1e0c 100644
--- a/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c
+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c
@@ -173,6 +173,11 @@ int pem_task_stop_asic_block_usage(struct pp_eventmgr *eventmgr, struct pem_even
173 return 0; 173 return 0;
174} 174}
175 175
176int pem_task_disable_smc_firmware_ctf(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
177{
178 return phm_disable_smc_firmware_ctf(eventmgr->hwmgr);
179}
180
176int pem_task_setup_asic(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data) 181int pem_task_setup_asic(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
177{ 182{
178 return phm_setup_asic(eventmgr->hwmgr); 183 return phm_setup_asic(eventmgr->hwmgr);
diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.h b/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.h
index 6c6297e3b598..37e7ca5a58e0 100644
--- a/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.h
+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.h
@@ -84,5 +84,6 @@ int pem_task_update_allowed_performance_levels(struct pp_eventmgr *eventmgr, str
84/*thermal */ 84/*thermal */
85int pem_task_initialize_thermal_controller(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data); 85int pem_task_initialize_thermal_controller(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
86int pem_task_uninitialize_thermal_controller(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data); 86int pem_task_uninitialize_thermal_controller(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
87int pem_task_disable_smc_firmware_ctf(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
87 88
88#endif /* _EVENT_TASKS_H_ */ 89#endif /* _EVENT_TASKS_H_ */
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
index 23bba2c8b18e..fcc722ea7649 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
@@ -501,3 +501,13 @@ int phm_get_max_high_clocks(struct pp_hwmgr *hwmgr, struct amd_pp_simple_clock_i
501 501
502 return hwmgr->hwmgr_func->get_max_high_clocks(hwmgr, clocks); 502 return hwmgr->hwmgr_func->get_max_high_clocks(hwmgr, clocks);
503} 503}
504
505int phm_disable_smc_firmware_ctf(struct pp_hwmgr *hwmgr)
506{
507 PHM_FUNC_CHECK(hwmgr);
508
509 if (hwmgr->hwmgr_func->disable_smc_firmware_ctf == NULL)
510 return -EINVAL;
511
512 return hwmgr->hwmgr_func->disable_smc_firmware_ctf(hwmgr);
513}
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
index b71525f838e6..56023114ad6f 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
@@ -314,52 +314,45 @@ int pp_atomfwctrl_get_avfs_information(struct pp_hwmgr *hwmgr,
314 le32_to_cpu(profile->gb_vdroop_table_ckson_a2); 314 le32_to_cpu(profile->gb_vdroop_table_ckson_a2);
315 param->ulGbFuseTableCksoffM1 = 315 param->ulGbFuseTableCksoffM1 =
316 le32_to_cpu(profile->avfsgb_fuse_table_cksoff_m1); 316 le32_to_cpu(profile->avfsgb_fuse_table_cksoff_m1);
317 param->usGbFuseTableCksoffM2 = 317 param->ulGbFuseTableCksoffM2 =
318 le16_to_cpu(profile->avfsgb_fuse_table_cksoff_m2); 318 le16_to_cpu(profile->avfsgb_fuse_table_cksoff_m2);
319 param->ulGbFuseTableCksoffB = 319 param->ulGbFuseTableCksoffB =
320 le32_to_cpu(profile->avfsgb_fuse_table_cksoff_b); 320 le32_to_cpu(profile->avfsgb_fuse_table_cksoff_b);
321 param->ulGbFuseTableCksonM1 = 321 param->ulGbFuseTableCksonM1 =
322 le32_to_cpu(profile->avfsgb_fuse_table_ckson_m1); 322 le32_to_cpu(profile->avfsgb_fuse_table_ckson_m1);
323 param->usGbFuseTableCksonM2 = 323 param->ulGbFuseTableCksonM2 =
324 le16_to_cpu(profile->avfsgb_fuse_table_ckson_m2); 324 le16_to_cpu(profile->avfsgb_fuse_table_ckson_m2);
325 param->ulGbFuseTableCksonB = 325 param->ulGbFuseTableCksonB =
326 le32_to_cpu(profile->avfsgb_fuse_table_ckson_b); 326 le32_to_cpu(profile->avfsgb_fuse_table_ckson_b);
327 param->usMaxVoltage025mv = 327
328 le16_to_cpu(profile->max_voltage_0_25mv);
329 param->ucEnableGbVdroopTableCksoff =
330 profile->enable_gb_vdroop_table_cksoff;
331 param->ucEnableGbVdroopTableCkson = 328 param->ucEnableGbVdroopTableCkson =
332 profile->enable_gb_vdroop_table_ckson; 329 profile->enable_gb_vdroop_table_ckson;
333 param->ucEnableGbFuseTableCksoff =
334 profile->enable_gb_fuse_table_cksoff;
335 param->ucEnableGbFuseTableCkson = 330 param->ucEnableGbFuseTableCkson =
336 profile->enable_gb_fuse_table_ckson; 331 profile->enable_gb_fuse_table_ckson;
337 param->usPsmAgeComfactor = 332 param->usPsmAgeComfactor =
338 le16_to_cpu(profile->psm_age_comfactor); 333 le16_to_cpu(profile->psm_age_comfactor);
339 param->ucEnableApplyAvfsCksoffVoltage =
340 profile->enable_apply_avfs_cksoff_voltage;
341 334
342 param->ulDispclk2GfxclkM1 = 335 param->ulDispclk2GfxclkM1 =
343 le32_to_cpu(profile->dispclk2gfxclk_a); 336 le32_to_cpu(profile->dispclk2gfxclk_a);
344 param->usDispclk2GfxclkM2 = 337 param->ulDispclk2GfxclkM2 =
345 le16_to_cpu(profile->dispclk2gfxclk_b); 338 le16_to_cpu(profile->dispclk2gfxclk_b);
346 param->ulDispclk2GfxclkB = 339 param->ulDispclk2GfxclkB =
347 le32_to_cpu(profile->dispclk2gfxclk_c); 340 le32_to_cpu(profile->dispclk2gfxclk_c);
348 param->ulDcefclk2GfxclkM1 = 341 param->ulDcefclk2GfxclkM1 =
349 le32_to_cpu(profile->dcefclk2gfxclk_a); 342 le32_to_cpu(profile->dcefclk2gfxclk_a);
350 param->usDcefclk2GfxclkM2 = 343 param->ulDcefclk2GfxclkM2 =
351 le16_to_cpu(profile->dcefclk2gfxclk_b); 344 le16_to_cpu(profile->dcefclk2gfxclk_b);
352 param->ulDcefclk2GfxclkB = 345 param->ulDcefclk2GfxclkB =
353 le32_to_cpu(profile->dcefclk2gfxclk_c); 346 le32_to_cpu(profile->dcefclk2gfxclk_c);
354 param->ulPixelclk2GfxclkM1 = 347 param->ulPixelclk2GfxclkM1 =
355 le32_to_cpu(profile->pixclk2gfxclk_a); 348 le32_to_cpu(profile->pixclk2gfxclk_a);
356 param->usPixelclk2GfxclkM2 = 349 param->ulPixelclk2GfxclkM2 =
357 le16_to_cpu(profile->pixclk2gfxclk_b); 350 le16_to_cpu(profile->pixclk2gfxclk_b);
358 param->ulPixelclk2GfxclkB = 351 param->ulPixelclk2GfxclkB =
359 le32_to_cpu(profile->pixclk2gfxclk_c); 352 le32_to_cpu(profile->pixclk2gfxclk_c);
360 param->ulPhyclk2GfxclkM1 = 353 param->ulPhyclk2GfxclkM1 =
361 le32_to_cpu(profile->phyclk2gfxclk_a); 354 le32_to_cpu(profile->phyclk2gfxclk_a);
362 param->usPhyclk2GfxclkM2 = 355 param->ulPhyclk2GfxclkM2 =
363 le16_to_cpu(profile->phyclk2gfxclk_b); 356 le16_to_cpu(profile->phyclk2gfxclk_b);
364 param->ulPhyclk2GfxclkB = 357 param->ulPhyclk2GfxclkB =
365 le32_to_cpu(profile->phyclk2gfxclk_c); 358 le32_to_cpu(profile->phyclk2gfxclk_c);
@@ -394,3 +387,31 @@ int pp_atomfwctrl_get_gpio_information(struct pp_hwmgr *hwmgr,
394 387
395 return 0; 388 return 0;
396} 389}
390
391int pp_atomfwctrl_get_vbios_bootup_values(struct pp_hwmgr *hwmgr,
392 struct pp_atomfwctrl_bios_boot_up_values *boot_values)
393{
394 struct atom_firmware_info_v3_1 *info = NULL;
395 uint16_t ix;
396
397 ix = GetIndexIntoMasterDataTable(firmwareinfo);
398 info = (struct atom_firmware_info_v3_1 *)
399 cgs_atom_get_data_table(hwmgr->device,
400 ix, NULL, NULL, NULL);
401
402 if (!info) {
403 pr_info("Error retrieving BIOS firmwareinfo!");
404 return -EINVAL;
405 }
406
407 boot_values->ulRevision = info->firmware_revision;
408 boot_values->ulGfxClk = info->bootup_sclk_in10khz;
409 boot_values->ulUClk = info->bootup_mclk_in10khz;
410 boot_values->ulSocClk = 0;
411 boot_values->usVddc = info->bootup_vddc_mv;
412 boot_values->usVddci = info->bootup_vddci_mv;
413 boot_values->usMvddc = info->bootup_mvddc_mv;
414 boot_values->usVddGfx = info->bootup_vddgfx_mv;
415
416 return 0;
417} \ No newline at end of file
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h
index 7efe9b96cb33..43a6711e3c06 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h
@@ -69,7 +69,7 @@ struct pp_atomfwctrl_clock_dividers_soc15 {
69struct pp_atomfwctrl_avfs_parameters { 69struct pp_atomfwctrl_avfs_parameters {
70 uint32_t ulMaxVddc; 70 uint32_t ulMaxVddc;
71 uint32_t ulMinVddc; 71 uint32_t ulMinVddc;
72 uint8_t ucMaxVidStep; 72
73 uint32_t ulMeanNsigmaAcontant0; 73 uint32_t ulMeanNsigmaAcontant0;
74 uint32_t ulMeanNsigmaAcontant1; 74 uint32_t ulMeanNsigmaAcontant1;
75 uint32_t ulMeanNsigmaAcontant2; 75 uint32_t ulMeanNsigmaAcontant2;
@@ -82,30 +82,30 @@ struct pp_atomfwctrl_avfs_parameters {
82 uint32_t ulGbVdroopTableCksonA0; 82 uint32_t ulGbVdroopTableCksonA0;
83 uint32_t ulGbVdroopTableCksonA1; 83 uint32_t ulGbVdroopTableCksonA1;
84 uint32_t ulGbVdroopTableCksonA2; 84 uint32_t ulGbVdroopTableCksonA2;
85
85 uint32_t ulGbFuseTableCksoffM1; 86 uint32_t ulGbFuseTableCksoffM1;
86 uint16_t usGbFuseTableCksoffM2; 87 uint32_t ulGbFuseTableCksoffM2;
87 uint32_t ulGbFuseTableCksoffB;\ 88 uint32_t ulGbFuseTableCksoffB;
89
88 uint32_t ulGbFuseTableCksonM1; 90 uint32_t ulGbFuseTableCksonM1;
89 uint16_t usGbFuseTableCksonM2; 91 uint32_t ulGbFuseTableCksonM2;
90 uint32_t ulGbFuseTableCksonB; 92 uint32_t ulGbFuseTableCksonB;
91 uint16_t usMaxVoltage025mv; 93
92 uint8_t ucEnableGbVdroopTableCksoff;
93 uint8_t ucEnableGbVdroopTableCkson; 94 uint8_t ucEnableGbVdroopTableCkson;
94 uint8_t ucEnableGbFuseTableCksoff;
95 uint8_t ucEnableGbFuseTableCkson; 95 uint8_t ucEnableGbFuseTableCkson;
96 uint16_t usPsmAgeComfactor; 96 uint16_t usPsmAgeComfactor;
97 uint8_t ucEnableApplyAvfsCksoffVoltage; 97
98 uint32_t ulDispclk2GfxclkM1; 98 uint32_t ulDispclk2GfxclkM1;
99 uint16_t usDispclk2GfxclkM2; 99 uint32_t ulDispclk2GfxclkM2;
100 uint32_t ulDispclk2GfxclkB; 100 uint32_t ulDispclk2GfxclkB;
101 uint32_t ulDcefclk2GfxclkM1; 101 uint32_t ulDcefclk2GfxclkM1;
102 uint16_t usDcefclk2GfxclkM2; 102 uint32_t ulDcefclk2GfxclkM2;
103 uint32_t ulDcefclk2GfxclkB; 103 uint32_t ulDcefclk2GfxclkB;
104 uint32_t ulPixelclk2GfxclkM1; 104 uint32_t ulPixelclk2GfxclkM1;
105 uint16_t usPixelclk2GfxclkM2; 105 uint32_t ulPixelclk2GfxclkM2;
106 uint32_t ulPixelclk2GfxclkB; 106 uint32_t ulPixelclk2GfxclkB;
107 uint32_t ulPhyclk2GfxclkM1; 107 uint32_t ulPhyclk2GfxclkM1;
108 uint16_t usPhyclk2GfxclkM2; 108 uint32_t ulPhyclk2GfxclkM2;
109 uint32_t ulPhyclk2GfxclkB; 109 uint32_t ulPhyclk2GfxclkB;
110}; 110};
111 111
@@ -119,6 +119,18 @@ struct pp_atomfwctrl_gpio_parameters {
119 uint8_t ucFwCtfGpio; 119 uint8_t ucFwCtfGpio;
120 uint8_t ucFwCtfPolarity; 120 uint8_t ucFwCtfPolarity;
121}; 121};
122
123struct pp_atomfwctrl_bios_boot_up_values {
124 uint32_t ulRevision;
125 uint32_t ulGfxClk;
126 uint32_t ulUClk;
127 uint32_t ulSocClk;
128 uint16_t usVddc;
129 uint16_t usVddci;
130 uint16_t usMvddc;
131 uint16_t usVddGfx;
132};
133
122int pp_atomfwctrl_get_gpu_pll_dividers_vega10(struct pp_hwmgr *hwmgr, 134int pp_atomfwctrl_get_gpu_pll_dividers_vega10(struct pp_hwmgr *hwmgr,
123 uint32_t clock_type, uint32_t clock_value, 135 uint32_t clock_type, uint32_t clock_value,
124 struct pp_atomfwctrl_clock_dividers_soc15 *dividers); 136 struct pp_atomfwctrl_clock_dividers_soc15 *dividers);
@@ -136,5 +148,8 @@ int pp_atomfwctrl_get_avfs_information(struct pp_hwmgr *hwmgr,
136int pp_atomfwctrl_get_gpio_information(struct pp_hwmgr *hwmgr, 148int pp_atomfwctrl_get_gpio_information(struct pp_hwmgr *hwmgr,
137 struct pp_atomfwctrl_gpio_parameters *param); 149 struct pp_atomfwctrl_gpio_parameters *param);
138 150
151int pp_atomfwctrl_get_vbios_bootup_values(struct pp_hwmgr *hwmgr,
152 struct pp_atomfwctrl_bios_boot_up_values *boot_values);
153
139#endif 154#endif
140 155
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
index 8f663ab56a80..a74a3db3056c 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -4334,26 +4334,31 @@ static int smu7_print_clock_levels(struct pp_hwmgr *hwmgr,
4334 4334
4335static int smu7_set_fan_control_mode(struct pp_hwmgr *hwmgr, uint32_t mode) 4335static int smu7_set_fan_control_mode(struct pp_hwmgr *hwmgr, uint32_t mode)
4336{ 4336{
4337 if (mode) { 4337 int result = 0;
4338 /* stop auto-manage */
4339 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
4340 PHM_PlatformCaps_MicrocodeFanControl))
4341 smu7_fan_ctrl_stop_smc_fan_control(hwmgr);
4342 smu7_fan_ctrl_set_static_mode(hwmgr, mode);
4343 } else
4344 /* restart auto-manage */
4345 smu7_fan_ctrl_reset_fan_speed_to_default(hwmgr);
4346 4338
4347 return 0; 4339 switch (mode) {
4340 case AMD_FAN_CTRL_NONE:
4341 result = smu7_fan_ctrl_set_fan_speed_percent(hwmgr, 100);
4342 break;
4343 case AMD_FAN_CTRL_MANUAL:
4344 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
4345 PHM_PlatformCaps_MicrocodeFanControl))
4346 result = smu7_fan_ctrl_stop_smc_fan_control(hwmgr);
4347 break;
4348 case AMD_FAN_CTRL_AUTO:
4349 result = smu7_fan_ctrl_set_static_mode(hwmgr, mode);
4350 if (!result)
4351 result = smu7_fan_ctrl_start_smc_fan_control(hwmgr);
4352 break;
4353 default:
4354 break;
4355 }
4356 return result;
4348} 4357}
4349 4358
4350static int smu7_get_fan_control_mode(struct pp_hwmgr *hwmgr) 4359static int smu7_get_fan_control_mode(struct pp_hwmgr *hwmgr)
4351{ 4360{
4352 if (hwmgr->fan_ctrl_is_in_default_mode) 4361 return hwmgr->fan_ctrl_enabled ? AMD_FAN_CTRL_AUTO : AMD_FAN_CTRL_MANUAL;
4353 return hwmgr->fan_ctrl_default_mode;
4354 else
4355 return PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
4356 CG_FDO_CTRL2, FDO_PWM_MODE);
4357} 4362}
4358 4363
4359static int smu7_get_sclk_od(struct pp_hwmgr *hwmgr) 4364static int smu7_get_sclk_od(struct pp_hwmgr *hwmgr)
@@ -4522,32 +4527,6 @@ static int smu7_get_clock_by_type(struct pp_hwmgr *hwmgr, enum amd_pp_clock_type
4522 return 0; 4527 return 0;
4523} 4528}
4524 4529
4525static int smu7_request_firmware(struct pp_hwmgr *hwmgr)
4526{
4527 int ret;
4528 struct cgs_firmware_info info = {0};
4529
4530 ret = cgs_get_firmware_info(hwmgr->device,
4531 smu7_convert_fw_type_to_cgs(UCODE_ID_SMU),
4532 &info);
4533 if (ret || !info.kptr)
4534 return -EINVAL;
4535
4536 return 0;
4537}
4538
4539static int smu7_release_firmware(struct pp_hwmgr *hwmgr)
4540{
4541 int ret;
4542
4543 ret = cgs_rel_firmware(hwmgr->device,
4544 smu7_convert_fw_type_to_cgs(UCODE_ID_SMU));
4545 if (ret)
4546 return -EINVAL;
4547
4548 return 0;
4549}
4550
4551static void smu7_find_min_clock_masks(struct pp_hwmgr *hwmgr, 4530static void smu7_find_min_clock_masks(struct pp_hwmgr *hwmgr,
4552 uint32_t *sclk_mask, uint32_t *mclk_mask, 4531 uint32_t *sclk_mask, uint32_t *mclk_mask,
4553 uint32_t min_sclk, uint32_t min_mclk) 4532 uint32_t min_sclk, uint32_t min_mclk)
@@ -4691,10 +4670,9 @@ static const struct pp_hwmgr_func smu7_hwmgr_funcs = {
4691 .get_clock_by_type = smu7_get_clock_by_type, 4670 .get_clock_by_type = smu7_get_clock_by_type,
4692 .read_sensor = smu7_read_sensor, 4671 .read_sensor = smu7_read_sensor,
4693 .dynamic_state_management_disable = smu7_disable_dpm_tasks, 4672 .dynamic_state_management_disable = smu7_disable_dpm_tasks,
4694 .request_firmware = smu7_request_firmware,
4695 .release_firmware = smu7_release_firmware,
4696 .set_power_profile_state = smu7_set_power_profile_state, 4673 .set_power_profile_state = smu7_set_power_profile_state,
4697 .avfs_control = smu7_avfs_control, 4674 .avfs_control = smu7_avfs_control,
4675 .disable_smc_firmware_ctf = smu7_thermal_disable_alert,
4698}; 4676};
4699 4677
4700uint8_t smu7_get_sleep_divider_id_from_clock(uint32_t clock, 4678uint8_t smu7_get_sleep_divider_id_from_clock(uint32_t clock,
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c
index 436ca5ce8248..baddb569a8b8 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c
@@ -112,10 +112,9 @@ int smu7_fan_ctrl_get_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t *speed)
112*/ 112*/
113int smu7_fan_ctrl_set_static_mode(struct pp_hwmgr *hwmgr, uint32_t mode) 113int smu7_fan_ctrl_set_static_mode(struct pp_hwmgr *hwmgr, uint32_t mode)
114{ 114{
115
116 if (hwmgr->fan_ctrl_is_in_default_mode) { 115 if (hwmgr->fan_ctrl_is_in_default_mode) {
117 hwmgr->fan_ctrl_default_mode = 116 hwmgr->fan_ctrl_default_mode =
118 PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, 117 PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
119 CG_FDO_CTRL2, FDO_PWM_MODE); 118 CG_FDO_CTRL2, FDO_PWM_MODE);
120 hwmgr->tmin = 119 hwmgr->tmin =
121 PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, 120 PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
@@ -149,7 +148,7 @@ int smu7_fan_ctrl_set_default_mode(struct pp_hwmgr *hwmgr)
149 return 0; 148 return 0;
150} 149}
151 150
152static int smu7_fan_ctrl_start_smc_fan_control(struct pp_hwmgr *hwmgr) 151int smu7_fan_ctrl_start_smc_fan_control(struct pp_hwmgr *hwmgr)
153{ 152{
154 int result; 153 int result;
155 154
@@ -179,6 +178,7 @@ static int smu7_fan_ctrl_start_smc_fan_control(struct pp_hwmgr *hwmgr)
179 PPSMC_MSG_SetFanTemperatureTarget, 178 PPSMC_MSG_SetFanTemperatureTarget,
180 hwmgr->thermal_controller. 179 hwmgr->thermal_controller.
181 advanceFanControlParameters.ucTargetTemperature); 180 advanceFanControlParameters.ucTargetTemperature);
181 hwmgr->fan_ctrl_enabled = true;
182 182
183 return result; 183 return result;
184} 184}
@@ -186,6 +186,7 @@ static int smu7_fan_ctrl_start_smc_fan_control(struct pp_hwmgr *hwmgr)
186 186
187int smu7_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr) 187int smu7_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr)
188{ 188{
189 hwmgr->fan_ctrl_enabled = false;
189 return smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_StopFanControl); 190 return smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_StopFanControl);
190} 191}
191 192
@@ -280,7 +281,7 @@ int smu7_fan_ctrl_set_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t speed)
280 PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, 281 PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
281 CG_TACH_STATUS, TACH_PERIOD, tach_period); 282 CG_TACH_STATUS, TACH_PERIOD, tach_period);
282 283
283 return smu7_fan_ctrl_set_static_mode(hwmgr, FDO_PWM_MODE_STATIC); 284 return smu7_fan_ctrl_set_static_mode(hwmgr, FDO_PWM_MODE_STATIC_RPM);
284} 285}
285 286
286/** 287/**
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.h b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.h
index 2ed774db42c7..ba71b608fa75 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.h
@@ -54,6 +54,6 @@ extern int smu7_fan_ctrl_get_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t *spe
54extern int smu7_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr); 54extern int smu7_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr);
55extern int smu7_thermal_enable_alert(struct pp_hwmgr *hwmgr); 55extern int smu7_thermal_enable_alert(struct pp_hwmgr *hwmgr);
56extern int smu7_thermal_disable_alert(struct pp_hwmgr *hwmgr); 56extern int smu7_thermal_disable_alert(struct pp_hwmgr *hwmgr);
57 57extern int smu7_fan_ctrl_start_smc_fan_control(struct pp_hwmgr *hwmgr);
58#endif 58#endif
59 59
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
index 83949550edac..ad30f5d3a10d 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
@@ -111,6 +111,8 @@ static void vega10_set_default_registry_data(struct pp_hwmgr *hwmgr)
111 hwmgr->feature_mask & PP_SOCCLK_DPM_MASK ? false : true; 111 hwmgr->feature_mask & PP_SOCCLK_DPM_MASK ? false : true;
112 data->registry_data.mclk_dpm_key_disabled = 112 data->registry_data.mclk_dpm_key_disabled =
113 hwmgr->feature_mask & PP_MCLK_DPM_MASK ? false : true; 113 hwmgr->feature_mask & PP_MCLK_DPM_MASK ? false : true;
114 data->registry_data.pcie_dpm_key_disabled =
115 hwmgr->feature_mask & PP_PCIE_DPM_MASK ? false : true;
114 116
115 data->registry_data.dcefclk_dpm_key_disabled = 117 data->registry_data.dcefclk_dpm_key_disabled =
116 hwmgr->feature_mask & PP_DCEFCLK_DPM_MASK ? false : true; 118 hwmgr->feature_mask & PP_DCEFCLK_DPM_MASK ? false : true;
@@ -121,7 +123,9 @@ static void vega10_set_default_registry_data(struct pp_hwmgr *hwmgr)
121 data->registry_data.enable_tdc_limit_feature = 1; 123 data->registry_data.enable_tdc_limit_feature = 1;
122 } 124 }
123 125
124 data->registry_data.pcie_dpm_key_disabled = 1; 126 data->registry_data.clock_stretcher_support =
127 hwmgr->feature_mask & PP_CLOCK_STRETCH_MASK ? false : true;
128
125 data->registry_data.disable_water_mark = 0; 129 data->registry_data.disable_water_mark = 0;
126 130
127 data->registry_data.fan_control_support = 1; 131 data->registry_data.fan_control_support = 1;
@@ -1133,7 +1137,7 @@ static void vega10_setup_default_single_dpm_table(struct pp_hwmgr *hwmgr,
1133 int i; 1137 int i;
1134 1138
1135 for (i = 0; i < dep_table->count; i++) { 1139 for (i = 0; i < dep_table->count; i++) {
1136 if (i == 0 || dpm_table->dpm_levels[dpm_table->count - 1].value != 1140 if (i == 0 || dpm_table->dpm_levels[dpm_table->count - 1].value <=
1137 dep_table->entries[i].clk) { 1141 dep_table->entries[i].clk) {
1138 dpm_table->dpm_levels[dpm_table->count].value = 1142 dpm_table->dpm_levels[dpm_table->count].value =
1139 dep_table->entries[i].clk; 1143 dep_table->entries[i].clk;
@@ -1178,29 +1182,9 @@ static int vega10_setup_default_pcie_table(struct pp_hwmgr *hwmgr)
1178 else 1182 else
1179 pcie_table->lclk[i] = 1183 pcie_table->lclk[i] =
1180 bios_pcie_table->entries[i].pcie_sclk; 1184 bios_pcie_table->entries[i].pcie_sclk;
1181
1182 pcie_table->count++;
1183 } 1185 }
1184 1186
1185 if (data->registry_data.pcieSpeedOverride) 1187 pcie_table->count = NUM_LINK_LEVELS;
1186 pcie_table->pcie_gen[i] = data->registry_data.pcieSpeedOverride;
1187 else
1188 pcie_table->pcie_gen[i] =
1189 bios_pcie_table->entries[bios_pcie_table->count - 1].gen_speed;
1190
1191 if (data->registry_data.pcieLaneOverride)
1192 pcie_table->pcie_lane[i] = data->registry_data.pcieLaneOverride;
1193 else
1194 pcie_table->pcie_lane[i] =
1195 bios_pcie_table->entries[bios_pcie_table->count - 1].lane_width;
1196
1197 if (data->registry_data.pcieClockOverride)
1198 pcie_table->lclk[i] = data->registry_data.pcieClockOverride;
1199 else
1200 pcie_table->lclk[i] =
1201 bios_pcie_table->entries[bios_pcie_table->count - 1].pcie_sclk;
1202
1203 pcie_table->count++;
1204 1188
1205 return 0; 1189 return 0;
1206} 1190}
@@ -1290,7 +1274,7 @@ static int vega10_setup_default_dpm_tables(struct pp_hwmgr *hwmgr)
1290 dpm_table = &(data->dpm_table.eclk_table); 1274 dpm_table = &(data->dpm_table.eclk_table);
1291 for (i = 0; i < dep_mm_table->count; i++) { 1275 for (i = 0; i < dep_mm_table->count; i++) {
1292 if (i == 0 || dpm_table->dpm_levels 1276 if (i == 0 || dpm_table->dpm_levels
1293 [dpm_table->count - 1].value != 1277 [dpm_table->count - 1].value <=
1294 dep_mm_table->entries[i].eclk) { 1278 dep_mm_table->entries[i].eclk) {
1295 dpm_table->dpm_levels[dpm_table->count].value = 1279 dpm_table->dpm_levels[dpm_table->count].value =
1296 dep_mm_table->entries[i].eclk; 1280 dep_mm_table->entries[i].eclk;
@@ -1306,7 +1290,7 @@ static int vega10_setup_default_dpm_tables(struct pp_hwmgr *hwmgr)
1306 dpm_table = &(data->dpm_table.vclk_table); 1290 dpm_table = &(data->dpm_table.vclk_table);
1307 for (i = 0; i < dep_mm_table->count; i++) { 1291 for (i = 0; i < dep_mm_table->count; i++) {
1308 if (i == 0 || dpm_table->dpm_levels 1292 if (i == 0 || dpm_table->dpm_levels
1309 [dpm_table->count - 1].value != 1293 [dpm_table->count - 1].value <=
1310 dep_mm_table->entries[i].vclk) { 1294 dep_mm_table->entries[i].vclk) {
1311 dpm_table->dpm_levels[dpm_table->count].value = 1295 dpm_table->dpm_levels[dpm_table->count].value =
1312 dep_mm_table->entries[i].vclk; 1296 dep_mm_table->entries[i].vclk;
@@ -1320,7 +1304,7 @@ static int vega10_setup_default_dpm_tables(struct pp_hwmgr *hwmgr)
1320 dpm_table = &(data->dpm_table.dclk_table); 1304 dpm_table = &(data->dpm_table.dclk_table);
1321 for (i = 0; i < dep_mm_table->count; i++) { 1305 for (i = 0; i < dep_mm_table->count; i++) {
1322 if (i == 0 || dpm_table->dpm_levels 1306 if (i == 0 || dpm_table->dpm_levels
1323 [dpm_table->count - 1].value != 1307 [dpm_table->count - 1].value <=
1324 dep_mm_table->entries[i].dclk) { 1308 dep_mm_table->entries[i].dclk) {
1325 dpm_table->dpm_levels[dpm_table->count].value = 1309 dpm_table->dpm_levels[dpm_table->count].value =
1326 dep_mm_table->entries[i].dclk; 1310 dep_mm_table->entries[i].dclk;
@@ -1432,9 +1416,7 @@ static int vega10_populate_ulv_state(struct pp_hwmgr *hwmgr)
1432 (struct phm_ppt_v2_information *)(hwmgr->pptable); 1416 (struct phm_ppt_v2_information *)(hwmgr->pptable);
1433 1417
1434 data->smc_state_table.pp_table.UlvOffsetVid = 1418 data->smc_state_table.pp_table.UlvOffsetVid =
1435 (uint8_t)(table_info->us_ulv_voltage_offset * 1419 (uint8_t)table_info->us_ulv_voltage_offset;
1436 VOLTAGE_VID_OFFSET_SCALE2 /
1437 VOLTAGE_VID_OFFSET_SCALE1);
1438 1420
1439 data->smc_state_table.pp_table.UlvSmnclkDid = 1421 data->smc_state_table.pp_table.UlvSmnclkDid =
1440 (uint8_t)(table_info->us_ulv_smnclk_did); 1422 (uint8_t)(table_info->us_ulv_smnclk_did);
@@ -1553,7 +1535,11 @@ static int vega10_populate_single_gfx_level(struct pp_hwmgr *hwmgr,
1553 current_gfxclk_level->FbMult = 1535 current_gfxclk_level->FbMult =
1554 cpu_to_le32(dividers.ulPll_fb_mult); 1536 cpu_to_le32(dividers.ulPll_fb_mult);
1555 /* Spread FB Multiplier bit: bit 0:8 int, bit 31:16 frac */ 1537 /* Spread FB Multiplier bit: bit 0:8 int, bit 31:16 frac */
1556 current_gfxclk_level->SsOn = dividers.ucPll_ss_enable; 1538 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
1539 PHM_PlatformCaps_EngineSpreadSpectrumSupport))
1540 current_gfxclk_level->SsOn = dividers.ucPll_ss_enable;
1541 else
1542 current_gfxclk_level->SsOn = 0;
1557 current_gfxclk_level->SsFbMult = 1543 current_gfxclk_level->SsFbMult =
1558 cpu_to_le32(dividers.ulPll_ss_fbsmult); 1544 cpu_to_le32(dividers.ulPll_ss_fbsmult);
1559 current_gfxclk_level->SsSlewFrac = 1545 current_gfxclk_level->SsSlewFrac =
@@ -2044,10 +2030,10 @@ static int vega10_populate_clock_stretcher_table(struct pp_hwmgr *hwmgr)
2044 table_info->vdd_dep_on_sclk; 2030 table_info->vdd_dep_on_sclk;
2045 uint32_t i; 2031 uint32_t i;
2046 2032
2047 for (i = 0; dep_table->count; i++) { 2033 for (i = 0; i < dep_table->count; i++) {
2048 pp_table->CksEnable[i] = dep_table->entries[i].cks_enable; 2034 pp_table->CksEnable[i] = dep_table->entries[i].cks_enable;
2049 pp_table->CksVidOffset[i] = convert_to_vid( 2035 pp_table->CksVidOffset[i] = (uint8_t)(dep_table->entries[i].cks_voffset
2050 dep_table->entries[i].cks_voffset); 2036 * VOLTAGE_VID_OFFSET_SCALE2 / VOLTAGE_VID_OFFSET_SCALE1);
2051 } 2037 }
2052 2038
2053 return 0; 2039 return 0;
@@ -2073,66 +2059,70 @@ static int vega10_populate_avfs_parameters(struct pp_hwmgr *hwmgr)
2073 result = pp_atomfwctrl_get_avfs_information(hwmgr, &avfs_params); 2059 result = pp_atomfwctrl_get_avfs_information(hwmgr, &avfs_params);
2074 if (!result) { 2060 if (!result) {
2075 pp_table->MinVoltageVid = (uint8_t) 2061 pp_table->MinVoltageVid = (uint8_t)
2076 convert_to_vid((uint16_t)(avfs_params.ulMaxVddc));
2077 pp_table->MaxVoltageVid = (uint8_t)
2078 convert_to_vid((uint16_t)(avfs_params.ulMinVddc)); 2062 convert_to_vid((uint16_t)(avfs_params.ulMinVddc));
2079 pp_table->BtcGbVdroopTableCksOn.a0 = 2063 pp_table->MaxVoltageVid = (uint8_t)
2080 cpu_to_le32(avfs_params.ulGbVdroopTableCksonA0); 2064 convert_to_vid((uint16_t)(avfs_params.ulMaxVddc));
2081 pp_table->BtcGbVdroopTableCksOn.a1 = 2065
2082 cpu_to_le32(avfs_params.ulGbVdroopTableCksonA1); 2066 pp_table->AConstant[0] = cpu_to_le32(avfs_params.ulMeanNsigmaAcontant0);
2083 pp_table->BtcGbVdroopTableCksOn.a2 = 2067 pp_table->AConstant[1] = cpu_to_le32(avfs_params.ulMeanNsigmaAcontant1);
2084 cpu_to_le32(avfs_params.ulGbVdroopTableCksonA2); 2068 pp_table->AConstant[2] = cpu_to_le32(avfs_params.ulMeanNsigmaAcontant2);
2069 pp_table->DC_tol_sigma = cpu_to_le16(avfs_params.usMeanNsigmaDcTolSigma);
2070 pp_table->Platform_mean = cpu_to_le16(avfs_params.usMeanNsigmaPlatformMean);
2071 pp_table->Platform_sigma = cpu_to_le16(avfs_params.usMeanNsigmaDcTolSigma);
2072 pp_table->PSM_Age_CompFactor = cpu_to_le16(avfs_params.usPsmAgeComfactor);
2085 2073
2086 pp_table->BtcGbVdroopTableCksOff.a0 = 2074 pp_table->BtcGbVdroopTableCksOff.a0 =
2087 cpu_to_le32(avfs_params.ulGbVdroopTableCksoffA0); 2075 cpu_to_le32(avfs_params.ulGbVdroopTableCksoffA0);
2076 pp_table->BtcGbVdroopTableCksOff.a0_shift = 20;
2088 pp_table->BtcGbVdroopTableCksOff.a1 = 2077 pp_table->BtcGbVdroopTableCksOff.a1 =
2089 cpu_to_le32(avfs_params.ulGbVdroopTableCksoffA1); 2078 cpu_to_le32(avfs_params.ulGbVdroopTableCksoffA1);
2079 pp_table->BtcGbVdroopTableCksOff.a1_shift = 20;
2090 pp_table->BtcGbVdroopTableCksOff.a2 = 2080 pp_table->BtcGbVdroopTableCksOff.a2 =
2091 cpu_to_le32(avfs_params.ulGbVdroopTableCksoffA2); 2081 cpu_to_le32(avfs_params.ulGbVdroopTableCksoffA2);
2082 pp_table->BtcGbVdroopTableCksOff.a2_shift = 20;
2083
2084 pp_table->OverrideBtcGbCksOn = avfs_params.ucEnableGbVdroopTableCkson;
2085 pp_table->BtcGbVdroopTableCksOn.a0 =
2086 cpu_to_le32(avfs_params.ulGbVdroopTableCksonA0);
2087 pp_table->BtcGbVdroopTableCksOn.a0_shift = 20;
2088 pp_table->BtcGbVdroopTableCksOn.a1 =
2089 cpu_to_le32(avfs_params.ulGbVdroopTableCksonA1);
2090 pp_table->BtcGbVdroopTableCksOn.a1_shift = 20;
2091 pp_table->BtcGbVdroopTableCksOn.a2 =
2092 cpu_to_le32(avfs_params.ulGbVdroopTableCksonA2);
2093 pp_table->BtcGbVdroopTableCksOn.a2_shift = 20;
2092 2094
2093 pp_table->AvfsGbCksOn.m1 = 2095 pp_table->AvfsGbCksOn.m1 =
2094 cpu_to_le32(avfs_params.ulGbFuseTableCksonM1); 2096 cpu_to_le32(avfs_params.ulGbFuseTableCksonM1);
2095 pp_table->AvfsGbCksOn.m2 = 2097 pp_table->AvfsGbCksOn.m2 =
2096 cpu_to_le16(avfs_params.usGbFuseTableCksonM2); 2098 cpu_to_le16(avfs_params.ulGbFuseTableCksonM2);
2097 pp_table->AvfsGbCksOn.b = 2099 pp_table->AvfsGbCksOn.b =
2098 cpu_to_le32(avfs_params.ulGbFuseTableCksonB); 2100 cpu_to_le32(avfs_params.ulGbFuseTableCksonB);
2099 pp_table->AvfsGbCksOn.m1_shift = 24; 2101 pp_table->AvfsGbCksOn.m1_shift = 24;
2100 pp_table->AvfsGbCksOn.m2_shift = 12; 2102 pp_table->AvfsGbCksOn.m2_shift = 12;
2103 pp_table->AvfsGbCksOn.b_shift = 0;
2101 2104
2105 pp_table->OverrideAvfsGbCksOn =
2106 avfs_params.ucEnableGbFuseTableCkson;
2102 pp_table->AvfsGbCksOff.m1 = 2107 pp_table->AvfsGbCksOff.m1 =
2103 cpu_to_le32(avfs_params.ulGbFuseTableCksoffM1); 2108 cpu_to_le32(avfs_params.ulGbFuseTableCksoffM1);
2104 pp_table->AvfsGbCksOff.m2 = 2109 pp_table->AvfsGbCksOff.m2 =
2105 cpu_to_le16(avfs_params.usGbFuseTableCksoffM2); 2110 cpu_to_le16(avfs_params.ulGbFuseTableCksoffM2);
2106 pp_table->AvfsGbCksOff.b = 2111 pp_table->AvfsGbCksOff.b =
2107 cpu_to_le32(avfs_params.ulGbFuseTableCksoffB); 2112 cpu_to_le32(avfs_params.ulGbFuseTableCksoffB);
2108 pp_table->AvfsGbCksOff.m1_shift = 24; 2113 pp_table->AvfsGbCksOff.m1_shift = 24;
2109 pp_table->AvfsGbCksOff.m2_shift = 12; 2114 pp_table->AvfsGbCksOff.m2_shift = 12;
2110 2115 pp_table->AvfsGbCksOff.b_shift = 0;
2111 pp_table->AConstant[0] = 2116
2112 cpu_to_le32(avfs_params.ulMeanNsigmaAcontant0); 2117 for (i = 0; i < dep_table->count; i++) {
2113 pp_table->AConstant[1] = 2118 if (dep_table->entries[i].sclk_offset == 0)
2114 cpu_to_le32(avfs_params.ulMeanNsigmaAcontant1); 2119 pp_table->StaticVoltageOffsetVid[i] = 248;
2115 pp_table->AConstant[2] = 2120 else
2116 cpu_to_le32(avfs_params.ulMeanNsigmaAcontant2); 2121 pp_table->StaticVoltageOffsetVid[i] =
2117 pp_table->DC_tol_sigma = 2122 (uint8_t)(dep_table->entries[i].sclk_offset *
2118 cpu_to_le16(avfs_params.usMeanNsigmaDcTolSigma);
2119 pp_table->Platform_mean =
2120 cpu_to_le16(avfs_params.usMeanNsigmaPlatformMean);
2121 pp_table->PSM_Age_CompFactor =
2122 cpu_to_le16(avfs_params.usPsmAgeComfactor);
2123 pp_table->Platform_sigma =
2124 cpu_to_le16(avfs_params.usMeanNsigmaDcTolSigma);
2125
2126 for (i = 0; i < dep_table->count; i++)
2127 pp_table->StaticVoltageOffsetVid[i] = (uint8_t)
2128 (dep_table->entries[i].sclk_offset *
2129 VOLTAGE_VID_OFFSET_SCALE2 / 2123 VOLTAGE_VID_OFFSET_SCALE2 /
2130 VOLTAGE_VID_OFFSET_SCALE1); 2124 VOLTAGE_VID_OFFSET_SCALE1);
2131 2125 }
2132 pp_table->OverrideBtcGbCksOn =
2133 avfs_params.ucEnableGbVdroopTableCkson;
2134 pp_table->OverrideAvfsGbCksOn =
2135 avfs_params.ucEnableGbFuseTableCkson;
2136 2126
2137 if ((PPREGKEY_VEGA10QUADRATICEQUATION_DFLT != 2127 if ((PPREGKEY_VEGA10QUADRATICEQUATION_DFLT !=
2138 data->disp_clk_quad_eqn_a) && 2128 data->disp_clk_quad_eqn_a) &&
@@ -2141,20 +2131,21 @@ static int vega10_populate_avfs_parameters(struct pp_hwmgr *hwmgr)
2141 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].m1 = 2131 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].m1 =
2142 (int32_t)data->disp_clk_quad_eqn_a; 2132 (int32_t)data->disp_clk_quad_eqn_a;
2143 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].m2 = 2133 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].m2 =
2144 (int16_t)data->disp_clk_quad_eqn_b; 2134 (int32_t)data->disp_clk_quad_eqn_b;
2145 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].b = 2135 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].b =
2146 (int32_t)data->disp_clk_quad_eqn_c; 2136 (int32_t)data->disp_clk_quad_eqn_c;
2147 } else { 2137 } else {
2148 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].m1 = 2138 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].m1 =
2149 (int32_t)avfs_params.ulDispclk2GfxclkM1; 2139 (int32_t)avfs_params.ulDispclk2GfxclkM1;
2150 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].m2 = 2140 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].m2 =
2151 (int16_t)avfs_params.usDispclk2GfxclkM2; 2141 (int32_t)avfs_params.ulDispclk2GfxclkM2;
2152 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].b = 2142 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].b =
2153 (int32_t)avfs_params.ulDispclk2GfxclkB; 2143 (int32_t)avfs_params.ulDispclk2GfxclkB;
2154 } 2144 }
2155 2145
2156 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].m1_shift = 24; 2146 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].m1_shift = 24;
2157 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].m2_shift = 12; 2147 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].m2_shift = 12;
2148 pp_table->DisplayClock2Gfxclk[DSPCLK_DISPCLK].b_shift = 12;
2158 2149
2159 if ((PPREGKEY_VEGA10QUADRATICEQUATION_DFLT != 2150 if ((PPREGKEY_VEGA10QUADRATICEQUATION_DFLT !=
2160 data->dcef_clk_quad_eqn_a) && 2151 data->dcef_clk_quad_eqn_a) &&
@@ -2163,20 +2154,21 @@ static int vega10_populate_avfs_parameters(struct pp_hwmgr *hwmgr)
2163 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].m1 = 2154 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].m1 =
2164 (int32_t)data->dcef_clk_quad_eqn_a; 2155 (int32_t)data->dcef_clk_quad_eqn_a;
2165 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].m2 = 2156 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].m2 =
2166 (int16_t)data->dcef_clk_quad_eqn_b; 2157 (int32_t)data->dcef_clk_quad_eqn_b;
2167 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].b = 2158 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].b =
2168 (int32_t)data->dcef_clk_quad_eqn_c; 2159 (int32_t)data->dcef_clk_quad_eqn_c;
2169 } else { 2160 } else {
2170 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].m1 = 2161 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].m1 =
2171 (int32_t)avfs_params.ulDcefclk2GfxclkM1; 2162 (int32_t)avfs_params.ulDcefclk2GfxclkM1;
2172 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].m2 = 2163 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].m2 =
2173 (int16_t)avfs_params.usDcefclk2GfxclkM2; 2164 (int32_t)avfs_params.ulDcefclk2GfxclkM2;
2174 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].b = 2165 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].b =
2175 (int32_t)avfs_params.ulDcefclk2GfxclkB; 2166 (int32_t)avfs_params.ulDcefclk2GfxclkB;
2176 } 2167 }
2177 2168
2178 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].m1_shift = 24; 2169 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].m1_shift = 24;
2179 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].m2_shift = 12; 2170 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].m2_shift = 12;
2171 pp_table->DisplayClock2Gfxclk[DSPCLK_DCEFCLK].b_shift = 12;
2180 2172
2181 if ((PPREGKEY_VEGA10QUADRATICEQUATION_DFLT != 2173 if ((PPREGKEY_VEGA10QUADRATICEQUATION_DFLT !=
2182 data->pixel_clk_quad_eqn_a) && 2174 data->pixel_clk_quad_eqn_a) &&
@@ -2185,21 +2177,21 @@ static int vega10_populate_avfs_parameters(struct pp_hwmgr *hwmgr)
2185 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].m1 = 2177 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].m1 =
2186 (int32_t)data->pixel_clk_quad_eqn_a; 2178 (int32_t)data->pixel_clk_quad_eqn_a;
2187 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].m2 = 2179 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].m2 =
2188 (int16_t)data->pixel_clk_quad_eqn_b; 2180 (int32_t)data->pixel_clk_quad_eqn_b;
2189 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].b = 2181 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].b =
2190 (int32_t)data->pixel_clk_quad_eqn_c; 2182 (int32_t)data->pixel_clk_quad_eqn_c;
2191 } else { 2183 } else {
2192 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].m1 = 2184 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].m1 =
2193 (int32_t)avfs_params.ulPixelclk2GfxclkM1; 2185 (int32_t)avfs_params.ulPixelclk2GfxclkM1;
2194 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].m2 = 2186 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].m2 =
2195 (int16_t)avfs_params.usPixelclk2GfxclkM2; 2187 (int32_t)avfs_params.ulPixelclk2GfxclkM2;
2196 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].b = 2188 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].b =
2197 (int32_t)avfs_params.ulPixelclk2GfxclkB; 2189 (int32_t)avfs_params.ulPixelclk2GfxclkB;
2198 } 2190 }
2199 2191
2200 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].m1_shift = 24; 2192 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].m1_shift = 24;
2201 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].m2_shift = 12; 2193 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].m2_shift = 12;
2202 2194 pp_table->DisplayClock2Gfxclk[DSPCLK_PIXCLK].b_shift = 12;
2203 if ((PPREGKEY_VEGA10QUADRATICEQUATION_DFLT != 2195 if ((PPREGKEY_VEGA10QUADRATICEQUATION_DFLT !=
2204 data->phy_clk_quad_eqn_a) && 2196 data->phy_clk_quad_eqn_a) &&
2205 (PPREGKEY_VEGA10QUADRATICEQUATION_DFLT != 2197 (PPREGKEY_VEGA10QUADRATICEQUATION_DFLT !=
@@ -2207,20 +2199,21 @@ static int vega10_populate_avfs_parameters(struct pp_hwmgr *hwmgr)
2207 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].m1 = 2199 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].m1 =
2208 (int32_t)data->phy_clk_quad_eqn_a; 2200 (int32_t)data->phy_clk_quad_eqn_a;
2209 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].m2 = 2201 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].m2 =
2210 (int16_t)data->phy_clk_quad_eqn_b; 2202 (int32_t)data->phy_clk_quad_eqn_b;
2211 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].b = 2203 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].b =
2212 (int32_t)data->phy_clk_quad_eqn_c; 2204 (int32_t)data->phy_clk_quad_eqn_c;
2213 } else { 2205 } else {
2214 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].m1 = 2206 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].m1 =
2215 (int32_t)avfs_params.ulPhyclk2GfxclkM1; 2207 (int32_t)avfs_params.ulPhyclk2GfxclkM1;
2216 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].m2 = 2208 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].m2 =
2217 (int16_t)avfs_params.usPhyclk2GfxclkM2; 2209 (int32_t)avfs_params.ulPhyclk2GfxclkM2;
2218 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].b = 2210 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].b =
2219 (int32_t)avfs_params.ulPhyclk2GfxclkB; 2211 (int32_t)avfs_params.ulPhyclk2GfxclkB;
2220 } 2212 }
2221 2213
2222 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].m1_shift = 24; 2214 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].m1_shift = 24;
2223 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].m2_shift = 12; 2215 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].m2_shift = 12;
2216 pp_table->DisplayClock2Gfxclk[DSPCLK_PHYCLK].b_shift = 12;
2224 } else { 2217 } else {
2225 data->smu_features[GNLD_AVFS].supported = false; 2218 data->smu_features[GNLD_AVFS].supported = false;
2226 } 2219 }
@@ -2309,6 +2302,7 @@ static int vega10_init_smc_table(struct pp_hwmgr *hwmgr)
2309 (struct phm_ppt_v2_information *)(hwmgr->pptable); 2302 (struct phm_ppt_v2_information *)(hwmgr->pptable);
2310 PPTable_t *pp_table = &(data->smc_state_table.pp_table); 2303 PPTable_t *pp_table = &(data->smc_state_table.pp_table);
2311 struct pp_atomfwctrl_voltage_table voltage_table; 2304 struct pp_atomfwctrl_voltage_table voltage_table;
2305 struct pp_atomfwctrl_bios_boot_up_values boot_up_values;
2312 2306
2313 result = vega10_setup_default_dpm_tables(hwmgr); 2307 result = vega10_setup_default_dpm_tables(hwmgr);
2314 PP_ASSERT_WITH_CODE(!result, 2308 PP_ASSERT_WITH_CODE(!result,
@@ -2331,6 +2325,7 @@ static int vega10_init_smc_table(struct pp_hwmgr *hwmgr)
2331 (uint8_t)(table_info->uc_vce_dpm_voltage_mode); 2325 (uint8_t)(table_info->uc_vce_dpm_voltage_mode);
2332 pp_table->Mp0DpmVoltageMode = 2326 pp_table->Mp0DpmVoltageMode =
2333 (uint8_t)(table_info->uc_mp0_dpm_voltage_mode); 2327 (uint8_t)(table_info->uc_mp0_dpm_voltage_mode);
2328
2334 pp_table->DisplayDpmVoltageMode = 2329 pp_table->DisplayDpmVoltageMode =
2335 (uint8_t)(table_info->uc_dcef_dpm_voltage_mode); 2330 (uint8_t)(table_info->uc_dcef_dpm_voltage_mode);
2336 2331
@@ -2372,14 +2367,31 @@ static int vega10_init_smc_table(struct pp_hwmgr *hwmgr)
2372 "Failed to initialize UVD Level!", 2367 "Failed to initialize UVD Level!",
2373 return result); 2368 return result);
2374 2369
2375 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, 2370 if (data->registry_data.clock_stretcher_support) {
2376 PHM_PlatformCaps_ClockStretcher)) {
2377 result = vega10_populate_clock_stretcher_table(hwmgr); 2371 result = vega10_populate_clock_stretcher_table(hwmgr);
2378 PP_ASSERT_WITH_CODE(!result, 2372 PP_ASSERT_WITH_CODE(!result,
2379 "Failed to populate Clock Stretcher Table!", 2373 "Failed to populate Clock Stretcher Table!",
2380 return result); 2374 return result);
2381 } 2375 }
2382 2376
2377 result = pp_atomfwctrl_get_vbios_bootup_values(hwmgr, &boot_up_values);
2378 if (!result) {
2379 data->vbios_boot_state.vddc = boot_up_values.usVddc;
2380 data->vbios_boot_state.vddci = boot_up_values.usVddci;
2381 data->vbios_boot_state.mvddc = boot_up_values.usMvddc;
2382 data->vbios_boot_state.gfx_clock = boot_up_values.ulGfxClk;
2383 data->vbios_boot_state.mem_clock = boot_up_values.ulUClk;
2384 data->vbios_boot_state.soc_clock = boot_up_values.ulSocClk;
2385 if (0 != boot_up_values.usVddc) {
2386 smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
2387 PPSMC_MSG_SetFloorSocVoltage,
2388 (boot_up_values.usVddc * 4));
2389 data->vbios_boot_state.bsoc_vddc_lock = true;
2390 } else {
2391 data->vbios_boot_state.bsoc_vddc_lock = false;
2392 }
2393 }
2394
2383 result = vega10_populate_avfs_parameters(hwmgr); 2395 result = vega10_populate_avfs_parameters(hwmgr);
2384 PP_ASSERT_WITH_CODE(!result, 2396 PP_ASSERT_WITH_CODE(!result,
2385 "Failed to initialize AVFS Parameters!", 2397 "Failed to initialize AVFS Parameters!",
@@ -2404,35 +2416,9 @@ static int vega10_init_smc_table(struct pp_hwmgr *hwmgr)
2404 PP_ASSERT_WITH_CODE(!result, 2416 PP_ASSERT_WITH_CODE(!result,
2405 "Failed to upload PPtable!", return result); 2417 "Failed to upload PPtable!", return result);
2406 2418
2407 if (data->smu_features[GNLD_AVFS].supported) { 2419 result = vega10_avfs_enable(hwmgr, true);
2408 uint32_t features_enabled; 2420 PP_ASSERT_WITH_CODE(!result, "Attempt to enable AVFS feature Failed!",
2409 result = vega10_get_smc_features(hwmgr->smumgr, &features_enabled);
2410 PP_ASSERT_WITH_CODE(!result,
2411 "Failed to Retrieve Enabled Features!",
2412 return result);
2413 if (!(features_enabled & (1 << FEATURE_AVFS_BIT))) {
2414 result = vega10_perform_btc(hwmgr->smumgr);
2415 PP_ASSERT_WITH_CODE(!result,
2416 "Failed to Perform BTC!",
2417 return result);
2418 result = vega10_avfs_enable(hwmgr, true);
2419 PP_ASSERT_WITH_CODE(!result,
2420 "Attempt to enable AVFS feature Failed!",
2421 return result);
2422 result = vega10_save_vft_table(hwmgr->smumgr,
2423 (uint8_t *)&(data->smc_state_table.avfs_table));
2424 PP_ASSERT_WITH_CODE(!result,
2425 "Attempt to save VFT table Failed!",
2426 return result); 2421 return result);
2427 } else {
2428 data->smu_features[GNLD_AVFS].enabled = true;
2429 result = vega10_restore_vft_table(hwmgr->smumgr,
2430 (uint8_t *)&(data->smc_state_table.avfs_table));
2431 PP_ASSERT_WITH_CODE(!result,
2432 "Attempt to restore VFT table Failed!",
2433 return result;);
2434 }
2435 }
2436 2422
2437 return 0; 2423 return 0;
2438} 2424}
@@ -2457,6 +2443,26 @@ static int vega10_enable_thermal_protection(struct pp_hwmgr *hwmgr)
2457 return 0; 2443 return 0;
2458} 2444}
2459 2445
2446static int vega10_disable_thermal_protection(struct pp_hwmgr *hwmgr)
2447{
2448 struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend);
2449
2450 if (data->smu_features[GNLD_THERMAL].supported) {
2451 if (!data->smu_features[GNLD_THERMAL].enabled)
2452 pr_info("THERMAL Feature Already disabled!");
2453
2454 PP_ASSERT_WITH_CODE(
2455 !vega10_enable_smc_features(hwmgr->smumgr,
2456 false,
2457 data->smu_features[GNLD_THERMAL].smu_feature_bitmap),
2458 "disable THERMAL Feature Failed!",
2459 return -1);
2460 data->smu_features[GNLD_THERMAL].enabled = false;
2461 }
2462
2463 return 0;
2464}
2465
2460static int vega10_enable_vrhot_feature(struct pp_hwmgr *hwmgr) 2466static int vega10_enable_vrhot_feature(struct pp_hwmgr *hwmgr)
2461{ 2467{
2462 struct vega10_hwmgr *data = 2468 struct vega10_hwmgr *data =
@@ -2535,6 +2541,37 @@ static int vega10_enable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr)
2535 return 0; 2541 return 0;
2536} 2542}
2537 2543
2544static int vega10_stop_dpm(struct pp_hwmgr *hwmgr, uint32_t bitmap)
2545{
2546 struct vega10_hwmgr *data =
2547 (struct vega10_hwmgr *)(hwmgr->backend);
2548 uint32_t i, feature_mask = 0;
2549
2550
2551 if(data->smu_features[GNLD_LED_DISPLAY].supported == true){
2552 PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
2553 true, data->smu_features[GNLD_LED_DISPLAY].smu_feature_bitmap),
2554 "Attempt to Enable LED DPM feature Failed!", return -EINVAL);
2555 data->smu_features[GNLD_LED_DISPLAY].enabled = true;
2556 }
2557
2558 for (i = 0; i < GNLD_DPM_MAX; i++) {
2559 if (data->smu_features[i].smu_feature_bitmap & bitmap) {
2560 if (data->smu_features[i].supported) {
2561 if (data->smu_features[i].enabled) {
2562 feature_mask |= data->smu_features[i].
2563 smu_feature_bitmap;
2564 data->smu_features[i].enabled = false;
2565 }
2566 }
2567 }
2568 }
2569
2570 vega10_enable_smc_features(hwmgr->smumgr, false, feature_mask);
2571
2572 return 0;
2573}
2574
2538/** 2575/**
2539 * @brief Tell SMC to enabled the supported DPMs. 2576 * @brief Tell SMC to enabled the supported DPMs.
2540 * 2577 *
@@ -2576,6 +2613,12 @@ static int vega10_start_dpm(struct pp_hwmgr *hwmgr, uint32_t bitmap)
2576 data->smu_features[GNLD_LED_DISPLAY].enabled = true; 2613 data->smu_features[GNLD_LED_DISPLAY].enabled = true;
2577 } 2614 }
2578 2615
2616 if (data->vbios_boot_state.bsoc_vddc_lock) {
2617 smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
2618 PPSMC_MSG_SetFloorSocVoltage, 0);
2619 data->vbios_boot_state.bsoc_vddc_lock = false;
2620 }
2621
2579 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, 2622 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
2580 PHM_PlatformCaps_Falcon_QuickTransition)) { 2623 PHM_PlatformCaps_Falcon_QuickTransition)) {
2581 if (data->smu_features[GNLD_ACDC].supported) { 2624 if (data->smu_features[GNLD_ACDC].supported) {
@@ -2602,8 +2645,6 @@ static int vega10_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
2602 "Failed to configure telemetry!", 2645 "Failed to configure telemetry!",
2603 return tmp_result); 2646 return tmp_result);
2604 2647
2605 vega10_set_tools_address(hwmgr->smumgr);
2606
2607 smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, 2648 smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
2608 PPSMC_MSG_NumOfDisplays, 0); 2649 PPSMC_MSG_NumOfDisplays, 0);
2609 2650
@@ -3880,32 +3921,36 @@ static int vega10_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,
3880 3921
3881static int vega10_set_fan_control_mode(struct pp_hwmgr *hwmgr, uint32_t mode) 3922static int vega10_set_fan_control_mode(struct pp_hwmgr *hwmgr, uint32_t mode)
3882{ 3923{
3883 if (mode) { 3924 int result = 0;
3884 /* stop auto-manage */
3885 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
3886 PHM_PlatformCaps_MicrocodeFanControl))
3887 vega10_fan_ctrl_stop_smc_fan_control(hwmgr);
3888 vega10_fan_ctrl_set_static_mode(hwmgr, mode);
3889 } else
3890 /* restart auto-manage */
3891 vega10_fan_ctrl_reset_fan_speed_to_default(hwmgr);
3892 3925
3893 return 0; 3926 switch (mode) {
3927 case AMD_FAN_CTRL_NONE:
3928 result = vega10_fan_ctrl_set_fan_speed_percent(hwmgr, 100);
3929 break;
3930 case AMD_FAN_CTRL_MANUAL:
3931 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
3932 PHM_PlatformCaps_MicrocodeFanControl))
3933 result = vega10_fan_ctrl_stop_smc_fan_control(hwmgr);
3934 break;
3935 case AMD_FAN_CTRL_AUTO:
3936 result = vega10_fan_ctrl_set_static_mode(hwmgr, mode);
3937 if (!result)
3938 result = vega10_fan_ctrl_start_smc_fan_control(hwmgr);
3939 break;
3940 default:
3941 break;
3942 }
3943 return result;
3894} 3944}
3895 3945
3896static int vega10_get_fan_control_mode(struct pp_hwmgr *hwmgr) 3946static int vega10_get_fan_control_mode(struct pp_hwmgr *hwmgr)
3897{ 3947{
3898 uint32_t reg; 3948 struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend);
3899 3949
3900 if (hwmgr->fan_ctrl_is_in_default_mode) { 3950 if (data->smu_features[GNLD_FAN_CONTROL].enabled == false)
3901 return hwmgr->fan_ctrl_default_mode; 3951 return AMD_FAN_CTRL_MANUAL;
3902 } else { 3952 else
3903 reg = soc15_get_register_offset(THM_HWID, 0, 3953 return AMD_FAN_CTRL_AUTO;
3904 mmCG_FDO_CTRL2_BASE_IDX, mmCG_FDO_CTRL2);
3905 return (cgs_read_register(hwmgr->device, reg) &
3906 CG_FDO_CTRL2__FDO_PWM_MODE_MASK) >>
3907 CG_FDO_CTRL2__FDO_PWM_MODE__SHIFT;
3908 }
3909} 3954}
3910 3955
3911static int vega10_get_dal_power_level(struct pp_hwmgr *hwmgr, 3956static int vega10_get_dal_power_level(struct pp_hwmgr *hwmgr,
@@ -4148,55 +4193,56 @@ static int vega10_force_clock_level(struct pp_hwmgr *hwmgr,
4148 4193
4149 switch (type) { 4194 switch (type) {
4150 case PP_SCLK: 4195 case PP_SCLK:
4151 if (data->registry_data.sclk_dpm_key_disabled)
4152 break;
4153
4154 for (i = 0; i < 32; i++) { 4196 for (i = 0; i < 32; i++) {
4155 if (mask & (1 << i)) 4197 if (mask & (1 << i))
4156 break; 4198 break;
4157 } 4199 }
4200 data->smc_state_table.gfx_boot_level = i;
4158 4201
4159 PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc_with_parameter( 4202 for (i = 31; i >= 0; i--) {
4160 hwmgr->smumgr, 4203 if (mask & (1 << i))
4161 PPSMC_MSG_SetSoftMinGfxclkByIndex, 4204 break;
4162 i), 4205 }
4163 "Failed to set soft min sclk index!", 4206 data->smc_state_table.gfx_max_level = i;
4164 return -1); 4207
4208 PP_ASSERT_WITH_CODE(!vega10_upload_dpm_bootup_level(hwmgr),
4209 "Failed to upload boot level to lowest!",
4210 return -EINVAL);
4211
4212 PP_ASSERT_WITH_CODE(!vega10_upload_dpm_max_level(hwmgr),
4213 "Failed to upload dpm max level to highest!",
4214 return -EINVAL);
4165 break; 4215 break;
4166 4216
4167 case PP_MCLK: 4217 case PP_MCLK:
4168 if (data->registry_data.mclk_dpm_key_disabled)
4169 break;
4170
4171 for (i = 0; i < 32; i++) { 4218 for (i = 0; i < 32; i++) {
4172 if (mask & (1 << i)) 4219 if (mask & (1 << i))
4173 break; 4220 break;
4174 } 4221 }
4175 4222
4176 PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc_with_parameter(
4177 hwmgr->smumgr,
4178 PPSMC_MSG_SetSoftMinUclkByIndex,
4179 i),
4180 "Failed to set soft min mclk index!",
4181 return -1);
4182 break;
4183
4184 case PP_PCIE:
4185 if (data->registry_data.pcie_dpm_key_disabled)
4186 break;
4187
4188 for (i = 0; i < 32; i++) { 4223 for (i = 0; i < 32; i++) {
4189 if (mask & (1 << i)) 4224 if (mask & (1 << i))
4190 break; 4225 break;
4191 } 4226 }
4227 data->smc_state_table.mem_boot_level = i;
4228
4229 for (i = 31; i >= 0; i--) {
4230 if (mask & (1 << i))
4231 break;
4232 }
4233 data->smc_state_table.mem_max_level = i;
4234
4235 PP_ASSERT_WITH_CODE(!vega10_upload_dpm_bootup_level(hwmgr),
4236 "Failed to upload boot level to lowest!",
4237 return -EINVAL);
4238
4239 PP_ASSERT_WITH_CODE(!vega10_upload_dpm_max_level(hwmgr),
4240 "Failed to upload dpm max level to highest!",
4241 return -EINVAL);
4192 4242
4193 PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc_with_parameter(
4194 hwmgr->smumgr,
4195 PPSMC_MSG_SetMinLinkDpmByIndex,
4196 i),
4197 "Failed to set min pcie index!",
4198 return -1);
4199 break; 4243 break;
4244
4245 case PP_PCIE:
4200 default: 4246 default:
4201 break; 4247 break;
4202 } 4248 }
@@ -4395,11 +4441,55 @@ vega10_check_smc_update_required_for_display_configuration(struct pp_hwmgr *hwmg
4395 return is_update_required; 4441 return is_update_required;
4396} 4442}
4397 4443
4444static int vega10_disable_dpm_tasks(struct pp_hwmgr *hwmgr)
4445{
4446 int tmp_result, result = 0;
4447
4448 tmp_result = (vega10_is_dpm_running(hwmgr)) ? 0 : -1;
4449 PP_ASSERT_WITH_CODE(tmp_result == 0,
4450 "DPM is not running right now, no need to disable DPM!",
4451 return 0);
4452
4453 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
4454 PHM_PlatformCaps_ThermalController))
4455 vega10_disable_thermal_protection(hwmgr);
4456
4457 tmp_result = vega10_disable_power_containment(hwmgr);
4458 PP_ASSERT_WITH_CODE((tmp_result == 0),
4459 "Failed to disable power containment!", result = tmp_result);
4460
4461 tmp_result = vega10_avfs_enable(hwmgr, false);
4462 PP_ASSERT_WITH_CODE((tmp_result == 0),
4463 "Failed to disable AVFS!", result = tmp_result);
4464
4465 tmp_result = vega10_stop_dpm(hwmgr, SMC_DPM_FEATURES);
4466 PP_ASSERT_WITH_CODE((tmp_result == 0),
4467 "Failed to stop DPM!", result = tmp_result);
4468
4469 return result;
4470}
4471
4472static int vega10_power_off_asic(struct pp_hwmgr *hwmgr)
4473{
4474 struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend);
4475 int result;
4476
4477 result = vega10_disable_dpm_tasks(hwmgr);
4478 PP_ASSERT_WITH_CODE((0 == result),
4479 "[disable_dpm_tasks] Failed to disable DPM!",
4480 );
4481 data->water_marks_bitmap &= ~(WaterMarksLoaded);
4482
4483 return result;
4484}
4485
4486
4398static const struct pp_hwmgr_func vega10_hwmgr_funcs = { 4487static const struct pp_hwmgr_func vega10_hwmgr_funcs = {
4399 .backend_init = vega10_hwmgr_backend_init, 4488 .backend_init = vega10_hwmgr_backend_init,
4400 .backend_fini = vega10_hwmgr_backend_fini, 4489 .backend_fini = vega10_hwmgr_backend_fini,
4401 .asic_setup = vega10_setup_asic_task, 4490 .asic_setup = vega10_setup_asic_task,
4402 .dynamic_state_management_enable = vega10_enable_dpm_tasks, 4491 .dynamic_state_management_enable = vega10_enable_dpm_tasks,
4492 .dynamic_state_management_disable = vega10_disable_dpm_tasks,
4403 .get_num_of_pp_table_entries = 4493 .get_num_of_pp_table_entries =
4404 vega10_get_number_of_powerplay_table_entries, 4494 vega10_get_number_of_powerplay_table_entries,
4405 .get_power_state_size = vega10_get_power_state_size, 4495 .get_power_state_size = vega10_get_power_state_size,
@@ -4439,6 +4529,8 @@ static const struct pp_hwmgr_func vega10_hwmgr_funcs = {
4439 .check_states_equal = vega10_check_states_equal, 4529 .check_states_equal = vega10_check_states_equal,
4440 .check_smc_update_required_for_display_configuration = 4530 .check_smc_update_required_for_display_configuration =
4441 vega10_check_smc_update_required_for_display_configuration, 4531 vega10_check_smc_update_required_for_display_configuration,
4532 .power_off_asic = vega10_power_off_asic,
4533 .disable_smc_firmware_ctf = vega10_thermal_disable_alert,
4442}; 4534};
4443 4535
4444int vega10_hwmgr_init(struct pp_hwmgr *hwmgr) 4536int vega10_hwmgr_init(struct pp_hwmgr *hwmgr)
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h
index 83c67b9262ff..1912e086c0cf 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h
@@ -177,8 +177,11 @@ struct vega10_dpmlevel_enable_mask {
177}; 177};
178 178
179struct vega10_vbios_boot_state { 179struct vega10_vbios_boot_state {
180 bool bsoc_vddc_lock;
180 uint16_t vddc; 181 uint16_t vddc;
181 uint16_t vddci; 182 uint16_t vddci;
183 uint16_t mvddc;
184 uint16_t vdd_gfx;
182 uint32_t gfx_clock; 185 uint32_t gfx_clock;
183 uint32_t mem_clock; 186 uint32_t mem_clock;
184 uint32_t soc_clock; 187 uint32_t soc_clock;
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.c
index f1e244cd2370..3f72268e99bb 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.c
@@ -48,8 +48,8 @@ void vega10_initialize_power_tune_defaults(struct pp_hwmgr *hwmgr)
48 table->Tliquid1Limit = cpu_to_le16(tdp_table->usTemperatureLimitLiquid1); 48 table->Tliquid1Limit = cpu_to_le16(tdp_table->usTemperatureLimitLiquid1);
49 table->Tliquid2Limit = cpu_to_le16(tdp_table->usTemperatureLimitLiquid2); 49 table->Tliquid2Limit = cpu_to_le16(tdp_table->usTemperatureLimitLiquid2);
50 table->TplxLimit = cpu_to_le16(tdp_table->usTemperatureLimitPlx); 50 table->TplxLimit = cpu_to_le16(tdp_table->usTemperatureLimitPlx);
51 table->LoadLineResistance = cpu_to_le16( 51 table->LoadLineResistance =
52 hwmgr->platform_descriptor.LoadLineSlope); 52 hwmgr->platform_descriptor.LoadLineSlope * 256;
53 table->FitLimit = 0; /* Not used for Vega10 */ 53 table->FitLimit = 0; /* Not used for Vega10 */
54 54
55 table->Liquid1_I2C_address = tdp_table->ucLiquid1_I2C_address; 55 table->Liquid1_I2C_address = tdp_table->ucLiquid1_I2C_address;
@@ -113,6 +113,29 @@ int vega10_enable_power_containment(struct pp_hwmgr *hwmgr)
113 return result; 113 return result;
114} 114}
115 115
116int vega10_disable_power_containment(struct pp_hwmgr *hwmgr)
117{
118 struct vega10_hwmgr *data =
119 (struct vega10_hwmgr *)(hwmgr->backend);
120
121 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
122 PHM_PlatformCaps_PowerContainment)) {
123 if (data->smu_features[GNLD_PPT].supported)
124 PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
125 false, data->smu_features[GNLD_PPT].smu_feature_bitmap),
126 "Attempt to disable PPT feature Failed!",
127 data->smu_features[GNLD_PPT].supported = false);
128
129 if (data->smu_features[GNLD_TDC].supported)
130 PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
131 false, data->smu_features[GNLD_TDC].smu_feature_bitmap),
132 "Attempt to disable PPT feature Failed!",
133 data->smu_features[GNLD_TDC].supported = false);
134 }
135
136 return 0;
137}
138
116static int vega10_set_overdrive_target_percentage(struct pp_hwmgr *hwmgr, 139static int vega10_set_overdrive_target_percentage(struct pp_hwmgr *hwmgr,
117 uint32_t adjust_percent) 140 uint32_t adjust_percent)
118{ 141{
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.h
index d9662bf4a4b4..9ecaa27c0bb5 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.h
@@ -60,6 +60,7 @@ int vega10_enable_smc_cac(struct pp_hwmgr *hwmgr);
60int vega10_enable_power_containment(struct pp_hwmgr *hwmgr); 60int vega10_enable_power_containment(struct pp_hwmgr *hwmgr);
61int vega10_set_power_limit(struct pp_hwmgr *hwmgr, uint32_t n); 61int vega10_set_power_limit(struct pp_hwmgr *hwmgr, uint32_t n);
62int vega10_power_control_set_level(struct pp_hwmgr *hwmgr); 62int vega10_power_control_set_level(struct pp_hwmgr *hwmgr);
63int vega10_disable_power_containment(struct pp_hwmgr *hwmgr);
63 64
64#endif /* _VEGA10_POWERTUNE_H_ */ 65#endif /* _VEGA10_POWERTUNE_H_ */
65 66
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c
index 8b55ae01132d..00e95511e19a 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c
@@ -407,7 +407,7 @@ static int get_tdp_table(
407 tdp_table->ucPlx_I2C_address = power_tune_table->ucPlx_I2C_address; 407 tdp_table->ucPlx_I2C_address = power_tune_table->ucPlx_I2C_address;
408 tdp_table->ucPlx_I2C_Line = power_tune_table->ucPlx_I2C_LineSCL; 408 tdp_table->ucPlx_I2C_Line = power_tune_table->ucPlx_I2C_LineSCL;
409 tdp_table->ucPlx_I2C_LineSDA = power_tune_table->ucPlx_I2C_LineSDA; 409 tdp_table->ucPlx_I2C_LineSDA = power_tune_table->ucPlx_I2C_LineSDA;
410 hwmgr->platform_descriptor.LoadLineSlope = power_tune_table->usLoadLineResistance; 410 hwmgr->platform_descriptor.LoadLineSlope = le16_to_cpu(power_tune_table->usLoadLineResistance);
411 } else { 411 } else {
412 power_tune_table_v2 = (ATOM_Vega10_PowerTune_Table_V2 *)table; 412 power_tune_table_v2 = (ATOM_Vega10_PowerTune_Table_V2 *)table;
413 tdp_table->usMaximumPowerDeliveryLimit = le16_to_cpu(power_tune_table_v2->usSocketPowerLimit); 413 tdp_table->usMaximumPowerDeliveryLimit = le16_to_cpu(power_tune_table_v2->usSocketPowerLimit);
@@ -453,7 +453,7 @@ static int get_tdp_table(
453 tdp_table->ucPlx_I2C_LineSDA = sda; 453 tdp_table->ucPlx_I2C_LineSDA = sda;
454 454
455 hwmgr->platform_descriptor.LoadLineSlope = 455 hwmgr->platform_descriptor.LoadLineSlope =
456 power_tune_table_v2->usLoadLineResistance; 456 le16_to_cpu(power_tune_table_v2->usLoadLineResistance);
457 } 457 }
458 458
459 *info_tdp_table = tdp_table; 459 *info_tdp_table = tdp_table;
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c
index f4d77b62e1ba..d5f53d04fa08 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c
@@ -381,14 +381,10 @@ int vega10_thermal_get_temperature(struct pp_hwmgr *hwmgr)
381 381
382 temp = cgs_read_register(hwmgr->device, reg); 382 temp = cgs_read_register(hwmgr->device, reg);
383 383
384 temp = (temp & CG_MULT_THERMAL_STATUS__CTF_TEMP_MASK) >> 384 temp = (temp & CG_MULT_THERMAL_STATUS__ASIC_MAX_TEMP_MASK) >>
385 CG_MULT_THERMAL_STATUS__CTF_TEMP__SHIFT; 385 CG_MULT_THERMAL_STATUS__ASIC_MAX_TEMP__SHIFT;
386 386
387 /* Bit 9 means the reading is lower than the lowest usable value. */ 387 temp = temp & 0x1ff;
388 if (temp & 0x200)
389 temp = VEGA10_THERMAL_MAXIMUM_TEMP_READING;
390 else
391 temp = temp & 0x1ff;
392 388
393 temp *= PP_TEMPERATURE_UNITS_PER_CENTIGRADES; 389 temp *= PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
394 390
@@ -424,23 +420,28 @@ static int vega10_thermal_set_temperature_range(struct pp_hwmgr *hwmgr,
424 mmTHM_THERMAL_INT_CTRL_BASE_IDX, mmTHM_THERMAL_INT_CTRL); 420 mmTHM_THERMAL_INT_CTRL_BASE_IDX, mmTHM_THERMAL_INT_CTRL);
425 421
426 val = cgs_read_register(hwmgr->device, reg); 422 val = cgs_read_register(hwmgr->device, reg);
427 val &= ~(THM_THERMAL_INT_CTRL__DIG_THERM_INTH_MASK); 423
428 val |= (high / PP_TEMPERATURE_UNITS_PER_CENTIGRADES) << 424 val &= (~THM_THERMAL_INT_CTRL__MAX_IH_CREDIT_MASK);
429 THM_THERMAL_INT_CTRL__DIG_THERM_INTH__SHIFT; 425 val |= (5 << THM_THERMAL_INT_CTRL__MAX_IH_CREDIT__SHIFT);
430 val &= ~(THM_THERMAL_INT_CTRL__DIG_THERM_INTL_MASK); 426
431 val |= (low / PP_TEMPERATURE_UNITS_PER_CENTIGRADES) << 427 val &= (~THM_THERMAL_INT_CTRL__THERM_IH_HW_ENA_MASK);
432 THM_THERMAL_INT_CTRL__DIG_THERM_INTL__SHIFT; 428 val |= (1 << THM_THERMAL_INT_CTRL__THERM_IH_HW_ENA__SHIFT);
429
430 val &= (~THM_THERMAL_INT_CTRL__DIG_THERM_INTH_MASK);
431 val |= ((high / PP_TEMPERATURE_UNITS_PER_CENTIGRADES)
432 << THM_THERMAL_INT_CTRL__DIG_THERM_INTH__SHIFT);
433
434 val &= (~THM_THERMAL_INT_CTRL__DIG_THERM_INTL_MASK);
435 val |= ((low / PP_TEMPERATURE_UNITS_PER_CENTIGRADES)
436 << THM_THERMAL_INT_CTRL__DIG_THERM_INTL__SHIFT);
437
438 val = val & (~THM_THERMAL_INT_CTRL__THERM_TRIGGER_MASK_MASK);
439
433 cgs_write_register(hwmgr->device, reg, val); 440 cgs_write_register(hwmgr->device, reg, val);
434 441
435 reg = soc15_get_register_offset(THM_HWID, 0, 442 reg = soc15_get_register_offset(THM_HWID, 0,
436 mmTHM_TCON_HTC_BASE_IDX, mmTHM_TCON_HTC); 443 mmTHM_TCON_HTC_BASE_IDX, mmTHM_TCON_HTC);
437 444
438 val = cgs_read_register(hwmgr->device, reg);
439 val &= ~(THM_TCON_HTC__HTC_TMP_LMT_MASK);
440 val |= (high / PP_TEMPERATURE_UNITS_PER_CENTIGRADES) <<
441 THM_TCON_HTC__HTC_TMP_LMT__SHIFT;
442 cgs_write_register(hwmgr->device, reg, val);
443
444 return 0; 445 return 0;
445} 446}
446 447
@@ -482,18 +483,28 @@ static int vega10_thermal_initialize(struct pp_hwmgr *hwmgr)
482static int vega10_thermal_enable_alert(struct pp_hwmgr *hwmgr) 483static int vega10_thermal_enable_alert(struct pp_hwmgr *hwmgr)
483{ 484{
484 struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend); 485 struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend);
486 uint32_t val = 0;
487 uint32_t reg;
485 488
486 if (data->smu_features[GNLD_FW_CTF].supported) { 489 if (data->smu_features[GNLD_FW_CTF].supported) {
487 if (data->smu_features[GNLD_FW_CTF].enabled) 490 if (data->smu_features[GNLD_FW_CTF].enabled)
488 printk("[Thermal_EnableAlert] FW CTF Already Enabled!\n"); 491 printk("[Thermal_EnableAlert] FW CTF Already Enabled!\n");
492
493 PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
494 true,
495 data->smu_features[GNLD_FW_CTF].smu_feature_bitmap),
496 "Attempt to Enable FW CTF feature Failed!",
497 return -1);
498 data->smu_features[GNLD_FW_CTF].enabled = true;
489 } 499 }
490 500
491 PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr, 501 val |= (1 << THM_THERMAL_INT_ENA__THERM_INTH_CLR__SHIFT);
492 true, 502 val |= (1 << THM_THERMAL_INT_ENA__THERM_INTL_CLR__SHIFT);
493 data->smu_features[GNLD_FW_CTF].smu_feature_bitmap), 503 val |= (1 << THM_THERMAL_INT_ENA__THERM_TRIGGER_CLR__SHIFT);
494 "Attempt to Enable FW CTF feature Failed!", 504
495 return -1); 505 reg = soc15_get_register_offset(THM_HWID, 0, mmTHM_THERMAL_INT_ENA_BASE_IDX, mmTHM_THERMAL_INT_ENA);
496 data->smu_features[GNLD_FW_CTF].enabled = true; 506 cgs_write_register(hwmgr->device, reg, val);
507
497 return 0; 508 return 0;
498} 509}
499 510
@@ -501,21 +512,27 @@ static int vega10_thermal_enable_alert(struct pp_hwmgr *hwmgr)
501* Disable thermal alerts on the RV770 thermal controller. 512* Disable thermal alerts on the RV770 thermal controller.
502* @param hwmgr The address of the hardware manager. 513* @param hwmgr The address of the hardware manager.
503*/ 514*/
504static int vega10_thermal_disable_alert(struct pp_hwmgr *hwmgr) 515int vega10_thermal_disable_alert(struct pp_hwmgr *hwmgr)
505{ 516{
506 struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend); 517 struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend);
518 uint32_t reg;
507 519
508 if (data->smu_features[GNLD_FW_CTF].supported) { 520 if (data->smu_features[GNLD_FW_CTF].supported) {
509 if (!data->smu_features[GNLD_FW_CTF].enabled) 521 if (!data->smu_features[GNLD_FW_CTF].enabled)
510 printk("[Thermal_EnableAlert] FW CTF Already disabled!\n"); 522 printk("[Thermal_EnableAlert] FW CTF Already disabled!\n");
511 }
512 523
513 PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr, 524
525 PP_ASSERT_WITH_CODE(!vega10_enable_smc_features(hwmgr->smumgr,
514 false, 526 false,
515 data->smu_features[GNLD_FW_CTF].smu_feature_bitmap), 527 data->smu_features[GNLD_FW_CTF].smu_feature_bitmap),
516 "Attempt to disable FW CTF feature Failed!", 528 "Attempt to disable FW CTF feature Failed!",
517 return -1); 529 return -1);
518 data->smu_features[GNLD_FW_CTF].enabled = false; 530 data->smu_features[GNLD_FW_CTF].enabled = false;
531 }
532
533 reg = soc15_get_register_offset(THM_HWID, 0, mmTHM_THERMAL_INT_ENA_BASE_IDX, mmTHM_THERMAL_INT_ENA);
534 cgs_write_register(hwmgr->device, reg, 0);
535
519 return 0; 536 return 0;
520} 537}
521 538
@@ -561,6 +578,11 @@ int tf_vega10_thermal_setup_fan_table(struct pp_hwmgr *hwmgr,
561 advanceFanControlParameters.ulMinFanSCLKAcousticLimit); 578 advanceFanControlParameters.ulMinFanSCLKAcousticLimit);
562 table->FanTargetTemperature = hwmgr->thermal_controller. 579 table->FanTargetTemperature = hwmgr->thermal_controller.
563 advanceFanControlParameters.usTMax; 580 advanceFanControlParameters.usTMax;
581
582 smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
583 PPSMC_MSG_SetFanTemperatureTarget,
584 (uint32_t)table->FanTargetTemperature);
585
564 table->FanPwmMin = hwmgr->thermal_controller. 586 table->FanPwmMin = hwmgr->thermal_controller.
565 advanceFanControlParameters.usPWMMin * 255 / 100; 587 advanceFanControlParameters.usPWMMin * 255 / 100;
566 table->FanTargetGfxclk = (uint16_t)(hwmgr->thermal_controller. 588 table->FanTargetGfxclk = (uint16_t)(hwmgr->thermal_controller.
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.h
index 8036808ec421..776f3a2effc0 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.h
@@ -78,6 +78,8 @@ extern int vega10_fan_ctrl_get_fan_speed_rpm(struct pp_hwmgr *hwmgr,
78 uint32_t *speed); 78 uint32_t *speed);
79extern int vega10_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr); 79extern int vega10_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr);
80extern uint32_t smu7_get_xclk(struct pp_hwmgr *hwmgr); 80extern uint32_t smu7_get_xclk(struct pp_hwmgr *hwmgr);
81extern int vega10_thermal_disable_alert(struct pp_hwmgr *hwmgr);
82int vega10_fan_ctrl_start_smc_fan_control(struct pp_hwmgr *hwmgr);
81 83
82#endif 84#endif
83 85
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h b/drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h
index 5345b50761f4..a1ebe1014492 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h
@@ -431,6 +431,6 @@ extern int phm_display_clock_voltage_request(struct pp_hwmgr *hwmgr,
431 struct pp_display_clock_request *clock); 431 struct pp_display_clock_request *clock);
432 432
433extern int phm_get_max_high_clocks(struct pp_hwmgr *hwmgr, struct amd_pp_simple_clock_info *clocks); 433extern int phm_get_max_high_clocks(struct pp_hwmgr *hwmgr, struct amd_pp_simple_clock_info *clocks);
434 434extern int phm_disable_smc_firmware_ctf(struct pp_hwmgr *hwmgr);
435#endif /* _HARDWARE_MANAGER_H_ */ 435#endif /* _HARDWARE_MANAGER_H_ */
436 436
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
index 320225dd3328..805b9df452a3 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
@@ -368,11 +368,10 @@ struct pp_hwmgr_func {
368 int (*get_mclk_od)(struct pp_hwmgr *hwmgr); 368 int (*get_mclk_od)(struct pp_hwmgr *hwmgr);
369 int (*set_mclk_od)(struct pp_hwmgr *hwmgr, uint32_t value); 369 int (*set_mclk_od)(struct pp_hwmgr *hwmgr, uint32_t value);
370 int (*read_sensor)(struct pp_hwmgr *hwmgr, int idx, void *value, int *size); 370 int (*read_sensor)(struct pp_hwmgr *hwmgr, int idx, void *value, int *size);
371 int (*request_firmware)(struct pp_hwmgr *hwmgr);
372 int (*release_firmware)(struct pp_hwmgr *hwmgr);
373 int (*set_power_profile_state)(struct pp_hwmgr *hwmgr, 371 int (*set_power_profile_state)(struct pp_hwmgr *hwmgr,
374 struct amd_pp_profile *request); 372 struct amd_pp_profile *request);
375 int (*avfs_control)(struct pp_hwmgr *hwmgr, bool enable); 373 int (*avfs_control)(struct pp_hwmgr *hwmgr, bool enable);
374 int (*disable_smc_firmware_ctf)(struct pp_hwmgr *hwmgr);
376}; 375};
377 376
378struct pp_table_func { 377struct pp_table_func {
@@ -765,6 +764,7 @@ struct pp_hwmgr {
765 struct pp_thermal_controller_info thermal_controller; 764 struct pp_thermal_controller_info thermal_controller;
766 bool fan_ctrl_is_in_default_mode; 765 bool fan_ctrl_is_in_default_mode;
767 uint32_t fan_ctrl_default_mode; 766 uint32_t fan_ctrl_default_mode;
767 bool fan_ctrl_enabled;
768 uint32_t tmin; 768 uint32_t tmin;
769 struct phm_microcode_version_info microcode_version_info; 769 struct phm_microcode_version_info microcode_version_info;
770 uint32_t ps_size; 770 uint32_t ps_size;
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu9_driver_if.h b/drivers/gpu/drm/amd/powerplay/inc/smu9_driver_if.h
index 2037910adcb1..d43f98a910b0 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/smu9_driver_if.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/smu9_driver_if.h
@@ -30,7 +30,7 @@
30 * SMU TEAM: Always increment the interface version if 30 * SMU TEAM: Always increment the interface version if
31 * any structure is changed in this file 31 * any structure is changed in this file
32 */ 32 */
33#define SMU9_DRIVER_IF_VERSION 0xB 33#define SMU9_DRIVER_IF_VERSION 0xD
34 34
35#define PPTABLE_V10_SMU_VERSION 1 35#define PPTABLE_V10_SMU_VERSION 1
36 36
@@ -302,7 +302,17 @@ typedef struct {
302 302
303 uint32_t DpmLevelPowerDelta; 303 uint32_t DpmLevelPowerDelta;
304 304
305 uint32_t Reserved[19]; 305 uint8_t EnableBoostState;
306 uint8_t AConstant_Shift;
307 uint8_t DC_tol_sigma_Shift;
308 uint8_t PSM_Age_CompFactor_Shift;
309
310 uint16_t BoostStartTemperature;
311 uint16_t BoostStopTemperature;
312
313 PllSetting_t GfxBoostState;
314
315 uint32_t Reserved[14];
306 316
307 /* Padding - ignore */ 317 /* Padding - ignore */
308 uint32_t MmHubPadding[7]; /* SMU internal use */ 318 uint32_t MmHubPadding[7]; /* SMU internal use */
@@ -464,4 +474,8 @@ typedef struct {
464#define DB_PCC_SHIFT 26 474#define DB_PCC_SHIFT 26
465#define DB_EDC_SHIFT 27 475#define DB_EDC_SHIFT 27
466 476
477#define REMOVE_FMAX_MARGIN_BIT 0x0
478#define REMOVE_DCTOL_MARGIN_BIT 0x1
479#define REMOVE_PLATFORM_MARGIN_BIT 0x2
480
467#endif 481#endif
diff --git a/drivers/gpu/drm/amd/powerplay/inc/vega10_ppsmc.h b/drivers/gpu/drm/amd/powerplay/inc/vega10_ppsmc.h
index 90beef35bba2..254974d3d371 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/vega10_ppsmc.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/vega10_ppsmc.h
@@ -122,7 +122,10 @@ typedef uint16_t PPSMC_Result;
122#define PPSMC_MSG_SetFanMinPwm 0x52 122#define PPSMC_MSG_SetFanMinPwm 0x52
123#define PPSMC_MSG_ConfigureGfxDidt 0x55 123#define PPSMC_MSG_ConfigureGfxDidt 0x55
124#define PPSMC_MSG_NumOfDisplays 0x56 124#define PPSMC_MSG_NumOfDisplays 0x56
125#define PPSMC_Message_Count 0x57 125#define PPSMC_MSG_ReadSerialNumTop32 0x58
126#define PPSMC_MSG_ReadSerialNumBottom32 0x59
127#define PPSMC_Message_Count 0x5A
128
126 129
127typedef int PPSMC_Msg; 130typedef int PPSMC_Msg;
128 131
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c
index 2685f02ab551..115f0e4b1603 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c
@@ -74,18 +74,18 @@ static bool vega10_is_smc_ram_running(struct pp_smumgr *smumgr)
74 return false; 74 return false;
75} 75}
76 76
77/** 77/*
78* Check if SMC has responded to previous message. 78 * Check if SMC has responded to previous message.
79* 79 *
80* @param smumgr the address of the powerplay hardware manager. 80 * @param smumgr the address of the powerplay hardware manager.
81* @return TRUE SMC has responded, FALSE otherwise. 81 * @return TRUE SMC has responded, FALSE otherwise.
82*/ 82 */
83static uint32_t vega10_wait_for_response(struct pp_smumgr *smumgr) 83static uint32_t vega10_wait_for_response(struct pp_smumgr *smumgr)
84{ 84{
85 uint32_t reg; 85 uint32_t reg;
86 86
87 if (!vega10_is_smc_ram_running(smumgr)) 87 if (!vega10_is_smc_ram_running(smumgr))
88 return -1; 88 return -EINVAL;
89 89
90 reg = soc15_get_register_offset(MP1_HWID, 0, 90 reg = soc15_get_register_offset(MP1_HWID, 0,
91 mmMP1_SMN_C2PMSG_90_BASE_IDX, mmMP1_SMN_C2PMSG_90); 91 mmMP1_SMN_C2PMSG_90_BASE_IDX, mmMP1_SMN_C2PMSG_90);
@@ -96,20 +96,19 @@ static uint32_t vega10_wait_for_response(struct pp_smumgr *smumgr)
96 return cgs_read_register(smumgr->device, reg); 96 return cgs_read_register(smumgr->device, reg);
97} 97}
98 98
99/** 99/*
100* Send a message to the SMC, and do not wait for its response. 100 * Send a message to the SMC, and do not wait for its response.
101* 101 * @param smumgr the address of the powerplay hardware manager.
102* @param smumgr the address of the powerplay hardware manager. 102 * @param msg the message to send.
103* @param msg the message to send. 103 * @return Always return 0.
104* @return Always return 0. 104 */
105*/
106int vega10_send_msg_to_smc_without_waiting(struct pp_smumgr *smumgr, 105int vega10_send_msg_to_smc_without_waiting(struct pp_smumgr *smumgr,
107 uint16_t msg) 106 uint16_t msg)
108{ 107{
109 uint32_t reg; 108 uint32_t reg;
110 109
111 if (!vega10_is_smc_ram_running(smumgr)) 110 if (!vega10_is_smc_ram_running(smumgr))
112 return -1; 111 return -EINVAL;
113 112
114 reg = soc15_get_register_offset(MP1_HWID, 0, 113 reg = soc15_get_register_offset(MP1_HWID, 0,
115 mmMP1_SMN_C2PMSG_66_BASE_IDX, mmMP1_SMN_C2PMSG_66); 114 mmMP1_SMN_C2PMSG_66_BASE_IDX, mmMP1_SMN_C2PMSG_66);
@@ -118,19 +117,18 @@ int vega10_send_msg_to_smc_without_waiting(struct pp_smumgr *smumgr,
118 return 0; 117 return 0;
119} 118}
120 119
121/** 120/*
122* Send a message to the SMC, and wait for its response. 121 * Send a message to the SMC, and wait for its response.
123* 122 * @param smumgr the address of the powerplay hardware manager.
124* @param smumgr the address of the powerplay hardware manager. 123 * @param msg the message to send.
125* @param msg the message to send. 124 * @return Always return 0.
126* @return The response that came from the SMC. 125 */
127*/
128int vega10_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg) 126int vega10_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
129{ 127{
130 uint32_t reg; 128 uint32_t reg;
131 129
132 if (!vega10_is_smc_ram_running(smumgr)) 130 if (!vega10_is_smc_ram_running(smumgr))
133 return -1; 131 return -EINVAL;
134 132
135 vega10_wait_for_response(smumgr); 133 vega10_wait_for_response(smumgr);
136 134
@@ -140,19 +138,18 @@ int vega10_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
140 138
141 vega10_send_msg_to_smc_without_waiting(smumgr, msg); 139 vega10_send_msg_to_smc_without_waiting(smumgr, msg);
142 140
143 PP_ASSERT_WITH_CODE(vega10_wait_for_response(smumgr) == 1, 141 if (vega10_wait_for_response(smumgr) != 1)
144 "Failed to send Message.", 142 pr_err("Failed to send message: 0x%x\n", msg);
145 return -1);
146 143
147 return 0; 144 return 0;
148} 145}
149 146
150/** 147/*
151 * Send a message to the SMC with parameter 148 * Send a message to the SMC with parameter
152 * @param smumgr: the address of the powerplay hardware manager. 149 * @param smumgr: the address of the powerplay hardware manager.
153 * @param msg: the message to send. 150 * @param msg: the message to send.
154 * @param parameter: the parameter to send 151 * @param parameter: the parameter to send
155 * @return The response that came from the SMC. 152 * @return Always return 0.
156 */ 153 */
157int vega10_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr, 154int vega10_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
158 uint16_t msg, uint32_t parameter) 155 uint16_t msg, uint32_t parameter)
@@ -160,7 +157,7 @@ int vega10_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
160 uint32_t reg; 157 uint32_t reg;
161 158
162 if (!vega10_is_smc_ram_running(smumgr)) 159 if (!vega10_is_smc_ram_running(smumgr))
163 return -1; 160 return -EINVAL;
164 161
165 vega10_wait_for_response(smumgr); 162 vega10_wait_for_response(smumgr);
166 163
@@ -174,22 +171,20 @@ int vega10_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
174 171
175 vega10_send_msg_to_smc_without_waiting(smumgr, msg); 172 vega10_send_msg_to_smc_without_waiting(smumgr, msg);
176 173
177 PP_ASSERT_WITH_CODE(vega10_wait_for_response(smumgr) == 1, 174 if (vega10_wait_for_response(smumgr) != 1)
178 "Failed to send Message.", 175 pr_err("Failed to send message: 0x%x\n", msg);
179 return -1);
180 176
181 return 0; 177 return 0;
182} 178}
183 179
184 180
185/** 181/*
186* Send a message to the SMC with parameter, do not wait for response 182 * Send a message to the SMC with parameter, do not wait for response
187* 183 * @param smumgr: the address of the powerplay hardware manager.
188* @param smumgr: the address of the powerplay hardware manager. 184 * @param msg: the message to send.
189* @param msg: the message to send. 185 * @param parameter: the parameter to send
190* @param parameter: the parameter to send 186 * @return The response that came from the SMC.
191* @return The response that came from the SMC. 187 */
192*/
193int vega10_send_msg_to_smc_with_parameter_without_waiting( 188int vega10_send_msg_to_smc_with_parameter_without_waiting(
194 struct pp_smumgr *smumgr, uint16_t msg, uint32_t parameter) 189 struct pp_smumgr *smumgr, uint16_t msg, uint32_t parameter)
195{ 190{
@@ -202,13 +197,12 @@ int vega10_send_msg_to_smc_with_parameter_without_waiting(
202 return vega10_send_msg_to_smc_without_waiting(smumgr, msg); 197 return vega10_send_msg_to_smc_without_waiting(smumgr, msg);
203} 198}
204 199
205/** 200/*
206* Retrieve an argument from SMC. 201 * Retrieve an argument from SMC.
207* 202 * @param smumgr the address of the powerplay hardware manager.
208* @param smumgr the address of the powerplay hardware manager. 203 * @param arg pointer to store the argument from SMC.
209* @param arg pointer to store the argument from SMC. 204 * @return Always return 0.
210* @return Always return 0. 205 */
211*/
212int vega10_read_arg_from_smc(struct pp_smumgr *smumgr, uint32_t *arg) 206int vega10_read_arg_from_smc(struct pp_smumgr *smumgr, uint32_t *arg)
213{ 207{
214 uint32_t reg; 208 uint32_t reg;
@@ -221,11 +215,11 @@ int vega10_read_arg_from_smc(struct pp_smumgr *smumgr, uint32_t *arg)
221 return 0; 215 return 0;
222} 216}
223 217
224/** 218/*
225* Copy table from SMC into driver FB 219 * Copy table from SMC into driver FB
226* @param smumgr the address of the SMC manager 220 * @param smumgr the address of the SMC manager
227* @param table_id the driver's table ID to copy from 221 * @param table_id the driver's table ID to copy from
228*/ 222 */
229int vega10_copy_table_from_smc(struct pp_smumgr *smumgr, 223int vega10_copy_table_from_smc(struct pp_smumgr *smumgr,
230 uint8_t *table, int16_t table_id) 224 uint8_t *table, int16_t table_id)
231{ 225{
@@ -233,25 +227,25 @@ int vega10_copy_table_from_smc(struct pp_smumgr *smumgr,
233 (struct vega10_smumgr *)(smumgr->backend); 227 (struct vega10_smumgr *)(smumgr->backend);
234 228
235 PP_ASSERT_WITH_CODE(table_id < MAX_SMU_TABLE, 229 PP_ASSERT_WITH_CODE(table_id < MAX_SMU_TABLE,
236 "Invalid SMU Table ID!", return -1;); 230 "Invalid SMU Table ID!", return -EINVAL);
237 PP_ASSERT_WITH_CODE(priv->smu_tables.entry[table_id].version != 0, 231 PP_ASSERT_WITH_CODE(priv->smu_tables.entry[table_id].version != 0,
238 "Invalid SMU Table version!", return -1;); 232 "Invalid SMU Table version!", return -EINVAL);
239 PP_ASSERT_WITH_CODE(priv->smu_tables.entry[table_id].size != 0, 233 PP_ASSERT_WITH_CODE(priv->smu_tables.entry[table_id].size != 0,
240 "Invalid SMU Table Length!", return -1;); 234 "Invalid SMU Table Length!", return -EINVAL);
241 PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr, 235 PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr,
242 PPSMC_MSG_SetDriverDramAddrHigh, 236 PPSMC_MSG_SetDriverDramAddrHigh,
243 priv->smu_tables.entry[table_id].table_addr_high) == 0, 237 priv->smu_tables.entry[table_id].table_addr_high) == 0,
244 "[CopyTableFromSMC] Attempt to Set Dram Addr High Failed!", return -1;); 238 "[CopyTableFromSMC] Attempt to Set Dram Addr High Failed!", return -EINVAL);
245 PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr, 239 PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr,
246 PPSMC_MSG_SetDriverDramAddrLow, 240 PPSMC_MSG_SetDriverDramAddrLow,
247 priv->smu_tables.entry[table_id].table_addr_low) == 0, 241 priv->smu_tables.entry[table_id].table_addr_low) == 0,
248 "[CopyTableFromSMC] Attempt to Set Dram Addr Low Failed!", 242 "[CopyTableFromSMC] Attempt to Set Dram Addr Low Failed!",
249 return -1;); 243 return -EINVAL);
250 PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr, 244 PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr,
251 PPSMC_MSG_TransferTableSmu2Dram, 245 PPSMC_MSG_TransferTableSmu2Dram,
252 priv->smu_tables.entry[table_id].table_id) == 0, 246 priv->smu_tables.entry[table_id].table_id) == 0,
253 "[CopyTableFromSMC] Attempt to Transfer Table From SMU Failed!", 247 "[CopyTableFromSMC] Attempt to Transfer Table From SMU Failed!",
254 return -1;); 248 return -EINVAL);
255 249
256 memcpy(table, priv->smu_tables.entry[table_id].table, 250 memcpy(table, priv->smu_tables.entry[table_id].table,
257 priv->smu_tables.entry[table_id].size); 251 priv->smu_tables.entry[table_id].size);
@@ -259,11 +253,11 @@ int vega10_copy_table_from_smc(struct pp_smumgr *smumgr,
259 return 0; 253 return 0;
260} 254}
261 255
262/** 256/*
263* Copy table from Driver FB into SMC 257 * Copy table from Driver FB into SMC
264* @param smumgr the address of the SMC manager 258 * @param smumgr the address of the SMC manager
265* @param table_id the table to copy from 259 * @param table_id the table to copy from
266*/ 260 */
267int vega10_copy_table_to_smc(struct pp_smumgr *smumgr, 261int vega10_copy_table_to_smc(struct pp_smumgr *smumgr,
268 uint8_t *table, int16_t table_id) 262 uint8_t *table, int16_t table_id)
269{ 263{
@@ -271,11 +265,11 @@ int vega10_copy_table_to_smc(struct pp_smumgr *smumgr,
271 (struct vega10_smumgr *)(smumgr->backend); 265 (struct vega10_smumgr *)(smumgr->backend);
272 266
273 PP_ASSERT_WITH_CODE(table_id < MAX_SMU_TABLE, 267 PP_ASSERT_WITH_CODE(table_id < MAX_SMU_TABLE,
274 "Invalid SMU Table ID!", return -1;); 268 "Invalid SMU Table ID!", return -EINVAL);
275 PP_ASSERT_WITH_CODE(priv->smu_tables.entry[table_id].version != 0, 269 PP_ASSERT_WITH_CODE(priv->smu_tables.entry[table_id].version != 0,
276 "Invalid SMU Table version!", return -1;); 270 "Invalid SMU Table version!", return -EINVAL);
277 PP_ASSERT_WITH_CODE(priv->smu_tables.entry[table_id].size != 0, 271 PP_ASSERT_WITH_CODE(priv->smu_tables.entry[table_id].size != 0,
278 "Invalid SMU Table Length!", return -1;); 272 "Invalid SMU Table Length!", return -EINVAL);
279 273
280 memcpy(priv->smu_tables.entry[table_id].table, table, 274 memcpy(priv->smu_tables.entry[table_id].table, table,
281 priv->smu_tables.entry[table_id].size); 275 priv->smu_tables.entry[table_id].size);
@@ -284,27 +278,18 @@ int vega10_copy_table_to_smc(struct pp_smumgr *smumgr,
284 PPSMC_MSG_SetDriverDramAddrHigh, 278 PPSMC_MSG_SetDriverDramAddrHigh,
285 priv->smu_tables.entry[table_id].table_addr_high) == 0, 279 priv->smu_tables.entry[table_id].table_addr_high) == 0,
286 "[CopyTableToSMC] Attempt to Set Dram Addr High Failed!", 280 "[CopyTableToSMC] Attempt to Set Dram Addr High Failed!",
287 return -1;); 281 return -EINVAL;);
288 PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr, 282 PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr,
289 PPSMC_MSG_SetDriverDramAddrLow, 283 PPSMC_MSG_SetDriverDramAddrLow,
290 priv->smu_tables.entry[table_id].table_addr_low) == 0, 284 priv->smu_tables.entry[table_id].table_addr_low) == 0,
291 "[CopyTableToSMC] Attempt to Set Dram Addr Low Failed!", 285 "[CopyTableToSMC] Attempt to Set Dram Addr Low Failed!",
292 return -1;); 286 return -EINVAL);
293 PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr, 287 PP_ASSERT_WITH_CODE(vega10_send_msg_to_smc_with_parameter(smumgr,
294 PPSMC_MSG_TransferTableDram2Smu, 288 PPSMC_MSG_TransferTableDram2Smu,
295 priv->smu_tables.entry[table_id].table_id) == 0, 289 priv->smu_tables.entry[table_id].table_id) == 0,
296 "[CopyTableToSMC] Attempt to Transfer Table To SMU Failed!", 290 "[CopyTableToSMC] Attempt to Transfer Table To SMU Failed!",
297 return -1;); 291 return -EINVAL);
298
299 return 0;
300}
301 292
302int vega10_perform_btc(struct pp_smumgr *smumgr)
303{
304 PP_ASSERT_WITH_CODE(!vega10_send_msg_to_smc_with_parameter(
305 smumgr, PPSMC_MSG_RunBtc, 0),
306 "Attempt to run DC BTC Failed!",
307 return -1);
308 return 0; 293 return 0;
309} 294}
310 295
@@ -312,7 +297,7 @@ int vega10_save_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table)
312{ 297{
313 PP_ASSERT_WITH_CODE(avfs_table, 298 PP_ASSERT_WITH_CODE(avfs_table,
314 "No access to SMC AVFS Table", 299 "No access to SMC AVFS Table",
315 return -1); 300 return -EINVAL);
316 301
317 return vega10_copy_table_from_smc(smumgr, avfs_table, AVFSTABLE); 302 return vega10_copy_table_from_smc(smumgr, avfs_table, AVFSTABLE);
318} 303}
@@ -321,7 +306,7 @@ int vega10_restore_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table)
321{ 306{
322 PP_ASSERT_WITH_CODE(avfs_table, 307 PP_ASSERT_WITH_CODE(avfs_table,
323 "No access to SMC AVFS Table", 308 "No access to SMC AVFS Table",
324 return -1); 309 return -EINVAL);
325 310
326 return vega10_copy_table_to_smc(smumgr, avfs_table, AVFSTABLE); 311 return vega10_copy_table_to_smc(smumgr, avfs_table, AVFSTABLE);
327} 312}
@@ -339,13 +324,16 @@ int vega10_enable_smc_features(struct pp_smumgr *smumgr,
339int vega10_get_smc_features(struct pp_smumgr *smumgr, 324int vega10_get_smc_features(struct pp_smumgr *smumgr,
340 uint32_t *features_enabled) 325 uint32_t *features_enabled)
341{ 326{
327 if (features_enabled == NULL)
328 return -EINVAL;
329
342 if (!vega10_send_msg_to_smc(smumgr, 330 if (!vega10_send_msg_to_smc(smumgr,
343 PPSMC_MSG_GetEnabledSmuFeatures)) { 331 PPSMC_MSG_GetEnabledSmuFeatures)) {
344 if (!vega10_read_arg_from_smc(smumgr, features_enabled)) 332 vega10_read_arg_from_smc(smumgr, features_enabled);
345 return 0; 333 return 0;
346 } 334 }
347 335
348 return -1; 336 return -EINVAL;
349} 337}
350 338
351int vega10_set_tools_address(struct pp_smumgr *smumgr) 339int vega10_set_tools_address(struct pp_smumgr *smumgr)
@@ -372,25 +360,20 @@ static int vega10_verify_smc_interface(struct pp_smumgr *smumgr)
372 PP_ASSERT_WITH_CODE(!vega10_send_msg_to_smc(smumgr, 360 PP_ASSERT_WITH_CODE(!vega10_send_msg_to_smc(smumgr,
373 PPSMC_MSG_GetDriverIfVersion), 361 PPSMC_MSG_GetDriverIfVersion),
374 "Attempt to get SMC IF Version Number Failed!", 362 "Attempt to get SMC IF Version Number Failed!",
375 return -1); 363 return -EINVAL);
376 PP_ASSERT_WITH_CODE(!vega10_read_arg_from_smc(smumgr, 364 vega10_read_arg_from_smc(smumgr, &smc_driver_if_version);
377 &smc_driver_if_version), 365
378 "Attempt to read SMC IF Version Number Failed!", 366 if (smc_driver_if_version != SMU9_DRIVER_IF_VERSION) {
379 return -1); 367 pr_err("Your firmware(0x%x) doesn't match \
380 368 SMU9_DRIVER_IF_VERSION(0x%x). \
381 if (smc_driver_if_version != SMU9_DRIVER_IF_VERSION) 369 Please update your firmware!\n",
382 return -1; 370 smc_driver_if_version, SMU9_DRIVER_IF_VERSION);
371 return -EINVAL;
372 }
383 373
384 return 0; 374 return 0;
385} 375}
386 376
387/**
388* Write a 32bit value to the SMC SRAM space.
389* ALL PARAMETERS ARE IN HOST BYTE ORDER.
390* @param smumgr the address of the powerplay hardware manager.
391* @param smc_addr the address in the SMC RAM to access.
392* @param value to write to the SMC SRAM.
393*/
394static int vega10_smu_init(struct pp_smumgr *smumgr) 377static int vega10_smu_init(struct pp_smumgr *smumgr)
395{ 378{
396 struct vega10_smumgr *priv; 379 struct vega10_smumgr *priv;
@@ -427,7 +410,7 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
427 kfree(smumgr->backend); 410 kfree(smumgr->backend);
428 cgs_free_gpu_mem(smumgr->device, 411 cgs_free_gpu_mem(smumgr->device,
429 (cgs_handle_t)handle); 412 (cgs_handle_t)handle);
430 return -1); 413 return -EINVAL);
431 414
432 priv->smu_tables.entry[PPTABLE].version = 0x01; 415 priv->smu_tables.entry[PPTABLE].version = 0x01;
433 priv->smu_tables.entry[PPTABLE].size = sizeof(PPTable_t); 416 priv->smu_tables.entry[PPTABLE].size = sizeof(PPTable_t);
@@ -455,7 +438,7 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
455 (cgs_handle_t)priv->smu_tables.entry[PPTABLE].handle); 438 (cgs_handle_t)priv->smu_tables.entry[PPTABLE].handle);
456 cgs_free_gpu_mem(smumgr->device, 439 cgs_free_gpu_mem(smumgr->device,
457 (cgs_handle_t)handle); 440 (cgs_handle_t)handle);
458 return -1); 441 return -EINVAL);
459 442
460 priv->smu_tables.entry[WMTABLE].version = 0x01; 443 priv->smu_tables.entry[WMTABLE].version = 0x01;
461 priv->smu_tables.entry[WMTABLE].size = sizeof(Watermarks_t); 444 priv->smu_tables.entry[WMTABLE].size = sizeof(Watermarks_t);
@@ -485,7 +468,7 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
485 (cgs_handle_t)priv->smu_tables.entry[WMTABLE].handle); 468 (cgs_handle_t)priv->smu_tables.entry[WMTABLE].handle);
486 cgs_free_gpu_mem(smumgr->device, 469 cgs_free_gpu_mem(smumgr->device,
487 (cgs_handle_t)handle); 470 (cgs_handle_t)handle);
488 return -1); 471 return -EINVAL);
489 472
490 priv->smu_tables.entry[AVFSTABLE].version = 0x01; 473 priv->smu_tables.entry[AVFSTABLE].version = 0x01;
491 priv->smu_tables.entry[AVFSTABLE].size = sizeof(AvfsTable_t); 474 priv->smu_tables.entry[AVFSTABLE].size = sizeof(AvfsTable_t);
@@ -497,7 +480,7 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
497 priv->smu_tables.entry[AVFSTABLE].table = kaddr; 480 priv->smu_tables.entry[AVFSTABLE].table = kaddr;
498 priv->smu_tables.entry[AVFSTABLE].handle = handle; 481 priv->smu_tables.entry[AVFSTABLE].handle = handle;
499 482
500 tools_size = 0; 483 tools_size = 0x19000;
501 if (tools_size) { 484 if (tools_size) {
502 smu_allocate_memory(smumgr->device, 485 smu_allocate_memory(smumgr->device,
503 tools_size, 486 tools_size,
@@ -517,9 +500,44 @@ static int vega10_smu_init(struct pp_smumgr *smumgr)
517 smu_lower_32_bits(mc_addr); 500 smu_lower_32_bits(mc_addr);
518 priv->smu_tables.entry[TOOLSTABLE].table = kaddr; 501 priv->smu_tables.entry[TOOLSTABLE].table = kaddr;
519 priv->smu_tables.entry[TOOLSTABLE].handle = handle; 502 priv->smu_tables.entry[TOOLSTABLE].handle = handle;
503 vega10_set_tools_address(smumgr);
520 } 504 }
521 } 505 }
522 506
507 /* allocate space for AVFS Fuse table */
508 smu_allocate_memory(smumgr->device,
509 sizeof(AvfsFuseOverride_t),
510 CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
511 PAGE_SIZE,
512 &mc_addr,
513 &kaddr,
514 &handle);
515
516 PP_ASSERT_WITH_CODE(kaddr,
517 "[vega10_smu_init] Out of memory for avfs fuse table.",
518 kfree(smumgr->backend);
519 cgs_free_gpu_mem(smumgr->device,
520 (cgs_handle_t)priv->smu_tables.entry[PPTABLE].handle);
521 cgs_free_gpu_mem(smumgr->device,
522 (cgs_handle_t)priv->smu_tables.entry[WMTABLE].handle);
523 cgs_free_gpu_mem(smumgr->device,
524 (cgs_handle_t)priv->smu_tables.entry[AVFSTABLE].handle);
525 cgs_free_gpu_mem(smumgr->device,
526 (cgs_handle_t)priv->smu_tables.entry[TOOLSTABLE].handle);
527 cgs_free_gpu_mem(smumgr->device,
528 (cgs_handle_t)handle);
529 return -EINVAL);
530
531 priv->smu_tables.entry[AVFSFUSETABLE].version = 0x01;
532 priv->smu_tables.entry[AVFSFUSETABLE].size = sizeof(AvfsFuseOverride_t);
533 priv->smu_tables.entry[AVFSFUSETABLE].table_id = TABLE_AVFS_FUSE_OVERRIDE;
534 priv->smu_tables.entry[AVFSFUSETABLE].table_addr_high =
535 smu_upper_32_bits(mc_addr);
536 priv->smu_tables.entry[AVFSFUSETABLE].table_addr_low =
537 smu_lower_32_bits(mc_addr);
538 priv->smu_tables.entry[AVFSFUSETABLE].table = kaddr;
539 priv->smu_tables.entry[AVFSFUSETABLE].handle = handle;
540
523 return 0; 541 return 0;
524} 542}
525 543
@@ -538,6 +556,8 @@ static int vega10_smu_fini(struct pp_smumgr *smumgr)
538 if (priv->smu_tables.entry[TOOLSTABLE].table) 556 if (priv->smu_tables.entry[TOOLSTABLE].table)
539 cgs_free_gpu_mem(smumgr->device, 557 cgs_free_gpu_mem(smumgr->device,
540 (cgs_handle_t)priv->smu_tables.entry[TOOLSTABLE].handle); 558 (cgs_handle_t)priv->smu_tables.entry[TOOLSTABLE].handle);
559 cgs_free_gpu_mem(smumgr->device,
560 (cgs_handle_t)priv->smu_tables.entry[AVFSFUSETABLE].handle);
541 kfree(smumgr->backend); 561 kfree(smumgr->backend);
542 smumgr->backend = NULL; 562 smumgr->backend = NULL;
543 } 563 }
@@ -548,7 +568,7 @@ static int vega10_start_smu(struct pp_smumgr *smumgr)
548{ 568{
549 PP_ASSERT_WITH_CODE(!vega10_verify_smc_interface(smumgr), 569 PP_ASSERT_WITH_CODE(!vega10_verify_smc_interface(smumgr),
550 "Failed to verify SMC interface!", 570 "Failed to verify SMC interface!",
551 return -1); 571 return -EINVAL);
552 return 0; 572 return 0;
553} 573}
554 574
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.h b/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.h
index ad050212426d..821425c1e4e0 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.h
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.h
@@ -30,6 +30,7 @@ enum smu_table_id {
30 WMTABLE, 30 WMTABLE,
31 AVFSTABLE, 31 AVFSTABLE,
32 TOOLSTABLE, 32 TOOLSTABLE,
33 AVFSFUSETABLE,
33 MAX_SMU_TABLE, 34 MAX_SMU_TABLE,
34}; 35};
35 36
@@ -62,7 +63,6 @@ int vega10_get_smc_features(struct pp_smumgr *smumgr,
62 uint32_t *features_enabled); 63 uint32_t *features_enabled);
63int vega10_save_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table); 64int vega10_save_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table);
64int vega10_restore_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table); 65int vega10_restore_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table);
65int vega10_perform_btc(struct pp_smumgr *smumgr);
66 66
67int vega10_set_tools_address(struct pp_smumgr *smumgr); 67int vega10_set_tools_address(struct pp_smumgr *smumgr);
68 68
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
index acd882a188bc..fea96a765cf1 100644
--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
@@ -236,6 +236,23 @@ static void amd_sched_entity_clear_dep(struct dma_fence *f, struct dma_fence_cb
236 dma_fence_put(f); 236 dma_fence_put(f);
237} 237}
238 238
239bool amd_sched_dependency_optimized(struct dma_fence* fence,
240 struct amd_sched_entity *entity)
241{
242 struct amd_gpu_scheduler *sched = entity->sched;
243 struct amd_sched_fence *s_fence;
244
245 if (!fence || dma_fence_is_signaled(fence))
246 return false;
247 if (fence->context == entity->fence_context)
248 return true;
249 s_fence = to_amd_sched_fence(fence);
250 if (s_fence && s_fence->sched == sched)
251 return true;
252
253 return false;
254}
255
239static bool amd_sched_entity_add_dependency_cb(struct amd_sched_entity *entity) 256static bool amd_sched_entity_add_dependency_cb(struct amd_sched_entity *entity)
240{ 257{
241 struct amd_gpu_scheduler *sched = entity->sched; 258 struct amd_gpu_scheduler *sched = entity->sched;
@@ -387,7 +404,9 @@ void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched)
387 404
388 spin_lock(&sched->job_list_lock); 405 spin_lock(&sched->job_list_lock);
389 list_for_each_entry_reverse(s_job, &sched->ring_mirror_list, node) { 406 list_for_each_entry_reverse(s_job, &sched->ring_mirror_list, node) {
390 if (dma_fence_remove_callback(s_job->s_fence->parent, &s_job->s_fence->cb)) { 407 if (s_job->s_fence->parent &&
408 dma_fence_remove_callback(s_job->s_fence->parent,
409 &s_job->s_fence->cb)) {
391 dma_fence_put(s_job->s_fence->parent); 410 dma_fence_put(s_job->s_fence->parent);
392 s_job->s_fence->parent = NULL; 411 s_job->s_fence->parent = NULL;
393 } 412 }
@@ -460,9 +479,9 @@ int amd_sched_job_init(struct amd_sched_job *job,
460 job->sched = sched; 479 job->sched = sched;
461 job->s_entity = entity; 480 job->s_entity = entity;
462 job->s_fence = amd_sched_fence_create(entity, owner); 481 job->s_fence = amd_sched_fence_create(entity, owner);
463 job->id = atomic64_inc_return(&sched->job_id_count);
464 if (!job->s_fence) 482 if (!job->s_fence)
465 return -ENOMEM; 483 return -ENOMEM;
484 job->id = atomic64_inc_return(&sched->job_id_count);
466 485
467 INIT_WORK(&job->finish_work, amd_sched_job_finish); 486 INIT_WORK(&job->finish_work, amd_sched_job_finish);
468 INIT_LIST_HEAD(&job->node); 487 INIT_LIST_HEAD(&job->node);
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
index 0255c7f8a6d8..924d4a5899e1 100644
--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
@@ -158,4 +158,6 @@ int amd_sched_job_init(struct amd_sched_job *job,
158 void *owner); 158 void *owner);
159void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched); 159void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched);
160void amd_sched_job_recovery(struct amd_gpu_scheduler *sched); 160void amd_sched_job_recovery(struct amd_gpu_scheduler *sched);
161bool amd_sched_dependency_optimized(struct dma_fence* fence,
162 struct amd_sched_entity *entity);
161#endif 163#endif
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index fad3d44e4642..2e55599816aa 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -80,6 +80,8 @@
80#define EDID_QUIRK_FORCE_12BPC (1 << 9) 80#define EDID_QUIRK_FORCE_12BPC (1 << 9)
81/* Force 6bpc */ 81/* Force 6bpc */
82#define EDID_QUIRK_FORCE_6BPC (1 << 10) 82#define EDID_QUIRK_FORCE_6BPC (1 << 10)
83/* Force 10bpc */
84#define EDID_QUIRK_FORCE_10BPC (1 << 11)
83 85
84struct detailed_mode_closure { 86struct detailed_mode_closure {
85 struct drm_connector *connector; 87 struct drm_connector *connector;
@@ -122,6 +124,9 @@ static const struct edid_quirk {
122 { "FCM", 13600, EDID_QUIRK_PREFER_LARGE_75 | 124 { "FCM", 13600, EDID_QUIRK_PREFER_LARGE_75 |
123 EDID_QUIRK_DETAILED_IN_CM }, 125 EDID_QUIRK_DETAILED_IN_CM },
124 126
127 /* LGD panel of HP zBook 17 G2, eDP 10 bpc, but reports unknown bpc */
128 { "LGD", 764, EDID_QUIRK_FORCE_10BPC },
129
125 /* LG Philips LCD LP154W01-A5 */ 130 /* LG Philips LCD LP154W01-A5 */
126 { "LPL", 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE }, 131 { "LPL", 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE },
127 { "LPL", 0x2a00, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE }, 132 { "LPL", 0x2a00, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE },
@@ -4244,6 +4249,9 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
4244 if (quirks & EDID_QUIRK_FORCE_8BPC) 4249 if (quirks & EDID_QUIRK_FORCE_8BPC)
4245 connector->display_info.bpc = 8; 4250 connector->display_info.bpc = 8;
4246 4251
4252 if (quirks & EDID_QUIRK_FORCE_10BPC)
4253 connector->display_info.bpc = 10;
4254
4247 if (quirks & EDID_QUIRK_FORCE_12BPC) 4255 if (quirks & EDID_QUIRK_FORCE_12BPC)
4248 connector->display_info.bpc = 12; 4256 connector->display_info.bpc = 12;
4249 4257
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index a0ea3241c651..1f178b878e42 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -2446,7 +2446,7 @@ EXPORT_SYMBOL(drm_fb_helper_hotplug_event);
2446int __init drm_fb_helper_modinit(void) 2446int __init drm_fb_helper_modinit(void)
2447{ 2447{
2448#if defined(CONFIG_FRAMEBUFFER_CONSOLE_MODULE) && !defined(CONFIG_EXPERT) 2448#if defined(CONFIG_FRAMEBUFFER_CONSOLE_MODULE) && !defined(CONFIG_EXPERT)
2449 const char *name = "fbcon"; 2449 const char name[] = "fbcon";
2450 struct module *fbcon; 2450 struct module *fbcon;
2451 2451
2452 mutex_lock(&module_mutex); 2452 mutex_lock(&module_mutex);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_dump.c b/drivers/gpu/drm/etnaviv/etnaviv_dump.c
index d019b5e311cc..2d955d7d7b6d 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_dump.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_dump.c
@@ -161,8 +161,8 @@ void etnaviv_core_dump(struct etnaviv_gpu *gpu)
161 file_size += sizeof(*iter.hdr) * n_obj; 161 file_size += sizeof(*iter.hdr) * n_obj;
162 162
163 /* Allocate the file in vmalloc memory, it's likely to be big */ 163 /* Allocate the file in vmalloc memory, it's likely to be big */
164 iter.start = __vmalloc(file_size, GFP_KERNEL | __GFP_HIGHMEM | 164 iter.start = __vmalloc(file_size, GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY,
165 __GFP_NOWARN | __GFP_NORETRY, PAGE_KERNEL); 165 PAGE_KERNEL);
166 if (!iter.start) { 166 if (!iter.start) {
167 dev_warn(gpu->dev, "failed to allocate devcoredump file\n"); 167 dev_warn(gpu->dev, "failed to allocate devcoredump file\n");
168 return; 168 return;
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index 52438404c8c9..1ff6ab6371e8 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -43,6 +43,8 @@
43 43
44#include <drm/exynos_drm.h> 44#include <drm/exynos_drm.h>
45 45
46#include <media/cec-notifier.h>
47
46#include "exynos_drm_crtc.h" 48#include "exynos_drm_crtc.h"
47 49
48#define HOTPLUG_DEBOUNCE_MS 1100 50#define HOTPLUG_DEBOUNCE_MS 1100
@@ -118,6 +120,7 @@ struct hdmi_context {
118 bool dvi_mode; 120 bool dvi_mode;
119 struct delayed_work hotplug_work; 121 struct delayed_work hotplug_work;
120 struct drm_display_mode current_mode; 122 struct drm_display_mode current_mode;
123 struct cec_notifier *notifier;
121 const struct hdmi_driver_data *drv_data; 124 const struct hdmi_driver_data *drv_data;
122 125
123 void __iomem *regs; 126 void __iomem *regs;
@@ -821,6 +824,7 @@ static enum drm_connector_status hdmi_detect(struct drm_connector *connector,
821 if (gpiod_get_value(hdata->hpd_gpio)) 824 if (gpiod_get_value(hdata->hpd_gpio))
822 return connector_status_connected; 825 return connector_status_connected;
823 826
827 cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID);
824 return connector_status_disconnected; 828 return connector_status_disconnected;
825} 829}
826 830
@@ -859,6 +863,7 @@ static int hdmi_get_modes(struct drm_connector *connector)
859 edid->width_cm, edid->height_cm); 863 edid->width_cm, edid->height_cm);
860 864
861 drm_mode_connector_update_edid_property(connector, edid); 865 drm_mode_connector_update_edid_property(connector, edid);
866 cec_notifier_set_phys_addr_from_edid(hdata->notifier, edid);
862 867
863 ret = drm_add_edid_modes(connector, edid); 868 ret = drm_add_edid_modes(connector, edid);
864 869
@@ -1501,6 +1506,7 @@ static void hdmi_disable(struct drm_encoder *encoder)
1501 if (funcs && funcs->disable) 1506 if (funcs && funcs->disable)
1502 (*funcs->disable)(crtc); 1507 (*funcs->disable)(crtc);
1503 1508
1509 cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID);
1504 cancel_delayed_work(&hdata->hotplug_work); 1510 cancel_delayed_work(&hdata->hotplug_work);
1505 1511
1506 hdmiphy_disable(hdata); 1512 hdmiphy_disable(hdata);
@@ -1880,15 +1886,22 @@ static int hdmi_probe(struct platform_device *pdev)
1880 } 1886 }
1881 } 1887 }
1882 1888
1889 hdata->notifier = cec_notifier_get(&pdev->dev);
1890 if (hdata->notifier == NULL) {
1891 ret = -ENOMEM;
1892 goto err_hdmiphy;
1893 }
1894
1883 pm_runtime_enable(dev); 1895 pm_runtime_enable(dev);
1884 1896
1885 ret = component_add(&pdev->dev, &hdmi_component_ops); 1897 ret = component_add(&pdev->dev, &hdmi_component_ops);
1886 if (ret) 1898 if (ret)
1887 goto err_disable_pm_runtime; 1899 goto err_notifier_put;
1888 1900
1889 return ret; 1901 return ret;
1890 1902
1891err_disable_pm_runtime: 1903err_notifier_put:
1904 cec_notifier_put(hdata->notifier);
1892 pm_runtime_disable(dev); 1905 pm_runtime_disable(dev);
1893 1906
1894err_hdmiphy: 1907err_hdmiphy:
@@ -1907,9 +1920,11 @@ static int hdmi_remove(struct platform_device *pdev)
1907 struct hdmi_context *hdata = platform_get_drvdata(pdev); 1920 struct hdmi_context *hdata = platform_get_drvdata(pdev);
1908 1921
1909 cancel_delayed_work_sync(&hdata->hotplug_work); 1922 cancel_delayed_work_sync(&hdata->hotplug_work);
1923 cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID);
1910 1924
1911 component_del(&pdev->dev, &hdmi_component_ops); 1925 component_del(&pdev->dev, &hdmi_component_ops);
1912 1926
1927 cec_notifier_put(hdata->notifier);
1913 pm_runtime_disable(&pdev->dev); 1928 pm_runtime_disable(&pdev->dev);
1914 1929
1915 if (!IS_ERR(hdata->reg_hdmi_en)) 1930 if (!IS_ERR(hdata->reg_hdmi_en))
diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c
index 3f4f424196b2..3949b0990916 100644
--- a/drivers/gpu/drm/gma500/gtt.c
+++ b/drivers/gpu/drm/gma500/gtt.c
@@ -21,6 +21,7 @@
21 21
22#include <drm/drmP.h> 22#include <drm/drmP.h>
23#include <linux/shmem_fs.h> 23#include <linux/shmem_fs.h>
24#include <asm/set_memory.h>
24#include "psb_drv.h" 25#include "psb_drv.h"
25#include "blitter.h" 26#include "blitter.h"
26 27
diff --git a/drivers/gpu/drm/gma500/psb_drv.c b/drivers/gpu/drm/gma500/psb_drv.c
index 5ee93ff55608..1f9b35afefee 100644
--- a/drivers/gpu/drm/gma500/psb_drv.c
+++ b/drivers/gpu/drm/gma500/psb_drv.c
@@ -35,6 +35,7 @@
35#include <linux/pm_runtime.h> 35#include <linux/pm_runtime.h>
36#include <acpi/video.h> 36#include <acpi/video.h>
37#include <linux/module.h> 37#include <linux/module.h>
38#include <asm/set_memory.h>
38 39
39static struct drm_driver driver; 40static struct drm_driver driver;
40static int psb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent); 41static int psb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
diff --git a/drivers/gpu/drm/i915/Kconfig.debug b/drivers/gpu/drm/i915/Kconfig.debug
index e091809a9a9e..b00edd3b8800 100644
--- a/drivers/gpu/drm/i915/Kconfig.debug
+++ b/drivers/gpu/drm/i915/Kconfig.debug
@@ -87,3 +87,16 @@ config DRM_I915_LOW_LEVEL_TRACEPOINTS
87 and also analyze the request dependency resolving timeline. 87 and also analyze the request dependency resolving timeline.
88 88
89 If in doubt, say "N". 89 If in doubt, say "N".
90
91config DRM_I915_DEBUG_VBLANK_EVADE
92 bool "Enable extra debug warnings for vblank evasion"
93 depends on DRM_I915
94 default n
95 help
96 Choose this option to turn on extra debug warnings for the
97 vblank evade mechanism. This gives a warning every time the
98 the deadline allotted for the vblank evade critical section
99 is exceeded, even if there isn't an actual risk of missing
100 the vblank.
101
102 If in doubt, say "N".
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 532a577ff7a1..b6ac3df18b58 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4789,7 +4789,7 @@ i915_gem_load_init(struct drm_i915_private *dev_priv)
4789 dev_priv->requests = KMEM_CACHE(drm_i915_gem_request, 4789 dev_priv->requests = KMEM_CACHE(drm_i915_gem_request,
4790 SLAB_HWCACHE_ALIGN | 4790 SLAB_HWCACHE_ALIGN |
4791 SLAB_RECLAIM_ACCOUNT | 4791 SLAB_RECLAIM_ACCOUNT |
4792 SLAB_DESTROY_BY_RCU); 4792 SLAB_TYPESAFE_BY_RCU);
4793 if (!dev_priv->requests) 4793 if (!dev_priv->requests)
4794 goto err_vmas; 4794 goto err_vmas;
4795 4795
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 8bab4aea63e6..2aa6b97fd22f 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -31,6 +31,8 @@
31#include <linux/seq_file.h> 31#include <linux/seq_file.h>
32#include <linux/stop_machine.h> 32#include <linux/stop_machine.h>
33 33
34#include <asm/set_memory.h>
35
34#include <drm/drmP.h> 36#include <drm/drmP.h>
35#include <drm/i915_drm.h> 37#include <drm/i915_drm.h>
36 38
diff --git a/drivers/gpu/drm/i915/i915_gem_request.h b/drivers/gpu/drm/i915/i915_gem_request.h
index a211c53c813f..129c58bb4805 100644
--- a/drivers/gpu/drm/i915/i915_gem_request.h
+++ b/drivers/gpu/drm/i915/i915_gem_request.h
@@ -521,7 +521,7 @@ static inline struct drm_i915_gem_request *
521__i915_gem_active_get_rcu(const struct i915_gem_active *active) 521__i915_gem_active_get_rcu(const struct i915_gem_active *active)
522{ 522{
523 /* Performing a lockless retrieval of the active request is super 523 /* Performing a lockless retrieval of the active request is super
524 * tricky. SLAB_DESTROY_BY_RCU merely guarantees that the backing 524 * tricky. SLAB_TYPESAFE_BY_RCU merely guarantees that the backing
525 * slab of request objects will not be freed whilst we hold the 525 * slab of request objects will not be freed whilst we hold the
526 * RCU read lock. It does not guarantee that the request itself 526 * RCU read lock. It does not guarantee that the request itself
527 * will not be freed and then *reused*. Viz, 527 * will not be freed and then *reused*. Viz,
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
index f7d431427115..8c87c717c7cd 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -198,12 +198,15 @@ void intel_pipe_update_end(struct intel_crtc *crtc, struct intel_flip_work *work
198 ktime_us_delta(end_vbl_time, crtc->debug.start_vbl_time), 198 ktime_us_delta(end_vbl_time, crtc->debug.start_vbl_time),
199 crtc->debug.min_vbl, crtc->debug.max_vbl, 199 crtc->debug.min_vbl, crtc->debug.max_vbl,
200 crtc->debug.scanline_start, scanline_end); 200 crtc->debug.scanline_start, scanline_end);
201 } else if (ktime_us_delta(end_vbl_time, crtc->debug.start_vbl_time) > 201 }
202 VBLANK_EVASION_TIME_US) 202#ifdef CONFIG_DRM_I915_DEBUG_VBLANK_EVADE
203 else if (ktime_us_delta(end_vbl_time, crtc->debug.start_vbl_time) >
204 VBLANK_EVASION_TIME_US)
203 DRM_WARN("Atomic update on pipe (%c) took %lld us, max time under evasion is %u us\n", 205 DRM_WARN("Atomic update on pipe (%c) took %lld us, max time under evasion is %u us\n",
204 pipe_name(pipe), 206 pipe_name(pipe),
205 ktime_us_delta(end_vbl_time, crtc->debug.start_vbl_time), 207 ktime_us_delta(end_vbl_time, crtc->debug.start_vbl_time),
206 VBLANK_EVASION_TIME_US); 208 VBLANK_EVASION_TIME_US);
209#endif
207} 210}
208 211
209static void 212static void
diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
index 6a8258eacdcb..9f24c5da3f8d 100644
--- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c
+++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
@@ -174,7 +174,7 @@ struct drm_i915_private *mock_gem_device(void)
174 i915->requests = KMEM_CACHE(mock_request, 174 i915->requests = KMEM_CACHE(mock_request,
175 SLAB_HWCACHE_ALIGN | 175 SLAB_HWCACHE_ALIGN |
176 SLAB_RECLAIM_ACCOUNT | 176 SLAB_RECLAIM_ACCOUNT |
177 SLAB_DESTROY_BY_RCU); 177 SLAB_TYPESAFE_BY_RCU);
178 if (!i915->requests) 178 if (!i915->requests)
179 goto err_vmas; 179 goto err_vmas;
180 180
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index ca5397beb357..2170534101ca 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -568,9 +568,7 @@ u_memcpya(uint64_t user, unsigned nmemb, unsigned size)
568 568
569 size *= nmemb; 569 size *= nmemb;
570 570
571 mem = kmalloc(size, GFP_KERNEL | __GFP_NOWARN); 571 mem = kvmalloc(size, GFP_KERNEL);
572 if (!mem)
573 mem = vmalloc(size);
574 if (!mem) 572 if (!mem)
575 return ERR_PTR(-ENOMEM); 573 return ERR_PTR(-ENOMEM);
576 574
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c
index 0e58537352fe..a7663249b3ba 100644
--- a/drivers/gpu/drm/nouveau/nv50_display.c
+++ b/drivers/gpu/drm/nouveau/nv50_display.c
@@ -831,8 +831,7 @@ nv50_wndw_atomic_check_release(struct nv50_wndw *wndw,
831static int 831static int
832nv50_wndw_atomic_check_acquire(struct nv50_wndw *wndw, 832nv50_wndw_atomic_check_acquire(struct nv50_wndw *wndw,
833 struct nv50_wndw_atom *asyw, 833 struct nv50_wndw_atom *asyw,
834 struct nv50_head_atom *asyh, 834 struct nv50_head_atom *asyh)
835 u32 pflip_flags)
836{ 835{
837 struct nouveau_framebuffer *fb = nouveau_framebuffer(asyw->state.fb); 836 struct nouveau_framebuffer *fb = nouveau_framebuffer(asyw->state.fb);
838 struct nouveau_drm *drm = nouveau_drm(wndw->plane.dev); 837 struct nouveau_drm *drm = nouveau_drm(wndw->plane.dev);
@@ -848,7 +847,10 @@ nv50_wndw_atomic_check_acquire(struct nv50_wndw *wndw,
848 asyw->image.h = fb->base.height; 847 asyw->image.h = fb->base.height;
849 asyw->image.kind = (fb->nvbo->tile_flags & 0x0000ff00) >> 8; 848 asyw->image.kind = (fb->nvbo->tile_flags & 0x0000ff00) >> 8;
850 849
851 asyw->interval = pflip_flags & DRM_MODE_PAGE_FLIP_ASYNC ? 0 : 1; 850 if (asyh->state.pageflip_flags & DRM_MODE_PAGE_FLIP_ASYNC)
851 asyw->interval = 0;
852 else
853 asyw->interval = 1;
852 854
853 if (asyw->image.kind) { 855 if (asyw->image.kind) {
854 asyw->image.layout = 0; 856 asyw->image.layout = 0;
@@ -887,7 +889,6 @@ nv50_wndw_atomic_check(struct drm_plane *plane, struct drm_plane_state *state)
887 struct nv50_head_atom *harm = NULL, *asyh = NULL; 889 struct nv50_head_atom *harm = NULL, *asyh = NULL;
888 bool varm = false, asyv = false, asym = false; 890 bool varm = false, asyv = false, asym = false;
889 int ret; 891 int ret;
890 u32 pflip_flags = 0;
891 892
892 NV_ATOMIC(drm, "%s atomic_check\n", plane->name); 893 NV_ATOMIC(drm, "%s atomic_check\n", plane->name);
893 if (asyw->state.crtc) { 894 if (asyw->state.crtc) {
@@ -896,7 +897,6 @@ nv50_wndw_atomic_check(struct drm_plane *plane, struct drm_plane_state *state)
896 return PTR_ERR(asyh); 897 return PTR_ERR(asyh);
897 asym = drm_atomic_crtc_needs_modeset(&asyh->state); 898 asym = drm_atomic_crtc_needs_modeset(&asyh->state);
898 asyv = asyh->state.active; 899 asyv = asyh->state.active;
899 pflip_flags = asyh->state.pageflip_flags;
900 } 900 }
901 901
902 if (armw->state.crtc) { 902 if (armw->state.crtc) {
@@ -912,12 +912,9 @@ nv50_wndw_atomic_check(struct drm_plane *plane, struct drm_plane_state *state)
912 if (memcmp(&armw->point, &asyw->point, sizeof(asyw->point))) 912 if (memcmp(&armw->point, &asyw->point, sizeof(asyw->point)))
913 asyw->set.point = true; 913 asyw->set.point = true;
914 914
915 if (!varm || asym || armw->state.fb != asyw->state.fb) { 915 ret = nv50_wndw_atomic_check_acquire(wndw, asyw, asyh);
916 ret = nv50_wndw_atomic_check_acquire( 916 if (ret)
917 wndw, asyw, asyh, pflip_flags); 917 return ret;
918 if (ret)
919 return ret;
920 }
921 } else 918 } else
922 if (varm) { 919 if (varm) {
923 nv50_wndw_atomic_check_release(wndw, asyw, harm); 920 nv50_wndw_atomic_check_release(wndw, asyw, harm);
@@ -1122,9 +1119,13 @@ static void
1122nv50_curs_prepare(struct nv50_wndw *wndw, struct nv50_head_atom *asyh, 1119nv50_curs_prepare(struct nv50_wndw *wndw, struct nv50_head_atom *asyh,
1123 struct nv50_wndw_atom *asyw) 1120 struct nv50_wndw_atom *asyw)
1124{ 1121{
1125 asyh->curs.handle = nv50_disp(wndw->plane.dev)->mast.base.vram.handle; 1122 u32 handle = nv50_disp(wndw->plane.dev)->mast.base.vram.handle;
1126 asyh->curs.offset = asyw->image.offset; 1123 u32 offset = asyw->image.offset;
1127 asyh->set.curs = asyh->curs.visible; 1124 if (asyh->curs.handle != handle || asyh->curs.offset != offset) {
1125 asyh->curs.handle = handle;
1126 asyh->curs.offset = offset;
1127 asyh->set.curs = asyh->curs.visible;
1128 }
1128} 1129}
1129 1130
1130static void 1131static void
diff --git a/drivers/gpu/drm/nouveau/nvkm/core/object.c b/drivers/gpu/drm/nouveau/nvkm/core/object.c
index 89d2e9da11c7..acd76fd4f6d8 100644
--- a/drivers/gpu/drm/nouveau/nvkm/core/object.c
+++ b/drivers/gpu/drm/nouveau/nvkm/core/object.c
@@ -295,7 +295,7 @@ nvkm_object_ctor(const struct nvkm_object_func *func,
295 INIT_LIST_HEAD(&object->head); 295 INIT_LIST_HEAD(&object->head);
296 INIT_LIST_HEAD(&object->tree); 296 INIT_LIST_HEAD(&object->tree);
297 RB_CLEAR_NODE(&object->node); 297 RB_CLEAR_NODE(&object->node);
298 WARN_ON(oclass->engine && !object->engine); 298 WARN_ON(IS_ERR(object->engine));
299} 299}
300 300
301int 301int
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
index c63975907c90..4a9bd4f1cb93 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
@@ -638,7 +638,6 @@ gf100_ram_ctor(const struct nvkm_ram_func *func, struct nvkm_fb *fb,
638 return ret; 638 return ret;
639 } 639 }
640 640
641 ram->ranks = (nvkm_rd32(device, 0x10f200) & 0x00000004) ? 2 : 1;
642 return 0; 641 return 0;
643} 642}
644 643
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c
index df949fa7d05d..be691a7b972f 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c
@@ -146,7 +146,7 @@ nvkm_therm_update(struct nvkm_therm *therm, int mode)
146 poll = false; 146 poll = false;
147 } 147 }
148 148
149 if (list_empty(&therm->alarm.head) && poll) 149 if (poll)
150 nvkm_timer_alarm(tmr, 1000000000ULL, &therm->alarm); 150 nvkm_timer_alarm(tmr, 1000000000ULL, &therm->alarm);
151 spin_unlock_irqrestore(&therm->lock, flags); 151 spin_unlock_irqrestore(&therm->lock, flags);
152 152
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/fan.c b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/fan.c
index 91198d79393a..e2feccec25f5 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/fan.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/fan.c
@@ -83,7 +83,7 @@ nvkm_fan_update(struct nvkm_fan *fan, bool immediate, int target)
83 spin_unlock_irqrestore(&fan->lock, flags); 83 spin_unlock_irqrestore(&fan->lock, flags);
84 84
85 /* schedule next fan update, if not at target speed already */ 85 /* schedule next fan update, if not at target speed already */
86 if (list_empty(&fan->alarm.head) && target != duty) { 86 if (target != duty) {
87 u16 bump_period = fan->bios.bump_period; 87 u16 bump_period = fan->bios.bump_period;
88 u16 slow_down_period = fan->bios.slow_down_period; 88 u16 slow_down_period = fan->bios.slow_down_period;
89 u64 delay; 89 u64 delay;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/fantog.c b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/fantog.c
index 59701b7a6597..ff9fbe7950e5 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/fantog.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/fantog.c
@@ -53,7 +53,7 @@ nvkm_fantog_update(struct nvkm_fantog *fan, int percent)
53 duty = !nvkm_gpio_get(gpio, 0, DCB_GPIO_FAN, 0xff); 53 duty = !nvkm_gpio_get(gpio, 0, DCB_GPIO_FAN, 0xff);
54 nvkm_gpio_set(gpio, 0, DCB_GPIO_FAN, 0xff, duty); 54 nvkm_gpio_set(gpio, 0, DCB_GPIO_FAN, 0xff, duty);
55 55
56 if (list_empty(&fan->alarm.head) && percent != (duty * 100)) { 56 if (percent != (duty * 100)) {
57 u64 next_change = (percent * fan->period_us) / 100; 57 u64 next_change = (percent * fan->period_us) / 100;
58 if (!duty) 58 if (!duty)
59 next_change = fan->period_us - next_change; 59 next_change = fan->period_us - next_change;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/temp.c b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/temp.c
index b9703c02d8ca..9a79e91fdfdc 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/temp.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/temp.c
@@ -185,7 +185,7 @@ alarm_timer_callback(struct nvkm_alarm *alarm)
185 spin_unlock_irqrestore(&therm->sensor.alarm_program_lock, flags); 185 spin_unlock_irqrestore(&therm->sensor.alarm_program_lock, flags);
186 186
187 /* schedule the next poll in one second */ 187 /* schedule the next poll in one second */
188 if (therm->func->temp_get(therm) >= 0 && list_empty(&alarm->head)) 188 if (therm->func->temp_get(therm) >= 0)
189 nvkm_timer_alarm(tmr, 1000000000ULL, alarm); 189 nvkm_timer_alarm(tmr, 1000000000ULL, alarm);
190} 190}
191 191
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c
index 07dc82bfe346..f2a86eae0a0d 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c
@@ -36,23 +36,29 @@ nvkm_timer_alarm_trigger(struct nvkm_timer *tmr)
36 unsigned long flags; 36 unsigned long flags;
37 LIST_HEAD(exec); 37 LIST_HEAD(exec);
38 38
39 /* move any due alarms off the pending list */ 39 /* Process pending alarms. */
40 spin_lock_irqsave(&tmr->lock, flags); 40 spin_lock_irqsave(&tmr->lock, flags);
41 list_for_each_entry_safe(alarm, atemp, &tmr->alarms, head) { 41 list_for_each_entry_safe(alarm, atemp, &tmr->alarms, head) {
42 if (alarm->timestamp <= nvkm_timer_read(tmr)) 42 /* Have we hit the earliest alarm that hasn't gone off? */
43 list_move_tail(&alarm->head, &exec); 43 if (alarm->timestamp > nvkm_timer_read(tmr)) {
44 /* Schedule it. If we didn't race, we're done. */
45 tmr->func->alarm_init(tmr, alarm->timestamp);
46 if (alarm->timestamp > nvkm_timer_read(tmr))
47 break;
48 }
49
50 /* Move to completed list. We'll drop the lock before
51 * executing the callback so it can reschedule itself.
52 */
53 list_move_tail(&alarm->head, &exec);
44 } 54 }
45 55
46 /* reschedule interrupt for next alarm time */ 56 /* Shut down interrupt if no more pending alarms. */
47 if (!list_empty(&tmr->alarms)) { 57 if (list_empty(&tmr->alarms))
48 alarm = list_first_entry(&tmr->alarms, typeof(*alarm), head);
49 tmr->func->alarm_init(tmr, alarm->timestamp);
50 } else {
51 tmr->func->alarm_fini(tmr); 58 tmr->func->alarm_fini(tmr);
52 }
53 spin_unlock_irqrestore(&tmr->lock, flags); 59 spin_unlock_irqrestore(&tmr->lock, flags);
54 60
55 /* execute any pending alarm handlers */ 61 /* Execute completed callbacks. */
56 list_for_each_entry_safe(alarm, atemp, &exec, head) { 62 list_for_each_entry_safe(alarm, atemp, &exec, head) {
57 list_del_init(&alarm->head); 63 list_del_init(&alarm->head);
58 alarm->func(alarm); 64 alarm->func(alarm);
@@ -65,24 +71,37 @@ nvkm_timer_alarm(struct nvkm_timer *tmr, u32 nsec, struct nvkm_alarm *alarm)
65 struct nvkm_alarm *list; 71 struct nvkm_alarm *list;
66 unsigned long flags; 72 unsigned long flags;
67 73
68 alarm->timestamp = nvkm_timer_read(tmr) + nsec; 74 /* Remove alarm from pending list.
69 75 *
70 /* append new alarm to list, in soonest-alarm-first order */ 76 * This both protects against the corruption of the list,
77 * and implements alarm rescheduling/cancellation.
78 */
71 spin_lock_irqsave(&tmr->lock, flags); 79 spin_lock_irqsave(&tmr->lock, flags);
72 if (!nsec) { 80 list_del_init(&alarm->head);
73 if (!list_empty(&alarm->head)) 81
74 list_del(&alarm->head); 82 if (nsec) {
75 } else { 83 /* Insert into pending list, ordered earliest to latest. */
84 alarm->timestamp = nvkm_timer_read(tmr) + nsec;
76 list_for_each_entry(list, &tmr->alarms, head) { 85 list_for_each_entry(list, &tmr->alarms, head) {
77 if (list->timestamp > alarm->timestamp) 86 if (list->timestamp > alarm->timestamp)
78 break; 87 break;
79 } 88 }
89
80 list_add_tail(&alarm->head, &list->head); 90 list_add_tail(&alarm->head, &list->head);
91
92 /* Update HW if this is now the earliest alarm. */
93 list = list_first_entry(&tmr->alarms, typeof(*list), head);
94 if (list == alarm) {
95 tmr->func->alarm_init(tmr, alarm->timestamp);
96 /* This shouldn't happen if callers aren't stupid.
97 *
98 * Worst case scenario is that it'll take roughly
99 * 4 seconds for the next alarm to trigger.
100 */
101 WARN_ON(alarm->timestamp <= nvkm_timer_read(tmr));
102 }
81 } 103 }
82 spin_unlock_irqrestore(&tmr->lock, flags); 104 spin_unlock_irqrestore(&tmr->lock, flags);
83
84 /* process pending alarms */
85 nvkm_timer_alarm_trigger(tmr);
86} 105}
87 106
88void 107void
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv04.c b/drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv04.c
index 7b9ce87f0617..7f48249f41de 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv04.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv04.c
@@ -76,8 +76,8 @@ nv04_timer_intr(struct nvkm_timer *tmr)
76 u32 stat = nvkm_rd32(device, NV04_PTIMER_INTR_0); 76 u32 stat = nvkm_rd32(device, NV04_PTIMER_INTR_0);
77 77
78 if (stat & 0x00000001) { 78 if (stat & 0x00000001) {
79 nvkm_timer_alarm_trigger(tmr);
80 nvkm_wr32(device, NV04_PTIMER_INTR_0, 0x00000001); 79 nvkm_wr32(device, NV04_PTIMER_INTR_0, 0x00000001);
80 nvkm_timer_alarm_trigger(tmr);
81 stat &= ~0x00000001; 81 stat &= ~0x00000001;
82 } 82 }
83 83
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index e0db2460243c..e368ce22bcc4 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -9150,23 +9150,10 @@ static u32 dce8_latency_watermark(struct dce8_wm_params *wm)
9150 a.full = dfixed_const(available_bandwidth); 9150 a.full = dfixed_const(available_bandwidth);
9151 b.full = dfixed_const(wm->num_heads); 9151 b.full = dfixed_const(wm->num_heads);
9152 a.full = dfixed_div(a, b); 9152 a.full = dfixed_div(a, b);
9153 tmp = div_u64((u64) dmif_size * (u64) wm->disp_clk, mc_latency + 512);
9154 tmp = min(dfixed_trunc(a), tmp);
9153 9155
9154 b.full = dfixed_const(mc_latency + 512); 9156 lb_fill_bw = min(tmp, wm->disp_clk * wm->bytes_per_pixel / 1000);
9155 c.full = dfixed_const(wm->disp_clk);
9156 b.full = dfixed_div(b, c);
9157
9158 c.full = dfixed_const(dmif_size);
9159 b.full = dfixed_div(c, b);
9160
9161 tmp = min(dfixed_trunc(a), dfixed_trunc(b));
9162
9163 b.full = dfixed_const(1000);
9164 c.full = dfixed_const(wm->disp_clk);
9165 b.full = dfixed_div(c, b);
9166 c.full = dfixed_const(wm->bytes_per_pixel);
9167 b.full = dfixed_mul(b, c);
9168
9169 lb_fill_bw = min(tmp, dfixed_trunc(b));
9170 9157
9171 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel); 9158 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
9172 b.full = dfixed_const(1000); 9159 b.full = dfixed_const(1000);
@@ -9274,14 +9261,14 @@ static void dce8_program_watermarks(struct radeon_device *rdev,
9274{ 9261{
9275 struct drm_display_mode *mode = &radeon_crtc->base.mode; 9262 struct drm_display_mode *mode = &radeon_crtc->base.mode;
9276 struct dce8_wm_params wm_low, wm_high; 9263 struct dce8_wm_params wm_low, wm_high;
9277 u32 pixel_period; 9264 u32 active_time;
9278 u32 line_time = 0; 9265 u32 line_time = 0;
9279 u32 latency_watermark_a = 0, latency_watermark_b = 0; 9266 u32 latency_watermark_a = 0, latency_watermark_b = 0;
9280 u32 tmp, wm_mask; 9267 u32 tmp, wm_mask;
9281 9268
9282 if (radeon_crtc->base.enabled && num_heads && mode) { 9269 if (radeon_crtc->base.enabled && num_heads && mode) {
9283 pixel_period = 1000000 / (u32)mode->clock; 9270 active_time = 1000000UL * (u32)mode->crtc_hdisplay / (u32)mode->clock;
9284 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535); 9271 line_time = min((u32) (1000000UL * (u32)mode->crtc_htotal / (u32)mode->clock), (u32)65535);
9285 9272
9286 /* watermark for high clocks */ 9273 /* watermark for high clocks */
9287 if ((rdev->pm.pm_method == PM_METHOD_DPM) && 9274 if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
@@ -9297,7 +9284,7 @@ static void dce8_program_watermarks(struct radeon_device *rdev,
9297 9284
9298 wm_high.disp_clk = mode->clock; 9285 wm_high.disp_clk = mode->clock;
9299 wm_high.src_width = mode->crtc_hdisplay; 9286 wm_high.src_width = mode->crtc_hdisplay;
9300 wm_high.active_time = mode->crtc_hdisplay * pixel_period; 9287 wm_high.active_time = active_time;
9301 wm_high.blank_time = line_time - wm_high.active_time; 9288 wm_high.blank_time = line_time - wm_high.active_time;
9302 wm_high.interlaced = false; 9289 wm_high.interlaced = false;
9303 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 9290 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
@@ -9337,7 +9324,7 @@ static void dce8_program_watermarks(struct radeon_device *rdev,
9337 9324
9338 wm_low.disp_clk = mode->clock; 9325 wm_low.disp_clk = mode->clock;
9339 wm_low.src_width = mode->crtc_hdisplay; 9326 wm_low.src_width = mode->crtc_hdisplay;
9340 wm_low.active_time = mode->crtc_hdisplay * pixel_period; 9327 wm_low.active_time = active_time;
9341 wm_low.blank_time = line_time - wm_low.active_time; 9328 wm_low.blank_time = line_time - wm_low.active_time;
9342 wm_low.interlaced = false; 9329 wm_low.interlaced = false;
9343 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 9330 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index d1b1e0cc3c25..f130ec41ee4b 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -2188,13 +2188,7 @@ static u32 evergreen_latency_watermark(struct evergreen_wm_params *wm)
2188 b.full = dfixed_const(wm->num_heads); 2188 b.full = dfixed_const(wm->num_heads);
2189 a.full = dfixed_div(a, b); 2189 a.full = dfixed_div(a, b);
2190 2190
2191 b.full = dfixed_const(1000); 2191 lb_fill_bw = min(dfixed_trunc(a), wm->disp_clk * wm->bytes_per_pixel / 1000);
2192 c.full = dfixed_const(wm->disp_clk);
2193 b.full = dfixed_div(c, b);
2194 c.full = dfixed_const(wm->bytes_per_pixel);
2195 b.full = dfixed_mul(b, c);
2196
2197 lb_fill_bw = min(dfixed_trunc(a), dfixed_trunc(b));
2198 2192
2199 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel); 2193 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
2200 b.full = dfixed_const(1000); 2194 b.full = dfixed_const(1000);
@@ -2261,7 +2255,7 @@ static void evergreen_program_watermarks(struct radeon_device *rdev,
2261 struct drm_display_mode *mode = &radeon_crtc->base.mode; 2255 struct drm_display_mode *mode = &radeon_crtc->base.mode;
2262 struct evergreen_wm_params wm_low, wm_high; 2256 struct evergreen_wm_params wm_low, wm_high;
2263 u32 dram_channels; 2257 u32 dram_channels;
2264 u32 pixel_period; 2258 u32 active_time;
2265 u32 line_time = 0; 2259 u32 line_time = 0;
2266 u32 latency_watermark_a = 0, latency_watermark_b = 0; 2260 u32 latency_watermark_a = 0, latency_watermark_b = 0;
2267 u32 priority_a_mark = 0, priority_b_mark = 0; 2261 u32 priority_a_mark = 0, priority_b_mark = 0;
@@ -2272,8 +2266,8 @@ static void evergreen_program_watermarks(struct radeon_device *rdev,
2272 fixed20_12 a, b, c; 2266 fixed20_12 a, b, c;
2273 2267
2274 if (radeon_crtc->base.enabled && num_heads && mode) { 2268 if (radeon_crtc->base.enabled && num_heads && mode) {
2275 pixel_period = 1000000 / (u32)mode->clock; 2269 active_time = 1000000UL * (u32)mode->crtc_hdisplay / (u32)mode->clock;
2276 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535); 2270 line_time = min((u32) (1000000UL * (u32)mode->crtc_htotal / (u32)mode->clock), (u32)65535);
2277 priority_a_cnt = 0; 2271 priority_a_cnt = 0;
2278 priority_b_cnt = 0; 2272 priority_b_cnt = 0;
2279 dram_channels = evergreen_get_number_of_dram_channels(rdev); 2273 dram_channels = evergreen_get_number_of_dram_channels(rdev);
@@ -2291,7 +2285,7 @@ static void evergreen_program_watermarks(struct radeon_device *rdev,
2291 2285
2292 wm_high.disp_clk = mode->clock; 2286 wm_high.disp_clk = mode->clock;
2293 wm_high.src_width = mode->crtc_hdisplay; 2287 wm_high.src_width = mode->crtc_hdisplay;
2294 wm_high.active_time = mode->crtc_hdisplay * pixel_period; 2288 wm_high.active_time = active_time;
2295 wm_high.blank_time = line_time - wm_high.active_time; 2289 wm_high.blank_time = line_time - wm_high.active_time;
2296 wm_high.interlaced = false; 2290 wm_high.interlaced = false;
2297 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 2291 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
@@ -2318,7 +2312,7 @@ static void evergreen_program_watermarks(struct radeon_device *rdev,
2318 2312
2319 wm_low.disp_clk = mode->clock; 2313 wm_low.disp_clk = mode->clock;
2320 wm_low.src_width = mode->crtc_hdisplay; 2314 wm_low.src_width = mode->crtc_hdisplay;
2321 wm_low.active_time = mode->crtc_hdisplay * pixel_period; 2315 wm_low.active_time = active_time;
2322 wm_low.blank_time = line_time - wm_low.active_time; 2316 wm_low.blank_time = line_time - wm_low.active_time;
2323 wm_low.interlaced = false; 2317 wm_low.interlaced = false;
2324 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 2318 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c
index 3eb0c4f9f796..45e1d4e60759 100644
--- a/drivers/gpu/drm/radeon/r420.c
+++ b/drivers/gpu/drm/radeon/r420.c
@@ -203,6 +203,7 @@ static void r420_clock_resume(struct radeon_device *rdev)
203 203
204static void r420_cp_errata_init(struct radeon_device *rdev) 204static void r420_cp_errata_init(struct radeon_device *rdev)
205{ 205{
206 int r;
206 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 207 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
207 208
208 /* RV410 and R420 can lock up if CP DMA to host memory happens 209 /* RV410 and R420 can lock up if CP DMA to host memory happens
@@ -212,7 +213,8 @@ static void r420_cp_errata_init(struct radeon_device *rdev)
212 * of the CP init, apparently. 213 * of the CP init, apparently.
213 */ 214 */
214 radeon_scratch_get(rdev, &rdev->config.r300.resync_scratch); 215 radeon_scratch_get(rdev, &rdev->config.r300.resync_scratch);
215 radeon_ring_lock(rdev, ring, 8); 216 r = radeon_ring_lock(rdev, ring, 8);
217 WARN_ON(r);
216 radeon_ring_write(ring, PACKET0(R300_CP_RESYNC_ADDR, 1)); 218 radeon_ring_write(ring, PACKET0(R300_CP_RESYNC_ADDR, 1));
217 radeon_ring_write(ring, rdev->config.r300.resync_scratch); 219 radeon_ring_write(ring, rdev->config.r300.resync_scratch);
218 radeon_ring_write(ring, 0xDEADBEEF); 220 radeon_ring_write(ring, 0xDEADBEEF);
@@ -221,12 +223,14 @@ static void r420_cp_errata_init(struct radeon_device *rdev)
221 223
222static void r420_cp_errata_fini(struct radeon_device *rdev) 224static void r420_cp_errata_fini(struct radeon_device *rdev)
223{ 225{
226 int r;
224 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 227 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
225 228
226 /* Catch the RESYNC we dispatched all the way back, 229 /* Catch the RESYNC we dispatched all the way back,
227 * at the very beginning of the CP init. 230 * at the very beginning of the CP init.
228 */ 231 */
229 radeon_ring_lock(rdev, ring, 8); 232 r = radeon_ring_lock(rdev, ring, 8);
233 WARN_ON(r);
230 radeon_ring_write(ring, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); 234 radeon_ring_write(ring, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
231 radeon_ring_write(ring, R300_RB3D_DC_FINISH); 235 radeon_ring_write(ring, R300_RB3D_DC_FINISH);
232 radeon_ring_unlock_commit(rdev, ring, false); 236 radeon_ring_unlock_commit(rdev, ring, false);
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index df6b58c08544..3ac671f6c8e1 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -117,11 +117,13 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
117 priority = (r->flags & RADEON_RELOC_PRIO_MASK) * 2 117 priority = (r->flags & RADEON_RELOC_PRIO_MASK) * 2
118 + !!r->write_domain; 118 + !!r->write_domain;
119 119
120 /* the first reloc of an UVD job is the msg and that must be in 120 /* The first reloc of an UVD job is the msg and that must be in
121 VRAM, also but everything into VRAM on AGP cards and older 121 * VRAM, the second reloc is the DPB and for WMV that must be in
122 IGP chips to avoid image corruptions */ 122 * VRAM as well. Also put everything into VRAM on AGP cards and older
123 * IGP chips to avoid image corruptions
124 */
123 if (p->ring == R600_RING_TYPE_UVD_INDEX && 125 if (p->ring == R600_RING_TYPE_UVD_INDEX &&
124 (i == 0 || pci_find_capability(p->rdev->ddev->pdev, 126 (i <= 0 || pci_find_capability(p->rdev->ddev->pdev,
125 PCI_CAP_ID_AGP) || 127 PCI_CAP_ID_AGP) ||
126 p->rdev->family == CHIP_RS780 || 128 p->rdev->family == CHIP_RS780 ||
127 p->rdev->family == CHIP_RS880)) { 129 p->rdev->family == CHIP_RS880)) {
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index c4777c8d0312..0b3ec35515f3 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -27,6 +27,9 @@
27 */ 27 */
28#include <drm/drmP.h> 28#include <drm/drmP.h>
29#include <drm/radeon_drm.h> 29#include <drm/radeon_drm.h>
30#ifdef CONFIG_X86
31#include <asm/set_memory.h>
32#endif
30#include "radeon.h" 33#include "radeon.h"
31 34
32/* 35/*
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index bec2ec056de4..8b722297a05c 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -81,7 +81,7 @@ static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo)
81 list_del_init(&bo->list); 81 list_del_init(&bo->list);
82 mutex_unlock(&bo->rdev->gem.mutex); 82 mutex_unlock(&bo->rdev->gem.mutex);
83 radeon_bo_clear_surface_reg(bo); 83 radeon_bo_clear_surface_reg(bo);
84 WARN_ON(!list_empty(&bo->va)); 84 WARN_ON_ONCE(!list_empty(&bo->va));
85 drm_gem_object_release(&bo->gem_base); 85 drm_gem_object_release(&bo->gem_base);
86 kfree(bo); 86 kfree(bo);
87} 87}
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
index 4fdc7bda7a7d..f5e9abfadb56 100644
--- a/drivers/gpu/drm/radeon/radeon_test.c
+++ b/drivers/gpu/drm/radeon/radeon_test.c
@@ -298,7 +298,12 @@ static int radeon_test_create_and_emit_fence(struct radeon_device *rdev,
298 DRM_ERROR("Failed to lock ring A %d\n", ring->idx); 298 DRM_ERROR("Failed to lock ring A %d\n", ring->idx);
299 return r; 299 return r;
300 } 300 }
301 radeon_fence_emit(rdev, fence, ring->idx); 301 r = radeon_fence_emit(rdev, fence, ring->idx);
302 if (r) {
303 DRM_ERROR("Failed to emit fence\n");
304 radeon_ring_unlock_undo(rdev, ring);
305 return r;
306 }
302 radeon_ring_unlock_commit(rdev, ring, false); 307 radeon_ring_unlock_commit(rdev, ring, false);
303 } 308 }
304 return 0; 309 return 0;
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
index d34d1cf33895..7431eb4a11b7 100644
--- a/drivers/gpu/drm/radeon/radeon_uvd.c
+++ b/drivers/gpu/drm/radeon/radeon_uvd.c
@@ -621,7 +621,7 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p,
621 } 621 }
622 622
623 /* TODO: is this still necessary on NI+ ? */ 623 /* TODO: is this still necessary on NI+ ? */
624 if ((cmd == 0 || cmd == 0x3) && 624 if ((cmd == 0 || cmd == 1 || cmd == 0x3) &&
625 (start >> 28) != (p->rdev->uvd.gpu_addr >> 28)) { 625 (start >> 28) != (p->rdev->uvd.gpu_addr >> 28)) {
626 DRM_ERROR("msg/fb buffer %LX-%LX out of 256MB segment!\n", 626 DRM_ERROR("msg/fb buffer %LX-%LX out of 256MB segment!\n",
627 start, end); 627 start, end);
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index 528e5a49a214..ceee87f029d9 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -2204,23 +2204,10 @@ static u32 dce6_latency_watermark(struct dce6_wm_params *wm)
2204 a.full = dfixed_const(available_bandwidth); 2204 a.full = dfixed_const(available_bandwidth);
2205 b.full = dfixed_const(wm->num_heads); 2205 b.full = dfixed_const(wm->num_heads);
2206 a.full = dfixed_div(a, b); 2206 a.full = dfixed_div(a, b);
2207 tmp = div_u64((u64) dmif_size * (u64) wm->disp_clk, mc_latency + 512);
2208 tmp = min(dfixed_trunc(a), tmp);
2207 2209
2208 b.full = dfixed_const(mc_latency + 512); 2210 lb_fill_bw = min(tmp, wm->disp_clk * wm->bytes_per_pixel / 1000);
2209 c.full = dfixed_const(wm->disp_clk);
2210 b.full = dfixed_div(b, c);
2211
2212 c.full = dfixed_const(dmif_size);
2213 b.full = dfixed_div(c, b);
2214
2215 tmp = min(dfixed_trunc(a), dfixed_trunc(b));
2216
2217 b.full = dfixed_const(1000);
2218 c.full = dfixed_const(wm->disp_clk);
2219 b.full = dfixed_div(c, b);
2220 c.full = dfixed_const(wm->bytes_per_pixel);
2221 b.full = dfixed_mul(b, c);
2222
2223 lb_fill_bw = min(tmp, dfixed_trunc(b));
2224 2211
2225 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel); 2212 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
2226 b.full = dfixed_const(1000); 2213 b.full = dfixed_const(1000);
@@ -2287,7 +2274,7 @@ static void dce6_program_watermarks(struct radeon_device *rdev,
2287 struct drm_display_mode *mode = &radeon_crtc->base.mode; 2274 struct drm_display_mode *mode = &radeon_crtc->base.mode;
2288 struct dce6_wm_params wm_low, wm_high; 2275 struct dce6_wm_params wm_low, wm_high;
2289 u32 dram_channels; 2276 u32 dram_channels;
2290 u32 pixel_period; 2277 u32 active_time;
2291 u32 line_time = 0; 2278 u32 line_time = 0;
2292 u32 latency_watermark_a = 0, latency_watermark_b = 0; 2279 u32 latency_watermark_a = 0, latency_watermark_b = 0;
2293 u32 priority_a_mark = 0, priority_b_mark = 0; 2280 u32 priority_a_mark = 0, priority_b_mark = 0;
@@ -2297,8 +2284,8 @@ static void dce6_program_watermarks(struct radeon_device *rdev,
2297 fixed20_12 a, b, c; 2284 fixed20_12 a, b, c;
2298 2285
2299 if (radeon_crtc->base.enabled && num_heads && mode) { 2286 if (radeon_crtc->base.enabled && num_heads && mode) {
2300 pixel_period = 1000000 / (u32)mode->clock; 2287 active_time = 1000000UL * (u32)mode->crtc_hdisplay / (u32)mode->clock;
2301 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535); 2288 line_time = min((u32) (1000000UL * (u32)mode->crtc_htotal / (u32)mode->clock), (u32)65535);
2302 priority_a_cnt = 0; 2289 priority_a_cnt = 0;
2303 priority_b_cnt = 0; 2290 priority_b_cnt = 0;
2304 2291
@@ -2320,7 +2307,7 @@ static void dce6_program_watermarks(struct radeon_device *rdev,
2320 2307
2321 wm_high.disp_clk = mode->clock; 2308 wm_high.disp_clk = mode->clock;
2322 wm_high.src_width = mode->crtc_hdisplay; 2309 wm_high.src_width = mode->crtc_hdisplay;
2323 wm_high.active_time = mode->crtc_hdisplay * pixel_period; 2310 wm_high.active_time = active_time;
2324 wm_high.blank_time = line_time - wm_high.active_time; 2311 wm_high.blank_time = line_time - wm_high.active_time;
2325 wm_high.interlaced = false; 2312 wm_high.interlaced = false;
2326 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 2313 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
@@ -2347,7 +2334,7 @@ static void dce6_program_watermarks(struct radeon_device *rdev,
2347 2334
2348 wm_low.disp_clk = mode->clock; 2335 wm_low.disp_clk = mode->clock;
2349 wm_low.src_width = mode->crtc_hdisplay; 2336 wm_low.src_width = mode->crtc_hdisplay;
2350 wm_low.active_time = mode->crtc_hdisplay * pixel_period; 2337 wm_low.active_time = active_time;
2351 wm_low.blank_time = line_time - wm_low.active_time; 2338 wm_low.blank_time = line_time - wm_low.active_time;
2352 wm_low.interlaced = false; 2339 wm_low.interlaced = false;
2353 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 2340 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
diff --git a/drivers/gpu/drm/sti/sti_compositor.c b/drivers/gpu/drm/sti/sti_compositor.c
index c12d621b21bd..6e4bf68262db 100644
--- a/drivers/gpu/drm/sti/sti_compositor.c
+++ b/drivers/gpu/drm/sti/sti_compositor.c
@@ -89,7 +89,7 @@ static int sti_compositor_bind(struct device *dev,
89 /* Nothing to do, wait for the second round */ 89 /* Nothing to do, wait for the second round */
90 break; 90 break;
91 default: 91 default:
92 DRM_ERROR("Unknow subdev compoment type\n"); 92 DRM_ERROR("Unknown subdev component type\n");
93 return 1; 93 return 1;
94 } 94 }
95 } 95 }
diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c
index d824497e950e..a59c95a8081b 100644
--- a/drivers/gpu/drm/sti/sti_hdmi.c
+++ b/drivers/gpu/drm/sti/sti_hdmi.c
@@ -768,6 +768,8 @@ static void sti_hdmi_disable(struct drm_bridge *bridge)
768 clk_disable_unprepare(hdmi->clk_pix); 768 clk_disable_unprepare(hdmi->clk_pix);
769 769
770 hdmi->enabled = false; 770 hdmi->enabled = false;
771
772 cec_notifier_set_phys_addr(hdmi->notifier, CEC_PHYS_ADDR_INVALID);
771} 773}
772 774
773/** 775/**
@@ -970,6 +972,7 @@ static int sti_hdmi_connector_get_modes(struct drm_connector *connector)
970 DRM_DEBUG_KMS("%s : %dx%d cm\n", 972 DRM_DEBUG_KMS("%s : %dx%d cm\n",
971 (hdmi->hdmi_monitor ? "hdmi monitor" : "dvi monitor"), 973 (hdmi->hdmi_monitor ? "hdmi monitor" : "dvi monitor"),
972 edid->width_cm, edid->height_cm); 974 edid->width_cm, edid->height_cm);
975 cec_notifier_set_phys_addr_from_edid(hdmi->notifier, edid);
973 976
974 count = drm_add_edid_modes(connector, edid); 977 count = drm_add_edid_modes(connector, edid);
975 drm_mode_connector_update_edid_property(connector, edid); 978 drm_mode_connector_update_edid_property(connector, edid);
@@ -1032,6 +1035,7 @@ sti_hdmi_connector_detect(struct drm_connector *connector, bool force)
1032 } 1035 }
1033 1036
1034 DRM_DEBUG_DRIVER("hdmi cable disconnected\n"); 1037 DRM_DEBUG_DRIVER("hdmi cable disconnected\n");
1038 cec_notifier_set_phys_addr(hdmi->notifier, CEC_PHYS_ADDR_INVALID);
1035 return connector_status_disconnected; 1039 return connector_status_disconnected;
1036} 1040}
1037 1041
@@ -1420,6 +1424,10 @@ static int sti_hdmi_probe(struct platform_device *pdev)
1420 goto release_adapter; 1424 goto release_adapter;
1421 } 1425 }
1422 1426
1427 hdmi->notifier = cec_notifier_get(&pdev->dev);
1428 if (!hdmi->notifier)
1429 goto release_adapter;
1430
1423 hdmi->reset = devm_reset_control_get(dev, "hdmi"); 1431 hdmi->reset = devm_reset_control_get(dev, "hdmi");
1424 /* Take hdmi out of reset */ 1432 /* Take hdmi out of reset */
1425 if (!IS_ERR(hdmi->reset)) 1433 if (!IS_ERR(hdmi->reset))
@@ -1439,11 +1447,14 @@ static int sti_hdmi_remove(struct platform_device *pdev)
1439{ 1447{
1440 struct sti_hdmi *hdmi = dev_get_drvdata(&pdev->dev); 1448 struct sti_hdmi *hdmi = dev_get_drvdata(&pdev->dev);
1441 1449
1450 cec_notifier_set_phys_addr(hdmi->notifier, CEC_PHYS_ADDR_INVALID);
1451
1442 i2c_put_adapter(hdmi->ddc_adapt); 1452 i2c_put_adapter(hdmi->ddc_adapt);
1443 if (hdmi->audio_pdev) 1453 if (hdmi->audio_pdev)
1444 platform_device_unregister(hdmi->audio_pdev); 1454 platform_device_unregister(hdmi->audio_pdev);
1445 component_del(&pdev->dev, &sti_hdmi_ops); 1455 component_del(&pdev->dev, &sti_hdmi_ops);
1446 1456
1457 cec_notifier_put(hdmi->notifier);
1447 return 0; 1458 return 0;
1448} 1459}
1449 1460
diff --git a/drivers/gpu/drm/sti/sti_hdmi.h b/drivers/gpu/drm/sti/sti_hdmi.h
index 407012350f1a..c6469b56ce7e 100644
--- a/drivers/gpu/drm/sti/sti_hdmi.h
+++ b/drivers/gpu/drm/sti/sti_hdmi.h
@@ -11,6 +11,7 @@
11#include <linux/platform_device.h> 11#include <linux/platform_device.h>
12 12
13#include <drm/drmP.h> 13#include <drm/drmP.h>
14#include <media/cec-notifier.h>
14 15
15#define HDMI_STA 0x0010 16#define HDMI_STA 0x0010
16#define HDMI_STA_DLL_LCK BIT(5) 17#define HDMI_STA_DLL_LCK BIT(5)
@@ -64,6 +65,7 @@ static const struct drm_prop_enum_list colorspace_mode_names[] = {
64 * @audio_pdev: ASoC hdmi-codec platform device 65 * @audio_pdev: ASoC hdmi-codec platform device
65 * @audio: hdmi audio parameters. 66 * @audio: hdmi audio parameters.
66 * @drm_connector: hdmi connector 67 * @drm_connector: hdmi connector
68 * @notifier: hotplug detect notifier
67 */ 69 */
68struct sti_hdmi { 70struct sti_hdmi {
69 struct device dev; 71 struct device dev;
@@ -89,6 +91,7 @@ struct sti_hdmi {
89 struct platform_device *audio_pdev; 91 struct platform_device *audio_pdev;
90 struct hdmi_audio_params audio; 92 struct hdmi_audio_params audio;
91 struct drm_connector *drm_connector; 93 struct drm_connector *drm_connector;
94 struct cec_notifier *notifier;
92}; 95};
93 96
94u32 hdmi_read(struct sti_hdmi *hdmi, int offset); 97u32 hdmi_read(struct sti_hdmi *hdmi, int offset);
diff --git a/drivers/gpu/drm/tegra/Kconfig b/drivers/gpu/drm/tegra/Kconfig
index bbf5a4b7e0b6..2db29d67193d 100644
--- a/drivers/gpu/drm/tegra/Kconfig
+++ b/drivers/gpu/drm/tegra/Kconfig
@@ -7,6 +7,7 @@ config DRM_TEGRA
7 select DRM_MIPI_DSI 7 select DRM_MIPI_DSI
8 select DRM_PANEL 8 select DRM_PANEL
9 select TEGRA_HOST1X 9 select TEGRA_HOST1X
10 select IOMMU_IOVA if IOMMU_SUPPORT
10 help 11 help
11 Choose this option if you have an NVIDIA Tegra SoC. 12 Choose this option if you have an NVIDIA Tegra SoC.
12 13
diff --git a/drivers/gpu/drm/tegra/Makefile b/drivers/gpu/drm/tegra/Makefile
index 2c66a8db9da4..6af3a9ad6565 100644
--- a/drivers/gpu/drm/tegra/Makefile
+++ b/drivers/gpu/drm/tegra/Makefile
@@ -13,6 +13,8 @@ tegra-drm-y := \
13 sor.o \ 13 sor.o \
14 dpaux.o \ 14 dpaux.o \
15 gr2d.o \ 15 gr2d.o \
16 gr3d.o 16 gr3d.o \
17 falcon.o \
18 vic.o
17 19
18obj-$(CONFIG_DRM_TEGRA) += tegra-drm.o 20obj-$(CONFIG_DRM_TEGRA) += tegra-drm.o
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index 3b419f9dbf4d..51c48a8e00ec 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -1,13 +1,15 @@
1/* 1/*
2 * Copyright (C) 2012 Avionic Design GmbH 2 * Copyright (C) 2012 Avionic Design GmbH
3 * Copyright (C) 2012-2013 NVIDIA CORPORATION. All rights reserved. 3 * Copyright (C) 2012-2016 NVIDIA CORPORATION. All rights reserved.
4 * 4 *
5 * This program is free software; you can redistribute it and/or modify 5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as 6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 */ 8 */
9 9
10#include <linux/bitops.h>
10#include <linux/host1x.h> 11#include <linux/host1x.h>
12#include <linux/idr.h>
11#include <linux/iommu.h> 13#include <linux/iommu.h>
12 14
13#include <drm/drm_atomic.h> 15#include <drm/drm_atomic.h>
@@ -23,8 +25,11 @@
23#define DRIVER_MINOR 0 25#define DRIVER_MINOR 0
24#define DRIVER_PATCHLEVEL 0 26#define DRIVER_PATCHLEVEL 0
25 27
28#define CARVEOUT_SZ SZ_64M
29
26struct tegra_drm_file { 30struct tegra_drm_file {
27 struct list_head contexts; 31 struct idr contexts;
32 struct mutex lock;
28}; 33};
29 34
30static void tegra_atomic_schedule(struct tegra_drm *tegra, 35static void tegra_atomic_schedule(struct tegra_drm *tegra,
@@ -126,8 +131,9 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
126 return -ENOMEM; 131 return -ENOMEM;
127 132
128 if (iommu_present(&platform_bus_type)) { 133 if (iommu_present(&platform_bus_type)) {
134 u64 carveout_start, carveout_end, gem_start, gem_end;
129 struct iommu_domain_geometry *geometry; 135 struct iommu_domain_geometry *geometry;
130 u64 start, end; 136 unsigned long order;
131 137
132 tegra->domain = iommu_domain_alloc(&platform_bus_type); 138 tegra->domain = iommu_domain_alloc(&platform_bus_type);
133 if (!tegra->domain) { 139 if (!tegra->domain) {
@@ -136,12 +142,26 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
136 } 142 }
137 143
138 geometry = &tegra->domain->geometry; 144 geometry = &tegra->domain->geometry;
139 start = geometry->aperture_start; 145 gem_start = geometry->aperture_start;
140 end = geometry->aperture_end; 146 gem_end = geometry->aperture_end - CARVEOUT_SZ;
141 147 carveout_start = gem_end + 1;
142 DRM_DEBUG_DRIVER("IOMMU aperture initialized (%#llx-%#llx)\n", 148 carveout_end = geometry->aperture_end;
143 start, end); 149
144 drm_mm_init(&tegra->mm, start, end - start + 1); 150 order = __ffs(tegra->domain->pgsize_bitmap);
151 init_iova_domain(&tegra->carveout.domain, 1UL << order,
152 carveout_start >> order,
153 carveout_end >> order);
154
155 tegra->carveout.shift = iova_shift(&tegra->carveout.domain);
156 tegra->carveout.limit = carveout_end >> tegra->carveout.shift;
157
158 drm_mm_init(&tegra->mm, gem_start, gem_end - gem_start + 1);
159 mutex_init(&tegra->mm_lock);
160
161 DRM_DEBUG("IOMMU apertures:\n");
162 DRM_DEBUG(" GEM: %#llx-%#llx\n", gem_start, gem_end);
163 DRM_DEBUG(" Carveout: %#llx-%#llx\n", carveout_start,
164 carveout_end);
145 } 165 }
146 166
147 mutex_init(&tegra->clients_lock); 167 mutex_init(&tegra->clients_lock);
@@ -161,6 +181,8 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
161 drm->mode_config.max_width = 4096; 181 drm->mode_config.max_width = 4096;
162 drm->mode_config.max_height = 4096; 182 drm->mode_config.max_height = 4096;
163 183
184 drm->mode_config.allow_fb_modifiers = true;
185
164 drm->mode_config.funcs = &tegra_drm_mode_funcs; 186 drm->mode_config.funcs = &tegra_drm_mode_funcs;
165 187
166 err = tegra_drm_fb_prepare(drm); 188 err = tegra_drm_fb_prepare(drm);
@@ -208,6 +230,8 @@ config:
208 if (tegra->domain) { 230 if (tegra->domain) {
209 iommu_domain_free(tegra->domain); 231 iommu_domain_free(tegra->domain);
210 drm_mm_takedown(&tegra->mm); 232 drm_mm_takedown(&tegra->mm);
233 mutex_destroy(&tegra->mm_lock);
234 put_iova_domain(&tegra->carveout.domain);
211 } 235 }
212free: 236free:
213 kfree(tegra); 237 kfree(tegra);
@@ -232,6 +256,8 @@ static void tegra_drm_unload(struct drm_device *drm)
232 if (tegra->domain) { 256 if (tegra->domain) {
233 iommu_domain_free(tegra->domain); 257 iommu_domain_free(tegra->domain);
234 drm_mm_takedown(&tegra->mm); 258 drm_mm_takedown(&tegra->mm);
259 mutex_destroy(&tegra->mm_lock);
260 put_iova_domain(&tegra->carveout.domain);
235 } 261 }
236 262
237 kfree(tegra); 263 kfree(tegra);
@@ -245,7 +271,8 @@ static int tegra_drm_open(struct drm_device *drm, struct drm_file *filp)
245 if (!fpriv) 271 if (!fpriv)
246 return -ENOMEM; 272 return -ENOMEM;
247 273
248 INIT_LIST_HEAD(&fpriv->contexts); 274 idr_init(&fpriv->contexts);
275 mutex_init(&fpriv->lock);
249 filp->driver_priv = fpriv; 276 filp->driver_priv = fpriv;
250 277
251 return 0; 278 return 0;
@@ -424,21 +451,16 @@ fail:
424 451
425 452
426#ifdef CONFIG_DRM_TEGRA_STAGING 453#ifdef CONFIG_DRM_TEGRA_STAGING
427static struct tegra_drm_context *tegra_drm_get_context(__u64 context) 454static struct tegra_drm_context *
428{ 455tegra_drm_file_get_context(struct tegra_drm_file *file, u32 id)
429 return (struct tegra_drm_context *)(uintptr_t)context;
430}
431
432static bool tegra_drm_file_owns_context(struct tegra_drm_file *file,
433 struct tegra_drm_context *context)
434{ 456{
435 struct tegra_drm_context *ctx; 457 struct tegra_drm_context *context;
436 458
437 list_for_each_entry(ctx, &file->contexts, list) 459 mutex_lock(&file->lock);
438 if (ctx == context) 460 context = idr_find(&file->contexts, id);
439 return true; 461 mutex_unlock(&file->lock);
440 462
441 return false; 463 return context;
442} 464}
443 465
444static int tegra_gem_create(struct drm_device *drm, void *data, 466static int tegra_gem_create(struct drm_device *drm, void *data,
@@ -519,6 +541,28 @@ static int tegra_syncpt_wait(struct drm_device *drm, void *data,
519 &args->value); 541 &args->value);
520} 542}
521 543
544static int tegra_client_open(struct tegra_drm_file *fpriv,
545 struct tegra_drm_client *client,
546 struct tegra_drm_context *context)
547{
548 int err;
549
550 err = client->ops->open_channel(client, context);
551 if (err < 0)
552 return err;
553
554 err = idr_alloc(&fpriv->contexts, context, 0, 0, GFP_KERNEL);
555 if (err < 0) {
556 client->ops->close_channel(context);
557 return err;
558 }
559
560 context->client = client;
561 context->id = err;
562
563 return 0;
564}
565
522static int tegra_open_channel(struct drm_device *drm, void *data, 566static int tegra_open_channel(struct drm_device *drm, void *data,
523 struct drm_file *file) 567 struct drm_file *file)
524{ 568{
@@ -533,19 +577,22 @@ static int tegra_open_channel(struct drm_device *drm, void *data,
533 if (!context) 577 if (!context)
534 return -ENOMEM; 578 return -ENOMEM;
535 579
580 mutex_lock(&fpriv->lock);
581
536 list_for_each_entry(client, &tegra->clients, list) 582 list_for_each_entry(client, &tegra->clients, list)
537 if (client->base.class == args->client) { 583 if (client->base.class == args->client) {
538 err = client->ops->open_channel(client, context); 584 err = tegra_client_open(fpriv, client, context);
539 if (err) 585 if (err < 0)
540 break; 586 break;
541 587
542 list_add(&context->list, &fpriv->contexts); 588 args->context = context->id;
543 args->context = (uintptr_t)context; 589 break;
544 context->client = client;
545 return 0;
546 } 590 }
547 591
548 kfree(context); 592 if (err < 0)
593 kfree(context);
594
595 mutex_unlock(&fpriv->lock);
549 return err; 596 return err;
550} 597}
551 598
@@ -555,16 +602,22 @@ static int tegra_close_channel(struct drm_device *drm, void *data,
555 struct tegra_drm_file *fpriv = file->driver_priv; 602 struct tegra_drm_file *fpriv = file->driver_priv;
556 struct drm_tegra_close_channel *args = data; 603 struct drm_tegra_close_channel *args = data;
557 struct tegra_drm_context *context; 604 struct tegra_drm_context *context;
605 int err = 0;
558 606
559 context = tegra_drm_get_context(args->context); 607 mutex_lock(&fpriv->lock);
560 608
561 if (!tegra_drm_file_owns_context(fpriv, context)) 609 context = tegra_drm_file_get_context(fpriv, args->context);
562 return -EINVAL; 610 if (!context) {
611 err = -EINVAL;
612 goto unlock;
613 }
563 614
564 list_del(&context->list); 615 idr_remove(&fpriv->contexts, context->id);
565 tegra_drm_context_free(context); 616 tegra_drm_context_free(context);
566 617
567 return 0; 618unlock:
619 mutex_unlock(&fpriv->lock);
620 return err;
568} 621}
569 622
570static int tegra_get_syncpt(struct drm_device *drm, void *data, 623static int tegra_get_syncpt(struct drm_device *drm, void *data,
@@ -574,19 +627,27 @@ static int tegra_get_syncpt(struct drm_device *drm, void *data,
574 struct drm_tegra_get_syncpt *args = data; 627 struct drm_tegra_get_syncpt *args = data;
575 struct tegra_drm_context *context; 628 struct tegra_drm_context *context;
576 struct host1x_syncpt *syncpt; 629 struct host1x_syncpt *syncpt;
630 int err = 0;
577 631
578 context = tegra_drm_get_context(args->context); 632 mutex_lock(&fpriv->lock);
579 633
580 if (!tegra_drm_file_owns_context(fpriv, context)) 634 context = tegra_drm_file_get_context(fpriv, args->context);
581 return -ENODEV; 635 if (!context) {
636 err = -ENODEV;
637 goto unlock;
638 }
582 639
583 if (args->index >= context->client->base.num_syncpts) 640 if (args->index >= context->client->base.num_syncpts) {
584 return -EINVAL; 641 err = -EINVAL;
642 goto unlock;
643 }
585 644
586 syncpt = context->client->base.syncpts[args->index]; 645 syncpt = context->client->base.syncpts[args->index];
587 args->id = host1x_syncpt_id(syncpt); 646 args->id = host1x_syncpt_id(syncpt);
588 647
589 return 0; 648unlock:
649 mutex_unlock(&fpriv->lock);
650 return err;
590} 651}
591 652
592static int tegra_submit(struct drm_device *drm, void *data, 653static int tegra_submit(struct drm_device *drm, void *data,
@@ -595,13 +656,21 @@ static int tegra_submit(struct drm_device *drm, void *data,
595 struct tegra_drm_file *fpriv = file->driver_priv; 656 struct tegra_drm_file *fpriv = file->driver_priv;
596 struct drm_tegra_submit *args = data; 657 struct drm_tegra_submit *args = data;
597 struct tegra_drm_context *context; 658 struct tegra_drm_context *context;
659 int err;
598 660
599 context = tegra_drm_get_context(args->context); 661 mutex_lock(&fpriv->lock);
662
663 context = tegra_drm_file_get_context(fpriv, args->context);
664 if (!context) {
665 err = -ENODEV;
666 goto unlock;
667 }
600 668
601 if (!tegra_drm_file_owns_context(fpriv, context)) 669 err = context->client->ops->submit(context, args, drm, file);
602 return -ENODEV;
603 670
604 return context->client->ops->submit(context, args, drm, file); 671unlock:
672 mutex_unlock(&fpriv->lock);
673 return err;
605} 674}
606 675
607static int tegra_get_syncpt_base(struct drm_device *drm, void *data, 676static int tegra_get_syncpt_base(struct drm_device *drm, void *data,
@@ -612,24 +681,34 @@ static int tegra_get_syncpt_base(struct drm_device *drm, void *data,
612 struct tegra_drm_context *context; 681 struct tegra_drm_context *context;
613 struct host1x_syncpt_base *base; 682 struct host1x_syncpt_base *base;
614 struct host1x_syncpt *syncpt; 683 struct host1x_syncpt *syncpt;
684 int err = 0;
615 685
616 context = tegra_drm_get_context(args->context); 686 mutex_lock(&fpriv->lock);
617 687
618 if (!tegra_drm_file_owns_context(fpriv, context)) 688 context = tegra_drm_file_get_context(fpriv, args->context);
619 return -ENODEV; 689 if (!context) {
690 err = -ENODEV;
691 goto unlock;
692 }
620 693
621 if (args->syncpt >= context->client->base.num_syncpts) 694 if (args->syncpt >= context->client->base.num_syncpts) {
622 return -EINVAL; 695 err = -EINVAL;
696 goto unlock;
697 }
623 698
624 syncpt = context->client->base.syncpts[args->syncpt]; 699 syncpt = context->client->base.syncpts[args->syncpt];
625 700
626 base = host1x_syncpt_get_base(syncpt); 701 base = host1x_syncpt_get_base(syncpt);
627 if (!base) 702 if (!base) {
628 return -ENXIO; 703 err = -ENXIO;
704 goto unlock;
705 }
629 706
630 args->id = host1x_syncpt_base_id(base); 707 args->id = host1x_syncpt_base_id(base);
631 708
632 return 0; 709unlock:
710 mutex_unlock(&fpriv->lock);
711 return err;
633} 712}
634 713
635static int tegra_gem_set_tiling(struct drm_device *drm, void *data, 714static int tegra_gem_set_tiling(struct drm_device *drm, void *data,
@@ -804,14 +883,25 @@ static const struct file_operations tegra_drm_fops = {
804 .llseek = noop_llseek, 883 .llseek = noop_llseek,
805}; 884};
806 885
886static int tegra_drm_context_cleanup(int id, void *p, void *data)
887{
888 struct tegra_drm_context *context = p;
889
890 tegra_drm_context_free(context);
891
892 return 0;
893}
894
807static void tegra_drm_postclose(struct drm_device *drm, struct drm_file *file) 895static void tegra_drm_postclose(struct drm_device *drm, struct drm_file *file)
808{ 896{
809 struct tegra_drm_file *fpriv = file->driver_priv; 897 struct tegra_drm_file *fpriv = file->driver_priv;
810 struct tegra_drm_context *context, *tmp;
811 898
812 list_for_each_entry_safe(context, tmp, &fpriv->contexts, list) 899 mutex_lock(&fpriv->lock);
813 tegra_drm_context_free(context); 900 idr_for_each(&fpriv->contexts, tegra_drm_context_cleanup, NULL);
901 mutex_unlock(&fpriv->lock);
814 902
903 idr_destroy(&fpriv->contexts);
904 mutex_destroy(&fpriv->lock);
815 kfree(fpriv); 905 kfree(fpriv);
816} 906}
817 907
@@ -844,7 +934,9 @@ static int tegra_debugfs_iova(struct seq_file *s, void *data)
844 struct tegra_drm *tegra = drm->dev_private; 934 struct tegra_drm *tegra = drm->dev_private;
845 struct drm_printer p = drm_seq_file_printer(s); 935 struct drm_printer p = drm_seq_file_printer(s);
846 936
937 mutex_lock(&tegra->mm_lock);
847 drm_mm_print(&tegra->mm, &p); 938 drm_mm_print(&tegra->mm, &p);
939 mutex_unlock(&tegra->mm_lock);
848 940
849 return 0; 941 return 0;
850} 942}
@@ -919,6 +1011,84 @@ int tegra_drm_unregister_client(struct tegra_drm *tegra,
919 return 0; 1011 return 0;
920} 1012}
921 1013
1014void *tegra_drm_alloc(struct tegra_drm *tegra, size_t size,
1015 dma_addr_t *dma)
1016{
1017 struct iova *alloc;
1018 void *virt;
1019 gfp_t gfp;
1020 int err;
1021
1022 if (tegra->domain)
1023 size = iova_align(&tegra->carveout.domain, size);
1024 else
1025 size = PAGE_ALIGN(size);
1026
1027 gfp = GFP_KERNEL | __GFP_ZERO;
1028 if (!tegra->domain) {
1029 /*
1030 * Many units only support 32-bit addresses, even on 64-bit
1031 * SoCs. If there is no IOMMU to translate into a 32-bit IO
1032 * virtual address space, force allocations to be in the
1033 * lower 32-bit range.
1034 */
1035 gfp |= GFP_DMA;
1036 }
1037
1038 virt = (void *)__get_free_pages(gfp, get_order(size));
1039 if (!virt)
1040 return ERR_PTR(-ENOMEM);
1041
1042 if (!tegra->domain) {
1043 /*
1044 * If IOMMU is disabled, devices address physical memory
1045 * directly.
1046 */
1047 *dma = virt_to_phys(virt);
1048 return virt;
1049 }
1050
1051 alloc = alloc_iova(&tegra->carveout.domain,
1052 size >> tegra->carveout.shift,
1053 tegra->carveout.limit, true);
1054 if (!alloc) {
1055 err = -EBUSY;
1056 goto free_pages;
1057 }
1058
1059 *dma = iova_dma_addr(&tegra->carveout.domain, alloc);
1060 err = iommu_map(tegra->domain, *dma, virt_to_phys(virt),
1061 size, IOMMU_READ | IOMMU_WRITE);
1062 if (err < 0)
1063 goto free_iova;
1064
1065 return virt;
1066
1067free_iova:
1068 __free_iova(&tegra->carveout.domain, alloc);
1069free_pages:
1070 free_pages((unsigned long)virt, get_order(size));
1071
1072 return ERR_PTR(err);
1073}
1074
1075void tegra_drm_free(struct tegra_drm *tegra, size_t size, void *virt,
1076 dma_addr_t dma)
1077{
1078 if (tegra->domain)
1079 size = iova_align(&tegra->carveout.domain, size);
1080 else
1081 size = PAGE_ALIGN(size);
1082
1083 if (tegra->domain) {
1084 iommu_unmap(tegra->domain, dma, size);
1085 free_iova(&tegra->carveout.domain,
1086 iova_pfn(&tegra->carveout.domain, dma));
1087 }
1088
1089 free_pages((unsigned long)virt, get_order(size));
1090}
1091
922static int host1x_drm_probe(struct host1x_device *dev) 1092static int host1x_drm_probe(struct host1x_device *dev)
923{ 1093{
924 struct drm_driver *driver = &tegra_drm_driver; 1094 struct drm_driver *driver = &tegra_drm_driver;
@@ -1003,11 +1173,13 @@ static const struct of_device_id host1x_drm_subdevs[] = {
1003 { .compatible = "nvidia,tegra124-sor", }, 1173 { .compatible = "nvidia,tegra124-sor", },
1004 { .compatible = "nvidia,tegra124-hdmi", }, 1174 { .compatible = "nvidia,tegra124-hdmi", },
1005 { .compatible = "nvidia,tegra124-dsi", }, 1175 { .compatible = "nvidia,tegra124-dsi", },
1176 { .compatible = "nvidia,tegra124-vic", },
1006 { .compatible = "nvidia,tegra132-dsi", }, 1177 { .compatible = "nvidia,tegra132-dsi", },
1007 { .compatible = "nvidia,tegra210-dc", }, 1178 { .compatible = "nvidia,tegra210-dc", },
1008 { .compatible = "nvidia,tegra210-dsi", }, 1179 { .compatible = "nvidia,tegra210-dsi", },
1009 { .compatible = "nvidia,tegra210-sor", }, 1180 { .compatible = "nvidia,tegra210-sor", },
1010 { .compatible = "nvidia,tegra210-sor1", }, 1181 { .compatible = "nvidia,tegra210-sor1", },
1182 { .compatible = "nvidia,tegra210-vic", },
1011 { /* sentinel */ } 1183 { /* sentinel */ }
1012}; 1184};
1013 1185
@@ -1029,6 +1201,7 @@ static struct platform_driver * const drivers[] = {
1029 &tegra_sor_driver, 1201 &tegra_sor_driver,
1030 &tegra_gr2d_driver, 1202 &tegra_gr2d_driver,
1031 &tegra_gr3d_driver, 1203 &tegra_gr3d_driver,
1204 &tegra_vic_driver,
1032}; 1205};
1033 1206
1034static int __init host1x_drm_init(void) 1207static int __init host1x_drm_init(void)
diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
index 5747accb2271..85aa2e3d9d4e 100644
--- a/drivers/gpu/drm/tegra/drm.h
+++ b/drivers/gpu/drm/tegra/drm.h
@@ -12,6 +12,7 @@
12 12
13#include <uapi/drm/tegra_drm.h> 13#include <uapi/drm/tegra_drm.h>
14#include <linux/host1x.h> 14#include <linux/host1x.h>
15#include <linux/iova.h>
15#include <linux/of_gpio.h> 16#include <linux/of_gpio.h>
16 17
17#include <drm/drmP.h> 18#include <drm/drmP.h>
@@ -42,8 +43,15 @@ struct tegra_drm {
42 struct drm_device *drm; 43 struct drm_device *drm;
43 44
44 struct iommu_domain *domain; 45 struct iommu_domain *domain;
46 struct mutex mm_lock;
45 struct drm_mm mm; 47 struct drm_mm mm;
46 48
49 struct {
50 struct iova_domain domain;
51 unsigned long shift;
52 unsigned long limit;
53 } carveout;
54
47 struct mutex clients_lock; 55 struct mutex clients_lock;
48 struct list_head clients; 56 struct list_head clients;
49 57
@@ -67,7 +75,7 @@ struct tegra_drm_client;
67struct tegra_drm_context { 75struct tegra_drm_context {
68 struct tegra_drm_client *client; 76 struct tegra_drm_client *client;
69 struct host1x_channel *channel; 77 struct host1x_channel *channel;
70 struct list_head list; 78 unsigned int id;
71}; 79};
72 80
73struct tegra_drm_client_ops { 81struct tegra_drm_client_ops {
@@ -105,6 +113,10 @@ int tegra_drm_unregister_client(struct tegra_drm *tegra,
105int tegra_drm_init(struct tegra_drm *tegra, struct drm_device *drm); 113int tegra_drm_init(struct tegra_drm *tegra, struct drm_device *drm);
106int tegra_drm_exit(struct tegra_drm *tegra); 114int tegra_drm_exit(struct tegra_drm *tegra);
107 115
116void *tegra_drm_alloc(struct tegra_drm *tegra, size_t size, dma_addr_t *iova);
117void tegra_drm_free(struct tegra_drm *tegra, size_t size, void *virt,
118 dma_addr_t iova);
119
108struct tegra_dc_soc_info; 120struct tegra_dc_soc_info;
109struct tegra_output; 121struct tegra_output;
110 122
@@ -283,5 +295,6 @@ extern struct platform_driver tegra_dpaux_driver;
283extern struct platform_driver tegra_sor_driver; 295extern struct platform_driver tegra_sor_driver;
284extern struct platform_driver tegra_gr2d_driver; 296extern struct platform_driver tegra_gr2d_driver;
285extern struct platform_driver tegra_gr3d_driver; 297extern struct platform_driver tegra_gr3d_driver;
298extern struct platform_driver tegra_vic_driver;
286 299
287#endif /* HOST1X_DRM_H */ 300#endif /* HOST1X_DRM_H */
diff --git a/drivers/gpu/drm/tegra/falcon.c b/drivers/gpu/drm/tegra/falcon.c
new file mode 100644
index 000000000000..f685e72949d1
--- /dev/null
+++ b/drivers/gpu/drm/tegra/falcon.c
@@ -0,0 +1,259 @@
1/*
2 * Copyright (c) 2015, NVIDIA Corporation.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#include <linux/platform_device.h>
10#include <linux/dma-mapping.h>
11#include <linux/firmware.h>
12#include <linux/pci_ids.h>
13#include <linux/iopoll.h>
14
15#include "falcon.h"
16#include "drm.h"
17
18enum falcon_memory {
19 FALCON_MEMORY_IMEM,
20 FALCON_MEMORY_DATA,
21};
22
23static void falcon_writel(struct falcon *falcon, u32 value, u32 offset)
24{
25 writel(value, falcon->regs + offset);
26}
27
28int falcon_wait_idle(struct falcon *falcon)
29{
30 u32 value;
31
32 return readl_poll_timeout(falcon->regs + FALCON_IDLESTATE, value,
33 (value == 0), 10, 100000);
34}
35
36static int falcon_dma_wait_idle(struct falcon *falcon)
37{
38 u32 value;
39
40 return readl_poll_timeout(falcon->regs + FALCON_DMATRFCMD, value,
41 (value & FALCON_DMATRFCMD_IDLE), 10, 100000);
42}
43
44static int falcon_copy_chunk(struct falcon *falcon,
45 phys_addr_t base,
46 unsigned long offset,
47 enum falcon_memory target)
48{
49 u32 cmd = FALCON_DMATRFCMD_SIZE_256B;
50
51 if (target == FALCON_MEMORY_IMEM)
52 cmd |= FALCON_DMATRFCMD_IMEM;
53
54 falcon_writel(falcon, offset, FALCON_DMATRFMOFFS);
55 falcon_writel(falcon, base, FALCON_DMATRFFBOFFS);
56 falcon_writel(falcon, cmd, FALCON_DMATRFCMD);
57
58 return falcon_dma_wait_idle(falcon);
59}
60
61static void falcon_copy_firmware_image(struct falcon *falcon,
62 const struct firmware *firmware)
63{
64 u32 *firmware_vaddr = falcon->firmware.vaddr;
65 dma_addr_t daddr;
66 size_t i;
67 int err;
68
69 /* copy the whole thing taking into account endianness */
70 for (i = 0; i < firmware->size / sizeof(u32); i++)
71 firmware_vaddr[i] = le32_to_cpu(((u32 *)firmware->data)[i]);
72
73 /* ensure that caches are flushed and falcon can see the firmware */
74 daddr = dma_map_single(falcon->dev, firmware_vaddr,
75 falcon->firmware.size, DMA_TO_DEVICE);
76 err = dma_mapping_error(falcon->dev, daddr);
77 if (err) {
78 dev_err(falcon->dev, "failed to map firmware: %d\n", err);
79 return;
80 }
81 dma_sync_single_for_device(falcon->dev, daddr,
82 falcon->firmware.size, DMA_TO_DEVICE);
83 dma_unmap_single(falcon->dev, daddr, falcon->firmware.size,
84 DMA_TO_DEVICE);
85}
86
87static int falcon_parse_firmware_image(struct falcon *falcon)
88{
89 struct falcon_fw_bin_header_v1 *bin = (void *)falcon->firmware.vaddr;
90 struct falcon_fw_os_header_v1 *os;
91
92 /* endian problems would show up right here */
93 if (bin->magic != PCI_VENDOR_ID_NVIDIA) {
94 dev_err(falcon->dev, "incorrect firmware magic\n");
95 return -EINVAL;
96 }
97
98 /* currently only version 1 is supported */
99 if (bin->version != 1) {
100 dev_err(falcon->dev, "unsupported firmware version\n");
101 return -EINVAL;
102 }
103
104 /* check that the firmware size is consistent */
105 if (bin->size > falcon->firmware.size) {
106 dev_err(falcon->dev, "firmware image size inconsistency\n");
107 return -EINVAL;
108 }
109
110 os = falcon->firmware.vaddr + bin->os_header_offset;
111
112 falcon->firmware.bin_data.size = bin->os_size;
113 falcon->firmware.bin_data.offset = bin->os_data_offset;
114 falcon->firmware.code.offset = os->code_offset;
115 falcon->firmware.code.size = os->code_size;
116 falcon->firmware.data.offset = os->data_offset;
117 falcon->firmware.data.size = os->data_size;
118
119 return 0;
120}
121
122int falcon_read_firmware(struct falcon *falcon, const char *name)
123{
124 int err;
125
126 /* request_firmware prints error if it fails */
127 err = request_firmware(&falcon->firmware.firmware, name, falcon->dev);
128 if (err < 0)
129 return err;
130
131 return 0;
132}
133
134int falcon_load_firmware(struct falcon *falcon)
135{
136 const struct firmware *firmware = falcon->firmware.firmware;
137 int err;
138
139 falcon->firmware.size = firmware->size;
140
141 /* allocate iova space for the firmware */
142 falcon->firmware.vaddr = falcon->ops->alloc(falcon, firmware->size,
143 &falcon->firmware.paddr);
144 if (!falcon->firmware.vaddr) {
145 dev_err(falcon->dev, "dma memory mapping failed\n");
146 return -ENOMEM;
147 }
148
149 /* copy firmware image into local area. this also ensures endianness */
150 falcon_copy_firmware_image(falcon, firmware);
151
152 /* parse the image data */
153 err = falcon_parse_firmware_image(falcon);
154 if (err < 0) {
155 dev_err(falcon->dev, "failed to parse firmware image\n");
156 goto err_setup_firmware_image;
157 }
158
159 release_firmware(firmware);
160 falcon->firmware.firmware = NULL;
161
162 return 0;
163
164err_setup_firmware_image:
165 falcon->ops->free(falcon, falcon->firmware.size,
166 falcon->firmware.paddr, falcon->firmware.vaddr);
167
168 return err;
169}
170
171int falcon_init(struct falcon *falcon)
172{
173 /* check mandatory ops */
174 if (!falcon->ops || !falcon->ops->alloc || !falcon->ops->free)
175 return -EINVAL;
176
177 falcon->firmware.vaddr = NULL;
178
179 return 0;
180}
181
182void falcon_exit(struct falcon *falcon)
183{
184 if (falcon->firmware.firmware) {
185 release_firmware(falcon->firmware.firmware);
186 falcon->firmware.firmware = NULL;
187 }
188
189 if (falcon->firmware.vaddr) {
190 falcon->ops->free(falcon, falcon->firmware.size,
191 falcon->firmware.paddr,
192 falcon->firmware.vaddr);
193 falcon->firmware.vaddr = NULL;
194 }
195}
196
197int falcon_boot(struct falcon *falcon)
198{
199 unsigned long offset;
200 int err;
201
202 if (!falcon->firmware.vaddr)
203 return -EINVAL;
204
205 falcon_writel(falcon, 0, FALCON_DMACTL);
206
207 /* setup the address of the binary data so Falcon can access it later */
208 falcon_writel(falcon, (falcon->firmware.paddr +
209 falcon->firmware.bin_data.offset) >> 8,
210 FALCON_DMATRFBASE);
211
212 /* copy the data segment into Falcon internal memory */
213 for (offset = 0; offset < falcon->firmware.data.size; offset += 256)
214 falcon_copy_chunk(falcon,
215 falcon->firmware.data.offset + offset,
216 offset, FALCON_MEMORY_DATA);
217
218 /* copy the first code segment into Falcon internal memory */
219 falcon_copy_chunk(falcon, falcon->firmware.code.offset,
220 0, FALCON_MEMORY_IMEM);
221
222 /* setup falcon interrupts */
223 falcon_writel(falcon, FALCON_IRQMSET_EXT(0xff) |
224 FALCON_IRQMSET_SWGEN1 |
225 FALCON_IRQMSET_SWGEN0 |
226 FALCON_IRQMSET_EXTERR |
227 FALCON_IRQMSET_HALT |
228 FALCON_IRQMSET_WDTMR,
229 FALCON_IRQMSET);
230 falcon_writel(falcon, FALCON_IRQDEST_EXT(0xff) |
231 FALCON_IRQDEST_SWGEN1 |
232 FALCON_IRQDEST_SWGEN0 |
233 FALCON_IRQDEST_EXTERR |
234 FALCON_IRQDEST_HALT,
235 FALCON_IRQDEST);
236
237 /* enable interface */
238 falcon_writel(falcon, FALCON_ITFEN_MTHDEN |
239 FALCON_ITFEN_CTXEN,
240 FALCON_ITFEN);
241
242 /* boot falcon */
243 falcon_writel(falcon, 0x00000000, FALCON_BOOTVEC);
244 falcon_writel(falcon, FALCON_CPUCTL_STARTCPU, FALCON_CPUCTL);
245
246 err = falcon_wait_idle(falcon);
247 if (err < 0) {
248 dev_err(falcon->dev, "Falcon boot failed due to timeout\n");
249 return err;
250 }
251
252 return 0;
253}
254
255void falcon_execute_method(struct falcon *falcon, u32 method, u32 data)
256{
257 falcon_writel(falcon, method >> 2, FALCON_UCLASS_METHOD_OFFSET);
258 falcon_writel(falcon, data, FALCON_UCLASS_METHOD_DATA);
259}
diff --git a/drivers/gpu/drm/tegra/falcon.h b/drivers/gpu/drm/tegra/falcon.h
new file mode 100644
index 000000000000..4504ed5a199e
--- /dev/null
+++ b/drivers/gpu/drm/tegra/falcon.h
@@ -0,0 +1,127 @@
1/*
2 * Copyright (c) 2015, NVIDIA Corporation.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#ifndef _FALCON_H_
10#define _FALCON_H_
11
12#include <linux/types.h>
13
14#define FALCON_UCLASS_METHOD_OFFSET 0x00000040
15
16#define FALCON_UCLASS_METHOD_DATA 0x00000044
17
18#define FALCON_IRQMSET 0x00001010
19#define FALCON_IRQMSET_WDTMR (1 << 1)
20#define FALCON_IRQMSET_HALT (1 << 4)
21#define FALCON_IRQMSET_EXTERR (1 << 5)
22#define FALCON_IRQMSET_SWGEN0 (1 << 6)
23#define FALCON_IRQMSET_SWGEN1 (1 << 7)
24#define FALCON_IRQMSET_EXT(v) (((v) & 0xff) << 8)
25
26#define FALCON_IRQDEST 0x0000101c
27#define FALCON_IRQDEST_HALT (1 << 4)
28#define FALCON_IRQDEST_EXTERR (1 << 5)
29#define FALCON_IRQDEST_SWGEN0 (1 << 6)
30#define FALCON_IRQDEST_SWGEN1 (1 << 7)
31#define FALCON_IRQDEST_EXT(v) (((v) & 0xff) << 8)
32
33#define FALCON_ITFEN 0x00001048
34#define FALCON_ITFEN_CTXEN (1 << 0)
35#define FALCON_ITFEN_MTHDEN (1 << 1)
36
37#define FALCON_IDLESTATE 0x0000104c
38
39#define FALCON_CPUCTL 0x00001100
40#define FALCON_CPUCTL_STARTCPU (1 << 1)
41
42#define FALCON_BOOTVEC 0x00001104
43
44#define FALCON_DMACTL 0x0000110c
45#define FALCON_DMACTL_DMEM_SCRUBBING (1 << 1)
46#define FALCON_DMACTL_IMEM_SCRUBBING (1 << 2)
47
48#define FALCON_DMATRFBASE 0x00001110
49
50#define FALCON_DMATRFMOFFS 0x00001114
51
52#define FALCON_DMATRFCMD 0x00001118
53#define FALCON_DMATRFCMD_IDLE (1 << 1)
54#define FALCON_DMATRFCMD_IMEM (1 << 4)
55#define FALCON_DMATRFCMD_SIZE_256B (6 << 8)
56
57#define FALCON_DMATRFFBOFFS 0x0000111c
58
59struct falcon_fw_bin_header_v1 {
60 u32 magic; /* 0x10de */
61 u32 version; /* version of bin format (1) */
62 u32 size; /* entire image size including this header */
63 u32 os_header_offset;
64 u32 os_data_offset;
65 u32 os_size;
66};
67
68struct falcon_fw_os_app_v1 {
69 u32 offset;
70 u32 size;
71};
72
73struct falcon_fw_os_header_v1 {
74 u32 code_offset;
75 u32 code_size;
76 u32 data_offset;
77 u32 data_size;
78};
79
80struct falcon;
81
82struct falcon_ops {
83 void *(*alloc)(struct falcon *falcon, size_t size,
84 dma_addr_t *paddr);
85 void (*free)(struct falcon *falcon, size_t size,
86 dma_addr_t paddr, void *vaddr);
87};
88
89struct falcon_firmware_section {
90 unsigned long offset;
91 size_t size;
92};
93
94struct falcon_firmware {
95 /* Firmware after it is read but not loaded */
96 const struct firmware *firmware;
97
98 /* Raw firmware data */
99 dma_addr_t paddr;
100 void *vaddr;
101 size_t size;
102
103 /* Parsed firmware information */
104 struct falcon_firmware_section bin_data;
105 struct falcon_firmware_section data;
106 struct falcon_firmware_section code;
107};
108
109struct falcon {
110 /* Set by falcon client */
111 struct device *dev;
112 void __iomem *regs;
113 const struct falcon_ops *ops;
114 void *data;
115
116 struct falcon_firmware firmware;
117};
118
119int falcon_init(struct falcon *falcon);
120void falcon_exit(struct falcon *falcon);
121int falcon_read_firmware(struct falcon *falcon, const char *firmware_name);
122int falcon_load_firmware(struct falcon *falcon);
123int falcon_boot(struct falcon *falcon);
124void falcon_execute_method(struct falcon *falcon, u32 method, u32 data);
125int falcon_wait_idle(struct falcon *falcon);
126
127#endif /* _FALCON_H_ */
diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
index c61d67d16ce3..25acb73ee728 100644
--- a/drivers/gpu/drm/tegra/fb.c
+++ b/drivers/gpu/drm/tegra/fb.c
@@ -52,9 +52,26 @@ int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
52 struct tegra_bo_tiling *tiling) 52 struct tegra_bo_tiling *tiling)
53{ 53{
54 struct tegra_fb *fb = to_tegra_fb(framebuffer); 54 struct tegra_fb *fb = to_tegra_fb(framebuffer);
55 55 uint64_t modifier = fb->base.modifier;
56 /* TODO: handle YUV formats? */ 56
57 *tiling = fb->planes[0]->tiling; 57 switch (fourcc_mod_tegra_mod(modifier)) {
58 case NV_FORMAT_MOD_TEGRA_TILED:
59 tiling->mode = TEGRA_BO_TILING_MODE_TILED;
60 tiling->value = 0;
61 break;
62
63 case NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(0):
64 tiling->mode = TEGRA_BO_TILING_MODE_BLOCK;
65 tiling->value = fourcc_mod_tegra_param(modifier);
66 if (tiling->value > 5)
67 return -EINVAL;
68 break;
69
70 default:
71 /* TODO: handle YUV formats? */
72 *tiling = fb->planes[0]->tiling;
73 break;
74 }
58 75
59 return 0; 76 return 0;
60} 77}
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c
index 8672f5d2f237..424569b53e57 100644
--- a/drivers/gpu/drm/tegra/gem.c
+++ b/drivers/gpu/drm/tegra/gem.c
@@ -128,12 +128,14 @@ static int tegra_bo_iommu_map(struct tegra_drm *tegra, struct tegra_bo *bo)
128 if (!bo->mm) 128 if (!bo->mm)
129 return -ENOMEM; 129 return -ENOMEM;
130 130
131 mutex_lock(&tegra->mm_lock);
132
131 err = drm_mm_insert_node_generic(&tegra->mm, 133 err = drm_mm_insert_node_generic(&tegra->mm,
132 bo->mm, bo->gem.size, PAGE_SIZE, 0, 0); 134 bo->mm, bo->gem.size, PAGE_SIZE, 0, 0);
133 if (err < 0) { 135 if (err < 0) {
134 dev_err(tegra->drm->dev, "out of I/O virtual memory: %zd\n", 136 dev_err(tegra->drm->dev, "out of I/O virtual memory: %zd\n",
135 err); 137 err);
136 goto free; 138 goto unlock;
137 } 139 }
138 140
139 bo->paddr = bo->mm->start; 141 bo->paddr = bo->mm->start;
@@ -147,11 +149,14 @@ static int tegra_bo_iommu_map(struct tegra_drm *tegra, struct tegra_bo *bo)
147 149
148 bo->size = err; 150 bo->size = err;
149 151
152 mutex_unlock(&tegra->mm_lock);
153
150 return 0; 154 return 0;
151 155
152remove: 156remove:
153 drm_mm_remove_node(bo->mm); 157 drm_mm_remove_node(bo->mm);
154free: 158unlock:
159 mutex_unlock(&tegra->mm_lock);
155 kfree(bo->mm); 160 kfree(bo->mm);
156 return err; 161 return err;
157} 162}
@@ -161,8 +166,11 @@ static int tegra_bo_iommu_unmap(struct tegra_drm *tegra, struct tegra_bo *bo)
161 if (!bo->mm) 166 if (!bo->mm)
162 return 0; 167 return 0;
163 168
169 mutex_lock(&tegra->mm_lock);
164 iommu_unmap(tegra->domain, bo->paddr, bo->size); 170 iommu_unmap(tegra->domain, bo->paddr, bo->size);
165 drm_mm_remove_node(bo->mm); 171 drm_mm_remove_node(bo->mm);
172 mutex_unlock(&tegra->mm_lock);
173
166 kfree(bo->mm); 174 kfree(bo->mm);
167 175
168 return 0; 176 return 0;
diff --git a/drivers/gpu/drm/tegra/vic.c b/drivers/gpu/drm/tegra/vic.c
new file mode 100644
index 000000000000..cd804e404a11
--- /dev/null
+++ b/drivers/gpu/drm/tegra/vic.c
@@ -0,0 +1,396 @@
1/*
2 * Copyright (c) 2015, NVIDIA Corporation.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#include <linux/clk.h>
10#include <linux/host1x.h>
11#include <linux/iommu.h>
12#include <linux/module.h>
13#include <linux/of.h>
14#include <linux/of_device.h>
15#include <linux/of_platform.h>
16#include <linux/platform_device.h>
17#include <linux/pm_runtime.h>
18#include <linux/reset.h>
19
20#include <soc/tegra/pmc.h>
21
22#include "drm.h"
23#include "falcon.h"
24#include "vic.h"
25
26struct vic_config {
27 const char *firmware;
28};
29
30struct vic {
31 struct falcon falcon;
32 bool booted;
33
34 void __iomem *regs;
35 struct tegra_drm_client client;
36 struct host1x_channel *channel;
37 struct iommu_domain *domain;
38 struct device *dev;
39 struct clk *clk;
40
41 /* Platform configuration */
42 const struct vic_config *config;
43};
44
45static inline struct vic *to_vic(struct tegra_drm_client *client)
46{
47 return container_of(client, struct vic, client);
48}
49
50static void vic_writel(struct vic *vic, u32 value, unsigned int offset)
51{
52 writel(value, vic->regs + offset);
53}
54
55static int vic_runtime_resume(struct device *dev)
56{
57 struct vic *vic = dev_get_drvdata(dev);
58
59 return clk_prepare_enable(vic->clk);
60}
61
62static int vic_runtime_suspend(struct device *dev)
63{
64 struct vic *vic = dev_get_drvdata(dev);
65
66 clk_disable_unprepare(vic->clk);
67
68 vic->booted = false;
69
70 return 0;
71}
72
73static int vic_boot(struct vic *vic)
74{
75 u32 fce_ucode_size, fce_bin_data_offset;
76 void *hdr;
77 int err = 0;
78
79 if (vic->booted)
80 return 0;
81
82 /* setup clockgating registers */
83 vic_writel(vic, CG_IDLE_CG_DLY_CNT(4) |
84 CG_IDLE_CG_EN |
85 CG_WAKEUP_DLY_CNT(4),
86 NV_PVIC_MISC_PRI_VIC_CG);
87
88 err = falcon_boot(&vic->falcon);
89 if (err < 0)
90 return err;
91
92 hdr = vic->falcon.firmware.vaddr;
93 fce_bin_data_offset = *(u32 *)(hdr + VIC_UCODE_FCE_DATA_OFFSET);
94 hdr = vic->falcon.firmware.vaddr +
95 *(u32 *)(hdr + VIC_UCODE_FCE_HEADER_OFFSET);
96 fce_ucode_size = *(u32 *)(hdr + FCE_UCODE_SIZE_OFFSET);
97
98 falcon_execute_method(&vic->falcon, VIC_SET_APPLICATION_ID, 1);
99 falcon_execute_method(&vic->falcon, VIC_SET_FCE_UCODE_SIZE,
100 fce_ucode_size);
101 falcon_execute_method(&vic->falcon, VIC_SET_FCE_UCODE_OFFSET,
102 (vic->falcon.firmware.paddr + fce_bin_data_offset)
103 >> 8);
104
105 err = falcon_wait_idle(&vic->falcon);
106 if (err < 0) {
107 dev_err(vic->dev,
108 "failed to set application ID and FCE base\n");
109 return err;
110 }
111
112 vic->booted = true;
113
114 return 0;
115}
116
117static void *vic_falcon_alloc(struct falcon *falcon, size_t size,
118 dma_addr_t *iova)
119{
120 struct tegra_drm *tegra = falcon->data;
121
122 return tegra_drm_alloc(tegra, size, iova);
123}
124
125static void vic_falcon_free(struct falcon *falcon, size_t size,
126 dma_addr_t iova, void *va)
127{
128 struct tegra_drm *tegra = falcon->data;
129
130 return tegra_drm_free(tegra, size, va, iova);
131}
132
133static const struct falcon_ops vic_falcon_ops = {
134 .alloc = vic_falcon_alloc,
135 .free = vic_falcon_free
136};
137
138static int vic_init(struct host1x_client *client)
139{
140 struct tegra_drm_client *drm = host1x_to_drm_client(client);
141 struct drm_device *dev = dev_get_drvdata(client->parent);
142 struct tegra_drm *tegra = dev->dev_private;
143 struct vic *vic = to_vic(drm);
144 int err;
145
146 if (tegra->domain) {
147 err = iommu_attach_device(tegra->domain, vic->dev);
148 if (err < 0) {
149 dev_err(vic->dev, "failed to attach to domain: %d\n",
150 err);
151 return err;
152 }
153
154 vic->domain = tegra->domain;
155 }
156
157 if (!vic->falcon.data) {
158 vic->falcon.data = tegra;
159 err = falcon_load_firmware(&vic->falcon);
160 if (err < 0)
161 goto detach_device;
162 }
163
164 vic->channel = host1x_channel_request(client->dev);
165 if (!vic->channel) {
166 err = -ENOMEM;
167 goto detach_device;
168 }
169
170 client->syncpts[0] = host1x_syncpt_request(client->dev, 0);
171 if (!client->syncpts[0]) {
172 err = -ENOMEM;
173 goto free_channel;
174 }
175
176 err = tegra_drm_register_client(tegra, drm);
177 if (err < 0)
178 goto free_syncpt;
179
180 return 0;
181
182free_syncpt:
183 host1x_syncpt_free(client->syncpts[0]);
184free_channel:
185 host1x_channel_free(vic->channel);
186detach_device:
187 if (tegra->domain)
188 iommu_detach_device(tegra->domain, vic->dev);
189
190 return err;
191}
192
193static int vic_exit(struct host1x_client *client)
194{
195 struct tegra_drm_client *drm = host1x_to_drm_client(client);
196 struct drm_device *dev = dev_get_drvdata(client->parent);
197 struct tegra_drm *tegra = dev->dev_private;
198 struct vic *vic = to_vic(drm);
199 int err;
200
201 err = tegra_drm_unregister_client(tegra, drm);
202 if (err < 0)
203 return err;
204
205 host1x_syncpt_free(client->syncpts[0]);
206 host1x_channel_free(vic->channel);
207
208 if (vic->domain) {
209 iommu_detach_device(vic->domain, vic->dev);
210 vic->domain = NULL;
211 }
212
213 return 0;
214}
215
216static const struct host1x_client_ops vic_client_ops = {
217 .init = vic_init,
218 .exit = vic_exit,
219};
220
221static int vic_open_channel(struct tegra_drm_client *client,
222 struct tegra_drm_context *context)
223{
224 struct vic *vic = to_vic(client);
225 int err;
226
227 err = pm_runtime_get_sync(vic->dev);
228 if (err < 0)
229 return err;
230
231 err = vic_boot(vic);
232 if (err < 0) {
233 pm_runtime_put(vic->dev);
234 return err;
235 }
236
237 context->channel = host1x_channel_get(vic->channel);
238 if (!context->channel) {
239 pm_runtime_put(vic->dev);
240 return -ENOMEM;
241 }
242
243 return 0;
244}
245
246static void vic_close_channel(struct tegra_drm_context *context)
247{
248 struct vic *vic = to_vic(context->client);
249
250 host1x_channel_put(context->channel);
251
252 pm_runtime_put(vic->dev);
253}
254
255static const struct tegra_drm_client_ops vic_ops = {
256 .open_channel = vic_open_channel,
257 .close_channel = vic_close_channel,
258 .submit = tegra_drm_submit,
259};
260
261static const struct vic_config vic_t124_config = {
262 .firmware = "nvidia/tegra124/vic03_ucode.bin",
263};
264
265static const struct vic_config vic_t210_config = {
266 .firmware = "nvidia/tegra210/vic04_ucode.bin",
267};
268
269static const struct of_device_id vic_match[] = {
270 { .compatible = "nvidia,tegra124-vic", .data = &vic_t124_config },
271 { .compatible = "nvidia,tegra210-vic", .data = &vic_t210_config },
272 { },
273};
274
275static int vic_probe(struct platform_device *pdev)
276{
277 struct vic_config *vic_config = NULL;
278 struct device *dev = &pdev->dev;
279 struct host1x_syncpt **syncpts;
280 struct resource *regs;
281 const struct of_device_id *match;
282 struct vic *vic;
283 int err;
284
285 match = of_match_device(vic_match, dev);
286 vic_config = (struct vic_config *)match->data;
287
288 vic = devm_kzalloc(dev, sizeof(*vic), GFP_KERNEL);
289 if (!vic)
290 return -ENOMEM;
291
292 syncpts = devm_kzalloc(dev, sizeof(*syncpts), GFP_KERNEL);
293 if (!syncpts)
294 return -ENOMEM;
295
296 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
297 if (!regs) {
298 dev_err(&pdev->dev, "failed to get registers\n");
299 return -ENXIO;
300 }
301
302 vic->regs = devm_ioremap_resource(dev, regs);
303 if (IS_ERR(vic->regs))
304 return PTR_ERR(vic->regs);
305
306 vic->clk = devm_clk_get(dev, NULL);
307 if (IS_ERR(vic->clk)) {
308 dev_err(&pdev->dev, "failed to get clock\n");
309 return PTR_ERR(vic->clk);
310 }
311
312 vic->falcon.dev = dev;
313 vic->falcon.regs = vic->regs;
314 vic->falcon.ops = &vic_falcon_ops;
315
316 err = falcon_init(&vic->falcon);
317 if (err < 0)
318 return err;
319
320 err = falcon_read_firmware(&vic->falcon, vic_config->firmware);
321 if (err < 0)
322 goto exit_falcon;
323
324 platform_set_drvdata(pdev, vic);
325
326 INIT_LIST_HEAD(&vic->client.base.list);
327 vic->client.base.ops = &vic_client_ops;
328 vic->client.base.dev = dev;
329 vic->client.base.class = HOST1X_CLASS_VIC;
330 vic->client.base.syncpts = syncpts;
331 vic->client.base.num_syncpts = 1;
332 vic->dev = dev;
333 vic->config = vic_config;
334
335 INIT_LIST_HEAD(&vic->client.list);
336 vic->client.ops = &vic_ops;
337
338 err = host1x_client_register(&vic->client.base);
339 if (err < 0) {
340 dev_err(dev, "failed to register host1x client: %d\n", err);
341 platform_set_drvdata(pdev, NULL);
342 goto exit_falcon;
343 }
344
345 pm_runtime_enable(&pdev->dev);
346 if (!pm_runtime_enabled(&pdev->dev)) {
347 err = vic_runtime_resume(&pdev->dev);
348 if (err < 0)
349 goto unregister_client;
350 }
351
352 return 0;
353
354unregister_client:
355 host1x_client_unregister(&vic->client.base);
356exit_falcon:
357 falcon_exit(&vic->falcon);
358
359 return err;
360}
361
362static int vic_remove(struct platform_device *pdev)
363{
364 struct vic *vic = platform_get_drvdata(pdev);
365 int err;
366
367 err = host1x_client_unregister(&vic->client.base);
368 if (err < 0) {
369 dev_err(&pdev->dev, "failed to unregister host1x client: %d\n",
370 err);
371 return err;
372 }
373
374 if (pm_runtime_enabled(&pdev->dev))
375 pm_runtime_disable(&pdev->dev);
376 else
377 vic_runtime_suspend(&pdev->dev);
378
379 falcon_exit(&vic->falcon);
380
381 return 0;
382}
383
384static const struct dev_pm_ops vic_pm_ops = {
385 SET_RUNTIME_PM_OPS(vic_runtime_suspend, vic_runtime_resume, NULL)
386};
387
388struct platform_driver tegra_vic_driver = {
389 .driver = {
390 .name = "tegra-vic",
391 .of_match_table = vic_match,
392 .pm = &vic_pm_ops
393 },
394 .probe = vic_probe,
395 .remove = vic_remove,
396};
diff --git a/drivers/gpu/drm/tegra/vic.h b/drivers/gpu/drm/tegra/vic.h
new file mode 100644
index 000000000000..21844817a7e1
--- /dev/null
+++ b/drivers/gpu/drm/tegra/vic.h
@@ -0,0 +1,31 @@
1/*
2 * Copyright (c) 2015, NVIDIA Corporation.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#ifndef TEGRA_VIC_H
10#define TEGRA_VIC_H
11
12/* VIC methods */
13
14#define VIC_SET_APPLICATION_ID 0x00000200
15#define VIC_SET_FCE_UCODE_SIZE 0x0000071C
16#define VIC_SET_FCE_UCODE_OFFSET 0x0000072C
17
18/* VIC registers */
19
20#define NV_PVIC_MISC_PRI_VIC_CG 0x000016d0
21#define CG_IDLE_CG_DLY_CNT(val) ((val & 0x3f) << 0)
22#define CG_IDLE_CG_EN (1 << 6)
23#define CG_WAKEUP_DLY_CNT(val) ((val & 0xf) << 16)
24
25/* Firmware offsets */
26
27#define VIC_UCODE_FCE_HEADER_OFFSET (6*4)
28#define VIC_UCODE_FCE_DATA_OFFSET (7*4)
29#define FCE_UCODE_SIZE_OFFSET (2*4)
30
31#endif /* TEGRA_VIC_H */
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index e44626a2e698..a6d7fcb99c0b 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -1394,7 +1394,7 @@ EXPORT_SYMBOL(ttm_bo_evict_mm);
1394int ttm_bo_init_mm(struct ttm_bo_device *bdev, unsigned type, 1394int ttm_bo_init_mm(struct ttm_bo_device *bdev, unsigned type,
1395 unsigned long p_size) 1395 unsigned long p_size)
1396{ 1396{
1397 int ret = -EINVAL; 1397 int ret;
1398 struct ttm_mem_type_manager *man; 1398 struct ttm_mem_type_manager *man;
1399 unsigned i; 1399 unsigned i;
1400 1400
@@ -1412,7 +1412,6 @@ int ttm_bo_init_mm(struct ttm_bo_device *bdev, unsigned type,
1412 return ret; 1412 return ret;
1413 man->bdev = bdev; 1413 man->bdev = bdev;
1414 1414
1415 ret = 0;
1416 if (type != TTM_PL_SYSTEM) { 1415 if (type != TTM_PL_SYSTEM) {
1417 ret = (*man->func->init)(man, p_size); 1416 ret = (*man->func->init)(man, p_size);
1418 if (ret) 1417 if (ret)
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index a37de5db5731..eeddc1e48409 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -51,6 +51,9 @@
51#if IS_ENABLED(CONFIG_AGP) 51#if IS_ENABLED(CONFIG_AGP)
52#include <asm/agp.h> 52#include <asm/agp.h>
53#endif 53#endif
54#ifdef CONFIG_X86
55#include <asm/set_memory.h>
56#endif
54 57
55#define NUM_PAGES_TO_ALLOC (PAGE_SIZE/sizeof(struct page *)) 58#define NUM_PAGES_TO_ALLOC (PAGE_SIZE/sizeof(struct page *))
56#define SMALL_ALLOCATION 16 59#define SMALL_ALLOCATION 16
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
index cec4b4baa179..90ddbdca93bd 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
@@ -53,6 +53,9 @@
53#if IS_ENABLED(CONFIG_AGP) 53#if IS_ENABLED(CONFIG_AGP)
54#include <asm/agp.h> 54#include <asm/agp.h>
55#endif 55#endif
56#ifdef CONFIG_X86
57#include <asm/set_memory.h>
58#endif
56 59
57#define NUM_PAGES_TO_ALLOC (PAGE_SIZE/sizeof(struct page *)) 60#define NUM_PAGES_TO_ALLOC (PAGE_SIZE/sizeof(struct page *))
58#define SMALL_ALLOCATION 4 61#define SMALL_ALLOCATION 4
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index aee3c00f836e..5260179d788a 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -44,6 +44,9 @@
44#include <drm/ttm/ttm_bo_driver.h> 44#include <drm/ttm/ttm_bo_driver.h>
45#include <drm/ttm/ttm_placement.h> 45#include <drm/ttm/ttm_placement.h>
46#include <drm/ttm/ttm_page_alloc.h> 46#include <drm/ttm/ttm_page_alloc.h>
47#ifdef CONFIG_X86
48#include <asm/set_memory.h>
49#endif
47 50
48/** 51/**
49 * Allocates storage for pointers to the pages that back the ttm. 52 * Allocates storage for pointers to the pages that back the ttm.
diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
index d05abc69e305..4a6500362564 100644
--- a/drivers/gpu/drm/udl/udl_fb.c
+++ b/drivers/gpu/drm/udl/udl_fb.c
@@ -37,7 +37,7 @@ struct udl_fbdev {
37}; 37};
38 38
39#define DL_ALIGN_UP(x, a) ALIGN(x, a) 39#define DL_ALIGN_UP(x, a) ALIGN(x, a)
40#define DL_ALIGN_DOWN(x, a) ALIGN(x-(a-1), a) 40#define DL_ALIGN_DOWN(x, a) ALIGN_DOWN(x, a)
41 41
42/** Read the red component (0..255) of a 32 bpp colour. */ 42/** Read the red component (0..255) of a 32 bpp colour. */
43#define DLO_RGB_GETRED(col) (uint8_t)((col) & 0xFF) 43#define DLO_RGB_GETRED(col) (uint8_t)((col) & 0xFF)
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 491866865c33..1e1c90b30d4a 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -175,8 +175,7 @@ int virtio_gpu_driver_load(struct drm_device *dev, unsigned long flags)
175 DRM_INFO("virgl 3d acceleration not supported by guest\n"); 175 DRM_INFO("virgl 3d acceleration not supported by guest\n");
176#endif 176#endif
177 177
178 ret = vgdev->vdev->config->find_vqs(vgdev->vdev, 2, vqs, 178 ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
179 callbacks, names, NULL);
180 if (ret) { 179 if (ret) {
181 DRM_ERROR("failed to find virt queues\n"); 180 DRM_ERROR("failed to find virt queues\n");
182 goto err_vqs; 181 goto err_vqs;