Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8c05940 authored by Jerome Glisse's avatar Jerome Glisse Committed by Dave Airlie
Browse files

drm/radeon: simplify semaphore handling v2



Directly use the suballocator to get small chunks of memory.
It's equally fast and doesn't crash when we encounter a GPU reset.

v2: rebased on new SA interface.

Signed-off-by: default avatarChristian König <deathsimple@vodafone.de>
Signed-off-by: default avatarJerome Glisse <jglisse@redhat.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent c3b7fe8b
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -3550,7 +3550,6 @@ void evergreen_fini(struct radeon_device *rdev)
	evergreen_pcie_gart_fini(rdev);
	r600_vram_scratch_fini(rdev);
	radeon_gem_fini(rdev);
	radeon_semaphore_driver_fini(rdev);
	radeon_fence_driver_fini(rdev);
	radeon_agp_fini(rdev);
	radeon_bo_fini(rdev);
+0 −1
Original line number Diff line number Diff line
@@ -1744,7 +1744,6 @@ void cayman_fini(struct radeon_device *rdev)
	cayman_pcie_gart_fini(rdev);
	r600_vram_scratch_fini(rdev);
	radeon_gem_fini(rdev);
	radeon_semaphore_driver_fini(rdev);
	radeon_fence_driver_fini(rdev);
	radeon_bo_fini(rdev);
	radeon_atombios_fini(rdev);
+0 −1
Original line number Diff line number Diff line
@@ -2658,7 +2658,6 @@ void r600_fini(struct radeon_device *rdev)
	r600_vram_scratch_fini(rdev);
	radeon_agp_fini(rdev);
	radeon_gem_fini(rdev);
	radeon_semaphore_driver_fini(rdev);
	radeon_fence_driver_fini(rdev);
	radeon_bo_fini(rdev);
	radeon_atombios_fini(rdev);
+4 −25
Original line number Diff line number Diff line
@@ -434,34 +434,13 @@ int radeon_mode_dumb_destroy(struct drm_file *file_priv,
/*
 * Semaphores.
 */
struct radeon_ring;

#define	RADEON_SEMAPHORE_BO_SIZE	256

struct radeon_semaphore_driver {
	rwlock_t			lock;
	struct list_head		bo;
};

struct radeon_semaphore_bo;

/* everything here is constant */
struct radeon_semaphore {
	struct list_head		list;
	struct radeon_sa_bo		*sa_bo;
	signed				waiters;
	uint64_t			gpu_addr;
	uint32_t			*cpu_ptr;
	struct radeon_semaphore_bo	*bo;
};

struct radeon_semaphore_bo {
	struct list_head		list;
	struct radeon_ib		*ib;
	struct list_head		free;
	struct radeon_semaphore		semaphores[RADEON_SEMAPHORE_BO_SIZE/8];
	unsigned			nused;
};

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,
@@ -473,7 +452,8 @@ int radeon_semaphore_sync_rings(struct radeon_device *rdev,
				bool sync_to[RADEON_NUM_RINGS],
				int dst_ring);
void radeon_semaphore_free(struct radeon_device *rdev,
			   struct radeon_semaphore *semaphore);
			   struct radeon_semaphore *semaphore,
			   struct radeon_fence *fence);

/*
 * GART structures, functions & helpers
@@ -1540,7 +1520,6 @@ struct radeon_device {
	struct radeon_mman		mman;
	struct radeon_fence_driver	fence_drv[RADEON_NUM_RINGS];
	wait_queue_head_t		fence_queue;
	struct radeon_semaphore_driver	semaphore_drv;
	struct mutex			ring_lock;
	struct radeon_ring		ring[RADEON_NUM_RINGS];
	struct radeon_ib_pool		ib_pool;
+0 −2
Original line number Diff line number Diff line
@@ -732,11 +732,9 @@ int radeon_device_init(struct radeon_device *rdev,
	mutex_init(&rdev->gem.mutex);
	mutex_init(&rdev->pm.mutex);
	mutex_init(&rdev->vram_mutex);
	rwlock_init(&rdev->semaphore_drv.lock);
	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.bo);
	/* initialize vm here */
	rdev->vm_manager.use_bitmap = 1;
	rdev->vm_manager.max_pfn = 1 << 20;
Loading