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 /drivers | |
| 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>
Diffstat (limited to 'drivers')
| -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 | ||
