mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 04:42:12 +00:00
be5d926b5c
This patch adds the command buffer (CB) module, which allows the user to create and destroy CBs and to map them to the user's process address-space. A command buffer is a memory blocks that reside in DMA-able address-space and is physically contiguous so it can be accessed by the device without MMU translation. The command buffer memory is allocated using the coherent DMA API. When creating a new CB, the IOCTL returns a handle of it, and the user-space process needs to use that handle to mmap the buffer to get a VA in the user's address-space. Before destroying (freeing) a CB, the user must unmap the CB's VA using the CB handle. Each CB has a reference counter, which tracks its usage in command submissions and also its mmaps (only a single mmap is allowed). The driver maintains a pool of pre-allocated CBs in order to reduce latency during command submissions. In case the pool is empty, the driver will go to the slow-path of allocating a new CB, i.e. calling dma_alloc_coherent. Reviewed-by: Mike Rapoport <rppt@linux.ibm.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
67 lines
1.5 KiB
C
67 lines
1.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
|
|
*
|
|
* Copyright 2016-2018 HabanaLabs, Ltd.
|
|
* All Rights Reserved.
|
|
*
|
|
*/
|
|
|
|
#ifndef HABANALABS_H_
|
|
#define HABANALABS_H_
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/ioctl.h>
|
|
|
|
/*
|
|
* Defines that are asic-specific but constitutes as ABI between kernel driver
|
|
* and userspace
|
|
*/
|
|
#define GOYA_KMD_SRAM_RESERVED_SIZE_FROM_START 0x8000 /* 32KB */
|
|
|
|
/* Opcode to create a new command buffer */
|
|
#define HL_CB_OP_CREATE 0
|
|
/* Opcode to destroy previously created command buffer */
|
|
#define HL_CB_OP_DESTROY 1
|
|
|
|
struct hl_cb_in {
|
|
/* Handle of CB or 0 if we want to create one */
|
|
__u64 cb_handle;
|
|
/* HL_CB_OP_* */
|
|
__u32 op;
|
|
/* Size of CB. Minimum requested size must be PAGE_SIZE */
|
|
__u32 cb_size;
|
|
/* Context ID - Currently not in use */
|
|
__u32 ctx_id;
|
|
__u32 pad;
|
|
};
|
|
|
|
struct hl_cb_out {
|
|
/* Handle of CB */
|
|
__u64 cb_handle;
|
|
};
|
|
|
|
union hl_cb_args {
|
|
struct hl_cb_in in;
|
|
struct hl_cb_out out;
|
|
};
|
|
|
|
/*
|
|
* Command Buffer
|
|
* - Request a Command Buffer
|
|
* - Destroy a Command Buffer
|
|
*
|
|
* The command buffers are memory blocks that reside in DMA-able address
|
|
* space and are physically contiguous so they can be accessed by the device
|
|
* directly. They are allocated using the coherent DMA API.
|
|
*
|
|
* When creating a new CB, the IOCTL returns a handle of it, and the user-space
|
|
* process needs to use that handle to mmap the buffer so it can access them.
|
|
*
|
|
*/
|
|
#define HL_IOCTL_CB \
|
|
_IOWR('H', 0x02, union hl_cb_args)
|
|
|
|
#define HL_COMMAND_START 0x02
|
|
#define HL_COMMAND_END 0x03
|
|
|
|
#endif /* HABANALABS_H_ */
|