RTEMS
6.3
Toggle main menu visibility
Loading...
Searching...
No Matches
bsps
include
grlib
griommu.h
1
/* SPDX-License-Identifier: BSD-2-Clause */
2
3
/*
4
* GRIOMMU Driver Interface
5
*
6
* COPYRIGHT (c) 2017
7
* Cobham Gaisler AB
8
*
9
* Redistribution and use in source and binary forms, with or without
10
* modification, are permitted provided that the following conditions
11
* are met:
12
* 1. Redistributions of source code must retain the above copyright
13
* notice, this list of conditions and the following disclaimer.
14
* 2. Redistributions in binary form must reproduce the above copyright
15
* notice, this list of conditions and the following disclaimer in the
16
* documentation and/or other materials provided with the distribution.
17
*
18
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
* POSSIBILITY OF SUCH DAMAGE.
29
*
30
* OVERVIEW
31
* ========
32
* This driver controls the GRIOMMU device located
33
* at an on-chip AMBA.
34
*/
35
36
#ifndef __GRIOMMU_H__
37
#define __GRIOMMU_H__
38
39
#include <stdint.h>
40
#include <stdio.h>
41
42
#ifdef __cplusplus
43
extern
"C"
{
44
#endif
45
46
extern
void
griommu_register_drv(
void
);
47
48
#define GRIOMMU_ERR_OK 0
49
#define GRIOMMU_ERR_NOINIT -1
50
#define GRIOMMU_ERR_EINVAL -2
51
#define GRIOMMU_ERR_IMPLEMENTED -3
52
#define GRIOMMU_ERR_NOTFOUND -4
53
54
/* Size of APV (has to be divided by page size in bytes) */
55
#define GRIOMMU_APV_SIZE 0x20000000
56
57
/* Alignment of APV */
58
#define GRIOMMU_APV_ALIGN 0x10
59
60
/* IOMMU APV allocation helper functions */
61
extern
void
* griommu_apv_new(
void
);
62
extern
void
griommu_apv_delete(
void
* apv);
63
64
/* IOMMU Master Setup */
65
66
/* IOMMU Master find */
67
/*
68
* GRIOMMU MASTER register fields
69
*/
70
#define MASTER_VENDOR (0xff << MASTER_VENDOR_BIT)
71
#define MASTER_DEVICE (0xfff << MASTER_DEVICE_BIT)
72
#define MASTER_BS (0x1 << MASTER_BS_BIT)
73
#define MASTER_GROUP (0xf << MASTER_GROUP_BIT)
74
75
#define MASTER_VENDOR_BIT 24
76
#define MASTER_DEVICE_BIT 12
77
#define MASTER_BS_BIT 4
78
#define MASTER_GROUP_BIT 0
79
80
#define GRIOMMU_OPTIONS_BUS0 0
81
#define GRIOMMU_OPTIONS_BUS1 1
82
extern
int
griommu_master_setup(
int
master,
int
group,
int
options);
83
extern
int
griommu_master_find(
int
vendor,
int
device,
int
instance);
84
extern
int
griommu_master_info(
int
master, uint32_t * info);
85
#define griommu_get_master_vendor(info) \
86
((info & MASTER_VENDOR) >> MASTER_VENDOR_BIT)
87
#define griommu_get_master_device(info) \
88
((info & MASTER_DEVICE) >> MASTER_DEVICE_BIT)
89
#define griommu_get_master_routing(info) \
90
((info & MASTER_BS) >> MASTER_BS_BIT)
91
#define griommu_get_master_group(info) \
92
((info & MASTER_GROUP) >> MASTER_GROUP_BIT)
93
94
/* IOMMU Group Setup */
95
#define GRIOMMU_OPTIONS_GROUP_PASSTHROUGH 2
96
#define GRIOMMU_OPTIONS_GROUP_ENABLE 1
97
#define GRIOMMU_OPTIONS_GROUP_DISABLE 0
98
extern
int
griommu_group_setup(
int
group,
void
* apv,
int
options);
99
extern
int
griommu_group_info(
int
group, uint32_t * info);
100
#define GRIOMMU_OPTIONS_APV_ALLOW 0x1
101
#define GRIOMMU_OPTIONS_APV_DONTALLOW 0x0
102
extern
int
griommu_group_apv_init(
int
group,
int
options);
103
extern
int
griommu_group_apv_address_set(
int
group, uint32_t addr,
int
size,
104
int
options);
105
extern
int
griommu_group_apv_page_set(
int
group,
int
index,
int
size,
106
int
options);
107
extern
int
griommu_group_apv_flush(
int
group);
108
109
/* IOMMU Setup */
110
/*
111
* GRIOMMU CTRL register fields
112
*/
113
#define CTRL_PGSZ (0x7 << CTRL_PGSZ_BIT)
114
#define CTRL_LB (0x1 << CTRL_LB_BIT)
115
#define CTRL_SP (0x1 << CTRL_SP_BIT)
116
#define CTRL_ITR (0xf << CTRL_ITR_BIT)
117
#define CTRL_DP (0x1 << CTRL_DP_BIT)
118
#define CTRL_SIV (0x1 << CTRL_SIV_BIT)
119
#define CTRL_HPROT (0x3 << CTRL_HPROT_BIT)
120
#define CTRL_AU (0x1 << CTRL_AU_BIT)
121
#define CTRL_WP (0x1 << CTRL_WP_BIT)
122
#define CTRL_DM (0x1 << CTRL_DM_BIT)
123
#define CTRL_GS (0x1 << CTRL_GS_BIT)
124
#define CTRL_CE (0x1 << CTRL_CE_BIT)
125
#define CTRL_PM (0x3 << CTRL_PM_BIT)
126
#define CTRL_PM_APV (0x0 << CTRL_PM_BIT)
127
#define CTRL_PM_IOMMU (0x1 << CTRL_PM_BIT)
128
#define CTRL_EN (0x1 << CTRL_EN_BIT)
129
130
#define CTRL_PGSZ_BIT 18
131
#define CTRL_LB_BIT 17
132
#define CTRL_SP_BIT 16
133
#define CTRL_ITR_BIT 12
134
#define CTRL_DP_BIT 11
135
#define CTRL_SIV_BIT 10
136
#define CTRL_HPROT_BIT 8
137
#define CTRL_AU_BIT 7
138
#define CTRL_WP_BIT 6
139
#define CTRL_DM_BIT 5
140
#define CTRL_GS_BIT 4
141
#define CTRL_CE_BIT 3
142
#define CTRL_PM_BIT 1
143
#define CTRL_EN_BIT 0
144
145
#define GRIOMMU_OPTIONS_LOOKUPBUS_BUS0 0
146
#define GRIOMMU_OPTIONS_LOOKUPBUS_BUS1 CTRL_LB
147
#define GRIOMMU_OPTIONS_CACHE_DISABLE 0
148
#define GRIOMMU_OPTIONS_CACHE_ENABLE CTRL_CE
149
#define GRIOMMU_OPTIONS_GROUPADDRESSING_DISABLE 0
150
#define GRIOMMU_OPTIONS_GROUPADDRESSING_ENABLE CTRL_GS
151
#define GRIOMMU_OPTIONS_WPROTONLY_DISABLE 0
152
#define GRIOMMU_OPTIONS_WPROTONLY_ENABLE CTRL_WP
153
#define GRIOMMU_OPTIONS_AHBUPDATE_DISABLE 0
154
#define GRIOMMU_OPTIONS_AHBUPDATE_ENABLE CTRL_AU
155
#define GRIOMMU_OPTIONS_PREFETCH_DISABLE CTRL_DP
156
#define GRIOMMU_OPTIONS_PREFETCH_ENABLE 0
157
#define GRIOMMU_OPTIONS_PAGESIZE_4KIB 0
158
#define GRIOMMU_OPTIONS_PAGESIZE_8KIB (0x1 << CTRL_PGSZ_BIT)
159
#define GRIOMMU_OPTIONS_PAGESIZE_16KIB (0x2 << CTRL_PGSZ_BIT)
160
#define GRIOMMU_OPTIONS_PAGESIZE_32KIB (0x3 << CTRL_PGSZ_BIT)
161
#define GRIOMMU_OPTIONS_PAGESIZE_64KIB (0x4 << CTRL_PGSZ_BIT)
162
#define GRIOMMU_OPTIONS_PAGESIZE_128KIB (0x5 << CTRL_PGSZ_BIT)
163
#define GRIOMMU_OPTIONS_PAGESIZE_256KIB (0x6 << CTRL_PGSZ_BIT)
164
#define GRIOMMU_OPTIONS_PAGESIZE_512KIB (0x7 << CTRL_PGSZ_BIT)
165
extern
int
griommu_setup(
int
options);
166
extern
int
griommu_status(
void
);
167
168
#define GRIOMMU_MODE_IOMMU 1
169
#define GRIOMMU_MODE_GROUPAPV 0
170
extern
int
griommu_enable(
int
mode);
171
extern
int
griommu_disable(
void
);
172
173
/* IOMMU APV setup */
174
extern
int
griommu_apv_flush(
void
);
175
extern
int
griommu_apv_init(
void
* apv,
int
options);
176
extern
int
griommu_apv_address_set(
void
* apv, uint32_t addr,
int
size,
177
int
options);
178
extern
int
griommu_apv_page_set(
void
* apv,
int
index,
int
size,
int
options);
179
180
/* GRIOMMU Interrupts */
181
/* Function Interrupt-Code ISR callback prototype.
182
* arg - Custom arg provided by user
183
* access - AHB Access that failed
184
* status - Error status register of the GRIOMMU core
185
*/
186
typedef
void (*griommu_isr_t)(
void
*arg, uint32_t access, uint32_t status);
187
#define GRIOMMU_INTERRUPT_ALL (0x2f << 0)
188
#define GRIOMMU_INTERRUPT_PARITY_ERROR (0x1 << 5)
189
#define GRIOMMU_INTERRUPT_FLUSH_COMPLETED (0x1 << 3)
190
#define GRIOMMU_INTERRUPT_FLUSH_START (0x1 << 2)
191
#define GRIOMMU_INTERRUPT_ACCESS_DENIED (0x1 << 1)
192
#define GRIOMMU_INTERRUPT_TRANSLATION_ERROR (0x1 << 0)
193
extern
int
griommu_isr_register(griommu_isr_t isr,
void
* arg,
int
options);
194
extern
int
griommu_isr_unregister(
void
);
195
extern
int
griommu_interrupt_unmask(
int
options);
196
extern
int
griommu_interrupt_mask(
int
options);
197
198
extern
int
griommu_error_status(uint32_t * access);
199
200
extern
int
griommu_print(
void
);
201
202
#ifdef __cplusplus
203
}
204
#endif
205
206
#endif
/* __GRIOMMU_H__ */
Generated by
1.18.0