diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 544 |
1 files changed, 408 insertions, 136 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index c9e93eabcf16..cf60c0b3ef15 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -26,11 +26,13 @@ | |||
26 | * Jerome Glisse | 26 | * Jerome Glisse |
27 | */ | 27 | */ |
28 | #include <linux/seq_file.h> | 28 | #include <linux/seq_file.h> |
29 | #include <linux/slab.h> | ||
29 | #include "drmP.h" | 30 | #include "drmP.h" |
30 | #include "drm.h" | 31 | #include "drm.h" |
31 | #include "radeon_drm.h" | 32 | #include "radeon_drm.h" |
32 | #include "radeon_reg.h" | 33 | #include "radeon_reg.h" |
33 | #include "radeon.h" | 34 | #include "radeon.h" |
35 | #include "radeon_asic.h" | ||
34 | #include "r100d.h" | 36 | #include "r100d.h" |
35 | #include "rs100d.h" | 37 | #include "rs100d.h" |
36 | #include "rv200d.h" | 38 | #include "rv200d.h" |
@@ -65,6 +67,96 @@ MODULE_FIRMWARE(FIRMWARE_R520); | |||
65 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 | 67 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 |
66 | */ | 68 | */ |
67 | 69 | ||
70 | /* hpd for digital panel detect/disconnect */ | ||
71 | bool r100_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd) | ||
72 | { | ||
73 | bool connected = false; | ||
74 | |||
75 | switch (hpd) { | ||
76 | case RADEON_HPD_1: | ||
77 | if (RREG32(RADEON_FP_GEN_CNTL) & RADEON_FP_DETECT_SENSE) | ||
78 | connected = true; | ||
79 | break; | ||
80 | case RADEON_HPD_2: | ||
81 | if (RREG32(RADEON_FP2_GEN_CNTL) & RADEON_FP2_DETECT_SENSE) | ||
82 | connected = true; | ||
83 | break; | ||
84 | default: | ||
85 | break; | ||
86 | } | ||
87 | return connected; | ||
88 | } | ||
89 | |||
90 | void r100_hpd_set_polarity(struct radeon_device *rdev, | ||
91 | enum radeon_hpd_id hpd) | ||
92 | { | ||
93 | u32 tmp; | ||
94 | bool connected = r100_hpd_sense(rdev, hpd); | ||
95 | |||
96 | switch (hpd) { | ||
97 | case RADEON_HPD_1: | ||
98 | tmp = RREG32(RADEON_FP_GEN_CNTL); | ||
99 | if (connected) | ||
100 | tmp &= ~RADEON_FP_DETECT_INT_POL; | ||
101 | else | ||
102 | tmp |= RADEON_FP_DETECT_INT_POL; | ||
103 | WREG32(RADEON_FP_GEN_CNTL, tmp); | ||
104 | break; | ||
105 | case RADEON_HPD_2: | ||
106 | tmp = RREG32(RADEON_FP2_GEN_CNTL); | ||
107 | if (connected) | ||
108 | tmp &= ~RADEON_FP2_DETECT_INT_POL; | ||
109 | else | ||
110 | tmp |= RADEON_FP2_DETECT_INT_POL; | ||
111 | WREG32(RADEON_FP2_GEN_CNTL, tmp); | ||
112 | break; | ||
113 | default: | ||
114 | break; | ||
115 | } | ||
116 | } | ||
117 | |||
118 | void r100_hpd_init(struct radeon_device *rdev) | ||
119 | { | ||
120 | struct drm_device *dev = rdev->ddev; | ||
121 | struct drm_connector *connector; | ||
122 | |||
123 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
124 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | ||
125 | switch (radeon_connector->hpd.hpd) { | ||
126 | case RADEON_HPD_1: | ||
127 | rdev->irq.hpd[0] = true; | ||
128 | break; | ||
129 | case RADEON_HPD_2: | ||
130 | rdev->irq.hpd[1] = true; | ||
131 | break; | ||
132 | default: | ||
133 | break; | ||
134 | } | ||
135 | } | ||
136 | if (rdev->irq.installed) | ||
137 | r100_irq_set(rdev); | ||
138 | } | ||
139 | |||
140 | void r100_hpd_fini(struct radeon_device *rdev) | ||
141 | { | ||
142 | struct drm_device *dev = rdev->ddev; | ||
143 | struct drm_connector *connector; | ||
144 | |||
145 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
146 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | ||
147 | switch (radeon_connector->hpd.hpd) { | ||
148 | case RADEON_HPD_1: | ||
149 | rdev->irq.hpd[0] = false; | ||
150 | break; | ||
151 | case RADEON_HPD_2: | ||
152 | rdev->irq.hpd[1] = false; | ||
153 | break; | ||
154 | default: | ||
155 | break; | ||
156 | } | ||
157 | } | ||
158 | } | ||
159 | |||
68 | /* | 160 | /* |
69 | * PCI GART | 161 | * PCI GART |
70 | */ | 162 | */ |
@@ -94,20 +186,26 @@ int r100_pci_gart_init(struct radeon_device *rdev) | |||
94 | return radeon_gart_table_ram_alloc(rdev); | 186 | return radeon_gart_table_ram_alloc(rdev); |
95 | } | 187 | } |
96 | 188 | ||
189 | /* required on r1xx, r2xx, r300, r(v)350, r420/r481, rs400/rs480 */ | ||
190 | void r100_enable_bm(struct radeon_device *rdev) | ||
191 | { | ||
192 | uint32_t tmp; | ||
193 | /* Enable bus mastering */ | ||
194 | tmp = RREG32(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS; | ||
195 | WREG32(RADEON_BUS_CNTL, tmp); | ||
196 | } | ||
197 | |||
97 | int r100_pci_gart_enable(struct radeon_device *rdev) | 198 | int r100_pci_gart_enable(struct radeon_device *rdev) |
98 | { | 199 | { |
99 | uint32_t tmp; | 200 | uint32_t tmp; |
100 | 201 | ||
202 | radeon_gart_restore(rdev); | ||
101 | /* discard memory request outside of configured range */ | 203 | /* discard memory request outside of configured range */ |
102 | tmp = RREG32(RADEON_AIC_CNTL) | RADEON_DIS_OUT_OF_PCI_GART_ACCESS; | 204 | tmp = RREG32(RADEON_AIC_CNTL) | RADEON_DIS_OUT_OF_PCI_GART_ACCESS; |
103 | WREG32(RADEON_AIC_CNTL, tmp); | 205 | WREG32(RADEON_AIC_CNTL, tmp); |
104 | /* set address range for PCI address translate */ | 206 | /* set address range for PCI address translate */ |
105 | WREG32(RADEON_AIC_LO_ADDR, rdev->mc.gtt_location); | 207 | WREG32(RADEON_AIC_LO_ADDR, rdev->mc.gtt_start); |
106 | tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; | 208 | WREG32(RADEON_AIC_HI_ADDR, rdev->mc.gtt_end); |
107 | WREG32(RADEON_AIC_HI_ADDR, tmp); | ||
108 | /* Enable bus mastering */ | ||
109 | tmp = RREG32(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS; | ||
110 | WREG32(RADEON_BUS_CNTL, tmp); | ||
111 | /* set PCI GART page-table base address */ | 209 | /* set PCI GART page-table base address */ |
112 | WREG32(RADEON_AIC_PT_BASE, rdev->gart.table_addr); | 210 | WREG32(RADEON_AIC_PT_BASE, rdev->gart.table_addr); |
113 | tmp = RREG32(RADEON_AIC_CNTL) | RADEON_PCIGART_TRANSLATE_EN; | 211 | tmp = RREG32(RADEON_AIC_CNTL) | RADEON_PCIGART_TRANSLATE_EN; |
@@ -139,15 +237,20 @@ int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
139 | 237 | ||
140 | void r100_pci_gart_fini(struct radeon_device *rdev) | 238 | void r100_pci_gart_fini(struct radeon_device *rdev) |
141 | { | 239 | { |
240 | radeon_gart_fini(rdev); | ||
142 | r100_pci_gart_disable(rdev); | 241 | r100_pci_gart_disable(rdev); |
143 | radeon_gart_table_ram_free(rdev); | 242 | radeon_gart_table_ram_free(rdev); |
144 | radeon_gart_fini(rdev); | ||
145 | } | 243 | } |
146 | 244 | ||
147 | int r100_irq_set(struct radeon_device *rdev) | 245 | int r100_irq_set(struct radeon_device *rdev) |
148 | { | 246 | { |
149 | uint32_t tmp = 0; | 247 | uint32_t tmp = 0; |
150 | 248 | ||
249 | if (!rdev->irq.installed) { | ||
250 | WARN(1, "Can't enable IRQ/MSI because no handler is installed.\n"); | ||
251 | WREG32(R_000040_GEN_INT_CNTL, 0); | ||
252 | return -EINVAL; | ||
253 | } | ||
151 | if (rdev->irq.sw_int) { | 254 | if (rdev->irq.sw_int) { |
152 | tmp |= RADEON_SW_INT_ENABLE; | 255 | tmp |= RADEON_SW_INT_ENABLE; |
153 | } | 256 | } |
@@ -157,6 +260,12 @@ int r100_irq_set(struct radeon_device *rdev) | |||
157 | if (rdev->irq.crtc_vblank_int[1]) { | 260 | if (rdev->irq.crtc_vblank_int[1]) { |
158 | tmp |= RADEON_CRTC2_VBLANK_MASK; | 261 | tmp |= RADEON_CRTC2_VBLANK_MASK; |
159 | } | 262 | } |
263 | if (rdev->irq.hpd[0]) { | ||
264 | tmp |= RADEON_FP_DETECT_MASK; | ||
265 | } | ||
266 | if (rdev->irq.hpd[1]) { | ||
267 | tmp |= RADEON_FP2_DETECT_MASK; | ||
268 | } | ||
160 | WREG32(RADEON_GEN_INT_CNTL, tmp); | 269 | WREG32(RADEON_GEN_INT_CNTL, tmp); |
161 | return 0; | 270 | return 0; |
162 | } | 271 | } |
@@ -175,8 +284,9 @@ void r100_irq_disable(struct radeon_device *rdev) | |||
175 | static inline uint32_t r100_irq_ack(struct radeon_device *rdev) | 284 | static inline uint32_t r100_irq_ack(struct radeon_device *rdev) |
176 | { | 285 | { |
177 | uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS); | 286 | uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS); |
178 | uint32_t irq_mask = RADEON_SW_INT_TEST | RADEON_CRTC_VBLANK_STAT | | 287 | uint32_t irq_mask = RADEON_SW_INT_TEST | |
179 | RADEON_CRTC2_VBLANK_STAT; | 288 | RADEON_CRTC_VBLANK_STAT | RADEON_CRTC2_VBLANK_STAT | |
289 | RADEON_FP_DETECT_STAT | RADEON_FP2_DETECT_STAT; | ||
180 | 290 | ||
181 | if (irqs) { | 291 | if (irqs) { |
182 | WREG32(RADEON_GEN_INT_STATUS, irqs); | 292 | WREG32(RADEON_GEN_INT_STATUS, irqs); |
@@ -187,6 +297,7 @@ static inline uint32_t r100_irq_ack(struct radeon_device *rdev) | |||
187 | int r100_irq_process(struct radeon_device *rdev) | 297 | int r100_irq_process(struct radeon_device *rdev) |
188 | { | 298 | { |
189 | uint32_t status, msi_rearm; | 299 | uint32_t status, msi_rearm; |
300 | bool queue_hotplug = false; | ||
190 | 301 | ||
191 | status = r100_irq_ack(rdev); | 302 | status = r100_irq_ack(rdev); |
192 | if (!status) { | 303 | if (!status) { |
@@ -203,12 +314,26 @@ int r100_irq_process(struct radeon_device *rdev) | |||
203 | /* Vertical blank interrupts */ | 314 | /* Vertical blank interrupts */ |
204 | if (status & RADEON_CRTC_VBLANK_STAT) { | 315 | if (status & RADEON_CRTC_VBLANK_STAT) { |
205 | drm_handle_vblank(rdev->ddev, 0); | 316 | drm_handle_vblank(rdev->ddev, 0); |
317 | rdev->pm.vblank_sync = true; | ||
318 | wake_up(&rdev->irq.vblank_queue); | ||
206 | } | 319 | } |
207 | if (status & RADEON_CRTC2_VBLANK_STAT) { | 320 | if (status & RADEON_CRTC2_VBLANK_STAT) { |
208 | drm_handle_vblank(rdev->ddev, 1); | 321 | drm_handle_vblank(rdev->ddev, 1); |
322 | rdev->pm.vblank_sync = true; | ||
323 | wake_up(&rdev->irq.vblank_queue); | ||
324 | } | ||
325 | if (status & RADEON_FP_DETECT_STAT) { | ||
326 | queue_hotplug = true; | ||
327 | DRM_DEBUG("HPD1\n"); | ||
328 | } | ||
329 | if (status & RADEON_FP2_DETECT_STAT) { | ||
330 | queue_hotplug = true; | ||
331 | DRM_DEBUG("HPD2\n"); | ||
209 | } | 332 | } |
210 | status = r100_irq_ack(rdev); | 333 | status = r100_irq_ack(rdev); |
211 | } | 334 | } |
335 | if (queue_hotplug) | ||
336 | queue_work(rdev->wq, &rdev->hotplug_work); | ||
212 | if (rdev->msi_enabled) { | 337 | if (rdev->msi_enabled) { |
213 | switch (rdev->family) { | 338 | switch (rdev->family) { |
214 | case CHIP_RS400: | 339 | case CHIP_RS400: |
@@ -235,14 +360,25 @@ u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc) | |||
235 | return RREG32(RADEON_CRTC2_CRNT_FRAME); | 360 | return RREG32(RADEON_CRTC2_CRNT_FRAME); |
236 | } | 361 | } |
237 | 362 | ||
363 | /* Who ever call radeon_fence_emit should call ring_lock and ask | ||
364 | * for enough space (today caller are ib schedule and buffer move) */ | ||
238 | void r100_fence_ring_emit(struct radeon_device *rdev, | 365 | void r100_fence_ring_emit(struct radeon_device *rdev, |
239 | struct radeon_fence *fence) | 366 | struct radeon_fence *fence) |
240 | { | 367 | { |
241 | /* Who ever call radeon_fence_emit should call ring_lock and ask | 368 | /* We have to make sure that caches are flushed before |
242 | * for enough space (today caller are ib schedule and buffer move) */ | 369 | * CPU might read something from VRAM. */ |
370 | radeon_ring_write(rdev, PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); | ||
371 | radeon_ring_write(rdev, RADEON_RB3D_DC_FLUSH_ALL); | ||
372 | radeon_ring_write(rdev, PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); | ||
373 | radeon_ring_write(rdev, RADEON_RB3D_ZC_FLUSH_ALL); | ||
243 | /* Wait until IDLE & CLEAN */ | 374 | /* Wait until IDLE & CLEAN */ |
244 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); | 375 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); |
245 | radeon_ring_write(rdev, (1 << 16) | (1 << 17)); | 376 | radeon_ring_write(rdev, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); |
377 | radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); | ||
378 | radeon_ring_write(rdev, rdev->config.r100.hdp_cntl | | ||
379 | RADEON_HDP_READ_BUFFER_INVALIDATE); | ||
380 | radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); | ||
381 | radeon_ring_write(rdev, rdev->config.r100.hdp_cntl); | ||
246 | /* Emit fence sequence & fire IRQ */ | 382 | /* Emit fence sequence & fire IRQ */ |
247 | radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); | 383 | radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); |
248 | radeon_ring_write(rdev, fence->seq); | 384 | radeon_ring_write(rdev, fence->seq); |
@@ -255,24 +391,27 @@ int r100_wb_init(struct radeon_device *rdev) | |||
255 | int r; | 391 | int r; |
256 | 392 | ||
257 | if (rdev->wb.wb_obj == NULL) { | 393 | if (rdev->wb.wb_obj == NULL) { |
258 | r = radeon_object_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, | 394 | r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, true, |
259 | true, | 395 | RADEON_GEM_DOMAIN_GTT, |
260 | RADEON_GEM_DOMAIN_GTT, | 396 | &rdev->wb.wb_obj); |
261 | false, &rdev->wb.wb_obj); | ||
262 | if (r) { | 397 | if (r) { |
263 | DRM_ERROR("radeon: failed to create WB buffer (%d).\n", r); | 398 | dev_err(rdev->dev, "(%d) create WB buffer failed\n", r); |
264 | return r; | 399 | return r; |
265 | } | 400 | } |
266 | r = radeon_object_pin(rdev->wb.wb_obj, | 401 | r = radeon_bo_reserve(rdev->wb.wb_obj, false); |
267 | RADEON_GEM_DOMAIN_GTT, | 402 | if (unlikely(r != 0)) |
268 | &rdev->wb.gpu_addr); | 403 | return r; |
404 | r = radeon_bo_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT, | ||
405 | &rdev->wb.gpu_addr); | ||
269 | if (r) { | 406 | if (r) { |
270 | DRM_ERROR("radeon: failed to pin WB buffer (%d).\n", r); | 407 | dev_err(rdev->dev, "(%d) pin WB buffer failed\n", r); |
408 | radeon_bo_unreserve(rdev->wb.wb_obj); | ||
271 | return r; | 409 | return r; |
272 | } | 410 | } |
273 | r = radeon_object_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb); | 411 | r = radeon_bo_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb); |
412 | radeon_bo_unreserve(rdev->wb.wb_obj); | ||
274 | if (r) { | 413 | if (r) { |
275 | DRM_ERROR("radeon: failed to map WB buffer (%d).\n", r); | 414 | dev_err(rdev->dev, "(%d) map WB buffer failed\n", r); |
276 | return r; | 415 | return r; |
277 | } | 416 | } |
278 | } | 417 | } |
@@ -290,11 +429,19 @@ void r100_wb_disable(struct radeon_device *rdev) | |||
290 | 429 | ||
291 | void r100_wb_fini(struct radeon_device *rdev) | 430 | void r100_wb_fini(struct radeon_device *rdev) |
292 | { | 431 | { |
432 | int r; | ||
433 | |||
293 | r100_wb_disable(rdev); | 434 | r100_wb_disable(rdev); |
294 | if (rdev->wb.wb_obj) { | 435 | if (rdev->wb.wb_obj) { |
295 | radeon_object_kunmap(rdev->wb.wb_obj); | 436 | r = radeon_bo_reserve(rdev->wb.wb_obj, false); |
296 | radeon_object_unpin(rdev->wb.wb_obj); | 437 | if (unlikely(r != 0)) { |
297 | radeon_object_unref(&rdev->wb.wb_obj); | 438 | dev_err(rdev->dev, "(%d) can't finish WB\n", r); |
439 | return; | ||
440 | } | ||
441 | radeon_bo_kunmap(rdev->wb.wb_obj); | ||
442 | radeon_bo_unpin(rdev->wb.wb_obj); | ||
443 | radeon_bo_unreserve(rdev->wb.wb_obj); | ||
444 | radeon_bo_unref(&rdev->wb.wb_obj); | ||
298 | rdev->wb.wb = NULL; | 445 | rdev->wb.wb = NULL; |
299 | rdev->wb.wb_obj = NULL; | 446 | rdev->wb.wb_obj = NULL; |
300 | } | 447 | } |
@@ -598,6 +745,8 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size) | |||
598 | udelay(10); | 745 | udelay(10); |
599 | rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR); | 746 | rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR); |
600 | rdev->cp.wptr = RREG32(RADEON_CP_RB_WPTR); | 747 | rdev->cp.wptr = RREG32(RADEON_CP_RB_WPTR); |
748 | /* protect against crazy HW on resume */ | ||
749 | rdev->cp.wptr &= rdev->cp.ptr_mask; | ||
601 | /* Set cp mode to bus mastering & enable cp*/ | 750 | /* Set cp mode to bus mastering & enable cp*/ |
602 | WREG32(RADEON_CP_CSQ_MODE, | 751 | WREG32(RADEON_CP_CSQ_MODE, |
603 | REG_SET(RADEON_INDIRECT2_START, indirect2_start) | | 752 | REG_SET(RADEON_INDIRECT2_START, indirect2_start) | |
@@ -1250,7 +1399,6 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1250 | case RADEON_TXFORMAT_ARGB4444: | 1399 | case RADEON_TXFORMAT_ARGB4444: |
1251 | case RADEON_TXFORMAT_VYUY422: | 1400 | case RADEON_TXFORMAT_VYUY422: |
1252 | case RADEON_TXFORMAT_YVYU422: | 1401 | case RADEON_TXFORMAT_YVYU422: |
1253 | case RADEON_TXFORMAT_DXT1: | ||
1254 | case RADEON_TXFORMAT_SHADOW16: | 1402 | case RADEON_TXFORMAT_SHADOW16: |
1255 | case RADEON_TXFORMAT_LDUDV655: | 1403 | case RADEON_TXFORMAT_LDUDV655: |
1256 | case RADEON_TXFORMAT_DUDV88: | 1404 | case RADEON_TXFORMAT_DUDV88: |
@@ -1258,12 +1406,19 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1258 | break; | 1406 | break; |
1259 | case RADEON_TXFORMAT_ARGB8888: | 1407 | case RADEON_TXFORMAT_ARGB8888: |
1260 | case RADEON_TXFORMAT_RGBA8888: | 1408 | case RADEON_TXFORMAT_RGBA8888: |
1261 | case RADEON_TXFORMAT_DXT23: | ||
1262 | case RADEON_TXFORMAT_DXT45: | ||
1263 | case RADEON_TXFORMAT_SHADOW32: | 1409 | case RADEON_TXFORMAT_SHADOW32: |
1264 | case RADEON_TXFORMAT_LDUDUV8888: | 1410 | case RADEON_TXFORMAT_LDUDUV8888: |
1265 | track->textures[i].cpp = 4; | 1411 | track->textures[i].cpp = 4; |
1266 | break; | 1412 | break; |
1413 | case RADEON_TXFORMAT_DXT1: | ||
1414 | track->textures[i].cpp = 1; | ||
1415 | track->textures[i].compress_format = R100_TRACK_COMP_DXT1; | ||
1416 | break; | ||
1417 | case RADEON_TXFORMAT_DXT23: | ||
1418 | case RADEON_TXFORMAT_DXT45: | ||
1419 | track->textures[i].cpp = 1; | ||
1420 | track->textures[i].compress_format = R100_TRACK_COMP_DXT35; | ||
1421 | break; | ||
1267 | } | 1422 | } |
1268 | track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf); | 1423 | track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf); |
1269 | track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf); | 1424 | track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf); |
@@ -1288,17 +1443,17 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1288 | 1443 | ||
1289 | int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p, | 1444 | int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p, |
1290 | struct radeon_cs_packet *pkt, | 1445 | struct radeon_cs_packet *pkt, |
1291 | struct radeon_object *robj) | 1446 | struct radeon_bo *robj) |
1292 | { | 1447 | { |
1293 | unsigned idx; | 1448 | unsigned idx; |
1294 | u32 value; | 1449 | u32 value; |
1295 | idx = pkt->idx + 1; | 1450 | idx = pkt->idx + 1; |
1296 | value = radeon_get_ib_value(p, idx + 2); | 1451 | value = radeon_get_ib_value(p, idx + 2); |
1297 | if ((value + 1) > radeon_object_size(robj)) { | 1452 | if ((value + 1) > radeon_bo_size(robj)) { |
1298 | DRM_ERROR("[drm] Buffer too small for PACKET3 INDX_BUFFER " | 1453 | DRM_ERROR("[drm] Buffer too small for PACKET3 INDX_BUFFER " |
1299 | "(need %u have %lu) !\n", | 1454 | "(need %u have %lu) !\n", |
1300 | value + 1, | 1455 | value + 1, |
1301 | radeon_object_size(robj)); | 1456 | radeon_bo_size(robj)); |
1302 | return -EINVAL; | 1457 | return -EINVAL; |
1303 | } | 1458 | } |
1304 | return 0; | 1459 | return 0; |
@@ -1363,6 +1518,7 @@ static int r100_packet3_check(struct radeon_cs_parser *p, | |||
1363 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); | 1518 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1364 | return -EINVAL; | 1519 | return -EINVAL; |
1365 | } | 1520 | } |
1521 | track->vtx_size = r100_get_vtx_size(radeon_get_ib_value(p, idx + 0)); | ||
1366 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); | 1522 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1367 | track->immd_dwords = pkt->count - 1; | 1523 | track->immd_dwords = pkt->count - 1; |
1368 | r = r100_cs_track_check(p->rdev, track); | 1524 | r = r100_cs_track_check(p->rdev, track); |
@@ -1553,7 +1709,7 @@ int r100_gui_wait_for_idle(struct radeon_device *rdev) | |||
1553 | } | 1709 | } |
1554 | for (i = 0; i < rdev->usec_timeout; i++) { | 1710 | for (i = 0; i < rdev->usec_timeout; i++) { |
1555 | tmp = RREG32(RADEON_RBBM_STATUS); | 1711 | tmp = RREG32(RADEON_RBBM_STATUS); |
1556 | if (!(tmp & (1 << 31))) { | 1712 | if (!(tmp & RADEON_RBBM_ACTIVE)) { |
1557 | return 0; | 1713 | return 0; |
1558 | } | 1714 | } |
1559 | DRM_UDELAY(1); | 1715 | DRM_UDELAY(1); |
@@ -1568,8 +1724,8 @@ int r100_mc_wait_for_idle(struct radeon_device *rdev) | |||
1568 | 1724 | ||
1569 | for (i = 0; i < rdev->usec_timeout; i++) { | 1725 | for (i = 0; i < rdev->usec_timeout; i++) { |
1570 | /* read MC_STATUS */ | 1726 | /* read MC_STATUS */ |
1571 | tmp = RREG32(0x0150); | 1727 | tmp = RREG32(RADEON_MC_STATUS); |
1572 | if (tmp & (1 << 2)) { | 1728 | if (tmp & RADEON_MC_IDLE) { |
1573 | return 0; | 1729 | return 0; |
1574 | } | 1730 | } |
1575 | DRM_UDELAY(1); | 1731 | DRM_UDELAY(1); |
@@ -1642,7 +1798,7 @@ int r100_gpu_reset(struct radeon_device *rdev) | |||
1642 | } | 1798 | } |
1643 | /* Check if GPU is idle */ | 1799 | /* Check if GPU is idle */ |
1644 | status = RREG32(RADEON_RBBM_STATUS); | 1800 | status = RREG32(RADEON_RBBM_STATUS); |
1645 | if (status & (1 << 31)) { | 1801 | if (status & RADEON_RBBM_ACTIVE) { |
1646 | DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status); | 1802 | DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status); |
1647 | return -1; | 1803 | return -1; |
1648 | } | 1804 | } |
@@ -1650,6 +1806,89 @@ int r100_gpu_reset(struct radeon_device *rdev) | |||
1650 | return 0; | 1806 | return 0; |
1651 | } | 1807 | } |
1652 | 1808 | ||
1809 | void r100_set_common_regs(struct radeon_device *rdev) | ||
1810 | { | ||
1811 | struct drm_device *dev = rdev->ddev; | ||
1812 | bool force_dac2 = false; | ||
1813 | u32 tmp; | ||
1814 | |||
1815 | /* set these so they don't interfere with anything */ | ||
1816 | WREG32(RADEON_OV0_SCALE_CNTL, 0); | ||
1817 | WREG32(RADEON_SUBPIC_CNTL, 0); | ||
1818 | WREG32(RADEON_VIPH_CONTROL, 0); | ||
1819 | WREG32(RADEON_I2C_CNTL_1, 0); | ||
1820 | WREG32(RADEON_DVI_I2C_CNTL_1, 0); | ||
1821 | WREG32(RADEON_CAP0_TRIG_CNTL, 0); | ||
1822 | WREG32(RADEON_CAP1_TRIG_CNTL, 0); | ||
1823 | |||
1824 | /* always set up dac2 on rn50 and some rv100 as lots | ||
1825 | * of servers seem to wire it up to a VGA port but | ||
1826 | * don't report it in the bios connector | ||
1827 | * table. | ||
1828 | */ | ||
1829 | switch (dev->pdev->device) { | ||
1830 | /* RN50 */ | ||
1831 | case 0x515e: | ||
1832 | case 0x5969: | ||
1833 | force_dac2 = true; | ||
1834 | break; | ||
1835 | /* RV100*/ | ||
1836 | case 0x5159: | ||
1837 | case 0x515a: | ||
1838 | /* DELL triple head servers */ | ||
1839 | if ((dev->pdev->subsystem_vendor == 0x1028 /* DELL */) && | ||
1840 | ((dev->pdev->subsystem_device == 0x016c) || | ||
1841 | (dev->pdev->subsystem_device == 0x016d) || | ||
1842 | (dev->pdev->subsystem_device == 0x016e) || | ||
1843 | (dev->pdev->subsystem_device == 0x016f) || | ||
1844 | (dev->pdev->subsystem_device == 0x0170) || | ||
1845 | (dev->pdev->subsystem_device == 0x017d) || | ||
1846 | (dev->pdev->subsystem_device == 0x017e) || | ||
1847 | (dev->pdev->subsystem_device == 0x0183) || | ||
1848 | (dev->pdev->subsystem_device == 0x018a) || | ||
1849 | (dev->pdev->subsystem_device == 0x019a))) | ||
1850 | force_dac2 = true; | ||
1851 | break; | ||
1852 | } | ||
1853 | |||
1854 | if (force_dac2) { | ||
1855 | u32 disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG); | ||
1856 | u32 tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL); | ||
1857 | u32 dac2_cntl = RREG32(RADEON_DAC_CNTL2); | ||
1858 | |||
1859 | /* For CRT on DAC2, don't turn it on if BIOS didn't | ||
1860 | enable it, even it's detected. | ||
1861 | */ | ||
1862 | |||
1863 | /* force it to crtc0 */ | ||
1864 | dac2_cntl &= ~RADEON_DAC2_DAC_CLK_SEL; | ||
1865 | dac2_cntl |= RADEON_DAC2_DAC2_CLK_SEL; | ||
1866 | disp_hw_debug |= RADEON_CRT2_DISP1_SEL; | ||
1867 | |||
1868 | /* set up the TV DAC */ | ||
1869 | tv_dac_cntl &= ~(RADEON_TV_DAC_PEDESTAL | | ||
1870 | RADEON_TV_DAC_STD_MASK | | ||
1871 | RADEON_TV_DAC_RDACPD | | ||
1872 | RADEON_TV_DAC_GDACPD | | ||
1873 | RADEON_TV_DAC_BDACPD | | ||
1874 | RADEON_TV_DAC_BGADJ_MASK | | ||
1875 | RADEON_TV_DAC_DACADJ_MASK); | ||
1876 | tv_dac_cntl |= (RADEON_TV_DAC_NBLANK | | ||
1877 | RADEON_TV_DAC_NHOLD | | ||
1878 | RADEON_TV_DAC_STD_PS2 | | ||
1879 | (0x58 << 16)); | ||
1880 | |||
1881 | WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); | ||
1882 | WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug); | ||
1883 | WREG32(RADEON_DAC_CNTL2, dac2_cntl); | ||
1884 | } | ||
1885 | |||
1886 | /* switch PM block to ACPI mode */ | ||
1887 | tmp = RREG32_PLL(RADEON_PLL_PWRMGT_CNTL); | ||
1888 | tmp &= ~RADEON_PM_MODE_SEL; | ||
1889 | WREG32_PLL(RADEON_PLL_PWRMGT_CNTL, tmp); | ||
1890 | |||
1891 | } | ||
1653 | 1892 | ||
1654 | /* | 1893 | /* |
1655 | * VRAM info | 1894 | * VRAM info |
@@ -1730,17 +1969,20 @@ static u32 r100_get_accessible_vram(struct radeon_device *rdev) | |||
1730 | void r100_vram_init_sizes(struct radeon_device *rdev) | 1969 | void r100_vram_init_sizes(struct radeon_device *rdev) |
1731 | { | 1970 | { |
1732 | u64 config_aper_size; | 1971 | u64 config_aper_size; |
1733 | u32 accessible; | ||
1734 | 1972 | ||
1973 | /* work out accessible VRAM */ | ||
1974 | rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); | ||
1975 | rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); | ||
1976 | rdev->mc.visible_vram_size = r100_get_accessible_vram(rdev); | ||
1977 | /* FIXME we don't use the second aperture yet when we could use it */ | ||
1978 | if (rdev->mc.visible_vram_size > rdev->mc.aper_size) | ||
1979 | rdev->mc.visible_vram_size = rdev->mc.aper_size; | ||
1735 | config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE); | 1980 | config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE); |
1736 | |||
1737 | if (rdev->flags & RADEON_IS_IGP) { | 1981 | if (rdev->flags & RADEON_IS_IGP) { |
1738 | uint32_t tom; | 1982 | uint32_t tom; |
1739 | /* read NB_TOM to get the amount of ram stolen for the GPU */ | 1983 | /* read NB_TOM to get the amount of ram stolen for the GPU */ |
1740 | tom = RREG32(RADEON_NB_TOM); | 1984 | tom = RREG32(RADEON_NB_TOM); |
1741 | rdev->mc.real_vram_size = (((tom >> 16) - (tom & 0xffff) + 1) << 16); | 1985 | rdev->mc.real_vram_size = (((tom >> 16) - (tom & 0xffff) + 1) << 16); |
1742 | /* for IGPs we need to keep VRAM where it was put by the BIOS */ | ||
1743 | rdev->mc.vram_location = (tom & 0xffff) << 16; | ||
1744 | WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size); | 1986 | WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size); |
1745 | rdev->mc.mc_vram_size = rdev->mc.real_vram_size; | 1987 | rdev->mc.mc_vram_size = rdev->mc.real_vram_size; |
1746 | } else { | 1988 | } else { |
@@ -1752,30 +1994,19 @@ void r100_vram_init_sizes(struct radeon_device *rdev) | |||
1752 | rdev->mc.real_vram_size = 8192 * 1024; | 1994 | rdev->mc.real_vram_size = 8192 * 1024; |
1753 | WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size); | 1995 | WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size); |
1754 | } | 1996 | } |
1755 | /* let driver place VRAM */ | 1997 | /* Fix for RN50, M6, M7 with 8/16/32(??) MBs of VRAM - |
1756 | rdev->mc.vram_location = 0xFFFFFFFFUL; | 1998 | * Novell bug 204882 + along with lots of ubuntu ones |
1757 | /* Fix for RN50, M6, M7 with 8/16/32(??) MBs of VRAM - | 1999 | */ |
1758 | * Novell bug 204882 + along with lots of ubuntu ones */ | ||
1759 | if (config_aper_size > rdev->mc.real_vram_size) | 2000 | if (config_aper_size > rdev->mc.real_vram_size) |
1760 | rdev->mc.mc_vram_size = config_aper_size; | 2001 | rdev->mc.mc_vram_size = config_aper_size; |
1761 | else | 2002 | else |
1762 | rdev->mc.mc_vram_size = rdev->mc.real_vram_size; | 2003 | rdev->mc.mc_vram_size = rdev->mc.real_vram_size; |
1763 | } | 2004 | } |
1764 | 2005 | /* FIXME remove this once we support unmappable VRAM */ | |
1765 | /* work out accessible VRAM */ | 2006 | if (rdev->mc.mc_vram_size > rdev->mc.aper_size) { |
1766 | accessible = r100_get_accessible_vram(rdev); | ||
1767 | |||
1768 | rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); | ||
1769 | rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); | ||
1770 | |||
1771 | if (accessible > rdev->mc.aper_size) | ||
1772 | accessible = rdev->mc.aper_size; | ||
1773 | |||
1774 | if (rdev->mc.mc_vram_size > rdev->mc.aper_size) | ||
1775 | rdev->mc.mc_vram_size = rdev->mc.aper_size; | 2007 | rdev->mc.mc_vram_size = rdev->mc.aper_size; |
1776 | |||
1777 | if (rdev->mc.real_vram_size > rdev->mc.aper_size) | ||
1778 | rdev->mc.real_vram_size = rdev->mc.aper_size; | 2008 | rdev->mc.real_vram_size = rdev->mc.aper_size; |
2009 | } | ||
1779 | } | 2010 | } |
1780 | 2011 | ||
1781 | void r100_vga_set_state(struct radeon_device *rdev, bool state) | 2012 | void r100_vga_set_state(struct radeon_device *rdev, bool state) |
@@ -1792,11 +2023,19 @@ void r100_vga_set_state(struct radeon_device *rdev, bool state) | |||
1792 | WREG32(RADEON_CONFIG_CNTL, temp); | 2023 | WREG32(RADEON_CONFIG_CNTL, temp); |
1793 | } | 2024 | } |
1794 | 2025 | ||
1795 | void r100_vram_info(struct radeon_device *rdev) | 2026 | void r100_mc_init(struct radeon_device *rdev) |
1796 | { | 2027 | { |
1797 | r100_vram_get_type(rdev); | 2028 | u64 base; |
1798 | 2029 | ||
2030 | r100_vram_get_type(rdev); | ||
1799 | r100_vram_init_sizes(rdev); | 2031 | r100_vram_init_sizes(rdev); |
2032 | base = rdev->mc.aper_base; | ||
2033 | if (rdev->flags & RADEON_IS_IGP) | ||
2034 | base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; | ||
2035 | radeon_vram_location(rdev, &rdev->mc, base); | ||
2036 | if (!(rdev->flags & RADEON_IS_AGP)) | ||
2037 | radeon_gtt_location(rdev, &rdev->mc); | ||
2038 | radeon_update_bandwidth_info(rdev); | ||
1800 | } | 2039 | } |
1801 | 2040 | ||
1802 | 2041 | ||
@@ -2160,6 +2399,8 @@ void r100_bandwidth_update(struct radeon_device *rdev) | |||
2160 | uint32_t pixel_bytes1 = 0; | 2399 | uint32_t pixel_bytes1 = 0; |
2161 | uint32_t pixel_bytes2 = 0; | 2400 | uint32_t pixel_bytes2 = 0; |
2162 | 2401 | ||
2402 | radeon_update_display_priority(rdev); | ||
2403 | |||
2163 | if (rdev->mode_info.crtcs[0]->base.enabled) { | 2404 | if (rdev->mode_info.crtcs[0]->base.enabled) { |
2164 | mode1 = &rdev->mode_info.crtcs[0]->base.mode; | 2405 | mode1 = &rdev->mode_info.crtcs[0]->base.mode; |
2165 | pixel_bytes1 = rdev->mode_info.crtcs[0]->base.fb->bits_per_pixel / 8; | 2406 | pixel_bytes1 = rdev->mode_info.crtcs[0]->base.fb->bits_per_pixel / 8; |
@@ -2188,11 +2429,8 @@ void r100_bandwidth_update(struct radeon_device *rdev) | |||
2188 | /* | 2429 | /* |
2189 | * determine is there is enough bw for current mode | 2430 | * determine is there is enough bw for current mode |
2190 | */ | 2431 | */ |
2191 | mclk_ff.full = rfixed_const(rdev->clock.default_mclk); | 2432 | sclk_ff = rdev->pm.sclk; |
2192 | temp_ff.full = rfixed_const(100); | 2433 | mclk_ff = rdev->pm.mclk; |
2193 | mclk_ff.full = rfixed_div(mclk_ff, temp_ff); | ||
2194 | sclk_ff.full = rfixed_const(rdev->clock.default_sclk); | ||
2195 | sclk_ff.full = rfixed_div(sclk_ff, temp_ff); | ||
2196 | 2434 | ||
2197 | temp = (rdev->mc.vram_width / 8) * (rdev->mc.vram_is_ddr ? 2 : 1); | 2435 | temp = (rdev->mc.vram_width / 8) * (rdev->mc.vram_is_ddr ? 2 : 1); |
2198 | temp_ff.full = rfixed_const(temp); | 2436 | temp_ff.full = rfixed_const(temp); |
@@ -2588,13 +2826,14 @@ static inline void r100_cs_track_texture_print(struct r100_cs_track_texture *t) | |||
2588 | DRM_ERROR("coordinate type %d\n", t->tex_coord_type); | 2826 | DRM_ERROR("coordinate type %d\n", t->tex_coord_type); |
2589 | DRM_ERROR("width round to power of 2 %d\n", t->roundup_w); | 2827 | DRM_ERROR("width round to power of 2 %d\n", t->roundup_w); |
2590 | DRM_ERROR("height round to power of 2 %d\n", t->roundup_h); | 2828 | DRM_ERROR("height round to power of 2 %d\n", t->roundup_h); |
2829 | DRM_ERROR("compress format %d\n", t->compress_format); | ||
2591 | } | 2830 | } |
2592 | 2831 | ||
2593 | static int r100_cs_track_cube(struct radeon_device *rdev, | 2832 | static int r100_cs_track_cube(struct radeon_device *rdev, |
2594 | struct r100_cs_track *track, unsigned idx) | 2833 | struct r100_cs_track *track, unsigned idx) |
2595 | { | 2834 | { |
2596 | unsigned face, w, h; | 2835 | unsigned face, w, h; |
2597 | struct radeon_object *cube_robj; | 2836 | struct radeon_bo *cube_robj; |
2598 | unsigned long size; | 2837 | unsigned long size; |
2599 | 2838 | ||
2600 | for (face = 0; face < 5; face++) { | 2839 | for (face = 0; face < 5; face++) { |
@@ -2607,9 +2846,9 @@ static int r100_cs_track_cube(struct radeon_device *rdev, | |||
2607 | 2846 | ||
2608 | size += track->textures[idx].cube_info[face].offset; | 2847 | size += track->textures[idx].cube_info[face].offset; |
2609 | 2848 | ||
2610 | if (size > radeon_object_size(cube_robj)) { | 2849 | if (size > radeon_bo_size(cube_robj)) { |
2611 | DRM_ERROR("Cube texture offset greater than object size %lu %lu\n", | 2850 | DRM_ERROR("Cube texture offset greater than object size %lu %lu\n", |
2612 | size, radeon_object_size(cube_robj)); | 2851 | size, radeon_bo_size(cube_robj)); |
2613 | r100_cs_track_texture_print(&track->textures[idx]); | 2852 | r100_cs_track_texture_print(&track->textures[idx]); |
2614 | return -1; | 2853 | return -1; |
2615 | } | 2854 | } |
@@ -2617,12 +2856,42 @@ static int r100_cs_track_cube(struct radeon_device *rdev, | |||
2617 | return 0; | 2856 | return 0; |
2618 | } | 2857 | } |
2619 | 2858 | ||
2859 | static int r100_track_compress_size(int compress_format, int w, int h) | ||
2860 | { | ||
2861 | int block_width, block_height, block_bytes; | ||
2862 | int wblocks, hblocks; | ||
2863 | int min_wblocks; | ||
2864 | int sz; | ||
2865 | |||
2866 | block_width = 4; | ||
2867 | block_height = 4; | ||
2868 | |||
2869 | switch (compress_format) { | ||
2870 | case R100_TRACK_COMP_DXT1: | ||
2871 | block_bytes = 8; | ||
2872 | min_wblocks = 4; | ||
2873 | break; | ||
2874 | default: | ||
2875 | case R100_TRACK_COMP_DXT35: | ||
2876 | block_bytes = 16; | ||
2877 | min_wblocks = 2; | ||
2878 | break; | ||
2879 | } | ||
2880 | |||
2881 | hblocks = (h + block_height - 1) / block_height; | ||
2882 | wblocks = (w + block_width - 1) / block_width; | ||
2883 | if (wblocks < min_wblocks) | ||
2884 | wblocks = min_wblocks; | ||
2885 | sz = wblocks * hblocks * block_bytes; | ||
2886 | return sz; | ||
2887 | } | ||
2888 | |||
2620 | static int r100_cs_track_texture_check(struct radeon_device *rdev, | 2889 | static int r100_cs_track_texture_check(struct radeon_device *rdev, |
2621 | struct r100_cs_track *track) | 2890 | struct r100_cs_track *track) |
2622 | { | 2891 | { |
2623 | struct radeon_object *robj; | 2892 | struct radeon_bo *robj; |
2624 | unsigned long size; | 2893 | unsigned long size; |
2625 | unsigned u, i, w, h; | 2894 | unsigned u, i, w, h, d; |
2626 | int ret; | 2895 | int ret; |
2627 | 2896 | ||
2628 | for (u = 0; u < track->num_texture; u++) { | 2897 | for (u = 0; u < track->num_texture; u++) { |
@@ -2654,14 +2923,25 @@ static int r100_cs_track_texture_check(struct radeon_device *rdev, | |||
2654 | h = h / (1 << i); | 2923 | h = h / (1 << i); |
2655 | if (track->textures[u].roundup_h) | 2924 | if (track->textures[u].roundup_h) |
2656 | h = roundup_pow_of_two(h); | 2925 | h = roundup_pow_of_two(h); |
2657 | size += w * h; | 2926 | if (track->textures[u].tex_coord_type == 1) { |
2927 | d = (1 << track->textures[u].txdepth) / (1 << i); | ||
2928 | if (!d) | ||
2929 | d = 1; | ||
2930 | } else { | ||
2931 | d = 1; | ||
2932 | } | ||
2933 | if (track->textures[u].compress_format) { | ||
2934 | |||
2935 | size += r100_track_compress_size(track->textures[u].compress_format, w, h) * d; | ||
2936 | /* compressed textures are block based */ | ||
2937 | } else | ||
2938 | size += w * h * d; | ||
2658 | } | 2939 | } |
2659 | size *= track->textures[u].cpp; | 2940 | size *= track->textures[u].cpp; |
2941 | |||
2660 | switch (track->textures[u].tex_coord_type) { | 2942 | switch (track->textures[u].tex_coord_type) { |
2661 | case 0: | 2943 | case 0: |
2662 | break; | ||
2663 | case 1: | 2944 | case 1: |
2664 | size *= (1 << track->textures[u].txdepth); | ||
2665 | break; | 2945 | break; |
2666 | case 2: | 2946 | case 2: |
2667 | if (track->separate_cube) { | 2947 | if (track->separate_cube) { |
@@ -2676,9 +2956,9 @@ static int r100_cs_track_texture_check(struct radeon_device *rdev, | |||
2676 | "%u\n", track->textures[u].tex_coord_type, u); | 2956 | "%u\n", track->textures[u].tex_coord_type, u); |
2677 | return -EINVAL; | 2957 | return -EINVAL; |
2678 | } | 2958 | } |
2679 | if (size > radeon_object_size(robj)) { | 2959 | if (size > radeon_bo_size(robj)) { |
2680 | DRM_ERROR("Texture of unit %u needs %lu bytes but is " | 2960 | DRM_ERROR("Texture of unit %u needs %lu bytes but is " |
2681 | "%lu\n", u, size, radeon_object_size(robj)); | 2961 | "%lu\n", u, size, radeon_bo_size(robj)); |
2682 | r100_cs_track_texture_print(&track->textures[u]); | 2962 | r100_cs_track_texture_print(&track->textures[u]); |
2683 | return -EINVAL; | 2963 | return -EINVAL; |
2684 | } | 2964 | } |
@@ -2695,15 +2975,19 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track) | |||
2695 | 2975 | ||
2696 | for (i = 0; i < track->num_cb; i++) { | 2976 | for (i = 0; i < track->num_cb; i++) { |
2697 | if (track->cb[i].robj == NULL) { | 2977 | if (track->cb[i].robj == NULL) { |
2978 | if (!(track->zb_cb_clear || track->color_channel_mask || | ||
2979 | track->blend_read_enable)) { | ||
2980 | continue; | ||
2981 | } | ||
2698 | DRM_ERROR("[drm] No buffer for color buffer %d !\n", i); | 2982 | DRM_ERROR("[drm] No buffer for color buffer %d !\n", i); |
2699 | return -EINVAL; | 2983 | return -EINVAL; |
2700 | } | 2984 | } |
2701 | size = track->cb[i].pitch * track->cb[i].cpp * track->maxy; | 2985 | size = track->cb[i].pitch * track->cb[i].cpp * track->maxy; |
2702 | size += track->cb[i].offset; | 2986 | size += track->cb[i].offset; |
2703 | if (size > radeon_object_size(track->cb[i].robj)) { | 2987 | if (size > radeon_bo_size(track->cb[i].robj)) { |
2704 | DRM_ERROR("[drm] Buffer too small for color buffer %d " | 2988 | DRM_ERROR("[drm] Buffer too small for color buffer %d " |
2705 | "(need %lu have %lu) !\n", i, size, | 2989 | "(need %lu have %lu) !\n", i, size, |
2706 | radeon_object_size(track->cb[i].robj)); | 2990 | radeon_bo_size(track->cb[i].robj)); |
2707 | DRM_ERROR("[drm] color buffer %d (%u %u %u %u)\n", | 2991 | DRM_ERROR("[drm] color buffer %d (%u %u %u %u)\n", |
2708 | i, track->cb[i].pitch, track->cb[i].cpp, | 2992 | i, track->cb[i].pitch, track->cb[i].cpp, |
2709 | track->cb[i].offset, track->maxy); | 2993 | track->cb[i].offset, track->maxy); |
@@ -2717,10 +3001,10 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track) | |||
2717 | } | 3001 | } |
2718 | size = track->zb.pitch * track->zb.cpp * track->maxy; | 3002 | size = track->zb.pitch * track->zb.cpp * track->maxy; |
2719 | size += track->zb.offset; | 3003 | size += track->zb.offset; |
2720 | if (size > radeon_object_size(track->zb.robj)) { | 3004 | if (size > radeon_bo_size(track->zb.robj)) { |
2721 | DRM_ERROR("[drm] Buffer too small for z buffer " | 3005 | DRM_ERROR("[drm] Buffer too small for z buffer " |
2722 | "(need %lu have %lu) !\n", size, | 3006 | "(need %lu have %lu) !\n", size, |
2723 | radeon_object_size(track->zb.robj)); | 3007 | radeon_bo_size(track->zb.robj)); |
2724 | DRM_ERROR("[drm] zbuffer (%u %u %u %u)\n", | 3008 | DRM_ERROR("[drm] zbuffer (%u %u %u %u)\n", |
2725 | track->zb.pitch, track->zb.cpp, | 3009 | track->zb.pitch, track->zb.cpp, |
2726 | track->zb.offset, track->maxy); | 3010 | track->zb.offset, track->maxy); |
@@ -2728,7 +3012,11 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track) | |||
2728 | } | 3012 | } |
2729 | } | 3013 | } |
2730 | prim_walk = (track->vap_vf_cntl >> 4) & 0x3; | 3014 | prim_walk = (track->vap_vf_cntl >> 4) & 0x3; |
2731 | nverts = (track->vap_vf_cntl >> 16) & 0xFFFF; | 3015 | if (track->vap_vf_cntl & (1 << 14)) { |
3016 | nverts = track->vap_alt_nverts; | ||
3017 | } else { | ||
3018 | nverts = (track->vap_vf_cntl >> 16) & 0xFFFF; | ||
3019 | } | ||
2732 | switch (prim_walk) { | 3020 | switch (prim_walk) { |
2733 | case 1: | 3021 | case 1: |
2734 | for (i = 0; i < track->num_arrays; i++) { | 3022 | for (i = 0; i < track->num_arrays; i++) { |
@@ -2738,11 +3026,12 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track) | |||
2738 | "bound\n", prim_walk, i); | 3026 | "bound\n", prim_walk, i); |
2739 | return -EINVAL; | 3027 | return -EINVAL; |
2740 | } | 3028 | } |
2741 | if (size > radeon_object_size(track->arrays[i].robj)) { | 3029 | if (size > radeon_bo_size(track->arrays[i].robj)) { |
2742 | DRM_ERROR("(PW %u) Vertex array %u need %lu dwords " | 3030 | dev_err(rdev->dev, "(PW %u) Vertex array %u " |
2743 | "have %lu dwords\n", prim_walk, i, | 3031 | "need %lu dwords have %lu dwords\n", |
2744 | size >> 2, | 3032 | prim_walk, i, size >> 2, |
2745 | radeon_object_size(track->arrays[i].robj) >> 2); | 3033 | radeon_bo_size(track->arrays[i].robj) |
3034 | >> 2); | ||
2746 | DRM_ERROR("Max indices %u\n", track->max_indx); | 3035 | DRM_ERROR("Max indices %u\n", track->max_indx); |
2747 | return -EINVAL; | 3036 | return -EINVAL; |
2748 | } | 3037 | } |
@@ -2756,10 +3045,12 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track) | |||
2756 | "bound\n", prim_walk, i); | 3045 | "bound\n", prim_walk, i); |
2757 | return -EINVAL; | 3046 | return -EINVAL; |
2758 | } | 3047 | } |
2759 | if (size > radeon_object_size(track->arrays[i].robj)) { | 3048 | if (size > radeon_bo_size(track->arrays[i].robj)) { |
2760 | DRM_ERROR("(PW %u) Vertex array %u need %lu dwords " | 3049 | dev_err(rdev->dev, "(PW %u) Vertex array %u " |
2761 | "have %lu dwords\n", prim_walk, i, size >> 2, | 3050 | "need %lu dwords have %lu dwords\n", |
2762 | radeon_object_size(track->arrays[i].robj) >> 2); | 3051 | prim_walk, i, size >> 2, |
3052 | radeon_bo_size(track->arrays[i].robj) | ||
3053 | >> 2); | ||
2763 | return -EINVAL; | 3054 | return -EINVAL; |
2764 | } | 3055 | } |
2765 | } | 3056 | } |
@@ -2821,6 +3112,7 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track | |||
2821 | track->arrays[i].esize = 0x7F; | 3112 | track->arrays[i].esize = 0x7F; |
2822 | } | 3113 | } |
2823 | for (i = 0; i < track->num_texture; i++) { | 3114 | for (i = 0; i < track->num_texture; i++) { |
3115 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
2824 | track->textures[i].pitch = 16536; | 3116 | track->textures[i].pitch = 16536; |
2825 | track->textures[i].width = 16536; | 3117 | track->textures[i].width = 16536; |
2826 | track->textures[i].height = 16536; | 3118 | track->textures[i].height = 16536; |
@@ -3022,10 +3314,9 @@ void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save) | |||
3022 | void r100_mc_resume(struct radeon_device *rdev, struct r100_mc_save *save) | 3314 | void r100_mc_resume(struct radeon_device *rdev, struct r100_mc_save *save) |
3023 | { | 3315 | { |
3024 | /* Update base address for crtc */ | 3316 | /* Update base address for crtc */ |
3025 | WREG32(R_00023C_DISPLAY_BASE_ADDR, rdev->mc.vram_location); | 3317 | WREG32(R_00023C_DISPLAY_BASE_ADDR, rdev->mc.vram_start); |
3026 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) { | 3318 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) { |
3027 | WREG32(R_00033C_CRTC2_DISPLAY_BASE_ADDR, | 3319 | WREG32(R_00033C_CRTC2_DISPLAY_BASE_ADDR, rdev->mc.vram_start); |
3028 | rdev->mc.vram_location); | ||
3029 | } | 3320 | } |
3030 | /* Restore CRTC registers */ | 3321 | /* Restore CRTC registers */ |
3031 | WREG8(R_0003C2_GENMO_WT, save->GENMO_WT); | 3322 | WREG8(R_0003C2_GENMO_WT, save->GENMO_WT); |
@@ -3101,6 +3392,9 @@ static int r100_startup(struct radeon_device *rdev) | |||
3101 | { | 3392 | { |
3102 | int r; | 3393 | int r; |
3103 | 3394 | ||
3395 | /* set common regs */ | ||
3396 | r100_set_common_regs(rdev); | ||
3397 | /* program mc */ | ||
3104 | r100_mc_program(rdev); | 3398 | r100_mc_program(rdev); |
3105 | /* Resume clock */ | 3399 | /* Resume clock */ |
3106 | r100_clock_startup(rdev); | 3400 | r100_clock_startup(rdev); |
@@ -3108,14 +3402,15 @@ static int r100_startup(struct radeon_device *rdev) | |||
3108 | r100_gpu_init(rdev); | 3402 | r100_gpu_init(rdev); |
3109 | /* Initialize GART (initialize after TTM so we can allocate | 3403 | /* Initialize GART (initialize after TTM so we can allocate |
3110 | * memory through TTM but finalize after TTM) */ | 3404 | * memory through TTM but finalize after TTM) */ |
3405 | r100_enable_bm(rdev); | ||
3111 | if (rdev->flags & RADEON_IS_PCI) { | 3406 | if (rdev->flags & RADEON_IS_PCI) { |
3112 | r = r100_pci_gart_enable(rdev); | 3407 | r = r100_pci_gart_enable(rdev); |
3113 | if (r) | 3408 | if (r) |
3114 | return r; | 3409 | return r; |
3115 | } | 3410 | } |
3116 | /* Enable IRQ */ | 3411 | /* Enable IRQ */ |
3117 | rdev->irq.sw_int = true; | ||
3118 | r100_irq_set(rdev); | 3412 | r100_irq_set(rdev); |
3413 | rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
3119 | /* 1M ring buffer */ | 3414 | /* 1M ring buffer */ |
3120 | r = r100_cp_init(rdev, 1024 * 1024); | 3415 | r = r100_cp_init(rdev, 1024 * 1024); |
3121 | if (r) { | 3416 | if (r) { |
@@ -3150,6 +3445,8 @@ int r100_resume(struct radeon_device *rdev) | |||
3150 | radeon_combios_asic_init(rdev->ddev); | 3445 | radeon_combios_asic_init(rdev->ddev); |
3151 | /* Resume clock after posting */ | 3446 | /* Resume clock after posting */ |
3152 | r100_clock_startup(rdev); | 3447 | r100_clock_startup(rdev); |
3448 | /* Initialize surface registers */ | ||
3449 | radeon_surface_init(rdev); | ||
3153 | return r100_startup(rdev); | 3450 | return r100_startup(rdev); |
3154 | } | 3451 | } |
3155 | 3452 | ||
@@ -3165,49 +3462,22 @@ int r100_suspend(struct radeon_device *rdev) | |||
3165 | 3462 | ||
3166 | void r100_fini(struct radeon_device *rdev) | 3463 | void r100_fini(struct radeon_device *rdev) |
3167 | { | 3464 | { |
3168 | r100_suspend(rdev); | 3465 | radeon_pm_fini(rdev); |
3169 | r100_cp_fini(rdev); | 3466 | r100_cp_fini(rdev); |
3170 | r100_wb_fini(rdev); | 3467 | r100_wb_fini(rdev); |
3171 | r100_ib_fini(rdev); | 3468 | r100_ib_fini(rdev); |
3172 | radeon_gem_fini(rdev); | 3469 | radeon_gem_fini(rdev); |
3173 | if (rdev->flags & RADEON_IS_PCI) | 3470 | if (rdev->flags & RADEON_IS_PCI) |
3174 | r100_pci_gart_fini(rdev); | 3471 | r100_pci_gart_fini(rdev); |
3472 | radeon_agp_fini(rdev); | ||
3175 | radeon_irq_kms_fini(rdev); | 3473 | radeon_irq_kms_fini(rdev); |
3176 | radeon_fence_driver_fini(rdev); | 3474 | radeon_fence_driver_fini(rdev); |
3177 | radeon_object_fini(rdev); | 3475 | radeon_bo_fini(rdev); |
3178 | radeon_atombios_fini(rdev); | 3476 | radeon_atombios_fini(rdev); |
3179 | kfree(rdev->bios); | 3477 | kfree(rdev->bios); |
3180 | rdev->bios = NULL; | 3478 | rdev->bios = NULL; |
3181 | } | 3479 | } |
3182 | 3480 | ||
3183 | int r100_mc_init(struct radeon_device *rdev) | ||
3184 | { | ||
3185 | int r; | ||
3186 | u32 tmp; | ||
3187 | |||
3188 | /* Setup GPU memory space */ | ||
3189 | rdev->mc.vram_location = 0xFFFFFFFFUL; | ||
3190 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
3191 | if (rdev->flags & RADEON_IS_IGP) { | ||
3192 | tmp = G_00015C_MC_FB_START(RREG32(R_00015C_NB_TOM)); | ||
3193 | rdev->mc.vram_location = tmp << 16; | ||
3194 | } | ||
3195 | if (rdev->flags & RADEON_IS_AGP) { | ||
3196 | r = radeon_agp_init(rdev); | ||
3197 | if (r) { | ||
3198 | printk(KERN_WARNING "[drm] Disabling AGP\n"); | ||
3199 | rdev->flags &= ~RADEON_IS_AGP; | ||
3200 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | ||
3201 | } else { | ||
3202 | rdev->mc.gtt_location = rdev->mc.agp_base; | ||
3203 | } | ||
3204 | } | ||
3205 | r = radeon_mc_setup(rdev); | ||
3206 | if (r) | ||
3207 | return r; | ||
3208 | return 0; | ||
3209 | } | ||
3210 | |||
3211 | int r100_init(struct radeon_device *rdev) | 3481 | int r100_init(struct radeon_device *rdev) |
3212 | { | 3482 | { |
3213 | int r; | 3483 | int r; |
@@ -3242,20 +3512,23 @@ int r100_init(struct radeon_device *rdev) | |||
3242 | RREG32(R_0007C0_CP_STAT)); | 3512 | RREG32(R_0007C0_CP_STAT)); |
3243 | } | 3513 | } |
3244 | /* check if cards are posted or not */ | 3514 | /* check if cards are posted or not */ |
3245 | if (!radeon_card_posted(rdev) && rdev->bios) { | 3515 | if (radeon_boot_test_post_card(rdev) == false) |
3246 | DRM_INFO("GPU not posted. posting now...\n"); | 3516 | return -EINVAL; |
3247 | radeon_combios_asic_init(rdev->ddev); | ||
3248 | } | ||
3249 | /* Set asic errata */ | 3517 | /* Set asic errata */ |
3250 | r100_errata(rdev); | 3518 | r100_errata(rdev); |
3251 | /* Initialize clocks */ | 3519 | /* Initialize clocks */ |
3252 | radeon_get_clock_info(rdev->ddev); | 3520 | radeon_get_clock_info(rdev->ddev); |
3253 | /* Get vram informations */ | 3521 | /* Initialize power management */ |
3254 | r100_vram_info(rdev); | 3522 | radeon_pm_init(rdev); |
3255 | /* Initialize memory controller (also test AGP) */ | 3523 | /* initialize AGP */ |
3256 | r = r100_mc_init(rdev); | 3524 | if (rdev->flags & RADEON_IS_AGP) { |
3257 | if (r) | 3525 | r = radeon_agp_init(rdev); |
3258 | return r; | 3526 | if (r) { |
3527 | radeon_agp_disable(rdev); | ||
3528 | } | ||
3529 | } | ||
3530 | /* initialize VRAM */ | ||
3531 | r100_mc_init(rdev); | ||
3259 | /* Fence driver */ | 3532 | /* Fence driver */ |
3260 | r = radeon_fence_driver_init(rdev); | 3533 | r = radeon_fence_driver_init(rdev); |
3261 | if (r) | 3534 | if (r) |
@@ -3264,7 +3537,7 @@ int r100_init(struct radeon_device *rdev) | |||
3264 | if (r) | 3537 | if (r) |
3265 | return r; | 3538 | return r; |
3266 | /* Memory manager */ | 3539 | /* Memory manager */ |
3267 | r = radeon_object_init(rdev); | 3540 | r = radeon_bo_init(rdev); |
3268 | if (r) | 3541 | if (r) |
3269 | return r; | 3542 | return r; |
3270 | if (rdev->flags & RADEON_IS_PCI) { | 3543 | if (rdev->flags & RADEON_IS_PCI) { |
@@ -3278,13 +3551,12 @@ int r100_init(struct radeon_device *rdev) | |||
3278 | if (r) { | 3551 | if (r) { |
3279 | /* Somethings want wront with the accel init stop accel */ | 3552 | /* Somethings want wront with the accel init stop accel */ |
3280 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 3553 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
3281 | r100_suspend(rdev); | ||
3282 | r100_cp_fini(rdev); | 3554 | r100_cp_fini(rdev); |
3283 | r100_wb_fini(rdev); | 3555 | r100_wb_fini(rdev); |
3284 | r100_ib_fini(rdev); | 3556 | r100_ib_fini(rdev); |
3557 | radeon_irq_kms_fini(rdev); | ||
3285 | if (rdev->flags & RADEON_IS_PCI) | 3558 | if (rdev->flags & RADEON_IS_PCI) |
3286 | r100_pci_gart_fini(rdev); | 3559 | r100_pci_gart_fini(rdev); |
3287 | radeon_irq_kms_fini(rdev); | ||
3288 | rdev->accel_working = false; | 3560 | rdev->accel_working = false; |
3289 | } | 3561 | } |
3290 | return 0; | 3562 | return 0; |