162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci/* Copyright (C) 2017-2018 Broadcom */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include "v3d_drv.h"
562306a36Sopenharmony_ci
662306a36Sopenharmony_cistruct dma_fence *v3d_fence_create(struct v3d_dev *v3d, enum v3d_queue queue)
762306a36Sopenharmony_ci{
862306a36Sopenharmony_ci	struct v3d_fence *fence;
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci	fence = kzalloc(sizeof(*fence), GFP_KERNEL);
1162306a36Sopenharmony_ci	if (!fence)
1262306a36Sopenharmony_ci		return ERR_PTR(-ENOMEM);
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci	fence->dev = &v3d->drm;
1562306a36Sopenharmony_ci	fence->queue = queue;
1662306a36Sopenharmony_ci	fence->seqno = ++v3d->queue[queue].emit_seqno;
1762306a36Sopenharmony_ci	dma_fence_init(&fence->base, &v3d_fence_ops, &v3d->job_lock,
1862306a36Sopenharmony_ci		       v3d->queue[queue].fence_context, fence->seqno);
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	return &fence->base;
2162306a36Sopenharmony_ci}
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic const char *v3d_fence_get_driver_name(struct dma_fence *fence)
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	return "v3d";
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistatic const char *v3d_fence_get_timeline_name(struct dma_fence *fence)
2962306a36Sopenharmony_ci{
3062306a36Sopenharmony_ci	struct v3d_fence *f = to_v3d_fence(fence);
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	switch (f->queue) {
3362306a36Sopenharmony_ci	case V3D_BIN:
3462306a36Sopenharmony_ci		return "v3d-bin";
3562306a36Sopenharmony_ci	case V3D_RENDER:
3662306a36Sopenharmony_ci		return "v3d-render";
3762306a36Sopenharmony_ci	case V3D_TFU:
3862306a36Sopenharmony_ci		return "v3d-tfu";
3962306a36Sopenharmony_ci	case V3D_CSD:
4062306a36Sopenharmony_ci		return "v3d-csd";
4162306a36Sopenharmony_ci	default:
4262306a36Sopenharmony_ci		return NULL;
4362306a36Sopenharmony_ci	}
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciconst struct dma_fence_ops v3d_fence_ops = {
4762306a36Sopenharmony_ci	.get_driver_name = v3d_fence_get_driver_name,
4862306a36Sopenharmony_ci	.get_timeline_name = v3d_fence_get_timeline_name,
4962306a36Sopenharmony_ci};
50