* [PATCH 1/4] drm/radeon: move ring syncing after bo validation
@ 2012-02-23 14:18 Christian König
2012-02-23 14:18 ` [PATCH 2/4] drm/radeon/kms: no need to align IB like this Christian König
` (4 more replies)
0 siblings, 5 replies; 12+ messages in thread
From: Christian König @ 2012-02-23 14:18 UTC (permalink / raw)
To: dri-devel; +Cc: Christian König
The function radeon_bo_list_validate can cause a
bo to move, resulting in a different sync_obj
and a dependency to wait for this move to finish.
Signed-off-by: Christian König <deathsimple@vodafone.de>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
---
drivers/gpu/drm/radeon/radeon.h | 1 -
drivers/gpu/drm/radeon/radeon_cs.c | 21 ++++++++++++++-------
2 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 884e0d4..4c1b981 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -836,7 +836,6 @@ struct radeon_cs_parser {
struct radeon_cs_reloc *relocs;
struct radeon_cs_reloc **relocs_ptr;
struct list_head validated;
- bool sync_to_ring[RADEON_NUM_RINGS];
/* indices of various chunks */
int chunk_ib_idx;
int chunk_relocs_idx;
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index 435a3d9..7fd0987 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -85,12 +85,6 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
radeon_bo_list_add_object(&p->relocs[i].lobj,
&p->validated);
- if (p->relocs[i].robj->tbo.sync_obj && !(r->flags & RADEON_RELOC_DONT_SYNC)) {
- struct radeon_fence *fence = p->relocs[i].robj->tbo.sync_obj;
- if (!radeon_fence_signaled(fence)) {
- p->sync_to_ring[fence->ring] = true;
- }
- }
} else
p->relocs[i].handle = 0;
}
@@ -118,11 +112,24 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority
static int radeon_cs_sync_rings(struct radeon_cs_parser *p)
{
+ bool sync_to_ring[RADEON_NUM_RINGS] = { };
int i, r;
+ for (i = 0; i < p->nrelocs; i++) {
+ if (!p->relocs[i].robj || !p->relocs[i].robj->tbo.sync_obj)
+ continue;
+
+ if (!(p->relocs[i].flags & RADEON_RELOC_DONT_SYNC)) {
+ struct radeon_fence *fence = p->relocs[i].robj->tbo.sync_obj;
+ if (!radeon_fence_signaled(fence)) {
+ sync_to_ring[fence->ring] = true;
+ }
+ }
+ }
+
for (i = 0; i < RADEON_NUM_RINGS; ++i) {
/* no need to sync to our own or unused rings */
- if (i == p->ring || !p->sync_to_ring[i] || !p->rdev->ring[i].ready)
+ if (i == p->ring || !sync_to_ring[i] || !p->rdev->ring[i].ready)
continue;
if (!p->ib->fence->semaphore) {
--
1.7.5.4
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH 2/4] drm/radeon/kms: no need to align IB like this 2012-02-23 14:18 [PATCH 1/4] drm/radeon: move ring syncing after bo validation Christian König @ 2012-02-23 14:18 ` Christian König 2012-02-23 17:00 ` Jerome Glisse 2012-02-23 14:18 ` [PATCH 3/4] drm/radeon: also make the cs_parse function per ring Christian König ` (3 subsequent siblings) 4 siblings, 1 reply; 12+ messages in thread From: Christian König @ 2012-02-23 14:18 UTC (permalink / raw) To: dri-devel; +Cc: Christian König So don't confuse devs by doing so. Signed-off-by: Christian König <deathsimple@vodafone.de> --- drivers/gpu/drm/radeon/r600.c | 15 +-------------- 1 files changed, 1 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 4f08e5e..4a4ac8f 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c @@ -2719,20 +2719,7 @@ int r600_ib_test(struct radeon_device *rdev, int ring) ib->ptr[0] = PACKET3(PACKET3_SET_CONFIG_REG, 1); ib->ptr[1] = ((scratch - PACKET3_SET_CONFIG_REG_OFFSET) >> 2); ib->ptr[2] = 0xDEADBEEF; - ib->ptr[3] = PACKET2(0); - ib->ptr[4] = PACKET2(0); - ib->ptr[5] = PACKET2(0); - ib->ptr[6] = PACKET2(0); - ib->ptr[7] = PACKET2(0); - ib->ptr[8] = PACKET2(0); - ib->ptr[9] = PACKET2(0); - ib->ptr[10] = PACKET2(0); - ib->ptr[11] = PACKET2(0); - ib->ptr[12] = PACKET2(0); - ib->ptr[13] = PACKET2(0); - ib->ptr[14] = PACKET2(0); - ib->ptr[15] = PACKET2(0); - ib->length_dw = 16; + ib->length_dw = 3; r = radeon_ib_schedule(rdev, ib); if (r) { radeon_scratch_free(rdev, scratch); -- 1.7.5.4 _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 2/4] drm/radeon/kms: no need to align IB like this 2012-02-23 14:18 ` [PATCH 2/4] drm/radeon/kms: no need to align IB like this Christian König @ 2012-02-23 17:00 ` Jerome Glisse 2012-02-23 18:19 ` Christian König 0 siblings, 1 reply; 12+ messages in thread From: Jerome Glisse @ 2012-02-23 17:00 UTC (permalink / raw) To: Christian König; +Cc: dri-devel [-- Attachment #1.1: Type: text/plain, Size: 1508 bytes --] 2012/2/23 Christian König <deathsimple@vodafone.de> > So don't confuse devs by doing so. > > Signed-off-by: Christian König <deathsimple@vodafone.de> > --- > drivers/gpu/drm/radeon/r600.c | 15 +-------------- > 1 files changed, 1 insertions(+), 14 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c > index 4f08e5e..4a4ac8f 100644 > --- a/drivers/gpu/drm/radeon/r600.c > +++ b/drivers/gpu/drm/radeon/r600.c > @@ -2719,20 +2719,7 @@ int r600_ib_test(struct radeon_device *rdev, int > ring) > ib->ptr[0] = PACKET3(PACKET3_SET_CONFIG_REG, 1); > ib->ptr[1] = ((scratch - PACKET3_SET_CONFIG_REG_OFFSET) >> 2); > ib->ptr[2] = 0xDEADBEEF; > - ib->ptr[3] = PACKET2(0); > - ib->ptr[4] = PACKET2(0); > - ib->ptr[5] = PACKET2(0); > - ib->ptr[6] = PACKET2(0); > - ib->ptr[7] = PACKET2(0); > - ib->ptr[8] = PACKET2(0); > - ib->ptr[9] = PACKET2(0); > - ib->ptr[10] = PACKET2(0); > - ib->ptr[11] = PACKET2(0); > - ib->ptr[12] = PACKET2(0); > - ib->ptr[13] = PACKET2(0); > - ib->ptr[14] = PACKET2(0); > - ib->ptr[15] = PACKET2(0); > - ib->length_dw = 16; > + ib->length_dw = 3; > r = radeon_ib_schedule(rdev, ib); > if (r) { > radeon_scratch_free(rdev, scratch); > -- > 1.7.5.4 > You sure about that ? I remember this helped with GPU lockup and i also seen fglrx aligning IB. Cheers, Jerome [-- Attachment #1.2: Type: text/html, Size: 1987 bytes --] [-- Attachment #2: Type: text/plain, Size: 159 bytes --] _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/4] drm/radeon/kms: no need to align IB like this 2012-02-23 17:00 ` Jerome Glisse @ 2012-02-23 18:19 ` Christian König 0 siblings, 0 replies; 12+ messages in thread From: Christian König @ 2012-02-23 18:19 UTC (permalink / raw) To: Jerome Glisse; +Cc: dri-devel [-- Attachment #1.1: Type: text/plain, Size: 2133 bytes --] On 23.02.2012 18:00, Jerome Glisse wrote: > > 2012/2/23 Christian König <deathsimple@vodafone.de > <mailto:deathsimple@vodafone.de>> > > So don't confuse devs by doing so. > > Signed-off-by: Christian König <deathsimple@vodafone.de > <mailto:deathsimple@vodafone..de>> > --- > drivers/gpu/drm/radeon/r600.c | 15 +-------------- > 1 files changed, 1 insertions(+), 14 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/r600.c > b/drivers/gpu/drm/radeon/r600.c > index 4f08e5e..4a4ac8f 100644 > --- a/drivers/gpu/drm/radeon/r600.c > +++ b/drivers/gpu/drm/radeon/r600.c > @@ -2719,20 +2719,7 @@ int r600_ib_test(struct radeon_device > *rdev, int ring) > ib->ptr[0] = PACKET3(PACKET3_SET_CONFIG_REG, 1); > ib->ptr[1] = ((scratch - PACKET3_SET_CONFIG_REG_OFFSET) >> 2); > ib->ptr[2] = 0xDEADBEEF; > - ib->ptr[3] = PACKET2(0); > - ib->ptr[4] = PACKET2(0); > - ib->ptr[5] = PACKET2(0); > - ib->ptr[6] = PACKET2(0); > - ib->ptr[7] = PACKET2(0); > - ib->ptr[8] = PACKET2(0); > - ib->ptr[9] = PACKET2(0); > - ib->ptr[10] = PACKET2(0); > - ib->ptr[11] = PACKET2(0); > - ib->ptr[12] = PACKET2(0); > - ib->ptr[13] = PACKET2(0); > - ib->ptr[14] = PACKET2(0); > - ib->ptr[15] = PACKET2(0); > - ib->length_dw = 16; > + ib->length_dw = 3; > r = radeon_ib_schedule(rdev, ib); > if (r) { > radeon_scratch_free(rdev, scratch); > -- > 1.7.5.4 > > > You sure about that ? I remember this helped with GPU lockup and i > also seen fglrx aligning IB. Yeah, pretty much. Well I searched for halve an hour for the corresponding IB alignment in mesa/the CS ioctl until I finally figured out that there isn't any. So IBs submitted by usermode aren't aligned in any way.... So it really seems to work fine and I couldn't find any reason why we should align an IB for the GFX ring in our docs also. Christian. [-- Attachment #1.2: Type: text/html, Size: 3590 bytes --] [-- Attachment #2: Type: text/plain, Size: 159 bytes --] _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 3/4] drm/radeon: also make the cs_parse function per ring 2012-02-23 14:18 [PATCH 1/4] drm/radeon: move ring syncing after bo validation Christian König 2012-02-23 14:18 ` [PATCH 2/4] drm/radeon/kms: no need to align IB like this Christian König @ 2012-02-23 14:18 ` Christian König 2012-02-24 17:14 ` Jerome Glisse 2012-02-23 14:18 ` [PATCH 4/4] drm/radeon: fix IB debugfs files for multiple cards Christian König ` (2 subsequent siblings) 4 siblings, 1 reply; 12+ messages in thread From: Christian König @ 2012-02-23 14:18 UTC (permalink / raw) To: dri-devel; +Cc: Christian König Not all rings use PM4, so the cs_parser also needs to be per ring. Signed-off-by: Christian König <deathsimple@vodafone.de> --- drivers/gpu/drm/radeon/radeon.h | 4 +- drivers/gpu/drm/radeon/radeon_asic.c | 38 +++++++++++++++++---------------- drivers/gpu/drm/radeon/radeon_cs.c | 2 +- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 4c1b981..ca98772 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@ -1147,13 +1147,13 @@ struct radeon_asic { void (*emit_fence)(struct radeon_device *rdev, struct radeon_fence *fence); void (*emit_semaphore)(struct radeon_device *rdev, struct radeon_ring *cp, struct radeon_semaphore *semaphore, bool emit_wait); + int (*cs_parse)(struct radeon_cs_parser *p); } ring[RADEON_NUM_RINGS]; int (*ring_test)(struct radeon_device *rdev, struct radeon_ring *cp); int (*irq_set)(struct radeon_device *rdev); int (*irq_process)(struct radeon_device *rdev); u32 (*get_vblank_counter)(struct radeon_device *rdev, int crtc); - int (*cs_parse)(struct radeon_cs_parser *p); int (*copy_blit)(struct radeon_device *rdev, uint64_t src_offset, uint64_t dst_offset, @@ -1650,7 +1650,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v); #define radeon_fini(rdev) (rdev)->asic->fini((rdev)) #define radeon_resume(rdev) (rdev)->asic->resume((rdev)) #define radeon_suspend(rdev) (rdev)->asic->suspend((rdev)) -#define radeon_cs_parse(p) rdev->asic->cs_parse((p)) +#define radeon_cs_parse(rdev, r, p) (rdev)->asic->ring[(r)].cs_parse((p)) #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) #define radeon_gpu_is_lockup(rdev, cp) (rdev)->asic->gpu_is_lockup((rdev), (cp)) #define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev)) diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 36a6192..636c68f 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c @@ -145,12 +145,12 @@ static struct radeon_asic r100_asic = { .ib_execute = &r100_ring_ib_execute, .emit_fence = &r100_fence_ring_emit, .emit_semaphore = &r100_semaphore_ring_emit, + .cs_parse = &r100_cs_parse, } }, .irq_set = &r100_irq_set, .irq_process = &r100_irq_process, .get_vblank_counter = &r100_get_vblank_counter, - .cs_parse = &r100_cs_parse, .copy_blit = &r100_copy_blit, .copy_dma = NULL, .copy = &r100_copy_blit, @@ -197,12 +197,12 @@ static struct radeon_asic r200_asic = { .ib_execute = &r100_ring_ib_execute, .emit_fence = &r100_fence_ring_emit, .emit_semaphore = &r100_semaphore_ring_emit, + .cs_parse = &r100_cs_parse, } }, .irq_set = &r100_irq_set, .irq_process = &r100_irq_process, .get_vblank_counter = &r100_get_vblank_counter, - .cs_parse = &r100_cs_parse, .copy_blit = &r100_copy_blit, .copy_dma = &r200_copy_dma, .copy = &r100_copy_blit, @@ -248,12 +248,12 @@ static struct radeon_asic r300_asic = { .ib_execute = &r100_ring_ib_execute, .emit_fence = &r300_fence_ring_emit, .emit_semaphore = &r100_semaphore_ring_emit, + .cs_parse = &r300_cs_parse, } }, .irq_set = &r100_irq_set, .irq_process = &r100_irq_process, .get_vblank_counter = &r100_get_vblank_counter, - .cs_parse = &r300_cs_parse, .copy_blit = &r100_copy_blit, .copy_dma = &r200_copy_dma, .copy = &r100_copy_blit, @@ -300,12 +300,12 @@ static struct radeon_asic r300_asic_pcie = { .ib_execute = &r100_ring_ib_execute, .emit_fence = &r300_fence_ring_emit, .emit_semaphore = &r100_semaphore_ring_emit, + .cs_parse = &r300_cs_parse, } }, .irq_set = &r100_irq_set, .irq_process = &r100_irq_process, .get_vblank_counter = &r100_get_vblank_counter, - .cs_parse = &r300_cs_parse, .copy_blit = &r100_copy_blit, .copy_dma = &r200_copy_dma, .copy = &r100_copy_blit, @@ -351,12 +351,12 @@ static struct radeon_asic r420_asic = { .ib_execute = &r100_ring_ib_execute, .emit_fence = &r300_fence_ring_emit, .emit_semaphore = &r100_semaphore_ring_emit, + .cs_parse = &r300_cs_parse, } }, .irq_set = &r100_irq_set, .irq_process = &r100_irq_process, .get_vblank_counter = &r100_get_vblank_counter, - .cs_parse = &r300_cs_parse, .copy_blit = &r100_copy_blit, .copy_dma = &r200_copy_dma, .copy = &r100_copy_blit, @@ -403,12 +403,12 @@ static struct radeon_asic rs400_asic = { .ib_execute = &r100_ring_ib_execute, .emit_fence = &r300_fence_ring_emit, .emit_semaphore = &r100_semaphore_ring_emit, + .cs_parse = &r300_cs_parse, } }, .irq_set = &r100_irq_set, .irq_process = &r100_irq_process, .get_vblank_counter = &r100_get_vblank_counter, - .cs_parse = &r300_cs_parse, .copy_blit = &r100_copy_blit, .copy_dma = &r200_copy_dma, .copy = &r100_copy_blit, @@ -455,12 +455,12 @@ static struct radeon_asic rs600_asic = { .ib_execute = &r100_ring_ib_execute, .emit_fence = &r300_fence_ring_emit, .emit_semaphore = &r100_semaphore_ring_emit, + .cs_parse = &r300_cs_parse, } }, .irq_set = &rs600_irq_set, .irq_process = &rs600_irq_process, .get_vblank_counter = &rs600_get_vblank_counter, - .cs_parse = &r300_cs_parse, .copy_blit = &r100_copy_blit, .copy_dma = &r200_copy_dma, .copy = &r100_copy_blit, @@ -507,12 +507,12 @@ static struct radeon_asic rs690_asic = { .ib_execute = &r100_ring_ib_execute, .emit_fence = &r300_fence_ring_emit, .emit_semaphore = &r100_semaphore_ring_emit, + .cs_parse = &r300_cs_parse, } }, .irq_set = &rs600_irq_set, .irq_process = &rs600_irq_process, .get_vblank_counter = &rs600_get_vblank_counter, - .cs_parse = &r300_cs_parse, .copy_blit = &r100_copy_blit, .copy_dma = &r200_copy_dma, .copy = &r200_copy_dma, @@ -559,12 +559,12 @@ static struct radeon_asic rv515_asic = { .ib_execute = &r100_ring_ib_execute, .emit_fence = &r300_fence_ring_emit, .emit_semaphore = &r100_semaphore_ring_emit, + .cs_parse = &r300_cs_parse, } }, .irq_set = &rs600_irq_set, .irq_process = &rs600_irq_process, .get_vblank_counter = &rs600_get_vblank_counter, - .cs_parse = &r300_cs_parse, .copy_blit = &r100_copy_blit, .copy_dma = &r200_copy_dma, .copy = &r100_copy_blit, @@ -611,12 +611,12 @@ static struct radeon_asic r520_asic = { .ib_execute = &r100_ring_ib_execute, .emit_fence = &r300_fence_ring_emit, .emit_semaphore = &r100_semaphore_ring_emit, + .cs_parse = &r300_cs_parse, } }, .irq_set = &rs600_irq_set, .irq_process = &rs600_irq_process, .get_vblank_counter = &rs600_get_vblank_counter, - .cs_parse = &r300_cs_parse, .copy_blit = &r100_copy_blit, .copy_dma = &r200_copy_dma, .copy = &r100_copy_blit, @@ -662,12 +662,12 @@ static struct radeon_asic r600_asic = { .ib_execute = &r600_ring_ib_execute, .emit_fence = &r600_fence_ring_emit, .emit_semaphore = &r600_semaphore_ring_emit, + .cs_parse = &r600_cs_parse, } }, .irq_set = &r600_irq_set, .irq_process = &r600_irq_process, .get_vblank_counter = &rs600_get_vblank_counter, - .cs_parse = &r600_cs_parse, .copy_blit = &r600_copy_blit, .copy_dma = NULL, .copy = &r600_copy_blit, @@ -713,12 +713,12 @@ static struct radeon_asic rs780_asic = { .ib_execute = &r600_ring_ib_execute, .emit_fence = &r600_fence_ring_emit, .emit_semaphore = &r600_semaphore_ring_emit, + .cs_parse = &r600_cs_parse, } }, .irq_set = &r600_irq_set, .irq_process = &r600_irq_process, .get_vblank_counter = &rs600_get_vblank_counter, - .cs_parse = &r600_cs_parse, .copy_blit = &r600_copy_blit, .copy_dma = NULL, .copy = &r600_copy_blit, @@ -764,12 +764,12 @@ static struct radeon_asic rv770_asic = { .ib_execute = &r600_ring_ib_execute, .emit_fence = &r600_fence_ring_emit, .emit_semaphore = &r600_semaphore_ring_emit, + .cs_parse = &r600_cs_parse, } }, .irq_set = &r600_irq_set, .irq_process = &r600_irq_process, .get_vblank_counter = &rs600_get_vblank_counter, - .cs_parse = &r600_cs_parse, .copy_blit = &r600_copy_blit, .copy_dma = NULL, .copy = &r600_copy_blit, @@ -815,12 +815,12 @@ static struct radeon_asic evergreen_asic = { .ib_execute = &evergreen_ring_ib_execute, .emit_fence = &r600_fence_ring_emit, .emit_semaphore = &r600_semaphore_ring_emit, + .cs_parse = &evergreen_cs_parse, } }, .irq_set = &evergreen_irq_set, .irq_process = &evergreen_irq_process, .get_vblank_counter = &evergreen_get_vblank_counter, - .cs_parse = &evergreen_cs_parse, .copy_blit = &r600_copy_blit, .copy_dma = NULL, .copy = &r600_copy_blit, @@ -866,12 +866,12 @@ static struct radeon_asic sumo_asic = { .ib_execute = &evergreen_ring_ib_execute, .emit_fence = &r600_fence_ring_emit, .emit_semaphore = &r600_semaphore_ring_emit, - } + .cs_parse = &evergreen_cs_parse, + }, }, .irq_set = &evergreen_irq_set, .irq_process = &evergreen_irq_process, .get_vblank_counter = &evergreen_get_vblank_counter, - .cs_parse = &evergreen_cs_parse, .copy_blit = &r600_copy_blit, .copy_dma = NULL, .copy = &r600_copy_blit, @@ -917,12 +917,12 @@ static struct radeon_asic btc_asic = { .ib_execute = &evergreen_ring_ib_execute, .emit_fence = &r600_fence_ring_emit, .emit_semaphore = &r600_semaphore_ring_emit, + .cs_parse = &evergreen_cs_parse, } }, .irq_set = &evergreen_irq_set, .irq_process = &evergreen_irq_process, .get_vblank_counter = &evergreen_get_vblank_counter, - .cs_parse = &evergreen_cs_parse, .copy_blit = &r600_copy_blit, .copy_dma = NULL, .copy = &r600_copy_blit, @@ -979,24 +979,26 @@ static struct radeon_asic cayman_asic = { .ib_parse = &evergreen_ib_parse, .emit_fence = &cayman_fence_ring_emit, .emit_semaphore = &r600_semaphore_ring_emit, + .cs_parse = &evergreen_cs_parse, }, [CAYMAN_RING_TYPE_CP1_INDEX] = { .ib_execute = &cayman_ring_ib_execute, .ib_parse = &evergreen_ib_parse, .emit_fence = &cayman_fence_ring_emit, .emit_semaphore = &r600_semaphore_ring_emit, + .cs_parse = &evergreen_cs_parse, }, [CAYMAN_RING_TYPE_CP2_INDEX] = { .ib_execute = &cayman_ring_ib_execute, .ib_parse = &evergreen_ib_parse, .emit_fence = &cayman_fence_ring_emit, .emit_semaphore = &r600_semaphore_ring_emit, + .cs_parse = &evergreen_cs_parse, } }, .irq_set = &evergreen_irq_set, .irq_process = &evergreen_irq_process, .get_vblank_counter = &evergreen_get_vblank_counter, - .cs_parse = &evergreen_cs_parse, .copy_blit = &r600_copy_blit, .copy_dma = NULL, .copy = &r600_copy_blit, diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 7fd0987..dc79d08 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c @@ -348,7 +348,7 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev, return r; } parser->ib->length_dw = ib_chunk->length_dw; - r = radeon_cs_parse(parser); + r = radeon_cs_parse(rdev, parser->ring, parser); if (r || parser->parser_error) { DRM_ERROR("Invalid command stream !\n"); return r; -- 1.7.5.4 _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 3/4] drm/radeon: also make the cs_parse function per ring 2012-02-23 14:18 ` [PATCH 3/4] drm/radeon: also make the cs_parse function per ring Christian König @ 2012-02-24 17:14 ` Jerome Glisse 0 siblings, 0 replies; 12+ messages in thread From: Jerome Glisse @ 2012-02-24 17:14 UTC (permalink / raw) To: Christian König; +Cc: dri-devel On Thu, 2012-02-23 at 15:18 +0100, Christian König wrote: > Not all rings use PM4, so the cs_parser also needs to be per ring. > > Signed-off-by: Christian König <deathsimple@vodafone.de> Reviewed-by: Jerome Glisse <jglisse@redhat.com> > --- > drivers/gpu/drm/radeon/radeon.h | 4 +- > drivers/gpu/drm/radeon/radeon_asic.c | 38 +++++++++++++++++---------------- > drivers/gpu/drm/radeon/radeon_cs.c | 2 +- > 3 files changed, 23 insertions(+), 21 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h > index 4c1b981..ca98772 100644 > --- a/drivers/gpu/drm/radeon/radeon.h > +++ b/drivers/gpu/drm/radeon/radeon.h > @@ -1147,13 +1147,13 @@ struct radeon_asic { > void (*emit_fence)(struct radeon_device *rdev, struct radeon_fence *fence); > void (*emit_semaphore)(struct radeon_device *rdev, struct radeon_ring *cp, > struct radeon_semaphore *semaphore, bool emit_wait); > + int (*cs_parse)(struct radeon_cs_parser *p); > } ring[RADEON_NUM_RINGS]; > > int (*ring_test)(struct radeon_device *rdev, struct radeon_ring *cp); > int (*irq_set)(struct radeon_device *rdev); > int (*irq_process)(struct radeon_device *rdev); > u32 (*get_vblank_counter)(struct radeon_device *rdev, int crtc); > - int (*cs_parse)(struct radeon_cs_parser *p); > int (*copy_blit)(struct radeon_device *rdev, > uint64_t src_offset, > uint64_t dst_offset, > @@ -1650,7 +1650,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v); > #define radeon_fini(rdev) (rdev)->asic->fini((rdev)) > #define radeon_resume(rdev) (rdev)->asic->resume((rdev)) > #define radeon_suspend(rdev) (rdev)->asic->suspend((rdev)) > -#define radeon_cs_parse(p) rdev->asic->cs_parse((p)) > +#define radeon_cs_parse(rdev, r, p) (rdev)->asic->ring[(r)].cs_parse((p)) > #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) > #define radeon_gpu_is_lockup(rdev, cp) (rdev)->asic->gpu_is_lockup((rdev), (cp)) > #define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev)) > diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c > index 36a6192..636c68f 100644 > --- a/drivers/gpu/drm/radeon/radeon_asic.c > +++ b/drivers/gpu/drm/radeon/radeon_asic.c > @@ -145,12 +145,12 @@ static struct radeon_asic r100_asic = { > .ib_execute = &r100_ring_ib_execute, > .emit_fence = &r100_fence_ring_emit, > .emit_semaphore = &r100_semaphore_ring_emit, > + .cs_parse = &r100_cs_parse, > } > }, > .irq_set = &r100_irq_set, > .irq_process = &r100_irq_process, > .get_vblank_counter = &r100_get_vblank_counter, > - .cs_parse = &r100_cs_parse, > .copy_blit = &r100_copy_blit, > .copy_dma = NULL, > .copy = &r100_copy_blit, > @@ -197,12 +197,12 @@ static struct radeon_asic r200_asic = { > .ib_execute = &r100_ring_ib_execute, > .emit_fence = &r100_fence_ring_emit, > .emit_semaphore = &r100_semaphore_ring_emit, > + .cs_parse = &r100_cs_parse, > } > }, > .irq_set = &r100_irq_set, > .irq_process = &r100_irq_process, > .get_vblank_counter = &r100_get_vblank_counter, > - .cs_parse = &r100_cs_parse, > .copy_blit = &r100_copy_blit, > .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > @@ -248,12 +248,12 @@ static struct radeon_asic r300_asic = { > .ib_execute = &r100_ring_ib_execute, > .emit_fence = &r300_fence_ring_emit, > .emit_semaphore = &r100_semaphore_ring_emit, > + .cs_parse = &r300_cs_parse, > } > }, > .irq_set = &r100_irq_set, > .irq_process = &r100_irq_process, > .get_vblank_counter = &r100_get_vblank_counter, > - .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > @@ -300,12 +300,12 @@ static struct radeon_asic r300_asic_pcie = { > .ib_execute = &r100_ring_ib_execute, > .emit_fence = &r300_fence_ring_emit, > .emit_semaphore = &r100_semaphore_ring_emit, > + .cs_parse = &r300_cs_parse, > } > }, > .irq_set = &r100_irq_set, > .irq_process = &r100_irq_process, > .get_vblank_counter = &r100_get_vblank_counter, > - .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > @@ -351,12 +351,12 @@ static struct radeon_asic r420_asic = { > .ib_execute = &r100_ring_ib_execute, > .emit_fence = &r300_fence_ring_emit, > .emit_semaphore = &r100_semaphore_ring_emit, > + .cs_parse = &r300_cs_parse, > } > }, > .irq_set = &r100_irq_set, > .irq_process = &r100_irq_process, > .get_vblank_counter = &r100_get_vblank_counter, > - .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > @@ -403,12 +403,12 @@ static struct radeon_asic rs400_asic = { > .ib_execute = &r100_ring_ib_execute, > .emit_fence = &r300_fence_ring_emit, > .emit_semaphore = &r100_semaphore_ring_emit, > + .cs_parse = &r300_cs_parse, > } > }, > .irq_set = &r100_irq_set, > .irq_process = &r100_irq_process, > .get_vblank_counter = &r100_get_vblank_counter, > - .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > @@ -455,12 +455,12 @@ static struct radeon_asic rs600_asic = { > .ib_execute = &r100_ring_ib_execute, > .emit_fence = &r300_fence_ring_emit, > .emit_semaphore = &r100_semaphore_ring_emit, > + .cs_parse = &r300_cs_parse, > } > }, > .irq_set = &rs600_irq_set, > .irq_process = &rs600_irq_process, > .get_vblank_counter = &rs600_get_vblank_counter, > - .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > @@ -507,12 +507,12 @@ static struct radeon_asic rs690_asic = { > .ib_execute = &r100_ring_ib_execute, > .emit_fence = &r300_fence_ring_emit, > .emit_semaphore = &r100_semaphore_ring_emit, > + .cs_parse = &r300_cs_parse, > } > }, > .irq_set = &rs600_irq_set, > .irq_process = &rs600_irq_process, > .get_vblank_counter = &rs600_get_vblank_counter, > - .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > .copy_dma = &r200_copy_dma, > .copy = &r200_copy_dma, > @@ -559,12 +559,12 @@ static struct radeon_asic rv515_asic = { > .ib_execute = &r100_ring_ib_execute, > .emit_fence = &r300_fence_ring_emit, > .emit_semaphore = &r100_semaphore_ring_emit, > + .cs_parse = &r300_cs_parse, > } > }, > .irq_set = &rs600_irq_set, > .irq_process = &rs600_irq_process, > .get_vblank_counter = &rs600_get_vblank_counter, > - .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > @@ -611,12 +611,12 @@ static struct radeon_asic r520_asic = { > .ib_execute = &r100_ring_ib_execute, > .emit_fence = &r300_fence_ring_emit, > .emit_semaphore = &r100_semaphore_ring_emit, > + .cs_parse = &r300_cs_parse, > } > }, > .irq_set = &rs600_irq_set, > .irq_process = &rs600_irq_process, > .get_vblank_counter = &rs600_get_vblank_counter, > - .cs_parse = &r300_cs_parse, > .copy_blit = &r100_copy_blit, > .copy_dma = &r200_copy_dma, > .copy = &r100_copy_blit, > @@ -662,12 +662,12 @@ static struct radeon_asic r600_asic = { > .ib_execute = &r600_ring_ib_execute, > .emit_fence = &r600_fence_ring_emit, > .emit_semaphore = &r600_semaphore_ring_emit, > + .cs_parse = &r600_cs_parse, > } > }, > .irq_set = &r600_irq_set, > .irq_process = &r600_irq_process, > .get_vblank_counter = &rs600_get_vblank_counter, > - .cs_parse = &r600_cs_parse, > .copy_blit = &r600_copy_blit, > .copy_dma = NULL, > .copy = &r600_copy_blit, > @@ -713,12 +713,12 @@ static struct radeon_asic rs780_asic = { > .ib_execute = &r600_ring_ib_execute, > .emit_fence = &r600_fence_ring_emit, > .emit_semaphore = &r600_semaphore_ring_emit, > + .cs_parse = &r600_cs_parse, > } > }, > .irq_set = &r600_irq_set, > .irq_process = &r600_irq_process, > .get_vblank_counter = &rs600_get_vblank_counter, > - .cs_parse = &r600_cs_parse, > .copy_blit = &r600_copy_blit, > .copy_dma = NULL, > .copy = &r600_copy_blit, > @@ -764,12 +764,12 @@ static struct radeon_asic rv770_asic = { > .ib_execute = &r600_ring_ib_execute, > .emit_fence = &r600_fence_ring_emit, > .emit_semaphore = &r600_semaphore_ring_emit, > + .cs_parse = &r600_cs_parse, > } > }, > .irq_set = &r600_irq_set, > .irq_process = &r600_irq_process, > .get_vblank_counter = &rs600_get_vblank_counter, > - .cs_parse = &r600_cs_parse, > .copy_blit = &r600_copy_blit, > .copy_dma = NULL, > .copy = &r600_copy_blit, > @@ -815,12 +815,12 @@ static struct radeon_asic evergreen_asic = { > .ib_execute = &evergreen_ring_ib_execute, > .emit_fence = &r600_fence_ring_emit, > .emit_semaphore = &r600_semaphore_ring_emit, > + .cs_parse = &evergreen_cs_parse, > } > }, > .irq_set = &evergreen_irq_set, > .irq_process = &evergreen_irq_process, > .get_vblank_counter = &evergreen_get_vblank_counter, > - .cs_parse = &evergreen_cs_parse, > .copy_blit = &r600_copy_blit, > .copy_dma = NULL, > .copy = &r600_copy_blit, > @@ -866,12 +866,12 @@ static struct radeon_asic sumo_asic = { > .ib_execute = &evergreen_ring_ib_execute, > .emit_fence = &r600_fence_ring_emit, > .emit_semaphore = &r600_semaphore_ring_emit, > - } > + .cs_parse = &evergreen_cs_parse, > + }, > }, > .irq_set = &evergreen_irq_set, > .irq_process = &evergreen_irq_process, > .get_vblank_counter = &evergreen_get_vblank_counter, > - .cs_parse = &evergreen_cs_parse, > .copy_blit = &r600_copy_blit, > .copy_dma = NULL, > .copy = &r600_copy_blit, > @@ -917,12 +917,12 @@ static struct radeon_asic btc_asic = { > .ib_execute = &evergreen_ring_ib_execute, > .emit_fence = &r600_fence_ring_emit, > .emit_semaphore = &r600_semaphore_ring_emit, > + .cs_parse = &evergreen_cs_parse, > } > }, > .irq_set = &evergreen_irq_set, > .irq_process = &evergreen_irq_process, > .get_vblank_counter = &evergreen_get_vblank_counter, > - .cs_parse = &evergreen_cs_parse, > .copy_blit = &r600_copy_blit, > .copy_dma = NULL, > .copy = &r600_copy_blit, > @@ -979,24 +979,26 @@ static struct radeon_asic cayman_asic = { > .ib_parse = &evergreen_ib_parse, > .emit_fence = &cayman_fence_ring_emit, > .emit_semaphore = &r600_semaphore_ring_emit, > + .cs_parse = &evergreen_cs_parse, > }, > [CAYMAN_RING_TYPE_CP1_INDEX] = { > .ib_execute = &cayman_ring_ib_execute, > .ib_parse = &evergreen_ib_parse, > .emit_fence = &cayman_fence_ring_emit, > .emit_semaphore = &r600_semaphore_ring_emit, > + .cs_parse = &evergreen_cs_parse, > }, > [CAYMAN_RING_TYPE_CP2_INDEX] = { > .ib_execute = &cayman_ring_ib_execute, > .ib_parse = &evergreen_ib_parse, > .emit_fence = &cayman_fence_ring_emit, > .emit_semaphore = &r600_semaphore_ring_emit, > + .cs_parse = &evergreen_cs_parse, > } > }, > .irq_set = &evergreen_irq_set, > .irq_process = &evergreen_irq_process, > .get_vblank_counter = &evergreen_get_vblank_counter, > - .cs_parse = &evergreen_cs_parse, > .copy_blit = &r600_copy_blit, > .copy_dma = NULL, > .copy = &r600_copy_blit, > diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c > index 7fd0987..dc79d08 100644 > --- a/drivers/gpu/drm/radeon/radeon_cs.c > +++ b/drivers/gpu/drm/radeon/radeon_cs.c > @@ -348,7 +348,7 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev, > return r; > } > parser->ib->length_dw = ib_chunk->length_dw; > - r = radeon_cs_parse(parser); > + r = radeon_cs_parse(rdev, parser->ring, parser); > if (r || parser->parser_error) { > DRM_ERROR("Invalid command stream !\n"); > return r; _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/4] drm/radeon: fix IB debugfs files for multiple cards 2012-02-23 14:18 [PATCH 1/4] drm/radeon: move ring syncing after bo validation Christian König 2012-02-23 14:18 ` [PATCH 2/4] drm/radeon/kms: no need to align IB like this Christian König 2012-02-23 14:18 ` [PATCH 3/4] drm/radeon: also make the cs_parse function per ring Christian König @ 2012-02-23 14:18 ` Christian König 2012-02-23 15:17 ` [PATCH 1/4] drm/radeon: move ring syncing after bo validation Alex Deucher 2012-02-23 17:05 ` Mathias Fröhlich 4 siblings, 0 replies; 12+ messages in thread From: Christian König @ 2012-02-23 14:18 UTC (permalink / raw) To: dri-devel; +Cc: Christian König Storing pointers to the IBs in a static var just leads to giving the same content back for all cards in the system. Signed-off-by: Christian König <deathsimple@vodafone.de> --- drivers/gpu/drm/radeon/radeon_ring.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 30a4c50..32c83d8 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c @@ -478,7 +478,9 @@ static struct drm_info_list radeon_debugfs_ring_info_list[] = { static int radeon_debugfs_ib_info(struct seq_file *m, void *data) { struct drm_info_node *node = (struct drm_info_node *) m->private; - struct radeon_ib *ib = node->info_ent->data; + struct drm_device *dev = node->minor->dev; + struct radeon_device *rdev = dev->dev_private; + struct radeon_ib *ib = &rdev->ib_pool.ibs[*((unsigned*)node->info_ent->data)]; unsigned i; if (ib == NULL) { @@ -495,6 +497,7 @@ static int radeon_debugfs_ib_info(struct seq_file *m, void *data) static struct drm_info_list radeon_debugfs_ib_list[RADEON_IB_POOL_SIZE]; static char radeon_debugfs_ib_names[RADEON_IB_POOL_SIZE][32]; +static unsigned radeon_debugfs_ib_idx[RADEON_IB_POOL_SIZE]; #endif int radeon_debugfs_ring_init(struct radeon_device *rdev) @@ -514,10 +517,11 @@ int radeon_debugfs_ib_init(struct radeon_device *rdev) for (i = 0; i < RADEON_IB_POOL_SIZE; i++) { sprintf(radeon_debugfs_ib_names[i], "radeon_ib_%04u", i); + radeon_debugfs_ib_idx[i] = i; radeon_debugfs_ib_list[i].name = radeon_debugfs_ib_names[i]; radeon_debugfs_ib_list[i].show = &radeon_debugfs_ib_info; radeon_debugfs_ib_list[i].driver_features = 0; - radeon_debugfs_ib_list[i].data = &rdev->ib_pool.ibs[i]; + radeon_debugfs_ib_list[i].data = &radeon_debugfs_ib_idx[i]; } return radeon_debugfs_add_files(rdev, radeon_debugfs_ib_list, RADEON_IB_POOL_SIZE); -- 1.7.5.4 _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 1/4] drm/radeon: move ring syncing after bo validation 2012-02-23 14:18 [PATCH 1/4] drm/radeon: move ring syncing after bo validation Christian König ` (2 preceding siblings ...) 2012-02-23 14:18 ` [PATCH 4/4] drm/radeon: fix IB debugfs files for multiple cards Christian König @ 2012-02-23 15:17 ` Alex Deucher 2012-02-24 17:15 ` Jerome Glisse 2012-02-23 17:05 ` Mathias Fröhlich 4 siblings, 1 reply; 12+ messages in thread From: Alex Deucher @ 2012-02-23 15:17 UTC (permalink / raw) To: Christian König; +Cc: dri-devel 2012/2/23 Christian König <deathsimple@vodafone.de>: > The function radeon_bo_list_validate can cause a > bo to move, resulting in a different sync_obj > and a dependency to wait for this move to finish. > > Signed-off-by: Christian König <deathsimple@vodafone.de> > Reviewed-by: Alex Deucher <alexander.deucher@amd.com> For the series: Reviewed-by: Alex Deucher <alexander.deucher@amd.com> > --- > drivers/gpu/drm/radeon/radeon.h | 1 - > drivers/gpu/drm/radeon/radeon_cs.c | 21 ++++++++++++++------- > 2 files changed, 14 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h > index 884e0d4..4c1b981 100644 > --- a/drivers/gpu/drm/radeon/radeon.h > +++ b/drivers/gpu/drm/radeon/radeon.h > @@ -836,7 +836,6 @@ struct radeon_cs_parser { > struct radeon_cs_reloc *relocs; > struct radeon_cs_reloc **relocs_ptr; > struct list_head validated; > - bool sync_to_ring[RADEON_NUM_RINGS]; > /* indices of various chunks */ > int chunk_ib_idx; > int chunk_relocs_idx; > diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c > index 435a3d9..7fd0987 100644 > --- a/drivers/gpu/drm/radeon/radeon_cs.c > +++ b/drivers/gpu/drm/radeon/radeon_cs.c > @@ -85,12 +85,6 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p) > radeon_bo_list_add_object(&p->relocs[i].lobj, > &p->validated); > > - if (p->relocs[i].robj->tbo.sync_obj && !(r->flags & RADEON_RELOC_DONT_SYNC)) { > - struct radeon_fence *fence = p->relocs[i].robj->tbo.sync_obj; > - if (!radeon_fence_signaled(fence)) { > - p->sync_to_ring[fence->ring] = true; > - } > - } > } else > p->relocs[i].handle = 0; > } > @@ -118,11 +112,24 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority > > static int radeon_cs_sync_rings(struct radeon_cs_parser *p) > { > + bool sync_to_ring[RADEON_NUM_RINGS] = { }; > int i, r; > > + for (i = 0; i < p->nrelocs; i++) { > + if (!p->relocs[i].robj || !p->relocs[i].robj->tbo.sync_obj) > + continue; > + > + if (!(p->relocs[i].flags & RADEON_RELOC_DONT_SYNC)) { > + struct radeon_fence *fence = p->relocs[i].robj->tbo.sync_obj; > + if (!radeon_fence_signaled(fence)) { > + sync_to_ring[fence->ring] = true; > + } > + } > + } > + > for (i = 0; i < RADEON_NUM_RINGS; ++i) { > /* no need to sync to our own or unused rings */ > - if (i == p->ring || !p->sync_to_ring[i] || !p->rdev->ring[i].ready) > + if (i == p->ring || !sync_to_ring[i] || !p->rdev->ring[i].ready) > continue; > > if (!p->ib->fence->semaphore) { > -- > 1.7.5.4 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/4] drm/radeon: move ring syncing after bo validation 2012-02-23 15:17 ` [PATCH 1/4] drm/radeon: move ring syncing after bo validation Alex Deucher @ 2012-02-24 17:15 ` Jerome Glisse 0 siblings, 0 replies; 12+ messages in thread From: Jerome Glisse @ 2012-02-24 17:15 UTC (permalink / raw) To: Alex Deucher; +Cc: Christian König, dri-devel On Thu, 2012-02-23 at 10:17 -0500, Alex Deucher wrote: > 2012/2/23 Christian König <deathsimple@vodafone.de>: > > The function radeon_bo_list_validate can cause a > > bo to move, resulting in a different sync_obj > > and a dependency to wait for this move to finish. > > > > Signed-off-by: Christian König <deathsimple@vodafone.de> > > Reviewed-by: Alex Deucher <alexander.deucher@amd.com> > > For the series: > > Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Same Reviewed-by: Jerome Glisse <jglisse@redhat.com> > > > --- > > drivers/gpu/drm/radeon/radeon.h | 1 - > > drivers/gpu/drm/radeon/radeon_cs.c | 21 ++++++++++++++------- > > 2 files changed, 14 insertions(+), 8 deletions(-) > > > > diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h > > index 884e0d4..4c1b981 100644 > > --- a/drivers/gpu/drm/radeon/radeon.h > > +++ b/drivers/gpu/drm/radeon/radeon.h > > @@ -836,7 +836,6 @@ struct radeon_cs_parser { > > struct radeon_cs_reloc *relocs; > > struct radeon_cs_reloc **relocs_ptr; > > struct list_head validated; > > - bool sync_to_ring[RADEON_NUM_RINGS]; > > /* indices of various chunks */ > > int chunk_ib_idx; > > int chunk_relocs_idx; > > diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c > > index 435a3d9..7fd0987 100644 > > --- a/drivers/gpu/drm/radeon/radeon_cs.c > > +++ b/drivers/gpu/drm/radeon/radeon_cs.c > > @@ -85,12 +85,6 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p) > > radeon_bo_list_add_object(&p->relocs[i].lobj, > > &p->validated); > > > > - if (p->relocs[i].robj->tbo.sync_obj && !(r->flags & RADEON_RELOC_DONT_SYNC)) { > > - struct radeon_fence *fence = p->relocs[i].robj->tbo.sync_obj; > > - if (!radeon_fence_signaled(fence)) { > > - p->sync_to_ring[fence->ring] = true; > > - } > > - } > > } else > > p->relocs[i].handle = 0; > > } > > @@ -118,11 +112,24 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority > > > > static int radeon_cs_sync_rings(struct radeon_cs_parser *p) > > { > > + bool sync_to_ring[RADEON_NUM_RINGS] = { }; > > int i, r; > > > > + for (i = 0; i < p->nrelocs; i++) { > > + if (!p->relocs[i].robj || !p->relocs[i].robj->tbo.sync_obj) > > + continue; > > + > > + if (!(p->relocs[i].flags & RADEON_RELOC_DONT_SYNC)) { > > + struct radeon_fence *fence = p->relocs[i].robj->tbo.sync_obj; > > + if (!radeon_fence_signaled(fence)) { > > + sync_to_ring[fence->ring] = true; > > + } > > + } > > + } > > + > > for (i = 0; i < RADEON_NUM_RINGS; ++i) { > > /* no need to sync to our own or unused rings */ > > - if (i == p->ring || !p->sync_to_ring[i] || !p->rdev->ring[i].ready) > > + if (i == p->ring || !sync_to_ring[i] || !p->rdev->ring[i].ready) > > continue; > > > > if (!p->ib->fence->semaphore) { > > -- > > 1.7.5.4 > > > > _______________________________________________ > > dri-devel mailing list > > dri-devel@lists.freedesktop.org > > http://lists.freedesktop.org/mailman/listinfo/dri-devel > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/4] drm/radeon: move ring syncing after bo validation 2012-02-23 14:18 [PATCH 1/4] drm/radeon: move ring syncing after bo validation Christian König ` (3 preceding siblings ...) 2012-02-23 15:17 ` [PATCH 1/4] drm/radeon: move ring syncing after bo validation Alex Deucher @ 2012-02-23 17:05 ` Mathias Fröhlich 2012-02-23 17:32 ` Jerome Glisse 4 siblings, 1 reply; 12+ messages in thread From: Mathias Fröhlich @ 2012-02-23 17:05 UTC (permalink / raw) To: dri-devel, deathsimple Christian, On Thursday, February 23, 2012 15:18:42 Christian König wrote: > The function radeon_bo_list_validate can cause a > bo to move, resulting in a different sync_obj > and a dependency to wait for this move to finish. > > Signed-off-by: Christian König <deathsimple@vodafone.de> > Reviewed-by: Alex Deucher <alexander.deucher@amd.com> I am not sure, but to me this looks like this could fix these kind of gpu lockups that I experience since some time every now and then. The usual symptom is that I get the radeon 0000:01:00.0: GPU lockup CP stall for more than 10000msec GPU lockup (waiting for 0x00682AC3 last fence id 0x00682AC2) [...] kernel message. Each time with the fence being off by one like in the example above. If this change has the potential to fix this issue I think this particular patch should be considered for the current upstream kernel release. Mathias ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/4] drm/radeon: move ring syncing after bo validation 2012-02-23 17:05 ` Mathias Fröhlich @ 2012-02-23 17:32 ` Jerome Glisse 2012-02-23 18:27 ` Christian König 0 siblings, 1 reply; 12+ messages in thread From: Jerome Glisse @ 2012-02-23 17:32 UTC (permalink / raw) To: Mathias Fröhlich; +Cc: deathsimple, dri-devel [-- Attachment #1.1: Type: text/plain, Size: 1163 bytes --] 2012/2/23 Mathias Fröhlich <Mathias.Froehlich@gmx.net> > > Christian, > > On Thursday, February 23, 2012 15:18:42 Christian König wrote: > > The function radeon_bo_list_validate can cause a > > bo to move, resulting in a different sync_obj > > and a dependency to wait for this move to finish. > > > > Signed-off-by: Christian König <deathsimple@vodafone.de> > > Reviewed-by: Alex Deucher <alexander.deucher@amd.com> > > I am not sure, but to me this looks like this could fix these kind of gpu > lockups that I experience since some time every now and then. > The usual symptom is that I get the > > radeon 0000:01:00.0: GPU lockup CP stall for more than 10000msec > GPU lockup (waiting for 0x00682AC3 last fence id 0x00682AC2) > [...] > > kernel message. Each time with the fence being off by one like in the > example > above. > > If this change has the potential to fix this issue I think this particular > patch should be considered for the current upstream kernel release. > > Mathias > No this patch doesn't. This patch is all about getting proper sync btw different rings. Sorry for the deception. Cheers, Jerome [-- Attachment #1.2: Type: text/html, Size: 1658 bytes --] [-- Attachment #2: Type: text/plain, Size: 159 bytes --] _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/4] drm/radeon: move ring syncing after bo validation 2012-02-23 17:32 ` Jerome Glisse @ 2012-02-23 18:27 ` Christian König 0 siblings, 0 replies; 12+ messages in thread From: Christian König @ 2012-02-23 18:27 UTC (permalink / raw) To: Jerome Glisse; +Cc: dri-devel [-- Attachment #1.1: Type: text/plain, Size: 1688 bytes --] On 23.02.2012 18:32, Jerome Glisse wrote: > 2012/2/23 Mathias Fröhlich <Mathias.Froehlich@gmx.net > <mailto:Mathias.Froehlich@gmx.net>> > > > Christian, > > On Thursday, February 23, 2012 15:18:42 Christian König wrote: > > The function radeon_bo_list_validate can cause a > > bo to move, resulting in a different sync_obj > > and a dependency to wait for this move to finish. > > > > Signed-off-by: Christian König <deathsimple@vodafone.de > <mailto:deathsimple@vodafone.de>> > > Reviewed-by: Alex Deucher <alexander.deucher@amd.com > <mailto:alexander.deucher@amd.com>> > > I am not sure, but to me this looks like this could fix these kind > of gpu > lockups that I experience since some time every now and then. > The usual symptom is that I get the > > radeon 0000:01:00.0: GPU lockup CP stall for more than 10000msec > GPU lockup (waiting for 0x00682AC3 last fence id 0x00682AC2) > [...] > > kernel message. Each time with the fence being off by one like in > the example > above. > > If this change has the potential to fix this issue I think this > particular > patch should be considered for the current upstream kernel release. > > Mathias > > > No this patch doesn't. This patch is all about getting proper sync btw > different rings. That's unfortunately true, since we wasn't able to release any code that makes direct use of the different rings (yet) it shouldn't really matter in practice. I Just wanted to have that fix upstream since it is an obvious bug. Christian. > > Sorry for the deception. > > Cheers, > Jerome [-- Attachment #1.2: Type: text/html, Size: 2978 bytes --] [-- Attachment #2: Type: text/plain, Size: 159 bytes --] _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2012-02-24 17:15 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-02-23 14:18 [PATCH 1/4] drm/radeon: move ring syncing after bo validation Christian König 2012-02-23 14:18 ` [PATCH 2/4] drm/radeon/kms: no need to align IB like this Christian König 2012-02-23 17:00 ` Jerome Glisse 2012-02-23 18:19 ` Christian König 2012-02-23 14:18 ` [PATCH 3/4] drm/radeon: also make the cs_parse function per ring Christian König 2012-02-24 17:14 ` Jerome Glisse 2012-02-23 14:18 ` [PATCH 4/4] drm/radeon: fix IB debugfs files for multiple cards Christian König 2012-02-23 15:17 ` [PATCH 1/4] drm/radeon: move ring syncing after bo validation Alex Deucher 2012-02-24 17:15 ` Jerome Glisse 2012-02-23 17:05 ` Mathias Fröhlich 2012-02-23 17:32 ` Jerome Glisse 2012-02-23 18:27 ` Christian König
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.