diff options
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 38 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen_blit_kms.c | 60 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen_blit_shaders.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreend.h | 2 |
4 files changed, 65 insertions, 54 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 17b2fe925ce0..f12a5b3ec050 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include "atom.h" | 32 | #include "atom.h" |
33 | #include "avivod.h" | 33 | #include "avivod.h" |
34 | #include "evergreen_reg.h" | 34 | #include "evergreen_reg.h" |
35 | #include "evergreen_blit_shaders.h" | ||
35 | 36 | ||
36 | #define EVERGREEN_PFP_UCODE_SIZE 1120 | 37 | #define EVERGREEN_PFP_UCODE_SIZE 1120 |
37 | #define EVERGREEN_PM4_UCODE_SIZE 1376 | 38 | #define EVERGREEN_PM4_UCODE_SIZE 1376 |
@@ -1112,7 +1113,7 @@ static int evergreen_cp_load_microcode(struct radeon_device *rdev) | |||
1112 | 1113 | ||
1113 | static int evergreen_cp_start(struct radeon_device *rdev) | 1114 | static int evergreen_cp_start(struct radeon_device *rdev) |
1114 | { | 1115 | { |
1115 | int r; | 1116 | int r, i; |
1116 | uint32_t cp_me; | 1117 | uint32_t cp_me; |
1117 | 1118 | ||
1118 | r = radeon_ring_lock(rdev, 7); | 1119 | r = radeon_ring_lock(rdev, 7); |
@@ -1132,16 +1133,39 @@ static int evergreen_cp_start(struct radeon_device *rdev) | |||
1132 | cp_me = 0xff; | 1133 | cp_me = 0xff; |
1133 | WREG32(CP_ME_CNTL, cp_me); | 1134 | WREG32(CP_ME_CNTL, cp_me); |
1134 | 1135 | ||
1135 | r = radeon_ring_lock(rdev, 4); | 1136 | r = radeon_ring_lock(rdev, evergreen_default_size + 15); |
1136 | if (r) { | 1137 | if (r) { |
1137 | DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); | 1138 | DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); |
1138 | return r; | 1139 | return r; |
1139 | } | 1140 | } |
1140 | /* init some VGT regs */ | 1141 | |
1141 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONTEXT_REG, 2)); | 1142 | /* setup clear context state */ |
1142 | radeon_ring_write(rdev, (VGT_VERTEX_REUSE_BLOCK_CNTL - PACKET3_SET_CONTEXT_REG_START) >> 2); | 1143 | radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); |
1143 | radeon_ring_write(rdev, 0xe); | 1144 | radeon_ring_write(rdev, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE); |
1144 | radeon_ring_write(rdev, 0x10); | 1145 | |
1146 | for (i = 0; i < evergreen_default_size; i++) | ||
1147 | radeon_ring_write(rdev, evergreen_default_state[i]); | ||
1148 | |||
1149 | radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); | ||
1150 | radeon_ring_write(rdev, PACKET3_PREAMBLE_END_CLEAR_STATE); | ||
1151 | |||
1152 | /* set clear context state */ | ||
1153 | radeon_ring_write(rdev, PACKET3(PACKET3_CLEAR_STATE, 0)); | ||
1154 | radeon_ring_write(rdev, 0); | ||
1155 | |||
1156 | /* SQ_VTX_BASE_VTX_LOC */ | ||
1157 | radeon_ring_write(rdev, 0xc0026f00); | ||
1158 | radeon_ring_write(rdev, 0x00000000); | ||
1159 | radeon_ring_write(rdev, 0x00000000); | ||
1160 | radeon_ring_write(rdev, 0x00000000); | ||
1161 | |||
1162 | /* Clear consts */ | ||
1163 | radeon_ring_write(rdev, 0xc0036f00); | ||
1164 | radeon_ring_write(rdev, 0x00000bc4); | ||
1165 | radeon_ring_write(rdev, 0xffffffff); | ||
1166 | radeon_ring_write(rdev, 0xffffffff); | ||
1167 | radeon_ring_write(rdev, 0xffffffff); | ||
1168 | |||
1145 | radeon_ring_unlock_commit(rdev); | 1169 | radeon_ring_unlock_commit(rdev); |
1146 | 1170 | ||
1147 | return 0; | 1171 | return 0; |
diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c b/drivers/gpu/drm/radeon/evergreen_blit_kms.c index a9825aa324b4..086b9b0416c4 100644 --- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c +++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c | |||
@@ -230,7 +230,7 @@ draw_auto(struct radeon_device *rdev) | |||
230 | 230 | ||
231 | } | 231 | } |
232 | 232 | ||
233 | /* emits 20 */ | 233 | /* emits 30 */ |
234 | static void | 234 | static void |
235 | set_default_state(struct radeon_device *rdev) | 235 | set_default_state(struct radeon_device *rdev) |
236 | { | 236 | { |
@@ -243,8 +243,6 @@ set_default_state(struct radeon_device *rdev) | |||
243 | int num_hs_threads, num_ls_threads; | 243 | int num_hs_threads, num_ls_threads; |
244 | int num_ps_stack_entries, num_vs_stack_entries, num_gs_stack_entries, num_es_stack_entries; | 244 | int num_ps_stack_entries, num_vs_stack_entries, num_gs_stack_entries, num_es_stack_entries; |
245 | int num_hs_stack_entries, num_ls_stack_entries; | 245 | int num_hs_stack_entries, num_ls_stack_entries; |
246 | u64 gpu_addr; | ||
247 | int dwords; | ||
248 | 246 | ||
249 | switch (rdev->family) { | 247 | switch (rdev->family) { |
250 | case CHIP_CEDAR: | 248 | case CHIP_CEDAR: |
@@ -369,13 +367,9 @@ set_default_state(struct radeon_device *rdev) | |||
369 | sq_stack_resource_mgmt_3 = (NUM_HS_STACK_ENTRIES(num_hs_stack_entries) | | 367 | sq_stack_resource_mgmt_3 = (NUM_HS_STACK_ENTRIES(num_hs_stack_entries) | |
370 | NUM_LS_STACK_ENTRIES(num_ls_stack_entries)); | 368 | NUM_LS_STACK_ENTRIES(num_ls_stack_entries)); |
371 | 369 | ||
372 | /* emit an IB pointing at default state */ | 370 | /* set clear context state */ |
373 | dwords = ALIGN(rdev->r600_blit.state_len, 0x10); | 371 | radeon_ring_write(rdev, PACKET3(PACKET3_CLEAR_STATE, 0)); |
374 | gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.state_offset; | 372 | radeon_ring_write(rdev, 0); |
375 | radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); | ||
376 | radeon_ring_write(rdev, gpu_addr & 0xFFFFFFFC); | ||
377 | radeon_ring_write(rdev, upper_32_bits(gpu_addr) & 0xFF); | ||
378 | radeon_ring_write(rdev, dwords); | ||
379 | 373 | ||
380 | /* disable dyn gprs */ | 374 | /* disable dyn gprs */ |
381 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1)); | 375 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1)); |
@@ -396,6 +390,25 @@ set_default_state(struct radeon_device *rdev) | |||
396 | radeon_ring_write(rdev, sq_stack_resource_mgmt_1); | 390 | radeon_ring_write(rdev, sq_stack_resource_mgmt_1); |
397 | radeon_ring_write(rdev, sq_stack_resource_mgmt_2); | 391 | radeon_ring_write(rdev, sq_stack_resource_mgmt_2); |
398 | radeon_ring_write(rdev, sq_stack_resource_mgmt_3); | 392 | radeon_ring_write(rdev, sq_stack_resource_mgmt_3); |
393 | |||
394 | /* CONTEXT_CONTROL */ | ||
395 | radeon_ring_write(rdev, 0xc0012800); | ||
396 | radeon_ring_write(rdev, 0x80000000); | ||
397 | radeon_ring_write(rdev, 0x80000000); | ||
398 | |||
399 | /* SQ_VTX_BASE_VTX_LOC */ | ||
400 | radeon_ring_write(rdev, 0xc0026f00); | ||
401 | radeon_ring_write(rdev, 0x00000000); | ||
402 | radeon_ring_write(rdev, 0x00000000); | ||
403 | radeon_ring_write(rdev, 0x00000000); | ||
404 | |||
405 | /* SET_SAMPLER */ | ||
406 | radeon_ring_write(rdev, 0xc0036e00); | ||
407 | radeon_ring_write(rdev, 0x00000000); | ||
408 | radeon_ring_write(rdev, 0x00000012); | ||
409 | radeon_ring_write(rdev, 0x00000000); | ||
410 | radeon_ring_write(rdev, 0x00000000); | ||
411 | |||
399 | } | 412 | } |
400 | 413 | ||
401 | static inline uint32_t i2f(uint32_t input) | 414 | static inline uint32_t i2f(uint32_t input) |
@@ -426,10 +439,8 @@ static inline uint32_t i2f(uint32_t input) | |||
426 | int evergreen_blit_init(struct radeon_device *rdev) | 439 | int evergreen_blit_init(struct radeon_device *rdev) |
427 | { | 440 | { |
428 | u32 obj_size; | 441 | u32 obj_size; |
429 | int r, dwords; | 442 | int r; |
430 | void *ptr; | 443 | void *ptr; |
431 | u32 packet2s[16]; | ||
432 | int num_packet2s = 0; | ||
433 | 444 | ||
434 | /* pin copy shader into vram if already initialized */ | 445 | /* pin copy shader into vram if already initialized */ |
435 | if (rdev->r600_blit.shader_obj) | 446 | if (rdev->r600_blit.shader_obj) |
@@ -437,17 +448,8 @@ int evergreen_blit_init(struct radeon_device *rdev) | |||
437 | 448 | ||
438 | mutex_init(&rdev->r600_blit.mutex); | 449 | mutex_init(&rdev->r600_blit.mutex); |
439 | rdev->r600_blit.state_offset = 0; | 450 | rdev->r600_blit.state_offset = 0; |
440 | 451 | rdev->r600_blit.state_len = 0; | |
441 | rdev->r600_blit.state_len = evergreen_default_size; | 452 | obj_size = 0; |
442 | |||
443 | dwords = rdev->r600_blit.state_len; | ||
444 | while (dwords & 0xf) { | ||
445 | packet2s[num_packet2s++] = PACKET2(0); | ||
446 | dwords++; | ||
447 | } | ||
448 | |||
449 | obj_size = dwords * 4; | ||
450 | obj_size = ALIGN(obj_size, 256); | ||
451 | 453 | ||
452 | rdev->r600_blit.vs_offset = obj_size; | 454 | rdev->r600_blit.vs_offset = obj_size; |
453 | obj_size += evergreen_vs_size * 4; | 455 | obj_size += evergreen_vs_size * 4; |
@@ -477,12 +479,6 @@ int evergreen_blit_init(struct radeon_device *rdev) | |||
477 | return r; | 479 | return r; |
478 | } | 480 | } |
479 | 481 | ||
480 | memcpy_toio(ptr + rdev->r600_blit.state_offset, | ||
481 | evergreen_default_state, rdev->r600_blit.state_len * 4); | ||
482 | |||
483 | if (num_packet2s) | ||
484 | memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4), | ||
485 | packet2s, num_packet2s * 4); | ||
486 | memcpy(ptr + rdev->r600_blit.vs_offset, evergreen_vs, evergreen_vs_size * 4); | 482 | memcpy(ptr + rdev->r600_blit.vs_offset, evergreen_vs, evergreen_vs_size * 4); |
487 | memcpy(ptr + rdev->r600_blit.ps_offset, evergreen_ps, evergreen_ps_size * 4); | 483 | memcpy(ptr + rdev->r600_blit.ps_offset, evergreen_ps, evergreen_ps_size * 4); |
488 | radeon_bo_kunmap(rdev->r600_blit.shader_obj); | 484 | radeon_bo_kunmap(rdev->r600_blit.shader_obj); |
@@ -566,7 +562,7 @@ int evergreen_blit_prepare_copy(struct radeon_device *rdev, int size_bytes) | |||
566 | /* calculate number of loops correctly */ | 562 | /* calculate number of loops correctly */ |
567 | ring_size = num_loops * dwords_per_loop; | 563 | ring_size = num_loops * dwords_per_loop; |
568 | /* set default + shaders */ | 564 | /* set default + shaders */ |
569 | ring_size += 36; /* shaders + def state */ | 565 | ring_size += 46; /* shaders + def state */ |
570 | ring_size += 10; /* fence emit for VB IB */ | 566 | ring_size += 10; /* fence emit for VB IB */ |
571 | ring_size += 5; /* done copy */ | 567 | ring_size += 5; /* done copy */ |
572 | ring_size += 10; /* fence emit for done copy */ | 568 | ring_size += 10; /* fence emit for done copy */ |
@@ -574,7 +570,7 @@ int evergreen_blit_prepare_copy(struct radeon_device *rdev, int size_bytes) | |||
574 | if (r) | 570 | if (r) |
575 | return r; | 571 | return r; |
576 | 572 | ||
577 | set_default_state(rdev); /* 20 */ | 573 | set_default_state(rdev); /* 30 */ |
578 | set_shaders(rdev); /* 16 */ | 574 | set_shaders(rdev); /* 16 */ |
579 | return 0; | 575 | return 0; |
580 | } | 576 | } |
diff --git a/drivers/gpu/drm/radeon/evergreen_blit_shaders.c b/drivers/gpu/drm/radeon/evergreen_blit_shaders.c index 5d5045027b46..ef1d28c07fbf 100644 --- a/drivers/gpu/drm/radeon/evergreen_blit_shaders.c +++ b/drivers/gpu/drm/radeon/evergreen_blit_shaders.c | |||
@@ -39,10 +39,6 @@ | |||
39 | 39 | ||
40 | const u32 evergreen_default_state[] = | 40 | const u32 evergreen_default_state[] = |
41 | { | 41 | { |
42 | 0xc0012800, /* CONTEXT_CONTROL */ | ||
43 | 0x80000000, | ||
44 | 0x80000000, | ||
45 | |||
46 | 0xc0016900, | 42 | 0xc0016900, |
47 | 0x0000023b, | 43 | 0x0000023b, |
48 | 0x00000000, /* SQ_LDS_ALLOC_PS */ | 44 | 0x00000000, /* SQ_LDS_ALLOC_PS */ |
@@ -63,17 +59,11 @@ const u32 evergreen_default_state[] = | |||
63 | 0x00000000, | 59 | 0x00000000, |
64 | 0x00000000, | 60 | 0x00000000, |
65 | 61 | ||
66 | 0xc0026f00, | ||
67 | 0x00000000, | ||
68 | 0x00000000, /* SQ_VTX_BASE_VTX_LOC */ | ||
69 | 0x00000000, | ||
70 | |||
71 | 0xc0026900, | 62 | 0xc0026900, |
72 | 0x00000010, | 63 | 0x00000010, |
73 | 0x00000000, /* DB_Z_INFO */ | 64 | 0x00000000, /* DB_Z_INFO */ |
74 | 0x00000000, /* DB_STENCIL_INFO */ | 65 | 0x00000000, /* DB_STENCIL_INFO */ |
75 | 66 | ||
76 | |||
77 | 0xc0016900, | 67 | 0xc0016900, |
78 | 0x00000200, | 68 | 0x00000200, |
79 | 0x00000000, /* DB_DEPTH_CONTROL */ | 69 | 0x00000000, /* DB_DEPTH_CONTROL */ |
@@ -303,11 +293,10 @@ const u32 evergreen_default_state[] = | |||
303 | 0x00000000, /* */ | 293 | 0x00000000, /* */ |
304 | 0x00000000, /* */ | 294 | 0x00000000, /* */ |
305 | 295 | ||
306 | 0xc0036e00, /* SET_SAMPLER */ | 296 | 0xc0026900, |
307 | 0x00000000, | 297 | 0x00000316, |
308 | 0x00000012, | 298 | 0x0000000e, /* VGT_VERTEX_REUSE_BLOCK_CNTL */ |
309 | 0x00000000, | 299 | 0x00000010, /* */ |
310 | 0x00000000, | ||
311 | }; | 300 | }; |
312 | 301 | ||
313 | const u32 evergreen_vs[] = | 302 | const u32 evergreen_vs[] = |
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index d507f438eed0..113c70cc8b39 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
@@ -658,6 +658,8 @@ | |||
658 | #define PACKET3_EVENT_WRITE_EOP 0x47 | 658 | #define PACKET3_EVENT_WRITE_EOP 0x47 |
659 | #define PACKET3_EVENT_WRITE_EOS 0x48 | 659 | #define PACKET3_EVENT_WRITE_EOS 0x48 |
660 | #define PACKET3_PREAMBLE_CNTL 0x4A | 660 | #define PACKET3_PREAMBLE_CNTL 0x4A |
661 | # define PACKET3_PREAMBLE_BEGIN_CLEAR_STATE (2 << 28) | ||
662 | # define PACKET3_PREAMBLE_END_CLEAR_STATE (3 << 28) | ||
661 | #define PACKET3_RB_OFFSET 0x4B | 663 | #define PACKET3_RB_OFFSET 0x4B |
662 | #define PACKET3_ALU_PS_CONST_BUFFER_COPY 0x4C | 664 | #define PACKET3_ALU_PS_CONST_BUFFER_COPY 0x4C |
663 | #define PACKET3_ALU_VS_CONST_BUFFER_COPY 0x4D | 665 | #define PACKET3_ALU_VS_CONST_BUFFER_COPY 0x4D |