aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/media/atomisp/pci/atomisp2/hrt/memory_access.c
blob: 7694ee480cfcd2bdc855dc21470baa22489bbd31 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "memory_access.h"

#include <stddef.h>		/* NULL */
#include <stdbool.h>

#include "device_access.h"

#include "mmu_device.h"

#include "assert_support.h"

/* Presently system specific */
#include <hmm/hmm.h>
/* Presently system specific */
#include "hive_isp_css_mm_hrt.h"

/*
 * This is an HRT backend implementation for CSIM
 * 31 July 2012, rvanimme: this implementation is also used in Android context
 */

static sys_address	page_table_base_address = (sys_address)-1;

void mmgr_set_base_address(const sys_address base_addr)
{
	page_table_base_address = base_addr;

/*
 * This is part of "device_access.h", but it may be
 * that "hive_isp_css_mm_hrt.h" requires it
 */
/* hrt_isp_css_mm_set_ddr_address_offset(offset); */
/*	mmu_set_page_table_base_index(MMU0_ID, page_table_base_address); */
}

ia_css_ptr mmgr_malloc(const size_t size)
{
	return mmgr_alloc_attr(size, MMGR_ATTRIBUTE_CACHED);
}

ia_css_ptr mmgr_calloc(const size_t N, const size_t size)
{
	return mmgr_alloc_attr(N * size,
		MMGR_ATTRIBUTE_CLEARED|MMGR_ATTRIBUTE_CACHED);
}

void mmgr_free(ia_css_ptr vaddr)
{
/* "free()" should accept NULL, "hrt_isp_css_mm_free()" may not */
	if (vaddr)
		hrt_isp_css_mm_free(vaddr);
}

ia_css_ptr mmgr_alloc_attr(const size_t	size, const uint16_t attribute)
{
	ia_css_ptr	ptr;
	size_t	extra_space = 0;
	size_t	aligned_size = size;

	assert(page_table_base_address != (sys_address)-1);
	assert((attribute & MMGR_ATTRIBUTE_UNUSED) == 0);
	WARN_ON(attribute & MMGR_ATTRIBUTE_CONTIGUOUS);

	if (attribute & MMGR_ATTRIBUTE_CLEARED) {
		if (attribute & MMGR_ATTRIBUTE_CACHED) {
			ptr = hrt_isp_css_mm_calloc_cached(
						aligned_size + extra_space);
		} else { /* !MMGR_ATTRIBUTE_CACHED */
			ptr = hrt_isp_css_mm_calloc(
						aligned_size + extra_space);
		}
	} else { /* MMGR_ATTRIBUTE_CLEARED */
		if (attribute & MMGR_ATTRIBUTE_CACHED) {
			ptr = hrt_isp_css_mm_alloc_cached(
						aligned_size + extra_space);
		} else { /* !MMGR_ATTRIBUTE_CACHED */
			ptr = hrt_isp_css_mm_alloc(
					aligned_size + extra_space);
		}
	}
	return ptr;
}

ia_css_ptr mmgr_mmap(const void *ptr, const size_t size, uint16_t attribute,
		void *context)
{
	struct hrt_userbuffer_attr *userbuffer_attr = context;
	return hrt_isp_css_mm_alloc_user_ptr(size, (void *)ptr,
					userbuffer_attr->pgnr,
					userbuffer_attr->type,
					attribute & HRT_BUF_FLAG_CACHED);
}

void mmgr_clear(
	ia_css_ptr			vaddr,
	const size_t			size)
{
	hrt_isp_css_mm_set(vaddr, 0, size);
}

void mmgr_load(const ia_css_ptr	vaddr, void *data, const size_t size)
{
	hrt_isp_css_mm_load(vaddr, data, size);
}

void mmgr_store(const ia_css_ptr vaddr,	const void *data, const size_t size)
{
	hrt_isp_css_mm_store(vaddr, data, size);
}