diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 79 |
1 files changed, 29 insertions, 50 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 53f07439a512..cb4f68f53f24 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -868,7 +868,7 @@ static int gfx_v8_0_mec_init(struct amdgpu_device *adev) | |||
868 | r = amdgpu_bo_create(adev, | 868 | r = amdgpu_bo_create(adev, |
869 | adev->gfx.mec.num_mec *adev->gfx.mec.num_pipe * MEC_HPD_SIZE * 2, | 869 | adev->gfx.mec.num_mec *adev->gfx.mec.num_pipe * MEC_HPD_SIZE * 2, |
870 | PAGE_SIZE, true, | 870 | PAGE_SIZE, true, |
871 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, | 871 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, |
872 | &adev->gfx.mec.hpd_eop_obj); | 872 | &adev->gfx.mec.hpd_eop_obj); |
873 | if (r) { | 873 | if (r) { |
874 | dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r); | 874 | dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r); |
@@ -940,12 +940,6 @@ static int gfx_v8_0_sw_init(void *handle) | |||
940 | return r; | 940 | return r; |
941 | } | 941 | } |
942 | 942 | ||
943 | r = amdgpu_wb_get(adev, &adev->gfx.ce_sync_offs); | ||
944 | if (r) { | ||
945 | DRM_ERROR("(%d) gfx.ce_sync_offs wb alloc failed\n", r); | ||
946 | return r; | ||
947 | } | ||
948 | |||
949 | /* set up the gfx ring */ | 943 | /* set up the gfx ring */ |
950 | for (i = 0; i < adev->gfx.num_gfx_rings; i++) { | 944 | for (i = 0; i < adev->gfx.num_gfx_rings; i++) { |
951 | ring = &adev->gfx.gfx_ring[i]; | 945 | ring = &adev->gfx.gfx_ring[i]; |
@@ -995,21 +989,21 @@ static int gfx_v8_0_sw_init(void *handle) | |||
995 | /* reserve GDS, GWS and OA resource for gfx */ | 989 | /* reserve GDS, GWS and OA resource for gfx */ |
996 | r = amdgpu_bo_create(adev, adev->gds.mem.gfx_partition_size, | 990 | r = amdgpu_bo_create(adev, adev->gds.mem.gfx_partition_size, |
997 | PAGE_SIZE, true, | 991 | PAGE_SIZE, true, |
998 | AMDGPU_GEM_DOMAIN_GDS, 0, | 992 | AMDGPU_GEM_DOMAIN_GDS, 0, NULL, |
999 | NULL, &adev->gds.gds_gfx_bo); | 993 | NULL, &adev->gds.gds_gfx_bo); |
1000 | if (r) | 994 | if (r) |
1001 | return r; | 995 | return r; |
1002 | 996 | ||
1003 | r = amdgpu_bo_create(adev, adev->gds.gws.gfx_partition_size, | 997 | r = amdgpu_bo_create(adev, adev->gds.gws.gfx_partition_size, |
1004 | PAGE_SIZE, true, | 998 | PAGE_SIZE, true, |
1005 | AMDGPU_GEM_DOMAIN_GWS, 0, | 999 | AMDGPU_GEM_DOMAIN_GWS, 0, NULL, |
1006 | NULL, &adev->gds.gws_gfx_bo); | 1000 | NULL, &adev->gds.gws_gfx_bo); |
1007 | if (r) | 1001 | if (r) |
1008 | return r; | 1002 | return r; |
1009 | 1003 | ||
1010 | r = amdgpu_bo_create(adev, adev->gds.oa.gfx_partition_size, | 1004 | r = amdgpu_bo_create(adev, adev->gds.oa.gfx_partition_size, |
1011 | PAGE_SIZE, true, | 1005 | PAGE_SIZE, true, |
1012 | AMDGPU_GEM_DOMAIN_OA, 0, | 1006 | AMDGPU_GEM_DOMAIN_OA, 0, NULL, |
1013 | NULL, &adev->gds.oa_gfx_bo); | 1007 | NULL, &adev->gds.oa_gfx_bo); |
1014 | if (r) | 1008 | if (r) |
1015 | return r; | 1009 | return r; |
@@ -1033,8 +1027,6 @@ static int gfx_v8_0_sw_fini(void *handle) | |||
1033 | for (i = 0; i < adev->gfx.num_compute_rings; i++) | 1027 | for (i = 0; i < adev->gfx.num_compute_rings; i++) |
1034 | amdgpu_ring_fini(&adev->gfx.compute_ring[i]); | 1028 | amdgpu_ring_fini(&adev->gfx.compute_ring[i]); |
1035 | 1029 | ||
1036 | amdgpu_wb_free(adev, adev->gfx.ce_sync_offs); | ||
1037 | |||
1038 | gfx_v8_0_mec_fini(adev); | 1030 | gfx_v8_0_mec_fini(adev); |
1039 | 1031 | ||
1040 | return 0; | 1032 | return 0; |
@@ -3106,7 +3098,7 @@ static int gfx_v8_0_cp_compute_resume(struct amdgpu_device *adev) | |||
3106 | sizeof(struct vi_mqd), | 3098 | sizeof(struct vi_mqd), |
3107 | PAGE_SIZE, true, | 3099 | PAGE_SIZE, true, |
3108 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, | 3100 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, |
3109 | &ring->mqd_obj); | 3101 | NULL, &ring->mqd_obj); |
3110 | if (r) { | 3102 | if (r) { |
3111 | dev_warn(adev->dev, "(%d) create MQD bo failed\n", r); | 3103 | dev_warn(adev->dev, "(%d) create MQD bo failed\n", r); |
3112 | return r; | 3104 | return r; |
@@ -3965,6 +3957,7 @@ static void gfx_v8_0_ring_emit_fence_gfx(struct amdgpu_ring *ring, u64 addr, | |||
3965 | DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0)); | 3957 | DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0)); |
3966 | amdgpu_ring_write(ring, lower_32_bits(seq)); | 3958 | amdgpu_ring_write(ring, lower_32_bits(seq)); |
3967 | amdgpu_ring_write(ring, upper_32_bits(seq)); | 3959 | amdgpu_ring_write(ring, upper_32_bits(seq)); |
3960 | |||
3968 | } | 3961 | } |
3969 | 3962 | ||
3970 | /** | 3963 | /** |
@@ -4005,49 +3998,34 @@ static bool gfx_v8_0_ring_emit_semaphore(struct amdgpu_ring *ring, | |||
4005 | return true; | 3998 | return true; |
4006 | } | 3999 | } |
4007 | 4000 | ||
4008 | static void gfx_v8_0_ce_sync_me(struct amdgpu_ring *ring) | 4001 | static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring, |
4002 | unsigned vm_id, uint64_t pd_addr) | ||
4009 | { | 4003 | { |
4010 | struct amdgpu_device *adev = ring->adev; | 4004 | int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); |
4011 | u64 gpu_addr = adev->wb.gpu_addr + adev->gfx.ce_sync_offs * 4; | 4005 | uint32_t seq = ring->fence_drv.sync_seq[ring->idx]; |
4012 | 4006 | uint64_t addr = ring->fence_drv.gpu_addr; | |
4013 | /* instruct DE to set a magic number */ | ||
4014 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | ||
4015 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | | ||
4016 | WRITE_DATA_DST_SEL(5))); | ||
4017 | amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); | ||
4018 | amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); | ||
4019 | amdgpu_ring_write(ring, 1); | ||
4020 | 4007 | ||
4021 | /* let CE wait till condition satisfied */ | ||
4022 | amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); | 4008 | amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); |
4023 | amdgpu_ring_write(ring, (WAIT_REG_MEM_OPERATION(0) | /* wait */ | 4009 | amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ |
4024 | WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ | 4010 | WAIT_REG_MEM_FUNCTION(3))); /* equal */ |
4025 | WAIT_REG_MEM_FUNCTION(3) | /* == */ | 4011 | amdgpu_ring_write(ring, addr & 0xfffffffc); |
4026 | WAIT_REG_MEM_ENGINE(2))); /* ce */ | 4012 | amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff); |
4027 | amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); | 4013 | amdgpu_ring_write(ring, seq); |
4028 | amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); | ||
4029 | amdgpu_ring_write(ring, 1); | ||
4030 | amdgpu_ring_write(ring, 0xffffffff); | 4014 | amdgpu_ring_write(ring, 0xffffffff); |
4031 | amdgpu_ring_write(ring, 4); /* poll interval */ | 4015 | amdgpu_ring_write(ring, 4); /* poll interval */ |
4032 | 4016 | ||
4033 | /* instruct CE to reset wb of ce_sync to zero */ | 4017 | if (usepfp) { |
4034 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | 4018 | /* synce CE with ME to prevent CE fetch CEIB before context switch done */ |
4035 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(2) | | 4019 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
4036 | WRITE_DATA_DST_SEL(5) | | 4020 | amdgpu_ring_write(ring, 0); |
4037 | WR_CONFIRM)); | 4021 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
4038 | amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); | 4022 | amdgpu_ring_write(ring, 0); |
4039 | amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); | 4023 | } |
4040 | amdgpu_ring_write(ring, 0); | ||
4041 | } | ||
4042 | |||
4043 | static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | ||
4044 | unsigned vm_id, uint64_t pd_addr) | ||
4045 | { | ||
4046 | int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); | ||
4047 | 4024 | ||
4048 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | 4025 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); |
4049 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | | 4026 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | |
4050 | WRITE_DATA_DST_SEL(0))); | 4027 | WRITE_DATA_DST_SEL(0)) | |
4028 | WR_CONFIRM); | ||
4051 | if (vm_id < 8) { | 4029 | if (vm_id < 8) { |
4052 | amdgpu_ring_write(ring, | 4030 | amdgpu_ring_write(ring, |
4053 | (mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR + vm_id)); | 4031 | (mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR + vm_id)); |
@@ -4083,9 +4061,10 @@ static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
4083 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ | 4061 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ |
4084 | amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); | 4062 | amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); |
4085 | amdgpu_ring_write(ring, 0x0); | 4063 | amdgpu_ring_write(ring, 0x0); |
4086 | 4064 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); | |
4087 | /* synce CE with ME to prevent CE fetch CEIB before context switch done */ | 4065 | amdgpu_ring_write(ring, 0); |
4088 | gfx_v8_0_ce_sync_me(ring); | 4066 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
4067 | amdgpu_ring_write(ring, 0); | ||
4089 | } | 4068 | } |
4090 | } | 4069 | } |
4091 | 4070 | ||