[PATCH v1 01/14] tee: flexible shared memory pool creation

2017-10-13 Thread Volodymyr Babchuk
From: Jens Wiklander 

Makes creation of shm pools more flexible by adding new more primitive
functions to allocate a shm pool. This makes it easier to add driver
specific shm pool management.

Signed-off-by: Jens Wiklander 
Signed-off-by: Volodymyr Babchuk 
---
 drivers/tee/tee_private.h  |  57 +---
 drivers/tee/tee_shm.c  |   8 +--
 drivers/tee/tee_shm_pool.c | 165 -
 include/linux/tee_drv.h|  91 +
 4 files changed, 199 insertions(+), 122 deletions(-)

diff --git a/drivers/tee/tee_private.h b/drivers/tee/tee_private.h
index 21cb6be..2bc2b5a 100644
--- a/drivers/tee/tee_private.h
+++ b/drivers/tee/tee_private.h
@@ -21,68 +21,15 @@
 #include 
 #include 
 
-struct tee_device;
-
-/**
- * struct tee_shm - shared memory object
- * @teedev:device used to allocate the object
- * @ctx:   context using the object, if NULL the context is gone
- * @link   link element
- * @paddr: physical address of the shared memory
- * @kaddr: virtual address of the shared memory
- * @size:  size of shared memory
- * @dmabuf:dmabuf used to for exporting to user space
- * @flags: defined by TEE_SHM_* in tee_drv.h
- * @id:unique id of a shared memory object on this device
- */
-struct tee_shm {
-   struct tee_device *teedev;
-   struct tee_context *ctx;
-   struct list_head link;
-   phys_addr_t paddr;
-   void *kaddr;
-   size_t size;
-   struct dma_buf *dmabuf;
-   u32 flags;
-   int id;
-};
-
-struct tee_shm_pool_mgr;
-
-/**
- * struct tee_shm_pool_mgr_ops - shared memory pool manager operations
- * @alloc: called when allocating shared memory
- * @free:  called when freeing shared memory
- */
-struct tee_shm_pool_mgr_ops {
-   int (*alloc)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm,
-size_t size);
-   void (*free)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm);
-};
-
-/**
- * struct tee_shm_pool_mgr - shared memory manager
- * @ops:   operations
- * @private_data:  private data for the shared memory manager
- */
-struct tee_shm_pool_mgr {
-   const struct tee_shm_pool_mgr_ops *ops;
-   void *private_data;
-};
-
 /**
  * struct tee_shm_pool - shared memory pool
  * @private_mgr:   pool manager for shared memory only between kernel
  * and secure world
  * @dma_buf_mgr:   pool manager for shared memory exported to user space
- * @destroy:   called when destroying the pool
- * @private_data:  private data for the pool
  */
 struct tee_shm_pool {
-   struct tee_shm_pool_mgr private_mgr;
-   struct tee_shm_pool_mgr dma_buf_mgr;
-   void (*destroy)(struct tee_shm_pool *pool);
-   void *private_data;
+   struct tee_shm_pool_mgr *private_mgr;
+   struct tee_shm_pool_mgr *dma_buf_mgr;
 };
 
 #define TEE_DEVICE_FLAG_REGISTERED 0x1
diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
index 4bc7956..fdda89e 100644
--- a/drivers/tee/tee_shm.c
+++ b/drivers/tee/tee_shm.c
@@ -32,9 +32,9 @@ static void tee_shm_release(struct tee_shm *shm)
mutex_unlock(>mutex);
 
if (shm->flags & TEE_SHM_DMA_BUF)
-   poolm = >pool->dma_buf_mgr;
+   poolm = teedev->pool->dma_buf_mgr;
else
-   poolm = >pool->private_mgr;
+   poolm = teedev->pool->private_mgr;
 
poolm->ops->free(poolm, shm);
kfree(shm);
@@ -139,9 +139,9 @@ struct tee_shm *tee_shm_alloc(struct tee_context *ctx, 
size_t size, u32 flags)
shm->teedev = teedev;
shm->ctx = ctx;
if (flags & TEE_SHM_DMA_BUF)
-   poolm = >pool->dma_buf_mgr;
+   poolm = teedev->pool->dma_buf_mgr;
else
-   poolm = >pool->private_mgr;
+   poolm = teedev->pool->private_mgr;
 
rc = poolm->ops->alloc(poolm, shm, size);
if (rc) {
diff --git a/drivers/tee/tee_shm_pool.c b/drivers/tee/tee_shm_pool.c
index fb4f852..e6d4b9e 100644
--- a/drivers/tee/tee_shm_pool.c
+++ b/drivers/tee/tee_shm_pool.c
@@ -44,49 +44,18 @@ static void pool_op_gen_free(struct tee_shm_pool_mgr *poolm,
shm->kaddr = NULL;
 }
 
+static void pool_op_gen_destroy_poolmgr(struct tee_shm_pool_mgr *poolm)
+{
+   gen_pool_destroy(poolm->private_data);
+   kfree(poolm);
+}
+
 static const struct tee_shm_pool_mgr_ops pool_ops_generic = {
.alloc = pool_op_gen_alloc,
.free = pool_op_gen_free,
+   .destroy_poolmgr = pool_op_gen_destroy_poolmgr,
 };
 
-static void pool_res_mem_destroy(struct tee_shm_pool *pool)
-{
-   gen_pool_destroy(pool->private_mgr.private_data);
-   gen_pool_destroy(pool->dma_buf_mgr.private_data);
-}
-
-static int pool_res_mem_mgr_init(struct tee_shm_pool_mgr *mgr,
-struct tee_shm_pool_mem_info *info,
- 

[PATCH v1 01/14] tee: flexible shared memory pool creation

2017-10-13 Thread Volodymyr Babchuk
From: Jens Wiklander 

Makes creation of shm pools more flexible by adding new more primitive
functions to allocate a shm pool. This makes it easier to add driver
specific shm pool management.

Signed-off-by: Jens Wiklander 
Signed-off-by: Volodymyr Babchuk 
---
 drivers/tee/tee_private.h  |  57 +---
 drivers/tee/tee_shm.c  |   8 +--
 drivers/tee/tee_shm_pool.c | 165 -
 include/linux/tee_drv.h|  91 +
 4 files changed, 199 insertions(+), 122 deletions(-)

diff --git a/drivers/tee/tee_private.h b/drivers/tee/tee_private.h
index 21cb6be..2bc2b5a 100644
--- a/drivers/tee/tee_private.h
+++ b/drivers/tee/tee_private.h
@@ -21,68 +21,15 @@
 #include 
 #include 
 
-struct tee_device;
-
-/**
- * struct tee_shm - shared memory object
- * @teedev:device used to allocate the object
- * @ctx:   context using the object, if NULL the context is gone
- * @link   link element
- * @paddr: physical address of the shared memory
- * @kaddr: virtual address of the shared memory
- * @size:  size of shared memory
- * @dmabuf:dmabuf used to for exporting to user space
- * @flags: defined by TEE_SHM_* in tee_drv.h
- * @id:unique id of a shared memory object on this device
- */
-struct tee_shm {
-   struct tee_device *teedev;
-   struct tee_context *ctx;
-   struct list_head link;
-   phys_addr_t paddr;
-   void *kaddr;
-   size_t size;
-   struct dma_buf *dmabuf;
-   u32 flags;
-   int id;
-};
-
-struct tee_shm_pool_mgr;
-
-/**
- * struct tee_shm_pool_mgr_ops - shared memory pool manager operations
- * @alloc: called when allocating shared memory
- * @free:  called when freeing shared memory
- */
-struct tee_shm_pool_mgr_ops {
-   int (*alloc)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm,
-size_t size);
-   void (*free)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm);
-};
-
-/**
- * struct tee_shm_pool_mgr - shared memory manager
- * @ops:   operations
- * @private_data:  private data for the shared memory manager
- */
-struct tee_shm_pool_mgr {
-   const struct tee_shm_pool_mgr_ops *ops;
-   void *private_data;
-};
-
 /**
  * struct tee_shm_pool - shared memory pool
  * @private_mgr:   pool manager for shared memory only between kernel
  * and secure world
  * @dma_buf_mgr:   pool manager for shared memory exported to user space
- * @destroy:   called when destroying the pool
- * @private_data:  private data for the pool
  */
 struct tee_shm_pool {
-   struct tee_shm_pool_mgr private_mgr;
-   struct tee_shm_pool_mgr dma_buf_mgr;
-   void (*destroy)(struct tee_shm_pool *pool);
-   void *private_data;
+   struct tee_shm_pool_mgr *private_mgr;
+   struct tee_shm_pool_mgr *dma_buf_mgr;
 };
 
 #define TEE_DEVICE_FLAG_REGISTERED 0x1
diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
index 4bc7956..fdda89e 100644
--- a/drivers/tee/tee_shm.c
+++ b/drivers/tee/tee_shm.c
@@ -32,9 +32,9 @@ static void tee_shm_release(struct tee_shm *shm)
mutex_unlock(>mutex);
 
if (shm->flags & TEE_SHM_DMA_BUF)
-   poolm = >pool->dma_buf_mgr;
+   poolm = teedev->pool->dma_buf_mgr;
else
-   poolm = >pool->private_mgr;
+   poolm = teedev->pool->private_mgr;
 
poolm->ops->free(poolm, shm);
kfree(shm);
@@ -139,9 +139,9 @@ struct tee_shm *tee_shm_alloc(struct tee_context *ctx, 
size_t size, u32 flags)
shm->teedev = teedev;
shm->ctx = ctx;
if (flags & TEE_SHM_DMA_BUF)
-   poolm = >pool->dma_buf_mgr;
+   poolm = teedev->pool->dma_buf_mgr;
else
-   poolm = >pool->private_mgr;
+   poolm = teedev->pool->private_mgr;
 
rc = poolm->ops->alloc(poolm, shm, size);
if (rc) {
diff --git a/drivers/tee/tee_shm_pool.c b/drivers/tee/tee_shm_pool.c
index fb4f852..e6d4b9e 100644
--- a/drivers/tee/tee_shm_pool.c
+++ b/drivers/tee/tee_shm_pool.c
@@ -44,49 +44,18 @@ static void pool_op_gen_free(struct tee_shm_pool_mgr *poolm,
shm->kaddr = NULL;
 }
 
+static void pool_op_gen_destroy_poolmgr(struct tee_shm_pool_mgr *poolm)
+{
+   gen_pool_destroy(poolm->private_data);
+   kfree(poolm);
+}
+
 static const struct tee_shm_pool_mgr_ops pool_ops_generic = {
.alloc = pool_op_gen_alloc,
.free = pool_op_gen_free,
+   .destroy_poolmgr = pool_op_gen_destroy_poolmgr,
 };
 
-static void pool_res_mem_destroy(struct tee_shm_pool *pool)
-{
-   gen_pool_destroy(pool->private_mgr.private_data);
-   gen_pool_destroy(pool->dma_buf_mgr.private_data);
-}
-
-static int pool_res_mem_mgr_init(struct tee_shm_pool_mgr *mgr,
-struct tee_shm_pool_mem_info *info,
-int min_alloc_order)
-{
-   size_t 

[PATCH v1 01/14] tee: flexible shared memory pool creation

2017-09-28 Thread Volodymyr Babchuk
From: Jens Wiklander 

Makes creation of shm pools more flexible by adding new more primitive
functions to allocate a shm pool. This makes it easier to add driver
specific shm pool management.

Signed-off-by: Jens Wiklander 
Signed-off-by: Volodymyr Babchuk 
---
 drivers/tee/tee_private.h  |  57 +---
 drivers/tee/tee_shm.c  |   8 +--
 drivers/tee/tee_shm_pool.c | 165 -
 include/linux/tee_drv.h|  91 +
 4 files changed, 199 insertions(+), 122 deletions(-)

diff --git a/drivers/tee/tee_private.h b/drivers/tee/tee_private.h
index 21cb6be..2bc2b5a 100644
--- a/drivers/tee/tee_private.h
+++ b/drivers/tee/tee_private.h
@@ -21,68 +21,15 @@
 #include 
 #include 
 
-struct tee_device;
-
-/**
- * struct tee_shm - shared memory object
- * @teedev:device used to allocate the object
- * @ctx:   context using the object, if NULL the context is gone
- * @link   link element
- * @paddr: physical address of the shared memory
- * @kaddr: virtual address of the shared memory
- * @size:  size of shared memory
- * @dmabuf:dmabuf used to for exporting to user space
- * @flags: defined by TEE_SHM_* in tee_drv.h
- * @id:unique id of a shared memory object on this device
- */
-struct tee_shm {
-   struct tee_device *teedev;
-   struct tee_context *ctx;
-   struct list_head link;
-   phys_addr_t paddr;
-   void *kaddr;
-   size_t size;
-   struct dma_buf *dmabuf;
-   u32 flags;
-   int id;
-};
-
-struct tee_shm_pool_mgr;
-
-/**
- * struct tee_shm_pool_mgr_ops - shared memory pool manager operations
- * @alloc: called when allocating shared memory
- * @free:  called when freeing shared memory
- */
-struct tee_shm_pool_mgr_ops {
-   int (*alloc)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm,
-size_t size);
-   void (*free)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm);
-};
-
-/**
- * struct tee_shm_pool_mgr - shared memory manager
- * @ops:   operations
- * @private_data:  private data for the shared memory manager
- */
-struct tee_shm_pool_mgr {
-   const struct tee_shm_pool_mgr_ops *ops;
-   void *private_data;
-};
-
 /**
  * struct tee_shm_pool - shared memory pool
  * @private_mgr:   pool manager for shared memory only between kernel
  * and secure world
  * @dma_buf_mgr:   pool manager for shared memory exported to user space
- * @destroy:   called when destroying the pool
- * @private_data:  private data for the pool
  */
 struct tee_shm_pool {
-   struct tee_shm_pool_mgr private_mgr;
-   struct tee_shm_pool_mgr dma_buf_mgr;
-   void (*destroy)(struct tee_shm_pool *pool);
-   void *private_data;
+   struct tee_shm_pool_mgr *private_mgr;
+   struct tee_shm_pool_mgr *dma_buf_mgr;
 };
 
 #define TEE_DEVICE_FLAG_REGISTERED 0x1
diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
index 4bc7956..fdda89e 100644
--- a/drivers/tee/tee_shm.c
+++ b/drivers/tee/tee_shm.c
@@ -32,9 +32,9 @@ static void tee_shm_release(struct tee_shm *shm)
mutex_unlock(>mutex);
 
if (shm->flags & TEE_SHM_DMA_BUF)
-   poolm = >pool->dma_buf_mgr;
+   poolm = teedev->pool->dma_buf_mgr;
else
-   poolm = >pool->private_mgr;
+   poolm = teedev->pool->private_mgr;
 
poolm->ops->free(poolm, shm);
kfree(shm);
@@ -139,9 +139,9 @@ struct tee_shm *tee_shm_alloc(struct tee_context *ctx, 
size_t size, u32 flags)
shm->teedev = teedev;
shm->ctx = ctx;
if (flags & TEE_SHM_DMA_BUF)
-   poolm = >pool->dma_buf_mgr;
+   poolm = teedev->pool->dma_buf_mgr;
else
-   poolm = >pool->private_mgr;
+   poolm = teedev->pool->private_mgr;
 
rc = poolm->ops->alloc(poolm, shm, size);
if (rc) {
diff --git a/drivers/tee/tee_shm_pool.c b/drivers/tee/tee_shm_pool.c
index fb4f852..e6d4b9e 100644
--- a/drivers/tee/tee_shm_pool.c
+++ b/drivers/tee/tee_shm_pool.c
@@ -44,49 +44,18 @@ static void pool_op_gen_free(struct tee_shm_pool_mgr *poolm,
shm->kaddr = NULL;
 }
 
+static void pool_op_gen_destroy_poolmgr(struct tee_shm_pool_mgr *poolm)
+{
+   gen_pool_destroy(poolm->private_data);
+   kfree(poolm);
+}
+
 static const struct tee_shm_pool_mgr_ops pool_ops_generic = {
.alloc = pool_op_gen_alloc,
.free = pool_op_gen_free,
+   .destroy_poolmgr = pool_op_gen_destroy_poolmgr,
 };
 
-static void pool_res_mem_destroy(struct tee_shm_pool *pool)
-{
-   gen_pool_destroy(pool->private_mgr.private_data);
-   gen_pool_destroy(pool->dma_buf_mgr.private_data);
-}
-
-static int pool_res_mem_mgr_init(struct tee_shm_pool_mgr *mgr,
-struct tee_shm_pool_mem_info *info,
- 

[PATCH v1 01/14] tee: flexible shared memory pool creation

2017-09-28 Thread Volodymyr Babchuk
From: Jens Wiklander 

Makes creation of shm pools more flexible by adding new more primitive
functions to allocate a shm pool. This makes it easier to add driver
specific shm pool management.

Signed-off-by: Jens Wiklander 
Signed-off-by: Volodymyr Babchuk 
---
 drivers/tee/tee_private.h  |  57 +---
 drivers/tee/tee_shm.c  |   8 +--
 drivers/tee/tee_shm_pool.c | 165 -
 include/linux/tee_drv.h|  91 +
 4 files changed, 199 insertions(+), 122 deletions(-)

diff --git a/drivers/tee/tee_private.h b/drivers/tee/tee_private.h
index 21cb6be..2bc2b5a 100644
--- a/drivers/tee/tee_private.h
+++ b/drivers/tee/tee_private.h
@@ -21,68 +21,15 @@
 #include 
 #include 
 
-struct tee_device;
-
-/**
- * struct tee_shm - shared memory object
- * @teedev:device used to allocate the object
- * @ctx:   context using the object, if NULL the context is gone
- * @link   link element
- * @paddr: physical address of the shared memory
- * @kaddr: virtual address of the shared memory
- * @size:  size of shared memory
- * @dmabuf:dmabuf used to for exporting to user space
- * @flags: defined by TEE_SHM_* in tee_drv.h
- * @id:unique id of a shared memory object on this device
- */
-struct tee_shm {
-   struct tee_device *teedev;
-   struct tee_context *ctx;
-   struct list_head link;
-   phys_addr_t paddr;
-   void *kaddr;
-   size_t size;
-   struct dma_buf *dmabuf;
-   u32 flags;
-   int id;
-};
-
-struct tee_shm_pool_mgr;
-
-/**
- * struct tee_shm_pool_mgr_ops - shared memory pool manager operations
- * @alloc: called when allocating shared memory
- * @free:  called when freeing shared memory
- */
-struct tee_shm_pool_mgr_ops {
-   int (*alloc)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm,
-size_t size);
-   void (*free)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm);
-};
-
-/**
- * struct tee_shm_pool_mgr - shared memory manager
- * @ops:   operations
- * @private_data:  private data for the shared memory manager
- */
-struct tee_shm_pool_mgr {
-   const struct tee_shm_pool_mgr_ops *ops;
-   void *private_data;
-};
-
 /**
  * struct tee_shm_pool - shared memory pool
  * @private_mgr:   pool manager for shared memory only between kernel
  * and secure world
  * @dma_buf_mgr:   pool manager for shared memory exported to user space
- * @destroy:   called when destroying the pool
- * @private_data:  private data for the pool
  */
 struct tee_shm_pool {
-   struct tee_shm_pool_mgr private_mgr;
-   struct tee_shm_pool_mgr dma_buf_mgr;
-   void (*destroy)(struct tee_shm_pool *pool);
-   void *private_data;
+   struct tee_shm_pool_mgr *private_mgr;
+   struct tee_shm_pool_mgr *dma_buf_mgr;
 };
 
 #define TEE_DEVICE_FLAG_REGISTERED 0x1
diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
index 4bc7956..fdda89e 100644
--- a/drivers/tee/tee_shm.c
+++ b/drivers/tee/tee_shm.c
@@ -32,9 +32,9 @@ static void tee_shm_release(struct tee_shm *shm)
mutex_unlock(>mutex);
 
if (shm->flags & TEE_SHM_DMA_BUF)
-   poolm = >pool->dma_buf_mgr;
+   poolm = teedev->pool->dma_buf_mgr;
else
-   poolm = >pool->private_mgr;
+   poolm = teedev->pool->private_mgr;
 
poolm->ops->free(poolm, shm);
kfree(shm);
@@ -139,9 +139,9 @@ struct tee_shm *tee_shm_alloc(struct tee_context *ctx, 
size_t size, u32 flags)
shm->teedev = teedev;
shm->ctx = ctx;
if (flags & TEE_SHM_DMA_BUF)
-   poolm = >pool->dma_buf_mgr;
+   poolm = teedev->pool->dma_buf_mgr;
else
-   poolm = >pool->private_mgr;
+   poolm = teedev->pool->private_mgr;
 
rc = poolm->ops->alloc(poolm, shm, size);
if (rc) {
diff --git a/drivers/tee/tee_shm_pool.c b/drivers/tee/tee_shm_pool.c
index fb4f852..e6d4b9e 100644
--- a/drivers/tee/tee_shm_pool.c
+++ b/drivers/tee/tee_shm_pool.c
@@ -44,49 +44,18 @@ static void pool_op_gen_free(struct tee_shm_pool_mgr *poolm,
shm->kaddr = NULL;
 }
 
+static void pool_op_gen_destroy_poolmgr(struct tee_shm_pool_mgr *poolm)
+{
+   gen_pool_destroy(poolm->private_data);
+   kfree(poolm);
+}
+
 static const struct tee_shm_pool_mgr_ops pool_ops_generic = {
.alloc = pool_op_gen_alloc,
.free = pool_op_gen_free,
+   .destroy_poolmgr = pool_op_gen_destroy_poolmgr,
 };
 
-static void pool_res_mem_destroy(struct tee_shm_pool *pool)
-{
-   gen_pool_destroy(pool->private_mgr.private_data);
-   gen_pool_destroy(pool->dma_buf_mgr.private_data);
-}
-
-static int pool_res_mem_mgr_init(struct tee_shm_pool_mgr *mgr,
-struct tee_shm_pool_mem_info *info,
-int min_alloc_order)
-{
-   size_t