vc-sm-cma support

This commit is contained in:
Dave Stevenson
2017-12-12 15:50:19 +00:00
committed by popcornmix
parent e3e28c7877
commit 336c8c3d1e
3 changed files with 1433 additions and 721 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -146,14 +146,24 @@ typedef enum
} VCSM_CACHE_TYPE_T;
/* Initialize the vcsm processing with option to use vc-sm-cma which supports dmabuf export.
**
** Must be called once before attempting to do anything else.
**
** Returns 0 on success, -1 on error.
*/
int vcsm_init_ex( int want_export );
/* Initialize the vcsm processing.
**
** Must be called once before attempting to do anything else.
**
** Returns 0 on success, -1 on error.
*/
int vcsm_init( void );
inline int vcsm_init( void )
{
return vcsm_init_ex(0);
}
/* Terminates the vcsm processing.
**
@@ -437,13 +447,14 @@ int vcsm_unlock_hdl_sp( unsigned int handle, int cache_no_flush );
** 2: clean given virtual range in L1/L2
** 3: clean+invalidate given virtual range in L1/L2
*/
#define VCSM_MAX_CLEAN_INVALIDATE_ENTRIES 8
struct vcsm_user_clean_invalid_s {
struct {
unsigned int cmd;
unsigned int handle;
unsigned int addr;
unsigned int size;
} s[8];
} s[VCSM_MAX_CLEAN_INVALIDATE_ENTRIES];
};
int vcsm_clean_invalid( struct vcsm_user_clean_invalid_s *s );
@@ -464,6 +475,8 @@ int vcsm_clean_invalid2( struct vcsm_user_clean_invalid2_s *s );
unsigned int vcsm_import_dmabuf( int dmabuf, char *name );
int vcsm_export_dmabuf( unsigned int vcsm_handle );
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,135 @@
/*
Copyright (c) 2012, Broadcom Europe Ltd
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Copyright 2019 Raspberry Pi (Trading) Ltd. All rights reserved.
*
* Based on vmcs_sm_ioctl.h Copyright Broadcom Corporation.
*/
#ifndef __VC_SM_CMA_IOCTL_H
#define __VC_SM_CMA_IOCTL_H
/* ---- Include Files ---------------------------------------------------- */
#include <linux/types.h> /* Needed for standard types */
#include <linux/ioctl.h>
/* ---- Constants and Types ---------------------------------------------- */
#define VC_SM_CMA_RESOURCE_NAME 32
#define VC_SM_CMA_RESOURCE_NAME_DEFAULT "sm-host-resource"
/* Type define used to create unique IOCTL number */
#define VC_SM_CMA_MAGIC_TYPE 'J'
/* IOCTL commands on /dev/vc-sm-cma */
enum vc_sm_cma_cmd_e {
VC_SM_CMA_CMD_ALLOC = 0x5A, /* Start at 0x5A arbitrarily */
VC_SM_CMA_CMD_IMPORT_DMABUF,
VC_SM_CMA_CMD_CLEAN_INVALID2,
VC_SM_CMA_CMD_LAST /* Do not delete */
};
/* Cache type supported, conveniently matches the user space definition in
* user-vcsm.h.
*/
enum vc_sm_cma_cache_e {
VC_SM_CMA_CACHE_NONE,
VC_SM_CMA_CACHE_HOST,
VC_SM_CMA_CACHE_VC,
VC_SM_CMA_CACHE_BOTH,
};
/* IOCTL Data structures */
struct vc_sm_cma_ioctl_alloc {
/* user -> kernel */
__u32 size;
__u32 num;
__u32 cached; /* enum vc_sm_cma_cache_e */
__u32 pad;
__u8 name[VC_SM_CMA_RESOURCE_NAME];
/* kernel -> user */
__s32 handle;
__u32 vc_handle;
__u64 dma_addr;
};
struct vc_sm_cma_ioctl_import_dmabuf {
/* user -> kernel */
__s32 dmabuf_fd;
__u32 cached; /* enum vc_sm_cma_cache_e */
__u8 name[VC_SM_CMA_RESOURCE_NAME];
/* kernel -> user */
__s32 handle;
__u32 vc_handle;
__u32 size;
__u32 pad;
__u64 dma_addr;
};
/*
* Cache functions to be set to struct vc_sm_cma_ioctl_clean_invalid2
* invalidate_mode.
*/
#define VC_SM_CACHE_OP_NOP 0x00
#define VC_SM_CACHE_OP_INV 0x01
#define VC_SM_CACHE_OP_CLEAN 0x02
#define VC_SM_CACHE_OP_FLUSH 0x03
struct vc_sm_cma_ioctl_clean_invalid2 {
__u32 op_count;
__u32 pad;
struct vc_sm_cma_ioctl_clean_invalid_block {
__u32 invalidate_mode;
__u32 block_count;
void * /*__user */start_address;
__u32 block_size;
__u32 inter_block_stride;
} s[0];
};
/* IOCTL numbers */
#define VC_SM_CMA_IOCTL_MEM_ALLOC\
_IOR(VC_SM_CMA_MAGIC_TYPE, VC_SM_CMA_CMD_ALLOC,\
struct vc_sm_cma_ioctl_alloc)
#define VC_SM_CMA_IOCTL_MEM_IMPORT_DMABUF\
_IOR(VC_SM_CMA_MAGIC_TYPE, VC_SM_CMA_CMD_IMPORT_DMABUF,\
struct vc_sm_cma_ioctl_import_dmabuf)
#define VC_SM_CMA_IOCTL_MEM_CLEAN_INVALID2\
_IOR(VC_SM_CMA_MAGIC_TYPE, VC_SM_CMA_CMD_CLEAN_INVALID2,\
struct vc_sm_cma_ioctl_clean_invalid2)
#endif /* __VC_SM_CMA_IOCTL_H */