aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2012-03-20 17:18:20 -0400
committerDave Airlie <airlied@redhat.com>2012-03-21 02:55:54 -0400
commit2ece2e8b7d02040a59bc2f3a7f192c0521e2b867 (patch)
treef45b8e97947aa79037c6ce1b2a98ee0a60b7988e
parent48c0c902e2e6ca07b8c7ae1da48a7bb59eb88de9 (diff)
drm/radeon/kms: add IB and fence dispatch functions for SI
Support both IBs (DE) and CONST IBs (CE). Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/radeon/si.c78
-rw-r--r--drivers/gpu/drm/radeon/sid.h65
2 files changed, 143 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index a471a8090249..408119a810ce 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -1863,6 +1863,84 @@ static void si_gpu_init(struct radeon_device *rdev)
1863} 1863}
1864 1864
1865/* 1865/*
1866 * GPU scratch registers helpers function.
1867 */
1868static void si_scratch_init(struct radeon_device *rdev)
1869{
1870 int i;
1871
1872 rdev->scratch.num_reg = 7;
1873 rdev->scratch.reg_base = SCRATCH_REG0;
1874 for (i = 0; i < rdev->scratch.num_reg; i++) {
1875 rdev->scratch.free[i] = true;
1876 rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
1877 }
1878}
1879
1880void si_fence_ring_emit(struct radeon_device *rdev,
1881 struct radeon_fence *fence)
1882{
1883 struct radeon_ring *ring = &rdev->ring[fence->ring];
1884 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
1885
1886 /* flush read cache over gart */
1887 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1888 radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
1889 radeon_ring_write(ring, 0);
1890 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1891 radeon_ring_write(ring, PACKET3_TCL1_ACTION_ENA |
1892 PACKET3_TC_ACTION_ENA |
1893 PACKET3_SH_KCACHE_ACTION_ENA |
1894 PACKET3_SH_ICACHE_ACTION_ENA);
1895 radeon_ring_write(ring, 0xFFFFFFFF);
1896 radeon_ring_write(ring, 0);
1897 radeon_ring_write(ring, 10); /* poll interval */
1898 /* EVENT_WRITE_EOP - flush caches, send int */
1899 radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
1900 radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | EVENT_INDEX(5));
1901 radeon_ring_write(ring, addr & 0xffffffff);
1902 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
1903 radeon_ring_write(ring, fence->seq);
1904 radeon_ring_write(ring, 0);
1905}
1906
1907/*
1908 * IB stuff
1909 */
1910void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
1911{
1912 struct radeon_ring *ring = &rdev->ring[ib->fence->ring];
1913 u32 header;
1914
1915 if (ib->is_const_ib)
1916 header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
1917 else
1918 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
1919
1920 radeon_ring_write(ring, header);
1921 radeon_ring_write(ring,
1922#ifdef __BIG_ENDIAN
1923 (2 << 0) |
1924#endif
1925 (ib->gpu_addr & 0xFFFFFFFC));
1926 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
1927 radeon_ring_write(ring, ib->length_dw | (ib->vm_id << 24));
1928
1929 /* flush read cache over gart for this vmid */
1930 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1931 radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
1932 radeon_ring_write(ring, ib->vm_id);
1933 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1934 radeon_ring_write(ring, PACKET3_TCL1_ACTION_ENA |
1935 PACKET3_TC_ACTION_ENA |
1936 PACKET3_SH_KCACHE_ACTION_ENA |
1937 PACKET3_SH_ICACHE_ACTION_ENA);
1938 radeon_ring_write(ring, 0xFFFFFFFF);
1939 radeon_ring_write(ring, 0);
1940 radeon_ring_write(ring, 10); /* poll interval */
1941}
1942
1943/*
1866 * CP. 1944 * CP.
1867 */ 1945 */
1868static void si_cp_enable(struct radeon_device *rdev, bool enable) 1946static void si_cp_enable(struct radeon_device *rdev, bool enable)
diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h
index 7e08f0896ef6..904c4fd031f9 100644
--- a/drivers/gpu/drm/radeon/sid.h
+++ b/drivers/gpu/drm/radeon/sid.h
@@ -294,6 +294,8 @@
294#define CP_PFP_HALT (1 << 26) 294#define CP_PFP_HALT (1 << 26)
295#define CP_ME_HALT (1 << 28) 295#define CP_ME_HALT (1 << 28)
296 296
297#define CP_COHER_CNTL2 0x85E8
298
297#define CP_RB2_RPTR 0x86f8 299#define CP_RB2_RPTR 0x86f8
298#define CP_RB1_RPTR 0x86fc 300#define CP_RB1_RPTR 0x86fc
299#define CP_RB0_RPTR 0x8700 301#define CP_RB0_RPTR 0x8700
@@ -511,6 +513,45 @@
511 513
512#define CP_DEBUG 0xC1FC 514#define CP_DEBUG 0xC1FC
513 515
516#define VGT_EVENT_INITIATOR 0x28a90
517# define SAMPLE_STREAMOUTSTATS1 (1 << 0)
518# define SAMPLE_STREAMOUTSTATS2 (2 << 0)
519# define SAMPLE_STREAMOUTSTATS3 (3 << 0)
520# define CACHE_FLUSH_TS (4 << 0)
521# define CACHE_FLUSH (6 << 0)
522# define CS_PARTIAL_FLUSH (7 << 0)
523# define VGT_STREAMOUT_RESET (10 << 0)
524# define END_OF_PIPE_INCR_DE (11 << 0)
525# define END_OF_PIPE_IB_END (12 << 0)
526# define RST_PIX_CNT (13 << 0)
527# define VS_PARTIAL_FLUSH (15 << 0)
528# define PS_PARTIAL_FLUSH (16 << 0)
529# define CACHE_FLUSH_AND_INV_TS_EVENT (20 << 0)
530# define ZPASS_DONE (21 << 0)
531# define CACHE_FLUSH_AND_INV_EVENT (22 << 0)
532# define PERFCOUNTER_START (23 << 0)
533# define PERFCOUNTER_STOP (24 << 0)
534# define PIPELINESTAT_START (25 << 0)
535# define PIPELINESTAT_STOP (26 << 0)
536# define PERFCOUNTER_SAMPLE (27 << 0)
537# define SAMPLE_PIPELINESTAT (30 << 0)
538# define SAMPLE_STREAMOUTSTATS (32 << 0)
539# define RESET_VTX_CNT (33 << 0)
540# define VGT_FLUSH (36 << 0)
541# define BOTTOM_OF_PIPE_TS (40 << 0)
542# define DB_CACHE_FLUSH_AND_INV (42 << 0)
543# define FLUSH_AND_INV_DB_DATA_TS (43 << 0)
544# define FLUSH_AND_INV_DB_META (44 << 0)
545# define FLUSH_AND_INV_CB_DATA_TS (45 << 0)
546# define FLUSH_AND_INV_CB_META (46 << 0)
547# define CS_DONE (47 << 0)
548# define PS_DONE (48 << 0)
549# define FLUSH_AND_INV_CB_PIXEL_DATA (49 << 0)
550# define THREAD_TRACE_START (51 << 0)
551# define THREAD_TRACE_STOP (52 << 0)
552# define THREAD_TRACE_FLUSH (54 << 0)
553# define THREAD_TRACE_FINISH (55 << 0)
554
514/* 555/*
515 * PM4 556 * PM4
516 */ 557 */
@@ -606,7 +647,31 @@
606#define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16) 647#define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16)
607#define PACKET3_COND_WRITE 0x45 648#define PACKET3_COND_WRITE 0x45
608#define PACKET3_EVENT_WRITE 0x46 649#define PACKET3_EVENT_WRITE 0x46
650#define EVENT_TYPE(x) ((x) << 0)
651#define EVENT_INDEX(x) ((x) << 8)
652 /* 0 - any non-TS event
653 * 1 - ZPASS_DONE
654 * 2 - SAMPLE_PIPELINESTAT
655 * 3 - SAMPLE_STREAMOUTSTAT*
656 * 4 - *S_PARTIAL_FLUSH
657 * 5 - EOP events
658 * 6 - EOS events
659 * 7 - CACHE_FLUSH, CACHE_FLUSH_AND_INV_EVENT
660 */
661#define INV_L2 (1 << 20)
662 /* INV TC L2 cache when EVENT_INDEX = 7 */
609#define PACKET3_EVENT_WRITE_EOP 0x47 663#define PACKET3_EVENT_WRITE_EOP 0x47
664#define DATA_SEL(x) ((x) << 29)
665 /* 0 - discard
666 * 1 - send low 32bit data
667 * 2 - send 64bit data
668 * 3 - send 64bit counter value
669 */
670#define INT_SEL(x) ((x) << 24)
671 /* 0 - none
672 * 1 - interrupt only (DATA_SEL = 0)
673 * 2 - interrupt when data write is confirmed
674 */
610#define PACKET3_EVENT_WRITE_EOS 0x48 675#define PACKET3_EVENT_WRITE_EOS 0x48
611#define PACKET3_PREAMBLE_CNTL 0x4A 676#define PACKET3_PREAMBLE_CNTL 0x4A
612# define PACKET3_PREAMBLE_BEGIN_CLEAR_STATE (2 << 28) 677# define PACKET3_PREAMBLE_BEGIN_CLEAR_STATE (2 << 28)