blob: f43f301f26553e34a5ad8b00a7f0e61704129c81 [file] [log] [blame]
/*
* Copyright (C) 2016 Samsung Electronics Co.Ltd
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#ifndef __IVA_MEM_H__
#define __IVA_MEM_H__
#include "iva_ctrl.h"
#include "iva_ctrl_ioctl.h"
#ifdef CONFIG_ION_EXYNOS
#include <linux/ion_exynos.h>
#define REQ_ION_HEAP_ID EXYNOS_ION_HEAP_SYSTEM_MASK
#else
#define REQ_ION_HEAP_ID ZONE_BIT(ION_HEAP_TYPE_EXT)
#endif
/* iva iova mapping flags */
#define IVA_ALLOC_CACHE_MASK (0x3)
#define IVA_ALLOC_CACHE_SHIFT (8)
#define GET_IVA_CACHE_TYPE(flag) ((flag >> IVA_ALLOC_CACHE_SHIFT) & \
IVA_ALLOC_CACHE_MASK)
#define SET_IVA_CACHE_TYPE(flag, a) (flag |= (a & IVA_ALLOC_CACHE_MASK) << \
IVA_ALLOC_CACHE_SHIFT)
#define IVA_FREE_REQ_MASK (0x1)
#define IVA_FREE_REQ_SHIFT (4) /* free requested */
#define IVA_FREE_REQUESTED (IVA_FREE_REQ_MASK << IVA_FREE_REQ_SHIFT)
#define FREE_REQUESTED(flag) (flag & IVA_FREE_REQUESTED)
#define IVA_ALLOC_TYPE_MASK (0x3)
#define IVA_ALLOC_TYPE_SHIFT (0)
#define IVA_ALLOC_TYPE_IMPORTED (0x2) /* from outside */
#define IVA_ALLOC_TYPE_ALLOCATED (0x1) /* from inside */
#define IVA_ALLOC_TYPE_NOT_DEFINED (0) /* not allocated or freed */
#define GET_IVA_ALLOC_TYPE(flag) \
((flag >> IVA_ALLOC_TYPE_SHIFT) & IVA_ALLOC_TYPE_MASK)
#define SET_IVA_ALLOC_TYPE(flag, a) \
(flag |= (a & IVA_ALLOC_TYPE_MASK) << IVA_ALLOC_TYPE_SHIFT)
#define ALLOC_INSIDE(flag) (flag & IVA_ALLOC_TYPE_ALLOCATED)
#define ALLOC_OUTSIDE(flag) (flag & IVA_ALLOC_TYPE_IMPORTED)
#ifndef CONFIG_ION_EXYNOS
extern struct ion_device *idev; /* CONFIG_ION_DUMMY */
#endif
struct iva_mem_map {
/* TO DO: ref */
struct list_head node; /* global */
struct hlist_node h_node; /* per process */
int flags;
struct kref map_ref; /* iova mapping */
struct device *dev;
int shared_fd;
struct dma_buf *dmabuf;
struct dma_buf_attachment *attachment;
struct sg_table *sg_table;
unsigned long io_va;
uint32_t req_size; /* requested size */
uint32_t act_size; /* actual_size */
};
extern int iva_mem_map_read_refcnt(struct iva_mem_map *iva_map);
extern void iva_mem_show_global_mapped_list_lock(struct iva_dev_data *iva,
bool lock);
static inline void iva_mem_show_global_mapped_list(struct iva_dev_data *iva)
{
iva_mem_show_global_mapped_list_lock(iva, true);
}
static inline void iva_mem_show_global_mapped_list_nolock(struct iva_dev_data *iva)
{
iva_mem_show_global_mapped_list_lock(iva, false);
}
extern struct iva_mem_map *iva_mem_find_proc_map_with_fd(struct iva_proc *proc,
int shared_fd);
static inline struct dma_buf *iva_mem_get_dmabuf_with_fd(struct iva_proc *proc,
int shared_fd)
{
struct iva_mem_map *iva_map_node;
iva_map_node = iva_mem_find_proc_map_with_fd(proc, shared_fd);
if (!iva_map_node)
return NULL;
return iva_map_node->dmabuf;
}
extern long iva_mem_ioctl(struct iva_proc *proc,
unsigned int cmd, void __user *p);
extern void iva_mem_init_proc_mem(struct iva_proc *proc);
extern void iva_mem_deinit_proc_mem(struct iva_proc *proc);
extern int iva_mem_create_ion_client(struct iva_dev_data *iva);
extern int iva_mem_destroy_ion_client(struct iva_dev_data *iva);
#endif /* __IVA_MBOX_H */