diff options
author | Sean Paul <seanpaul@chromium.org> | 2017-05-18 09:24:30 -0400 |
---|---|---|
committer | Sean Paul <seanpaul@chromium.org> | 2017-05-18 09:24:30 -0400 |
commit | 6b7781b42dc9bc9bcd1523b6c24b876cdda0bef3 (patch) | |
tree | ee55c67e4ea30b9eb44f301ba0bde2e631a26162 /drivers/gpu/drm/amd | |
parent | 52d9d38c183bf0e09601d875ea31bb53c05dd8cf (diff) | |
parent | e98c58e55f68f8785aebfab1f8c9a03d8de0afe1 (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/amd')
86 files changed, 2282 insertions, 2011 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; | |||
110 | extern int amdgpu_cntl_sb_buf_per_se; | 110 | extern int amdgpu_cntl_sb_buf_per_se; |
111 | extern int amdgpu_param_buf_per_se; | 111 | extern 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 { | |||
980 | struct amdgpu_cu_info { | 983 | struct 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 | ||
1002 | enum { | 1006 | enum { |
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 | ||
91 | void 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 | |||
84 | int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev) | 104 | int 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) | |||
28 | void amdgpu_atomfirmware_scratch_regs_init(struct amdgpu_device *adev); | 28 | void amdgpu_atomfirmware_scratch_regs_init(struct amdgpu_device *adev); |
29 | void amdgpu_atomfirmware_scratch_regs_save(struct amdgpu_device *adev); | 29 | void amdgpu_atomfirmware_scratch_regs_save(struct amdgpu_device *adev); |
30 | void amdgpu_atomfirmware_scratch_regs_restore(struct amdgpu_device *adev); | 30 | void amdgpu_atomfirmware_scratch_regs_restore(struct amdgpu_device *adev); |
31 | void amdgpu_atomfirmware_scratch_regs_engine_hung(struct amdgpu_device *adev, | ||
32 | bool hung); | ||
31 | int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev); | 33 | int 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 | ||
119 | out_cleanup: | 119 | out_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 | ||
142 | void amdgpu_benchmark(struct amdgpu_device *adev, int test_number) | 143 | void 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 | ||
45 | static 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 | |||
76 | static 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 | |||
105 | static 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 | |||
121 | static int amdgpu_cgs_alloc_gpu_mem(struct cgs_device *cgs_device, | 45 | static 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 | ||
352 | static 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 | |||
362 | static 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 | |||
372 | static 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 | |||
383 | static 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 | |||
391 | static 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 | |||
399 | static 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 | |||
408 | static int amdgpu_cgs_get_pci_resource(struct cgs_device *cgs_device, | 276 | static 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 | ||
480 | static int amdgpu_cgs_create_pm_request(struct cgs_device *cgs_device, cgs_handle_t *request) | ||
481 | { | ||
482 | /* TODO */ | ||
483 | return 0; | ||
484 | } | ||
485 | |||
486 | static int amdgpu_cgs_destroy_pm_request(struct cgs_device *cgs_device, cgs_handle_t request) | ||
487 | { | ||
488 | /* TODO */ | ||
489 | return 0; | ||
490 | } | ||
491 | |||
492 | static 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 | |||
499 | static 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 | |||
506 | static 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 | |||
515 | static 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 | |||
523 | static 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 | |||
530 | struct cgs_irq_params { | 348 | struct 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 | ||
1271 | static const struct cgs_ops amdgpu_cgs_ops = { | 1089 | static 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; | ||
1133 | out: | 1137 | out: |
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 | ||
58 | static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev); | 57 | static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev); |
59 | static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev); | 58 | static 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 | |||
2309 | unlock: | ||
2310 | if (fbcon) | ||
2319 | console_unlock(); | 2311 | console_unlock(); |
2320 | } | ||
2321 | 2312 | ||
2322 | return 0; | 2313 | return r; |
2323 | } | 2314 | } |
2324 | 2315 | ||
2325 | static bool amdgpu_check_soft_reset(struct amdgpu_device *adev) | 2316 | static 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 | } |
2449 | err: | 2452 | err: |
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 | 141 | int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc, | |
142 | static 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 | |||
154 | static 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 | |||
161 | static 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 | |||
169 | void 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 | |||
180 | int 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 | |||
269 | pflip_cleanup: | ||
270 | amdgpu_crtc_cleanup_flip_ctx(work, new_abo); | ||
271 | return r; | ||
272 | |||
273 | unpin: | ||
274 | amdgpu_flip_cleanup_unpin(work, new_abo); | ||
275 | return r; | ||
276 | |||
277 | unreserve: | ||
278 | amdgpu_flip_cleanup_unreserve(work, new_abo); | ||
279 | return r; | ||
280 | 220 | ||
281 | cleanup: | ||
282 | amdgpu_flip_work_cleanup(work); | ||
283 | return r; | ||
284 | |||
285 | } | ||
286 | |||
287 | void 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 | |||
310 | int 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, | 233 | pflip_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, | 238 | unpin: |
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 | } |
242 | unreserve: | ||
243 | amdgpu_bo_unreserve(new_abo); | ||
330 | 244 | ||
331 | amdgpu_crtc_submit_flip(crtc, fb, work, new_abo); | 245 | cleanup: |
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 | ||
336 | int amdgpu_crtc_set_config(struct drm_mode_set *set, | 256 | int 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 | ||
71 | int amdgpu_vram_limit = 0; | 73 | int 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 | ||
142 | static 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 | |||
155 | static 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 | |||
142 | void amdgpu_gem_object_close(struct drm_gem_object *obj, | 171 | void 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 | ||
505 | static 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 | ||
137 | void 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); |
603 | void amdgpu_crtc_cleanup_flip_ctx(struct amdgpu_flip_work *work, | ||
604 | struct amdgpu_bo *new_abo); | ||
605 | int 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 | |||
613 | void 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 | |||
618 | extern const struct drm_mode_config_funcs amdgpu_mode_funcs; | 603 | extern 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 | ||
546 | int 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 | |||
556 | retry: | ||
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 | |||
546 | int amdgpu_bo_restore_from_shadow(struct amdgpu_device *adev, | 567 | int 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); |
178 | int amdgpu_bo_validate(struct amdgpu_bo *bo); | ||
178 | int amdgpu_bo_restore_from_shadow(struct amdgpu_device *adev, | 179 | int 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 | ||
874 | static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev, | 873 | static 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, | |||
152 | static int psp_tmr_init(struct psp_context *psp) | 154 | static 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 | |||
172 | static 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 | ||
185 | failed_mem: | ||
186 | amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf); | ||
187 | failed: | 192 | failed: |
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 | ||
206 | static int psp_asd_load(struct psp_context *psp) | 211 | static 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 | */ | 228 | static 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 | |||
254 | failed_mem1: | ||
255 | amdgpu_bo_free_kernel(&asd_bo, &asd_mc_addr, &asd_buf); | ||
256 | failed_mem: | ||
257 | amdgpu_bo_free_kernel(&asd_shared_bo, &asd_shared_mc_addr, &asd_shared_buf); | ||
258 | failed: | ||
259 | kfree(cmd); | ||
260 | return ret; | 248 | return ret; |
261 | } | 249 | } |
262 | 250 | ||
263 | static int psp_load_fw(struct amdgpu_device *adev) | 251 | static 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 | |||
278 | static 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 | |||
318 | static 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) | |||
336 | failed_mem: | 372 | failed_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); |
375 | failed_mem1: | ||
376 | amdgpu_bo_free_kernel(&psp->fw_pri_bo, | ||
377 | &psp->fw_pri_mc_addr, &psp->fw_pri_buf); | ||
339 | failed: | 378 | failed: |
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 | |||
472 | failed: | ||
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 | ||
36 | enum psp_ring_type | 36 | enum 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 | ||
192 | TRACE_EVENT(amdgpu_vm_grab_id, | 192 | TRACE_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 | ||
215 | TRACE_EVENT(amdgpu_vm_bo_map, | 218 | TRACE_EVENT(amdgpu_vm_bo_map, |
@@ -331,21 +334,25 @@ TRACE_EVENT(amdgpu_vm_copy_ptes, | |||
331 | ); | 334 | ); |
332 | 335 | ||
333 | TRACE_EVENT(amdgpu_vm_flush, | 336 | TRACE_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 | ||
351 | TRACE_EVENT(amdgpu_bo_list_set, | 358 | TRACE_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, | |||
1038 | static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo, | 1040 | static 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 | ||
1414 | extern void amdgpu_gtt_mgr_print(struct seq_file *m, struct ttm_mem_type_manager | ||
1415 | *man); | ||
1404 | static int amdgpu_mm_dump_table(struct seq_file *m, void *data) | 1416 | static 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 | */ | ||
235 | int 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 | */ | ||
264 | void 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); | |||
98 | int amdgpu_virt_release_full_gpu(struct amdgpu_device *adev, bool init); | 98 | int amdgpu_virt_release_full_gpu(struct amdgpu_device *adev, bool init); |
99 | int amdgpu_virt_reset_gpu(struct amdgpu_device *adev); | 99 | int amdgpu_virt_reset_gpu(struct amdgpu_device *adev); |
100 | int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary); | 100 | int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, bool voluntary); |
101 | int amdgpu_virt_alloc_mm_table(struct amdgpu_device *adev); | ||
102 | void 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; | 527 | needs_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 | |||
532 | no_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 | ||
540 | error: | 538 | error: |
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) | |||
590 | int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job) | 588 | int 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 | */ |
669 | void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id) | 669 | void 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 | */ |
2242 | void amdgpu_vm_manager_init(struct amdgpu_device *adev) | 2249 | void 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 | */ |
2274 | void amdgpu_vm_manager_fini(struct amdgpu_device *adev) | 2287 | void 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 | ||
150 | struct 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 | |||
152 | struct amdgpu_vm_manager { | 157 | struct 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); |
202 | int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job); | 204 | int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job); |
203 | void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id); | 205 | void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vmhub, |
206 | unsigned vmid); | ||
204 | int amdgpu_vm_update_directories(struct amdgpu_device *adev, | 207 | int amdgpu_vm_update_directories(struct amdgpu_device *adev, |
205 | struct amdgpu_vm *vm); | 208 | struct amdgpu_vm *vm); |
206 | int amdgpu_vm_clear_freed(struct amdgpu_device *adev, | 209 | int 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 | ||
1268 | static void ci_dpm_set_fan_control_mode(struct amdgpu_device *adev, u32 mode) | 1268 | static 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 | ||
1284 | static u32 ci_dpm_get_fan_control_mode(struct amdgpu_device *adev) | 1289 | static 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, | |||
2589 | unpin: | 2589 | unpin: |
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, | |||
2609 | unpin: | 2609 | unpin: |
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, | |||
1957 | unpin: | 1962 | unpin: |
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, | |||
2440 | unpin: | 2440 | unpin: |
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 | ||
1580 | static void gfx_v6_0_config_init(struct amdgpu_device *adev) | 1580 | static 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 | ||
1585 | static void gfx_v6_0_gpu_init(struct amdgpu_device *adev) | 1585 | static 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 | ||
45 | MODULE_FIRMWARE("amdgpu/vega10_ce.bin"); | 44 | MODULE_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 | ||
706 | static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address) | 703 | static 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 | ||
716 | static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd, | 713 | static 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 | ||
731 | static void gfx_v9_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields) | 728 | static 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 | ||
1209 | static u32 gfx_v9_0_create_bitmask(u32 bit_width) | 1211 | static 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) | |||
1366 | static void gfx_v9_0_enable_gui_idle_interrupt(struct amdgpu_device *adev, | 1368 | static 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 | ||
1382 | void gfx_v9_0_rlc_stop(struct amdgpu_device *adev) | 1384 | void 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) | |||
1487 | static void gfx_v9_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable) | 1489 | static 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 | ||
1834 | static void gfx_v9_0_kiq_enable(struct amdgpu_ring *ring) | 1836 | static 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) | |||
2956 | static void gfx_v9_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | 2966 | static 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) | |||
3612 | static void gfx_v9_0_set_gds_init(struct amdgpu_device *adev) | 3615 | static 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) | |||
386 | static int gmc_v9_0_late_init(void *handle) | 386 | static 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 | ||
87 | static 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 | |||
97 | static 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 | |||
109 | static 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 | |||
300 | int psp_v3_1_ring_init(struct psp_context *psp, enum psp_ring_type ring_type) | 268 | int 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 | |||
293 | int 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 | ||
324 | int 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 | |||
347 | int psp_v3_1_cmd_submit(struct psp_context *psp, | 351 | int 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); |
40 | extern int psp_v3_1_ring_init(struct psp_context *psp, | 40 | extern int psp_v3_1_ring_init(struct psp_context *psp, |
41 | enum psp_ring_type ring_type); | 41 | enum psp_ring_type ring_type); |
42 | extern int psp_v3_1_ring_create(struct psp_context *psp, | ||
43 | enum psp_ring_type ring_type); | ||
44 | extern int psp_v3_1_ring_destroy(struct psp_context *psp, | ||
45 | enum psp_ring_type ring_type); | ||
42 | extern int psp_v3_1_cmd_submit(struct psp_context *psp, | 46 | extern 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); | |||
48 | static void sdma_v4_0_set_vm_pte_funcs(struct amdgpu_device *adev); | 48 | static void sdma_v4_0_set_vm_pte_funcs(struct amdgpu_device *adev); |
49 | static void sdma_v4_0_set_irq_funcs(struct amdgpu_device *adev); | 49 | static void sdma_v4_0_set_irq_funcs(struct amdgpu_device *adev); |
50 | 50 | ||
51 | static const u32 golden_settings_sdma_4[] = | 51 | static 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 | ||
79 | static const u32 golden_settings_sdma_vg10[] = | 78 | static 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[] = | |||
87 | static u32 sdma_v4_0_get_reg_offset(u32 instance, u32 internal_offset) | 85 | static 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 | } |
193 | out: | 193 | out: |
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 | */ |
213 | static uint64_t sdma_v4_0_ring_get_rptr(struct amdgpu_ring *ring) | 211 | static 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) | |||
231 | static uint64_t sdma_v4_0_ring_get_wptr(struct amdgpu_ring *ring) | 229 | static 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 | */ |
321 | static void sdma_v4_0_ring_emit_ib(struct amdgpu_ring *ring, | 321 | static 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 | } |
884 | err1: | 879 | err1: |
885 | amdgpu_ib_free(adev, &ib, NULL); | 880 | amdgpu_ib_free(adev, &ib, NULL); |
886 | dma_fence_put(f); | 881 | dma_fence_put(f); |
887 | err0: | 882 | err0: |
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) | |||
1039 | static void sdma_v4_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | 1034 | static 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 | ||
1082 | static int sdma_v4_0_early_init(void *handle) | 1073 | static 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) | |||
1211 | static int sdma_v4_0_wait_for_idle(void *handle) | 1202 | static 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 | ||
1609 | const struct amdgpu_ip_block_version sdma_v4_0_ip_block = | 1602 | const 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 | ||
406 | static int soc15_asic_reset(struct amdgpu_device *adev) | 406 | static 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); | |||
41 | static void uvd_v7_0_set_irq_funcs(struct amdgpu_device *adev); | 45 | static void uvd_v7_0_set_irq_funcs(struct amdgpu_device *adev); |
42 | static int uvd_v7_0_start(struct amdgpu_device *adev); | 46 | static int uvd_v7_0_start(struct amdgpu_device *adev); |
43 | static void uvd_v7_0_stop(struct amdgpu_device *adev); | 47 | static void uvd_v7_0_stop(struct amdgpu_device *adev); |
48 | static 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 | ||
656 | static 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 | |||
703 | static 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, | |||
1034 | static void uvd_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | 1304 | static 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 | ||
1075 | static void uvd_v7_0_enc_ring_insert_end(struct amdgpu_ring *ring) | 1341 | static 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) | |||
1080 | static void uvd_v7_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring, | 1346 | static 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); | |||
49 | static void vce_v4_0_set_ring_funcs(struct amdgpu_device *adev); | 49 | static void vce_v4_0_set_ring_funcs(struct amdgpu_device *adev); |
50 | static void vce_v4_0_set_irq_funcs(struct amdgpu_device *adev); | 50 | static void vce_v4_0_set_irq_funcs(struct amdgpu_device *adev); |
51 | 51 | ||
52 | static 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 | |||
62 | static 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 | |||
74 | static 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) | |||
973 | static void vce_v4_0_emit_vm_flush(struct amdgpu_ring *ring, | 915 | static 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 | ||
1016 | static int vce_v4_0_set_interrupt_state(struct amdgpu_device *adev, | 951 | static 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 | ||
141 | enum 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 | */ | ||
59 | enum 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 | */ |
73 | enum cgs_engine { | 59 | enum 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 | */ | ||
87 | enum 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 | */ | ||
154 | struct 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 | */ |
163 | struct cgs_firmware_info { | 129 | struct 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 | */ | ||
242 | typedef 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 | */ | ||
258 | typedef 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 | */ | ||
269 | typedef 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 | */ | ||
401 | typedef 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 | */ | ||
410 | typedef 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 | */ | ||
419 | typedef 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 | */ | ||
428 | typedef 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 | */ | ||
437 | typedef 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 | */ | ||
446 | typedef 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 | */ | ||
510 | typedef 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 | */ | ||
519 | typedef 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 | */ | ||
535 | typedef 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 | */ | ||
547 | typedef 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 | */ | ||
559 | typedef 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 | */ | ||
570 | typedef 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 | */ | ||
582 | typedef 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 | ||
628 | struct cgs_ops { | 409 | struct 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 | ||
221 | const pem_event_action disable_smc_firmware_ctf_tasks[] = { | 221 | const 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 | ||
176 | int 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 | |||
176 | int pem_task_setup_asic(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data) | 181 | int 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 */ |
85 | int pem_task_initialize_thermal_controller(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data); | 85 | int pem_task_initialize_thermal_controller(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data); |
86 | int pem_task_uninitialize_thermal_controller(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data); | 86 | int pem_task_uninitialize_thermal_controller(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data); |
87 | int 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 | |||
505 | int 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 | |||
391 | int 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 { | |||
69 | struct pp_atomfwctrl_avfs_parameters { | 69 | struct 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 | |||
123 | struct 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 | |||
122 | int pp_atomfwctrl_get_gpu_pll_dividers_vega10(struct pp_hwmgr *hwmgr, | 134 | int 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, | |||
136 | int pp_atomfwctrl_get_gpio_information(struct pp_hwmgr *hwmgr, | 148 | int 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 | ||
151 | int 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 | ||
4335 | static int smu7_set_fan_control_mode(struct pp_hwmgr *hwmgr, uint32_t mode) | 4335 | static 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 | ||
4350 | static int smu7_get_fan_control_mode(struct pp_hwmgr *hwmgr) | 4359 | static 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 | ||
4359 | static int smu7_get_sclk_od(struct pp_hwmgr *hwmgr) | 4364 | static 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 | ||
4525 | static 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 | |||
4539 | static 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 | |||
4551 | static void smu7_find_min_clock_masks(struct pp_hwmgr *hwmgr, | 4530 | static 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 | ||
4700 | uint8_t smu7_get_sleep_divider_id_from_clock(uint32_t clock, | 4678 | uint8_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 | */ |
113 | int smu7_fan_ctrl_set_static_mode(struct pp_hwmgr *hwmgr, uint32_t mode) | 113 | int 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 | ||
152 | static int smu7_fan_ctrl_start_smc_fan_control(struct pp_hwmgr *hwmgr) | 151 | int 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 | ||
187 | int smu7_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr) | 187 | int 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 | |||
54 | extern int smu7_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr); | 54 | extern int smu7_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr); |
55 | extern int smu7_thermal_enable_alert(struct pp_hwmgr *hwmgr); | 55 | extern int smu7_thermal_enable_alert(struct pp_hwmgr *hwmgr); |
56 | extern int smu7_thermal_disable_alert(struct pp_hwmgr *hwmgr); | 56 | extern int smu7_thermal_disable_alert(struct pp_hwmgr *hwmgr); |
57 | 57 | extern 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 | ||
2446 | static 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 | |||
2460 | static int vega10_enable_vrhot_feature(struct pp_hwmgr *hwmgr) | 2466 | static 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 | ||
2544 | static 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 | ||
3881 | static int vega10_set_fan_control_mode(struct pp_hwmgr *hwmgr, uint32_t mode) | 3922 | static 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 | ||
3896 | static int vega10_get_fan_control_mode(struct pp_hwmgr *hwmgr) | 3946 | static 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 | ||
3911 | static int vega10_get_dal_power_level(struct pp_hwmgr *hwmgr, | 3956 | static 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 | ||
4444 | static 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 | |||
4472 | static 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 | |||
4398 | static const struct pp_hwmgr_func vega10_hwmgr_funcs = { | 4487 | static 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 | ||
4444 | int vega10_hwmgr_init(struct pp_hwmgr *hwmgr) | 4536 | int 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 | ||
179 | struct vega10_vbios_boot_state { | 179 | struct 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 | ||
116 | int 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 | |||
116 | static int vega10_set_overdrive_target_percentage(struct pp_hwmgr *hwmgr, | 139 | static 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); | |||
60 | int vega10_enable_power_containment(struct pp_hwmgr *hwmgr); | 60 | int vega10_enable_power_containment(struct pp_hwmgr *hwmgr); |
61 | int vega10_set_power_limit(struct pp_hwmgr *hwmgr, uint32_t n); | 61 | int vega10_set_power_limit(struct pp_hwmgr *hwmgr, uint32_t n); |
62 | int vega10_power_control_set_level(struct pp_hwmgr *hwmgr); | 62 | int vega10_power_control_set_level(struct pp_hwmgr *hwmgr); |
63 | int 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) | |||
482 | static int vega10_thermal_enable_alert(struct pp_hwmgr *hwmgr) | 483 | static 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 | */ |
504 | static int vega10_thermal_disable_alert(struct pp_hwmgr *hwmgr) | 515 | int 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); |
79 | extern int vega10_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr); | 79 | extern int vega10_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr); |
80 | extern uint32_t smu7_get_xclk(struct pp_hwmgr *hwmgr); | 80 | extern uint32_t smu7_get_xclk(struct pp_hwmgr *hwmgr); |
81 | extern int vega10_thermal_disable_alert(struct pp_hwmgr *hwmgr); | ||
82 | int 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 | ||
433 | extern int phm_get_max_high_clocks(struct pp_hwmgr *hwmgr, struct amd_pp_simple_clock_info *clocks); | 433 | extern int phm_get_max_high_clocks(struct pp_hwmgr *hwmgr, struct amd_pp_simple_clock_info *clocks); |
434 | 434 | extern 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 | ||
378 | struct pp_table_func { | 377 | struct 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 | ||
127 | typedef int PPSMC_Msg; | 130 | typedef 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 | */ |
83 | static uint32_t vega10_wait_for_response(struct pp_smumgr *smumgr) | 83 | static 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 | */ | ||
106 | int vega10_send_msg_to_smc_without_waiting(struct pp_smumgr *smumgr, | 105 | int 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 | */ | ||
128 | int vega10_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg) | 126 | int 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 | */ |
157 | int vega10_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr, | 154 | int 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 | */ | ||
193 | int vega10_send_msg_to_smc_with_parameter_without_waiting( | 188 | int 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 | */ | ||
212 | int vega10_read_arg_from_smc(struct pp_smumgr *smumgr, uint32_t *arg) | 206 | int 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 | */ |
229 | int vega10_copy_table_from_smc(struct pp_smumgr *smumgr, | 223 | int 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 | */ |
267 | int vega10_copy_table_to_smc(struct pp_smumgr *smumgr, | 261 | int 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 | ||
302 | int 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, | |||
339 | int vega10_get_smc_features(struct pp_smumgr *smumgr, | 324 | int 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 | ||
351 | int vega10_set_tools_address(struct pp_smumgr *smumgr) | 339 | int 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 | */ | ||
394 | static int vega10_smu_init(struct pp_smumgr *smumgr) | 377 | static 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); |
63 | int vega10_save_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table); | 64 | int vega10_save_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table); |
64 | int vega10_restore_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table); | 65 | int vega10_restore_vft_table(struct pp_smumgr *smumgr, uint8_t *avfs_table); |
65 | int vega10_perform_btc(struct pp_smumgr *smumgr); | ||
66 | 66 | ||
67 | int vega10_set_tools_address(struct pp_smumgr *smumgr); | 67 | int 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 | ||
239 | bool 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 | |||
239 | static bool amd_sched_entity_add_dependency_cb(struct amd_sched_entity *entity) | 256 | static 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); |
159 | void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched); | 159 | void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched); |
160 | void amd_sched_job_recovery(struct amd_gpu_scheduler *sched); | 160 | void amd_sched_job_recovery(struct amd_gpu_scheduler *sched); |
161 | bool amd_sched_dependency_optimized(struct dma_fence* fence, | ||
162 | struct amd_sched_entity *entity); | ||
161 | #endif | 163 | #endif |