aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorJack Xiao <Jack.Xiao@amd.com>2015-05-08 02:46:49 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-06-03 21:03:28 -0400
commit74a5d1656e165d5457be64b4d78d3259c2946e93 (patch)
tree968ada5f776dead7d0ec398443b84bcb2237f875 /drivers/gpu/drm/amd/amdgpu
parent0147ee0f5921af606ac0f822107b69b53dd29358 (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.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c5
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));