aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c34
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c22
6 files changed, 22 insertions, 47 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 771995093cac..c942f6b4be1b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -2574,43 +2574,35 @@ static uint32_t amdgpu_vm_get_block_size(uint64_t vm_size)
2574} 2574}
2575 2575
2576/** 2576/**
2577 * amdgpu_vm_set_fragment_size - adjust fragment size in PTE
2578 *
2579 * @adev: amdgpu_device pointer
2580 * @fragment_size_default: the default fragment size if it's set auto
2581 */
2582void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev,
2583 uint32_t fragment_size_default)
2584{
2585 if (amdgpu_vm_fragment_size == -1)
2586 adev->vm_manager.fragment_size = fragment_size_default;
2587 else
2588 adev->vm_manager.fragment_size = amdgpu_vm_fragment_size;
2589}
2590
2591/**
2592 * amdgpu_vm_adjust_size - adjust vm size, block size and fragment size 2577 * amdgpu_vm_adjust_size - adjust vm size, block size and fragment size
2593 * 2578 *
2594 * @adev: amdgpu_device pointer 2579 * @adev: amdgpu_device pointer
2595 * @vm_size: the default vm size if it's set auto 2580 * @vm_size: the default vm size if it's set auto
2596 */ 2581 */
2597void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size, 2582void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size,
2598 uint32_t fragment_size_default) 2583 uint32_t fragment_size_default, unsigned max_level)
2599{ 2584{
2600 /* adjust vm size firstly */ 2585 /* adjust vm size first, but only for two level setups for now */
2601 if (amdgpu_vm_size != -1) 2586 if (amdgpu_vm_size != -1 && max_level == 1)
2602 vm_size = amdgpu_vm_size; 2587 vm_size = amdgpu_vm_size;
2603 2588
2604 adev->vm_manager.max_pfn = (uint64_t)vm_size << 18; 2589 adev->vm_manager.max_pfn = (uint64_t)vm_size << 18;
2590 adev->vm_manager.num_level = max_level;
2605 2591
2606 /* block size depends on vm size */ 2592 /* block size depends on vm size and hw setup*/
2607 if (amdgpu_vm_block_size == -1) 2593 if (adev->vm_manager.num_level > 1)
2594 /* Use fixed block_size for multi level page tables */
2595 adev->vm_manager.block_size = 9;
2596 else if (amdgpu_vm_block_size == -1)
2608 adev->vm_manager.block_size = 2597 adev->vm_manager.block_size =
2609 amdgpu_vm_get_block_size(vm_size); 2598 amdgpu_vm_get_block_size(vm_size);
2610 else 2599 else
2611 adev->vm_manager.block_size = amdgpu_vm_block_size; 2600 adev->vm_manager.block_size = amdgpu_vm_block_size;
2612 2601
2613 amdgpu_vm_set_fragment_size(adev, fragment_size_default); 2602 if (amdgpu_vm_fragment_size == -1)
2603 adev->vm_manager.fragment_size = fragment_size_default;
2604 else
2605 adev->vm_manager.fragment_size = amdgpu_vm_fragment_size;
2614 2606
2615 DRM_INFO("vm size is %u GB, block size is %u-bit, fragment size is %u-bit\n", 2607 DRM_INFO("vm size is %u GB, block size is %u-bit, fragment size is %u-bit\n",
2616 vm_size, adev->vm_manager.block_size, 2608 vm_size, adev->vm_manager.block_size,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index c80d45dd2bd3..54e540d5e8d7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -324,10 +324,8 @@ struct amdgpu_bo_va_mapping *amdgpu_vm_bo_lookup_mapping(struct amdgpu_vm *vm,
324 uint64_t addr); 324 uint64_t addr);
325void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, 325void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
326 struct amdgpu_bo_va *bo_va); 326 struct amdgpu_bo_va *bo_va);
327void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev,
328 uint32_t fragment_size_default);
329void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size, 327void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size,
330 uint32_t fragment_size_default); 328 uint32_t fragment_size_default, unsigned max_level);
331int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); 329int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp);
332bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *ring, 330bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *ring,
333 struct amdgpu_job *job); 331 struct amdgpu_job *job);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
index 6098c773711f..49224bf38324 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
@@ -832,7 +832,7 @@ static int gmc_v6_0_sw_init(void *handle)
832 if (r) 832 if (r)
833 return r; 833 return r;
834 834
835 amdgpu_vm_adjust_size(adev, 64, 9); 835 amdgpu_vm_adjust_size(adev, 64, 9, 1);
836 836
837 adev->mc.mc_mask = 0xffffffffffULL; 837 adev->mc.mc_mask = 0xffffffffffULL;
838 838
@@ -877,7 +877,6 @@ static int gmc_v6_0_sw_init(void *handle)
877 * amdkfd will use VMIDs 8-15 877 * amdkfd will use VMIDs 8-15
878 */ 878 */
879 adev->vm_manager.id_mgr[0].num_ids = AMDGPU_NUM_OF_VMIDS; 879 adev->vm_manager.id_mgr[0].num_ids = AMDGPU_NUM_OF_VMIDS;
880 adev->vm_manager.num_level = 1;
881 amdgpu_vm_manager_init(adev); 880 amdgpu_vm_manager_init(adev);
882 881
883 /* base offset of vram pages */ 882 /* base offset of vram pages */
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index 8b460e9d4431..c39cf8440afd 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -971,7 +971,7 @@ static int gmc_v7_0_sw_init(void *handle)
971 * Currently set to 4GB ((1 << 20) 4k pages). 971 * Currently set to 4GB ((1 << 20) 4k pages).
972 * Max GPUVM size for cayman and SI is 40 bits. 972 * Max GPUVM size for cayman and SI is 40 bits.
973 */ 973 */
974 amdgpu_vm_adjust_size(adev, 64, 9); 974 amdgpu_vm_adjust_size(adev, 64, 9, 1);
975 975
976 /* Set the internal MC address mask 976 /* Set the internal MC address mask
977 * This is the max address of the GPU's 977 * This is the max address of the GPU's
@@ -1026,7 +1026,6 @@ static int gmc_v7_0_sw_init(void *handle)
1026 * amdkfd will use VMIDs 8-15 1026 * amdkfd will use VMIDs 8-15
1027 */ 1027 */
1028 adev->vm_manager.id_mgr[0].num_ids = AMDGPU_NUM_OF_VMIDS; 1028 adev->vm_manager.id_mgr[0].num_ids = AMDGPU_NUM_OF_VMIDS;
1029 adev->vm_manager.num_level = 1;
1030 amdgpu_vm_manager_init(adev); 1029 amdgpu_vm_manager_init(adev);
1031 1030
1032 /* base offset of vram pages */ 1031 /* base offset of vram pages */
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index 1fd7f9daab0a..421e751a0464 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -1068,7 +1068,7 @@ static int gmc_v8_0_sw_init(void *handle)
1068 * Currently set to 4GB ((1 << 20) 4k pages). 1068 * Currently set to 4GB ((1 << 20) 4k pages).
1069 * Max GPUVM size for cayman and SI is 40 bits. 1069 * Max GPUVM size for cayman and SI is 40 bits.
1070 */ 1070 */
1071 amdgpu_vm_adjust_size(adev, 64, 9); 1071 amdgpu_vm_adjust_size(adev, 64, 9, 1);
1072 1072
1073 /* Set the internal MC address mask 1073 /* Set the internal MC address mask
1074 * This is the max address of the GPU's 1074 * This is the max address of the GPU's
@@ -1123,7 +1123,6 @@ static int gmc_v8_0_sw_init(void *handle)
1123 * amdkfd will use VMIDs 8-15 1123 * amdkfd will use VMIDs 8-15
1124 */ 1124 */
1125 adev->vm_manager.id_mgr[0].num_ids = AMDGPU_NUM_OF_VMIDS; 1125 adev->vm_manager.id_mgr[0].num_ids = AMDGPU_NUM_OF_VMIDS;
1126 adev->vm_manager.num_level = 1;
1127 amdgpu_vm_manager_init(adev); 1126 amdgpu_vm_manager_init(adev);
1128 1127
1129 /* base offset of vram pages */ 1128 /* base offset of vram pages */
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index 30eb625a991c..729e4d591293 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -769,16 +769,11 @@ static int gmc_v9_0_sw_init(void *handle)
769 switch (adev->asic_type) { 769 switch (adev->asic_type) {
770 case CHIP_RAVEN: 770 case CHIP_RAVEN:
771 adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; 771 adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN;
772 if (adev->rev_id == 0x0 || adev->rev_id == 0x1) { 772 if (adev->rev_id == 0x0 || adev->rev_id == 0x1)
773 adev->vm_manager.max_pfn = 1ULL << 36; 773 amdgpu_vm_adjust_size(adev, 256 * 1024, 9, 3);
774 adev->vm_manager.block_size = 9; 774 else
775 adev->vm_manager.num_level = 3;
776 amdgpu_vm_set_fragment_size(adev, 9);
777 } else {
778 /* vm_size is 64GB for legacy 2-level page support */ 775 /* vm_size is 64GB for legacy 2-level page support */
779 amdgpu_vm_adjust_size(adev, 64, 9); 776 amdgpu_vm_adjust_size(adev, 64, 9, 1);
780 adev->vm_manager.num_level = 1;
781 }
782 break; 777 break;
783 case CHIP_VEGA10: 778 case CHIP_VEGA10:
784 /* XXX Don't know how to get VRAM type yet. */ 779 /* XXX Don't know how to get VRAM type yet. */
@@ -788,19 +783,12 @@ static int gmc_v9_0_sw_init(void *handle)
788 * vm size is 256TB (48bit), maximum size of Vega10, 783 * vm size is 256TB (48bit), maximum size of Vega10,
789 * block size 512 (9bit) 784 * block size 512 (9bit)
790 */ 785 */
791 adev->vm_manager.max_pfn = 1ULL << 36; 786 amdgpu_vm_adjust_size(adev, 256 * 1024, 9, 3);
792 adev->vm_manager.block_size = 9;
793 adev->vm_manager.num_level = 3;
794 amdgpu_vm_set_fragment_size(adev, 9);
795 break; 787 break;
796 default: 788 default:
797 break; 789 break;
798 } 790 }
799 791
800 DRM_INFO("vm size is %llu GB, block size is %u-bit, fragment size is %u-bit\n",
801 adev->vm_manager.max_pfn >> 18, adev->vm_manager.block_size,
802 adev->vm_manager.fragment_size);
803
804 /* This interrupt is VMC page fault.*/ 792 /* This interrupt is VMC page fault.*/
805 r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_VMC, 0, 793 r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_VMC, 0,
806 &adev->mc.vm_fault); 794 &adev->mc.vm_fault);