diff options
author | Dave Airlie <airlied@redhat.com> | 2017-04-06 15:41:42 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-04-06 15:49:12 -0400 |
commit | 0168778115687486575a6831df865dbc4f5369fe (patch) | |
tree | 29a3f1e3348f1ddbc9924611fa0cad738507ba64 | |
parent | aed93ee7d03eac9b7d21f08aebe8a7d9ea069e20 (diff) | |
parent | f4e7c7c1b4ed4c28caf679bc94ca5aa096310c10 (diff) |
Merge branch 'drm-next-4.12' of git://people.freedesktop.org/~agd5f/linux into drm-next
A few more things for 4.12:
- ttm and amdgpu support for non-contiguous vram CPU mappings
- lots of bug fixes and cleanups for vega10
- misc bug fixes and code cleanups
[airlied: fix do_div error on 32-bit arm, not sure it's 100% correct]
* 'drm-next-4.12' of git://people.freedesktop.org/~agd5f/linux: (58 commits)
drm/amdgpu: use uintptr_t instead of unsigned long to store pointer
drm/amdgpu: Avoid using signed integer to store pointer value
drm/amdgpu:invoke new implemented AI MB func
drm/amdgpu/vega10:timeout set to equal with VI
drm/amdgpu:implement the reset MB func for vega10
drm/amdgpu:fix typo for mxgpu_ai
drm/amdgpu:no need to involv HDP in KIQ
drm/amdgpu:add PSP block only load_type=PSP (v2)
drm/amdgpu/smu9: update to latest driver interface
drm/amd/amdgpu: cleanup gfx_v9_0_gpu_init()
drm/amd/amdgpu: cleanup gfx_v9_0_rlc_reset()
drm/amd/amdgpu: cleanup gfx_v9_0_rlc_start()
drm/amd/amdgpu: simplify gfx_v9_0_cp_gfx_enable()
drm/amd/amdgpu: cleanup gfx_v9_0_kiq_init_register()
drm/amd/amdgpu: Drop gfx_v9_0_print_status()
drm/amd/amdgpu: cleanup gfx_v9_0_set_gfx_eop_interrupt_state()
drm/amd/amdgpu: cleanup gfx_v9_0_set_priv_reg_fault_state()
drm/amd/amdgpu: cleanup gfx_v9_0_set_priv_inst_fault_state()
drm/amd/amdgpu: cleanup gfx_v9_0_init_queue()
drm/amdgpu: Move function amdgpu_has_atpx near other similar functions
...
57 files changed, 900 insertions, 883 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 262056778f52..6a8129949333 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -32,7 +32,7 @@ | |||
32 | #include <linux/wait.h> | 32 | #include <linux/wait.h> |
33 | #include <linux/list.h> | 33 | #include <linux/list.h> |
34 | #include <linux/kref.h> | 34 | #include <linux/kref.h> |
35 | #include <linux/interval_tree.h> | 35 | #include <linux/rbtree.h> |
36 | #include <linux/hashtable.h> | 36 | #include <linux/hashtable.h> |
37 | #include <linux/dma-fence.h> | 37 | #include <linux/dma-fence.h> |
38 | 38 | ||
@@ -122,14 +122,6 @@ extern int amdgpu_param_buf_per_se; | |||
122 | /* max number of IP instances */ | 122 | /* max number of IP instances */ |
123 | #define AMDGPU_MAX_SDMA_INSTANCES 2 | 123 | #define AMDGPU_MAX_SDMA_INSTANCES 2 |
124 | 124 | ||
125 | /* max number of VMHUB */ | ||
126 | #define AMDGPU_MAX_VMHUBS 2 | ||
127 | #define AMDGPU_MMHUB 0 | ||
128 | #define AMDGPU_GFXHUB 1 | ||
129 | |||
130 | /* hardcode that limit for now */ | ||
131 | #define AMDGPU_VA_RESERVED_SIZE (8 << 20) | ||
132 | |||
133 | /* hard reset data */ | 125 | /* hard reset data */ |
134 | #define AMDGPU_ASIC_RESET_DATA 0x39d5e86b | 126 | #define AMDGPU_ASIC_RESET_DATA 0x39d5e86b |
135 | 127 | ||
@@ -312,12 +304,9 @@ struct amdgpu_gart_funcs { | |||
312 | /* set pte flags based per asic */ | 304 | /* set pte flags based per asic */ |
313 | uint64_t (*get_vm_pte_flags)(struct amdgpu_device *adev, | 305 | uint64_t (*get_vm_pte_flags)(struct amdgpu_device *adev, |
314 | uint32_t flags); | 306 | uint32_t flags); |
315 | }; | ||
316 | |||
317 | /* provided by the mc block */ | ||
318 | struct amdgpu_mc_funcs { | ||
319 | /* adjust mc addr in fb for APU case */ | 307 | /* adjust mc addr in fb for APU case */ |
320 | u64 (*adjust_mc_addr)(struct amdgpu_device *adev, u64 addr); | 308 | u64 (*adjust_mc_addr)(struct amdgpu_device *adev, u64 addr); |
309 | uint32_t (*get_invalidate_req)(unsigned int vm_id); | ||
321 | }; | 310 | }; |
322 | 311 | ||
323 | /* provided by the ih block */ | 312 | /* provided by the ih block */ |
@@ -379,7 +368,10 @@ struct amdgpu_bo_list_entry { | |||
379 | 368 | ||
380 | struct amdgpu_bo_va_mapping { | 369 | struct amdgpu_bo_va_mapping { |
381 | struct list_head list; | 370 | struct list_head list; |
382 | struct interval_tree_node it; | 371 | struct rb_node rb; |
372 | uint64_t start; | ||
373 | uint64_t last; | ||
374 | uint64_t __subtree_last; | ||
383 | uint64_t offset; | 375 | uint64_t offset; |
384 | uint64_t flags; | 376 | uint64_t flags; |
385 | }; | 377 | }; |
@@ -579,8 +571,6 @@ struct amdgpu_vmhub { | |||
579 | uint32_t vm_context0_cntl; | 571 | uint32_t vm_context0_cntl; |
580 | uint32_t vm_l2_pro_fault_status; | 572 | uint32_t vm_l2_pro_fault_status; |
581 | uint32_t vm_l2_pro_fault_cntl; | 573 | uint32_t vm_l2_pro_fault_cntl; |
582 | uint32_t (*get_invalidate_req)(unsigned int vm_id); | ||
583 | uint32_t (*get_vm_protection_bits)(void); | ||
584 | }; | 574 | }; |
585 | 575 | ||
586 | /* | 576 | /* |
@@ -618,7 +608,6 @@ struct amdgpu_mc { | |||
618 | u64 private_aperture_end; | 608 | u64 private_aperture_end; |
619 | /* protects concurrent invalidation */ | 609 | /* protects concurrent invalidation */ |
620 | spinlock_t invalidate_lock; | 610 | spinlock_t invalidate_lock; |
621 | const struct amdgpu_mc_funcs *mc_funcs; | ||
622 | }; | 611 | }; |
623 | 612 | ||
624 | /* | 613 | /* |
@@ -1712,6 +1701,12 @@ void amdgpu_mm_wdoorbell64(struct amdgpu_device *adev, u32 index, u64 v); | |||
1712 | #define WREG32_FIELD(reg, field, val) \ | 1701 | #define WREG32_FIELD(reg, field, val) \ |
1713 | WREG32(mm##reg, (RREG32(mm##reg) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field)) | 1702 | WREG32(mm##reg, (RREG32(mm##reg) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field)) |
1714 | 1703 | ||
1704 | #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)) | ||
1706 | |||
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 | |||
1715 | /* | 1710 | /* |
1716 | * BIOS helpers. | 1711 | * BIOS helpers. |
1717 | */ | 1712 | */ |
@@ -1887,12 +1882,14 @@ void amdgpu_unregister_atpx_handler(void); | |||
1887 | bool amdgpu_has_atpx_dgpu_power_cntl(void); | 1882 | bool amdgpu_has_atpx_dgpu_power_cntl(void); |
1888 | bool amdgpu_is_atpx_hybrid(void); | 1883 | bool amdgpu_is_atpx_hybrid(void); |
1889 | bool amdgpu_atpx_dgpu_req_power_for_displays(void); | 1884 | bool amdgpu_atpx_dgpu_req_power_for_displays(void); |
1885 | bool amdgpu_has_atpx(void); | ||
1890 | #else | 1886 | #else |
1891 | static inline void amdgpu_register_atpx_handler(void) {} | 1887 | static inline void amdgpu_register_atpx_handler(void) {} |
1892 | static inline void amdgpu_unregister_atpx_handler(void) {} | 1888 | static inline void amdgpu_unregister_atpx_handler(void) {} |
1893 | static inline bool amdgpu_has_atpx_dgpu_power_cntl(void) { return false; } | 1889 | static inline bool amdgpu_has_atpx_dgpu_power_cntl(void) { return false; } |
1894 | static inline bool amdgpu_is_atpx_hybrid(void) { return false; } | 1890 | static inline bool amdgpu_is_atpx_hybrid(void) { return false; } |
1895 | static inline bool amdgpu_atpx_dgpu_req_power_for_displays(void) { return false; } | 1891 | static inline bool amdgpu_atpx_dgpu_req_power_for_displays(void) { return false; } |
1892 | static inline bool amdgpu_has_atpx(void) { return false; } | ||
1896 | #endif | 1893 | #endif |
1897 | 1894 | ||
1898 | /* | 1895 | /* |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c index f52b1bf3d3d9..ad4329922f79 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c | |||
@@ -754,6 +754,35 @@ union igp_info { | |||
754 | struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_9 info_9; | 754 | struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_9 info_9; |
755 | }; | 755 | }; |
756 | 756 | ||
757 | /* | ||
758 | * Return vram width from integrated system info table, if available, | ||
759 | * or 0 if not. | ||
760 | */ | ||
761 | int amdgpu_atombios_get_vram_width(struct amdgpu_device *adev) | ||
762 | { | ||
763 | struct amdgpu_mode_info *mode_info = &adev->mode_info; | ||
764 | int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo); | ||
765 | u16 data_offset, size; | ||
766 | union igp_info *igp_info; | ||
767 | u8 frev, crev; | ||
768 | |||
769 | /* get any igp specific overrides */ | ||
770 | if (amdgpu_atom_parse_data_header(mode_info->atom_context, index, &size, | ||
771 | &frev, &crev, &data_offset)) { | ||
772 | igp_info = (union igp_info *) | ||
773 | (mode_info->atom_context->bios + data_offset); | ||
774 | switch (crev) { | ||
775 | case 8: | ||
776 | case 9: | ||
777 | return igp_info->info_8.ucUMAChannelNumber * 64; | ||
778 | default: | ||
779 | return 0; | ||
780 | } | ||
781 | } | ||
782 | |||
783 | return 0; | ||
784 | } | ||
785 | |||
757 | static void amdgpu_atombios_get_igp_ss_overrides(struct amdgpu_device *adev, | 786 | static void amdgpu_atombios_get_igp_ss_overrides(struct amdgpu_device *adev, |
758 | struct amdgpu_atom_ss *ss, | 787 | struct amdgpu_atom_ss *ss, |
759 | int id) | 788 | int id) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h index 4e0f488487f3..38d0fe32e5cd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h | |||
@@ -148,6 +148,8 @@ int amdgpu_atombios_get_clock_info(struct amdgpu_device *adev); | |||
148 | 148 | ||
149 | int amdgpu_atombios_get_gfx_info(struct amdgpu_device *adev); | 149 | int amdgpu_atombios_get_gfx_info(struct amdgpu_device *adev); |
150 | 150 | ||
151 | int amdgpu_atombios_get_vram_width(struct amdgpu_device *adev); | ||
152 | |||
151 | bool amdgpu_atombios_get_asic_ss_info(struct amdgpu_device *adev, | 153 | bool amdgpu_atombios_get_asic_ss_info(struct amdgpu_device *adev, |
152 | struct amdgpu_atom_ss *ss, | 154 | struct amdgpu_atom_ss *ss, |
153 | int id, u32 clock); | 155 | int id, u32 clock); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c index 0218cea6be4d..a6649874e6ce 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | |||
@@ -237,7 +237,7 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data, | |||
237 | struct amdgpu_fpriv *fpriv = filp->driver_priv; | 237 | struct amdgpu_fpriv *fpriv = filp->driver_priv; |
238 | union drm_amdgpu_bo_list *args = data; | 238 | union drm_amdgpu_bo_list *args = data; |
239 | uint32_t handle = args->in.list_handle; | 239 | uint32_t handle = args->in.list_handle; |
240 | const void __user *uptr = (const void*)(long)args->in.bo_info_ptr; | 240 | const void __user *uptr = (const void*)(uintptr_t)args->in.bo_info_ptr; |
241 | 241 | ||
242 | struct drm_amdgpu_bo_list_entry *info; | 242 | struct drm_amdgpu_bo_list_entry *info; |
243 | struct amdgpu_bo_list *list; | 243 | struct amdgpu_bo_list *list; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 97f661372a1c..9cd4e1e05b97 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -161,7 +161,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) | |||
161 | } | 161 | } |
162 | 162 | ||
163 | /* get chunks */ | 163 | /* get chunks */ |
164 | chunk_array_user = (uint64_t __user *)(unsigned long)(cs->in.chunks); | 164 | chunk_array_user = (uint64_t __user *)(uintptr_t)(cs->in.chunks); |
165 | if (copy_from_user(chunk_array, chunk_array_user, | 165 | if (copy_from_user(chunk_array, chunk_array_user, |
166 | sizeof(uint64_t)*cs->in.num_chunks)) { | 166 | sizeof(uint64_t)*cs->in.num_chunks)) { |
167 | ret = -EFAULT; | 167 | ret = -EFAULT; |
@@ -181,7 +181,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) | |||
181 | struct drm_amdgpu_cs_chunk user_chunk; | 181 | struct drm_amdgpu_cs_chunk user_chunk; |
182 | uint32_t __user *cdata; | 182 | uint32_t __user *cdata; |
183 | 183 | ||
184 | chunk_ptr = (void __user *)(unsigned long)chunk_array[i]; | 184 | chunk_ptr = (void __user *)(uintptr_t)chunk_array[i]; |
185 | if (copy_from_user(&user_chunk, chunk_ptr, | 185 | if (copy_from_user(&user_chunk, chunk_ptr, |
186 | sizeof(struct drm_amdgpu_cs_chunk))) { | 186 | sizeof(struct drm_amdgpu_cs_chunk))) { |
187 | ret = -EFAULT; | 187 | ret = -EFAULT; |
@@ -192,7 +192,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) | |||
192 | p->chunks[i].length_dw = user_chunk.length_dw; | 192 | p->chunks[i].length_dw = user_chunk.length_dw; |
193 | 193 | ||
194 | size = p->chunks[i].length_dw; | 194 | size = p->chunks[i].length_dw; |
195 | cdata = (void __user *)(unsigned long)user_chunk.chunk_data; | 195 | cdata = (void __user *)(uintptr_t)user_chunk.chunk_data; |
196 | 196 | ||
197 | p->chunks[i].kdata = drm_malloc_ab(size, sizeof(uint32_t)); | 197 | p->chunks[i].kdata = drm_malloc_ab(size, sizeof(uint32_t)); |
198 | if (p->chunks[i].kdata == NULL) { | 198 | if (p->chunks[i].kdata == NULL) { |
@@ -949,7 +949,7 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev, | |||
949 | } | 949 | } |
950 | 950 | ||
951 | if ((chunk_ib->va_start + chunk_ib->ib_bytes) > | 951 | if ((chunk_ib->va_start + chunk_ib->ib_bytes) > |
952 | (m->it.last + 1) * AMDGPU_GPU_PAGE_SIZE) { | 952 | (m->last + 1) * AMDGPU_GPU_PAGE_SIZE) { |
953 | DRM_ERROR("IB va_start+ib_bytes is invalid\n"); | 953 | DRM_ERROR("IB va_start+ib_bytes is invalid\n"); |
954 | return -EINVAL; | 954 | return -EINVAL; |
955 | } | 955 | } |
@@ -960,7 +960,7 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev, | |||
960 | return r; | 960 | return r; |
961 | } | 961 | } |
962 | 962 | ||
963 | offset = ((uint64_t)m->it.start) * AMDGPU_GPU_PAGE_SIZE; | 963 | offset = m->start * AMDGPU_GPU_PAGE_SIZE; |
964 | kptr += chunk_ib->va_start - offset; | 964 | kptr += chunk_ib->va_start - offset; |
965 | 965 | ||
966 | r = amdgpu_ib_get(adev, vm, chunk_ib->ib_bytes, ib); | 966 | r = amdgpu_ib_get(adev, vm, chunk_ib->ib_bytes, ib); |
@@ -1339,7 +1339,7 @@ int amdgpu_cs_wait_fences_ioctl(struct drm_device *dev, void *data, | |||
1339 | if (fences == NULL) | 1339 | if (fences == NULL) |
1340 | return -ENOMEM; | 1340 | return -ENOMEM; |
1341 | 1341 | ||
1342 | fences_user = (void __user *)(unsigned long)(wait->in.fences); | 1342 | fences_user = (void __user *)(uintptr_t)(wait->in.fences); |
1343 | if (copy_from_user(fences, fences_user, | 1343 | if (copy_from_user(fences, fences_user, |
1344 | sizeof(struct drm_amdgpu_fence) * fence_count)) { | 1344 | sizeof(struct drm_amdgpu_fence) * fence_count)) { |
1345 | r = -EFAULT; | 1345 | r = -EFAULT; |
@@ -1388,8 +1388,8 @@ amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser, | |||
1388 | continue; | 1388 | continue; |
1389 | 1389 | ||
1390 | list_for_each_entry(mapping, &lobj->bo_va->valids, list) { | 1390 | list_for_each_entry(mapping, &lobj->bo_va->valids, list) { |
1391 | if (mapping->it.start > addr || | 1391 | if (mapping->start > addr || |
1392 | addr > mapping->it.last) | 1392 | addr > mapping->last) |
1393 | continue; | 1393 | continue; |
1394 | 1394 | ||
1395 | *bo = lobj->bo_va->bo; | 1395 | *bo = lobj->bo_va->bo; |
@@ -1397,8 +1397,8 @@ amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser, | |||
1397 | } | 1397 | } |
1398 | 1398 | ||
1399 | list_for_each_entry(mapping, &lobj->bo_va->invalids, list) { | 1399 | list_for_each_entry(mapping, &lobj->bo_va->invalids, list) { |
1400 | if (mapping->it.start > addr || | 1400 | if (mapping->start > addr || |
1401 | addr > mapping->it.last) | 1401 | addr > mapping->last) |
1402 | continue; | 1402 | continue; |
1403 | 1403 | ||
1404 | *bo = lobj->bo_va->bo; | 1404 | *bo = lobj->bo_va->bo; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 83dda05325b8..831c2bfd2072 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -1042,14 +1042,6 @@ static bool amdgpu_check_pot_argument(int arg) | |||
1042 | 1042 | ||
1043 | static void amdgpu_get_block_size(struct amdgpu_device *adev) | 1043 | static void amdgpu_get_block_size(struct amdgpu_device *adev) |
1044 | { | 1044 | { |
1045 | /* from AI, asic starts to support multiple level VMPT */ | ||
1046 | if (adev->asic_type >= CHIP_VEGA10) { | ||
1047 | if (amdgpu_vm_block_size != 9) | ||
1048 | dev_warn(adev->dev, | ||
1049 | "Multi-VMPT limits block size to one page!\n"); | ||
1050 | amdgpu_vm_block_size = 9; | ||
1051 | return; | ||
1052 | } | ||
1053 | /* defines number of bits in page table versus page directory, | 1045 | /* defines number of bits in page table versus page directory, |
1054 | * a page is 4KB so we have 12 bits offset, minimum 9 bits in the | 1046 | * a page is 4KB so we have 12 bits offset, minimum 9 bits in the |
1055 | * page table and the remaining bits are in the page directory */ | 1047 | * page table and the remaining bits are in the page directory */ |
@@ -1079,6 +1071,36 @@ static void amdgpu_get_block_size(struct amdgpu_device *adev) | |||
1079 | } | 1071 | } |
1080 | } | 1072 | } |
1081 | 1073 | ||
1074 | static void amdgpu_check_vm_size(struct amdgpu_device *adev) | ||
1075 | { | ||
1076 | if (!amdgpu_check_pot_argument(amdgpu_vm_size)) { | ||
1077 | dev_warn(adev->dev, "VM size (%d) must be a power of 2\n", | ||
1078 | amdgpu_vm_size); | ||
1079 | goto def_value; | ||
1080 | } | ||
1081 | |||
1082 | if (amdgpu_vm_size < 1) { | ||
1083 | dev_warn(adev->dev, "VM size (%d) too small, min is 1GB\n", | ||
1084 | amdgpu_vm_size); | ||
1085 | goto def_value; | ||
1086 | } | ||
1087 | |||
1088 | /* | ||
1089 | * Max GPUVM size for Cayman, SI, CI VI are 40 bits. | ||
1090 | */ | ||
1091 | if (amdgpu_vm_size > 1024) { | ||
1092 | dev_warn(adev->dev, "VM size (%d) too large, max is 1TB\n", | ||
1093 | amdgpu_vm_size); | ||
1094 | goto def_value; | ||
1095 | } | ||
1096 | |||
1097 | return; | ||
1098 | |||
1099 | def_value: | ||
1100 | amdgpu_vm_size = 8; | ||
1101 | dev_info(adev->dev, "set default VM size %dGB\n", amdgpu_vm_size); | ||
1102 | } | ||
1103 | |||
1082 | /** | 1104 | /** |
1083 | * amdgpu_check_arguments - validate module params | 1105 | * amdgpu_check_arguments - validate module params |
1084 | * | 1106 | * |
@@ -1108,26 +1130,7 @@ static void amdgpu_check_arguments(struct amdgpu_device *adev) | |||
1108 | } | 1130 | } |
1109 | } | 1131 | } |
1110 | 1132 | ||
1111 | if (!amdgpu_check_pot_argument(amdgpu_vm_size)) { | 1133 | amdgpu_check_vm_size(adev); |
1112 | dev_warn(adev->dev, "VM size (%d) must be a power of 2\n", | ||
1113 | amdgpu_vm_size); | ||
1114 | amdgpu_vm_size = 8; | ||
1115 | } | ||
1116 | |||
1117 | if (amdgpu_vm_size < 1) { | ||
1118 | dev_warn(adev->dev, "VM size (%d) too small, min is 1GB\n", | ||
1119 | amdgpu_vm_size); | ||
1120 | amdgpu_vm_size = 8; | ||
1121 | } | ||
1122 | |||
1123 | /* | ||
1124 | * Max GPUVM size for Cayman, SI and CI are 40 bits. | ||
1125 | */ | ||
1126 | if (amdgpu_vm_size > 1024) { | ||
1127 | dev_warn(adev->dev, "VM size (%d) too large, max is 1TB\n", | ||
1128 | amdgpu_vm_size); | ||
1129 | amdgpu_vm_size = 8; | ||
1130 | } | ||
1131 | 1134 | ||
1132 | amdgpu_get_block_size(adev); | 1135 | amdgpu_get_block_size(adev); |
1133 | 1136 | ||
@@ -2249,9 +2252,10 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon) | |||
2249 | } | 2252 | } |
2250 | 2253 | ||
2251 | r = amdgpu_resume(adev); | 2254 | r = amdgpu_resume(adev); |
2252 | if (r) | 2255 | if (r) { |
2253 | DRM_ERROR("amdgpu_resume failed (%d).\n", r); | 2256 | DRM_ERROR("amdgpu_resume failed (%d).\n", r); |
2254 | 2257 | return r; | |
2258 | } | ||
2255 | amdgpu_fence_driver_resume(adev); | 2259 | amdgpu_fence_driver_resume(adev); |
2256 | 2260 | ||
2257 | if (resume) { | 2261 | if (resume) { |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index f85520d4e711..bb710e0ace01 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | |||
@@ -717,7 +717,7 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data, | |||
717 | switch (args->op) { | 717 | switch (args->op) { |
718 | case AMDGPU_GEM_OP_GET_GEM_CREATE_INFO: { | 718 | case AMDGPU_GEM_OP_GET_GEM_CREATE_INFO: { |
719 | struct drm_amdgpu_gem_create_in info; | 719 | struct drm_amdgpu_gem_create_in info; |
720 | void __user *out = (void __user *)(long)args->value; | 720 | void __user *out = (void __user *)(uintptr_t)args->value; |
721 | 721 | ||
722 | info.bo_size = robj->gem_base.size; | 722 | info.bo_size = robj->gem_base.size; |
723 | info.alignment = robj->tbo.mem.page_alignment << PAGE_SHIFT; | 723 | info.alignment = robj->tbo.mem.page_alignment << PAGE_SHIFT; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c index 13b487235a8b..a6b7e367a860 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | |||
@@ -316,9 +316,10 @@ int amdgpu_irq_add_id(struct amdgpu_device *adev, | |||
316 | return -EINVAL; | 316 | return -EINVAL; |
317 | 317 | ||
318 | if (!adev->irq.client[client_id].sources) { | 318 | if (!adev->irq.client[client_id].sources) { |
319 | adev->irq.client[client_id].sources = kcalloc(AMDGPU_MAX_IRQ_SRC_ID, | 319 | adev->irq.client[client_id].sources = |
320 | sizeof(struct amdgpu_irq_src), | 320 | kcalloc(AMDGPU_MAX_IRQ_SRC_ID, |
321 | GFP_KERNEL); | 321 | sizeof(struct amdgpu_irq_src *), |
322 | GFP_KERNEL); | ||
322 | if (!adev->irq.client[client_id].sources) | 323 | if (!adev->irq.client[client_id].sources) |
323 | return -ENOMEM; | 324 | return -ENOMEM; |
324 | } | 325 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index dfb029ab3448..832be632478f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |||
@@ -36,12 +36,6 @@ | |||
36 | #include <linux/pm_runtime.h> | 36 | #include <linux/pm_runtime.h> |
37 | #include "amdgpu_amdkfd.h" | 37 | #include "amdgpu_amdkfd.h" |
38 | 38 | ||
39 | #if defined(CONFIG_VGA_SWITCHEROO) | ||
40 | bool amdgpu_has_atpx(void); | ||
41 | #else | ||
42 | static inline bool amdgpu_has_atpx(void) { return false; } | ||
43 | #endif | ||
44 | |||
45 | /** | 39 | /** |
46 | * amdgpu_driver_unload_kms - Main unload function for KMS. | 40 | * amdgpu_driver_unload_kms - Main unload function for KMS. |
47 | * | 41 | * |
@@ -243,7 +237,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
243 | struct amdgpu_device *adev = dev->dev_private; | 237 | struct amdgpu_device *adev = dev->dev_private; |
244 | struct drm_amdgpu_info *info = data; | 238 | struct drm_amdgpu_info *info = data; |
245 | struct amdgpu_mode_info *minfo = &adev->mode_info; | 239 | struct amdgpu_mode_info *minfo = &adev->mode_info; |
246 | void __user *out = (void __user *)(long)info->return_pointer; | 240 | void __user *out = (void __user *)(uintptr_t)info->return_pointer; |
247 | uint32_t size = info->return_size; | 241 | uint32_t size = info->return_size; |
248 | struct drm_crtc *crtc; | 242 | struct drm_crtc *crtc; |
249 | uint32_t ui32 = 0; | 243 | uint32_t ui32 = 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c index 7ea3cacf9f9f..38f739fb727b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/firmware.h> | 31 | #include <linux/firmware.h> |
32 | #include <linux/module.h> | 32 | #include <linux/module.h> |
33 | #include <linux/mmu_notifier.h> | 33 | #include <linux/mmu_notifier.h> |
34 | #include <linux/interval_tree.h> | ||
34 | #include <drm/drmP.h> | 35 | #include <drm/drmP.h> |
35 | #include <drm/drm.h> | 36 | #include <drm/drm.h> |
36 | 37 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 5aac350b007f..758d8cf8fd17 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | |||
@@ -122,20 +122,19 @@ static void amdgpu_ttm_placement_init(struct amdgpu_device *adev, | |||
122 | 122 | ||
123 | if (domain & AMDGPU_GEM_DOMAIN_VRAM) { | 123 | if (domain & AMDGPU_GEM_DOMAIN_VRAM) { |
124 | unsigned visible_pfn = adev->mc.visible_vram_size >> PAGE_SHIFT; | 124 | unsigned visible_pfn = adev->mc.visible_vram_size >> PAGE_SHIFT; |
125 | unsigned lpfn = 0; | ||
126 | |||
127 | /* This forces a reallocation if the flag wasn't set before */ | ||
128 | if (flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS) | ||
129 | lpfn = adev->mc.real_vram_size >> PAGE_SHIFT; | ||
130 | 125 | ||
131 | places[c].fpfn = 0; | 126 | places[c].fpfn = 0; |
132 | places[c].lpfn = lpfn; | 127 | places[c].lpfn = 0; |
133 | places[c].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | | 128 | places[c].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | |
134 | TTM_PL_FLAG_VRAM; | 129 | TTM_PL_FLAG_VRAM; |
130 | |||
135 | if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) | 131 | if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) |
136 | places[c].lpfn = visible_pfn; | 132 | places[c].lpfn = visible_pfn; |
137 | else | 133 | else |
138 | places[c].flags |= TTM_PL_FLAG_TOPDOWN; | 134 | places[c].flags |= TTM_PL_FLAG_TOPDOWN; |
135 | |||
136 | if (flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS) | ||
137 | places[c].flags |= TTM_PL_FLAG_CONTIGUOUS; | ||
139 | c++; | 138 | c++; |
140 | } | 139 | } |
141 | 140 | ||
@@ -928,8 +927,7 @@ int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo) | |||
928 | size = bo->mem.num_pages << PAGE_SHIFT; | 927 | size = bo->mem.num_pages << PAGE_SHIFT; |
929 | offset = bo->mem.start << PAGE_SHIFT; | 928 | offset = bo->mem.start << PAGE_SHIFT; |
930 | /* TODO: figure out how to map scattered VRAM to the CPU */ | 929 | /* TODO: figure out how to map scattered VRAM to the CPU */ |
931 | if ((offset + size) <= adev->mc.visible_vram_size && | 930 | if ((offset + size) <= adev->mc.visible_vram_size) |
932 | (abo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)) | ||
933 | return 0; | 931 | return 0; |
934 | 932 | ||
935 | /* Can't move a pinned BO to visible VRAM */ | 933 | /* Can't move a pinned BO to visible VRAM */ |
@@ -937,7 +935,6 @@ int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo) | |||
937 | return -EINVAL; | 935 | return -EINVAL; |
938 | 936 | ||
939 | /* hurrah the memory is not visible ! */ | 937 | /* hurrah the memory is not visible ! */ |
940 | abo->flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS; | ||
941 | amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM); | 938 | amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM); |
942 | lpfn = adev->mc.visible_vram_size >> PAGE_SHIFT; | 939 | lpfn = adev->mc.visible_vram_size >> PAGE_SHIFT; |
943 | for (i = 0; i < abo->placement.num_placement; i++) { | 940 | for (i = 0; i < abo->placement.num_placement; i++) { |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index 4731015f6101..ed6e5799016e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | |||
@@ -130,7 +130,7 @@ psp_cmd_submit_buf(struct psp_context *psp, | |||
130 | 130 | ||
131 | while (*((unsigned int *)psp->fence_buf) != index) { | 131 | while (*((unsigned int *)psp->fence_buf) != index) { |
132 | msleep(1); | 132 | msleep(1); |
133 | }; | 133 | } |
134 | 134 | ||
135 | amdgpu_bo_free_kernel(&cmd_buf_bo, | 135 | amdgpu_bo_free_kernel(&cmd_buf_bo, |
136 | &cmd_buf_mc_addr, | 136 | &cmd_buf_mc_addr, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h index a87de18160a8..ee9d0f346d75 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | |||
@@ -226,8 +226,8 @@ TRACE_EVENT(amdgpu_vm_bo_map, | |||
226 | 226 | ||
227 | TP_fast_assign( | 227 | TP_fast_assign( |
228 | __entry->bo = bo_va ? bo_va->bo : NULL; | 228 | __entry->bo = bo_va ? bo_va->bo : NULL; |
229 | __entry->start = mapping->it.start; | 229 | __entry->start = mapping->start; |
230 | __entry->last = mapping->it.last; | 230 | __entry->last = mapping->last; |
231 | __entry->offset = mapping->offset; | 231 | __entry->offset = mapping->offset; |
232 | __entry->flags = mapping->flags; | 232 | __entry->flags = mapping->flags; |
233 | ), | 233 | ), |
@@ -250,8 +250,8 @@ TRACE_EVENT(amdgpu_vm_bo_unmap, | |||
250 | 250 | ||
251 | TP_fast_assign( | 251 | TP_fast_assign( |
252 | __entry->bo = bo_va->bo; | 252 | __entry->bo = bo_va->bo; |
253 | __entry->start = mapping->it.start; | 253 | __entry->start = mapping->start; |
254 | __entry->last = mapping->it.last; | 254 | __entry->last = mapping->last; |
255 | __entry->offset = mapping->offset; | 255 | __entry->offset = mapping->offset; |
256 | __entry->flags = mapping->flags; | 256 | __entry->flags = mapping->flags; |
257 | ), | 257 | ), |
@@ -270,8 +270,8 @@ DECLARE_EVENT_CLASS(amdgpu_vm_mapping, | |||
270 | ), | 270 | ), |
271 | 271 | ||
272 | TP_fast_assign( | 272 | TP_fast_assign( |
273 | __entry->soffset = mapping->it.start; | 273 | __entry->soffset = mapping->start; |
274 | __entry->eoffset = mapping->it.last + 1; | 274 | __entry->eoffset = mapping->last + 1; |
275 | __entry->flags = mapping->flags; | 275 | __entry->flags = mapping->flags; |
276 | ), | 276 | ), |
277 | TP_printk("soffs=%010llx, eoffs=%010llx, flags=%08x", | 277 | TP_printk("soffs=%010llx, eoffs=%010llx, flags=%08x", |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 244bb9aacf86..7e993259c2e9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |||
@@ -529,40 +529,12 @@ static int amdgpu_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_ | |||
529 | case TTM_PL_TT: | 529 | case TTM_PL_TT: |
530 | break; | 530 | break; |
531 | case TTM_PL_VRAM: | 531 | case TTM_PL_VRAM: |
532 | if (mem->start == AMDGPU_BO_INVALID_OFFSET) | ||
533 | return -EINVAL; | ||
534 | |||
535 | mem->bus.offset = mem->start << PAGE_SHIFT; | 532 | mem->bus.offset = mem->start << PAGE_SHIFT; |
536 | /* check if it's visible */ | 533 | /* check if it's visible */ |
537 | if ((mem->bus.offset + mem->bus.size) > adev->mc.visible_vram_size) | 534 | if ((mem->bus.offset + mem->bus.size) > adev->mc.visible_vram_size) |
538 | return -EINVAL; | 535 | return -EINVAL; |
539 | mem->bus.base = adev->mc.aper_base; | 536 | mem->bus.base = adev->mc.aper_base; |
540 | mem->bus.is_iomem = true; | 537 | mem->bus.is_iomem = true; |
541 | #ifdef __alpha__ | ||
542 | /* | ||
543 | * Alpha: use bus.addr to hold the ioremap() return, | ||
544 | * so we can modify bus.base below. | ||
545 | */ | ||
546 | if (mem->placement & TTM_PL_FLAG_WC) | ||
547 | mem->bus.addr = | ||
548 | ioremap_wc(mem->bus.base + mem->bus.offset, | ||
549 | mem->bus.size); | ||
550 | else | ||
551 | mem->bus.addr = | ||
552 | ioremap_nocache(mem->bus.base + mem->bus.offset, | ||
553 | mem->bus.size); | ||
554 | if (!mem->bus.addr) | ||
555 | return -ENOMEM; | ||
556 | |||
557 | /* | ||
558 | * Alpha: Use just the bus offset plus | ||
559 | * the hose/domain memory base for bus.base. | ||
560 | * It then can be used to build PTEs for VRAM | ||
561 | * access, as done in ttm_bo_vm_fault(). | ||
562 | */ | ||
563 | mem->bus.base = (mem->bus.base & 0x0ffffffffUL) + | ||
564 | adev->ddev->hose->dense_mem_base; | ||
565 | #endif | ||
566 | break; | 538 | break; |
567 | default: | 539 | default: |
568 | return -EINVAL; | 540 | return -EINVAL; |
@@ -574,6 +546,17 @@ static void amdgpu_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_re | |||
574 | { | 546 | { |
575 | } | 547 | } |
576 | 548 | ||
549 | static unsigned long amdgpu_ttm_io_mem_pfn(struct ttm_buffer_object *bo, | ||
550 | unsigned long page_offset) | ||
551 | { | ||
552 | struct drm_mm_node *mm = bo->mem.mm_node; | ||
553 | uint64_t size = mm->size; | ||
554 | uint64_t offset = page_offset; | ||
555 | |||
556 | page_offset = do_div(offset, size); | ||
557 | return (bo->mem.bus.base >> PAGE_SHIFT) + mm->start + page_offset; | ||
558 | } | ||
559 | |||
577 | /* | 560 | /* |
578 | * TTM backend functions. | 561 | * TTM backend functions. |
579 | */ | 562 | */ |
@@ -1089,6 +1072,7 @@ static struct ttm_bo_driver amdgpu_bo_driver = { | |||
1089 | .fault_reserve_notify = &amdgpu_bo_fault_reserve_notify, | 1072 | .fault_reserve_notify = &amdgpu_bo_fault_reserve_notify, |
1090 | .io_mem_reserve = &amdgpu_ttm_io_mem_reserve, | 1073 | .io_mem_reserve = &amdgpu_ttm_io_mem_reserve, |
1091 | .io_mem_free = &amdgpu_ttm_io_mem_free, | 1074 | .io_mem_free = &amdgpu_ttm_io_mem_free, |
1075 | .io_mem_pfn = amdgpu_ttm_io_mem_pfn, | ||
1092 | }; | 1076 | }; |
1093 | 1077 | ||
1094 | int amdgpu_ttm_init(struct amdgpu_device *adev) | 1078 | int amdgpu_ttm_init(struct amdgpu_device *adev) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c index 0b92dd0c1d70..2ca09f111f08 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | |||
@@ -741,10 +741,10 @@ static int amdgpu_uvd_cs_pass2(struct amdgpu_uvd_cs_ctx *ctx) | |||
741 | 741 | ||
742 | start = amdgpu_bo_gpu_offset(bo); | 742 | start = amdgpu_bo_gpu_offset(bo); |
743 | 743 | ||
744 | end = (mapping->it.last + 1 - mapping->it.start); | 744 | end = (mapping->last + 1 - mapping->start); |
745 | end = end * AMDGPU_GPU_PAGE_SIZE + start; | 745 | end = end * AMDGPU_GPU_PAGE_SIZE + start; |
746 | 746 | ||
747 | addr -= ((uint64_t)mapping->it.start) * AMDGPU_GPU_PAGE_SIZE; | 747 | addr -= mapping->start * AMDGPU_GPU_PAGE_SIZE; |
748 | start += addr; | 748 | start += addr; |
749 | 749 | ||
750 | amdgpu_set_ib_value(ctx->parser, ctx->ib_idx, ctx->data0, | 750 | amdgpu_set_ib_value(ctx->parser, ctx->ib_idx, ctx->data0, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c index 0184197eb000..c853400805d1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | |||
@@ -595,13 +595,13 @@ static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, uint32_t ib_idx, | |||
595 | } | 595 | } |
596 | 596 | ||
597 | if ((addr + (uint64_t)size) > | 597 | if ((addr + (uint64_t)size) > |
598 | ((uint64_t)mapping->it.last + 1) * AMDGPU_GPU_PAGE_SIZE) { | 598 | (mapping->last + 1) * AMDGPU_GPU_PAGE_SIZE) { |
599 | DRM_ERROR("BO to small for addr 0x%010Lx %d %d\n", | 599 | DRM_ERROR("BO to small for addr 0x%010Lx %d %d\n", |
600 | addr, lo, hi); | 600 | addr, lo, hi); |
601 | return -EINVAL; | 601 | return -EINVAL; |
602 | } | 602 | } |
603 | 603 | ||
604 | addr -= ((uint64_t)mapping->it.start) * AMDGPU_GPU_PAGE_SIZE; | 604 | addr -= mapping->start * AMDGPU_GPU_PAGE_SIZE; |
605 | addr += amdgpu_bo_gpu_offset(bo); | 605 | addr += amdgpu_bo_gpu_offset(bo); |
606 | addr -= ((uint64_t)size) * ((uint64_t)index); | 606 | addr -= ((uint64_t)size) * ((uint64_t)index); |
607 | 607 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c index ecef35a1fe33..ba8b8ae6234f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | |||
@@ -122,9 +122,7 @@ uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg) | |||
122 | 122 | ||
123 | mutex_lock(&adev->virt.lock_kiq); | 123 | mutex_lock(&adev->virt.lock_kiq); |
124 | amdgpu_ring_alloc(ring, 32); | 124 | amdgpu_ring_alloc(ring, 32); |
125 | amdgpu_ring_emit_hdp_flush(ring); | ||
126 | amdgpu_ring_emit_rreg(ring, reg); | 125 | amdgpu_ring_emit_rreg(ring, reg); |
127 | amdgpu_ring_emit_hdp_invalidate(ring); | ||
128 | amdgpu_fence_emit(ring, &f); | 126 | amdgpu_fence_emit(ring, &f); |
129 | amdgpu_ring_commit(ring); | 127 | amdgpu_ring_commit(ring); |
130 | mutex_unlock(&adev->virt.lock_kiq); | 128 | mutex_unlock(&adev->virt.lock_kiq); |
@@ -150,9 +148,7 @@ void amdgpu_virt_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v) | |||
150 | 148 | ||
151 | mutex_lock(&adev->virt.lock_kiq); | 149 | mutex_lock(&adev->virt.lock_kiq); |
152 | amdgpu_ring_alloc(ring, 32); | 150 | amdgpu_ring_alloc(ring, 32); |
153 | amdgpu_ring_emit_hdp_flush(ring); | ||
154 | amdgpu_ring_emit_wreg(ring, reg, v); | 151 | amdgpu_ring_emit_wreg(ring, reg, v); |
155 | amdgpu_ring_emit_hdp_invalidate(ring); | ||
156 | amdgpu_fence_emit(ring, &f); | 152 | amdgpu_fence_emit(ring, &f); |
157 | amdgpu_ring_commit(ring); | 153 | amdgpu_ring_commit(ring); |
158 | mutex_unlock(&adev->virt.lock_kiq); | 154 | mutex_unlock(&adev->virt.lock_kiq); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 0235d7933efd..2895d9d86f29 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -26,6 +26,7 @@ | |||
26 | * Jerome Glisse | 26 | * Jerome Glisse |
27 | */ | 27 | */ |
28 | #include <linux/dma-fence-array.h> | 28 | #include <linux/dma-fence-array.h> |
29 | #include <linux/interval_tree_generic.h> | ||
29 | #include <drm/drmP.h> | 30 | #include <drm/drmP.h> |
30 | #include <drm/amdgpu_drm.h> | 31 | #include <drm/amdgpu_drm.h> |
31 | #include "amdgpu.h" | 32 | #include "amdgpu.h" |
@@ -51,6 +52,15 @@ | |||
51 | * SI supports 16. | 52 | * SI supports 16. |
52 | */ | 53 | */ |
53 | 54 | ||
55 | #define START(node) ((node)->start) | ||
56 | #define LAST(node) ((node)->last) | ||
57 | |||
58 | INTERVAL_TREE_DEFINE(struct amdgpu_bo_va_mapping, rb, uint64_t, __subtree_last, | ||
59 | START, LAST, static, amdgpu_vm_it) | ||
60 | |||
61 | #undef START | ||
62 | #undef LAST | ||
63 | |||
54 | /* Local structure. Encapsulate some VM table update parameters to reduce | 64 | /* Local structure. Encapsulate some VM table update parameters to reduce |
55 | * the number of function parameters | 65 | * the number of function parameters |
56 | */ | 66 | */ |
@@ -90,13 +100,14 @@ static unsigned amdgpu_vm_num_entries(struct amdgpu_device *adev, | |||
90 | if (level == 0) | 100 | if (level == 0) |
91 | /* For the root directory */ | 101 | /* For the root directory */ |
92 | return adev->vm_manager.max_pfn >> | 102 | return adev->vm_manager.max_pfn >> |
93 | (amdgpu_vm_block_size * adev->vm_manager.num_level); | 103 | (adev->vm_manager.block_size * |
104 | adev->vm_manager.num_level); | ||
94 | else if (level == adev->vm_manager.num_level) | 105 | else if (level == adev->vm_manager.num_level) |
95 | /* For the page tables on the leaves */ | 106 | /* For the page tables on the leaves */ |
96 | return AMDGPU_VM_PTE_COUNT; | 107 | return AMDGPU_VM_PTE_COUNT(adev); |
97 | else | 108 | else |
98 | /* Everything in between */ | 109 | /* Everything in between */ |
99 | return 1 << amdgpu_vm_block_size; | 110 | return 1 << adev->vm_manager.block_size; |
100 | } | 111 | } |
101 | 112 | ||
102 | /** | 113 | /** |
@@ -261,7 +272,7 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev, | |||
261 | unsigned level) | 272 | unsigned level) |
262 | { | 273 | { |
263 | unsigned shift = (adev->vm_manager.num_level - level) * | 274 | unsigned shift = (adev->vm_manager.num_level - level) * |
264 | amdgpu_vm_block_size; | 275 | adev->vm_manager.block_size; |
265 | unsigned pt_idx, from, to; | 276 | unsigned pt_idx, from, to; |
266 | int r; | 277 | int r; |
267 | 278 | ||
@@ -365,11 +376,19 @@ int amdgpu_vm_alloc_pts(struct amdgpu_device *adev, | |||
365 | return amdgpu_vm_alloc_levels(adev, vm, &vm->root, saddr, eaddr, 0); | 376 | return amdgpu_vm_alloc_levels(adev, vm, &vm->root, saddr, eaddr, 0); |
366 | } | 377 | } |
367 | 378 | ||
368 | static bool amdgpu_vm_is_gpu_reset(struct amdgpu_device *adev, | 379 | /** |
369 | struct amdgpu_vm_id *id) | 380 | * amdgpu_vm_had_gpu_reset - check if reset occured since last use |
381 | * | ||
382 | * @adev: amdgpu_device pointer | ||
383 | * @id: VMID structure | ||
384 | * | ||
385 | * Check if GPU reset occured since last use of the VMID. | ||
386 | */ | ||
387 | static bool amdgpu_vm_had_gpu_reset(struct amdgpu_device *adev, | ||
388 | struct amdgpu_vm_id *id) | ||
370 | { | 389 | { |
371 | return id->current_gpu_reset_count != | 390 | return id->current_gpu_reset_count != |
372 | atomic_read(&adev->gpu_reset_counter) ? true : false; | 391 | atomic_read(&adev->gpu_reset_counter); |
373 | } | 392 | } |
374 | 393 | ||
375 | /** | 394 | /** |
@@ -455,7 +474,7 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
455 | /* Check all the prerequisites to using this VMID */ | 474 | /* Check all the prerequisites to using this VMID */ |
456 | if (!id) | 475 | if (!id) |
457 | continue; | 476 | continue; |
458 | if (amdgpu_vm_is_gpu_reset(adev, id)) | 477 | if (amdgpu_vm_had_gpu_reset(adev, id)) |
459 | continue; | 478 | continue; |
460 | 479 | ||
461 | if (atomic64_read(&id->owner) != vm->client_id) | 480 | if (atomic64_read(&id->owner) != vm->client_id) |
@@ -483,7 +502,6 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
483 | if (r) | 502 | if (r) |
484 | goto error; | 503 | goto error; |
485 | 504 | ||
486 | id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter); | ||
487 | list_move_tail(&id->list, &adev->vm_manager.ids_lru); | 505 | list_move_tail(&id->list, &adev->vm_manager.ids_lru); |
488 | vm->ids[ring->idx] = id; | 506 | vm->ids[ring->idx] = id; |
489 | 507 | ||
@@ -504,9 +522,6 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
504 | if (r) | 522 | if (r) |
505 | goto error; | 523 | goto error; |
506 | 524 | ||
507 | dma_fence_put(id->first); | ||
508 | id->first = dma_fence_get(fence); | ||
509 | |||
510 | dma_fence_put(id->last_flush); | 525 | dma_fence_put(id->last_flush); |
511 | id->last_flush = NULL; | 526 | id->last_flush = NULL; |
512 | 527 | ||
@@ -557,8 +572,8 @@ static u64 amdgpu_vm_adjust_mc_addr(struct amdgpu_device *adev, u64 mc_addr) | |||
557 | { | 572 | { |
558 | u64 addr = mc_addr; | 573 | u64 addr = mc_addr; |
559 | 574 | ||
560 | if (adev->mc.mc_funcs && adev->mc.mc_funcs->adjust_mc_addr) | 575 | if (adev->gart.gart_funcs->adjust_mc_addr) |
561 | addr = adev->mc.mc_funcs->adjust_mc_addr(adev, addr); | 576 | addr = adev->gart.gart_funcs->adjust_mc_addr(adev, addr); |
562 | 577 | ||
563 | return addr; | 578 | return addr; |
564 | } | 579 | } |
@@ -583,60 +598,62 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job) | |||
583 | id->gws_size != job->gws_size || | 598 | id->gws_size != job->gws_size || |
584 | id->oa_base != job->oa_base || | 599 | id->oa_base != job->oa_base || |
585 | id->oa_size != job->oa_size); | 600 | id->oa_size != job->oa_size); |
601 | bool vm_flush_needed = job->vm_needs_flush || | ||
602 | amdgpu_vm_ring_has_compute_vm_bug(ring); | ||
603 | unsigned patch_offset = 0; | ||
586 | int r; | 604 | int r; |
587 | 605 | ||
588 | if (job->vm_needs_flush || gds_switch_needed || | 606 | if (amdgpu_vm_had_gpu_reset(adev, id)) { |
589 | amdgpu_vm_is_gpu_reset(adev, id) || | 607 | gds_switch_needed = true; |
590 | amdgpu_vm_ring_has_compute_vm_bug(ring)) { | 608 | vm_flush_needed = true; |
591 | unsigned patch_offset = 0; | 609 | } |
592 | 610 | ||
593 | if (ring->funcs->init_cond_exec) | 611 | if (!vm_flush_needed && !gds_switch_needed) |
594 | patch_offset = amdgpu_ring_init_cond_exec(ring); | 612 | return 0; |
595 | 613 | ||
596 | if (ring->funcs->emit_pipeline_sync && | 614 | if (ring->funcs->init_cond_exec) |
597 | (job->vm_needs_flush || gds_switch_needed || | 615 | patch_offset = amdgpu_ring_init_cond_exec(ring); |
598 | amdgpu_vm_ring_has_compute_vm_bug(ring))) | ||
599 | amdgpu_ring_emit_pipeline_sync(ring); | ||
600 | 616 | ||
601 | if (ring->funcs->emit_vm_flush && (job->vm_needs_flush || | 617 | if (ring->funcs->emit_pipeline_sync) |
602 | amdgpu_vm_is_gpu_reset(adev, id))) { | 618 | amdgpu_ring_emit_pipeline_sync(ring); |
603 | struct dma_fence *fence; | ||
604 | u64 pd_addr = amdgpu_vm_adjust_mc_addr(adev, job->vm_pd_addr); | ||
605 | 619 | ||
606 | trace_amdgpu_vm_flush(pd_addr, ring->idx, job->vm_id); | 620 | if (ring->funcs->emit_vm_flush && vm_flush_needed) { |
607 | amdgpu_ring_emit_vm_flush(ring, job->vm_id, pd_addr); | 621 | u64 pd_addr = amdgpu_vm_adjust_mc_addr(adev, job->vm_pd_addr); |
622 | struct dma_fence *fence; | ||
608 | 623 | ||
609 | r = amdgpu_fence_emit(ring, &fence); | 624 | trace_amdgpu_vm_flush(pd_addr, ring->idx, job->vm_id); |
610 | if (r) | 625 | amdgpu_ring_emit_vm_flush(ring, job->vm_id, pd_addr); |
611 | return r; | ||
612 | 626 | ||
613 | mutex_lock(&adev->vm_manager.lock); | 627 | r = amdgpu_fence_emit(ring, &fence); |
614 | dma_fence_put(id->last_flush); | 628 | if (r) |
615 | id->last_flush = fence; | 629 | return r; |
616 | mutex_unlock(&adev->vm_manager.lock); | ||
617 | } | ||
618 | 630 | ||
619 | if (gds_switch_needed) { | 631 | mutex_lock(&adev->vm_manager.lock); |
620 | id->gds_base = job->gds_base; | 632 | dma_fence_put(id->last_flush); |
621 | id->gds_size = job->gds_size; | 633 | id->last_flush = fence; |
622 | id->gws_base = job->gws_base; | 634 | mutex_unlock(&adev->vm_manager.lock); |
623 | id->gws_size = job->gws_size; | 635 | } |
624 | id->oa_base = job->oa_base; | ||
625 | id->oa_size = job->oa_size; | ||
626 | amdgpu_ring_emit_gds_switch(ring, job->vm_id, | ||
627 | job->gds_base, job->gds_size, | ||
628 | job->gws_base, job->gws_size, | ||
629 | job->oa_base, job->oa_size); | ||
630 | } | ||
631 | 636 | ||
632 | if (ring->funcs->patch_cond_exec) | 637 | if (gds_switch_needed) { |
633 | amdgpu_ring_patch_cond_exec(ring, patch_offset); | 638 | id->gds_base = job->gds_base; |
639 | id->gds_size = job->gds_size; | ||
640 | id->gws_base = job->gws_base; | ||
641 | id->gws_size = job->gws_size; | ||
642 | id->oa_base = job->oa_base; | ||
643 | id->oa_size = job->oa_size; | ||
644 | amdgpu_ring_emit_gds_switch(ring, job->vm_id, job->gds_base, | ||
645 | job->gds_size, job->gws_base, | ||
646 | job->gws_size, job->oa_base, | ||
647 | job->oa_size); | ||
648 | } | ||
634 | 649 | ||
635 | /* the double SWITCH_BUFFER here *cannot* be skipped by COND_EXEC */ | 650 | if (ring->funcs->patch_cond_exec) |
636 | if (ring->funcs->emit_switch_buffer) { | 651 | amdgpu_ring_patch_cond_exec(ring, patch_offset); |
637 | amdgpu_ring_emit_switch_buffer(ring); | 652 | |
638 | amdgpu_ring_emit_switch_buffer(ring); | 653 | /* the double SWITCH_BUFFER here *cannot* be skipped by COND_EXEC */ |
639 | } | 654 | if (ring->funcs->emit_switch_buffer) { |
655 | amdgpu_ring_emit_switch_buffer(ring); | ||
656 | amdgpu_ring_emit_switch_buffer(ring); | ||
640 | } | 657 | } |
641 | return 0; | 658 | return 0; |
642 | } | 659 | } |
@@ -960,7 +977,7 @@ static struct amdgpu_bo *amdgpu_vm_get_pt(struct amdgpu_pte_update_params *p, | |||
960 | unsigned idx, level = p->adev->vm_manager.num_level; | 977 | unsigned idx, level = p->adev->vm_manager.num_level; |
961 | 978 | ||
962 | while (entry->entries) { | 979 | while (entry->entries) { |
963 | idx = addr >> (amdgpu_vm_block_size * level--); | 980 | idx = addr >> (p->adev->vm_manager.block_size * level--); |
964 | idx %= amdgpu_bo_size(entry->bo) / 8; | 981 | idx %= amdgpu_bo_size(entry->bo) / 8; |
965 | entry = &entry->entries[idx]; | 982 | entry = &entry->entries[idx]; |
966 | } | 983 | } |
@@ -987,7 +1004,8 @@ static void amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
987 | uint64_t start, uint64_t end, | 1004 | uint64_t start, uint64_t end, |
988 | uint64_t dst, uint64_t flags) | 1005 | uint64_t dst, uint64_t flags) |
989 | { | 1006 | { |
990 | const uint64_t mask = AMDGPU_VM_PTE_COUNT - 1; | 1007 | struct amdgpu_device *adev = params->adev; |
1008 | const uint64_t mask = AMDGPU_VM_PTE_COUNT(adev) - 1; | ||
991 | 1009 | ||
992 | uint64_t cur_pe_start, cur_nptes, cur_dst; | 1010 | uint64_t cur_pe_start, cur_nptes, cur_dst; |
993 | uint64_t addr; /* next GPU address to be updated */ | 1011 | uint64_t addr; /* next GPU address to be updated */ |
@@ -1011,7 +1029,7 @@ static void amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
1011 | if ((addr & ~mask) == (end & ~mask)) | 1029 | if ((addr & ~mask) == (end & ~mask)) |
1012 | nptes = end - addr; | 1030 | nptes = end - addr; |
1013 | else | 1031 | else |
1014 | nptes = AMDGPU_VM_PTE_COUNT - (addr & mask); | 1032 | nptes = AMDGPU_VM_PTE_COUNT(adev) - (addr & mask); |
1015 | 1033 | ||
1016 | cur_pe_start = amdgpu_bo_gpu_offset(pt); | 1034 | cur_pe_start = amdgpu_bo_gpu_offset(pt); |
1017 | cur_pe_start += (addr & mask) * 8; | 1035 | cur_pe_start += (addr & mask) * 8; |
@@ -1039,7 +1057,7 @@ static void amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
1039 | if ((addr & ~mask) == (end & ~mask)) | 1057 | if ((addr & ~mask) == (end & ~mask)) |
1040 | nptes = end - addr; | 1058 | nptes = end - addr; |
1041 | else | 1059 | else |
1042 | nptes = AMDGPU_VM_PTE_COUNT - (addr & mask); | 1060 | nptes = AMDGPU_VM_PTE_COUNT(adev) - (addr & mask); |
1043 | 1061 | ||
1044 | next_pe_start = amdgpu_bo_gpu_offset(pt); | 1062 | next_pe_start = amdgpu_bo_gpu_offset(pt); |
1045 | next_pe_start += (addr & mask) * 8; | 1063 | next_pe_start += (addr & mask) * 8; |
@@ -1186,7 +1204,7 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev, | |||
1186 | * reserve space for one command every (1 << BLOCK_SIZE) | 1204 | * reserve space for one command every (1 << BLOCK_SIZE) |
1187 | * entries or 2k dwords (whatever is smaller) | 1205 | * entries or 2k dwords (whatever is smaller) |
1188 | */ | 1206 | */ |
1189 | ncmds = (nptes >> min(amdgpu_vm_block_size, 11)) + 1; | 1207 | ncmds = (nptes >> min(adev->vm_manager.block_size, 11u)) + 1; |
1190 | 1208 | ||
1191 | /* padding, etc. */ | 1209 | /* padding, etc. */ |
1192 | ndw = 64; | 1210 | ndw = 64; |
@@ -1301,7 +1319,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev, | |||
1301 | struct drm_mm_node *nodes, | 1319 | struct drm_mm_node *nodes, |
1302 | struct dma_fence **fence) | 1320 | struct dma_fence **fence) |
1303 | { | 1321 | { |
1304 | uint64_t pfn, src = 0, start = mapping->it.start; | 1322 | uint64_t pfn, src = 0, start = mapping->start; |
1305 | int r; | 1323 | int r; |
1306 | 1324 | ||
1307 | /* normally,bo_va->flags only contians READABLE and WIRTEABLE bit go here | 1325 | /* normally,bo_va->flags only contians READABLE and WIRTEABLE bit go here |
@@ -1353,7 +1371,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev, | |||
1353 | } | 1371 | } |
1354 | addr += pfn << PAGE_SHIFT; | 1372 | addr += pfn << PAGE_SHIFT; |
1355 | 1373 | ||
1356 | last = min((uint64_t)mapping->it.last, start + max_entries - 1); | 1374 | last = min((uint64_t)mapping->last, start + max_entries - 1); |
1357 | r = amdgpu_vm_bo_update_mapping(adev, exclusive, | 1375 | r = amdgpu_vm_bo_update_mapping(adev, exclusive, |
1358 | src, pages_addr, vm, | 1376 | src, pages_addr, vm, |
1359 | start, last, flags, addr, | 1377 | start, last, flags, addr, |
@@ -1368,7 +1386,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev, | |||
1368 | } | 1386 | } |
1369 | start = last + 1; | 1387 | start = last + 1; |
1370 | 1388 | ||
1371 | } while (unlikely(start != mapping->it.last + 1)); | 1389 | } while (unlikely(start != mapping->last + 1)); |
1372 | 1390 | ||
1373 | return 0; | 1391 | return 0; |
1374 | } | 1392 | } |
@@ -1518,7 +1536,7 @@ static void amdgpu_vm_add_prt_cb(struct amdgpu_device *adev, | |||
1518 | if (fence) | 1536 | if (fence) |
1519 | dma_fence_wait(fence, false); | 1537 | dma_fence_wait(fence, false); |
1520 | 1538 | ||
1521 | amdgpu_vm_prt_put(cb->adev); | 1539 | amdgpu_vm_prt_put(adev); |
1522 | } else { | 1540 | } else { |
1523 | cb->adev = adev; | 1541 | cb->adev = adev; |
1524 | if (!fence || dma_fence_add_callback(fence, &cb->cb, | 1542 | if (!fence || dma_fence_add_callback(fence, &cb->cb, |
@@ -1724,9 +1742,8 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, | |||
1724 | uint64_t saddr, uint64_t offset, | 1742 | uint64_t saddr, uint64_t offset, |
1725 | uint64_t size, uint64_t flags) | 1743 | uint64_t size, uint64_t flags) |
1726 | { | 1744 | { |
1727 | struct amdgpu_bo_va_mapping *mapping; | 1745 | struct amdgpu_bo_va_mapping *mapping, *tmp; |
1728 | struct amdgpu_vm *vm = bo_va->vm; | 1746 | struct amdgpu_vm *vm = bo_va->vm; |
1729 | struct interval_tree_node *it; | ||
1730 | uint64_t eaddr; | 1747 | uint64_t eaddr; |
1731 | 1748 | ||
1732 | /* validate the parameters */ | 1749 | /* validate the parameters */ |
@@ -1743,14 +1760,12 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, | |||
1743 | saddr /= AMDGPU_GPU_PAGE_SIZE; | 1760 | saddr /= AMDGPU_GPU_PAGE_SIZE; |
1744 | eaddr /= AMDGPU_GPU_PAGE_SIZE; | 1761 | eaddr /= AMDGPU_GPU_PAGE_SIZE; |
1745 | 1762 | ||
1746 | it = interval_tree_iter_first(&vm->va, saddr, eaddr); | 1763 | tmp = amdgpu_vm_it_iter_first(&vm->va, saddr, eaddr); |
1747 | if (it) { | 1764 | if (tmp) { |
1748 | struct amdgpu_bo_va_mapping *tmp; | ||
1749 | tmp = container_of(it, struct amdgpu_bo_va_mapping, it); | ||
1750 | /* bo and tmp overlap, invalid addr */ | 1765 | /* bo and tmp overlap, invalid addr */ |
1751 | dev_err(adev->dev, "bo %p va 0x%010Lx-0x%010Lx conflict with " | 1766 | dev_err(adev->dev, "bo %p va 0x%010Lx-0x%010Lx conflict with " |
1752 | "0x%010lx-0x%010lx\n", bo_va->bo, saddr, eaddr, | 1767 | "0x%010Lx-0x%010Lx\n", bo_va->bo, saddr, eaddr, |
1753 | tmp->it.start, tmp->it.last + 1); | 1768 | tmp->start, tmp->last + 1); |
1754 | return -EINVAL; | 1769 | return -EINVAL; |
1755 | } | 1770 | } |
1756 | 1771 | ||
@@ -1759,13 +1774,13 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, | |||
1759 | return -ENOMEM; | 1774 | return -ENOMEM; |
1760 | 1775 | ||
1761 | INIT_LIST_HEAD(&mapping->list); | 1776 | INIT_LIST_HEAD(&mapping->list); |
1762 | mapping->it.start = saddr; | 1777 | mapping->start = saddr; |
1763 | mapping->it.last = eaddr; | 1778 | mapping->last = eaddr; |
1764 | mapping->offset = offset; | 1779 | mapping->offset = offset; |
1765 | mapping->flags = flags; | 1780 | mapping->flags = flags; |
1766 | 1781 | ||
1767 | list_add(&mapping->list, &bo_va->invalids); | 1782 | list_add(&mapping->list, &bo_va->invalids); |
1768 | interval_tree_insert(&mapping->it, &vm->va); | 1783 | amdgpu_vm_it_insert(mapping, &vm->va); |
1769 | 1784 | ||
1770 | if (flags & AMDGPU_PTE_PRT) | 1785 | if (flags & AMDGPU_PTE_PRT) |
1771 | amdgpu_vm_prt_get(adev); | 1786 | amdgpu_vm_prt_get(adev); |
@@ -1823,13 +1838,13 @@ int amdgpu_vm_bo_replace_map(struct amdgpu_device *adev, | |||
1823 | saddr /= AMDGPU_GPU_PAGE_SIZE; | 1838 | saddr /= AMDGPU_GPU_PAGE_SIZE; |
1824 | eaddr /= AMDGPU_GPU_PAGE_SIZE; | 1839 | eaddr /= AMDGPU_GPU_PAGE_SIZE; |
1825 | 1840 | ||
1826 | mapping->it.start = saddr; | 1841 | mapping->start = saddr; |
1827 | mapping->it.last = eaddr; | 1842 | mapping->last = eaddr; |
1828 | mapping->offset = offset; | 1843 | mapping->offset = offset; |
1829 | mapping->flags = flags; | 1844 | mapping->flags = flags; |
1830 | 1845 | ||
1831 | list_add(&mapping->list, &bo_va->invalids); | 1846 | list_add(&mapping->list, &bo_va->invalids); |
1832 | interval_tree_insert(&mapping->it, &vm->va); | 1847 | amdgpu_vm_it_insert(mapping, &vm->va); |
1833 | 1848 | ||
1834 | if (flags & AMDGPU_PTE_PRT) | 1849 | if (flags & AMDGPU_PTE_PRT) |
1835 | amdgpu_vm_prt_get(adev); | 1850 | amdgpu_vm_prt_get(adev); |
@@ -1860,7 +1875,7 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev, | |||
1860 | saddr /= AMDGPU_GPU_PAGE_SIZE; | 1875 | saddr /= AMDGPU_GPU_PAGE_SIZE; |
1861 | 1876 | ||
1862 | list_for_each_entry(mapping, &bo_va->valids, list) { | 1877 | list_for_each_entry(mapping, &bo_va->valids, list) { |
1863 | if (mapping->it.start == saddr) | 1878 | if (mapping->start == saddr) |
1864 | break; | 1879 | break; |
1865 | } | 1880 | } |
1866 | 1881 | ||
@@ -1868,7 +1883,7 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev, | |||
1868 | valid = false; | 1883 | valid = false; |
1869 | 1884 | ||
1870 | list_for_each_entry(mapping, &bo_va->invalids, list) { | 1885 | list_for_each_entry(mapping, &bo_va->invalids, list) { |
1871 | if (mapping->it.start == saddr) | 1886 | if (mapping->start == saddr) |
1872 | break; | 1887 | break; |
1873 | } | 1888 | } |
1874 | 1889 | ||
@@ -1877,7 +1892,7 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev, | |||
1877 | } | 1892 | } |
1878 | 1893 | ||
1879 | list_del(&mapping->list); | 1894 | list_del(&mapping->list); |
1880 | interval_tree_remove(&mapping->it, &vm->va); | 1895 | amdgpu_vm_it_remove(mapping, &vm->va); |
1881 | trace_amdgpu_vm_bo_unmap(bo_va, mapping); | 1896 | trace_amdgpu_vm_bo_unmap(bo_va, mapping); |
1882 | 1897 | ||
1883 | if (valid) | 1898 | if (valid) |
@@ -1905,7 +1920,6 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev, | |||
1905 | uint64_t saddr, uint64_t size) | 1920 | uint64_t saddr, uint64_t size) |
1906 | { | 1921 | { |
1907 | struct amdgpu_bo_va_mapping *before, *after, *tmp, *next; | 1922 | struct amdgpu_bo_va_mapping *before, *after, *tmp, *next; |
1908 | struct interval_tree_node *it; | ||
1909 | LIST_HEAD(removed); | 1923 | LIST_HEAD(removed); |
1910 | uint64_t eaddr; | 1924 | uint64_t eaddr; |
1911 | 1925 | ||
@@ -1927,43 +1941,42 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev, | |||
1927 | INIT_LIST_HEAD(&after->list); | 1941 | INIT_LIST_HEAD(&after->list); |
1928 | 1942 | ||
1929 | /* Now gather all removed mappings */ | 1943 | /* Now gather all removed mappings */ |
1930 | it = interval_tree_iter_first(&vm->va, saddr, eaddr); | 1944 | tmp = amdgpu_vm_it_iter_first(&vm->va, saddr, eaddr); |
1931 | while (it) { | 1945 | while (tmp) { |
1932 | tmp = container_of(it, struct amdgpu_bo_va_mapping, it); | ||
1933 | it = interval_tree_iter_next(it, saddr, eaddr); | ||
1934 | |||
1935 | /* Remember mapping split at the start */ | 1946 | /* Remember mapping split at the start */ |
1936 | if (tmp->it.start < saddr) { | 1947 | if (tmp->start < saddr) { |
1937 | before->it.start = tmp->it.start; | 1948 | before->start = tmp->start; |
1938 | before->it.last = saddr - 1; | 1949 | before->last = saddr - 1; |
1939 | before->offset = tmp->offset; | 1950 | before->offset = tmp->offset; |
1940 | before->flags = tmp->flags; | 1951 | before->flags = tmp->flags; |
1941 | list_add(&before->list, &tmp->list); | 1952 | list_add(&before->list, &tmp->list); |
1942 | } | 1953 | } |
1943 | 1954 | ||
1944 | /* Remember mapping split at the end */ | 1955 | /* Remember mapping split at the end */ |
1945 | if (tmp->it.last > eaddr) { | 1956 | if (tmp->last > eaddr) { |
1946 | after->it.start = eaddr + 1; | 1957 | after->start = eaddr + 1; |
1947 | after->it.last = tmp->it.last; | 1958 | after->last = tmp->last; |
1948 | after->offset = tmp->offset; | 1959 | after->offset = tmp->offset; |
1949 | after->offset += after->it.start - tmp->it.start; | 1960 | after->offset += after->start - tmp->start; |
1950 | after->flags = tmp->flags; | 1961 | after->flags = tmp->flags; |
1951 | list_add(&after->list, &tmp->list); | 1962 | list_add(&after->list, &tmp->list); |
1952 | } | 1963 | } |
1953 | 1964 | ||
1954 | list_del(&tmp->list); | 1965 | list_del(&tmp->list); |
1955 | list_add(&tmp->list, &removed); | 1966 | list_add(&tmp->list, &removed); |
1967 | |||
1968 | tmp = amdgpu_vm_it_iter_next(tmp, saddr, eaddr); | ||
1956 | } | 1969 | } |
1957 | 1970 | ||
1958 | /* And free them up */ | 1971 | /* And free them up */ |
1959 | list_for_each_entry_safe(tmp, next, &removed, list) { | 1972 | list_for_each_entry_safe(tmp, next, &removed, list) { |
1960 | interval_tree_remove(&tmp->it, &vm->va); | 1973 | amdgpu_vm_it_remove(tmp, &vm->va); |
1961 | list_del(&tmp->list); | 1974 | list_del(&tmp->list); |
1962 | 1975 | ||
1963 | if (tmp->it.start < saddr) | 1976 | if (tmp->start < saddr) |
1964 | tmp->it.start = saddr; | 1977 | tmp->start = saddr; |
1965 | if (tmp->it.last > eaddr) | 1978 | if (tmp->last > eaddr) |
1966 | tmp->it.last = eaddr; | 1979 | tmp->last = eaddr; |
1967 | 1980 | ||
1968 | list_add(&tmp->list, &vm->freed); | 1981 | list_add(&tmp->list, &vm->freed); |
1969 | trace_amdgpu_vm_bo_unmap(NULL, tmp); | 1982 | trace_amdgpu_vm_bo_unmap(NULL, tmp); |
@@ -1971,7 +1984,7 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev, | |||
1971 | 1984 | ||
1972 | /* Insert partial mapping before the range */ | 1985 | /* Insert partial mapping before the range */ |
1973 | if (!list_empty(&before->list)) { | 1986 | if (!list_empty(&before->list)) { |
1974 | interval_tree_insert(&before->it, &vm->va); | 1987 | amdgpu_vm_it_insert(before, &vm->va); |
1975 | if (before->flags & AMDGPU_PTE_PRT) | 1988 | if (before->flags & AMDGPU_PTE_PRT) |
1976 | amdgpu_vm_prt_get(adev); | 1989 | amdgpu_vm_prt_get(adev); |
1977 | } else { | 1990 | } else { |
@@ -1980,7 +1993,7 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev, | |||
1980 | 1993 | ||
1981 | /* Insert partial mapping after the range */ | 1994 | /* Insert partial mapping after the range */ |
1982 | if (!list_empty(&after->list)) { | 1995 | if (!list_empty(&after->list)) { |
1983 | interval_tree_insert(&after->it, &vm->va); | 1996 | amdgpu_vm_it_insert(after, &vm->va); |
1984 | if (after->flags & AMDGPU_PTE_PRT) | 1997 | if (after->flags & AMDGPU_PTE_PRT) |
1985 | amdgpu_vm_prt_get(adev); | 1998 | amdgpu_vm_prt_get(adev); |
1986 | } else { | 1999 | } else { |
@@ -2014,13 +2027,13 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, | |||
2014 | 2027 | ||
2015 | list_for_each_entry_safe(mapping, next, &bo_va->valids, list) { | 2028 | list_for_each_entry_safe(mapping, next, &bo_va->valids, list) { |
2016 | list_del(&mapping->list); | 2029 | list_del(&mapping->list); |
2017 | interval_tree_remove(&mapping->it, &vm->va); | 2030 | amdgpu_vm_it_remove(mapping, &vm->va); |
2018 | trace_amdgpu_vm_bo_unmap(bo_va, mapping); | 2031 | trace_amdgpu_vm_bo_unmap(bo_va, mapping); |
2019 | list_add(&mapping->list, &vm->freed); | 2032 | list_add(&mapping->list, &vm->freed); |
2020 | } | 2033 | } |
2021 | list_for_each_entry_safe(mapping, next, &bo_va->invalids, list) { | 2034 | list_for_each_entry_safe(mapping, next, &bo_va->invalids, list) { |
2022 | list_del(&mapping->list); | 2035 | list_del(&mapping->list); |
2023 | interval_tree_remove(&mapping->it, &vm->va); | 2036 | amdgpu_vm_it_remove(mapping, &vm->va); |
2024 | amdgpu_vm_free_mapping(adev, vm, mapping, | 2037 | amdgpu_vm_free_mapping(adev, vm, mapping, |
2025 | bo_va->last_pt_update); | 2038 | bo_va->last_pt_update); |
2026 | } | 2039 | } |
@@ -2062,7 +2075,7 @@ void amdgpu_vm_bo_invalidate(struct amdgpu_device *adev, | |||
2062 | int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) | 2075 | int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) |
2063 | { | 2076 | { |
2064 | const unsigned align = min(AMDGPU_VM_PTB_ALIGN_SIZE, | 2077 | const unsigned align = min(AMDGPU_VM_PTB_ALIGN_SIZE, |
2065 | AMDGPU_VM_PTE_COUNT * 8); | 2078 | AMDGPU_VM_PTE_COUNT(adev) * 8); |
2066 | unsigned ring_instance; | 2079 | unsigned ring_instance; |
2067 | struct amdgpu_ring *ring; | 2080 | struct amdgpu_ring *ring; |
2068 | struct amd_sched_rq *rq; | 2081 | struct amd_sched_rq *rq; |
@@ -2162,9 +2175,9 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm) | |||
2162 | if (!RB_EMPTY_ROOT(&vm->va)) { | 2175 | if (!RB_EMPTY_ROOT(&vm->va)) { |
2163 | dev_err(adev->dev, "still active bo inside vm\n"); | 2176 | dev_err(adev->dev, "still active bo inside vm\n"); |
2164 | } | 2177 | } |
2165 | rbtree_postorder_for_each_entry_safe(mapping, tmp, &vm->va, it.rb) { | 2178 | rbtree_postorder_for_each_entry_safe(mapping, tmp, &vm->va, rb) { |
2166 | list_del(&mapping->list); | 2179 | list_del(&mapping->list); |
2167 | interval_tree_remove(&mapping->it, &vm->va); | 2180 | amdgpu_vm_it_remove(mapping, &vm->va); |
2168 | kfree(mapping); | 2181 | kfree(mapping); |
2169 | } | 2182 | } |
2170 | list_for_each_entry_safe(mapping, tmp, &vm->freed, list) { | 2183 | list_for_each_entry_safe(mapping, tmp, &vm->freed, list) { |
@@ -2227,7 +2240,6 @@ void amdgpu_vm_manager_fini(struct amdgpu_device *adev) | |||
2227 | for (i = 0; i < AMDGPU_NUM_VM; ++i) { | 2240 | for (i = 0; i < AMDGPU_NUM_VM; ++i) { |
2228 | struct amdgpu_vm_id *id = &adev->vm_manager.ids[i]; | 2241 | struct amdgpu_vm_id *id = &adev->vm_manager.ids[i]; |
2229 | 2242 | ||
2230 | dma_fence_put(adev->vm_manager.ids[i].first); | ||
2231 | amdgpu_sync_free(&adev->vm_manager.ids[i].active); | 2243 | amdgpu_sync_free(&adev->vm_manager.ids[i].active); |
2232 | dma_fence_put(id->flushed_updates); | 2244 | dma_fence_put(id->flushed_updates); |
2233 | dma_fence_put(id->last_flush); | 2245 | dma_fence_put(id->last_flush); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h index fbe17bf73a00..02b0dd3b135f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | |||
@@ -45,7 +45,7 @@ struct amdgpu_bo_list_entry; | |||
45 | #define AMDGPU_VM_MAX_UPDATE_SIZE 0x3FFFF | 45 | #define AMDGPU_VM_MAX_UPDATE_SIZE 0x3FFFF |
46 | 46 | ||
47 | /* number of entries in page table */ | 47 | /* number of entries in page table */ |
48 | #define AMDGPU_VM_PTE_COUNT (1 << amdgpu_vm_block_size) | 48 | #define AMDGPU_VM_PTE_COUNT(adev) (1 << (adev)->vm_manager.block_size) |
49 | 49 | ||
50 | /* PTBs (Page Table Blocks) need to be aligned to 32K */ | 50 | /* PTBs (Page Table Blocks) need to be aligned to 32K */ |
51 | #define AMDGPU_VM_PTB_ALIGN_SIZE 32768 | 51 | #define AMDGPU_VM_PTB_ALIGN_SIZE 32768 |
@@ -76,6 +76,14 @@ struct amdgpu_bo_list_entry; | |||
76 | #define AMDGPU_VM_FAULT_STOP_FIRST 1 | 76 | #define AMDGPU_VM_FAULT_STOP_FIRST 1 |
77 | #define AMDGPU_VM_FAULT_STOP_ALWAYS 2 | 77 | #define AMDGPU_VM_FAULT_STOP_ALWAYS 2 |
78 | 78 | ||
79 | /* max number of VMHUB */ | ||
80 | #define AMDGPU_MAX_VMHUBS 2 | ||
81 | #define AMDGPU_GFXHUB 0 | ||
82 | #define AMDGPU_MMHUB 1 | ||
83 | |||
84 | /* hardcode that limit for now */ | ||
85 | #define AMDGPU_VA_RESERVED_SIZE (8 << 20) | ||
86 | |||
79 | struct amdgpu_vm_pt { | 87 | struct amdgpu_vm_pt { |
80 | struct amdgpu_bo *bo; | 88 | struct amdgpu_bo *bo; |
81 | uint64_t addr; | 89 | uint64_t addr; |
@@ -123,7 +131,6 @@ struct amdgpu_vm { | |||
123 | 131 | ||
124 | struct amdgpu_vm_id { | 132 | struct amdgpu_vm_id { |
125 | struct list_head list; | 133 | struct list_head list; |
126 | struct dma_fence *first; | ||
127 | struct amdgpu_sync active; | 134 | struct amdgpu_sync active; |
128 | struct dma_fence *last_flush; | 135 | struct dma_fence *last_flush; |
129 | atomic64_t owner; | 136 | atomic64_t owner; |
@@ -155,6 +162,8 @@ struct amdgpu_vm_manager { | |||
155 | 162 | ||
156 | uint64_t max_pfn; | 163 | uint64_t max_pfn; |
157 | uint32_t num_level; | 164 | uint32_t num_level; |
165 | uint64_t vm_size; | ||
166 | uint32_t block_size; | ||
158 | /* vram base address for page table entry */ | 167 | /* vram base address for page table entry */ |
159 | u64 vram_base_offset; | 168 | u64 vram_base_offset; |
160 | /* is vm enabled? */ | 169 | /* is vm enabled? */ |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 9e577e3d3147..a4831fe0223b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | |||
@@ -93,7 +93,6 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, | |||
93 | const struct ttm_place *place, | 93 | const struct ttm_place *place, |
94 | struct ttm_mem_reg *mem) | 94 | struct ttm_mem_reg *mem) |
95 | { | 95 | { |
96 | struct amdgpu_bo *bo = container_of(tbo, struct amdgpu_bo, tbo); | ||
97 | struct amdgpu_vram_mgr *mgr = man->priv; | 96 | struct amdgpu_vram_mgr *mgr = man->priv; |
98 | struct drm_mm *mm = &mgr->mm; | 97 | struct drm_mm *mm = &mgr->mm; |
99 | struct drm_mm_node *nodes; | 98 | struct drm_mm_node *nodes; |
@@ -106,8 +105,8 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, | |||
106 | if (!lpfn) | 105 | if (!lpfn) |
107 | lpfn = man->size; | 106 | lpfn = man->size; |
108 | 107 | ||
109 | if (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS || | 108 | if (place->flags & TTM_PL_FLAG_CONTIGUOUS || |
110 | place->lpfn || amdgpu_vram_page_split == -1) { | 109 | amdgpu_vram_page_split == -1) { |
111 | pages_per_node = ~0ul; | 110 | pages_per_node = ~0ul; |
112 | num_nodes = 1; | 111 | num_nodes = 1; |
113 | } else { | 112 | } else { |
@@ -124,12 +123,14 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, | |||
124 | if (place->flags & TTM_PL_FLAG_TOPDOWN) | 123 | if (place->flags & TTM_PL_FLAG_TOPDOWN) |
125 | mode = DRM_MM_INSERT_HIGH; | 124 | mode = DRM_MM_INSERT_HIGH; |
126 | 125 | ||
126 | mem->start = 0; | ||
127 | pages_left = mem->num_pages; | 127 | pages_left = mem->num_pages; |
128 | 128 | ||
129 | spin_lock(&mgr->lock); | 129 | spin_lock(&mgr->lock); |
130 | for (i = 0; i < num_nodes; ++i) { | 130 | for (i = 0; i < num_nodes; ++i) { |
131 | unsigned long pages = min(pages_left, pages_per_node); | 131 | unsigned long pages = min(pages_left, pages_per_node); |
132 | uint32_t alignment = mem->page_alignment; | 132 | uint32_t alignment = mem->page_alignment; |
133 | unsigned long start; | ||
133 | 134 | ||
134 | if (pages == pages_per_node) | 135 | if (pages == pages_per_node) |
135 | alignment = pages_per_node; | 136 | alignment = pages_per_node; |
@@ -141,11 +142,19 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, | |||
141 | if (unlikely(r)) | 142 | if (unlikely(r)) |
142 | goto error; | 143 | goto error; |
143 | 144 | ||
145 | /* Calculate a virtual BO start address to easily check if | ||
146 | * everything is CPU accessible. | ||
147 | */ | ||
148 | start = nodes[i].start + nodes[i].size; | ||
149 | if (start > mem->num_pages) | ||
150 | start -= mem->num_pages; | ||
151 | else | ||
152 | start = 0; | ||
153 | mem->start = max(mem->start, start); | ||
144 | pages_left -= pages; | 154 | pages_left -= pages; |
145 | } | 155 | } |
146 | spin_unlock(&mgr->lock); | 156 | spin_unlock(&mgr->lock); |
147 | 157 | ||
148 | mem->start = num_nodes == 1 ? nodes[0].start : AMDGPU_BO_INVALID_OFFSET; | ||
149 | mem->mm_node = nodes; | 158 | mem->mm_node = nodes; |
150 | 159 | ||
151 | return 0; | 160 | return 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index e0fa0d30e162..dad8a4cd1b37 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -4565,6 +4565,7 @@ static void gfx_v8_0_cp_compute_enable(struct amdgpu_device *adev, bool enable) | |||
4565 | WREG32(mmCP_MEC_CNTL, (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); | 4565 | WREG32(mmCP_MEC_CNTL, (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); |
4566 | for (i = 0; i < adev->gfx.num_compute_rings; i++) | 4566 | for (i = 0; i < adev->gfx.num_compute_rings; i++) |
4567 | adev->gfx.compute_ring[i].ready = false; | 4567 | adev->gfx.compute_ring[i].ready = false; |
4568 | adev->gfx.kiq.ring.ready = false; | ||
4568 | } | 4569 | } |
4569 | udelay(50); | 4570 | udelay(50); |
4570 | } | 4571 | } |
@@ -4721,14 +4722,10 @@ static int gfx_v8_0_mqd_init(struct amdgpu_ring *ring) | |||
4721 | mqd->cp_hqd_eop_control = tmp; | 4722 | mqd->cp_hqd_eop_control = tmp; |
4722 | 4723 | ||
4723 | /* enable doorbell? */ | 4724 | /* enable doorbell? */ |
4724 | tmp = RREG32(mmCP_HQD_PQ_DOORBELL_CONTROL); | 4725 | tmp = REG_SET_FIELD(RREG32(mmCP_HQD_PQ_DOORBELL_CONTROL), |
4725 | 4726 | CP_HQD_PQ_DOORBELL_CONTROL, | |
4726 | if (ring->use_doorbell) | 4727 | DOORBELL_EN, |
4727 | tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, | 4728 | ring->use_doorbell ? 1 : 0); |
4728 | DOORBELL_EN, 1); | ||
4729 | else | ||
4730 | tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, | ||
4731 | DOORBELL_EN, 0); | ||
4732 | 4729 | ||
4733 | mqd->cp_hqd_pq_doorbell_control = tmp; | 4730 | mqd->cp_hqd_pq_doorbell_control = tmp; |
4734 | 4731 | ||
@@ -4816,13 +4813,10 @@ static int gfx_v8_0_kiq_init_register(struct amdgpu_ring *ring) | |||
4816 | { | 4813 | { |
4817 | struct amdgpu_device *adev = ring->adev; | 4814 | struct amdgpu_device *adev = ring->adev; |
4818 | struct vi_mqd *mqd = ring->mqd_ptr; | 4815 | struct vi_mqd *mqd = ring->mqd_ptr; |
4819 | uint32_t tmp; | ||
4820 | int j; | 4816 | int j; |
4821 | 4817 | ||
4822 | /* disable wptr polling */ | 4818 | /* disable wptr polling */ |
4823 | tmp = RREG32(mmCP_PQ_WPTR_POLL_CNTL); | 4819 | WREG32_FIELD(CP_PQ_WPTR_POLL_CNTL, EN, 0); |
4824 | tmp = REG_SET_FIELD(tmp, CP_PQ_WPTR_POLL_CNTL, EN, 0); | ||
4825 | WREG32(mmCP_PQ_WPTR_POLL_CNTL, tmp); | ||
4826 | 4820 | ||
4827 | WREG32(mmCP_HQD_EOP_BASE_ADDR, mqd->cp_hqd_eop_base_addr_lo); | 4821 | WREG32(mmCP_HQD_EOP_BASE_ADDR, mqd->cp_hqd_eop_base_addr_lo); |
4828 | WREG32(mmCP_HQD_EOP_BASE_ADDR_HI, mqd->cp_hqd_eop_base_addr_hi); | 4822 | WREG32(mmCP_HQD_EOP_BASE_ADDR_HI, mqd->cp_hqd_eop_base_addr_hi); |
@@ -4834,10 +4828,10 @@ static int gfx_v8_0_kiq_init_register(struct amdgpu_ring *ring) | |||
4834 | WREG32(mmCP_HQD_PQ_DOORBELL_CONTROL, mqd->cp_hqd_pq_doorbell_control); | 4828 | WREG32(mmCP_HQD_PQ_DOORBELL_CONTROL, mqd->cp_hqd_pq_doorbell_control); |
4835 | 4829 | ||
4836 | /* disable the queue if it's active */ | 4830 | /* disable the queue if it's active */ |
4837 | if (RREG32(mmCP_HQD_ACTIVE) & 1) { | 4831 | if (RREG32(mmCP_HQD_ACTIVE) & CP_HQD_ACTIVE__ACTIVE_MASK) { |
4838 | WREG32(mmCP_HQD_DEQUEUE_REQUEST, 1); | 4832 | WREG32(mmCP_HQD_DEQUEUE_REQUEST, 1); |
4839 | for (j = 0; j < adev->usec_timeout; j++) { | 4833 | for (j = 0; j < adev->usec_timeout; j++) { |
4840 | if (!(RREG32(mmCP_HQD_ACTIVE) & 1)) | 4834 | if (!(RREG32(mmCP_HQD_ACTIVE) & CP_HQD_ACTIVE__ACTIVE_MASK)) |
4841 | break; | 4835 | break; |
4842 | udelay(1); | 4836 | udelay(1); |
4843 | } | 4837 | } |
@@ -4894,11 +4888,8 @@ static int gfx_v8_0_kiq_init_register(struct amdgpu_ring *ring) | |||
4894 | /* activate the queue */ | 4888 | /* activate the queue */ |
4895 | WREG32(mmCP_HQD_ACTIVE, mqd->cp_hqd_active); | 4889 | WREG32(mmCP_HQD_ACTIVE, mqd->cp_hqd_active); |
4896 | 4890 | ||
4897 | if (ring->use_doorbell) { | 4891 | if (ring->use_doorbell) |
4898 | tmp = RREG32(mmCP_PQ_STATUS); | 4892 | WREG32_FIELD(CP_PQ_STATUS, DOORBELL_ENABLE, 1); |
4899 | tmp = REG_SET_FIELD(tmp, CP_PQ_STATUS, DOORBELL_ENABLE, 1); | ||
4900 | WREG32(mmCP_PQ_STATUS, tmp); | ||
4901 | } | ||
4902 | 4893 | ||
4903 | return 0; | 4894 | return 0; |
4904 | } | 4895 | } |
@@ -5471,19 +5462,18 @@ static void gfx_v8_0_inactive_hqd(struct amdgpu_device *adev, | |||
5471 | { | 5462 | { |
5472 | int i; | 5463 | int i; |
5473 | 5464 | ||
5465 | mutex_lock(&adev->srbm_mutex); | ||
5474 | vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0); | 5466 | vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0); |
5475 | if (RREG32(mmCP_HQD_ACTIVE) & CP_HQD_ACTIVE__ACTIVE_MASK) { | 5467 | if (RREG32(mmCP_HQD_ACTIVE) & CP_HQD_ACTIVE__ACTIVE_MASK) { |
5476 | u32 tmp; | 5468 | WREG32_FIELD(CP_HQD_DEQUEUE_REQUEST, DEQUEUE_REQ, 2); |
5477 | tmp = RREG32(mmCP_HQD_DEQUEUE_REQUEST); | ||
5478 | tmp = REG_SET_FIELD(tmp, CP_HQD_DEQUEUE_REQUEST, | ||
5479 | DEQUEUE_REQ, 2); | ||
5480 | WREG32(mmCP_HQD_DEQUEUE_REQUEST, tmp); | ||
5481 | for (i = 0; i < adev->usec_timeout; i++) { | 5469 | for (i = 0; i < adev->usec_timeout; i++) { |
5482 | if (!(RREG32(mmCP_HQD_ACTIVE) & CP_HQD_ACTIVE__ACTIVE_MASK)) | 5470 | if (!(RREG32(mmCP_HQD_ACTIVE) & CP_HQD_ACTIVE__ACTIVE_MASK)) |
5483 | break; | 5471 | break; |
5484 | udelay(1); | 5472 | udelay(1); |
5485 | } | 5473 | } |
5486 | } | 5474 | } |
5475 | vi_srbm_select(adev, 0, 0, 0, 0); | ||
5476 | mutex_unlock(&adev->srbm_mutex); | ||
5487 | } | 5477 | } |
5488 | 5478 | ||
5489 | static int gfx_v8_0_pre_soft_reset(void *handle) | 5479 | static int gfx_v8_0_pre_soft_reset(void *handle) |
@@ -5589,11 +5579,13 @@ static int gfx_v8_0_soft_reset(void *handle) | |||
5589 | static void gfx_v8_0_init_hqd(struct amdgpu_device *adev, | 5579 | static void gfx_v8_0_init_hqd(struct amdgpu_device *adev, |
5590 | struct amdgpu_ring *ring) | 5580 | struct amdgpu_ring *ring) |
5591 | { | 5581 | { |
5582 | mutex_lock(&adev->srbm_mutex); | ||
5592 | vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0); | 5583 | vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0); |
5593 | WREG32(mmCP_HQD_DEQUEUE_REQUEST, 0); | 5584 | WREG32(mmCP_HQD_DEQUEUE_REQUEST, 0); |
5594 | WREG32(mmCP_HQD_PQ_RPTR, 0); | 5585 | WREG32(mmCP_HQD_PQ_RPTR, 0); |
5595 | WREG32(mmCP_HQD_PQ_WPTR, 0); | 5586 | WREG32(mmCP_HQD_PQ_WPTR, 0); |
5596 | vi_srbm_select(adev, 0, 0, 0, 0); | 5587 | vi_srbm_select(adev, 0, 0, 0, 0); |
5588 | mutex_unlock(&adev->srbm_mutex); | ||
5597 | } | 5589 | } |
5598 | 5590 | ||
5599 | static int gfx_v8_0_post_soft_reset(void *handle) | 5591 | static int gfx_v8_0_post_soft_reset(void *handle) |
@@ -6986,40 +6978,24 @@ static int gfx_v8_0_kiq_set_interrupt_state(struct amdgpu_device *adev, | |||
6986 | unsigned int type, | 6978 | unsigned int type, |
6987 | enum amdgpu_interrupt_state state) | 6979 | enum amdgpu_interrupt_state state) |
6988 | { | 6980 | { |
6989 | uint32_t tmp, target; | ||
6990 | struct amdgpu_ring *ring = &(adev->gfx.kiq.ring); | 6981 | struct amdgpu_ring *ring = &(adev->gfx.kiq.ring); |
6991 | 6982 | ||
6992 | BUG_ON(ring->funcs->type != AMDGPU_RING_TYPE_KIQ); | 6983 | BUG_ON(ring->funcs->type != AMDGPU_RING_TYPE_KIQ); |
6993 | 6984 | ||
6994 | if (ring->me == 1) | ||
6995 | target = mmCP_ME1_PIPE0_INT_CNTL; | ||
6996 | else | ||
6997 | target = mmCP_ME2_PIPE0_INT_CNTL; | ||
6998 | target += ring->pipe; | ||
6999 | |||
7000 | switch (type) { | 6985 | switch (type) { |
7001 | case AMDGPU_CP_KIQ_IRQ_DRIVER0: | 6986 | case AMDGPU_CP_KIQ_IRQ_DRIVER0: |
7002 | if (state == AMDGPU_IRQ_STATE_DISABLE) { | 6987 | WREG32_FIELD(CPC_INT_CNTL, GENERIC2_INT_ENABLE, |
7003 | tmp = RREG32(mmCPC_INT_CNTL); | 6988 | state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1); |
7004 | tmp = REG_SET_FIELD(tmp, CPC_INT_CNTL, | 6989 | if (ring->me == 1) |
7005 | GENERIC2_INT_ENABLE, 0); | 6990 | WREG32_FIELD_OFFSET(CP_ME1_PIPE0_INT_CNTL, |
7006 | WREG32(mmCPC_INT_CNTL, tmp); | 6991 | ring->pipe, |
7007 | 6992 | GENERIC2_INT_ENABLE, | |
7008 | tmp = RREG32(target); | 6993 | state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1); |
7009 | tmp = REG_SET_FIELD(tmp, CP_ME2_PIPE0_INT_CNTL, | 6994 | else |
7010 | GENERIC2_INT_ENABLE, 0); | 6995 | WREG32_FIELD_OFFSET(CP_ME2_PIPE0_INT_CNTL, |
7011 | WREG32(target, tmp); | 6996 | ring->pipe, |
7012 | } else { | 6997 | GENERIC2_INT_ENABLE, |
7013 | tmp = RREG32(mmCPC_INT_CNTL); | 6998 | state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1); |
7014 | tmp = REG_SET_FIELD(tmp, CPC_INT_CNTL, | ||
7015 | GENERIC2_INT_ENABLE, 1); | ||
7016 | WREG32(mmCPC_INT_CNTL, tmp); | ||
7017 | |||
7018 | tmp = RREG32(target); | ||
7019 | tmp = REG_SET_FIELD(tmp, CP_ME2_PIPE0_INT_CNTL, | ||
7020 | GENERIC2_INT_ENABLE, 1); | ||
7021 | WREG32(target, tmp); | ||
7022 | } | ||
7023 | break; | 6999 | break; |
7024 | default: | 7000 | default: |
7025 | BUG(); /* kiq only support GENERIC2_INT now */ | 7001 | BUG(); /* kiq only support GENERIC2_INT now */ |
@@ -7159,8 +7135,6 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_kiq = { | |||
7159 | .emit_ib_size = 4, /* gfx_v8_0_ring_emit_ib_compute */ | 7135 | .emit_ib_size = 4, /* gfx_v8_0_ring_emit_ib_compute */ |
7160 | .emit_ib = gfx_v8_0_ring_emit_ib_compute, | 7136 | .emit_ib = gfx_v8_0_ring_emit_ib_compute, |
7161 | .emit_fence = gfx_v8_0_ring_emit_fence_kiq, | 7137 | .emit_fence = gfx_v8_0_ring_emit_fence_kiq, |
7162 | .emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush, | ||
7163 | .emit_hdp_invalidate = gfx_v8_0_ring_emit_hdp_invalidate, | ||
7164 | .test_ring = gfx_v8_0_ring_test_ring, | 7138 | .test_ring = gfx_v8_0_ring_test_ring, |
7165 | .test_ib = gfx_v8_0_ring_test_ib, | 7139 | .test_ib = gfx_v8_0_ring_test_ib, |
7166 | .insert_nop = amdgpu_ring_insert_nop, | 7140 | .insert_nop = amdgpu_ring_insert_nop, |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index 669bb98fc45d..a447b70841c9 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | |||
@@ -1288,9 +1288,7 @@ static void gfx_v9_0_gpu_init(struct amdgpu_device *adev) | |||
1288 | u32 tmp; | 1288 | u32 tmp; |
1289 | int i; | 1289 | int i; |
1290 | 1290 | ||
1291 | tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_CNTL)); | 1291 | WREG32_FIELD15(GC, 0, GRBM_CNTL, READ_TIMEOUT, 0xff); |
1292 | tmp = REG_SET_FIELD(tmp, GRBM_CNTL, READ_TIMEOUT, 0xff); | ||
1293 | WREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_CNTL), tmp); | ||
1294 | 1292 | ||
1295 | gfx_v9_0_tiling_mode_table_init(adev); | 1293 | gfx_v9_0_tiling_mode_table_init(adev); |
1296 | 1294 | ||
@@ -1395,13 +1393,9 @@ void gfx_v9_0_rlc_stop(struct amdgpu_device *adev) | |||
1395 | 1393 | ||
1396 | static void gfx_v9_0_rlc_reset(struct amdgpu_device *adev) | 1394 | static void gfx_v9_0_rlc_reset(struct amdgpu_device *adev) |
1397 | { | 1395 | { |
1398 | u32 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_SOFT_RESET)); | 1396 | WREG32_FIELD15(GC, 0, GRBM_SOFT_RESET, SOFT_RESET_RLC, 1); |
1399 | |||
1400 | tmp = REG_SET_FIELD(tmp, GRBM_SOFT_RESET, SOFT_RESET_RLC, 1); | ||
1401 | WREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_SOFT_RESET), tmp); | ||
1402 | udelay(50); | 1397 | udelay(50); |
1403 | tmp = REG_SET_FIELD(tmp, GRBM_SOFT_RESET, SOFT_RESET_RLC, 0); | 1398 | WREG32_FIELD15(GC, 0, GRBM_SOFT_RESET, SOFT_RESET_RLC, 0); |
1404 | WREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_SOFT_RESET), tmp); | ||
1405 | udelay(50); | 1399 | udelay(50); |
1406 | } | 1400 | } |
1407 | 1401 | ||
@@ -1410,10 +1404,8 @@ static void gfx_v9_0_rlc_start(struct amdgpu_device *adev) | |||
1410 | #ifdef AMDGPU_RLC_DEBUG_RETRY | 1404 | #ifdef AMDGPU_RLC_DEBUG_RETRY |
1411 | u32 rlc_ucode_ver; | 1405 | u32 rlc_ucode_ver; |
1412 | #endif | 1406 | #endif |
1413 | u32 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CNTL)); | ||
1414 | 1407 | ||
1415 | tmp = REG_SET_FIELD(tmp, RLC_CNTL, RLC_ENABLE_F32, 1); | 1408 | WREG32_FIELD15(GC, 0, RLC_CNTL, RLC_ENABLE_F32, 1); |
1416 | WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CNTL), tmp); | ||
1417 | 1409 | ||
1418 | /* carrizo do enable cp interrupt after cp inited */ | 1410 | /* carrizo do enable cp interrupt after cp inited */ |
1419 | if (!(adev->flags & AMD_IS_APU)) | 1411 | if (!(adev->flags & AMD_IS_APU)) |
@@ -1497,14 +1489,10 @@ static void gfx_v9_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable) | |||
1497 | int i; | 1489 | int i; |
1498 | u32 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_ME_CNTL)); | 1490 | u32 tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_ME_CNTL)); |
1499 | 1491 | ||
1500 | if (enable) { | 1492 | tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, enable ? 0 : 1); |
1501 | tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, 0); | 1493 | tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, enable ? 0 : 1); |
1502 | tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, 0); | 1494 | tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, enable ? 0 : 1); |
1503 | tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, 0); | 1495 | if (!enable) { |
1504 | } else { | ||
1505 | tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, 1); | ||
1506 | tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, 1); | ||
1507 | tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, 1); | ||
1508 | for (i = 0; i < adev->gfx.num_gfx_rings; i++) | 1496 | for (i = 0; i < adev->gfx.num_gfx_rings; i++) |
1509 | adev->gfx.gfx_ring[i].ready = false; | 1497 | adev->gfx.gfx_ring[i].ready = false; |
1510 | } | 1498 | } |
@@ -2020,13 +2008,10 @@ static int gfx_v9_0_kiq_init_register(struct amdgpu_ring *ring) | |||
2020 | { | 2008 | { |
2021 | struct amdgpu_device *adev = ring->adev; | 2009 | struct amdgpu_device *adev = ring->adev; |
2022 | struct v9_mqd *mqd = ring->mqd_ptr; | 2010 | struct v9_mqd *mqd = ring->mqd_ptr; |
2023 | uint32_t tmp; | ||
2024 | int j; | 2011 | int j; |
2025 | 2012 | ||
2026 | /* disable wptr polling */ | 2013 | /* disable wptr polling */ |
2027 | tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PQ_WPTR_POLL_CNTL)); | 2014 | WREG32_FIELD15(GC, 0, CP_PQ_WPTR_POLL_CNTL, EN, 0); |
2028 | tmp = REG_SET_FIELD(tmp, CP_PQ_WPTR_POLL_CNTL, EN, 0); | ||
2029 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PQ_WPTR_POLL_CNTL), tmp); | ||
2030 | 2015 | ||
2031 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_EOP_BASE_ADDR), | 2016 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_EOP_BASE_ADDR), |
2032 | mqd->cp_hqd_eop_base_addr_lo); | 2017 | mqd->cp_hqd_eop_base_addr_lo); |
@@ -2118,11 +2103,8 @@ static int gfx_v9_0_kiq_init_register(struct amdgpu_ring *ring) | |||
2118 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE), | 2103 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE), |
2119 | mqd->cp_hqd_active); | 2104 | mqd->cp_hqd_active); |
2120 | 2105 | ||
2121 | if (ring->use_doorbell) { | 2106 | if (ring->use_doorbell) |
2122 | tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PQ_STATUS)); | 2107 | WREG32_FIELD15(GC, 0, CP_PQ_STATUS, DOORBELL_ENABLE, 1); |
2123 | tmp = REG_SET_FIELD(tmp, CP_PQ_STATUS, DOORBELL_ENABLE, 1); | ||
2124 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PQ_STATUS), tmp); | ||
2125 | } | ||
2126 | 2108 | ||
2127 | return 0; | 2109 | return 0; |
2128 | } | 2110 | } |
@@ -2366,177 +2348,6 @@ static int gfx_v9_0_wait_for_idle(void *handle) | |||
2366 | return -ETIMEDOUT; | 2348 | return -ETIMEDOUT; |
2367 | } | 2349 | } |
2368 | 2350 | ||
2369 | static void gfx_v9_0_print_status(void *handle) | ||
2370 | { | ||
2371 | int i; | ||
2372 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | ||
2373 | |||
2374 | dev_info(adev->dev, "GFX 9.x registers\n"); | ||
2375 | dev_info(adev->dev, " GRBM_STATUS=0x%08X\n", | ||
2376 | RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS))); | ||
2377 | dev_info(adev->dev, " GRBM_STATUS2=0x%08X\n", | ||
2378 | RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS2))); | ||
2379 | dev_info(adev->dev, " GRBM_STATUS_SE0=0x%08X\n", | ||
2380 | RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS_SE0))); | ||
2381 | dev_info(adev->dev, " GRBM_STATUS_SE1=0x%08X\n", | ||
2382 | RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS_SE1))); | ||
2383 | dev_info(adev->dev, " GRBM_STATUS_SE2=0x%08X\n", | ||
2384 | RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS_SE2))); | ||
2385 | dev_info(adev->dev, " GRBM_STATUS_SE3=0x%08X\n", | ||
2386 | RREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS_SE3))); | ||
2387 | dev_info(adev->dev, " CP_STAT = 0x%08x\n", RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_STAT))); | ||
2388 | dev_info(adev->dev, " CP_STALLED_STAT1 = 0x%08x\n", | ||
2389 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_STALLED_STAT1))); | ||
2390 | dev_info(adev->dev, " CP_STALLED_STAT2 = 0x%08x\n", | ||
2391 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_STALLED_STAT2))); | ||
2392 | dev_info(adev->dev, " CP_STALLED_STAT3 = 0x%08x\n", | ||
2393 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_STALLED_STAT3))); | ||
2394 | dev_info(adev->dev, " CP_CPF_BUSY_STAT = 0x%08x\n", | ||
2395 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_CPF_BUSY_STAT))); | ||
2396 | dev_info(adev->dev, " CP_CPF_STALLED_STAT1 = 0x%08x\n", | ||
2397 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_CPF_STALLED_STAT1))); | ||
2398 | dev_info(adev->dev, " CP_CPF_STATUS = 0x%08x\n", RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_CPF_STATUS))); | ||
2399 | dev_info(adev->dev, " CP_CPC_BUSY_STAT = 0x%08x\n", RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_CPC_BUSY_STAT))); | ||
2400 | dev_info(adev->dev, " CP_CPC_STALLED_STAT1 = 0x%08x\n", | ||
2401 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_CPC_STALLED_STAT1))); | ||
2402 | dev_info(adev->dev, " CP_CPC_STATUS = 0x%08x\n", RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_CPC_STATUS))); | ||
2403 | |||
2404 | for (i = 0; i < 32; i++) { | ||
2405 | dev_info(adev->dev, " GB_TILE_MODE%d=0x%08X\n", | ||
2406 | i, RREG32(SOC15_REG_OFFSET(GC, 0, mmGB_TILE_MODE0 ) + i*4)); | ||
2407 | } | ||
2408 | for (i = 0; i < 16; i++) { | ||
2409 | dev_info(adev->dev, " GB_MACROTILE_MODE%d=0x%08X\n", | ||
2410 | i, RREG32(SOC15_REG_OFFSET(GC, 0, mmGB_MACROTILE_MODE0) + i*4)); | ||
2411 | } | ||
2412 | for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { | ||
2413 | dev_info(adev->dev, " se: %d\n", i); | ||
2414 | gfx_v9_0_select_se_sh(adev, i, 0xffffffff, 0xffffffff); | ||
2415 | dev_info(adev->dev, " PA_SC_RASTER_CONFIG=0x%08X\n", | ||
2416 | RREG32(SOC15_REG_OFFSET(GC, 0, mmPA_SC_RASTER_CONFIG))); | ||
2417 | dev_info(adev->dev, " PA_SC_RASTER_CONFIG_1=0x%08X\n", | ||
2418 | RREG32(SOC15_REG_OFFSET(GC, 0, mmPA_SC_RASTER_CONFIG_1))); | ||
2419 | } | ||
2420 | gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); | ||
2421 | |||
2422 | dev_info(adev->dev, " GB_ADDR_CONFIG=0x%08X\n", | ||
2423 | RREG32(SOC15_REG_OFFSET(GC, 0, mmGB_ADDR_CONFIG))); | ||
2424 | |||
2425 | dev_info(adev->dev, " CP_MEQ_THRESHOLDS=0x%08X\n", | ||
2426 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEQ_THRESHOLDS))); | ||
2427 | dev_info(adev->dev, " SX_DEBUG_1=0x%08X\n", | ||
2428 | RREG32(SOC15_REG_OFFSET(GC, 0, mmSX_DEBUG_1))); | ||
2429 | dev_info(adev->dev, " TA_CNTL_AUX=0x%08X\n", | ||
2430 | RREG32(SOC15_REG_OFFSET(GC, 0, mmTA_CNTL_AUX))); | ||
2431 | dev_info(adev->dev, " SPI_CONFIG_CNTL=0x%08X\n", | ||
2432 | RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_CONFIG_CNTL))); | ||
2433 | dev_info(adev->dev, " SQ_CONFIG=0x%08X\n", | ||
2434 | RREG32(SOC15_REG_OFFSET(GC, 0, mmSQ_CONFIG))); | ||
2435 | dev_info(adev->dev, " DB_DEBUG=0x%08X\n", | ||
2436 | RREG32(SOC15_REG_OFFSET(GC, 0, mmDB_DEBUG))); | ||
2437 | dev_info(adev->dev, " DB_DEBUG2=0x%08X\n", | ||
2438 | RREG32(SOC15_REG_OFFSET(GC, 0, mmDB_DEBUG2))); | ||
2439 | dev_info(adev->dev, " DB_DEBUG3=0x%08X\n", | ||
2440 | RREG32(SOC15_REG_OFFSET(GC, 0, mmDB_DEBUG3))); | ||
2441 | dev_info(adev->dev, " CB_HW_CONTROL=0x%08X\n", | ||
2442 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCB_HW_CONTROL))); | ||
2443 | dev_info(adev->dev, " SPI_CONFIG_CNTL_1=0x%08X\n", | ||
2444 | RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_CONFIG_CNTL_1))); | ||
2445 | dev_info(adev->dev, " PA_SC_FIFO_SIZE=0x%08X\n", | ||
2446 | RREG32(SOC15_REG_OFFSET(GC, 0, mmPA_SC_FIFO_SIZE))); | ||
2447 | dev_info(adev->dev, " VGT_NUM_INSTANCES=0x%08X\n", | ||
2448 | RREG32(SOC15_REG_OFFSET(GC, 0, mmVGT_NUM_INSTANCES))); | ||
2449 | dev_info(adev->dev, " CP_PERFMON_CNTL=0x%08X\n", | ||
2450 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PERFMON_CNTL))); | ||
2451 | dev_info(adev->dev, " PA_SC_FORCE_EOV_MAX_CNTS=0x%08X\n", | ||
2452 | RREG32(SOC15_REG_OFFSET(GC, 0, mmPA_SC_FORCE_EOV_MAX_CNTS))); | ||
2453 | dev_info(adev->dev, " VGT_CACHE_INVALIDATION=0x%08X\n", | ||
2454 | RREG32(SOC15_REG_OFFSET(GC, 0, mmVGT_CACHE_INVALIDATION))); | ||
2455 | dev_info(adev->dev, " VGT_GS_VERTEX_REUSE=0x%08X\n", | ||
2456 | RREG32(SOC15_REG_OFFSET(GC, 0, mmVGT_GS_VERTEX_REUSE))); | ||
2457 | dev_info(adev->dev, " PA_SC_LINE_STIPPLE_STATE=0x%08X\n", | ||
2458 | RREG32(SOC15_REG_OFFSET(GC, 0, mmPA_SC_LINE_STIPPLE_STATE))); | ||
2459 | dev_info(adev->dev, " PA_CL_ENHANCE=0x%08X\n", | ||
2460 | RREG32(SOC15_REG_OFFSET(GC, 0, mmPA_CL_ENHANCE))); | ||
2461 | dev_info(adev->dev, " PA_SC_ENHANCE=0x%08X\n", | ||
2462 | RREG32(SOC15_REG_OFFSET(GC, 0, mmPA_SC_ENHANCE))); | ||
2463 | |||
2464 | dev_info(adev->dev, " CP_ME_CNTL=0x%08X\n", | ||
2465 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_ME_CNTL))); | ||
2466 | dev_info(adev->dev, " CP_MAX_CONTEXT=0x%08X\n", | ||
2467 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MAX_CONTEXT))); | ||
2468 | dev_info(adev->dev, " CP_DEVICE_ID=0x%08X\n", | ||
2469 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_DEVICE_ID))); | ||
2470 | |||
2471 | dev_info(adev->dev, " CP_SEM_WAIT_TIMER=0x%08X\n", | ||
2472 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_SEM_WAIT_TIMER))); | ||
2473 | |||
2474 | dev_info(adev->dev, " CP_RB_WPTR_DELAY=0x%08X\n", | ||
2475 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_WPTR_DELAY))); | ||
2476 | dev_info(adev->dev, " CP_RB_VMID=0x%08X\n", | ||
2477 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_VMID))); | ||
2478 | dev_info(adev->dev, " CP_RB0_CNTL=0x%08X\n", | ||
2479 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_CNTL))); | ||
2480 | dev_info(adev->dev, " CP_RB0_WPTR=0x%08X\n", | ||
2481 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_WPTR))); | ||
2482 | dev_info(adev->dev, " CP_RB0_RPTR_ADDR=0x%08X\n", | ||
2483 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_RPTR_ADDR))); | ||
2484 | dev_info(adev->dev, " CP_RB0_RPTR_ADDR_HI=0x%08X\n", | ||
2485 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_RPTR_ADDR_HI))); | ||
2486 | dev_info(adev->dev, " CP_RB0_CNTL=0x%08X\n", | ||
2487 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_CNTL))); | ||
2488 | dev_info(adev->dev, " CP_RB0_BASE=0x%08X\n", | ||
2489 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_BASE))); | ||
2490 | dev_info(adev->dev, " CP_RB0_BASE_HI=0x%08X\n", | ||
2491 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB0_BASE_HI))); | ||
2492 | dev_info(adev->dev, " CP_MEC_CNTL=0x%08X\n", | ||
2493 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEC_CNTL))); | ||
2494 | |||
2495 | dev_info(adev->dev, " SCRATCH_ADDR=0x%08X\n", | ||
2496 | RREG32(SOC15_REG_OFFSET(GC, 0, mmSCRATCH_ADDR))); | ||
2497 | dev_info(adev->dev, " SCRATCH_UMSK=0x%08X\n", | ||
2498 | RREG32(SOC15_REG_OFFSET(GC, 0, mmSCRATCH_UMSK))); | ||
2499 | |||
2500 | dev_info(adev->dev, " CP_INT_CNTL_RING0=0x%08X\n", | ||
2501 | RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0))); | ||
2502 | dev_info(adev->dev, " RLC_LB_CNTL=0x%08X\n", | ||
2503 | RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_LB_CNTL))); | ||
2504 | dev_info(adev->dev, " RLC_CNTL=0x%08X\n", | ||
2505 | RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CNTL))); | ||
2506 | dev_info(adev->dev, " RLC_CGCG_CGLS_CTRL=0x%08X\n", | ||
2507 | RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL))); | ||
2508 | dev_info(adev->dev, " RLC_LB_CNTR_INIT=0x%08X\n", | ||
2509 | RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_LB_CNTR_INIT))); | ||
2510 | dev_info(adev->dev, " RLC_LB_CNTR_MAX=0x%08X\n", | ||
2511 | RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_LB_CNTR_MAX))); | ||
2512 | dev_info(adev->dev, " RLC_LB_INIT_CU_MASK=0x%08X\n", | ||
2513 | RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_LB_INIT_CU_MASK))); | ||
2514 | dev_info(adev->dev, " RLC_LB_PARAMS=0x%08X\n", | ||
2515 | RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_LB_PARAMS))); | ||
2516 | dev_info(adev->dev, " RLC_LB_CNTL=0x%08X\n", | ||
2517 | RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_LB_CNTL))); | ||
2518 | dev_info(adev->dev, " RLC_UCODE_CNTL=0x%08X\n", | ||
2519 | RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_UCODE_CNTL))); | ||
2520 | |||
2521 | dev_info(adev->dev, " RLC_GPM_GENERAL_6=0x%08X\n", | ||
2522 | RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_GENERAL_6))); | ||
2523 | dev_info(adev->dev, " RLC_GPM_GENERAL_12=0x%08X\n", | ||
2524 | RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_GENERAL_12))); | ||
2525 | dev_info(adev->dev, " RLC_GPM_TIMER_INT_3=0x%08X\n", | ||
2526 | RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_TIMER_INT_3))); | ||
2527 | mutex_lock(&adev->srbm_mutex); | ||
2528 | for (i = 0; i < 16; i++) { | ||
2529 | soc15_grbm_select(adev, 0, 0, 0, i); | ||
2530 | dev_info(adev->dev, " VM %d:\n", i); | ||
2531 | dev_info(adev->dev, " SH_MEM_CONFIG=0x%08X\n", | ||
2532 | RREG32(SOC15_REG_OFFSET(GC, 0, mmSH_MEM_CONFIG))); | ||
2533 | dev_info(adev->dev, " SH_MEM_BASES=0x%08X\n", | ||
2534 | RREG32(SOC15_REG_OFFSET(GC, 0, mmSH_MEM_BASES))); | ||
2535 | } | ||
2536 | soc15_grbm_select(adev, 0, 0, 0, 0); | ||
2537 | mutex_unlock(&adev->srbm_mutex); | ||
2538 | } | ||
2539 | |||
2540 | static int gfx_v9_0_soft_reset(void *handle) | 2351 | static int gfx_v9_0_soft_reset(void *handle) |
2541 | { | 2352 | { |
2542 | u32 grbm_soft_reset = 0; | 2353 | u32 grbm_soft_reset = 0; |
@@ -2569,8 +2380,7 @@ static int gfx_v9_0_soft_reset(void *handle) | |||
2569 | GRBM_SOFT_RESET, SOFT_RESET_RLC, 1); | 2380 | GRBM_SOFT_RESET, SOFT_RESET_RLC, 1); |
2570 | 2381 | ||
2571 | 2382 | ||
2572 | if (grbm_soft_reset ) { | 2383 | if (grbm_soft_reset) { |
2573 | gfx_v9_0_print_status((void *)adev); | ||
2574 | /* stop the rlc */ | 2384 | /* stop the rlc */ |
2575 | gfx_v9_0_rlc_stop(adev); | 2385 | gfx_v9_0_rlc_stop(adev); |
2576 | 2386 | ||
@@ -2596,7 +2406,6 @@ static int gfx_v9_0_soft_reset(void *handle) | |||
2596 | 2406 | ||
2597 | /* Wait a little for things to settle down */ | 2407 | /* Wait a little for things to settle down */ |
2598 | udelay(50); | 2408 | udelay(50); |
2599 | gfx_v9_0_print_status((void *)adev); | ||
2600 | } | 2409 | } |
2601 | return 0; | 2410 | return 0; |
2602 | } | 2411 | } |
@@ -3148,6 +2957,7 @@ static void gfx_v9_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
3148 | unsigned vm_id, uint64_t pd_addr) | 2957 | unsigned vm_id, uint64_t pd_addr) |
3149 | { | 2958 | { |
3150 | int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX); | 2959 | int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX); |
2960 | uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); | ||
3151 | unsigned eng = ring->idx; | 2961 | unsigned eng = ring->idx; |
3152 | unsigned i; | 2962 | unsigned i; |
3153 | 2963 | ||
@@ -3157,7 +2967,6 @@ static void gfx_v9_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
3157 | 2967 | ||
3158 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { | 2968 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { |
3159 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; | 2969 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; |
3160 | uint32_t req = hub->get_invalidate_req(vm_id); | ||
3161 | 2970 | ||
3162 | gfx_v9_0_write_data_to_reg(ring, usepfp, true, | 2971 | gfx_v9_0_write_data_to_reg(ring, usepfp, true, |
3163 | hub->ctx0_ptb_addr_lo32 | 2972 | hub->ctx0_ptb_addr_lo32 |
@@ -3376,21 +3185,12 @@ static void gfx_v9_0_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, | |||
3376 | static void gfx_v9_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev, | 3185 | static void gfx_v9_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev, |
3377 | enum amdgpu_interrupt_state state) | 3186 | enum amdgpu_interrupt_state state) |
3378 | { | 3187 | { |
3379 | u32 cp_int_cntl; | ||
3380 | |||
3381 | switch (state) { | 3188 | switch (state) { |
3382 | case AMDGPU_IRQ_STATE_DISABLE: | 3189 | case AMDGPU_IRQ_STATE_DISABLE: |
3383 | cp_int_cntl = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0)); | ||
3384 | cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0, | ||
3385 | TIME_STAMP_INT_ENABLE, 0); | ||
3386 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0), cp_int_cntl); | ||
3387 | break; | ||
3388 | case AMDGPU_IRQ_STATE_ENABLE: | 3190 | case AMDGPU_IRQ_STATE_ENABLE: |
3389 | cp_int_cntl = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0)); | 3191 | WREG32_FIELD15(GC, 0, CP_INT_CNTL_RING0, |
3390 | cp_int_cntl = | 3192 | TIME_STAMP_INT_ENABLE, |
3391 | REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0, | 3193 | state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0); |
3392 | TIME_STAMP_INT_ENABLE, 1); | ||
3393 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0), cp_int_cntl); | ||
3394 | break; | 3194 | break; |
3395 | default: | 3195 | default: |
3396 | break; | 3196 | break; |
@@ -3446,20 +3246,12 @@ static int gfx_v9_0_set_priv_reg_fault_state(struct amdgpu_device *adev, | |||
3446 | unsigned type, | 3246 | unsigned type, |
3447 | enum amdgpu_interrupt_state state) | 3247 | enum amdgpu_interrupt_state state) |
3448 | { | 3248 | { |
3449 | u32 cp_int_cntl; | ||
3450 | |||
3451 | switch (state) { | 3249 | switch (state) { |
3452 | case AMDGPU_IRQ_STATE_DISABLE: | 3250 | case AMDGPU_IRQ_STATE_DISABLE: |
3453 | cp_int_cntl = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0)); | ||
3454 | cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0, | ||
3455 | PRIV_REG_INT_ENABLE, 0); | ||
3456 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0), cp_int_cntl); | ||
3457 | break; | ||
3458 | case AMDGPU_IRQ_STATE_ENABLE: | 3251 | case AMDGPU_IRQ_STATE_ENABLE: |
3459 | cp_int_cntl = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0)); | 3252 | WREG32_FIELD15(GC, 0, CP_INT_CNTL_RING0, |
3460 | cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0, | 3253 | PRIV_REG_INT_ENABLE, |
3461 | PRIV_REG_INT_ENABLE, 1); | 3254 | state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0); |
3462 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0), cp_int_cntl); | ||
3463 | break; | 3255 | break; |
3464 | default: | 3256 | default: |
3465 | break; | 3257 | break; |
@@ -3473,21 +3265,12 @@ static int gfx_v9_0_set_priv_inst_fault_state(struct amdgpu_device *adev, | |||
3473 | unsigned type, | 3265 | unsigned type, |
3474 | enum amdgpu_interrupt_state state) | 3266 | enum amdgpu_interrupt_state state) |
3475 | { | 3267 | { |
3476 | u32 cp_int_cntl; | ||
3477 | |||
3478 | switch (state) { | 3268 | switch (state) { |
3479 | case AMDGPU_IRQ_STATE_DISABLE: | 3269 | case AMDGPU_IRQ_STATE_DISABLE: |
3480 | cp_int_cntl = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0)); | ||
3481 | cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0, | ||
3482 | PRIV_INSTR_INT_ENABLE, 0); | ||
3483 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0), cp_int_cntl); | ||
3484 | break; | ||
3485 | case AMDGPU_IRQ_STATE_ENABLE: | 3270 | case AMDGPU_IRQ_STATE_ENABLE: |
3486 | cp_int_cntl = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0)); | 3271 | WREG32_FIELD15(GC, 0, CP_INT_CNTL_RING0, |
3487 | cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0, | 3272 | PRIV_INSTR_INT_ENABLE, |
3488 | PRIV_INSTR_INT_ENABLE, 1); | 3273 | state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0); |
3489 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_INT_CNTL_RING0), cp_int_cntl); | ||
3490 | break; | ||
3491 | default: | 3274 | default: |
3492 | break; | 3275 | break; |
3493 | } | 3276 | } |
@@ -3759,8 +3542,6 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_kiq = { | |||
3759 | .emit_ib_size = 4, /* gfx_v9_0_ring_emit_ib_compute */ | 3542 | .emit_ib_size = 4, /* gfx_v9_0_ring_emit_ib_compute */ |
3760 | .emit_ib = gfx_v9_0_ring_emit_ib_compute, | 3543 | .emit_ib = gfx_v9_0_ring_emit_ib_compute, |
3761 | .emit_fence = gfx_v9_0_ring_emit_fence_kiq, | 3544 | .emit_fence = gfx_v9_0_ring_emit_fence_kiq, |
3762 | .emit_hdp_flush = gfx_v9_0_ring_emit_hdp_flush, | ||
3763 | .emit_hdp_invalidate = gfx_v9_0_ring_emit_hdp_invalidate, | ||
3764 | .test_ring = gfx_v9_0_ring_test_ring, | 3545 | .test_ring = gfx_v9_0_ring_test_ring, |
3765 | .test_ib = gfx_v9_0_ring_test_ib, | 3546 | .test_ib = gfx_v9_0_ring_test_ib, |
3766 | .insert_nop = amdgpu_ring_insert_nop, | 3547 | .insert_nop = amdgpu_ring_insert_nop, |
@@ -3975,9 +3756,7 @@ static int gfx_v9_0_init_queue(struct amdgpu_ring *ring) | |||
3975 | ring->pipe, | 3756 | ring->pipe, |
3976 | ring->queue, 0); | 3757 | ring->queue, 0); |
3977 | /* disable wptr polling */ | 3758 | /* disable wptr polling */ |
3978 | tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PQ_WPTR_POLL_CNTL)); | 3759 | WREG32_FIELD15(GC, 0, CP_PQ_WPTR_POLL_CNTL, EN, 0); |
3979 | tmp = REG_SET_FIELD(tmp, CP_PQ_WPTR_POLL_CNTL, EN, 0); | ||
3980 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PQ_WPTR_POLL_CNTL), tmp); | ||
3981 | 3760 | ||
3982 | /* write the EOP addr */ | 3761 | /* write the EOP addr */ |
3983 | BUG_ON(ring->me != 1 || ring->pipe != 0); /* can't handle other cases eop address */ | 3762 | BUG_ON(ring->me != 1 || ring->pipe != 0); /* can't handle other cases eop address */ |
@@ -4121,11 +3900,8 @@ static int gfx_v9_0_init_queue(struct amdgpu_ring *ring) | |||
4121 | amdgpu_bo_kunmap(ring->mqd_obj); | 3900 | amdgpu_bo_kunmap(ring->mqd_obj); |
4122 | amdgpu_bo_unreserve(ring->mqd_obj); | 3901 | amdgpu_bo_unreserve(ring->mqd_obj); |
4123 | 3902 | ||
4124 | if (use_doorbell) { | 3903 | if (use_doorbell) |
4125 | tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PQ_STATUS)); | 3904 | WREG32_FIELD15(GC, 0, CP_PQ_STATUS, DOORBELL_ENABLE, 1); |
4126 | tmp = REG_SET_FIELD(tmp, CP_PQ_STATUS, DOORBELL_ENABLE, 1); | ||
4127 | WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PQ_STATUS), tmp); | ||
4128 | } | ||
4129 | 3905 | ||
4130 | return 0; | 3906 | return 0; |
4131 | } | 3907 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c index 30ef3126c8a9..005075ff00f7 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c | |||
@@ -222,7 +222,7 @@ int gfxhub_v1_0_gart_enable(struct amdgpu_device *adev) | |||
222 | EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); | 222 | EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); |
223 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, | 223 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, |
224 | PAGE_TABLE_BLOCK_SIZE, | 224 | PAGE_TABLE_BLOCK_SIZE, |
225 | amdgpu_vm_block_size - 9); | 225 | adev->vm_manager.block_size - 9); |
226 | WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_CONTEXT1_CNTL) + i, tmp); | 226 | WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_CONTEXT1_CNTL) + i, tmp); |
227 | WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32) + i*2, 0); | 227 | WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32) + i*2, 0); |
228 | WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32) + i*2, 0); | 228 | WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32) + i*2, 0); |
@@ -299,36 +299,6 @@ void gfxhub_v1_0_set_fault_enable_default(struct amdgpu_device *adev, | |||
299 | WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_L2_PROTECTION_FAULT_CNTL), tmp); | 299 | WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_L2_PROTECTION_FAULT_CNTL), tmp); |
300 | } | 300 | } |
301 | 301 | ||
302 | static uint32_t gfxhub_v1_0_get_invalidate_req(unsigned int vm_id) | ||
303 | { | ||
304 | u32 req = 0; | ||
305 | |||
306 | /* invalidate using legacy mode on vm_id*/ | ||
307 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, | ||
308 | PER_VMID_INVALIDATE_REQ, 1 << vm_id); | ||
309 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, FLUSH_TYPE, 0); | ||
310 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PTES, 1); | ||
311 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE0, 1); | ||
312 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE1, 1); | ||
313 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE2, 1); | ||
314 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L1_PTES, 1); | ||
315 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, | ||
316 | CLEAR_PROTECTION_FAULT_STATUS_ADDR, 0); | ||
317 | |||
318 | return req; | ||
319 | } | ||
320 | |||
321 | static uint32_t gfxhub_v1_0_get_vm_protection_bits(void) | ||
322 | { | ||
323 | return (VM_CONTEXT1_CNTL__RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
324 | VM_CONTEXT1_CNTL__DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
325 | VM_CONTEXT1_CNTL__PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
326 | VM_CONTEXT1_CNTL__VALID_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
327 | VM_CONTEXT1_CNTL__READ_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
328 | VM_CONTEXT1_CNTL__WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
329 | VM_CONTEXT1_CNTL__EXECUTE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK); | ||
330 | } | ||
331 | |||
332 | static int gfxhub_v1_0_early_init(void *handle) | 302 | static int gfxhub_v1_0_early_init(void *handle) |
333 | { | 303 | { |
334 | return 0; | 304 | return 0; |
@@ -361,9 +331,6 @@ static int gfxhub_v1_0_sw_init(void *handle) | |||
361 | hub->vm_l2_pro_fault_cntl = | 331 | hub->vm_l2_pro_fault_cntl = |
362 | SOC15_REG_OFFSET(GC, 0, mmVM_L2_PROTECTION_FAULT_CNTL); | 332 | SOC15_REG_OFFSET(GC, 0, mmVM_L2_PROTECTION_FAULT_CNTL); |
363 | 333 | ||
364 | hub->get_invalidate_req = gfxhub_v1_0_get_invalidate_req; | ||
365 | hub->get_vm_protection_bits = gfxhub_v1_0_get_vm_protection_bits; | ||
366 | |||
367 | return 0; | 334 | return 0; |
368 | } | 335 | } |
369 | 336 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index d9586601a437..8f18d14f8eda 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | |||
@@ -543,7 +543,8 @@ static int gmc_v6_0_gart_enable(struct amdgpu_device *adev) | |||
543 | WREG32(mmVM_CONTEXT1_CNTL, | 543 | WREG32(mmVM_CONTEXT1_CNTL, |
544 | VM_CONTEXT1_CNTL__ENABLE_CONTEXT_MASK | | 544 | VM_CONTEXT1_CNTL__ENABLE_CONTEXT_MASK | |
545 | (1UL << VM_CONTEXT1_CNTL__PAGE_TABLE_DEPTH__SHIFT) | | 545 | (1UL << VM_CONTEXT1_CNTL__PAGE_TABLE_DEPTH__SHIFT) | |
546 | ((amdgpu_vm_block_size - 9) << VM_CONTEXT1_CNTL__PAGE_TABLE_BLOCK_SIZE__SHIFT)); | 546 | ((adev->vm_manager.block_size - 9) |
547 | << VM_CONTEXT1_CNTL__PAGE_TABLE_BLOCK_SIZE__SHIFT)); | ||
547 | if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS) | 548 | if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS) |
548 | gmc_v6_0_set_fault_enable_default(adev, false); | 549 | gmc_v6_0_set_fault_enable_default(adev, false); |
549 | else | 550 | else |
@@ -848,7 +849,12 @@ static int gmc_v6_0_sw_init(void *handle) | |||
848 | if (r) | 849 | if (r) |
849 | return r; | 850 | return r; |
850 | 851 | ||
851 | adev->vm_manager.max_pfn = amdgpu_vm_size << 18; | 852 | adev->vm_manager.vm_size = amdgpu_vm_size; |
853 | adev->vm_manager.block_size = amdgpu_vm_block_size; | ||
854 | adev->vm_manager.max_pfn = adev->vm_manager.vm_size << 18; | ||
855 | |||
856 | DRM_INFO("vm size is %llu GB, block size is %d-bit\n", | ||
857 | adev->vm_manager.vm_size, adev->vm_manager.block_size); | ||
852 | 858 | ||
853 | adev->mc.mc_mask = 0xffffffffffULL; | 859 | adev->mc.mc_mask = 0xffffffffffULL; |
854 | 860 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c index 0c0a6015cca5..b86b454197f8 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | |||
@@ -37,6 +37,8 @@ | |||
37 | #include "oss/oss_2_0_d.h" | 37 | #include "oss/oss_2_0_d.h" |
38 | #include "oss/oss_2_0_sh_mask.h" | 38 | #include "oss/oss_2_0_sh_mask.h" |
39 | 39 | ||
40 | #include "amdgpu_atombios.h" | ||
41 | |||
40 | static void gmc_v7_0_set_gart_funcs(struct amdgpu_device *adev); | 42 | static void gmc_v7_0_set_gart_funcs(struct amdgpu_device *adev); |
41 | static void gmc_v7_0_set_irq_funcs(struct amdgpu_device *adev); | 43 | static void gmc_v7_0_set_irq_funcs(struct amdgpu_device *adev); |
42 | static int gmc_v7_0_wait_for_idle(void *handle); | 44 | static int gmc_v7_0_wait_for_idle(void *handle); |
@@ -325,48 +327,51 @@ static void gmc_v7_0_mc_program(struct amdgpu_device *adev) | |||
325 | */ | 327 | */ |
326 | static int gmc_v7_0_mc_init(struct amdgpu_device *adev) | 328 | static int gmc_v7_0_mc_init(struct amdgpu_device *adev) |
327 | { | 329 | { |
328 | u32 tmp; | 330 | adev->mc.vram_width = amdgpu_atombios_get_vram_width(adev); |
329 | int chansize, numchan; | 331 | if (!adev->mc.vram_width) { |
330 | 332 | u32 tmp; | |
331 | /* Get VRAM informations */ | 333 | int chansize, numchan; |
332 | tmp = RREG32(mmMC_ARB_RAMCFG); | 334 | |
333 | if (REG_GET_FIELD(tmp, MC_ARB_RAMCFG, CHANSIZE)) { | 335 | /* Get VRAM informations */ |
334 | chansize = 64; | 336 | tmp = RREG32(mmMC_ARB_RAMCFG); |
335 | } else { | 337 | if (REG_GET_FIELD(tmp, MC_ARB_RAMCFG, CHANSIZE)) { |
336 | chansize = 32; | 338 | chansize = 64; |
337 | } | 339 | } else { |
338 | tmp = RREG32(mmMC_SHARED_CHMAP); | 340 | chansize = 32; |
339 | switch (REG_GET_FIELD(tmp, MC_SHARED_CHMAP, NOOFCHAN)) { | 341 | } |
340 | case 0: | 342 | tmp = RREG32(mmMC_SHARED_CHMAP); |
341 | default: | 343 | switch (REG_GET_FIELD(tmp, MC_SHARED_CHMAP, NOOFCHAN)) { |
342 | numchan = 1; | 344 | case 0: |
343 | break; | 345 | default: |
344 | case 1: | 346 | numchan = 1; |
345 | numchan = 2; | 347 | break; |
346 | break; | 348 | case 1: |
347 | case 2: | 349 | numchan = 2; |
348 | numchan = 4; | 350 | break; |
349 | break; | 351 | case 2: |
350 | case 3: | 352 | numchan = 4; |
351 | numchan = 8; | 353 | break; |
352 | break; | 354 | case 3: |
353 | case 4: | 355 | numchan = 8; |
354 | numchan = 3; | 356 | break; |
355 | break; | 357 | case 4: |
356 | case 5: | 358 | numchan = 3; |
357 | numchan = 6; | 359 | break; |
358 | break; | 360 | case 5: |
359 | case 6: | 361 | numchan = 6; |
360 | numchan = 10; | 362 | break; |
361 | break; | 363 | case 6: |
362 | case 7: | 364 | numchan = 10; |
363 | numchan = 12; | 365 | break; |
364 | break; | 366 | case 7: |
365 | case 8: | 367 | numchan = 12; |
366 | numchan = 16; | 368 | break; |
367 | break; | 369 | case 8: |
370 | numchan = 16; | ||
371 | break; | ||
372 | } | ||
373 | adev->mc.vram_width = numchan * chansize; | ||
368 | } | 374 | } |
369 | adev->mc.vram_width = numchan * chansize; | ||
370 | /* Could aper size report 0 ? */ | 375 | /* Could aper size report 0 ? */ |
371 | adev->mc.aper_base = pci_resource_start(adev->pdev, 0); | 376 | adev->mc.aper_base = pci_resource_start(adev->pdev, 0); |
372 | adev->mc.aper_size = pci_resource_len(adev->pdev, 0); | 377 | adev->mc.aper_size = pci_resource_len(adev->pdev, 0); |
@@ -639,7 +644,7 @@ static int gmc_v7_0_gart_enable(struct amdgpu_device *adev) | |||
639 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1); | 644 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1); |
640 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH, 1); | 645 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH, 1); |
641 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_BLOCK_SIZE, | 646 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_BLOCK_SIZE, |
642 | amdgpu_vm_block_size - 9); | 647 | adev->vm_manager.block_size - 9); |
643 | WREG32(mmVM_CONTEXT1_CNTL, tmp); | 648 | WREG32(mmVM_CONTEXT1_CNTL, tmp); |
644 | if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS) | 649 | if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS) |
645 | gmc_v7_0_set_fault_enable_default(adev, false); | 650 | gmc_v7_0_set_fault_enable_default(adev, false); |
@@ -998,7 +1003,12 @@ static int gmc_v7_0_sw_init(void *handle) | |||
998 | * Currently set to 4GB ((1 << 20) 4k pages). | 1003 | * Currently set to 4GB ((1 << 20) 4k pages). |
999 | * Max GPUVM size for cayman and SI is 40 bits. | 1004 | * Max GPUVM size for cayman and SI is 40 bits. |
1000 | */ | 1005 | */ |
1001 | adev->vm_manager.max_pfn = amdgpu_vm_size << 18; | 1006 | adev->vm_manager.vm_size = amdgpu_vm_size; |
1007 | adev->vm_manager.block_size = amdgpu_vm_block_size; | ||
1008 | adev->vm_manager.max_pfn = adev->vm_manager.vm_size << 18; | ||
1009 | |||
1010 | DRM_INFO("vm size is %llu GB, block size is %d-bit\n", | ||
1011 | adev->vm_manager.vm_size, adev->vm_manager.block_size); | ||
1002 | 1012 | ||
1003 | /* Set the internal MC address mask | 1013 | /* Set the internal MC address mask |
1004 | * This is the max address of the GPU's | 1014 | * This is the max address of the GPU's |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index d19d1c5e2847..108a20e832cf 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | |||
@@ -38,6 +38,8 @@ | |||
38 | #include "vid.h" | 38 | #include "vid.h" |
39 | #include "vi.h" | 39 | #include "vi.h" |
40 | 40 | ||
41 | #include "amdgpu_atombios.h" | ||
42 | |||
41 | 43 | ||
42 | static void gmc_v8_0_set_gart_funcs(struct amdgpu_device *adev); | 44 | static void gmc_v8_0_set_gart_funcs(struct amdgpu_device *adev); |
43 | static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev); | 45 | static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev); |
@@ -487,48 +489,51 @@ static void gmc_v8_0_mc_program(struct amdgpu_device *adev) | |||
487 | */ | 489 | */ |
488 | static int gmc_v8_0_mc_init(struct amdgpu_device *adev) | 490 | static int gmc_v8_0_mc_init(struct amdgpu_device *adev) |
489 | { | 491 | { |
490 | u32 tmp; | 492 | adev->mc.vram_width = amdgpu_atombios_get_vram_width(adev); |
491 | int chansize, numchan; | 493 | if (!adev->mc.vram_width) { |
492 | 494 | u32 tmp; | |
493 | /* Get VRAM informations */ | 495 | int chansize, numchan; |
494 | tmp = RREG32(mmMC_ARB_RAMCFG); | 496 | |
495 | if (REG_GET_FIELD(tmp, MC_ARB_RAMCFG, CHANSIZE)) { | 497 | /* Get VRAM informations */ |
496 | chansize = 64; | 498 | tmp = RREG32(mmMC_ARB_RAMCFG); |
497 | } else { | 499 | if (REG_GET_FIELD(tmp, MC_ARB_RAMCFG, CHANSIZE)) { |
498 | chansize = 32; | 500 | chansize = 64; |
499 | } | 501 | } else { |
500 | tmp = RREG32(mmMC_SHARED_CHMAP); | 502 | chansize = 32; |
501 | switch (REG_GET_FIELD(tmp, MC_SHARED_CHMAP, NOOFCHAN)) { | 503 | } |
502 | case 0: | 504 | tmp = RREG32(mmMC_SHARED_CHMAP); |
503 | default: | 505 | switch (REG_GET_FIELD(tmp, MC_SHARED_CHMAP, NOOFCHAN)) { |
504 | numchan = 1; | 506 | case 0: |
505 | break; | 507 | default: |
506 | case 1: | 508 | numchan = 1; |
507 | numchan = 2; | 509 | break; |
508 | break; | 510 | case 1: |
509 | case 2: | 511 | numchan = 2; |
510 | numchan = 4; | 512 | break; |
511 | break; | 513 | case 2: |
512 | case 3: | 514 | numchan = 4; |
513 | numchan = 8; | 515 | break; |
514 | break; | 516 | case 3: |
515 | case 4: | 517 | numchan = 8; |
516 | numchan = 3; | 518 | break; |
517 | break; | 519 | case 4: |
518 | case 5: | 520 | numchan = 3; |
519 | numchan = 6; | 521 | break; |
520 | break; | 522 | case 5: |
521 | case 6: | 523 | numchan = 6; |
522 | numchan = 10; | 524 | break; |
523 | break; | 525 | case 6: |
524 | case 7: | 526 | numchan = 10; |
525 | numchan = 12; | 527 | break; |
526 | break; | 528 | case 7: |
527 | case 8: | 529 | numchan = 12; |
528 | numchan = 16; | 530 | break; |
529 | break; | 531 | case 8: |
532 | numchan = 16; | ||
533 | break; | ||
534 | } | ||
535 | adev->mc.vram_width = numchan * chansize; | ||
530 | } | 536 | } |
531 | adev->mc.vram_width = numchan * chansize; | ||
532 | /* Could aper size report 0 ? */ | 537 | /* Could aper size report 0 ? */ |
533 | adev->mc.aper_base = pci_resource_start(adev->pdev, 0); | 538 | adev->mc.aper_base = pci_resource_start(adev->pdev, 0); |
534 | adev->mc.aper_size = pci_resource_len(adev->pdev, 0); | 539 | adev->mc.aper_size = pci_resource_len(adev->pdev, 0); |
@@ -848,7 +853,7 @@ static int gmc_v8_0_gart_enable(struct amdgpu_device *adev) | |||
848 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); | 853 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); |
849 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); | 854 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); |
850 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_BLOCK_SIZE, | 855 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_BLOCK_SIZE, |
851 | amdgpu_vm_block_size - 9); | 856 | adev->vm_manager.block_size - 9); |
852 | WREG32(mmVM_CONTEXT1_CNTL, tmp); | 857 | WREG32(mmVM_CONTEXT1_CNTL, tmp); |
853 | if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS) | 858 | if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS) |
854 | gmc_v8_0_set_fault_enable_default(adev, false); | 859 | gmc_v8_0_set_fault_enable_default(adev, false); |
@@ -1082,7 +1087,12 @@ static int gmc_v8_0_sw_init(void *handle) | |||
1082 | * Currently set to 4GB ((1 << 20) 4k pages). | 1087 | * Currently set to 4GB ((1 << 20) 4k pages). |
1083 | * Max GPUVM size for cayman and SI is 40 bits. | 1088 | * Max GPUVM size for cayman and SI is 40 bits. |
1084 | */ | 1089 | */ |
1085 | adev->vm_manager.max_pfn = amdgpu_vm_size << 18; | 1090 | adev->vm_manager.vm_size = amdgpu_vm_size; |
1091 | adev->vm_manager.block_size = amdgpu_vm_block_size; | ||
1092 | adev->vm_manager.max_pfn = adev->vm_manager.vm_size << 18; | ||
1093 | |||
1094 | DRM_INFO("vm size is %llu GB, block size is %d-bit\n", | ||
1095 | adev->vm_manager.vm_size, adev->vm_manager.block_size); | ||
1086 | 1096 | ||
1087 | /* Set the internal MC address mask | 1097 | /* Set the internal MC address mask |
1088 | * This is the max address of the GPU's | 1098 | * This is the max address of the GPU's |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index df69aae99df4..6329be81f260 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | |||
@@ -75,11 +75,18 @@ static int gmc_v9_0_vm_fault_interrupt_state(struct amdgpu_device *adev, | |||
75 | struct amdgpu_vmhub *hub; | 75 | struct amdgpu_vmhub *hub; |
76 | u32 tmp, reg, bits, i; | 76 | u32 tmp, reg, bits, i; |
77 | 77 | ||
78 | bits = VM_CONTEXT1_CNTL__RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
79 | VM_CONTEXT1_CNTL__DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
80 | VM_CONTEXT1_CNTL__PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
81 | VM_CONTEXT1_CNTL__VALID_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
82 | VM_CONTEXT1_CNTL__READ_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
83 | VM_CONTEXT1_CNTL__WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
84 | VM_CONTEXT1_CNTL__EXECUTE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK; | ||
85 | |||
78 | switch (state) { | 86 | switch (state) { |
79 | case AMDGPU_IRQ_STATE_DISABLE: | 87 | case AMDGPU_IRQ_STATE_DISABLE: |
80 | /* MM HUB */ | 88 | /* MM HUB */ |
81 | hub = &adev->vmhub[AMDGPU_MMHUB]; | 89 | hub = &adev->vmhub[AMDGPU_MMHUB]; |
82 | bits = hub->get_vm_protection_bits(); | ||
83 | for (i = 0; i< 16; i++) { | 90 | for (i = 0; i< 16; i++) { |
84 | reg = hub->vm_context0_cntl + i; | 91 | reg = hub->vm_context0_cntl + i; |
85 | tmp = RREG32(reg); | 92 | tmp = RREG32(reg); |
@@ -89,7 +96,6 @@ static int gmc_v9_0_vm_fault_interrupt_state(struct amdgpu_device *adev, | |||
89 | 96 | ||
90 | /* GFX HUB */ | 97 | /* GFX HUB */ |
91 | hub = &adev->vmhub[AMDGPU_GFXHUB]; | 98 | hub = &adev->vmhub[AMDGPU_GFXHUB]; |
92 | bits = hub->get_vm_protection_bits(); | ||
93 | for (i = 0; i < 16; i++) { | 99 | for (i = 0; i < 16; i++) { |
94 | reg = hub->vm_context0_cntl + i; | 100 | reg = hub->vm_context0_cntl + i; |
95 | tmp = RREG32(reg); | 101 | tmp = RREG32(reg); |
@@ -100,7 +106,6 @@ static int gmc_v9_0_vm_fault_interrupt_state(struct amdgpu_device *adev, | |||
100 | case AMDGPU_IRQ_STATE_ENABLE: | 106 | case AMDGPU_IRQ_STATE_ENABLE: |
101 | /* MM HUB */ | 107 | /* MM HUB */ |
102 | hub = &adev->vmhub[AMDGPU_MMHUB]; | 108 | hub = &adev->vmhub[AMDGPU_MMHUB]; |
103 | bits = hub->get_vm_protection_bits(); | ||
104 | for (i = 0; i< 16; i++) { | 109 | for (i = 0; i< 16; i++) { |
105 | reg = hub->vm_context0_cntl + i; | 110 | reg = hub->vm_context0_cntl + i; |
106 | tmp = RREG32(reg); | 111 | tmp = RREG32(reg); |
@@ -110,7 +115,6 @@ static int gmc_v9_0_vm_fault_interrupt_state(struct amdgpu_device *adev, | |||
110 | 115 | ||
111 | /* GFX HUB */ | 116 | /* GFX HUB */ |
112 | hub = &adev->vmhub[AMDGPU_GFXHUB]; | 117 | hub = &adev->vmhub[AMDGPU_GFXHUB]; |
113 | bits = hub->get_vm_protection_bits(); | ||
114 | for (i = 0; i < 16; i++) { | 118 | for (i = 0; i < 16; i++) { |
115 | reg = hub->vm_context0_cntl + i; | 119 | reg = hub->vm_context0_cntl + i; |
116 | tmp = RREG32(reg); | 120 | tmp = RREG32(reg); |
@@ -129,8 +133,7 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev, | |||
129 | struct amdgpu_irq_src *source, | 133 | struct amdgpu_irq_src *source, |
130 | struct amdgpu_iv_entry *entry) | 134 | struct amdgpu_iv_entry *entry) |
131 | { | 135 | { |
132 | struct amdgpu_vmhub *gfxhub = &adev->vmhub[AMDGPU_GFXHUB]; | 136 | struct amdgpu_vmhub *hub = &adev->vmhub[entry->vm_id_src]; |
133 | struct amdgpu_vmhub *mmhub = &adev->vmhub[AMDGPU_MMHUB]; | ||
134 | uint32_t status = 0; | 137 | uint32_t status = 0; |
135 | u64 addr; | 138 | u64 addr; |
136 | 139 | ||
@@ -138,13 +141,8 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev, | |||
138 | addr |= ((u64)entry->src_data[1] & 0xf) << 44; | 141 | addr |= ((u64)entry->src_data[1] & 0xf) << 44; |
139 | 142 | ||
140 | if (!amdgpu_sriov_vf(adev)) { | 143 | if (!amdgpu_sriov_vf(adev)) { |
141 | if (entry->vm_id_src) { | 144 | status = RREG32(hub->vm_l2_pro_fault_status); |
142 | status = RREG32(mmhub->vm_l2_pro_fault_status); | 145 | WREG32_P(hub->vm_l2_pro_fault_cntl, 1, ~1); |
143 | WREG32_P(mmhub->vm_l2_pro_fault_cntl, 1, ~1); | ||
144 | } else { | ||
145 | status = RREG32(gfxhub->vm_l2_pro_fault_status); | ||
146 | WREG32_P(gfxhub->vm_l2_pro_fault_cntl, 1, ~1); | ||
147 | } | ||
148 | } | 146 | } |
149 | 147 | ||
150 | if (printk_ratelimit()) { | 148 | if (printk_ratelimit()) { |
@@ -175,6 +173,25 @@ static void gmc_v9_0_set_irq_funcs(struct amdgpu_device *adev) | |||
175 | adev->mc.vm_fault.funcs = &gmc_v9_0_irq_funcs; | 173 | adev->mc.vm_fault.funcs = &gmc_v9_0_irq_funcs; |
176 | } | 174 | } |
177 | 175 | ||
176 | static uint32_t gmc_v9_0_get_invalidate_req(unsigned int vm_id) | ||
177 | { | ||
178 | u32 req = 0; | ||
179 | |||
180 | /* invalidate using legacy mode on vm_id*/ | ||
181 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, | ||
182 | PER_VMID_INVALIDATE_REQ, 1 << vm_id); | ||
183 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, FLUSH_TYPE, 0); | ||
184 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PTES, 1); | ||
185 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE0, 1); | ||
186 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE1, 1); | ||
187 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE2, 1); | ||
188 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L1_PTES, 1); | ||
189 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, | ||
190 | CLEAR_PROTECTION_FAULT_STATUS_ADDR, 0); | ||
191 | |||
192 | return req; | ||
193 | } | ||
194 | |||
178 | /* | 195 | /* |
179 | * GART | 196 | * GART |
180 | * VMID 0 is the physical GPU addresses as used by the kernel. | 197 | * VMID 0 is the physical GPU addresses as used by the kernel. |
@@ -204,7 +221,7 @@ static void gmc_v9_0_gart_flush_gpu_tlb(struct amdgpu_device *adev, | |||
204 | 221 | ||
205 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { | 222 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { |
206 | struct amdgpu_vmhub *hub = &adev->vmhub[i]; | 223 | struct amdgpu_vmhub *hub = &adev->vmhub[i]; |
207 | u32 tmp = hub->get_invalidate_req(vmid); | 224 | u32 tmp = gmc_v9_0_get_invalidate_req(vmid); |
208 | 225 | ||
209 | WREG32_NO_KIQ(hub->vm_inv_eng0_req + eng, tmp); | 226 | WREG32_NO_KIQ(hub->vm_inv_eng0_req + eng, tmp); |
210 | 227 | ||
@@ -337,30 +354,23 @@ static uint64_t gmc_v9_0_get_vm_pte_flags(struct amdgpu_device *adev, | |||
337 | return pte_flag; | 354 | return pte_flag; |
338 | } | 355 | } |
339 | 356 | ||
340 | static const struct amdgpu_gart_funcs gmc_v9_0_gart_funcs = { | ||
341 | .flush_gpu_tlb = gmc_v9_0_gart_flush_gpu_tlb, | ||
342 | .set_pte_pde = gmc_v9_0_gart_set_pte_pde, | ||
343 | .get_vm_pte_flags = gmc_v9_0_get_vm_pte_flags | ||
344 | }; | ||
345 | |||
346 | static void gmc_v9_0_set_gart_funcs(struct amdgpu_device *adev) | ||
347 | { | ||
348 | if (adev->gart.gart_funcs == NULL) | ||
349 | adev->gart.gart_funcs = &gmc_v9_0_gart_funcs; | ||
350 | } | ||
351 | |||
352 | static u64 gmc_v9_0_adjust_mc_addr(struct amdgpu_device *adev, u64 mc_addr) | 357 | static u64 gmc_v9_0_adjust_mc_addr(struct amdgpu_device *adev, u64 mc_addr) |
353 | { | 358 | { |
354 | return adev->vm_manager.vram_base_offset + mc_addr - adev->mc.vram_start; | 359 | return adev->vm_manager.vram_base_offset + mc_addr - adev->mc.vram_start; |
355 | } | 360 | } |
356 | 361 | ||
357 | static const struct amdgpu_mc_funcs gmc_v9_0_mc_funcs = { | 362 | static const struct amdgpu_gart_funcs gmc_v9_0_gart_funcs = { |
363 | .flush_gpu_tlb = gmc_v9_0_gart_flush_gpu_tlb, | ||
364 | .set_pte_pde = gmc_v9_0_gart_set_pte_pde, | ||
365 | .get_vm_pte_flags = gmc_v9_0_get_vm_pte_flags, | ||
358 | .adjust_mc_addr = gmc_v9_0_adjust_mc_addr, | 366 | .adjust_mc_addr = gmc_v9_0_adjust_mc_addr, |
367 | .get_invalidate_req = gmc_v9_0_get_invalidate_req, | ||
359 | }; | 368 | }; |
360 | 369 | ||
361 | static void gmc_v9_0_set_mc_funcs(struct amdgpu_device *adev) | 370 | static void gmc_v9_0_set_gart_funcs(struct amdgpu_device *adev) |
362 | { | 371 | { |
363 | adev->mc.mc_funcs = &gmc_v9_0_mc_funcs; | 372 | if (adev->gart.gart_funcs == NULL) |
373 | adev->gart.gart_funcs = &gmc_v9_0_gart_funcs; | ||
364 | } | 374 | } |
365 | 375 | ||
366 | static int gmc_v9_0_early_init(void *handle) | 376 | static int gmc_v9_0_early_init(void *handle) |
@@ -368,7 +378,6 @@ static int gmc_v9_0_early_init(void *handle) | |||
368 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 378 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
369 | 379 | ||
370 | gmc_v9_0_set_gart_funcs(adev); | 380 | gmc_v9_0_set_gart_funcs(adev); |
371 | gmc_v9_0_set_mc_funcs(adev); | ||
372 | gmc_v9_0_set_irq_funcs(adev); | 381 | gmc_v9_0_set_irq_funcs(adev); |
373 | 382 | ||
374 | return 0; | 383 | return 0; |
@@ -543,11 +552,23 @@ static int gmc_v9_0_sw_init(void *handle) | |||
543 | 552 | ||
544 | if (adev->flags & AMD_IS_APU) { | 553 | if (adev->flags & AMD_IS_APU) { |
545 | adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; | 554 | adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; |
555 | adev->vm_manager.vm_size = amdgpu_vm_size; | ||
556 | adev->vm_manager.block_size = amdgpu_vm_block_size; | ||
546 | } else { | 557 | } else { |
547 | /* XXX Don't know how to get VRAM type yet. */ | 558 | /* XXX Don't know how to get VRAM type yet. */ |
548 | adev->mc.vram_type = AMDGPU_VRAM_TYPE_HBM; | 559 | adev->mc.vram_type = AMDGPU_VRAM_TYPE_HBM; |
560 | /* | ||
561 | * To fulfill 4-level page support, | ||
562 | * vm size is 256TB (48bit), maximum size of Vega10, | ||
563 | * block size 512 (9bit) | ||
564 | */ | ||
565 | adev->vm_manager.vm_size = 1U << 18; | ||
566 | adev->vm_manager.block_size = 9; | ||
549 | } | 567 | } |
550 | 568 | ||
569 | DRM_INFO("vm size is %llu GB, block size is %d-bit\n", | ||
570 | adev->vm_manager.vm_size, adev->vm_manager.block_size); | ||
571 | |||
551 | /* This interrupt is VMC page fault.*/ | 572 | /* This interrupt is VMC page fault.*/ |
552 | r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_VMC, 0, | 573 | r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_VMC, 0, |
553 | &adev->mc.vm_fault); | 574 | &adev->mc.vm_fault); |
@@ -557,14 +578,7 @@ static int gmc_v9_0_sw_init(void *handle) | |||
557 | if (r) | 578 | if (r) |
558 | return r; | 579 | return r; |
559 | 580 | ||
560 | /* Because of four level VMPTs, vm size is at least 512GB. | 581 | adev->vm_manager.max_pfn = adev->vm_manager.vm_size << 18; |
561 | * The maximum size is 256TB (48bit). | ||
562 | */ | ||
563 | if (amdgpu_vm_size < 512) { | ||
564 | DRM_WARN("VM size is at least 512GB!\n"); | ||
565 | amdgpu_vm_size = 512; | ||
566 | } | ||
567 | adev->vm_manager.max_pfn = (uint64_t)amdgpu_vm_size << 18; | ||
568 | 582 | ||
569 | /* Set the internal MC address mask | 583 | /* Set the internal MC address mask |
570 | * This is the max address of the GPU's | 584 | * This is the max address of the GPU's |
diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c index 266a0f47a908..62684510ddcd 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c | |||
@@ -242,7 +242,7 @@ int mmhub_v1_0_gart_enable(struct amdgpu_device *adev) | |||
242 | EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); | 242 | EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); |
243 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, | 243 | tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, |
244 | PAGE_TABLE_BLOCK_SIZE, | 244 | PAGE_TABLE_BLOCK_SIZE, |
245 | amdgpu_vm_block_size - 9); | 245 | adev->vm_manager.block_size - 9); |
246 | WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmVM_CONTEXT1_CNTL) + i, tmp); | 246 | WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmVM_CONTEXT1_CNTL) + i, tmp); |
247 | WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32) + i*2, 0); | 247 | WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32) + i*2, 0); |
248 | WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32) + i*2, 0); | 248 | WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32) + i*2, 0); |
@@ -317,36 +317,6 @@ void mmhub_v1_0_set_fault_enable_default(struct amdgpu_device *adev, bool value) | |||
317 | WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmVM_L2_PROTECTION_FAULT_CNTL), tmp); | 317 | WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmVM_L2_PROTECTION_FAULT_CNTL), tmp); |
318 | } | 318 | } |
319 | 319 | ||
320 | static uint32_t mmhub_v1_0_get_invalidate_req(unsigned int vm_id) | ||
321 | { | ||
322 | u32 req = 0; | ||
323 | |||
324 | /* invalidate using legacy mode on vm_id*/ | ||
325 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, | ||
326 | PER_VMID_INVALIDATE_REQ, 1 << vm_id); | ||
327 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, FLUSH_TYPE, 0); | ||
328 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PTES, 1); | ||
329 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE0, 1); | ||
330 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE1, 1); | ||
331 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE2, 1); | ||
332 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L1_PTES, 1); | ||
333 | req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, | ||
334 | CLEAR_PROTECTION_FAULT_STATUS_ADDR, 0); | ||
335 | |||
336 | return req; | ||
337 | } | ||
338 | |||
339 | static uint32_t mmhub_v1_0_get_vm_protection_bits(void) | ||
340 | { | ||
341 | return (VM_CONTEXT1_CNTL__RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
342 | VM_CONTEXT1_CNTL__DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
343 | VM_CONTEXT1_CNTL__PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
344 | VM_CONTEXT1_CNTL__VALID_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
345 | VM_CONTEXT1_CNTL__READ_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
346 | VM_CONTEXT1_CNTL__WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK | | ||
347 | VM_CONTEXT1_CNTL__EXECUTE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK); | ||
348 | } | ||
349 | |||
350 | static int mmhub_v1_0_early_init(void *handle) | 320 | static int mmhub_v1_0_early_init(void *handle) |
351 | { | 321 | { |
352 | return 0; | 322 | return 0; |
@@ -379,9 +349,6 @@ static int mmhub_v1_0_sw_init(void *handle) | |||
379 | hub->vm_l2_pro_fault_cntl = | 349 | hub->vm_l2_pro_fault_cntl = |
380 | SOC15_REG_OFFSET(MMHUB, 0, mmVM_L2_PROTECTION_FAULT_CNTL); | 350 | SOC15_REG_OFFSET(MMHUB, 0, mmVM_L2_PROTECTION_FAULT_CNTL); |
381 | 351 | ||
382 | hub->get_invalidate_req = mmhub_v1_0_get_invalidate_req; | ||
383 | hub->get_vm_protection_bits = mmhub_v1_0_get_vm_protection_bits; | ||
384 | |||
385 | return 0; | 352 | return 0; |
386 | } | 353 | } |
387 | 354 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c index cfd5e54777bb..1493301b6a94 100644 --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include "vega10/GC/gc_9_0_offset.h" | 28 | #include "vega10/GC/gc_9_0_offset.h" |
29 | #include "vega10/GC/gc_9_0_sh_mask.h" | 29 | #include "vega10/GC/gc_9_0_sh_mask.h" |
30 | #include "soc15.h" | 30 | #include "soc15.h" |
31 | #include "vega10_ih.h" | ||
31 | #include "soc15_common.h" | 32 | #include "soc15_common.h" |
32 | #include "mxgpu_ai.h" | 33 | #include "mxgpu_ai.h" |
33 | 34 | ||
@@ -133,7 +134,7 @@ static int xgpu_ai_poll_ack(struct amdgpu_device *adev) | |||
133 | return r; | 134 | return r; |
134 | } | 135 | } |
135 | 136 | ||
136 | static int xgpu_vi_poll_msg(struct amdgpu_device *adev, enum idh_event event) | 137 | static int xgpu_ai_poll_msg(struct amdgpu_device *adev, enum idh_event event) |
137 | { | 138 | { |
138 | int r = 0, timeout = AI_MAILBOX_TIMEDOUT; | 139 | int r = 0, timeout = AI_MAILBOX_TIMEDOUT; |
139 | 140 | ||
@@ -172,7 +173,7 @@ static int xgpu_ai_send_access_requests(struct amdgpu_device *adev, | |||
172 | if (req == IDH_REQ_GPU_INIT_ACCESS || | 173 | if (req == IDH_REQ_GPU_INIT_ACCESS || |
173 | req == IDH_REQ_GPU_FINI_ACCESS || | 174 | req == IDH_REQ_GPU_FINI_ACCESS || |
174 | req == IDH_REQ_GPU_RESET_ACCESS) { | 175 | req == IDH_REQ_GPU_RESET_ACCESS) { |
175 | r = xgpu_vi_poll_msg(adev, IDH_READY_TO_ACCESS_GPU); | 176 | r = xgpu_ai_poll_msg(adev, IDH_READY_TO_ACCESS_GPU); |
176 | if (r) | 177 | if (r) |
177 | return r; | 178 | return r; |
178 | } | 179 | } |
@@ -180,6 +181,11 @@ static int xgpu_ai_send_access_requests(struct amdgpu_device *adev, | |||
180 | return 0; | 181 | return 0; |
181 | } | 182 | } |
182 | 183 | ||
184 | static int xgpu_ai_request_reset(struct amdgpu_device *adev) | ||
185 | { | ||
186 | return xgpu_ai_send_access_requests(adev, IDH_REQ_GPU_RESET_ACCESS); | ||
187 | } | ||
188 | |||
183 | static int xgpu_ai_request_full_gpu_access(struct amdgpu_device *adev, | 189 | static int xgpu_ai_request_full_gpu_access(struct amdgpu_device *adev, |
184 | bool init) | 190 | bool init) |
185 | { | 191 | { |
@@ -201,7 +207,134 @@ static int xgpu_ai_release_full_gpu_access(struct amdgpu_device *adev, | |||
201 | return r; | 207 | return r; |
202 | } | 208 | } |
203 | 209 | ||
210 | static int xgpu_ai_mailbox_ack_irq(struct amdgpu_device *adev, | ||
211 | struct amdgpu_irq_src *source, | ||
212 | struct amdgpu_iv_entry *entry) | ||
213 | { | ||
214 | DRM_DEBUG("get ack intr and do nothing.\n"); | ||
215 | return 0; | ||
216 | } | ||
217 | |||
218 | static int xgpu_ai_set_mailbox_ack_irq(struct amdgpu_device *adev, | ||
219 | struct amdgpu_irq_src *source, | ||
220 | unsigned type, | ||
221 | enum amdgpu_interrupt_state state) | ||
222 | { | ||
223 | u32 tmp = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_MAILBOX_INT_CNTL)); | ||
224 | |||
225 | tmp = REG_SET_FIELD(tmp, BIF_BX_PF0_MAILBOX_INT_CNTL, ACK_INT_EN, | ||
226 | (state == AMDGPU_IRQ_STATE_ENABLE) ? 1 : 0); | ||
227 | WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_MAILBOX_INT_CNTL), tmp); | ||
228 | |||
229 | return 0; | ||
230 | } | ||
231 | |||
232 | static void xgpu_ai_mailbox_flr_work(struct work_struct *work) | ||
233 | { | ||
234 | struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt, flr_work); | ||
235 | struct amdgpu_device *adev = container_of(virt, struct amdgpu_device, virt); | ||
236 | |||
237 | /* wait until RCV_MSG become 3 */ | ||
238 | if (xgpu_ai_poll_msg(adev, IDH_FLR_NOTIFICATION_CMPL)) { | ||
239 | pr_err("failed to recieve FLR_CMPL\n"); | ||
240 | return; | ||
241 | } | ||
242 | |||
243 | /* Trigger recovery due to world switch failure */ | ||
244 | amdgpu_sriov_gpu_reset(adev, false); | ||
245 | } | ||
246 | |||
247 | static int xgpu_ai_set_mailbox_rcv_irq(struct amdgpu_device *adev, | ||
248 | struct amdgpu_irq_src *src, | ||
249 | unsigned type, | ||
250 | enum amdgpu_interrupt_state state) | ||
251 | { | ||
252 | u32 tmp = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_MAILBOX_INT_CNTL)); | ||
253 | |||
254 | tmp = REG_SET_FIELD(tmp, BIF_BX_PF0_MAILBOX_INT_CNTL, VALID_INT_EN, | ||
255 | (state == AMDGPU_IRQ_STATE_ENABLE) ? 1 : 0); | ||
256 | WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_MAILBOX_INT_CNTL), tmp); | ||
257 | |||
258 | return 0; | ||
259 | } | ||
260 | |||
261 | static int xgpu_ai_mailbox_rcv_irq(struct amdgpu_device *adev, | ||
262 | struct amdgpu_irq_src *source, | ||
263 | struct amdgpu_iv_entry *entry) | ||
264 | { | ||
265 | int r; | ||
266 | |||
267 | /* see what event we get */ | ||
268 | r = xgpu_ai_mailbox_rcv_msg(adev, IDH_FLR_NOTIFICATION); | ||
269 | |||
270 | /* only handle FLR_NOTIFY now */ | ||
271 | if (!r) | ||
272 | schedule_work(&adev->virt.flr_work); | ||
273 | |||
274 | return 0; | ||
275 | } | ||
276 | |||
277 | static const struct amdgpu_irq_src_funcs xgpu_ai_mailbox_ack_irq_funcs = { | ||
278 | .set = xgpu_ai_set_mailbox_ack_irq, | ||
279 | .process = xgpu_ai_mailbox_ack_irq, | ||
280 | }; | ||
281 | |||
282 | static const struct amdgpu_irq_src_funcs xgpu_ai_mailbox_rcv_irq_funcs = { | ||
283 | .set = xgpu_ai_set_mailbox_rcv_irq, | ||
284 | .process = xgpu_ai_mailbox_rcv_irq, | ||
285 | }; | ||
286 | |||
287 | void xgpu_ai_mailbox_set_irq_funcs(struct amdgpu_device *adev) | ||
288 | { | ||
289 | adev->virt.ack_irq.num_types = 1; | ||
290 | adev->virt.ack_irq.funcs = &xgpu_ai_mailbox_ack_irq_funcs; | ||
291 | adev->virt.rcv_irq.num_types = 1; | ||
292 | adev->virt.rcv_irq.funcs = &xgpu_ai_mailbox_rcv_irq_funcs; | ||
293 | } | ||
294 | |||
295 | int xgpu_ai_mailbox_add_irq_id(struct amdgpu_device *adev) | ||
296 | { | ||
297 | int r; | ||
298 | |||
299 | r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 135, &adev->virt.rcv_irq); | ||
300 | if (r) | ||
301 | return r; | ||
302 | |||
303 | r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 138, &adev->virt.ack_irq); | ||
304 | if (r) { | ||
305 | amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0); | ||
306 | return r; | ||
307 | } | ||
308 | |||
309 | return 0; | ||
310 | } | ||
311 | |||
312 | int xgpu_ai_mailbox_get_irq(struct amdgpu_device *adev) | ||
313 | { | ||
314 | int r; | ||
315 | |||
316 | r = amdgpu_irq_get(adev, &adev->virt.rcv_irq, 0); | ||
317 | if (r) | ||
318 | return r; | ||
319 | r = amdgpu_irq_get(adev, &adev->virt.ack_irq, 0); | ||
320 | if (r) { | ||
321 | amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0); | ||
322 | return r; | ||
323 | } | ||
324 | |||
325 | INIT_WORK(&adev->virt.flr_work, xgpu_ai_mailbox_flr_work); | ||
326 | |||
327 | return 0; | ||
328 | } | ||
329 | |||
330 | void xgpu_ai_mailbox_put_irq(struct amdgpu_device *adev) | ||
331 | { | ||
332 | amdgpu_irq_put(adev, &adev->virt.ack_irq, 0); | ||
333 | amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0); | ||
334 | } | ||
335 | |||
204 | const struct amdgpu_virt_ops xgpu_ai_virt_ops = { | 336 | const struct amdgpu_virt_ops xgpu_ai_virt_ops = { |
205 | .req_full_gpu = xgpu_ai_request_full_gpu_access, | 337 | .req_full_gpu = xgpu_ai_request_full_gpu_access, |
206 | .rel_full_gpu = xgpu_ai_release_full_gpu_access, | 338 | .rel_full_gpu = xgpu_ai_release_full_gpu_access, |
339 | .reset_gpu = xgpu_ai_request_reset, | ||
207 | }; | 340 | }; |
diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h index bf8ab8fd4367..9aefc44d2c34 100644 --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h | |||
@@ -24,7 +24,7 @@ | |||
24 | #ifndef __MXGPU_AI_H__ | 24 | #ifndef __MXGPU_AI_H__ |
25 | #define __MXGPU_AI_H__ | 25 | #define __MXGPU_AI_H__ |
26 | 26 | ||
27 | #define AI_MAILBOX_TIMEDOUT 150000 | 27 | #define AI_MAILBOX_TIMEDOUT 5000 |
28 | 28 | ||
29 | enum idh_request { | 29 | enum idh_request { |
30 | IDH_REQ_GPU_INIT_ACCESS = 1, | 30 | IDH_REQ_GPU_INIT_ACCESS = 1, |
@@ -44,4 +44,9 @@ enum idh_event { | |||
44 | 44 | ||
45 | extern const struct amdgpu_virt_ops xgpu_ai_virt_ops; | 45 | extern const struct amdgpu_virt_ops xgpu_ai_virt_ops; |
46 | 46 | ||
47 | void xgpu_ai_mailbox_set_irq_funcs(struct amdgpu_device *adev); | ||
48 | int xgpu_ai_mailbox_add_irq_id(struct amdgpu_device *adev); | ||
49 | int xgpu_ai_mailbox_get_irq(struct amdgpu_device *adev); | ||
50 | void xgpu_ai_mailbox_put_irq(struct amdgpu_device *adev); | ||
51 | |||
47 | #endif | 52 | #endif |
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c index 5191c45ffdf3..c3588d1c7cb0 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c | |||
@@ -491,7 +491,7 @@ bool psp_v3_1_compare_sram_data(struct psp_context *psp, | |||
491 | 491 | ||
492 | ucode_size = ucode->ucode_size; | 492 | ucode_size = ucode->ucode_size; |
493 | ucode_mem = (uint32_t *)ucode->kaddr; | 493 | ucode_mem = (uint32_t *)ucode->kaddr; |
494 | while (!ucode_size) { | 494 | while (ucode_size) { |
495 | fw_sram_reg_val = RREG32(fw_sram_data_reg_offset); | 495 | fw_sram_reg_val = RREG32(fw_sram_data_reg_offset); |
496 | 496 | ||
497 | if (*ucode_mem != fw_sram_reg_val) | 497 | if (*ucode_mem != fw_sram_reg_val) |
@@ -508,14 +508,10 @@ bool psp_v3_1_compare_sram_data(struct psp_context *psp, | |||
508 | bool psp_v3_1_smu_reload_quirk(struct psp_context *psp) | 508 | bool psp_v3_1_smu_reload_quirk(struct psp_context *psp) |
509 | { | 509 | { |
510 | struct amdgpu_device *adev = psp->adev; | 510 | struct amdgpu_device *adev = psp->adev; |
511 | uint32_t reg, reg_val; | 511 | uint32_t reg; |
512 | 512 | ||
513 | reg_val = (smnMP1_FIRMWARE_FLAGS & 0xffffffff) | 0x03b00000; | 513 | reg = smnMP1_FIRMWARE_FLAGS | 0x03b00000; |
514 | WREG32(SOC15_REG_OFFSET(NBIO, 0, mmPCIE_INDEX2), reg_val); | 514 | WREG32(SOC15_REG_OFFSET(NBIO, 0, mmPCIE_INDEX2), reg); |
515 | reg = RREG32(SOC15_REG_OFFSET(NBIO, 0, mmPCIE_DATA2)); | 515 | reg = RREG32(SOC15_REG_OFFSET(NBIO, 0, mmPCIE_DATA2)); |
516 | if ((reg & MP1_FIRMWARE_FLAGS__INTERRUPTS_ENABLED_MASK) >> | 516 | return (reg & MP1_FIRMWARE_FLAGS__INTERRUPTS_ENABLED_MASK) ? true : false; |
517 | MP1_FIRMWARE_FLAGS__INTERRUPTS_ENABLED__SHIFT) | ||
518 | return true; | ||
519 | |||
520 | return false; | ||
521 | } | 517 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index 2dd2b20d727e..21f38d882335 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | |||
@@ -1039,6 +1039,7 @@ 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, | 1039 | static void sdma_v4_0_ring_emit_vm_flush(struct amdgpu_ring *ring, |
1040 | unsigned vm_id, uint64_t pd_addr) | 1040 | unsigned vm_id, uint64_t pd_addr) |
1041 | { | 1041 | { |
1042 | uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); | ||
1042 | unsigned eng = ring->idx; | 1043 | unsigned eng = ring->idx; |
1043 | unsigned i; | 1044 | unsigned i; |
1044 | 1045 | ||
@@ -1048,7 +1049,6 @@ static void sdma_v4_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
1048 | 1049 | ||
1049 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { | 1050 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { |
1050 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; | 1051 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; |
1051 | uint32_t req = hub->get_invalidate_req(vm_id); | ||
1052 | 1052 | ||
1053 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | | 1053 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | |
1054 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); | 1054 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); |
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index bb14a45997b5..385de8617075 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c | |||
@@ -106,6 +106,8 @@ static u32 soc15_pcie_rreg(struct amdgpu_device *adev, u32 reg) | |||
106 | 106 | ||
107 | if (adev->asic_type == CHIP_VEGA10) | 107 | if (adev->asic_type == CHIP_VEGA10) |
108 | nbio_pcie_id = &nbio_v6_1_pcie_index_data; | 108 | nbio_pcie_id = &nbio_v6_1_pcie_index_data; |
109 | else | ||
110 | BUG(); | ||
109 | 111 | ||
110 | address = nbio_pcie_id->index_offset; | 112 | address = nbio_pcie_id->index_offset; |
111 | data = nbio_pcie_id->data_offset; | 113 | data = nbio_pcie_id->data_offset; |
@@ -125,6 +127,8 @@ static void soc15_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v) | |||
125 | 127 | ||
126 | if (adev->asic_type == CHIP_VEGA10) | 128 | if (adev->asic_type == CHIP_VEGA10) |
127 | nbio_pcie_id = &nbio_v6_1_pcie_index_data; | 129 | nbio_pcie_id = &nbio_v6_1_pcie_index_data; |
130 | else | ||
131 | BUG(); | ||
128 | 132 | ||
129 | address = nbio_pcie_id->index_offset; | 133 | address = nbio_pcie_id->index_offset; |
130 | data = nbio_pcie_id->data_offset; | 134 | data = nbio_pcie_id->data_offset; |
@@ -493,7 +497,8 @@ int soc15_set_ip_blocks(struct amdgpu_device *adev) | |||
493 | amdgpu_ip_block_add(adev, &mmhub_v1_0_ip_block); | 497 | amdgpu_ip_block_add(adev, &mmhub_v1_0_ip_block); |
494 | amdgpu_ip_block_add(adev, &gmc_v9_0_ip_block); | 498 | amdgpu_ip_block_add(adev, &gmc_v9_0_ip_block); |
495 | amdgpu_ip_block_add(adev, &vega10_ih_ip_block); | 499 | amdgpu_ip_block_add(adev, &vega10_ih_ip_block); |
496 | amdgpu_ip_block_add(adev, &psp_v3_1_ip_block); | 500 | if (amdgpu_fw_load_type == 2 || amdgpu_fw_load_type == -1) |
501 | amdgpu_ip_block_add(adev, &psp_v3_1_ip_block); | ||
497 | if (!amdgpu_sriov_vf(adev)) | 502 | if (!amdgpu_sriov_vf(adev)) |
498 | amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); | 503 | amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); |
499 | if (adev->enable_virtual_display || amdgpu_sriov_vf(adev)) | 504 | if (adev->enable_virtual_display || amdgpu_sriov_vf(adev)) |
@@ -558,6 +563,7 @@ static int soc15_common_early_init(void *handle) | |||
558 | 563 | ||
559 | if (amdgpu_sriov_vf(adev)) { | 564 | if (amdgpu_sriov_vf(adev)) { |
560 | amdgpu_virt_init_setting(adev); | 565 | amdgpu_virt_init_setting(adev); |
566 | xgpu_ai_mailbox_set_irq_funcs(adev); | ||
561 | } | 567 | } |
562 | 568 | ||
563 | /* | 569 | /* |
@@ -610,8 +616,23 @@ static int soc15_common_early_init(void *handle) | |||
610 | return 0; | 616 | return 0; |
611 | } | 617 | } |
612 | 618 | ||
619 | static int soc15_common_late_init(void *handle) | ||
620 | { | ||
621 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | ||
622 | |||
623 | if (amdgpu_sriov_vf(adev)) | ||
624 | xgpu_ai_mailbox_get_irq(adev); | ||
625 | |||
626 | return 0; | ||
627 | } | ||
628 | |||
613 | static int soc15_common_sw_init(void *handle) | 629 | static int soc15_common_sw_init(void *handle) |
614 | { | 630 | { |
631 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | ||
632 | |||
633 | if (amdgpu_sriov_vf(adev)) | ||
634 | xgpu_ai_mailbox_add_irq_id(adev); | ||
635 | |||
615 | return 0; | 636 | return 0; |
616 | } | 637 | } |
617 | 638 | ||
@@ -642,6 +663,8 @@ static int soc15_common_hw_fini(void *handle) | |||
642 | 663 | ||
643 | /* disable the doorbell aperture */ | 664 | /* disable the doorbell aperture */ |
644 | soc15_enable_doorbell_aperture(adev, false); | 665 | soc15_enable_doorbell_aperture(adev, false); |
666 | if (amdgpu_sriov_vf(adev)) | ||
667 | xgpu_ai_mailbox_put_irq(adev); | ||
645 | 668 | ||
646 | return 0; | 669 | return 0; |
647 | } | 670 | } |
@@ -855,7 +878,7 @@ static int soc15_common_set_powergating_state(void *handle, | |||
855 | const struct amd_ip_funcs soc15_common_ip_funcs = { | 878 | const struct amd_ip_funcs soc15_common_ip_funcs = { |
856 | .name = "soc15_common", | 879 | .name = "soc15_common", |
857 | .early_init = soc15_common_early_init, | 880 | .early_init = soc15_common_early_init, |
858 | .late_init = NULL, | 881 | .late_init = soc15_common_late_init, |
859 | .sw_init = soc15_common_sw_init, | 882 | .sw_init = soc15_common_sw_init, |
860 | .sw_fini = soc15_common_sw_fini, | 883 | .sw_fini = soc15_common_sw_fini, |
861 | .hw_init = soc15_common_hw_init, | 884 | .hw_init = soc15_common_hw_init, |
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c index 9a4129d881aa..8ab0f78794a5 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c | |||
@@ -135,12 +135,9 @@ static int uvd_v4_2_sw_fini(void *handle) | |||
135 | if (r) | 135 | if (r) |
136 | return r; | 136 | return r; |
137 | 137 | ||
138 | r = amdgpu_uvd_sw_fini(adev); | 138 | return amdgpu_uvd_sw_fini(adev); |
139 | if (r) | ||
140 | return r; | ||
141 | |||
142 | return r; | ||
143 | } | 139 | } |
140 | |||
144 | static void uvd_v4_2_enable_mgcg(struct amdgpu_device *adev, | 141 | static void uvd_v4_2_enable_mgcg(struct amdgpu_device *adev, |
145 | bool enable); | 142 | bool enable); |
146 | /** | 143 | /** |
@@ -230,11 +227,7 @@ static int uvd_v4_2_suspend(void *handle) | |||
230 | if (r) | 227 | if (r) |
231 | return r; | 228 | return r; |
232 | 229 | ||
233 | r = amdgpu_uvd_suspend(adev); | 230 | return amdgpu_uvd_suspend(adev); |
234 | if (r) | ||
235 | return r; | ||
236 | |||
237 | return r; | ||
238 | } | 231 | } |
239 | 232 | ||
240 | static int uvd_v4_2_resume(void *handle) | 233 | static int uvd_v4_2_resume(void *handle) |
@@ -246,11 +239,7 @@ static int uvd_v4_2_resume(void *handle) | |||
246 | if (r) | 239 | if (r) |
247 | return r; | 240 | return r; |
248 | 241 | ||
249 | r = uvd_v4_2_hw_init(adev); | 242 | return uvd_v4_2_hw_init(adev); |
250 | if (r) | ||
251 | return r; | ||
252 | |||
253 | return r; | ||
254 | } | 243 | } |
255 | 244 | ||
256 | /** | 245 | /** |
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c index e448f7d86bc0..bb6d46e168a3 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c | |||
@@ -131,11 +131,7 @@ static int uvd_v5_0_sw_fini(void *handle) | |||
131 | if (r) | 131 | if (r) |
132 | return r; | 132 | return r; |
133 | 133 | ||
134 | r = amdgpu_uvd_sw_fini(adev); | 134 | return amdgpu_uvd_sw_fini(adev); |
135 | if (r) | ||
136 | return r; | ||
137 | |||
138 | return r; | ||
139 | } | 135 | } |
140 | 136 | ||
141 | /** | 137 | /** |
@@ -228,11 +224,7 @@ static int uvd_v5_0_suspend(void *handle) | |||
228 | return r; | 224 | return r; |
229 | uvd_v5_0_set_clockgating_state(adev, AMD_CG_STATE_GATE); | 225 | uvd_v5_0_set_clockgating_state(adev, AMD_CG_STATE_GATE); |
230 | 226 | ||
231 | r = amdgpu_uvd_suspend(adev); | 227 | return amdgpu_uvd_suspend(adev); |
232 | if (r) | ||
233 | return r; | ||
234 | |||
235 | return r; | ||
236 | } | 228 | } |
237 | 229 | ||
238 | static int uvd_v5_0_resume(void *handle) | 230 | static int uvd_v5_0_resume(void *handle) |
@@ -244,11 +236,7 @@ static int uvd_v5_0_resume(void *handle) | |||
244 | if (r) | 236 | if (r) |
245 | return r; | 237 | return r; |
246 | 238 | ||
247 | r = uvd_v5_0_hw_init(adev); | 239 | return uvd_v5_0_hw_init(adev); |
248 | if (r) | ||
249 | return r; | ||
250 | |||
251 | return r; | ||
252 | } | 240 | } |
253 | 241 | ||
254 | /** | 242 | /** |
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c index 5679a4249bd9..31db356476f8 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | |||
@@ -134,11 +134,7 @@ static int uvd_v6_0_sw_fini(void *handle) | |||
134 | if (r) | 134 | if (r) |
135 | return r; | 135 | return r; |
136 | 136 | ||
137 | r = amdgpu_uvd_sw_fini(adev); | 137 | return amdgpu_uvd_sw_fini(adev); |
138 | if (r) | ||
139 | return r; | ||
140 | |||
141 | return r; | ||
142 | } | 138 | } |
143 | 139 | ||
144 | /** | 140 | /** |
@@ -230,11 +226,8 @@ static int uvd_v6_0_suspend(void *handle) | |||
230 | return r; | 226 | return r; |
231 | 227 | ||
232 | /* Skip this for APU for now */ | 228 | /* Skip this for APU for now */ |
233 | if (!(adev->flags & AMD_IS_APU)) { | 229 | if (!(adev->flags & AMD_IS_APU)) |
234 | r = amdgpu_uvd_suspend(adev); | 230 | r = amdgpu_uvd_suspend(adev); |
235 | if (r) | ||
236 | return r; | ||
237 | } | ||
238 | 231 | ||
239 | return r; | 232 | return r; |
240 | } | 233 | } |
@@ -250,11 +243,7 @@ static int uvd_v6_0_resume(void *handle) | |||
250 | if (r) | 243 | if (r) |
251 | return r; | 244 | return r; |
252 | } | 245 | } |
253 | r = uvd_v6_0_hw_init(adev); | 246 | return uvd_v6_0_hw_init(adev); |
254 | if (r) | ||
255 | return r; | ||
256 | |||
257 | return r; | ||
258 | } | 247 | } |
259 | 248 | ||
260 | /** | 249 | /** |
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c index 13f52e0af9b8..9bcf01469282 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c | |||
@@ -438,11 +438,7 @@ static int uvd_v7_0_sw_fini(void *handle) | |||
438 | for (i = 0; i < adev->uvd.num_enc_rings; ++i) | 438 | for (i = 0; i < adev->uvd.num_enc_rings; ++i) |
439 | amdgpu_ring_fini(&adev->uvd.ring_enc[i]); | 439 | amdgpu_ring_fini(&adev->uvd.ring_enc[i]); |
440 | 440 | ||
441 | r = amdgpu_uvd_sw_fini(adev); | 441 | return amdgpu_uvd_sw_fini(adev); |
442 | if (r) | ||
443 | return r; | ||
444 | |||
445 | return r; | ||
446 | } | 442 | } |
447 | 443 | ||
448 | /** | 444 | /** |
@@ -547,11 +543,8 @@ static int uvd_v7_0_suspend(void *handle) | |||
547 | return r; | 543 | return r; |
548 | 544 | ||
549 | /* Skip this for APU for now */ | 545 | /* Skip this for APU for now */ |
550 | if (!(adev->flags & AMD_IS_APU)) { | 546 | if (!(adev->flags & AMD_IS_APU)) |
551 | r = amdgpu_uvd_suspend(adev); | 547 | r = amdgpu_uvd_suspend(adev); |
552 | if (r) | ||
553 | return r; | ||
554 | } | ||
555 | 548 | ||
556 | return r; | 549 | return r; |
557 | } | 550 | } |
@@ -567,11 +560,7 @@ static int uvd_v7_0_resume(void *handle) | |||
567 | if (r) | 560 | if (r) |
568 | return r; | 561 | return r; |
569 | } | 562 | } |
570 | r = uvd_v7_0_hw_init(adev); | 563 | return uvd_v7_0_hw_init(adev); |
571 | if (r) | ||
572 | return r; | ||
573 | |||
574 | return r; | ||
575 | } | 564 | } |
576 | 565 | ||
577 | /** | 566 | /** |
@@ -1045,6 +1034,7 @@ static void uvd_v7_0_vm_reg_wait(struct amdgpu_ring *ring, | |||
1045 | static void uvd_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | 1034 | static void uvd_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring, |
1046 | unsigned vm_id, uint64_t pd_addr) | 1035 | unsigned vm_id, uint64_t pd_addr) |
1047 | { | 1036 | { |
1037 | uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); | ||
1048 | uint32_t data0, data1, mask; | 1038 | uint32_t data0, data1, mask; |
1049 | unsigned eng = ring->idx; | 1039 | unsigned eng = ring->idx; |
1050 | unsigned i; | 1040 | unsigned i; |
@@ -1055,7 +1045,6 @@ static void uvd_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
1055 | 1045 | ||
1056 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { | 1046 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { |
1057 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; | 1047 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; |
1058 | uint32_t req = hub->get_invalidate_req(vm_id); | ||
1059 | 1048 | ||
1060 | data0 = (hub->ctx0_ptb_addr_hi32 + vm_id * 2) << 2; | 1049 | data0 = (hub->ctx0_ptb_addr_hi32 + vm_id * 2) << 2; |
1061 | data1 = upper_32_bits(pd_addr); | 1050 | data1 = upper_32_bits(pd_addr); |
@@ -1091,6 +1080,7 @@ static void uvd_v7_0_enc_ring_insert_end(struct amdgpu_ring *ring) | |||
1091 | static void uvd_v7_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring, | 1080 | static void uvd_v7_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring, |
1092 | unsigned int vm_id, uint64_t pd_addr) | 1081 | unsigned int vm_id, uint64_t pd_addr) |
1093 | { | 1082 | { |
1083 | uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); | ||
1094 | unsigned eng = ring->idx; | 1084 | unsigned eng = ring->idx; |
1095 | unsigned i; | 1085 | unsigned i; |
1096 | 1086 | ||
@@ -1100,7 +1090,6 @@ static void uvd_v7_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
1100 | 1090 | ||
1101 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { | 1091 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { |
1102 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; | 1092 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; |
1103 | uint32_t req = hub->get_invalidate_req(vm_id); | ||
1104 | 1093 | ||
1105 | amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WRITE); | 1094 | amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WRITE); |
1106 | amdgpu_ring_write(ring, | 1095 | amdgpu_ring_write(ring, |
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c index 49a6c45e65be..47f70827195b 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c | |||
@@ -451,11 +451,7 @@ static int vce_v2_0_sw_fini(void *handle) | |||
451 | if (r) | 451 | if (r) |
452 | return r; | 452 | return r; |
453 | 453 | ||
454 | r = amdgpu_vce_sw_fini(adev); | 454 | return amdgpu_vce_sw_fini(adev); |
455 | if (r) | ||
456 | return r; | ||
457 | |||
458 | return r; | ||
459 | } | 455 | } |
460 | 456 | ||
461 | static int vce_v2_0_hw_init(void *handle) | 457 | static int vce_v2_0_hw_init(void *handle) |
@@ -495,11 +491,7 @@ static int vce_v2_0_suspend(void *handle) | |||
495 | if (r) | 491 | if (r) |
496 | return r; | 492 | return r; |
497 | 493 | ||
498 | r = amdgpu_vce_suspend(adev); | 494 | return amdgpu_vce_suspend(adev); |
499 | if (r) | ||
500 | return r; | ||
501 | |||
502 | return r; | ||
503 | } | 495 | } |
504 | 496 | ||
505 | static int vce_v2_0_resume(void *handle) | 497 | static int vce_v2_0_resume(void *handle) |
@@ -511,11 +503,7 @@ static int vce_v2_0_resume(void *handle) | |||
511 | if (r) | 503 | if (r) |
512 | return r; | 504 | return r; |
513 | 505 | ||
514 | r = vce_v2_0_hw_init(adev); | 506 | return vce_v2_0_hw_init(adev); |
515 | if (r) | ||
516 | return r; | ||
517 | |||
518 | return r; | ||
519 | } | 507 | } |
520 | 508 | ||
521 | static int vce_v2_0_soft_reset(void *handle) | 509 | static int vce_v2_0_soft_reset(void *handle) |
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c index db0adac073c6..fb0819359909 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | |||
@@ -417,11 +417,7 @@ static int vce_v3_0_sw_fini(void *handle) | |||
417 | if (r) | 417 | if (r) |
418 | return r; | 418 | return r; |
419 | 419 | ||
420 | r = amdgpu_vce_sw_fini(adev); | 420 | return amdgpu_vce_sw_fini(adev); |
421 | if (r) | ||
422 | return r; | ||
423 | |||
424 | return r; | ||
425 | } | 421 | } |
426 | 422 | ||
427 | static int vce_v3_0_hw_init(void *handle) | 423 | static int vce_v3_0_hw_init(void *handle) |
@@ -471,11 +467,7 @@ static int vce_v3_0_suspend(void *handle) | |||
471 | if (r) | 467 | if (r) |
472 | return r; | 468 | return r; |
473 | 469 | ||
474 | r = amdgpu_vce_suspend(adev); | 470 | return amdgpu_vce_suspend(adev); |
475 | if (r) | ||
476 | return r; | ||
477 | |||
478 | return r; | ||
479 | } | 471 | } |
480 | 472 | ||
481 | static int vce_v3_0_resume(void *handle) | 473 | static int vce_v3_0_resume(void *handle) |
@@ -487,11 +479,7 @@ static int vce_v3_0_resume(void *handle) | |||
487 | if (r) | 479 | if (r) |
488 | return r; | 480 | return r; |
489 | 481 | ||
490 | r = vce_v3_0_hw_init(adev); | 482 | return vce_v3_0_hw_init(adev); |
491 | if (r) | ||
492 | return r; | ||
493 | |||
494 | return r; | ||
495 | } | 483 | } |
496 | 484 | ||
497 | static void vce_v3_0_mc_resume(struct amdgpu_device *adev, int idx) | 485 | static void vce_v3_0_mc_resume(struct amdgpu_device *adev, int idx) |
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c index becc5f744a98..edde5fe938d6 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c | |||
@@ -527,11 +527,7 @@ static int vce_v4_0_sw_fini(void *handle) | |||
527 | if (r) | 527 | if (r) |
528 | return r; | 528 | return r; |
529 | 529 | ||
530 | r = amdgpu_vce_sw_fini(adev); | 530 | return amdgpu_vce_sw_fini(adev); |
531 | if (r) | ||
532 | return r; | ||
533 | |||
534 | return r; | ||
535 | } | 531 | } |
536 | 532 | ||
537 | static int vce_v4_0_hw_init(void *handle) | 533 | static int vce_v4_0_hw_init(void *handle) |
@@ -584,11 +580,7 @@ static int vce_v4_0_suspend(void *handle) | |||
584 | if (r) | 580 | if (r) |
585 | return r; | 581 | return r; |
586 | 582 | ||
587 | r = amdgpu_vce_suspend(adev); | 583 | return amdgpu_vce_suspend(adev); |
588 | if (r) | ||
589 | return r; | ||
590 | |||
591 | return r; | ||
592 | } | 584 | } |
593 | 585 | ||
594 | static int vce_v4_0_resume(void *handle) | 586 | static int vce_v4_0_resume(void *handle) |
@@ -600,11 +592,7 @@ static int vce_v4_0_resume(void *handle) | |||
600 | if (r) | 592 | if (r) |
601 | return r; | 593 | return r; |
602 | 594 | ||
603 | r = vce_v4_0_hw_init(adev); | 595 | return vce_v4_0_hw_init(adev); |
604 | if (r) | ||
605 | return r; | ||
606 | |||
607 | return r; | ||
608 | } | 596 | } |
609 | 597 | ||
610 | static void vce_v4_0_mc_resume(struct amdgpu_device *adev) | 598 | static void vce_v4_0_mc_resume(struct amdgpu_device *adev) |
@@ -985,6 +973,7 @@ static void vce_v4_0_ring_insert_end(struct amdgpu_ring *ring) | |||
985 | static void vce_v4_0_emit_vm_flush(struct amdgpu_ring *ring, | 973 | static void vce_v4_0_emit_vm_flush(struct amdgpu_ring *ring, |
986 | unsigned int vm_id, uint64_t pd_addr) | 974 | unsigned int vm_id, uint64_t pd_addr) |
987 | { | 975 | { |
976 | uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id); | ||
988 | unsigned eng = ring->idx; | 977 | unsigned eng = ring->idx; |
989 | unsigned i; | 978 | unsigned i; |
990 | 979 | ||
@@ -994,7 +983,6 @@ static void vce_v4_0_emit_vm_flush(struct amdgpu_ring *ring, | |||
994 | 983 | ||
995 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { | 984 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { |
996 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; | 985 | struct amdgpu_vmhub *hub = &ring->adev->vmhub[i]; |
997 | uint32_t req = hub->get_invalidate_req(vm_id); | ||
998 | 986 | ||
999 | amdgpu_ring_write(ring, VCE_CMD_REG_WRITE); | 987 | amdgpu_ring_write(ring, VCE_CMD_REG_WRITE); |
1000 | amdgpu_ring_write(ring, | 988 | amdgpu_ring_write(ring, |
diff --git a/drivers/gpu/drm/amd/amdgpu/vid.h b/drivers/gpu/drm/amd/amdgpu/vid.h index b3a86e0e96e6..5f2ab9c1609a 100644 --- a/drivers/gpu/drm/amd/amdgpu/vid.h +++ b/drivers/gpu/drm/amd/amdgpu/vid.h | |||
@@ -362,7 +362,89 @@ | |||
362 | #define PACKET3_WAIT_ON_DE_COUNTER_DIFF 0x88 | 362 | #define PACKET3_WAIT_ON_DE_COUNTER_DIFF 0x88 |
363 | #define PACKET3_SWITCH_BUFFER 0x8B | 363 | #define PACKET3_SWITCH_BUFFER 0x8B |
364 | #define PACKET3_SET_RESOURCES 0xA0 | 364 | #define PACKET3_SET_RESOURCES 0xA0 |
365 | /* 1. header | ||
366 | * 2. CONTROL | ||
367 | * 3. QUEUE_MASK_LO [31:0] | ||
368 | * 4. QUEUE_MASK_HI [31:0] | ||
369 | * 5. GWS_MASK_LO [31:0] | ||
370 | * 6. GWS_MASK_HI [31:0] | ||
371 | * 7. OAC_MASK [15:0] | ||
372 | * 8. GDS_HEAP_SIZE [16:11] | GDS_HEAP_BASE [5:0] | ||
373 | */ | ||
374 | # define PACKET3_SET_RESOURCES_VMID_MASK(x) ((x) << 0) | ||
375 | # define PACKET3_SET_RESOURCES_UNMAP_LATENTY(x) ((x) << 16) | ||
376 | # define PACKET3_SET_RESOURCES_QUEUE_TYPE(x) ((x) << 29) | ||
365 | #define PACKET3_MAP_QUEUES 0xA2 | 377 | #define PACKET3_MAP_QUEUES 0xA2 |
378 | /* 1. header | ||
379 | * 2. CONTROL | ||
380 | * 3. CONTROL2 | ||
381 | * 4. MQD_ADDR_LO [31:0] | ||
382 | * 5. MQD_ADDR_HI [31:0] | ||
383 | * 6. WPTR_ADDR_LO [31:0] | ||
384 | * 7. WPTR_ADDR_HI [31:0] | ||
385 | */ | ||
386 | /* CONTROL */ | ||
387 | # define PACKET3_MAP_QUEUES_QUEUE_SEL(x) ((x) << 4) | ||
388 | # define PACKET3_MAP_QUEUES_VMID(x) ((x) << 8) | ||
389 | # define PACKET3_MAP_QUEUES_QUEUE_TYPE(x) ((x) << 21) | ||
390 | # define PACKET3_MAP_QUEUES_ALLOC_FORMAT(x) ((x) << 24) | ||
391 | # define PACKET3_MAP_QUEUES_ENGINE_SEL(x) ((x) << 26) | ||
392 | # define PACKET3_MAP_QUEUES_NUM_QUEUES(x) ((x) << 29) | ||
393 | /* CONTROL2 */ | ||
394 | # define PACKET3_MAP_QUEUES_CHECK_DISABLE(x) ((x) << 1) | ||
395 | # define PACKET3_MAP_QUEUES_DOORBELL_OFFSET(x) ((x) << 2) | ||
396 | # define PACKET3_MAP_QUEUES_QUEUE(x) ((x) << 26) | ||
397 | # define PACKET3_MAP_QUEUES_PIPE(x) ((x) << 29) | ||
398 | # define PACKET3_MAP_QUEUES_ME(x) ((x) << 31) | ||
399 | #define PACKET3_UNMAP_QUEUES 0xA3 | ||
400 | /* 1. header | ||
401 | * 2. CONTROL | ||
402 | * 3. CONTROL2 | ||
403 | * 4. CONTROL3 | ||
404 | * 5. CONTROL4 | ||
405 | * 6. CONTROL5 | ||
406 | */ | ||
407 | /* CONTROL */ | ||
408 | # define PACKET3_UNMAP_QUEUES_ACTION(x) ((x) << 0) | ||
409 | /* 0 - PREEMPT_QUEUES | ||
410 | * 1 - RESET_QUEUES | ||
411 | * 2 - DISABLE_PROCESS_QUEUES | ||
412 | * 3 - PREEMPT_QUEUES_NO_UNMAP | ||
413 | */ | ||
414 | # define PACKET3_UNMAP_QUEUES_QUEUE_SEL(x) ((x) << 4) | ||
415 | # define PACKET3_UNMAP_QUEUES_ENGINE_SEL(x) ((x) << 26) | ||
416 | # define PACKET3_UNMAP_QUEUES_NUM_QUEUES(x) ((x) << 29) | ||
417 | /* CONTROL2a */ | ||
418 | # define PACKET3_UNMAP_QUEUES_PASID(x) ((x) << 0) | ||
419 | /* CONTROL2b */ | ||
420 | # define PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(x) ((x) << 2) | ||
421 | /* CONTROL3a */ | ||
422 | # define PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET1(x) ((x) << 2) | ||
423 | /* CONTROL3b */ | ||
424 | # define PACKET3_UNMAP_QUEUES_RB_WPTR(x) ((x) << 0) | ||
425 | /* CONTROL4 */ | ||
426 | # define PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET2(x) ((x) << 2) | ||
427 | /* CONTROL5 */ | ||
428 | # define PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET3(x) ((x) << 2) | ||
429 | #define PACKET3_QUERY_STATUS 0xA4 | ||
430 | /* 1. header | ||
431 | * 2. CONTROL | ||
432 | * 3. CONTROL2 | ||
433 | * 4. ADDR_LO [31:0] | ||
434 | * 5. ADDR_HI [31:0] | ||
435 | * 6. DATA_LO [31:0] | ||
436 | * 7. DATA_HI [31:0] | ||
437 | */ | ||
438 | /* CONTROL */ | ||
439 | # define PACKET3_QUERY_STATUS_CONTEXT_ID(x) ((x) << 0) | ||
440 | # define PACKET3_QUERY_STATUS_INTERRUPT_SEL(x) ((x) << 28) | ||
441 | # define PACKET3_QUERY_STATUS_COMMAND(x) ((x) << 30) | ||
442 | /* CONTROL2a */ | ||
443 | # define PACKET3_QUERY_STATUS_PASID(x) ((x) << 0) | ||
444 | /* CONTROL2b */ | ||
445 | # define PACKET3_QUERY_STATUS_DOORBELL_OFFSET(x) ((x) << 2) | ||
446 | # define PACKET3_QUERY_STATUS_ENG_SEL(x) ((x) << 25) | ||
447 | |||
366 | 448 | ||
367 | #define VCE_CMD_NO_OP 0x00000000 | 449 | #define VCE_CMD_NO_OP 0x00000000 |
368 | #define VCE_CMD_END 0x00000001 | 450 | #define VCE_CMD_END 0x00000001 |
diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c index dfd4fe6f0578..9da5b0bb66d8 100644 --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c | |||
@@ -493,8 +493,10 @@ static int pp_dpm_dispatch_tasks(void *handle, enum amd_pp_event event_id, | |||
493 | { | 493 | { |
494 | enum amd_pm_state_type ps; | 494 | enum amd_pm_state_type ps; |
495 | 495 | ||
496 | if (input == NULL) | 496 | if (input == NULL) { |
497 | return -EINVAL; | 497 | ret = -EINVAL; |
498 | break; | ||
499 | } | ||
498 | ps = *(unsigned long *)input; | 500 | ps = *(unsigned long *)input; |
499 | 501 | ||
500 | data.requested_ui_label = power_state_convert(ps); | 502 | data.requested_ui_label = power_state_convert(ps); |
@@ -539,15 +541,19 @@ static enum amd_pm_state_type pp_dpm_get_current_power_state(void *handle) | |||
539 | switch (state->classification.ui_label) { | 541 | switch (state->classification.ui_label) { |
540 | case PP_StateUILabel_Battery: | 542 | case PP_StateUILabel_Battery: |
541 | pm_type = POWER_STATE_TYPE_BATTERY; | 543 | pm_type = POWER_STATE_TYPE_BATTERY; |
544 | break; | ||
542 | case PP_StateUILabel_Balanced: | 545 | case PP_StateUILabel_Balanced: |
543 | pm_type = POWER_STATE_TYPE_BALANCED; | 546 | pm_type = POWER_STATE_TYPE_BALANCED; |
547 | break; | ||
544 | case PP_StateUILabel_Performance: | 548 | case PP_StateUILabel_Performance: |
545 | pm_type = POWER_STATE_TYPE_PERFORMANCE; | 549 | pm_type = POWER_STATE_TYPE_PERFORMANCE; |
550 | break; | ||
546 | default: | 551 | default: |
547 | if (state->classification.flags & PP_StateClassificationFlag_Boot) | 552 | if (state->classification.flags & PP_StateClassificationFlag_Boot) |
548 | pm_type = POWER_STATE_TYPE_INTERNAL_BOOT; | 553 | pm_type = POWER_STATE_TYPE_INTERNAL_BOOT; |
549 | else | 554 | else |
550 | pm_type = POWER_STATE_TYPE_DEFAULT; | 555 | pm_type = POWER_STATE_TYPE_DEFAULT; |
556 | break; | ||
551 | } | 557 | } |
552 | mutex_unlock(&pp_handle->pp_lock); | 558 | mutex_unlock(&pp_handle->pp_lock); |
553 | 559 | ||
@@ -894,7 +900,7 @@ static int pp_dpm_set_sclk_od(void *handle, uint32_t value) | |||
894 | 900 | ||
895 | mutex_lock(&pp_handle->pp_lock); | 901 | mutex_lock(&pp_handle->pp_lock); |
896 | ret = hwmgr->hwmgr_func->set_sclk_od(hwmgr, value); | 902 | ret = hwmgr->hwmgr_func->set_sclk_od(hwmgr, value); |
897 | mutex_lock(&pp_handle->pp_lock); | 903 | mutex_unlock(&pp_handle->pp_lock); |
898 | return ret; | 904 | return ret; |
899 | } | 905 | } |
900 | 906 | ||
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 aee021451d35..2037910adcb1 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,9 @@ | |||
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 0xa | 33 | #define SMU9_DRIVER_IF_VERSION 0xB |
34 | |||
35 | #define PPTABLE_V10_SMU_VERSION 1 | ||
34 | 36 | ||
35 | #define NUM_GFXCLK_DPM_LEVELS 8 | 37 | #define NUM_GFXCLK_DPM_LEVELS 8 |
36 | #define NUM_UVD_DPM_LEVELS 8 | 38 | #define NUM_UVD_DPM_LEVELS 8 |
@@ -87,6 +89,11 @@ typedef struct { | |||
87 | int32_t a0; | 89 | int32_t a0; |
88 | int32_t a1; | 90 | int32_t a1; |
89 | int32_t a2; | 91 | int32_t a2; |
92 | |||
93 | uint8_t a0_shift; | ||
94 | uint8_t a1_shift; | ||
95 | uint8_t a2_shift; | ||
96 | uint8_t padding; | ||
90 | } GbVdroopTable_t; | 97 | } GbVdroopTable_t; |
91 | 98 | ||
92 | typedef struct { | 99 | typedef struct { |
@@ -293,7 +300,9 @@ typedef struct { | |||
293 | uint16_t Platform_sigma; | 300 | uint16_t Platform_sigma; |
294 | uint16_t PSM_Age_CompFactor; | 301 | uint16_t PSM_Age_CompFactor; |
295 | 302 | ||
296 | uint32_t Reserved[20]; | 303 | uint32_t DpmLevelPowerDelta; |
304 | |||
305 | uint32_t Reserved[19]; | ||
297 | 306 | ||
298 | /* Padding - ignore */ | 307 | /* Padding - ignore */ |
299 | uint32_t MmHubPadding[7]; /* SMU internal use */ | 308 | uint32_t MmHubPadding[7]; /* SMU internal use */ |
@@ -350,8 +359,8 @@ typedef struct { | |||
350 | typedef struct { | 359 | typedef struct { |
351 | uint16_t avgPsmCount[30]; | 360 | uint16_t avgPsmCount[30]; |
352 | uint16_t minPsmCount[30]; | 361 | uint16_t minPsmCount[30]; |
353 | uint16_t avgPsmVoltage[30]; /* in mV with 2 fractional bits */ | 362 | float avgPsmVoltage[30]; |
354 | uint16_t minPsmVoltage[30]; /* in mV with 2 fractional bits */ | 363 | float minPsmVoltage[30]; |
355 | 364 | ||
356 | uint32_t MmHubPadding[7]; /* SMU internal use */ | 365 | uint32_t MmHubPadding[7]; /* SMU internal use */ |
357 | } AvfsDebugTable_t; | 366 | } AvfsDebugTable_t; |
@@ -414,5 +423,45 @@ typedef struct { | |||
414 | #define UCLK_SWITCH_SLOW 0 | 423 | #define UCLK_SWITCH_SLOW 0 |
415 | #define UCLK_SWITCH_FAST 1 | 424 | #define UCLK_SWITCH_FAST 1 |
416 | 425 | ||
426 | /* GFX DIDT Configuration */ | ||
427 | #define SQ_Enable_MASK 0x1 | ||
428 | #define SQ_IR_MASK 0x2 | ||
429 | #define SQ_PCC_MASK 0x4 | ||
430 | #define SQ_EDC_MASK 0x8 | ||
431 | |||
432 | #define TCP_Enable_MASK 0x100 | ||
433 | #define TCP_IR_MASK 0x200 | ||
434 | #define TCP_PCC_MASK 0x400 | ||
435 | #define TCP_EDC_MASK 0x800 | ||
436 | |||
437 | #define TD_Enable_MASK 0x10000 | ||
438 | #define TD_IR_MASK 0x20000 | ||
439 | #define TD_PCC_MASK 0x40000 | ||
440 | #define TD_EDC_MASK 0x80000 | ||
441 | |||
442 | #define DB_Enable_MASK 0x1000000 | ||
443 | #define DB_IR_MASK 0x2000000 | ||
444 | #define DB_PCC_MASK 0x4000000 | ||
445 | #define DB_EDC_MASK 0x8000000 | ||
446 | |||
447 | #define SQ_Enable_SHIFT 0 | ||
448 | #define SQ_IR_SHIFT 1 | ||
449 | #define SQ_PCC_SHIFT 2 | ||
450 | #define SQ_EDC_SHIFT 3 | ||
451 | |||
452 | #define TCP_Enable_SHIFT 8 | ||
453 | #define TCP_IR_SHIFT 9 | ||
454 | #define TCP_PCC_SHIFT 10 | ||
455 | #define TCP_EDC_SHIFT 11 | ||
456 | |||
457 | #define TD_Enable_SHIFT 16 | ||
458 | #define TD_IR_SHIFT 17 | ||
459 | #define TD_PCC_SHIFT 18 | ||
460 | #define TD_EDC_SHIFT 19 | ||
461 | |||
462 | #define DB_Enable_SHIFT 24 | ||
463 | #define DB_IR_SHIFT 25 | ||
464 | #define DB_PCC_SHIFT 26 | ||
465 | #define DB_EDC_SHIFT 27 | ||
417 | 466 | ||
418 | #endif | 467 | #endif |
diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c index 50c910efa13d..e879496b8a42 100644 --- a/drivers/gpu/drm/ast/ast_ttm.c +++ b/drivers/gpu/drm/ast/ast_ttm.c | |||
@@ -236,6 +236,7 @@ struct ttm_bo_driver ast_bo_driver = { | |||
236 | .verify_access = ast_bo_verify_access, | 236 | .verify_access = ast_bo_verify_access, |
237 | .io_mem_reserve = &ast_ttm_io_mem_reserve, | 237 | .io_mem_reserve = &ast_ttm_io_mem_reserve, |
238 | .io_mem_free = &ast_ttm_io_mem_free, | 238 | .io_mem_free = &ast_ttm_io_mem_free, |
239 | .io_mem_pfn = ttm_bo_default_io_mem_pfn, | ||
239 | }; | 240 | }; |
240 | 241 | ||
241 | int ast_mm_init(struct ast_private *ast) | 242 | int ast_mm_init(struct ast_private *ast) |
diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c index 857755ac2d70..c4cadb638460 100644 --- a/drivers/gpu/drm/bochs/bochs_mm.c +++ b/drivers/gpu/drm/bochs/bochs_mm.c | |||
@@ -205,6 +205,7 @@ struct ttm_bo_driver bochs_bo_driver = { | |||
205 | .verify_access = bochs_bo_verify_access, | 205 | .verify_access = bochs_bo_verify_access, |
206 | .io_mem_reserve = &bochs_ttm_io_mem_reserve, | 206 | .io_mem_reserve = &bochs_ttm_io_mem_reserve, |
207 | .io_mem_free = &bochs_ttm_io_mem_free, | 207 | .io_mem_free = &bochs_ttm_io_mem_free, |
208 | .io_mem_pfn = ttm_bo_default_io_mem_pfn, | ||
208 | }; | 209 | }; |
209 | 210 | ||
210 | int bochs_mm_init(struct bochs_device *bochs) | 211 | int bochs_mm_init(struct bochs_device *bochs) |
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c index f53aa8f4a143..93dbcd38355d 100644 --- a/drivers/gpu/drm/cirrus/cirrus_ttm.c +++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c | |||
@@ -236,6 +236,7 @@ struct ttm_bo_driver cirrus_bo_driver = { | |||
236 | .verify_access = cirrus_bo_verify_access, | 236 | .verify_access = cirrus_bo_verify_access, |
237 | .io_mem_reserve = &cirrus_ttm_io_mem_reserve, | 237 | .io_mem_reserve = &cirrus_ttm_io_mem_reserve, |
238 | .io_mem_free = &cirrus_ttm_io_mem_free, | 238 | .io_mem_free = &cirrus_ttm_io_mem_free, |
239 | .io_mem_pfn = ttm_bo_default_io_mem_pfn, | ||
239 | }; | 240 | }; |
240 | 241 | ||
241 | int cirrus_mm_init(struct cirrus_device *cirrus) | 242 | int cirrus_mm_init(struct cirrus_device *cirrus) |
diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c index 657598bb1e6b..565a217b46f2 100644 --- a/drivers/gpu/drm/mgag200/mgag200_ttm.c +++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c | |||
@@ -236,6 +236,7 @@ struct ttm_bo_driver mgag200_bo_driver = { | |||
236 | .verify_access = mgag200_bo_verify_access, | 236 | .verify_access = mgag200_bo_verify_access, |
237 | .io_mem_reserve = &mgag200_ttm_io_mem_reserve, | 237 | .io_mem_reserve = &mgag200_ttm_io_mem_reserve, |
238 | .io_mem_free = &mgag200_ttm_io_mem_free, | 238 | .io_mem_free = &mgag200_ttm_io_mem_free, |
239 | .io_mem_pfn = ttm_bo_default_io_mem_pfn, | ||
239 | }; | 240 | }; |
240 | 241 | ||
241 | int mgag200_mm_init(struct mga_device *mdev) | 242 | int mgag200_mm_init(struct mga_device *mdev) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index 548f36d33924..e427f80344c4 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c | |||
@@ -1574,6 +1574,7 @@ struct ttm_bo_driver nouveau_bo_driver = { | |||
1574 | .fault_reserve_notify = &nouveau_ttm_fault_reserve_notify, | 1574 | .fault_reserve_notify = &nouveau_ttm_fault_reserve_notify, |
1575 | .io_mem_reserve = &nouveau_ttm_io_mem_reserve, | 1575 | .io_mem_reserve = &nouveau_ttm_io_mem_reserve, |
1576 | .io_mem_free = &nouveau_ttm_io_mem_free, | 1576 | .io_mem_free = &nouveau_ttm_io_mem_free, |
1577 | .io_mem_pfn = ttm_bo_default_io_mem_pfn, | ||
1577 | }; | 1578 | }; |
1578 | 1579 | ||
1579 | struct nvkm_vma * | 1580 | struct nvkm_vma * |
diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c index 7d1cab57c89e..0fdedee4509d 100644 --- a/drivers/gpu/drm/qxl/qxl_ttm.c +++ b/drivers/gpu/drm/qxl/qxl_ttm.c | |||
@@ -393,6 +393,7 @@ static struct ttm_bo_driver qxl_bo_driver = { | |||
393 | .verify_access = &qxl_verify_access, | 393 | .verify_access = &qxl_verify_access, |
394 | .io_mem_reserve = &qxl_ttm_io_mem_reserve, | 394 | .io_mem_reserve = &qxl_ttm_io_mem_reserve, |
395 | .io_mem_free = &qxl_ttm_io_mem_free, | 395 | .io_mem_free = &qxl_ttm_io_mem_free, |
396 | .io_mem_pfn = ttm_bo_default_io_mem_pfn, | ||
396 | .move_notify = &qxl_bo_move_notify, | 397 | .move_notify = &qxl_bo_move_notify, |
397 | }; | 398 | }; |
398 | 399 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 684f1703aa5c..bfb06469db46 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | |||
@@ -873,6 +873,7 @@ static struct ttm_bo_driver radeon_bo_driver = { | |||
873 | .fault_reserve_notify = &radeon_bo_fault_reserve_notify, | 873 | .fault_reserve_notify = &radeon_bo_fault_reserve_notify, |
874 | .io_mem_reserve = &radeon_ttm_io_mem_reserve, | 874 | .io_mem_reserve = &radeon_ttm_io_mem_reserve, |
875 | .io_mem_free = &radeon_ttm_io_mem_free, | 875 | .io_mem_free = &radeon_ttm_io_mem_free, |
876 | .io_mem_pfn = ttm_bo_default_io_mem_pfn, | ||
876 | }; | 877 | }; |
877 | 878 | ||
878 | int radeon_ttm_init(struct radeon_device *rdev) | 879 | int radeon_ttm_init(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 412240a3ba90..e44626a2e698 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c | |||
@@ -1020,37 +1020,44 @@ out_unlock: | |||
1020 | return ret; | 1020 | return ret; |
1021 | } | 1021 | } |
1022 | 1022 | ||
1023 | bool ttm_bo_mem_compat(struct ttm_placement *placement, | 1023 | static bool ttm_bo_places_compat(const struct ttm_place *places, |
1024 | struct ttm_mem_reg *mem, | 1024 | unsigned num_placement, |
1025 | uint32_t *new_flags) | 1025 | struct ttm_mem_reg *mem, |
1026 | uint32_t *new_flags) | ||
1026 | { | 1027 | { |
1027 | int i; | 1028 | unsigned i; |
1028 | |||
1029 | for (i = 0; i < placement->num_placement; i++) { | ||
1030 | const struct ttm_place *heap = &placement->placement[i]; | ||
1031 | if (mem->mm_node && | ||
1032 | (mem->start < heap->fpfn || | ||
1033 | (heap->lpfn != 0 && (mem->start + mem->num_pages) > heap->lpfn))) | ||
1034 | continue; | ||
1035 | 1029 | ||
1036 | *new_flags = heap->flags; | 1030 | for (i = 0; i < num_placement; i++) { |
1037 | if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) && | 1031 | const struct ttm_place *heap = &places[i]; |
1038 | (*new_flags & mem->placement & TTM_PL_MASK_MEM)) | ||
1039 | return true; | ||
1040 | } | ||
1041 | 1032 | ||
1042 | for (i = 0; i < placement->num_busy_placement; i++) { | 1033 | if (mem->mm_node && (mem->start < heap->fpfn || |
1043 | const struct ttm_place *heap = &placement->busy_placement[i]; | ||
1044 | if (mem->mm_node && | ||
1045 | (mem->start < heap->fpfn || | ||
1046 | (heap->lpfn != 0 && (mem->start + mem->num_pages) > heap->lpfn))) | 1034 | (heap->lpfn != 0 && (mem->start + mem->num_pages) > heap->lpfn))) |
1047 | continue; | 1035 | continue; |
1048 | 1036 | ||
1049 | *new_flags = heap->flags; | 1037 | *new_flags = heap->flags; |
1050 | if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) && | 1038 | if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) && |
1051 | (*new_flags & mem->placement & TTM_PL_MASK_MEM)) | 1039 | (*new_flags & mem->placement & TTM_PL_MASK_MEM) && |
1040 | (!(*new_flags & TTM_PL_FLAG_CONTIGUOUS) || | ||
1041 | (mem->placement & TTM_PL_FLAG_CONTIGUOUS))) | ||
1052 | return true; | 1042 | return true; |
1053 | } | 1043 | } |
1044 | return false; | ||
1045 | } | ||
1046 | |||
1047 | bool ttm_bo_mem_compat(struct ttm_placement *placement, | ||
1048 | struct ttm_mem_reg *mem, | ||
1049 | uint32_t *new_flags) | ||
1050 | { | ||
1051 | if (ttm_bo_places_compat(placement->placement, placement->num_placement, | ||
1052 | mem, new_flags)) | ||
1053 | return true; | ||
1054 | |||
1055 | if ((placement->busy_placement != placement->placement || | ||
1056 | placement->num_busy_placement > placement->num_placement) && | ||
1057 | ttm_bo_places_compat(placement->busy_placement, | ||
1058 | placement->num_busy_placement, | ||
1059 | mem, new_flags)) | ||
1060 | return true; | ||
1054 | 1061 | ||
1055 | return false; | 1062 | return false; |
1056 | } | 1063 | } |
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c index 35ffb3754feb..9f53df95f35c 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c | |||
@@ -231,7 +231,7 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf) | |||
231 | */ | 231 | */ |
232 | for (i = 0; i < TTM_BO_VM_NUM_PREFAULT; ++i) { | 232 | for (i = 0; i < TTM_BO_VM_NUM_PREFAULT; ++i) { |
233 | if (bo->mem.bus.is_iomem) | 233 | if (bo->mem.bus.is_iomem) |
234 | pfn = ((bo->mem.bus.base + bo->mem.bus.offset) >> PAGE_SHIFT) + page_offset; | 234 | pfn = bdev->driver->io_mem_pfn(bo, page_offset); |
235 | else { | 235 | else { |
236 | page = ttm->pages[page_offset]; | 236 | page = ttm->pages[page_offset]; |
237 | if (unlikely(!page && i == 0)) { | 237 | if (unlikely(!page && i == 0)) { |
@@ -324,6 +324,14 @@ static struct ttm_buffer_object *ttm_bo_vm_lookup(struct ttm_bo_device *bdev, | |||
324 | return bo; | 324 | return bo; |
325 | } | 325 | } |
326 | 326 | ||
327 | unsigned long ttm_bo_default_io_mem_pfn(struct ttm_buffer_object *bo, | ||
328 | unsigned long page_offset) | ||
329 | { | ||
330 | return ((bo->mem.bus.base + bo->mem.bus.offset) >> PAGE_SHIFT) | ||
331 | + page_offset; | ||
332 | } | ||
333 | EXPORT_SYMBOL(ttm_bo_default_io_mem_pfn); | ||
334 | |||
327 | int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma, | 335 | int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma, |
328 | struct ttm_bo_device *bdev) | 336 | struct ttm_bo_device *bdev) |
329 | { | 337 | { |
diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c index 70ec8ca8d9b1..4e8e27d50922 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ttm.c +++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c | |||
@@ -431,6 +431,7 @@ static struct ttm_bo_driver virtio_gpu_bo_driver = { | |||
431 | .verify_access = &virtio_gpu_verify_access, | 431 | .verify_access = &virtio_gpu_verify_access, |
432 | .io_mem_reserve = &virtio_gpu_ttm_io_mem_reserve, | 432 | .io_mem_reserve = &virtio_gpu_ttm_io_mem_reserve, |
433 | .io_mem_free = &virtio_gpu_ttm_io_mem_free, | 433 | .io_mem_free = &virtio_gpu_ttm_io_mem_free, |
434 | .io_mem_pfn = ttm_bo_default_io_mem_pfn, | ||
434 | .move_notify = &virtio_gpu_bo_move_notify, | 435 | .move_notify = &virtio_gpu_bo_move_notify, |
435 | .swap_notify = &virtio_gpu_bo_swap_notify, | 436 | .swap_notify = &virtio_gpu_bo_swap_notify, |
436 | }; | 437 | }; |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c index 4c7f24a67a2e..35bf781e418e 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | |||
@@ -859,4 +859,5 @@ struct ttm_bo_driver vmw_bo_driver = { | |||
859 | .fault_reserve_notify = &vmw_ttm_fault_reserve_notify, | 859 | .fault_reserve_notify = &vmw_ttm_fault_reserve_notify, |
860 | .io_mem_reserve = &vmw_ttm_io_mem_reserve, | 860 | .io_mem_reserve = &vmw_ttm_io_mem_reserve, |
861 | .io_mem_free = &vmw_ttm_io_mem_free, | 861 | .io_mem_free = &vmw_ttm_io_mem_free, |
862 | .io_mem_pfn = ttm_bo_default_io_mem_pfn, | ||
862 | }; | 863 | }; |
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index 0b1ce05e2c2e..fa07be197945 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h | |||
@@ -711,6 +711,17 @@ extern int ttm_fbdev_mmap(struct vm_area_struct *vma, | |||
711 | struct ttm_buffer_object *bo); | 711 | struct ttm_buffer_object *bo); |
712 | 712 | ||
713 | /** | 713 | /** |
714 | * ttm_bo_default_iomem_pfn - get a pfn for a page offset | ||
715 | * | ||
716 | * @bo: the BO we need to look up the pfn for | ||
717 | * @page_offset: offset inside the BO to look up. | ||
718 | * | ||
719 | * Calculate the PFN for iomem based mappings during page fault | ||
720 | */ | ||
721 | unsigned long ttm_bo_default_io_mem_pfn(struct ttm_buffer_object *bo, | ||
722 | unsigned long page_offset); | ||
723 | |||
724 | /** | ||
714 | * ttm_bo_mmap - mmap out of the ttm device address space. | 725 | * ttm_bo_mmap - mmap out of the ttm device address space. |
715 | * | 726 | * |
716 | * @filp: filp as input from the mmap method. | 727 | * @filp: filp as input from the mmap method. |
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index 3641c6128ac2..6bbd34d25a8d 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h | |||
@@ -462,6 +462,15 @@ struct ttm_bo_driver { | |||
462 | struct ttm_mem_reg *mem); | 462 | struct ttm_mem_reg *mem); |
463 | void (*io_mem_free)(struct ttm_bo_device *bdev, | 463 | void (*io_mem_free)(struct ttm_bo_device *bdev, |
464 | struct ttm_mem_reg *mem); | 464 | struct ttm_mem_reg *mem); |
465 | |||
466 | /** | ||
467 | * Return the pfn for a given page_offset inside the BO. | ||
468 | * | ||
469 | * @bo: the BO to look up the pfn for | ||
470 | * @page_offset: the offset to look up | ||
471 | */ | ||
472 | unsigned long (*io_mem_pfn)(struct ttm_buffer_object *bo, | ||
473 | unsigned long page_offset); | ||
465 | }; | 474 | }; |
466 | 475 | ||
467 | /** | 476 | /** |
diff --git a/include/drm/ttm/ttm_placement.h b/include/drm/ttm/ttm_placement.h index 932be0c8086e..e88a8e39767b 100644 --- a/include/drm/ttm/ttm_placement.h +++ b/include/drm/ttm/ttm_placement.h | |||
@@ -63,6 +63,7 @@ | |||
63 | #define TTM_PL_FLAG_CACHED (1 << 16) | 63 | #define TTM_PL_FLAG_CACHED (1 << 16) |
64 | #define TTM_PL_FLAG_UNCACHED (1 << 17) | 64 | #define TTM_PL_FLAG_UNCACHED (1 << 17) |
65 | #define TTM_PL_FLAG_WC (1 << 18) | 65 | #define TTM_PL_FLAG_WC (1 << 18) |
66 | #define TTM_PL_FLAG_CONTIGUOUS (1 << 19) | ||
66 | #define TTM_PL_FLAG_NO_EVICT (1 << 21) | 67 | #define TTM_PL_FLAG_NO_EVICT (1 << 21) |
67 | #define TTM_PL_FLAG_TOPDOWN (1 << 22) | 68 | #define TTM_PL_FLAG_TOPDOWN (1 << 22) |
68 | 69 | ||