diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 34 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 22 |
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 | */ | ||
2582 | void 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 | */ |
2597 | void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size, | 2582 | void 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); |
325 | void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, | 325 | void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, |
326 | struct amdgpu_bo_va *bo_va); | 326 | struct amdgpu_bo_va *bo_va); |
327 | void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev, | ||
328 | uint32_t fragment_size_default); | ||
329 | void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size, | 327 | void 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); |
331 | int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); | 329 | int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp); |
332 | bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *ring, | 330 | bool 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); |