Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6ad49b17 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ion: Assume in-kernel clients for prefetch and drain"

parents bba34cd5 5bf40581
Loading
Loading
Loading
Loading
+34 −48
Original line number Original line Diff line number Diff line
@@ -15,6 +15,7 @@
#include "msm_ion_priv.h"
#include "msm_ion_priv.h"
#include "ion_secure_util.h"
#include "ion_secure_util.h"


#define MAX_NR_PREFETCH_REGIONS 32
#define to_system_secure_heap(_heap) \
#define to_system_secure_heap(_heap) \
	container_of(to_msm_ion_heap(_heap), struct ion_system_secure_heap, \
	container_of(to_msm_ion_heap(_heap), struct ion_system_secure_heap, \
		     heap)
		     heap)
@@ -207,69 +208,43 @@ static void ion_system_secure_heap_prefetch_work(struct work_struct *work)
	spin_unlock_irqrestore(&secure_heap->work_lock, flags);
	spin_unlock_irqrestore(&secure_heap->work_lock, flags);
}
}


static int alloc_prefetch_info(struct ion_prefetch_regions __user *
static int alloc_prefetch_info(struct ion_prefetch_region *region,
			       user_regions, bool shrink,
			       bool shrink, struct list_head *items)
			       struct list_head *items)
{
{
	struct prefetch_info *info;
	struct prefetch_info *info;
	u64 user_sizes;
	int err;
	unsigned int nr_sizes, vmid, i;


	err = get_user(nr_sizes, &user_regions->nr_sizes);
	if (!is_secure_vmid_valid(get_secure_vmid(region->vmid)))
	err |= get_user(user_sizes, &user_regions->sizes);
	err |= get_user(vmid, &user_regions->vmid);
	if (err)
		return -EFAULT;

	if (!is_secure_vmid_valid(get_secure_vmid(vmid)))
		return -EINVAL;

	if (nr_sizes > 0x10)
		return -EINVAL;
		return -EINVAL;


	for (i = 0; i < nr_sizes; i++) {
	info = kmalloc(sizeof(*info), GFP_KERNEL);
		info = kzalloc(sizeof(*info), GFP_KERNEL);
	if (!info)
	if (!info)
		return -ENOMEM;
		return -ENOMEM;


		err = get_user(info->size, ((u64 __user *)user_sizes + i));
	info->size = region->size;
		if (err)
	info->vmid = region->vmid;
			goto out_free;

		info->vmid = vmid;
	info->shrink = shrink;
	info->shrink = shrink;
	INIT_LIST_HEAD(&info->list);
	INIT_LIST_HEAD(&info->list);
	list_add_tail(&info->list, items);
	list_add_tail(&info->list, items);
	}
	return 0;
	return err;
out_free:
	kfree(info);
	return err;
}
}


static int __ion_system_secure_heap_resize(struct ion_heap *heap, void *ptr,
static int __ion_system_secure_heap_resize(struct ion_heap *heap,
					   struct ion_prefetch_region *regions,
					   int nr_regions,
					   bool shrink)
					   bool shrink)
{
{
	struct ion_system_secure_heap *secure_heap =
	struct ion_system_secure_heap *secure_heap =
		to_system_secure_heap(heap);
		to_system_secure_heap(heap);
	struct ion_prefetch_data *data = ptr;
	int i, ret = 0;
	int i, ret = 0;
	struct prefetch_info *info, *tmp;
	struct prefetch_info *info, *tmp;
	unsigned long flags;
	unsigned long flags;
	LIST_HEAD(items);
	LIST_HEAD(items);


	if ((int)heap->type != ION_HEAP_TYPE_SYSTEM_SECURE)
	if (nr_regions > MAX_NR_PREFETCH_REGIONS)
		return -EINVAL;

	if (data->nr_regions > 0x10)
		return -EINVAL;
		return -EINVAL;


	for (i = 0; i < data->nr_regions; i++) {
	for (i = 0; i < nr_regions; i++) {
		struct ion_prefetch_regions *r;
		ret = alloc_prefetch_info(&regions[i], shrink, &items);

		r = (struct ion_prefetch_regions *)data->regions + i;
		ret = alloc_prefetch_info(r, shrink, &items);
		if (ret)
		if (ret)
			goto out_free;
			goto out_free;
	}
	}
@@ -294,14 +269,19 @@ static int __ion_system_secure_heap_resize(struct ion_heap *heap, void *ptr,
	return ret;
	return ret;
}
}


int ion_system_secure_heap_prefetch(struct ion_heap *heap, void *ptr)
static int ion_system_secure_heap_prefetch(struct ion_heap *heap,
					   struct ion_prefetch_region *regions,
					   int nr_regions)
{
{
	return __ion_system_secure_heap_resize(heap, ptr, false);
	return __ion_system_secure_heap_resize(heap, regions, nr_regions,
					       false);
}
}


int ion_system_secure_heap_drain(struct ion_heap *heap, void *ptr)
static int ion_system_secure_heap_drain(struct ion_heap *heap,
					struct ion_prefetch_region *regions,
					int nr_regions)
{
{
	return __ion_system_secure_heap_resize(heap, ptr, true);
	return __ion_system_secure_heap_resize(heap, regions, nr_regions, true);
}
}


static int ion_system_secure_heap_shrink(struct ion_heap *heap, gfp_t gfp_mask,
static int ion_system_secure_heap_shrink(struct ion_heap *heap, gfp_t gfp_mask,
@@ -320,6 +300,11 @@ static struct ion_heap_ops system_secure_heap_ops = {
	.shrink = ion_system_secure_heap_shrink,
	.shrink = ion_system_secure_heap_shrink,
};
};


static struct msm_ion_heap_ops msm_system_secure_heap_ops = {
	.heap_prefetch = ion_system_secure_heap_prefetch,
	.heap_drain = ion_system_secure_heap_drain,
};

struct ion_heap *ion_system_secure_heap_create(struct ion_platform_heap *unused)
struct ion_heap *ion_system_secure_heap_create(struct ion_platform_heap *unused)
{
{
	struct ion_system_secure_heap *heap;
	struct ion_system_secure_heap *heap;
@@ -334,6 +319,7 @@ struct ion_heap *ion_system_secure_heap_create(struct ion_platform_heap *unused)
	if (!heap)
	if (!heap)
		return ERR_PTR(-ENOMEM);
		return ERR_PTR(-ENOMEM);
	heap->heap.ion_heap.ops = &system_secure_heap_ops;
	heap->heap.ion_heap.ops = &system_secure_heap_ops;
	heap->heap.msm_heap_ops = &msm_system_secure_heap_ops;
	heap->heap.ion_heap.buf_ops = msm_ion_dma_buf_ops;
	heap->heap.ion_heap.buf_ops = msm_ion_dma_buf_ops;
	heap->heap.ion_heap.type =
	heap->heap.ion_heap.type =
		(enum ion_heap_type)ION_HEAP_TYPE_SYSTEM_SECURE;
		(enum ion_heap_type)ION_HEAP_TYPE_SYSTEM_SECURE;
+0 −3
Original line number Original line Diff line number Diff line
@@ -8,9 +8,6 @@
#ifndef _ION_SYSTEM_SECURE_HEAP_H
#ifndef _ION_SYSTEM_SECURE_HEAP_H
#define _ION_SYSTEM_SECURE_HEAP_H
#define _ION_SYSTEM_SECURE_HEAP_H


int ion_system_secure_heap_prefetch(struct ion_heap *heap, void *data);
int ion_system_secure_heap_drain(struct ion_heap *heap, void *data);

struct page *alloc_from_secure_pool_order(struct ion_system_heap *heap,
struct page *alloc_from_secure_pool_order(struct ion_system_heap *heap,
					  struct ion_buffer *buffer,
					  struct ion_buffer *buffer,
					  unsigned long order);
					  unsigned long order);
+1 −0
Original line number Original line Diff line number Diff line
@@ -10,6 +10,7 @@
#include <linux/device.h>
#include <linux/device.h>
#include <linux/dma-buf.h>
#include <linux/dma-buf.h>
#include <linux/dma-direction.h>
#include <linux/dma-direction.h>
#include <linux/msm_ion.h>
#include <linux/kref.h>
#include <linux/kref.h>
#include <linux/mm_types.h>
#include <linux/mm_types.h>
#include <linux/msm_ion.h>
#include <linux/msm_ion.h>