aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2009-11-22 21:01:09 -0500
committerDave Airlie <airlied@redhat.com>2009-12-01 20:37:11 -0500
commit23956dfa82eab95931aab5fa9886c1e96c41e4dc (patch)
treece7c40366ea7cefcb8f7314cfa3e74f764211a84
parent38e1492130c42ac806ffd8b21ccf64eb1c997d10 (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.c8
-rw-r--r--drivers/gpu/drm/radeon/r600.c4
-rw-r--r--drivers/gpu/drm/radeon/r600d.h1
-rw-r--r--drivers/gpu/drm/radeon/radeon.h2
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h12
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c1
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
1592void 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
1592void r100_hdp_reset(struct radeon_device *rdev) 1600void 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
1104void 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 */
976extern int radeon_gart_table_vram_pin(struct radeon_device *rdev); 978extern 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);
76void r100_bandwidth_update(struct radeon_device *rdev); 76void r100_bandwidth_update(struct radeon_device *rdev);
77void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 77void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
78int r100_ring_test(struct radeon_device *rdev); 78int r100_ring_test(struct radeon_device *rdev);
79void r100_hdp_flush(struct radeon_device *rdev);
79 80
80static struct radeon_asic r100_asic = { 81static 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);
455int r600_copy_blit(struct radeon_device *rdev, 464int 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);
467void r600_hdp_flush(struct radeon_device *rdev);
458 468
459static struct radeon_asic r600_asic = { 469static 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