diff options
author | Dave Airlie <airlied@redhat.com> | 2009-11-22 21:01:09 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2009-12-01 20:37:11 -0500 |
commit | 23956dfa82eab95931aab5fa9886c1e96c41e4dc (patch) | |
tree | ce7c40366ea7cefcb8f7314cfa3e74f764211a84 | |
parent | 38e1492130c42ac806ffd8b21ccf64eb1c997d10 (diff) |
drm/radeon/kms: add HDP flushing for all GPUs.
rendercheck under kms on r600s was failing due to HDP flushing not happening.
This adds HDP flushing to the object wait function for r100->r700 families.
rendercheck passes basic tests on r600 with this change.
Acked-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600d.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.c | 1 |
6 files changed, 28 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 4e0a80467b44..772bcd863741 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -1589,6 +1589,14 @@ void r100_gpu_init(struct radeon_device *rdev) | |||
1589 | r100_hdp_reset(rdev); | 1589 | r100_hdp_reset(rdev); |
1590 | } | 1590 | } |
1591 | 1591 | ||
1592 | void r100_hdp_flush(struct radeon_device *rdev) | ||
1593 | { | ||
1594 | u32 tmp; | ||
1595 | tmp = RREG32(RADEON_HOST_PATH_CNTL); | ||
1596 | tmp |= RADEON_HDP_READ_BUFFER_INVALIDATE; | ||
1597 | WREG32(RADEON_HOST_PATH_CNTL, tmp); | ||
1598 | } | ||
1599 | |||
1592 | void r100_hdp_reset(struct radeon_device *rdev) | 1600 | void r100_hdp_reset(struct radeon_device *rdev) |
1593 | { | 1601 | { |
1594 | uint32_t tmp; | 1602 | uint32_t tmp; |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 278f646bc18e..797a36f9a0f4 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -1101,6 +1101,10 @@ void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v) | |||
1101 | (void)RREG32(PCIE_PORT_DATA); | 1101 | (void)RREG32(PCIE_PORT_DATA); |
1102 | } | 1102 | } |
1103 | 1103 | ||
1104 | void r600_hdp_flush(struct radeon_device *rdev) | ||
1105 | { | ||
1106 | WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); | ||
1107 | } | ||
1104 | 1108 | ||
1105 | /* | 1109 | /* |
1106 | * CP & Ring | 1110 | * CP & Ring |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 27ab428b149b..b7f4ce2270bc 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
@@ -674,4 +674,5 @@ | |||
674 | #define S_000E60_SOFT_RESET_TSC(x) (((x) & 1) << 16) | 674 | #define S_000E60_SOFT_RESET_TSC(x) (((x) & 1) << 16) |
675 | #define S_000E60_SOFT_RESET_VMC(x) (((x) & 1) << 17) | 675 | #define S_000E60_SOFT_RESET_VMC(x) (((x) & 1) << 17) |
676 | 676 | ||
677 | #define R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL 0x5480 | ||
677 | #endif | 678 | #endif |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 9cb81a805d14..c32fe1cec818 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -639,6 +639,7 @@ struct radeon_asic { | |||
639 | uint32_t offset, uint32_t obj_size); | 639 | uint32_t offset, uint32_t obj_size); |
640 | int (*clear_surface_reg)(struct radeon_device *rdev, int reg); | 640 | int (*clear_surface_reg)(struct radeon_device *rdev, int reg); |
641 | void (*bandwidth_update)(struct radeon_device *rdev); | 641 | void (*bandwidth_update)(struct radeon_device *rdev); |
642 | void (*hdp_flush)(struct radeon_device *rdev); | ||
642 | }; | 643 | }; |
643 | 644 | ||
644 | /* | 645 | /* |
@@ -971,6 +972,7 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v) | |||
971 | #define radeon_set_surface_reg(rdev, r, f, p, o, s) ((rdev)->asic->set_surface_reg((rdev), (r), (f), (p), (o), (s))) | 972 | #define radeon_set_surface_reg(rdev, r, f, p, o, s) ((rdev)->asic->set_surface_reg((rdev), (r), (f), (p), (o), (s))) |
972 | #define radeon_clear_surface_reg(rdev, r) ((rdev)->asic->clear_surface_reg((rdev), (r))) | 973 | #define radeon_clear_surface_reg(rdev, r) ((rdev)->asic->clear_surface_reg((rdev), (r))) |
973 | #define radeon_bandwidth_update(rdev) (rdev)->asic->bandwidth_update((rdev)) | 974 | #define radeon_bandwidth_update(rdev) (rdev)->asic->bandwidth_update((rdev)) |
975 | #define radeon_hdp_flush(rdev) (rdev)->asic->hdp_flush((rdev)) | ||
974 | 976 | ||
975 | /* Common functions */ | 977 | /* Common functions */ |
976 | extern int radeon_gart_table_vram_pin(struct radeon_device *rdev); | 978 | extern int radeon_gart_table_vram_pin(struct radeon_device *rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index c18fbee387d7..c7a7f84fe3ec 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
@@ -76,6 +76,7 @@ int r100_clear_surface_reg(struct radeon_device *rdev, int reg); | |||
76 | void r100_bandwidth_update(struct radeon_device *rdev); | 76 | void r100_bandwidth_update(struct radeon_device *rdev); |
77 | void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 77 | void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
78 | int r100_ring_test(struct radeon_device *rdev); | 78 | int r100_ring_test(struct radeon_device *rdev); |
79 | void r100_hdp_flush(struct radeon_device *rdev); | ||
79 | 80 | ||
80 | static struct radeon_asic r100_asic = { | 81 | static struct radeon_asic r100_asic = { |
81 | .init = &r100_init, | 82 | .init = &r100_init, |
@@ -107,6 +108,7 @@ static struct radeon_asic r100_asic = { | |||
107 | .set_surface_reg = r100_set_surface_reg, | 108 | .set_surface_reg = r100_set_surface_reg, |
108 | .clear_surface_reg = r100_clear_surface_reg, | 109 | .clear_surface_reg = r100_clear_surface_reg, |
109 | .bandwidth_update = &r100_bandwidth_update, | 110 | .bandwidth_update = &r100_bandwidth_update, |
111 | .hdp_flush = &r100_hdp_flush, | ||
110 | }; | 112 | }; |
111 | 113 | ||
112 | 114 | ||
@@ -162,6 +164,7 @@ static struct radeon_asic r300_asic = { | |||
162 | .set_surface_reg = r100_set_surface_reg, | 164 | .set_surface_reg = r100_set_surface_reg, |
163 | .clear_surface_reg = r100_clear_surface_reg, | 165 | .clear_surface_reg = r100_clear_surface_reg, |
164 | .bandwidth_update = &r100_bandwidth_update, | 166 | .bandwidth_update = &r100_bandwidth_update, |
167 | .hdp_flush = &r100_hdp_flush, | ||
165 | }; | 168 | }; |
166 | 169 | ||
167 | /* | 170 | /* |
@@ -201,6 +204,7 @@ static struct radeon_asic r420_asic = { | |||
201 | .set_surface_reg = r100_set_surface_reg, | 204 | .set_surface_reg = r100_set_surface_reg, |
202 | .clear_surface_reg = r100_clear_surface_reg, | 205 | .clear_surface_reg = r100_clear_surface_reg, |
203 | .bandwidth_update = &r100_bandwidth_update, | 206 | .bandwidth_update = &r100_bandwidth_update, |
207 | .hdp_flush = &r100_hdp_flush, | ||
204 | }; | 208 | }; |
205 | 209 | ||
206 | 210 | ||
@@ -245,6 +249,7 @@ static struct radeon_asic rs400_asic = { | |||
245 | .set_surface_reg = r100_set_surface_reg, | 249 | .set_surface_reg = r100_set_surface_reg, |
246 | .clear_surface_reg = r100_clear_surface_reg, | 250 | .clear_surface_reg = r100_clear_surface_reg, |
247 | .bandwidth_update = &r100_bandwidth_update, | 251 | .bandwidth_update = &r100_bandwidth_update, |
252 | .hdp_flush = &r100_hdp_flush, | ||
248 | }; | 253 | }; |
249 | 254 | ||
250 | 255 | ||
@@ -291,6 +296,7 @@ static struct radeon_asic rs600_asic = { | |||
291 | .set_pcie_lanes = NULL, | 296 | .set_pcie_lanes = NULL, |
292 | .set_clock_gating = &radeon_atom_set_clock_gating, | 297 | .set_clock_gating = &radeon_atom_set_clock_gating, |
293 | .bandwidth_update = &rs600_bandwidth_update, | 298 | .bandwidth_update = &rs600_bandwidth_update, |
299 | .hdp_flush = &r100_hdp_flush, | ||
294 | }; | 300 | }; |
295 | 301 | ||
296 | 302 | ||
@@ -334,6 +340,7 @@ static struct radeon_asic rs690_asic = { | |||
334 | .set_surface_reg = r100_set_surface_reg, | 340 | .set_surface_reg = r100_set_surface_reg, |
335 | .clear_surface_reg = r100_clear_surface_reg, | 341 | .clear_surface_reg = r100_clear_surface_reg, |
336 | .bandwidth_update = &rs690_bandwidth_update, | 342 | .bandwidth_update = &rs690_bandwidth_update, |
343 | .hdp_flush = &r100_hdp_flush, | ||
337 | }; | 344 | }; |
338 | 345 | ||
339 | 346 | ||
@@ -381,6 +388,7 @@ static struct radeon_asic rv515_asic = { | |||
381 | .set_surface_reg = r100_set_surface_reg, | 388 | .set_surface_reg = r100_set_surface_reg, |
382 | .clear_surface_reg = r100_clear_surface_reg, | 389 | .clear_surface_reg = r100_clear_surface_reg, |
383 | .bandwidth_update = &rv515_bandwidth_update, | 390 | .bandwidth_update = &rv515_bandwidth_update, |
391 | .hdp_flush = &r100_hdp_flush, | ||
384 | }; | 392 | }; |
385 | 393 | ||
386 | 394 | ||
@@ -419,6 +427,7 @@ static struct radeon_asic r520_asic = { | |||
419 | .set_surface_reg = r100_set_surface_reg, | 427 | .set_surface_reg = r100_set_surface_reg, |
420 | .clear_surface_reg = r100_clear_surface_reg, | 428 | .clear_surface_reg = r100_clear_surface_reg, |
421 | .bandwidth_update = &rv515_bandwidth_update, | 429 | .bandwidth_update = &rv515_bandwidth_update, |
430 | .hdp_flush = &r100_hdp_flush, | ||
422 | }; | 431 | }; |
423 | 432 | ||
424 | /* | 433 | /* |
@@ -455,6 +464,7 @@ int r600_ring_test(struct radeon_device *rdev); | |||
455 | int r600_copy_blit(struct radeon_device *rdev, | 464 | int r600_copy_blit(struct radeon_device *rdev, |
456 | uint64_t src_offset, uint64_t dst_offset, | 465 | uint64_t src_offset, uint64_t dst_offset, |
457 | unsigned num_pages, struct radeon_fence *fence); | 466 | unsigned num_pages, struct radeon_fence *fence); |
467 | void r600_hdp_flush(struct radeon_device *rdev); | ||
458 | 468 | ||
459 | static struct radeon_asic r600_asic = { | 469 | static struct radeon_asic r600_asic = { |
460 | .init = &r600_init, | 470 | .init = &r600_init, |
@@ -484,6 +494,7 @@ static struct radeon_asic r600_asic = { | |||
484 | .set_surface_reg = r600_set_surface_reg, | 494 | .set_surface_reg = r600_set_surface_reg, |
485 | .clear_surface_reg = r600_clear_surface_reg, | 495 | .clear_surface_reg = r600_clear_surface_reg, |
486 | .bandwidth_update = &rv515_bandwidth_update, | 496 | .bandwidth_update = &rv515_bandwidth_update, |
497 | .hdp_flush = &r600_hdp_flush, | ||
487 | }; | 498 | }; |
488 | 499 | ||
489 | /* | 500 | /* |
@@ -523,6 +534,7 @@ static struct radeon_asic rv770_asic = { | |||
523 | .set_surface_reg = r600_set_surface_reg, | 534 | .set_surface_reg = r600_set_surface_reg, |
524 | .clear_surface_reg = r600_clear_surface_reg, | 535 | .clear_surface_reg = r600_clear_surface_reg, |
525 | .bandwidth_update = &rv515_bandwidth_update, | 536 | .bandwidth_update = &rv515_bandwidth_update, |
537 | .hdp_flush = &r600_hdp_flush, | ||
526 | }; | 538 | }; |
527 | 539 | ||
528 | #endif | 540 | #endif |
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 1f056dadc5c2..98835f51e35e 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
@@ -315,6 +315,7 @@ int radeon_object_wait(struct radeon_object *robj) | |||
315 | } | 315 | } |
316 | spin_unlock(&robj->tobj.lock); | 316 | spin_unlock(&robj->tobj.lock); |
317 | radeon_object_unreserve(robj); | 317 | radeon_object_unreserve(robj); |
318 | radeon_hdp_flush(robj->rdev); | ||
318 | return r; | 319 | return r; |
319 | } | 320 | } |
320 | 321 | ||