diff options
author | Jack Xiao <Jack.Xiao@amd.com> | 2015-05-08 02:46:49 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-06-03 21:03:28 -0400 |
commit | 74a5d1656e165d5457be64b4d78d3259c2946e93 (patch) | |
tree | 968ada5f776dead7d0ec398443b84bcb2237f875 /drivers/gpu/drm/amd/amdgpu | |
parent | 0147ee0f5921af606ac0f822107b69b53dd29358 (diff) |
drm/amdgpu: allow unaligned memory access (v2)
Set up the CP and SDMA for proper unaligned memory access.
Required for OpenCL 2.x
v2: udpate commit message
Signed-off-by: Jack Xiao <Jack.Xiao@amd.com>
Reviewed-by: Monk Liu <monk.liu@amd.com>
Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 5 |
5 files changed, 22 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index ae2bb26fa46e..037e3db69547 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c | |||
@@ -33,6 +33,8 @@ | |||
33 | #include "bif/bif_4_1_sh_mask.h" | 33 | #include "bif/bif_4_1_sh_mask.h" |
34 | 34 | ||
35 | #include "gca/gfx_7_2_d.h" | 35 | #include "gca/gfx_7_2_d.h" |
36 | #include "gca/gfx_7_2_enum.h" | ||
37 | #include "gca/gfx_7_2_sh_mask.h" | ||
36 | 38 | ||
37 | #include "gmc/gmc_7_1_d.h" | 39 | #include "gmc/gmc_7_1_d.h" |
38 | #include "gmc/gmc_7_1_sh_mask.h" | 40 | #include "gmc/gmc_7_1_sh_mask.h" |
@@ -837,6 +839,8 @@ static void cik_sdma_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
837 | { | 839 | { |
838 | u32 extra_bits = (SDMA_POLL_REG_MEM_EXTRA_OP(0) | | 840 | u32 extra_bits = (SDMA_POLL_REG_MEM_EXTRA_OP(0) | |
839 | SDMA_POLL_REG_MEM_EXTRA_FUNC(0)); /* always */ | 841 | SDMA_POLL_REG_MEM_EXTRA_FUNC(0)); /* always */ |
842 | u32 sh_mem_cfg = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE, | ||
843 | SH_MEM_ALIGNMENT_MODE_UNALIGNED); | ||
840 | 844 | ||
841 | amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); | 845 | amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); |
842 | if (vm_id < 8) { | 846 | if (vm_id < 8) { |
@@ -857,7 +861,7 @@ static void cik_sdma_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
857 | 861 | ||
858 | amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); | 862 | amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); |
859 | amdgpu_ring_write(ring, mmSH_MEM_CONFIG); | 863 | amdgpu_ring_write(ring, mmSH_MEM_CONFIG); |
860 | amdgpu_ring_write(ring, 0); | 864 | amdgpu_ring_write(ring, sh_mem_cfg); |
861 | 865 | ||
862 | amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); | 866 | amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); |
863 | amdgpu_ring_write(ring, mmSH_MEM_APE1_BASE); | 867 | amdgpu_ring_write(ring, mmSH_MEM_APE1_BASE); |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 675b096417f4..26df23eaf09e 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | |||
@@ -2022,6 +2022,7 @@ static void gfx_v7_0_gpu_init(struct amdgpu_device *adev) | |||
2022 | u32 gb_addr_config; | 2022 | u32 gb_addr_config; |
2023 | u32 mc_shared_chmap, mc_arb_ramcfg; | 2023 | u32 mc_shared_chmap, mc_arb_ramcfg; |
2024 | u32 dimm00_addr_map, dimm01_addr_map, dimm10_addr_map, dimm11_addr_map; | 2024 | u32 dimm00_addr_map, dimm01_addr_map, dimm10_addr_map, dimm11_addr_map; |
2025 | u32 sh_mem_cfg; | ||
2025 | u32 tmp; | 2026 | u32 tmp; |
2026 | int i; | 2027 | int i; |
2027 | 2028 | ||
@@ -2214,11 +2215,14 @@ static void gfx_v7_0_gpu_init(struct amdgpu_device *adev) | |||
2214 | 2215 | ||
2215 | /* XXX SH_MEM regs */ | 2216 | /* XXX SH_MEM regs */ |
2216 | /* where to put LDS, scratch, GPUVM in FSA64 space */ | 2217 | /* where to put LDS, scratch, GPUVM in FSA64 space */ |
2218 | sh_mem_cfg = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE, | ||
2219 | SH_MEM_ALIGNMENT_MODE_UNALIGNED); | ||
2220 | |||
2217 | mutex_lock(&adev->srbm_mutex); | 2221 | mutex_lock(&adev->srbm_mutex); |
2218 | for (i = 0; i < 16; i++) { | 2222 | for (i = 0; i < 16; i++) { |
2219 | cik_srbm_select(adev, 0, 0, 0, i); | 2223 | cik_srbm_select(adev, 0, 0, 0, i); |
2220 | /* CP and shaders */ | 2224 | /* CP and shaders */ |
2221 | WREG32(mmSH_MEM_CONFIG, 0); | 2225 | WREG32(mmSH_MEM_CONFIG, sh_mem_cfg); |
2222 | WREG32(mmSH_MEM_APE1_BASE, 1); | 2226 | WREG32(mmSH_MEM_APE1_BASE, 1); |
2223 | WREG32(mmSH_MEM_APE1_LIMIT, 0); | 2227 | WREG32(mmSH_MEM_APE1_LIMIT, 0); |
2224 | WREG32(mmSH_MEM_BASES, 0); | 2228 | WREG32(mmSH_MEM_BASES, 0); |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index a8397dd2bce4..3762998df351 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -2050,10 +2050,14 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) | |||
2050 | if (i == 0) { | 2050 | if (i == 0) { |
2051 | tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, DEFAULT_MTYPE, MTYPE_UC); | 2051 | tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, DEFAULT_MTYPE, MTYPE_UC); |
2052 | tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, APE1_MTYPE, MTYPE_UC); | 2052 | tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, APE1_MTYPE, MTYPE_UC); |
2053 | tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, ALIGNMENT_MODE, | ||
2054 | SH_MEM_ALIGNMENT_MODE_UNALIGNED); | ||
2053 | WREG32(mmSH_MEM_CONFIG, tmp); | 2055 | WREG32(mmSH_MEM_CONFIG, tmp); |
2054 | } else { | 2056 | } else { |
2055 | tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, DEFAULT_MTYPE, MTYPE_NC); | 2057 | tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, DEFAULT_MTYPE, MTYPE_NC); |
2056 | tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, APE1_MTYPE, MTYPE_NC); | 2058 | tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, APE1_MTYPE, MTYPE_NC); |
2059 | tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, ALIGNMENT_MODE, | ||
2060 | SH_MEM_ALIGNMENT_MODE_UNALIGNED); | ||
2057 | WREG32(mmSH_MEM_CONFIG, tmp); | 2061 | WREG32(mmSH_MEM_CONFIG, tmp); |
2058 | } | 2062 | } |
2059 | 2063 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c index a83029d548c1..389509aeddf8 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include "gmc/gmc_8_1_sh_mask.h" | 36 | #include "gmc/gmc_8_1_sh_mask.h" |
37 | 37 | ||
38 | #include "gca/gfx_8_0_d.h" | 38 | #include "gca/gfx_8_0_d.h" |
39 | #include "gca/gfx_8_0_enum.h" | ||
39 | #include "gca/gfx_8_0_sh_mask.h" | 40 | #include "gca/gfx_8_0_sh_mask.h" |
40 | 41 | ||
41 | #include "bif/bif_5_0_d.h" | 42 | #include "bif/bif_5_0_d.h" |
@@ -900,6 +901,8 @@ static void sdma_v2_4_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
900 | unsigned vm_id, uint64_t pd_addr) | 901 | unsigned vm_id, uint64_t pd_addr) |
901 | { | 902 | { |
902 | u32 srbm_gfx_cntl = 0; | 903 | u32 srbm_gfx_cntl = 0; |
904 | u32 sh_mem_cfg = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE, | ||
905 | SH_MEM_ALIGNMENT_MODE_UNALIGNED); | ||
903 | 906 | ||
904 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | | 907 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | |
905 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); | 908 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); |
@@ -925,7 +928,7 @@ static void sdma_v2_4_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
925 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | | 928 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | |
926 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); | 929 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); |
927 | amdgpu_ring_write(ring, mmSH_MEM_CONFIG); | 930 | amdgpu_ring_write(ring, mmSH_MEM_CONFIG); |
928 | amdgpu_ring_write(ring, 0); | 931 | amdgpu_ring_write(ring, sh_mem_cfg); |
929 | 932 | ||
930 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | | 933 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | |
931 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); | 934 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); |
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c index dd547c7f6cbc..d3eda315e719 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include "gmc/gmc_8_1_sh_mask.h" | 36 | #include "gmc/gmc_8_1_sh_mask.h" |
37 | 37 | ||
38 | #include "gca/gfx_8_0_d.h" | 38 | #include "gca/gfx_8_0_d.h" |
39 | #include "gca/gfx_8_0_enum.h" | ||
39 | #include "gca/gfx_8_0_sh_mask.h" | 40 | #include "gca/gfx_8_0_sh_mask.h" |
40 | 41 | ||
41 | #include "bif/bif_5_0_d.h" | 42 | #include "bif/bif_5_0_d.h" |
@@ -963,6 +964,8 @@ static void sdma_v3_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
963 | unsigned vm_id, uint64_t pd_addr) | 964 | unsigned vm_id, uint64_t pd_addr) |
964 | { | 965 | { |
965 | u32 srbm_gfx_cntl = 0; | 966 | u32 srbm_gfx_cntl = 0; |
967 | u32 sh_mem_cfg = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE, | ||
968 | SH_MEM_ALIGNMENT_MODE_UNALIGNED); | ||
966 | 969 | ||
967 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | | 970 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | |
968 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); | 971 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); |
@@ -988,7 +991,7 @@ static void sdma_v3_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
988 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | | 991 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | |
989 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); | 992 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); |
990 | amdgpu_ring_write(ring, mmSH_MEM_CONFIG); | 993 | amdgpu_ring_write(ring, mmSH_MEM_CONFIG); |
991 | amdgpu_ring_write(ring, 0); | 994 | amdgpu_ring_write(ring, sh_mem_cfg); |
992 | 995 | ||
993 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | | 996 | amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) | |
994 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); | 997 | SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf)); |