forked from mirrors/linux
		
	tee: add supp_nowait flag in tee_context struct
This flag indicates that requests in this context should not wait for tee-supplicant daemon to be started if not present and just return with an error code. It is needed for requests which should be non-blocking in nature like ones arising from TEE based kernel drivers or any in kernel api that uses TEE internal client interface. Signed-off-by: Sumit Garg <sumit.garg@linaro.org> Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
This commit is contained in:
		
							parent
							
								
									49a57857ae
								
							
						
					
					
						commit
						42bf4152d8
					
				
					 3 changed files with 28 additions and 1 deletions
				
			
		|  | @ -88,10 +88,18 @@ u32 optee_supp_thrd_req(struct tee_context *ctx, u32 func, size_t num_params, | |||
| { | ||||
| 	struct optee *optee = tee_get_drvdata(ctx->teedev); | ||||
| 	struct optee_supp *supp = &optee->supp; | ||||
| 	struct optee_supp_req *req = kzalloc(sizeof(*req), GFP_KERNEL); | ||||
| 	struct optee_supp_req *req; | ||||
| 	bool interruptable; | ||||
| 	u32 ret; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Return in case there is no supplicant available and | ||||
| 	 * non-blocking request. | ||||
| 	 */ | ||||
| 	if (!supp->ctx && ctx->supp_nowait) | ||||
| 		return TEEC_ERROR_COMMUNICATION; | ||||
| 
 | ||||
| 	req = kzalloc(sizeof(*req), GFP_KERNEL); | ||||
| 	if (!req) | ||||
| 		return TEEC_ERROR_OUT_OF_MEMORY; | ||||
| 
 | ||||
|  |  | |||
|  | @ -106,6 +106,11 @@ static int tee_open(struct inode *inode, struct file *filp) | |||
| 	if (IS_ERR(ctx)) | ||||
| 		return PTR_ERR(ctx); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Default user-space behaviour is to wait for tee-supplicant | ||||
| 	 * if not present for any requests in this context. | ||||
| 	 */ | ||||
| 	ctx->supp_nowait = false; | ||||
| 	filp->private_data = ctx; | ||||
| 	return 0; | ||||
| } | ||||
|  | @ -982,6 +987,14 @@ tee_client_open_context(struct tee_context *start, | |||
| 	} while (IS_ERR(ctx) && PTR_ERR(ctx) != -ENOMEM); | ||||
| 
 | ||||
| 	put_device(put_dev); | ||||
| 	/*
 | ||||
| 	 * Default behaviour for in kernel client is to not wait for | ||||
| 	 * tee-supplicant if not present for any requests in this context. | ||||
| 	 * Also this flag could be configured again before call to | ||||
| 	 * tee_client_open_session() if any in kernel client requires | ||||
| 	 * different behaviour. | ||||
| 	 */ | ||||
| 	ctx->supp_nowait = true; | ||||
| 	return ctx; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(tee_client_open_context); | ||||
|  |  | |||
|  | @ -47,6 +47,11 @@ struct tee_shm_pool; | |||
|  * @releasing:  flag that indicates if context is being released right now. | ||||
|  *		It is needed to break circular dependency on context during | ||||
|  *              shared memory release. | ||||
|  * @supp_nowait: flag that indicates that requests in this context should not | ||||
|  *              wait for tee-supplicant daemon to be started if not present | ||||
|  *              and just return with an error code. It is needed for requests | ||||
|  *              that arises from TEE based kernel drivers that should be | ||||
|  *              non-blocking in nature. | ||||
|  */ | ||||
| struct tee_context { | ||||
| 	struct tee_device *teedev; | ||||
|  | @ -54,6 +59,7 @@ struct tee_context { | |||
| 	void *data; | ||||
| 	struct kref refcount; | ||||
| 	bool releasing; | ||||
| 	bool supp_nowait; | ||||
| }; | ||||
| 
 | ||||
| struct tee_param_memref { | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Sumit Garg
						Sumit Garg