Skip to content

Commit 64cf9d8

Browse files
lorcjenswi-linaro
authored andcommitted
tee: optee: add registered shared parameters handling
Now, when client applications can register own shared buffers in OP-TEE, we need to extend ABI for parameter passing to/from OP-TEE. So, if OP-TEE core detects that parameter belongs to registered shared memory, it will use corresponding parameter attribute. Signed-off-by: Volodymyr Babchuk <[email protected]> Signed-off-by: Jens Wiklander <[email protected]>
1 parent 06ca791 commit 64cf9d8

File tree

1 file changed

+63
-15
lines changed

1 file changed

+63
-15
lines changed

drivers/tee/optee/core.c

Lines changed: 63 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,72 @@ int optee_from_msg_param(struct tee_param *params, size_t num_params,
9797
return rc;
9898
}
9999
break;
100+
case OPTEE_MSG_ATTR_TYPE_RMEM_INPUT:
101+
case OPTEE_MSG_ATTR_TYPE_RMEM_OUTPUT:
102+
case OPTEE_MSG_ATTR_TYPE_RMEM_INOUT:
103+
p->attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT +
104+
attr - OPTEE_MSG_ATTR_TYPE_RMEM_INPUT;
105+
p->u.memref.size = mp->u.rmem.size;
106+
shm = (struct tee_shm *)(unsigned long)
107+
mp->u.rmem.shm_ref;
108+
109+
if (!shm) {
110+
p->u.memref.shm_offs = 0;
111+
p->u.memref.shm = NULL;
112+
break;
113+
}
114+
p->u.memref.shm_offs = mp->u.rmem.offs;
115+
p->u.memref.shm = shm;
116+
117+
break;
118+
100119
default:
101120
return -EINVAL;
102121
}
103122
}
104123
return 0;
105124
}
106125

126+
static int to_msg_param_tmp_mem(struct optee_msg_param *mp,
127+
const struct tee_param *p)
128+
{
129+
int rc;
130+
phys_addr_t pa;
131+
132+
mp->attr = OPTEE_MSG_ATTR_TYPE_TMEM_INPUT + p->attr -
133+
TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT;
134+
135+
mp->u.tmem.shm_ref = (unsigned long)p->u.memref.shm;
136+
mp->u.tmem.size = p->u.memref.size;
137+
138+
if (!p->u.memref.shm) {
139+
mp->u.tmem.buf_ptr = 0;
140+
return 0;
141+
}
142+
143+
rc = tee_shm_get_pa(p->u.memref.shm, p->u.memref.shm_offs, &pa);
144+
if (rc)
145+
return rc;
146+
147+
mp->u.tmem.buf_ptr = pa;
148+
mp->attr |= OPTEE_MSG_ATTR_CACHE_PREDEFINED <<
149+
OPTEE_MSG_ATTR_CACHE_SHIFT;
150+
151+
return 0;
152+
}
153+
154+
static int to_msg_param_reg_mem(struct optee_msg_param *mp,
155+
const struct tee_param *p)
156+
{
157+
mp->attr = OPTEE_MSG_ATTR_TYPE_RMEM_INPUT + p->attr -
158+
TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT;
159+
160+
mp->u.rmem.shm_ref = (unsigned long)p->u.memref.shm;
161+
mp->u.rmem.size = p->u.memref.size;
162+
mp->u.rmem.offs = p->u.memref.shm_offs;
163+
return 0;
164+
}
165+
107166
/**
108167
* optee_to_msg_param() - convert from struct tee_params to OPTEE_MSG parameters
109168
* @msg_params: OPTEE_MSG parameters
@@ -116,7 +175,6 @@ int optee_to_msg_param(struct optee_msg_param *msg_params, size_t num_params,
116175
{
117176
int rc;
118177
size_t n;
119-
phys_addr_t pa;
120178

121179
for (n = 0; n < num_params; n++) {
122180
const struct tee_param *p = params + n;
@@ -139,22 +197,12 @@ int optee_to_msg_param(struct optee_msg_param *msg_params, size_t num_params,
139197
case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT:
140198
case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT:
141199
case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INOUT:
142-
mp->attr = OPTEE_MSG_ATTR_TYPE_TMEM_INPUT +
143-
p->attr -
144-
TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT;
145-
mp->u.tmem.shm_ref = (unsigned long)p->u.memref.shm;
146-
mp->u.tmem.size = p->u.memref.size;
147-
if (!p->u.memref.shm) {
148-
mp->u.tmem.buf_ptr = 0;
149-
break;
150-
}
151-
rc = tee_shm_get_pa(p->u.memref.shm,
152-
p->u.memref.shm_offs, &pa);
200+
if (tee_shm_is_registered(p->u.memref.shm))
201+
rc = to_msg_param_reg_mem(mp, p);
202+
else
203+
rc = to_msg_param_tmp_mem(mp, p);
153204
if (rc)
154205
return rc;
155-
mp->u.tmem.buf_ptr = pa;
156-
mp->attr |= OPTEE_MSG_ATTR_CACHE_PREDEFINED <<
157-
OPTEE_MSG_ATTR_CACHE_SHIFT;
158206
break;
159207
default:
160208
return -EINVAL;

0 commit comments

Comments
 (0)