[PATCH 2/2] drm/radeon: allocate semaphore from the ib pool
From: Jerome Glisse This allow to share the ib pool with semaphore and avoid having more bo around. Signed-off-by: Jerome Glisse Signed-off-by: Alex Deucher --- drivers/gpu/drm/radeon/radeon.h | 67 - drivers/gpu/drm/radeon/radeon_device.c|2 +- drivers/gpu/drm/radeon/radeon_ring.c |5 +- drivers/gpu/drm/radeon/radeon_semaphore.c | 157 - 4 files changed, 131 insertions(+), 100 deletions(-) diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 0301896..374f9a4 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@ -243,32 +243,6 @@ void radeon_fence_unref(struct radeon_fence **fence); int radeon_fence_count_emitted(struct radeon_device *rdev, int ring); /* - * Semaphores. - */ -struct radeon_ring; - -struct radeon_semaphore_driver { - rwlock_tlock; - struct list_headfree; -}; - -struct radeon_semaphore { - struct radeon_bo*robj; - struct list_headlist; - uint64_tgpu_addr; -}; - -void radeon_semaphore_driver_fini(struct radeon_device *rdev); -int radeon_semaphore_create(struct radeon_device *rdev, - struct radeon_semaphore **semaphore); -void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, - struct radeon_semaphore *semaphore); -void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, - struct radeon_semaphore *semaphore); -void radeon_semaphore_free(struct radeon_device *rdev, - struct radeon_semaphore *semaphore); - -/* * Tiling registers */ struct radeon_surface_reg { @@ -387,6 +361,46 @@ int radeon_mode_dumb_destroy(struct drm_file *file_priv, uint32_t handle); /* + * Semaphores. + */ +struct radeon_ring; + +#defineRADEON_SEMAPHORE_BO_SIZE256 + +struct radeon_semaphore_driver { + rwlock_tlock; + struct list_headbo; +}; + +struct radeon_semaphore_bo; + +/* everything here is constant */ +struct radeon_semaphore { + struct list_headlist; + uint64_tgpu_addr; + uint32_t*cpu_ptr; + struct radeon_semaphore_bo *bo; +}; + +struct radeon_semaphore_bo { + struct list_headlist; + struct radeon_ib*ib; + struct list_headfree; + struct radeon_semaphore semaphores[RADEON_SEMAPHORE_BO_SIZE/8]; + unsignednused; +}; + +void radeon_semaphore_driver_fini(struct radeon_device *rdev); +int radeon_semaphore_create(struct radeon_device *rdev, + struct radeon_semaphore **semaphore); +void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, + struct radeon_semaphore *semaphore); +void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, + struct radeon_semaphore *semaphore); +void radeon_semaphore_free(struct radeon_device *rdev, + struct radeon_semaphore *semaphore); + +/* * GART structures, functions & helpers */ struct radeon_mc; @@ -641,6 +655,7 @@ void r600_blit_suspend(struct radeon_device *rdev); int radeon_ib_get(struct radeon_device *rdev, int ring, struct radeon_ib **ib, unsigned size); void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib); +bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib); int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib); int radeon_ib_pool_init(struct radeon_device *rdev); void radeon_ib_pool_fini(struct radeon_device *rdev); diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index e81c333..846eeb8 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c @@ -731,7 +731,7 @@ int radeon_device_init(struct radeon_device *rdev, INIT_LIST_HEAD(&rdev->gem.objects); init_waitqueue_head(&rdev->irq.vblank_queue); init_waitqueue_head(&rdev->irq.idle_queue); - INIT_LIST_HEAD(&rdev->semaphore_drv.free); + INIT_LIST_HEAD(&rdev->semaphore_drv.bo); /* Set asic functions */ r = radeon_asic_init(rdev); diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index bc844fe..465fb34 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c @@ -77,8 +77,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v) /* * IB. */ -static bool radeon_ib_try_free(struct radeon_device *rdev, - struct radeon_ib *ib) +bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib) {
[PATCH 2/2] drm/radeon: allocate semaphore from the ib pool
From: Jerome Glisse This allow to share the ib pool with semaphore and avoid having more bo around. Signed-off-by: Jerome Glisse Signed-off-by: Alex Deucher --- drivers/gpu/drm/radeon/radeon.h | 67 - drivers/gpu/drm/radeon/radeon_device.c|2 +- drivers/gpu/drm/radeon/radeon_ring.c |5 +- drivers/gpu/drm/radeon/radeon_semaphore.c | 157 - 4 files changed, 131 insertions(+), 100 deletions(-) diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 0301896..374f9a4 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@ -243,32 +243,6 @@ void radeon_fence_unref(struct radeon_fence **fence); int radeon_fence_count_emitted(struct radeon_device *rdev, int ring); /* - * Semaphores. - */ -struct radeon_ring; - -struct radeon_semaphore_driver { - rwlock_tlock; - struct list_headfree; -}; - -struct radeon_semaphore { - struct radeon_bo*robj; - struct list_headlist; - uint64_tgpu_addr; -}; - -void radeon_semaphore_driver_fini(struct radeon_device *rdev); -int radeon_semaphore_create(struct radeon_device *rdev, - struct radeon_semaphore **semaphore); -void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, - struct radeon_semaphore *semaphore); -void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, - struct radeon_semaphore *semaphore); -void radeon_semaphore_free(struct radeon_device *rdev, - struct radeon_semaphore *semaphore); - -/* * Tiling registers */ struct radeon_surface_reg { @@ -387,6 +361,46 @@ int radeon_mode_dumb_destroy(struct drm_file *file_priv, uint32_t handle); /* + * Semaphores. + */ +struct radeon_ring; + +#defineRADEON_SEMAPHORE_BO_SIZE256 + +struct radeon_semaphore_driver { + rwlock_tlock; + struct list_headbo; +}; + +struct radeon_semaphore_bo; + +/* everything here is constant */ +struct radeon_semaphore { + struct list_headlist; + uint64_tgpu_addr; + uint32_t*cpu_ptr; + struct radeon_semaphore_bo *bo; +}; + +struct radeon_semaphore_bo { + struct list_headlist; + struct radeon_ib*ib; + struct list_headfree; + struct radeon_semaphore semaphores[RADEON_SEMAPHORE_BO_SIZE/8]; + unsignednused; +}; + +void radeon_semaphore_driver_fini(struct radeon_device *rdev); +int radeon_semaphore_create(struct radeon_device *rdev, + struct radeon_semaphore **semaphore); +void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, + struct radeon_semaphore *semaphore); +void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, + struct radeon_semaphore *semaphore); +void radeon_semaphore_free(struct radeon_device *rdev, + struct radeon_semaphore *semaphore); + +/* * GART structures, functions & helpers */ struct radeon_mc; @@ -641,6 +655,7 @@ void r600_blit_suspend(struct radeon_device *rdev); int radeon_ib_get(struct radeon_device *rdev, int ring, struct radeon_ib **ib, unsigned size); void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib); +bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib); int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib); int radeon_ib_pool_init(struct radeon_device *rdev); void radeon_ib_pool_fini(struct radeon_device *rdev); diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index e81c333..846eeb8 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c @@ -731,7 +731,7 @@ int radeon_device_init(struct radeon_device *rdev, INIT_LIST_HEAD(&rdev->gem.objects); init_waitqueue_head(&rdev->irq.vblank_queue); init_waitqueue_head(&rdev->irq.idle_queue); - INIT_LIST_HEAD(&rdev->semaphore_drv.free); + INIT_LIST_HEAD(&rdev->semaphore_drv.bo); /* Set asic functions */ r = radeon_asic_init(rdev); diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index bc844fe..465fb34 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c @@ -77,8 +77,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v) /* * IB. */ -static bool radeon_ib_try_free(struct radeon_device *rdev, - struct radeon_ib *ib) +bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib)
[PATCH 2/2] drm/radeon: allocate semaphore from the ib pool
From: Jerome Glisse This allow to share the ib pool with semaphore and avoid having more bo around. Signed-off-by: Jerome Glisse --- drivers/gpu/drm/radeon/radeon.h | 67 - drivers/gpu/drm/radeon/radeon_device.c|2 +- drivers/gpu/drm/radeon/radeon_ring.c |5 +- drivers/gpu/drm/radeon/radeon_semaphore.c | 157 - 4 files changed, 131 insertions(+), 100 deletions(-) diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 8cb6a58..5e35423 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@ -247,32 +247,6 @@ void radeon_fence_unref(struct radeon_fence **fence); int radeon_fence_count_emitted(struct radeon_device *rdev, int ring); /* - * Semaphores. - */ -struct radeon_ring; - -struct radeon_semaphore_driver { - rwlock_tlock; - struct list_headfree; -}; - -struct radeon_semaphore { - struct radeon_bo*robj; - struct list_headlist; - uint64_tgpu_addr; -}; - -void radeon_semaphore_driver_fini(struct radeon_device *rdev); -int radeon_semaphore_create(struct radeon_device *rdev, - struct radeon_semaphore **semaphore); -void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, - struct radeon_semaphore *semaphore); -void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, - struct radeon_semaphore *semaphore); -void radeon_semaphore_free(struct radeon_device *rdev, - struct radeon_semaphore *semaphore); - -/* * Tiling registers */ struct radeon_surface_reg { @@ -410,6 +384,46 @@ int radeon_mode_dumb_destroy(struct drm_file *file_priv, uint32_t handle); /* + * Semaphores. + */ +struct radeon_ring; + +#defineRADEON_SEMAPHORE_BO_SIZE256 + +struct radeon_semaphore_driver { + rwlock_tlock; + struct list_headbo; +}; + +struct radeon_semaphore_bo; + +/* everything here is constant */ +struct radeon_semaphore { + struct list_headlist; + uint64_tgpu_addr; + uint32_t*cpu_ptr; + struct radeon_semaphore_bo *bo; +}; + +struct radeon_semaphore_bo { + struct list_headlist; + struct radeon_ib*ib; + struct list_headfree; + struct radeon_semaphore semaphores[RADEON_SEMAPHORE_BO_SIZE/8]; + unsignednused; +}; + +void radeon_semaphore_driver_fini(struct radeon_device *rdev); +int radeon_semaphore_create(struct radeon_device *rdev, + struct radeon_semaphore **semaphore); +void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, + struct radeon_semaphore *semaphore); +void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, + struct radeon_semaphore *semaphore); +void radeon_semaphore_free(struct radeon_device *rdev, + struct radeon_semaphore *semaphore); + +/* * GART structures, functions & helpers */ struct radeon_mc; @@ -716,6 +730,7 @@ void r600_blit_suspend(struct radeon_device *rdev); int radeon_ib_get(struct radeon_device *rdev, int ring, struct radeon_ib **ib, unsigned size); void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib); +bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib); int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib); int radeon_ib_pool_init(struct radeon_device *rdev); void radeon_ib_pool_fini(struct radeon_device *rdev); diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 6566860..aa9a11e 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c @@ -731,7 +731,7 @@ int radeon_device_init(struct radeon_device *rdev, INIT_LIST_HEAD(&rdev->gem.objects); init_waitqueue_head(&rdev->irq.vblank_queue); init_waitqueue_head(&rdev->irq.idle_queue); - INIT_LIST_HEAD(&rdev->semaphore_drv.free); + INIT_LIST_HEAD(&rdev->semaphore_drv.bo); /* initialize vm here */ rdev->vm_manager.use_bitmap = 1; rdev->vm_manager.max_pfn = 1 << 20; diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 5f9edea..4fe320f 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c @@ -77,8 +77,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v) /* * IB. */ -static bool radeon_ib_try_free(struct radeon_device *rdev, - struct radeon_ib *ib) +bool radeon_ib_try_free(struct radeon_device *rdev, struct
[PATCH 2/2] drm/radeon: allocate semaphore from the ib pool
From: Jerome Glisse This allow to share the ib pool with semaphore and avoid having more bo around. Signed-off-by: Jerome Glisse --- drivers/gpu/drm/radeon/radeon.h | 67 - drivers/gpu/drm/radeon/radeon_device.c|2 +- drivers/gpu/drm/radeon/radeon_ring.c |5 +- drivers/gpu/drm/radeon/radeon_semaphore.c | 157 - 4 files changed, 131 insertions(+), 100 deletions(-) diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 8cb6a58..5e35423 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@ -247,32 +247,6 @@ void radeon_fence_unref(struct radeon_fence **fence); int radeon_fence_count_emitted(struct radeon_device *rdev, int ring); /* - * Semaphores. - */ -struct radeon_ring; - -struct radeon_semaphore_driver { - rwlock_tlock; - struct list_headfree; -}; - -struct radeon_semaphore { - struct radeon_bo*robj; - struct list_headlist; - uint64_tgpu_addr; -}; - -void radeon_semaphore_driver_fini(struct radeon_device *rdev); -int radeon_semaphore_create(struct radeon_device *rdev, - struct radeon_semaphore **semaphore); -void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, - struct radeon_semaphore *semaphore); -void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, - struct radeon_semaphore *semaphore); -void radeon_semaphore_free(struct radeon_device *rdev, - struct radeon_semaphore *semaphore); - -/* * Tiling registers */ struct radeon_surface_reg { @@ -410,6 +384,46 @@ int radeon_mode_dumb_destroy(struct drm_file *file_priv, uint32_t handle); /* + * Semaphores. + */ +struct radeon_ring; + +#defineRADEON_SEMAPHORE_BO_SIZE256 + +struct radeon_semaphore_driver { + rwlock_tlock; + struct list_headbo; +}; + +struct radeon_semaphore_bo; + +/* everything here is constant */ +struct radeon_semaphore { + struct list_headlist; + uint64_tgpu_addr; + uint32_t*cpu_ptr; + struct radeon_semaphore_bo *bo; +}; + +struct radeon_semaphore_bo { + struct list_headlist; + struct radeon_ib*ib; + struct list_headfree; + struct radeon_semaphore semaphores[RADEON_SEMAPHORE_BO_SIZE/8]; + unsignednused; +}; + +void radeon_semaphore_driver_fini(struct radeon_device *rdev); +int radeon_semaphore_create(struct radeon_device *rdev, + struct radeon_semaphore **semaphore); +void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, + struct radeon_semaphore *semaphore); +void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, + struct radeon_semaphore *semaphore); +void radeon_semaphore_free(struct radeon_device *rdev, + struct radeon_semaphore *semaphore); + +/* * GART structures, functions & helpers */ struct radeon_mc; @@ -716,6 +730,7 @@ void r600_blit_suspend(struct radeon_device *rdev); int radeon_ib_get(struct radeon_device *rdev, int ring, struct radeon_ib **ib, unsigned size); void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib); +bool radeon_ib_try_free(struct radeon_device *rdev, struct radeon_ib *ib); int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib); int radeon_ib_pool_init(struct radeon_device *rdev); void radeon_ib_pool_fini(struct radeon_device *rdev); diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 6566860..aa9a11e 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c @@ -731,7 +731,7 @@ int radeon_device_init(struct radeon_device *rdev, INIT_LIST_HEAD(&rdev->gem.objects); init_waitqueue_head(&rdev->irq.vblank_queue); init_waitqueue_head(&rdev->irq.idle_queue); - INIT_LIST_HEAD(&rdev->semaphore_drv.free); + INIT_LIST_HEAD(&rdev->semaphore_drv.bo); /* initialize vm here */ rdev->vm_manager.use_bitmap = 1; rdev->vm_manager.max_pfn = 1 << 20; diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 5f9edea..4fe320f 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c @@ -77,8 +77,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v) /* * IB. */ -static bool radeon_ib_try_free(struct radeon_device *rdev, - struct radeon_ib *ib) +bool radeon_ib_try_free(struct radeon_device *rdev, struc