aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/radeon/ni.c92
-rw-r--r--drivers/gpu/drm/radeon/nid.h57
2 files changed, 149 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index eaefb5b066db..417d9c24fcdb 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -931,3 +931,95 @@ static void cayman_gpu_init(struct radeon_device *rdev)
931 udelay(50); 931 udelay(50);
932} 932}
933 933
934/*
935 * GART
936 */
937void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
938{
939 /* flush hdp cache */
940 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
941
942 /* bits 0-7 are the VM contexts0-7 */
943 WREG32(VM_INVALIDATE_REQUEST, 1);
944}
945
946int cayman_pcie_gart_enable(struct radeon_device *rdev)
947{
948 int r;
949
950 if (rdev->gart.table.vram.robj == NULL) {
951 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
952 return -EINVAL;
953 }
954 r = radeon_gart_table_vram_pin(rdev);
955 if (r)
956 return r;
957 radeon_gart_restore(rdev);
958 /* Setup TLB control */
959 WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_TLB |
960 ENABLE_L1_FRAGMENT_PROCESSING |
961 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
962 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
963 /* Setup L2 cache */
964 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
965 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
966 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
967 EFFECTIVE_L2_QUEUE_SIZE(7) |
968 CONTEXT1_IDENTITY_ACCESS_MODE(1));
969 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
970 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
971 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
972 /* setup context0 */
973 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
974 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
975 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
976 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
977 (u32)(rdev->dummy_page.addr >> 12));
978 WREG32(VM_CONTEXT0_CNTL2, 0);
979 WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
980 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
981 /* disable context1-7 */
982 WREG32(VM_CONTEXT1_CNTL2, 0);
983 WREG32(VM_CONTEXT1_CNTL, 0);
984
985 cayman_pcie_gart_tlb_flush(rdev);
986 rdev->gart.ready = true;
987 return 0;
988}
989
990void cayman_pcie_gart_disable(struct radeon_device *rdev)
991{
992 int r;
993
994 /* Disable all tables */
995 WREG32(VM_CONTEXT0_CNTL, 0);
996 WREG32(VM_CONTEXT1_CNTL, 0);
997 /* Setup TLB control */
998 WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
999 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1000 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1001 /* Setup L2 cache */
1002 WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1003 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1004 EFFECTIVE_L2_QUEUE_SIZE(7) |
1005 CONTEXT1_IDENTITY_ACCESS_MODE(1));
1006 WREG32(VM_L2_CNTL2, 0);
1007 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1008 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1009 if (rdev->gart.table.vram.robj) {
1010 r = radeon_bo_reserve(rdev->gart.table.vram.robj, false);
1011 if (likely(r == 0)) {
1012 radeon_bo_kunmap(rdev->gart.table.vram.robj);
1013 radeon_bo_unpin(rdev->gart.table.vram.robj);
1014 radeon_bo_unreserve(rdev->gart.table.vram.robj);
1015 }
1016 }
1017}
1018
1019void cayman_pcie_gart_fini(struct radeon_device *rdev)
1020{
1021 cayman_pcie_gart_disable(rdev);
1022 radeon_gart_table_vram_free(rdev);
1023 radeon_gart_fini(rdev);
1024}
1025
diff --git a/drivers/gpu/drm/radeon/nid.h b/drivers/gpu/drm/radeon/nid.h
index b4ba1b013ccb..9dc2b3429c3f 100644
--- a/drivers/gpu/drm/radeon/nid.h
+++ b/drivers/gpu/drm/radeon/nid.h
@@ -43,10 +43,66 @@
43 43
44#define DMIF_ADDR_CONFIG 0xBD4 44#define DMIF_ADDR_CONFIG 0xBD4
45 45
46#define VM_CONTEXT0_REQUEST_RESPONSE 0x1470
47#define REQUEST_TYPE(x) (((x) & 0xf) << 0)
48#define RESPONSE_TYPE_MASK 0x000000F0
49#define RESPONSE_TYPE_SHIFT 4
50#define VM_L2_CNTL 0x1400
51#define ENABLE_L2_CACHE (1 << 0)
52#define ENABLE_L2_FRAGMENT_PROCESSING (1 << 1)
53#define ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE (1 << 9)
54#define ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE (1 << 10)
55#define EFFECTIVE_L2_QUEUE_SIZE(x) (((x) & 7) << 14)
56#define CONTEXT1_IDENTITY_ACCESS_MODE(x) (((x) & 3) << 18)
57/* CONTEXT1_IDENTITY_ACCESS_MODE
58 * 0 physical = logical
59 * 1 logical via context1 page table
60 * 2 inside identity aperture use translation, outside physical = logical
61 * 3 inside identity aperture physical = logical, outside use translation
62 */
63#define VM_L2_CNTL2 0x1404
64#define INVALIDATE_ALL_L1_TLBS (1 << 0)
65#define INVALIDATE_L2_CACHE (1 << 1)
66#define VM_L2_CNTL3 0x1408
67#define BANK_SELECT(x) ((x) << 0)
68#define CACHE_UPDATE_MODE(x) ((x) << 6)
69#define L2_CACHE_BIGK_ASSOCIATIVITY (1 << 20)
70#define L2_CACHE_BIGK_FRAGMENT_SIZE(x) ((x) << 15)
71#define VM_L2_STATUS 0x140C
72#define L2_BUSY (1 << 0)
73#define VM_CONTEXT0_CNTL 0x1410
74#define ENABLE_CONTEXT (1 << 0)
75#define PAGE_TABLE_DEPTH(x) (((x) & 3) << 1)
76#define RANGE_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 4)
77#define VM_CONTEXT1_CNTL 0x1414
78#define VM_CONTEXT0_CNTL2 0x1430
79#define VM_CONTEXT1_CNTL2 0x1434
80#define VM_INVALIDATE_REQUEST 0x1478
81#define VM_INVALIDATE_RESPONSE 0x147c
82#define VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR 0x1518
83#define VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR 0x151c
84#define VM_CONTEXT0_PAGE_TABLE_BASE_ADDR 0x153C
85#define VM_CONTEXT0_PAGE_TABLE_START_ADDR 0x155C
86#define VM_CONTEXT0_PAGE_TABLE_END_ADDR 0x157C
87
46#define MC_SHARED_CHMAP 0x2004 88#define MC_SHARED_CHMAP 0x2004
47#define NOOFCHAN_SHIFT 12 89#define NOOFCHAN_SHIFT 12
48#define NOOFCHAN_MASK 0x00003000 90#define NOOFCHAN_MASK 0x00003000
49#define MC_SHARED_CHREMAP 0x2008 91#define MC_SHARED_CHREMAP 0x2008
92
93#define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034
94#define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038
95#define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C
96#define MC_VM_MX_L1_TLB_CNTL 0x2064
97#define ENABLE_L1_TLB (1 << 0)
98#define ENABLE_L1_FRAGMENT_PROCESSING (1 << 1)
99#define SYSTEM_ACCESS_MODE_PA_ONLY (0 << 3)
100#define SYSTEM_ACCESS_MODE_USE_SYS_MAP (1 << 3)
101#define SYSTEM_ACCESS_MODE_IN_SYS (2 << 3)
102#define SYSTEM_ACCESS_MODE_NOT_IN_SYS (3 << 3)
103#define SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU (0 << 5)
104#define ENABLE_ADVANCED_DRIVER_MODEL (1 << 6)
105
50#define MC_SHARED_BLACKOUT_CNTL 0x20ac 106#define MC_SHARED_BLACKOUT_CNTL 0x20ac
51#define MC_ARB_RAMCFG 0x2760 107#define MC_ARB_RAMCFG 0x2760
52#define NOOFBANK_SHIFT 0 108#define NOOFBANK_SHIFT 0
@@ -87,6 +143,7 @@
87 143
88#define CONFIG_MEMSIZE 0x5428 144#define CONFIG_MEMSIZE 0x5428
89 145
146#define HDP_MEM_COHERENCY_FLUSH_CNTL 0x5480
90#define HDP_REG_COHERENCY_FLUSH_CNTL 0x54A0 147#define HDP_REG_COHERENCY_FLUSH_CNTL 0x54A0
91 148
92#define GRBM_CNTL 0x8000 149#define GRBM_CNTL 0x8000