@@ -102,13 +102,14 @@ static int bind_service_list(struct udevice *dev, struct tee_shm *service_list,
102
102
return 0 ;
103
103
}
104
104
105
- static int __enum_services (struct udevice * dev , struct tee_shm * shm , size_t * shm_size , u32 tee_sess )
105
+ static int __enum_services (struct udevice * dev , struct tee_shm * shm , size_t * shm_size , u32 tee_sess ,
106
+ unsigned int pta_cmd )
106
107
{
107
108
struct tee_invoke_arg arg = { };
108
109
struct tee_param param = { };
109
110
int ret = 0 ;
110
111
111
- arg .func = PTA_CMD_GET_DEVICES ;
112
+ arg .func = pta_cmd ;
112
113
arg .session = tee_sess ;
113
114
114
115
/* Fill invoke cmd params */
@@ -118,7 +119,7 @@ static int __enum_services(struct udevice *dev, struct tee_shm *shm, size_t *shm
118
119
119
120
ret = tee_invoke_func (dev , & arg , 1 , & param );
120
121
if (ret || (arg .ret && arg .ret != TEE_ERROR_SHORT_BUFFER )) {
121
- dev_err (dev , "PTA_CMD_GET_DEVICES invoke function err : 0x%x\n" , arg .ret );
122
+ dev_err (dev , "Enumeration command 0x%x failed : 0x%x\n" , pta_cmd , arg .ret );
122
123
return - EINVAL ;
123
124
}
124
125
@@ -127,12 +128,13 @@ static int __enum_services(struct udevice *dev, struct tee_shm *shm, size_t *shm
127
128
return 0 ;
128
129
}
129
130
130
- static int enum_services (struct udevice * dev , struct tee_shm * * shm , size_t * count , u32 tee_sess )
131
+ static int enum_services (struct udevice * dev , struct tee_shm * * shm , size_t * count , u32 tee_sess ,
132
+ unsigned int pta_cmd )
131
133
{
132
134
size_t shm_size = 0 ;
133
135
int ret ;
134
136
135
- ret = __enum_services (dev , NULL , & shm_size , tee_sess );
137
+ ret = __enum_services (dev , NULL , & shm_size , tee_sess , pta_cmd );
136
138
if (ret )
137
139
return ret ;
138
140
@@ -142,7 +144,7 @@ static int enum_services(struct udevice *dev, struct tee_shm **shm, size_t *coun
142
144
return ret ;
143
145
}
144
146
145
- ret = __enum_services (dev , * shm , & shm_size , tee_sess );
147
+ ret = __enum_services (dev , * shm , & shm_size , tee_sess , pta_cmd );
146
148
if (!ret )
147
149
* count = shm_size / sizeof (struct tee_optee_ta_uuid );
148
150
@@ -174,20 +176,32 @@ static int bind_service_drivers(struct udevice *dev)
174
176
struct tee_shm * service_list = NULL ;
175
177
size_t service_count ;
176
178
u32 tee_sess ;
177
- int ret ;
179
+ int ret , ret2 ;
178
180
179
181
ret = open_enum_session (dev , & tee_sess );
180
182
if (ret )
181
183
return ret ;
182
184
183
- ret = enum_services (dev , & service_list , & service_count , tee_sess );
185
+ ret = enum_services (dev , & service_list , & service_count , tee_sess ,
186
+ PTA_CMD_GET_DEVICES );
184
187
if (!ret )
185
188
ret = bind_service_list (dev , service_list , service_count );
186
189
187
190
tee_shm_free (service_list );
191
+
192
+ ret2 = enum_services (dev , & service_list , & service_count , tee_sess ,
193
+ PTA_CMD_GET_DEVICES_SUPP );
194
+ if (!ret2 )
195
+ ret2 = bind_service_list (dev , service_list , service_count );
196
+
197
+ tee_shm_free (service_list );
198
+
188
199
tee_close_session (dev , tee_sess );
189
200
190
- return ret ;
201
+ if (ret )
202
+ return ret ;
203
+
204
+ return ret2 ;
191
205
}
192
206
193
207
/**
@@ -834,7 +848,7 @@ static int optee_probe(struct udevice *dev)
834
848
*/
835
849
ret = device_bind_driver (dev , "optee-rng" , "optee-rng" , NULL );
836
850
if (ret )
837
- return ret ;
851
+ dev_warn ( dev , "ftpm_tee failed to bind: %d\n" , ret ) ;
838
852
}
839
853
840
854
return 0 ;
0 commit comments