diff options
author | Jerome Glisse <jglisse@redhat.com> | 2009-09-14 12:29:49 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2009-09-14 18:53:14 -0400 |
commit | 4aac047323e3082d0866b8ad3784236632105af4 (patch) | |
tree | af4c118e42b9ea55c961c4f5bbb02998dc2cc4fe /drivers | |
parent | 21f9a437222e92adb3abc68584a5f04801b92739 (diff) |
drm/radeon/kms: clear confusion in GART init/deinit path
GART static one time initialization was mixed up with GART
enabling/disabling which could happen several time for instance
during suspend/resume cycles. This patch splits all GART
handling into 4 differents function. gart_init is for one
time initialization, gart_deinit is called upon module unload
to free resources allocated by gart_init, gart_enable enable
the GART and is intented to be call after first initialization
and at each resume cycle or reset cycle. Finaly gart_disable
stop the GART and is intended to be call at suspend time or
when unloading the module.
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 40 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r300.c | 108 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r420.c | 57 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r520.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 53 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 38 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 36 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_gart.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/rs400.c | 53 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/rs600.c | 41 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/rs690.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/rv515.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 37 |
14 files changed, 306 insertions, 190 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 47263d3ede98..fa0fdc1e3457 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -84,23 +84,28 @@ void r100_pci_gart_tlb_flush(struct radeon_device *rdev) | |||
84 | * could end up in wrong address. */ | 84 | * could end up in wrong address. */ |
85 | } | 85 | } |
86 | 86 | ||
87 | int r100_pci_gart_enable(struct radeon_device *rdev) | 87 | int r100_pci_gart_init(struct radeon_device *rdev) |
88 | { | 88 | { |
89 | uint32_t tmp; | ||
90 | int r; | 89 | int r; |
91 | 90 | ||
91 | if (rdev->gart.table.ram.ptr) { | ||
92 | WARN(1, "R100 PCI GART already initialized.\n"); | ||
93 | return 0; | ||
94 | } | ||
92 | /* Initialize common gart structure */ | 95 | /* Initialize common gart structure */ |
93 | r = radeon_gart_init(rdev); | 96 | r = radeon_gart_init(rdev); |
94 | if (r) { | 97 | if (r) |
95 | return r; | 98 | return r; |
96 | } | 99 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; |
97 | if (rdev->gart.table.ram.ptr == NULL) { | 100 | rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush; |
98 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; | 101 | rdev->asic->gart_set_page = &r100_pci_gart_set_page; |
99 | r = radeon_gart_table_ram_alloc(rdev); | 102 | return radeon_gart_table_ram_alloc(rdev); |
100 | if (r) { | 103 | } |
101 | return r; | 104 | |
102 | } | 105 | int r100_pci_gart_enable(struct radeon_device *rdev) |
103 | } | 106 | { |
107 | uint32_t tmp; | ||
108 | |||
104 | /* discard memory request outside of configured range */ | 109 | /* discard memory request outside of configured range */ |
105 | tmp = RREG32(RADEON_AIC_CNTL) | RADEON_DIS_OUT_OF_PCI_GART_ACCESS; | 110 | tmp = RREG32(RADEON_AIC_CNTL) | RADEON_DIS_OUT_OF_PCI_GART_ACCESS; |
106 | WREG32(RADEON_AIC_CNTL, tmp); | 111 | WREG32(RADEON_AIC_CNTL, tmp); |
@@ -140,13 +145,11 @@ int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
140 | return 0; | 145 | return 0; |
141 | } | 146 | } |
142 | 147 | ||
143 | int r100_gart_enable(struct radeon_device *rdev) | 148 | void r100_pci_gart_fini(struct radeon_device *rdev) |
144 | { | 149 | { |
145 | if (rdev->flags & RADEON_IS_AGP) { | 150 | r100_pci_gart_disable(rdev); |
146 | r100_pci_gart_disable(rdev); | 151 | radeon_gart_table_ram_free(rdev); |
147 | return 0; | 152 | radeon_gart_fini(rdev); |
148 | } | ||
149 | return r100_pci_gart_enable(rdev); | ||
150 | } | 153 | } |
151 | 154 | ||
152 | 155 | ||
@@ -273,9 +276,6 @@ int r100_mc_init(struct radeon_device *rdev) | |||
273 | 276 | ||
274 | void r100_mc_fini(struct radeon_device *rdev) | 277 | void r100_mc_fini(struct radeon_device *rdev) |
275 | { | 278 | { |
276 | r100_pci_gart_disable(rdev); | ||
277 | radeon_gart_table_ram_free(rdev); | ||
278 | radeon_gart_fini(rdev); | ||
279 | } | 279 | } |
280 | 280 | ||
281 | 281 | ||
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index ced3322bd5fb..bb151ecdf8fc 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
@@ -42,7 +42,6 @@ int r100_cp_reset(struct radeon_device *rdev); | |||
42 | int r100_rb2d_reset(struct radeon_device *rdev); | 42 | int r100_rb2d_reset(struct radeon_device *rdev); |
43 | int r100_cp_init(struct radeon_device *rdev, unsigned ring_size); | 43 | int r100_cp_init(struct radeon_device *rdev, unsigned ring_size); |
44 | int r100_pci_gart_enable(struct radeon_device *rdev); | 44 | int r100_pci_gart_enable(struct radeon_device *rdev); |
45 | void r100_pci_gart_disable(struct radeon_device *rdev); | ||
46 | void r100_mc_setup(struct radeon_device *rdev); | 45 | void r100_mc_setup(struct radeon_device *rdev); |
47 | void r100_mc_disable_clients(struct radeon_device *rdev); | 46 | void r100_mc_disable_clients(struct radeon_device *rdev); |
48 | int r100_gui_wait_for_idle(struct radeon_device *rdev); | 47 | int r100_gui_wait_for_idle(struct radeon_device *rdev); |
@@ -86,26 +85,57 @@ void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev) | |||
86 | mb(); | 85 | mb(); |
87 | } | 86 | } |
88 | 87 | ||
89 | int rv370_pcie_gart_enable(struct radeon_device *rdev) | 88 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) |
89 | { | ||
90 | void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; | ||
91 | |||
92 | if (i < 0 || i > rdev->gart.num_gpu_pages) { | ||
93 | return -EINVAL; | ||
94 | } | ||
95 | addr = (lower_32_bits(addr) >> 8) | | ||
96 | ((upper_32_bits(addr) & 0xff) << 24) | | ||
97 | 0xc; | ||
98 | /* on x86 we want this to be CPU endian, on powerpc | ||
99 | * on powerpc without HW swappers, it'll get swapped on way | ||
100 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ | ||
101 | writel(addr, ((void __iomem *)ptr) + (i * 4)); | ||
102 | return 0; | ||
103 | } | ||
104 | |||
105 | int rv370_pcie_gart_init(struct radeon_device *rdev) | ||
90 | { | 106 | { |
91 | uint32_t table_addr; | ||
92 | uint32_t tmp; | ||
93 | int r; | 107 | int r; |
94 | 108 | ||
109 | if (rdev->gart.table.vram.robj) { | ||
110 | WARN(1, "RV370 PCIE GART already initialized.\n"); | ||
111 | return 0; | ||
112 | } | ||
95 | /* Initialize common gart structure */ | 113 | /* Initialize common gart structure */ |
96 | r = radeon_gart_init(rdev); | 114 | r = radeon_gart_init(rdev); |
97 | if (r) { | 115 | if (r) |
98 | return r; | 116 | return r; |
99 | } | ||
100 | r = rv370_debugfs_pcie_gart_info_init(rdev); | 117 | r = rv370_debugfs_pcie_gart_info_init(rdev); |
101 | if (r) { | 118 | if (r) |
102 | DRM_ERROR("Failed to register debugfs file for PCIE gart !\n"); | 119 | DRM_ERROR("Failed to register debugfs file for PCIE gart !\n"); |
103 | } | ||
104 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; | 120 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; |
105 | r = radeon_gart_table_vram_alloc(rdev); | 121 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; |
106 | if (r) { | 122 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; |
107 | return r; | 123 | return radeon_gart_table_vram_alloc(rdev); |
124 | } | ||
125 | |||
126 | int rv370_pcie_gart_enable(struct radeon_device *rdev) | ||
127 | { | ||
128 | uint32_t table_addr; | ||
129 | uint32_t tmp; | ||
130 | int r; | ||
131 | |||
132 | if (rdev->gart.table.vram.robj == NULL) { | ||
133 | dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); | ||
134 | return -EINVAL; | ||
108 | } | 135 | } |
136 | r = radeon_gart_table_vram_pin(rdev); | ||
137 | if (r) | ||
138 | return r; | ||
109 | /* discard memory request outside of configured range */ | 139 | /* discard memory request outside of configured range */ |
110 | tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; | 140 | tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
111 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); | 141 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
@@ -145,51 +175,13 @@ void rv370_pcie_gart_disable(struct radeon_device *rdev) | |||
145 | } | 175 | } |
146 | } | 176 | } |
147 | 177 | ||
148 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | 178 | void rv370_pcie_gart_fini(struct radeon_device *rdev) |
149 | { | ||
150 | void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; | ||
151 | |||
152 | if (i < 0 || i > rdev->gart.num_gpu_pages) { | ||
153 | return -EINVAL; | ||
154 | } | ||
155 | addr = (lower_32_bits(addr) >> 8) | | ||
156 | ((upper_32_bits(addr) & 0xff) << 24) | | ||
157 | 0xc; | ||
158 | /* on x86 we want this to be CPU endian, on powerpc | ||
159 | * on powerpc without HW swappers, it'll get swapped on way | ||
160 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ | ||
161 | writel(addr, ((void __iomem *)ptr) + (i * 4)); | ||
162 | return 0; | ||
163 | } | ||
164 | |||
165 | int r300_gart_enable(struct radeon_device *rdev) | ||
166 | { | 179 | { |
167 | #if __OS_HAS_AGP | 180 | rv370_pcie_gart_disable(rdev); |
168 | if (rdev->flags & RADEON_IS_AGP) { | 181 | radeon_gart_table_vram_free(rdev); |
169 | if (rdev->family > CHIP_RV350) { | 182 | radeon_gart_fini(rdev); |
170 | rv370_pcie_gart_disable(rdev); | ||
171 | } else { | ||
172 | r100_pci_gart_disable(rdev); | ||
173 | } | ||
174 | return 0; | ||
175 | } | ||
176 | #endif | ||
177 | if (rdev->flags & RADEON_IS_PCIE) { | ||
178 | rdev->asic->gart_disable = &rv370_pcie_gart_disable; | ||
179 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; | ||
180 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; | ||
181 | return rv370_pcie_gart_enable(rdev); | ||
182 | } | ||
183 | if (rdev->flags & RADEON_IS_PCI) { | ||
184 | rdev->asic->gart_disable = &r100_pci_gart_disable; | ||
185 | rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush; | ||
186 | rdev->asic->gart_set_page = &r100_pci_gart_set_page; | ||
187 | return r100_pci_gart_enable(rdev); | ||
188 | } | ||
189 | return r100_pci_gart_enable(rdev); | ||
190 | } | 183 | } |
191 | 184 | ||
192 | |||
193 | /* | 185 | /* |
194 | * MC | 186 | * MC |
195 | */ | 187 | */ |
@@ -237,14 +229,6 @@ int r300_mc_init(struct radeon_device *rdev) | |||
237 | 229 | ||
238 | void r300_mc_fini(struct radeon_device *rdev) | 230 | void r300_mc_fini(struct radeon_device *rdev) |
239 | { | 231 | { |
240 | if (rdev->flags & RADEON_IS_PCIE) { | ||
241 | rv370_pcie_gart_disable(rdev); | ||
242 | radeon_gart_table_vram_free(rdev); | ||
243 | } else { | ||
244 | r100_pci_gart_disable(rdev); | ||
245 | radeon_gart_table_ram_free(rdev); | ||
246 | } | ||
247 | radeon_gart_fini(rdev); | ||
248 | } | 232 | } |
249 | 233 | ||
250 | 234 | ||
@@ -1299,8 +1283,6 @@ void r300_mc_program(struct radeon_device *rdev) | |||
1299 | 1283 | ||
1300 | /* Stops all mc clients */ | 1284 | /* Stops all mc clients */ |
1301 | r100_mc_stop(rdev, &save); | 1285 | r100_mc_stop(rdev, &save); |
1302 | /* Shutdown PCI/PCIE GART */ | ||
1303 | radeon_gart_disable(rdev); | ||
1304 | if (rdev->flags & RADEON_IS_AGP) { | 1286 | if (rdev->flags & RADEON_IS_AGP) { |
1305 | WREG32(R_00014C_MC_AGP_LOCATION, | 1287 | WREG32(R_00014C_MC_AGP_LOCATION, |
1306 | S_00014C_MC_AGP_START(rdev->mc.gtt_start >> 16) | | 1288 | S_00014C_MC_AGP_START(rdev->mc.gtt_start >> 16) | |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index e57b9ba4aaf3..33a25a4377b8 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
@@ -161,6 +161,11 @@ int r420_resume(struct radeon_device *rdev) | |||
161 | { | 161 | { |
162 | int r; | 162 | int r; |
163 | 163 | ||
164 | /* Make sur GART are not working */ | ||
165 | if (rdev->flags & RADEON_IS_PCIE) | ||
166 | rv370_pcie_gart_disable(rdev); | ||
167 | if (rdev->flags & RADEON_IS_PCI) | ||
168 | r100_pci_gart_disable(rdev); | ||
164 | /* Resume clock before doing reset */ | 169 | /* Resume clock before doing reset */ |
165 | r420_clock_resume(rdev); | 170 | r420_clock_resume(rdev); |
166 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | 171 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ |
@@ -180,10 +185,15 @@ int r420_resume(struct radeon_device *rdev) | |||
180 | r300_mc_program(rdev); | 185 | r300_mc_program(rdev); |
181 | /* Initialize GART (initialize after TTM so we can allocate | 186 | /* Initialize GART (initialize after TTM so we can allocate |
182 | * memory through TTM but finalize after TTM) */ | 187 | * memory through TTM but finalize after TTM) */ |
183 | r = radeon_gart_enable(rdev); | 188 | if (rdev->flags & RADEON_IS_PCIE) { |
184 | if (r) { | 189 | r = rv370_pcie_gart_enable(rdev); |
185 | dev_err(rdev->dev, "failled initializing GART (%d).\n", r); | 190 | if (r) |
186 | return r; | 191 | return r; |
192 | } | ||
193 | if (rdev->flags & RADEON_IS_PCI) { | ||
194 | r = r100_pci_gart_enable(rdev); | ||
195 | if (r) | ||
196 | return r; | ||
187 | } | 197 | } |
188 | r420_pipes_init(rdev); | 198 | r420_pipes_init(rdev); |
189 | /* Enable IRQ */ | 199 | /* Enable IRQ */ |
@@ -212,7 +222,10 @@ int r420_suspend(struct radeon_device *rdev) | |||
212 | r100_cp_disable(rdev); | 222 | r100_cp_disable(rdev); |
213 | r100_wb_disable(rdev); | 223 | r100_wb_disable(rdev); |
214 | r100_irq_disable(rdev); | 224 | r100_irq_disable(rdev); |
215 | radeon_gart_disable(rdev); | 225 | if (rdev->flags & RADEON_IS_PCIE) |
226 | rv370_pcie_gart_disable(rdev); | ||
227 | if (rdev->flags & RADEON_IS_PCI) | ||
228 | r100_pci_gart_disable(rdev); | ||
216 | return 0; | 229 | return 0; |
217 | } | 230 | } |
218 | 231 | ||
@@ -222,14 +235,10 @@ void r420_fini(struct radeon_device *rdev) | |||
222 | r100_wb_fini(rdev); | 235 | r100_wb_fini(rdev); |
223 | r100_ib_fini(rdev); | 236 | r100_ib_fini(rdev); |
224 | radeon_gem_fini(rdev); | 237 | radeon_gem_fini(rdev); |
225 | if (rdev->flags & RADEON_IS_PCIE) { | 238 | if (rdev->flags & RADEON_IS_PCIE) |
226 | rv370_pcie_gart_disable(rdev); | 239 | rv370_pcie_gart_fini(rdev); |
227 | radeon_gart_table_vram_free(rdev); | 240 | if (rdev->flags & RADEON_IS_PCI) |
228 | } else { | 241 | r100_pci_gart_fini(rdev); |
229 | r100_pci_gart_disable(rdev); | ||
230 | radeon_gart_table_ram_free(rdev); | ||
231 | } | ||
232 | radeon_gart_fini(rdev); | ||
233 | radeon_agp_fini(rdev); | 242 | radeon_agp_fini(rdev); |
234 | radeon_irq_kms_fini(rdev); | 243 | radeon_irq_kms_fini(rdev); |
235 | radeon_fence_driver_fini(rdev); | 244 | radeon_fence_driver_fini(rdev); |
@@ -309,6 +318,16 @@ int r420_init(struct radeon_device *rdev) | |||
309 | if (r) { | 318 | if (r) { |
310 | return r; | 319 | return r; |
311 | } | 320 | } |
321 | if (rdev->flags & RADEON_IS_PCIE) { | ||
322 | r = rv370_pcie_gart_init(rdev); | ||
323 | if (r) | ||
324 | return r; | ||
325 | } | ||
326 | if (rdev->flags & RADEON_IS_PCI) { | ||
327 | r = r100_pci_gart_init(rdev); | ||
328 | if (r) | ||
329 | return r; | ||
330 | } | ||
312 | r300_set_reg_safe(rdev); | 331 | r300_set_reg_safe(rdev); |
313 | r = r420_resume(rdev); | 332 | r = r420_resume(rdev); |
314 | if (r) { | 333 | if (r) { |
@@ -318,14 +337,10 @@ int r420_init(struct radeon_device *rdev) | |||
318 | r100_cp_fini(rdev); | 337 | r100_cp_fini(rdev); |
319 | r100_wb_fini(rdev); | 338 | r100_wb_fini(rdev); |
320 | r100_ib_fini(rdev); | 339 | r100_ib_fini(rdev); |
321 | if (rdev->flags & RADEON_IS_PCIE) { | 340 | if (rdev->flags & RADEON_IS_PCIE) |
322 | rv370_pcie_gart_disable(rdev); | 341 | rv370_pcie_gart_fini(rdev); |
323 | radeon_gart_table_vram_free(rdev); | 342 | if (rdev->flags & RADEON_IS_PCI) |
324 | } else { | 343 | r100_pci_gart_fini(rdev); |
325 | r100_pci_gart_disable(rdev); | ||
326 | radeon_gart_table_ram_free(rdev); | ||
327 | } | ||
328 | radeon_gart_fini(rdev); | ||
329 | radeon_agp_fini(rdev); | 344 | radeon_agp_fini(rdev); |
330 | radeon_irq_kms_fini(rdev); | 345 | radeon_irq_kms_fini(rdev); |
331 | } | 346 | } |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 0e1686d1c873..d4b0b9d2e39b 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
@@ -31,8 +31,6 @@ | |||
31 | 31 | ||
32 | /* r520,rv530,rv560,rv570,r580 depends on : */ | 32 | /* r520,rv530,rv560,rv570,r580 depends on : */ |
33 | void r100_hdp_reset(struct radeon_device *rdev); | 33 | void r100_hdp_reset(struct radeon_device *rdev); |
34 | int rv370_pcie_gart_enable(struct radeon_device *rdev); | ||
35 | void rv370_pcie_gart_disable(struct radeon_device *rdev); | ||
36 | void r420_pipes_init(struct radeon_device *rdev); | 34 | void r420_pipes_init(struct radeon_device *rdev); |
37 | void rs600_mc_disable_clients(struct radeon_device *rdev); | 35 | void rs600_mc_disable_clients(struct radeon_device *rdev); |
38 | void rs600_disable_vga(struct radeon_device *rdev); | 36 | void rs600_disable_vga(struct radeon_device *rdev); |
@@ -118,9 +116,6 @@ int r520_mc_init(struct radeon_device *rdev) | |||
118 | 116 | ||
119 | void r520_mc_fini(struct radeon_device *rdev) | 117 | void r520_mc_fini(struct radeon_device *rdev) |
120 | { | 118 | { |
121 | rv370_pcie_gart_disable(rdev); | ||
122 | radeon_gart_table_vram_free(rdev); | ||
123 | radeon_gart_fini(rdev); | ||
124 | } | 119 | } |
125 | 120 | ||
126 | 121 | ||
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 1bc25678986b..65699e9f2025 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -113,21 +113,34 @@ void r600_pcie_gart_tlb_flush(struct radeon_device *rdev) | |||
113 | } | 113 | } |
114 | } | 114 | } |
115 | 115 | ||
116 | int r600_pcie_gart_enable(struct radeon_device *rdev) | 116 | int r600_pcie_gart_init(struct radeon_device *rdev) |
117 | { | 117 | { |
118 | u32 tmp; | 118 | int r; |
119 | int r, i; | ||
120 | 119 | ||
120 | if (rdev->gart.table.vram.robj) { | ||
121 | WARN(1, "R600 PCIE GART already initialized.\n"); | ||
122 | return 0; | ||
123 | } | ||
121 | /* Initialize common gart structure */ | 124 | /* Initialize common gart structure */ |
122 | r = radeon_gart_init(rdev); | 125 | r = radeon_gart_init(rdev); |
123 | if (r) { | 126 | if (r) |
124 | return r; | 127 | return r; |
125 | } | ||
126 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 8; | 128 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 8; |
127 | r = radeon_gart_table_vram_alloc(rdev); | 129 | return radeon_gart_table_vram_alloc(rdev); |
128 | if (r) { | 130 | } |
129 | return r; | 131 | |
132 | int r600_pcie_gart_enable(struct radeon_device *rdev) | ||
133 | { | ||
134 | u32 tmp; | ||
135 | int r, i; | ||
136 | |||
137 | if (rdev->gart.table.vram.robj == NULL) { | ||
138 | dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); | ||
139 | return -EINVAL; | ||
130 | } | 140 | } |
141 | r = radeon_gart_table_vram_pin(rdev); | ||
142 | if (r) | ||
143 | return r; | ||
131 | for (i = 0; i < rdev->gart.num_gpu_pages; i++) | 144 | for (i = 0; i < rdev->gart.num_gpu_pages; i++) |
132 | r600_gart_clear_page(rdev, i); | 145 | r600_gart_clear_page(rdev, i); |
133 | /* Setup L2 cache */ | 146 | /* Setup L2 cache */ |
@@ -175,10 +188,6 @@ void r600_pcie_gart_disable(struct radeon_device *rdev) | |||
175 | u32 tmp; | 188 | u32 tmp; |
176 | int i; | 189 | int i; |
177 | 190 | ||
178 | /* Clear ptes*/ | ||
179 | for (i = 0; i < rdev->gart.num_gpu_pages; i++) | ||
180 | r600_gart_clear_page(rdev, i); | ||
181 | r600_pcie_gart_tlb_flush(rdev); | ||
182 | /* Disable all tables */ | 191 | /* Disable all tables */ |
183 | for (i = 0; i < 7; i++) | 192 | for (i = 0; i < 7; i++) |
184 | WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); | 193 | WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); |
@@ -204,6 +213,17 @@ void r600_pcie_gart_disable(struct radeon_device *rdev) | |||
204 | WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp); | 213 | WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp); |
205 | WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp); | 214 | WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp); |
206 | WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp); | 215 | WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp); |
216 | if (rdev->gart.table.vram.robj) { | ||
217 | radeon_object_kunmap(rdev->gart.table.vram.robj); | ||
218 | radeon_object_unpin(rdev->gart.table.vram.robj); | ||
219 | } | ||
220 | } | ||
221 | |||
222 | void r600_pcie_gart_fini(struct radeon_device *rdev) | ||
223 | { | ||
224 | r600_pcie_gart_disable(rdev); | ||
225 | radeon_gart_table_vram_free(rdev); | ||
226 | radeon_gart_fini(rdev); | ||
207 | } | 227 | } |
208 | 228 | ||
209 | int r600_mc_wait_for_idle(struct radeon_device *rdev) | 229 | int r600_mc_wait_for_idle(struct radeon_device *rdev) |
@@ -1472,6 +1492,7 @@ int r600_suspend(struct radeon_device *rdev) | |||
1472 | { | 1492 | { |
1473 | /* FIXME: we should wait for ring to be empty */ | 1493 | /* FIXME: we should wait for ring to be empty */ |
1474 | r600_cp_stop(rdev); | 1494 | r600_cp_stop(rdev); |
1495 | r600_pcie_gart_disable(rdev); | ||
1475 | return 0; | 1496 | return 0; |
1476 | } | 1497 | } |
1477 | 1498 | ||
@@ -1548,6 +1569,10 @@ int r600_init(struct radeon_device *rdev) | |||
1548 | } | 1569 | } |
1549 | } | 1570 | } |
1550 | 1571 | ||
1572 | r = r600_pcie_gart_init(rdev); | ||
1573 | if (r) | ||
1574 | return r; | ||
1575 | |||
1551 | r = r600_resume(rdev); | 1576 | r = r600_resume(rdev); |
1552 | if (r) { | 1577 | if (r) { |
1553 | if (rdev->flags & RADEON_IS_AGP) { | 1578 | if (rdev->flags & RADEON_IS_AGP) { |
@@ -1583,9 +1608,7 @@ void r600_fini(struct radeon_device *rdev) | |||
1583 | 1608 | ||
1584 | r600_blit_fini(rdev); | 1609 | r600_blit_fini(rdev); |
1585 | radeon_ring_fini(rdev); | 1610 | radeon_ring_fini(rdev); |
1586 | r600_pcie_gart_disable(rdev); | 1611 | r600_pcie_gart_fini(rdev); |
1587 | radeon_gart_table_vram_free(rdev); | ||
1588 | radeon_gart_fini(rdev); | ||
1589 | radeon_gem_fini(rdev); | 1612 | radeon_gem_fini(rdev); |
1590 | radeon_fence_driver_fini(rdev); | 1613 | radeon_fence_driver_fini(rdev); |
1591 | radeon_clocks_fini(rdev); | 1614 | radeon_clocks_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 8cec5bf2922b..99292be8bc99 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -596,6 +596,8 @@ struct radeon_asic { | |||
596 | void (*mc_fini)(struct radeon_device *rdev); | 596 | void (*mc_fini)(struct radeon_device *rdev); |
597 | int (*wb_init)(struct radeon_device *rdev); | 597 | int (*wb_init)(struct radeon_device *rdev); |
598 | void (*wb_fini)(struct radeon_device *rdev); | 598 | void (*wb_fini)(struct radeon_device *rdev); |
599 | int (*gart_init)(struct radeon_device *rdev); | ||
600 | void (*gart_fini)(struct radeon_device *rdev); | ||
599 | int (*gart_enable)(struct radeon_device *rdev); | 601 | int (*gart_enable)(struct radeon_device *rdev); |
600 | void (*gart_disable)(struct radeon_device *rdev); | 602 | void (*gart_disable)(struct radeon_device *rdev); |
601 | void (*gart_tlb_flush)(struct radeon_device *rdev); | 603 | void (*gart_tlb_flush)(struct radeon_device *rdev); |
@@ -950,6 +952,8 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v) | |||
950 | #define radeon_mc_fini(rdev) (rdev)->asic->mc_fini((rdev)) | 952 | #define radeon_mc_fini(rdev) (rdev)->asic->mc_fini((rdev)) |
951 | #define radeon_wb_init(rdev) (rdev)->asic->wb_init((rdev)) | 953 | #define radeon_wb_init(rdev) (rdev)->asic->wb_init((rdev)) |
952 | #define radeon_wb_fini(rdev) (rdev)->asic->wb_fini((rdev)) | 954 | #define radeon_wb_fini(rdev) (rdev)->asic->wb_fini((rdev)) |
955 | #define radeon_gpu_gart_init(rdev) (rdev)->asic->gart_init((rdev)) | ||
956 | #define radeon_gpu_gart_fini(rdev) (rdev)->asic->gart_fini((rdev)) | ||
953 | #define radeon_gart_enable(rdev) (rdev)->asic->gart_enable((rdev)) | 957 | #define radeon_gart_enable(rdev) (rdev)->asic->gart_enable((rdev)) |
954 | #define radeon_gart_disable(rdev) (rdev)->asic->gart_disable((rdev)) | 958 | #define radeon_gart_disable(rdev) (rdev)->asic->gart_disable((rdev)) |
955 | #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart_tlb_flush((rdev)) | 959 | #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart_tlb_flush((rdev)) |
@@ -978,6 +982,7 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v) | |||
978 | #define radeon_bandwidth_update(rdev) (rdev)->asic->bandwidth_update((rdev)) | 982 | #define radeon_bandwidth_update(rdev) (rdev)->asic->bandwidth_update((rdev)) |
979 | 983 | ||
980 | /* Common functions */ | 984 | /* Common functions */ |
985 | extern int radeon_gart_table_vram_pin(struct radeon_device *rdev); | ||
981 | extern int radeon_modeset_init(struct radeon_device *rdev); | 986 | extern int radeon_modeset_init(struct radeon_device *rdev); |
982 | extern void radeon_modeset_fini(struct radeon_device *rdev); | 987 | extern void radeon_modeset_fini(struct radeon_device *rdev); |
983 | extern bool radeon_card_posted(struct radeon_device *rdev); | 988 | extern bool radeon_card_posted(struct radeon_device *rdev); |
@@ -1000,6 +1005,8 @@ extern void r100_cp_disable(struct radeon_device *rdev); | |||
1000 | extern int r100_cp_init(struct radeon_device *rdev, unsigned ring_size); | 1005 | extern int r100_cp_init(struct radeon_device *rdev, unsigned ring_size); |
1001 | extern void r100_cp_fini(struct radeon_device *rdev); | 1006 | extern void r100_cp_fini(struct radeon_device *rdev); |
1002 | extern void r100_pci_gart_tlb_flush(struct radeon_device *rdev); | 1007 | extern void r100_pci_gart_tlb_flush(struct radeon_device *rdev); |
1008 | extern int r100_pci_gart_init(struct radeon_device *rdev); | ||
1009 | extern void r100_pci_gart_fini(struct radeon_device *rdev); | ||
1003 | extern int r100_pci_gart_enable(struct radeon_device *rdev); | 1010 | extern int r100_pci_gart_enable(struct radeon_device *rdev); |
1004 | extern void r100_pci_gart_disable(struct radeon_device *rdev); | 1011 | extern void r100_pci_gart_disable(struct radeon_device *rdev); |
1005 | extern int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | 1012 | extern int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); |
@@ -1020,6 +1027,9 @@ extern int r100_wb_init(struct radeon_device *rdev); | |||
1020 | extern void r300_set_reg_safe(struct radeon_device *rdev); | 1027 | extern void r300_set_reg_safe(struct radeon_device *rdev); |
1021 | extern void r300_mc_program(struct radeon_device *rdev); | 1028 | extern void r300_mc_program(struct radeon_device *rdev); |
1022 | extern void r300_vram_info(struct radeon_device *rdev); | 1029 | extern void r300_vram_info(struct radeon_device *rdev); |
1030 | extern int rv370_pcie_gart_init(struct radeon_device *rdev); | ||
1031 | extern void rv370_pcie_gart_fini(struct radeon_device *rdev); | ||
1032 | extern int rv370_pcie_gart_enable(struct radeon_device *rdev); | ||
1023 | extern void rv370_pcie_gart_disable(struct radeon_device *rdev); | 1033 | extern void rv370_pcie_gart_disable(struct radeon_device *rdev); |
1024 | 1034 | ||
1025 | /* r420,r423,rv410 */ | 1035 | /* r420,r423,rv410 */ |
@@ -1043,6 +1053,7 @@ extern int r600_cp_resume(struct radeon_device *rdev); | |||
1043 | extern int r600_count_pipe_bits(uint32_t val); | 1053 | extern int r600_count_pipe_bits(uint32_t val); |
1044 | extern int r600_gart_clear_page(struct radeon_device *rdev, int i); | 1054 | extern int r600_gart_clear_page(struct radeon_device *rdev, int i); |
1045 | extern int r600_mc_wait_for_idle(struct radeon_device *rdev); | 1055 | extern int r600_mc_wait_for_idle(struct radeon_device *rdev); |
1056 | extern int r600_pcie_gart_init(struct radeon_device *rdev); | ||
1046 | extern void r600_pcie_gart_tlb_flush(struct radeon_device *rdev); | 1057 | extern void r600_pcie_gart_tlb_flush(struct radeon_device *rdev); |
1047 | extern int r600_ib_test(struct radeon_device *rdev); | 1058 | extern int r600_ib_test(struct radeon_device *rdev); |
1048 | extern int r600_ring_test(struct radeon_device *rdev); | 1059 | extern int r600_ring_test(struct radeon_device *rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 8f27be31e094..5f2a9e6f12c5 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
@@ -53,7 +53,9 @@ void r100_mc_fini(struct radeon_device *rdev); | |||
53 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); | 53 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); |
54 | int r100_wb_init(struct radeon_device *rdev); | 54 | int r100_wb_init(struct radeon_device *rdev); |
55 | void r100_wb_fini(struct radeon_device *rdev); | 55 | void r100_wb_fini(struct radeon_device *rdev); |
56 | int r100_gart_enable(struct radeon_device *rdev); | 56 | int r100_pci_gart_init(struct radeon_device *rdev); |
57 | void r100_pci_gart_fini(struct radeon_device *rdev); | ||
58 | int r100_pci_gart_enable(struct radeon_device *rdev); | ||
57 | void r100_pci_gart_disable(struct radeon_device *rdev); | 59 | void r100_pci_gart_disable(struct radeon_device *rdev); |
58 | void r100_pci_gart_tlb_flush(struct radeon_device *rdev); | 60 | void r100_pci_gart_tlb_flush(struct radeon_device *rdev); |
59 | int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | 61 | int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); |
@@ -92,7 +94,9 @@ static struct radeon_asic r100_asic = { | |||
92 | .mc_fini = &r100_mc_fini, | 94 | .mc_fini = &r100_mc_fini, |
93 | .wb_init = &r100_wb_init, | 95 | .wb_init = &r100_wb_init, |
94 | .wb_fini = &r100_wb_fini, | 96 | .wb_fini = &r100_wb_fini, |
95 | .gart_enable = &r100_gart_enable, | 97 | .gart_init = &r100_pci_gart_init, |
98 | .gart_fini = &r100_pci_gart_fini, | ||
99 | .gart_enable = &r100_pci_gart_enable, | ||
96 | .gart_disable = &r100_pci_gart_disable, | 100 | .gart_disable = &r100_pci_gart_disable, |
97 | .gart_tlb_flush = &r100_pci_gart_tlb_flush, | 101 | .gart_tlb_flush = &r100_pci_gart_tlb_flush, |
98 | .gart_set_page = &r100_pci_gart_set_page, | 102 | .gart_set_page = &r100_pci_gart_set_page, |
@@ -135,7 +139,9 @@ void r300_ring_start(struct radeon_device *rdev); | |||
135 | void r300_fence_ring_emit(struct radeon_device *rdev, | 139 | void r300_fence_ring_emit(struct radeon_device *rdev, |
136 | struct radeon_fence *fence); | 140 | struct radeon_fence *fence); |
137 | int r300_cs_parse(struct radeon_cs_parser *p); | 141 | int r300_cs_parse(struct radeon_cs_parser *p); |
138 | int r300_gart_enable(struct radeon_device *rdev); | 142 | int rv370_pcie_gart_init(struct radeon_device *rdev); |
143 | void rv370_pcie_gart_fini(struct radeon_device *rdev); | ||
144 | int rv370_pcie_gart_enable(struct radeon_device *rdev); | ||
139 | void rv370_pcie_gart_disable(struct radeon_device *rdev); | 145 | void rv370_pcie_gart_disable(struct radeon_device *rdev); |
140 | void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); | 146 | void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); |
141 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | 147 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); |
@@ -157,7 +163,9 @@ static struct radeon_asic r300_asic = { | |||
157 | .mc_fini = &r300_mc_fini, | 163 | .mc_fini = &r300_mc_fini, |
158 | .wb_init = &r100_wb_init, | 164 | .wb_init = &r100_wb_init, |
159 | .wb_fini = &r100_wb_fini, | 165 | .wb_fini = &r100_wb_fini, |
160 | .gart_enable = &r300_gart_enable, | 166 | .gart_init = &r100_pci_gart_init, |
167 | .gart_fini = &r100_pci_gart_fini, | ||
168 | .gart_enable = &r100_pci_gart_enable, | ||
161 | .gart_disable = &r100_pci_gart_disable, | 169 | .gart_disable = &r100_pci_gart_disable, |
162 | .gart_tlb_flush = &r100_pci_gart_tlb_flush, | 170 | .gart_tlb_flush = &r100_pci_gart_tlb_flush, |
163 | .gart_set_page = &r100_pci_gart_set_page, | 171 | .gart_set_page = &r100_pci_gart_set_page, |
@@ -205,8 +213,8 @@ static struct radeon_asic r420_asic = { | |||
205 | .mc_fini = NULL, | 213 | .mc_fini = NULL, |
206 | .wb_init = NULL, | 214 | .wb_init = NULL, |
207 | .wb_fini = NULL, | 215 | .wb_fini = NULL, |
208 | .gart_enable = &r300_gart_enable, | 216 | .gart_enable = NULL, |
209 | .gart_disable = &rv370_pcie_gart_disable, | 217 | .gart_disable = NULL, |
210 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, | 218 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, |
211 | .gart_set_page = &rv370_pcie_gart_set_page, | 219 | .gart_set_page = &rv370_pcie_gart_set_page, |
212 | .cp_init = NULL, | 220 | .cp_init = NULL, |
@@ -242,6 +250,8 @@ void rs400_errata(struct radeon_device *rdev); | |||
242 | void rs400_vram_info(struct radeon_device *rdev); | 250 | void rs400_vram_info(struct radeon_device *rdev); |
243 | int rs400_mc_init(struct radeon_device *rdev); | 251 | int rs400_mc_init(struct radeon_device *rdev); |
244 | void rs400_mc_fini(struct radeon_device *rdev); | 252 | void rs400_mc_fini(struct radeon_device *rdev); |
253 | int rs400_gart_init(struct radeon_device *rdev); | ||
254 | void rs400_gart_fini(struct radeon_device *rdev); | ||
245 | int rs400_gart_enable(struct radeon_device *rdev); | 255 | int rs400_gart_enable(struct radeon_device *rdev); |
246 | void rs400_gart_disable(struct radeon_device *rdev); | 256 | void rs400_gart_disable(struct radeon_device *rdev); |
247 | void rs400_gart_tlb_flush(struct radeon_device *rdev); | 257 | void rs400_gart_tlb_flush(struct radeon_device *rdev); |
@@ -257,6 +267,8 @@ static struct radeon_asic rs400_asic = { | |||
257 | .mc_fini = &rs400_mc_fini, | 267 | .mc_fini = &rs400_mc_fini, |
258 | .wb_init = &r100_wb_init, | 268 | .wb_init = &r100_wb_init, |
259 | .wb_fini = &r100_wb_fini, | 269 | .wb_fini = &r100_wb_fini, |
270 | .gart_init = &rs400_gart_init, | ||
271 | .gart_fini = &rs400_gart_fini, | ||
260 | .gart_enable = &rs400_gart_enable, | 272 | .gart_enable = &rs400_gart_enable, |
261 | .gart_disable = &rs400_gart_disable, | 273 | .gart_disable = &rs400_gart_disable, |
262 | .gart_tlb_flush = &rs400_gart_tlb_flush, | 274 | .gart_tlb_flush = &rs400_gart_tlb_flush, |
@@ -298,6 +310,8 @@ void rs600_mc_fini(struct radeon_device *rdev); | |||
298 | int rs600_irq_set(struct radeon_device *rdev); | 310 | int rs600_irq_set(struct radeon_device *rdev); |
299 | int rs600_irq_process(struct radeon_device *rdev); | 311 | int rs600_irq_process(struct radeon_device *rdev); |
300 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); | 312 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); |
313 | int rs600_gart_init(struct radeon_device *rdev); | ||
314 | void rs600_gart_fini(struct radeon_device *rdev); | ||
301 | int rs600_gart_enable(struct radeon_device *rdev); | 315 | int rs600_gart_enable(struct radeon_device *rdev); |
302 | void rs600_gart_disable(struct radeon_device *rdev); | 316 | void rs600_gart_disable(struct radeon_device *rdev); |
303 | void rs600_gart_tlb_flush(struct radeon_device *rdev); | 317 | void rs600_gart_tlb_flush(struct radeon_device *rdev); |
@@ -314,6 +328,8 @@ static struct radeon_asic rs600_asic = { | |||
314 | .mc_fini = &rs600_mc_fini, | 328 | .mc_fini = &rs600_mc_fini, |
315 | .wb_init = &r100_wb_init, | 329 | .wb_init = &r100_wb_init, |
316 | .wb_fini = &r100_wb_fini, | 330 | .wb_fini = &r100_wb_fini, |
331 | .gart_init = &rs600_gart_init, | ||
332 | .gart_fini = &rs600_gart_fini, | ||
317 | .gart_enable = &rs600_gart_enable, | 333 | .gart_enable = &rs600_gart_enable, |
318 | .gart_disable = &rs600_gart_disable, | 334 | .gart_disable = &rs600_gart_disable, |
319 | .gart_tlb_flush = &rs600_gart_tlb_flush, | 335 | .gart_tlb_flush = &rs600_gart_tlb_flush, |
@@ -361,6 +377,8 @@ static struct radeon_asic rs690_asic = { | |||
361 | .mc_fini = &rs690_mc_fini, | 377 | .mc_fini = &rs690_mc_fini, |
362 | .wb_init = &r100_wb_init, | 378 | .wb_init = &r100_wb_init, |
363 | .wb_fini = &r100_wb_fini, | 379 | .wb_fini = &r100_wb_fini, |
380 | .gart_init = &rs400_gart_init, | ||
381 | .gart_fini = &rs400_gart_fini, | ||
364 | .gart_enable = &rs400_gart_enable, | 382 | .gart_enable = &rs400_gart_enable, |
365 | .gart_disable = &rs400_gart_disable, | 383 | .gart_disable = &rs400_gart_disable, |
366 | .gart_tlb_flush = &rs400_gart_tlb_flush, | 384 | .gart_tlb_flush = &rs400_gart_tlb_flush, |
@@ -415,7 +433,9 @@ static struct radeon_asic rv515_asic = { | |||
415 | .mc_fini = &rv515_mc_fini, | 433 | .mc_fini = &rv515_mc_fini, |
416 | .wb_init = &r100_wb_init, | 434 | .wb_init = &r100_wb_init, |
417 | .wb_fini = &r100_wb_fini, | 435 | .wb_fini = &r100_wb_fini, |
418 | .gart_enable = &r300_gart_enable, | 436 | .gart_init = &rv370_pcie_gart_init, |
437 | .gart_fini = &rv370_pcie_gart_fini, | ||
438 | .gart_enable = &rv370_pcie_gart_enable, | ||
419 | .gart_disable = &rv370_pcie_gart_disable, | 439 | .gart_disable = &rv370_pcie_gart_disable, |
420 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, | 440 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, |
421 | .gart_set_page = &rv370_pcie_gart_set_page, | 441 | .gart_set_page = &rv370_pcie_gart_set_page, |
@@ -462,7 +482,9 @@ static struct radeon_asic r520_asic = { | |||
462 | .mc_fini = &r520_mc_fini, | 482 | .mc_fini = &r520_mc_fini, |
463 | .wb_init = &r100_wb_init, | 483 | .wb_init = &r100_wb_init, |
464 | .wb_fini = &r100_wb_fini, | 484 | .wb_fini = &r100_wb_fini, |
465 | .gart_enable = &r300_gart_enable, | 485 | .gart_init = &rv370_pcie_gart_init, |
486 | .gart_fini = &rv370_pcie_gart_fini, | ||
487 | .gart_enable = &rv370_pcie_gart_enable, | ||
466 | .gart_disable = &rv370_pcie_gart_disable, | 488 | .gart_disable = &rv370_pcie_gart_disable, |
467 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, | 489 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, |
468 | .gart_set_page = &rv370_pcie_gart_set_page, | 490 | .gart_set_page = &rv370_pcie_gart_set_page, |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index ece097c3e079..7b6d0b1a5962 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -320,6 +320,14 @@ int radeon_asic_init(struct radeon_device *rdev) | |||
320 | case CHIP_RV350: | 320 | case CHIP_RV350: |
321 | case CHIP_RV380: | 321 | case CHIP_RV380: |
322 | rdev->asic = &r300_asic; | 322 | rdev->asic = &r300_asic; |
323 | if (rdev->flags & RADEON_IS_PCIE) { | ||
324 | rdev->asic->gart_init = &rv370_pcie_gart_init; | ||
325 | rdev->asic->gart_fini = &rv370_pcie_gart_fini; | ||
326 | rdev->asic->gart_enable = &rv370_pcie_gart_enable; | ||
327 | rdev->asic->gart_disable = &rv370_pcie_gart_disable; | ||
328 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; | ||
329 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; | ||
330 | } | ||
323 | break; | 331 | break; |
324 | case CHIP_R420: | 332 | case CHIP_R420: |
325 | case CHIP_R423: | 333 | case CHIP_R423: |
@@ -504,6 +512,12 @@ int radeon_device_init(struct radeon_device *rdev, | |||
504 | rwlock_init(&rdev->fence_drv.lock); | 512 | rwlock_init(&rdev->fence_drv.lock); |
505 | INIT_LIST_HEAD(&rdev->gem.objects); | 513 | INIT_LIST_HEAD(&rdev->gem.objects); |
506 | 514 | ||
515 | /* Set asic functions */ | ||
516 | r = radeon_asic_init(rdev); | ||
517 | if (r) { | ||
518 | return r; | ||
519 | } | ||
520 | |||
507 | if (radeon_agpmode == -1) { | 521 | if (radeon_agpmode == -1) { |
508 | rdev->flags &= ~RADEON_IS_AGP; | 522 | rdev->flags &= ~RADEON_IS_AGP; |
509 | if (rdev->family >= CHIP_RV515 || | 523 | if (rdev->family >= CHIP_RV515 || |
@@ -512,18 +526,24 @@ int radeon_device_init(struct radeon_device *rdev, | |||
512 | rdev->family == CHIP_R423) { | 526 | rdev->family == CHIP_R423) { |
513 | DRM_INFO("Forcing AGP to PCIE mode\n"); | 527 | DRM_INFO("Forcing AGP to PCIE mode\n"); |
514 | rdev->flags |= RADEON_IS_PCIE; | 528 | rdev->flags |= RADEON_IS_PCIE; |
529 | rdev->asic->gart_init = &rv370_pcie_gart_init; | ||
530 | rdev->asic->gart_fini = &rv370_pcie_gart_fini; | ||
531 | rdev->asic->gart_enable = &rv370_pcie_gart_enable; | ||
532 | rdev->asic->gart_disable = &rv370_pcie_gart_disable; | ||
533 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; | ||
534 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; | ||
515 | } else { | 535 | } else { |
516 | DRM_INFO("Forcing AGP to PCI mode\n"); | 536 | DRM_INFO("Forcing AGP to PCI mode\n"); |
517 | rdev->flags |= RADEON_IS_PCI; | 537 | rdev->flags |= RADEON_IS_PCI; |
538 | rdev->asic->gart_init = &r100_pci_gart_init; | ||
539 | rdev->asic->gart_fini = &r100_pci_gart_fini; | ||
540 | rdev->asic->gart_enable = &r100_pci_gart_enable; | ||
541 | rdev->asic->gart_disable = &r100_pci_gart_disable; | ||
542 | rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush; | ||
543 | rdev->asic->gart_set_page = &r100_pci_gart_set_page; | ||
518 | } | 544 | } |
519 | } | 545 | } |
520 | 546 | ||
521 | /* Set asic functions */ | ||
522 | r = radeon_asic_init(rdev); | ||
523 | if (r) { | ||
524 | return r; | ||
525 | } | ||
526 | |||
527 | /* set DMA mask + need_dma32 flags. | 547 | /* set DMA mask + need_dma32 flags. |
528 | * PCIE - can handle 40-bits. | 548 | * PCIE - can handle 40-bits. |
529 | * IGP - can handle 40-bits (in theory) | 549 | * IGP - can handle 40-bits (in theory) |
@@ -623,6 +643,9 @@ int radeon_device_init(struct radeon_device *rdev, | |||
623 | if (r) { | 643 | if (r) { |
624 | return r; | 644 | return r; |
625 | } | 645 | } |
646 | r = radeon_gpu_gart_init(rdev); | ||
647 | if (r) | ||
648 | return r; | ||
626 | /* Initialize GART (initialize after TTM so we can allocate | 649 | /* Initialize GART (initialize after TTM so we can allocate |
627 | * memory through TTM but finalize after TTM) */ | 650 | * memory through TTM but finalize after TTM) */ |
628 | r = radeon_gart_enable(rdev); | 651 | r = radeon_gart_enable(rdev); |
@@ -675,6 +698,7 @@ void radeon_device_fini(struct radeon_device *rdev) | |||
675 | radeon_ib_pool_fini(rdev); | 698 | radeon_ib_pool_fini(rdev); |
676 | radeon_cp_fini(rdev); | 699 | radeon_cp_fini(rdev); |
677 | radeon_wb_fini(rdev); | 700 | radeon_wb_fini(rdev); |
701 | radeon_gpu_gart_fini(rdev); | ||
678 | radeon_gem_fini(rdev); | 702 | radeon_gem_fini(rdev); |
679 | radeon_mc_fini(rdev); | 703 | radeon_mc_fini(rdev); |
680 | #if __OS_HAS_AGP | 704 | #if __OS_HAS_AGP |
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index 2977539880fb..a931af065dd4 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
@@ -75,7 +75,6 @@ void radeon_gart_table_ram_free(struct radeon_device *rdev) | |||
75 | 75 | ||
76 | int radeon_gart_table_vram_alloc(struct radeon_device *rdev) | 76 | int radeon_gart_table_vram_alloc(struct radeon_device *rdev) |
77 | { | 77 | { |
78 | uint64_t gpu_addr; | ||
79 | int r; | 78 | int r; |
80 | 79 | ||
81 | if (rdev->gart.table.vram.robj == NULL) { | 80 | if (rdev->gart.table.vram.robj == NULL) { |
@@ -88,6 +87,14 @@ int radeon_gart_table_vram_alloc(struct radeon_device *rdev) | |||
88 | return r; | 87 | return r; |
89 | } | 88 | } |
90 | } | 89 | } |
90 | return 0; | ||
91 | } | ||
92 | |||
93 | int radeon_gart_table_vram_pin(struct radeon_device *rdev) | ||
94 | { | ||
95 | uint64_t gpu_addr; | ||
96 | int r; | ||
97 | |||
91 | r = radeon_object_pin(rdev->gart.table.vram.robj, | 98 | r = radeon_object_pin(rdev->gart.table.vram.robj, |
92 | RADEON_GEM_DOMAIN_VRAM, &gpu_addr); | 99 | RADEON_GEM_DOMAIN_VRAM, &gpu_addr); |
93 | if (r) { | 100 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index e1e4ce427828..a3fbdad938c7 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
@@ -92,20 +92,41 @@ void rs400_gart_tlb_flush(struct radeon_device *rdev) | |||
92 | WREG32_MC(RS480_GART_CACHE_CNTRL, 0); | 92 | WREG32_MC(RS480_GART_CACHE_CNTRL, 0); |
93 | } | 93 | } |
94 | 94 | ||
95 | int rs400_gart_enable(struct radeon_device *rdev) | 95 | int rs400_gart_init(struct radeon_device *rdev) |
96 | { | 96 | { |
97 | uint32_t size_reg; | ||
98 | uint32_t tmp; | ||
99 | int r; | 97 | int r; |
100 | 98 | ||
99 | if (rdev->gart.table.ram.ptr) { | ||
100 | WARN(1, "RS400 GART already initialized.\n"); | ||
101 | return 0; | ||
102 | } | ||
103 | /* Check gart size */ | ||
104 | switch(rdev->mc.gtt_size / (1024 * 1024)) { | ||
105 | case 32: | ||
106 | case 64: | ||
107 | case 128: | ||
108 | case 256: | ||
109 | case 512: | ||
110 | case 1024: | ||
111 | case 2048: | ||
112 | break; | ||
113 | default: | ||
114 | return -EINVAL; | ||
115 | } | ||
101 | /* Initialize common gart structure */ | 116 | /* Initialize common gart structure */ |
102 | r = radeon_gart_init(rdev); | 117 | r = radeon_gart_init(rdev); |
103 | if (r) { | 118 | if (r) |
104 | return r; | 119 | return r; |
105 | } | 120 | if (rs400_debugfs_pcie_gart_info_init(rdev)) |
106 | if (rs400_debugfs_pcie_gart_info_init(rdev)) { | ||
107 | DRM_ERROR("Failed to register debugfs file for RS400 GART !\n"); | 121 | DRM_ERROR("Failed to register debugfs file for RS400 GART !\n"); |
108 | } | 122 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; |
123 | return radeon_gart_table_ram_alloc(rdev); | ||
124 | } | ||
125 | |||
126 | int rs400_gart_enable(struct radeon_device *rdev) | ||
127 | { | ||
128 | uint32_t size_reg; | ||
129 | uint32_t tmp; | ||
109 | 130 | ||
110 | tmp = RREG32_MC(RS690_AIC_CTRL_SCRATCH); | 131 | tmp = RREG32_MC(RS690_AIC_CTRL_SCRATCH); |
111 | tmp |= RS690_DIS_OUT_OF_PCI_GART_ACCESS; | 132 | tmp |= RS690_DIS_OUT_OF_PCI_GART_ACCESS; |
@@ -136,13 +157,6 @@ int rs400_gart_enable(struct radeon_device *rdev) | |||
136 | default: | 157 | default: |
137 | return -EINVAL; | 158 | return -EINVAL; |
138 | } | 159 | } |
139 | if (rdev->gart.table.ram.ptr == NULL) { | ||
140 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; | ||
141 | r = radeon_gart_table_ram_alloc(rdev); | ||
142 | if (r) { | ||
143 | return r; | ||
144 | } | ||
145 | } | ||
146 | /* It should be fine to program it to max value */ | 160 | /* It should be fine to program it to max value */ |
147 | if (rdev->family == CHIP_RS690 || (rdev->family == CHIP_RS740)) { | 161 | if (rdev->family == CHIP_RS690 || (rdev->family == CHIP_RS740)) { |
148 | WREG32_MC(RS690_MCCFG_AGP_BASE, 0xFFFFFFFF); | 162 | WREG32_MC(RS690_MCCFG_AGP_BASE, 0xFFFFFFFF); |
@@ -201,6 +215,13 @@ void rs400_gart_disable(struct radeon_device *rdev) | |||
201 | WREG32_MC(RS480_AGP_ADDRESS_SPACE_SIZE, 0); | 215 | WREG32_MC(RS480_AGP_ADDRESS_SPACE_SIZE, 0); |
202 | } | 216 | } |
203 | 217 | ||
218 | void rs400_gart_fini(struct radeon_device *rdev) | ||
219 | { | ||
220 | rs400_gart_disable(rdev); | ||
221 | radeon_gart_table_ram_free(rdev); | ||
222 | radeon_gart_fini(rdev); | ||
223 | } | ||
224 | |||
204 | int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | 225 | int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) |
205 | { | 226 | { |
206 | uint32_t entry; | 227 | uint32_t entry; |
@@ -255,14 +276,12 @@ int rs400_mc_init(struct radeon_device *rdev) | |||
255 | (void)RREG32(RADEON_HOST_PATH_CNTL); | 276 | (void)RREG32(RADEON_HOST_PATH_CNTL); |
256 | WREG32(RADEON_HOST_PATH_CNTL, tmp); | 277 | WREG32(RADEON_HOST_PATH_CNTL, tmp); |
257 | (void)RREG32(RADEON_HOST_PATH_CNTL); | 278 | (void)RREG32(RADEON_HOST_PATH_CNTL); |
279 | |||
258 | return 0; | 280 | return 0; |
259 | } | 281 | } |
260 | 282 | ||
261 | void rs400_mc_fini(struct radeon_device *rdev) | 283 | void rs400_mc_fini(struct radeon_device *rdev) |
262 | { | 284 | { |
263 | rs400_gart_disable(rdev); | ||
264 | radeon_gart_table_ram_free(rdev); | ||
265 | radeon_gart_fini(rdev); | ||
266 | } | 285 | } |
267 | 286 | ||
268 | 287 | ||
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 1b8d62f5e73c..c31bd8439259 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
@@ -68,22 +68,35 @@ void rs600_gart_tlb_flush(struct radeon_device *rdev) | |||
68 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); | 68 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); |
69 | } | 69 | } |
70 | 70 | ||
71 | int rs600_gart_enable(struct radeon_device *rdev) | 71 | int rs600_gart_init(struct radeon_device *rdev) |
72 | { | 72 | { |
73 | uint32_t tmp; | ||
74 | int i; | ||
75 | int r; | 73 | int r; |
76 | 74 | ||
75 | if (rdev->gart.table.vram.robj) { | ||
76 | WARN(1, "RS600 GART already initialized.\n"); | ||
77 | return 0; | ||
78 | } | ||
77 | /* Initialize common gart structure */ | 79 | /* Initialize common gart structure */ |
78 | r = radeon_gart_init(rdev); | 80 | r = radeon_gart_init(rdev); |
79 | if (r) { | 81 | if (r) { |
80 | return r; | 82 | return r; |
81 | } | 83 | } |
82 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 8; | 84 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 8; |
83 | r = radeon_gart_table_vram_alloc(rdev); | 85 | return radeon_gart_table_vram_alloc(rdev); |
84 | if (r) { | 86 | } |
85 | return r; | 87 | |
88 | int rs600_gart_enable(struct radeon_device *rdev) | ||
89 | { | ||
90 | uint32_t tmp; | ||
91 | int r, i; | ||
92 | |||
93 | if (rdev->gart.table.vram.robj == NULL) { | ||
94 | dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); | ||
95 | return -EINVAL; | ||
86 | } | 96 | } |
97 | r = radeon_gart_table_vram_pin(rdev); | ||
98 | if (r) | ||
99 | return r; | ||
87 | /* FIXME: setup default page */ | 100 | /* FIXME: setup default page */ |
88 | WREG32_MC(RS600_MC_PT0_CNTL, | 101 | WREG32_MC(RS600_MC_PT0_CNTL, |
89 | (RS600_EFFECTIVE_L2_CACHE_SIZE(6) | | 102 | (RS600_EFFECTIVE_L2_CACHE_SIZE(6) | |
@@ -138,8 +151,17 @@ void rs600_gart_disable(struct radeon_device *rdev) | |||
138 | tmp = RREG32_MC(RS600_MC_CNTL1); | 151 | tmp = RREG32_MC(RS600_MC_CNTL1); |
139 | tmp &= ~RS600_ENABLE_PAGE_TABLES; | 152 | tmp &= ~RS600_ENABLE_PAGE_TABLES; |
140 | WREG32_MC(RS600_MC_CNTL1, tmp); | 153 | WREG32_MC(RS600_MC_CNTL1, tmp); |
141 | radeon_object_kunmap(rdev->gart.table.vram.robj); | 154 | if (rdev->gart.table.vram.robj) { |
142 | radeon_object_unpin(rdev->gart.table.vram.robj); | 155 | radeon_object_kunmap(rdev->gart.table.vram.robj); |
156 | radeon_object_unpin(rdev->gart.table.vram.robj); | ||
157 | } | ||
158 | } | ||
159 | |||
160 | void rs600_gart_fini(struct radeon_device *rdev) | ||
161 | { | ||
162 | rs600_gart_disable(rdev); | ||
163 | radeon_gart_table_vram_free(rdev); | ||
164 | radeon_gart_fini(rdev); | ||
143 | } | 165 | } |
144 | 166 | ||
145 | #define R600_PTE_VALID (1 << 0) | 167 | #define R600_PTE_VALID (1 << 0) |
@@ -235,9 +257,6 @@ int rs600_mc_init(struct radeon_device *rdev) | |||
235 | 257 | ||
236 | void rs600_mc_fini(struct radeon_device *rdev) | 258 | void rs600_mc_fini(struct radeon_device *rdev) |
237 | { | 259 | { |
238 | rs600_gart_disable(rdev); | ||
239 | radeon_gart_table_vram_free(rdev); | ||
240 | radeon_gart_fini(rdev); | ||
241 | } | 260 | } |
242 | 261 | ||
243 | 262 | ||
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index 839595b00728..0f585ca8276d 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
@@ -94,9 +94,6 @@ int rs690_mc_init(struct radeon_device *rdev) | |||
94 | 94 | ||
95 | void rs690_mc_fini(struct radeon_device *rdev) | 95 | void rs690_mc_fini(struct radeon_device *rdev) |
96 | { | 96 | { |
97 | rs400_gart_disable(rdev); | ||
98 | radeon_gart_table_ram_free(rdev); | ||
99 | radeon_gart_fini(rdev); | ||
100 | } | 97 | } |
101 | 98 | ||
102 | 99 | ||
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 03d490269ed0..fd799748e7d8 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
@@ -37,8 +37,6 @@ int r100_cp_reset(struct radeon_device *rdev); | |||
37 | int r100_rb2d_reset(struct radeon_device *rdev); | 37 | int r100_rb2d_reset(struct radeon_device *rdev); |
38 | int r100_gui_wait_for_idle(struct radeon_device *rdev); | 38 | int r100_gui_wait_for_idle(struct radeon_device *rdev); |
39 | int r100_cp_init(struct radeon_device *rdev, unsigned ring_size); | 39 | int r100_cp_init(struct radeon_device *rdev, unsigned ring_size); |
40 | int rv370_pcie_gart_enable(struct radeon_device *rdev); | ||
41 | void rv370_pcie_gart_disable(struct radeon_device *rdev); | ||
42 | void r420_pipes_init(struct radeon_device *rdev); | 40 | void r420_pipes_init(struct radeon_device *rdev); |
43 | void rs600_mc_disable_clients(struct radeon_device *rdev); | 41 | void rs600_mc_disable_clients(struct radeon_device *rdev); |
44 | void rs600_disable_vga(struct radeon_device *rdev); | 42 | void rs600_disable_vga(struct radeon_device *rdev); |
@@ -126,9 +124,6 @@ int rv515_mc_init(struct radeon_device *rdev) | |||
126 | 124 | ||
127 | void rv515_mc_fini(struct radeon_device *rdev) | 125 | void rv515_mc_fini(struct radeon_device *rdev) |
128 | { | 126 | { |
129 | rv370_pcie_gart_disable(rdev); | ||
130 | radeon_gart_table_vram_free(rdev); | ||
131 | radeon_gart_fini(rdev); | ||
132 | } | 127 | } |
133 | 128 | ||
134 | 129 | ||
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 5ba5204091ec..4f2098bc7974 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -48,16 +48,13 @@ int rv770_pcie_gart_enable(struct radeon_device *rdev) | |||
48 | u32 tmp; | 48 | u32 tmp; |
49 | int r, i; | 49 | int r, i; |
50 | 50 | ||
51 | /* Initialize common gart structure */ | 51 | if (rdev->gart.table.vram.robj == NULL) { |
52 | r = radeon_gart_init(rdev); | 52 | dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); |
53 | if (r) { | 53 | return -EINVAL; |
54 | return r; | ||
55 | } | 54 | } |
56 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 8; | 55 | r = radeon_gart_table_vram_pin(rdev); |
57 | r = radeon_gart_table_vram_alloc(rdev); | 56 | if (r) |
58 | if (r) { | ||
59 | return r; | 57 | return r; |
60 | } | ||
61 | for (i = 0; i < rdev->gart.num_gpu_pages; i++) | 58 | for (i = 0; i < rdev->gart.num_gpu_pages; i++) |
62 | r600_gart_clear_page(rdev, i); | 59 | r600_gart_clear_page(rdev, i); |
63 | /* Setup L2 cache */ | 60 | /* Setup L2 cache */ |
@@ -98,10 +95,6 @@ void rv770_pcie_gart_disable(struct radeon_device *rdev) | |||
98 | u32 tmp; | 95 | u32 tmp; |
99 | int i; | 96 | int i; |
100 | 97 | ||
101 | /* Clear ptes*/ | ||
102 | for (i = 0; i < rdev->gart.num_gpu_pages; i++) | ||
103 | r600_gart_clear_page(rdev, i); | ||
104 | r600_pcie_gart_tlb_flush(rdev); | ||
105 | /* Disable all tables */ | 98 | /* Disable all tables */ |
106 | for (i = 0; i < 7; i++) | 99 | for (i = 0; i < 7; i++) |
107 | WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); | 100 | WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); |
@@ -120,6 +113,17 @@ void rv770_pcie_gart_disable(struct radeon_device *rdev) | |||
120 | WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); | 113 | WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); |
121 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); | 114 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); |
122 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); | 115 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); |
116 | if (rdev->gart.table.vram.robj) { | ||
117 | radeon_object_kunmap(rdev->gart.table.vram.robj); | ||
118 | radeon_object_unpin(rdev->gart.table.vram.robj); | ||
119 | } | ||
120 | } | ||
121 | |||
122 | void rv770_pcie_gart_fini(struct radeon_device *rdev) | ||
123 | { | ||
124 | rv770_pcie_gart_disable(rdev); | ||
125 | radeon_gart_table_vram_free(rdev); | ||
126 | radeon_gart_fini(rdev); | ||
123 | } | 127 | } |
124 | 128 | ||
125 | 129 | ||
@@ -871,6 +875,7 @@ int rv770_suspend(struct radeon_device *rdev) | |||
871 | { | 875 | { |
872 | /* FIXME: we should wait for ring to be empty */ | 876 | /* FIXME: we should wait for ring to be empty */ |
873 | r700_cp_stop(rdev); | 877 | r700_cp_stop(rdev); |
878 | rv770_pcie_gart_disable(rdev); | ||
874 | return 0; | 879 | return 0; |
875 | } | 880 | } |
876 | 881 | ||
@@ -944,6 +949,10 @@ int rv770_init(struct radeon_device *rdev) | |||
944 | } | 949 | } |
945 | } | 950 | } |
946 | 951 | ||
952 | r = r600_pcie_gart_init(rdev); | ||
953 | if (r) | ||
954 | return r; | ||
955 | |||
947 | r = rv770_resume(rdev); | 956 | r = rv770_resume(rdev); |
948 | if (r) { | 957 | if (r) { |
949 | if (rdev->flags & RADEON_IS_AGP) { | 958 | if (rdev->flags & RADEON_IS_AGP) { |
@@ -976,9 +985,7 @@ void rv770_fini(struct radeon_device *rdev) | |||
976 | { | 985 | { |
977 | r600_blit_fini(rdev); | 986 | r600_blit_fini(rdev); |
978 | radeon_ring_fini(rdev); | 987 | radeon_ring_fini(rdev); |
979 | rv770_pcie_gart_disable(rdev); | 988 | rv770_pcie_gart_fini(rdev); |
980 | radeon_gart_table_vram_free(rdev); | ||
981 | radeon_gart_fini(rdev); | ||
982 | radeon_gem_fini(rdev); | 989 | radeon_gem_fini(rdev); |
983 | radeon_fence_driver_fini(rdev); | 990 | radeon_fence_driver_fini(rdev); |
984 | radeon_clocks_fini(rdev); | 991 | radeon_clocks_fini(rdev); |