Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp313213imu; Fri, 11 Jan 2019 00:29:19 -0800 (PST) X-Google-Smtp-Source: ALg8bN45xFoQ5CrZmUM/GkRigB7rCUEwQjdwu3i9YrBbkJfJ5PRR6bONuuqTlrgIJ0hefcja1A3p X-Received: by 2002:a17:902:b60a:: with SMTP id b10mr12904948pls.303.1547195359566; Fri, 11 Jan 2019 00:29:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547195359; cv=none; d=google.com; s=arc-20160816; b=avwFiggNdIcqUK1nIB6Q0ZN/l4fNQpYiCUTTIbv+6U4ki8NHcmYiumQoVIKUKZe+ad rQ1nXr7aYGcmrv3eHQxcuOf1Frhj2wrdH7fBTCcCd4NcXzGzRGB2ulT0fdpyPRe6o/Zb fCZN0+QLyKsayQ47W38LGOjxAmkmjFaC824nWbyAZRklE7OxsWxaH/rpSpj+Vnc54/Kn 9vYMoecNA2KYbrq4XPcb6mL+4NIm/oPJDuA/0siEu6yyiN8lAG5VJuMRiLrUofWZf/41 JG0qDznDxKMnlK2gGgHg7I1D1/Dmp9ZsTej0oBG+2kR/snTwy5r0yASE7A5PVg1Yn63T T8TA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=insVKXAI2BdmwV+tijyrOG00REZx8cOa7WU0NuC4TI0=; b=JEbOa/pweA7qZDrLKv8wmCkrOBZmD5+801JxS9KJCObspZ2d/SvgOuu5jBC1sHSmVu QAJBJ8n3MDdRx/fS5+PDqYYETzzgRYdWrTlxWee5n4/KDrHL1yUundY8dqLiaQJgeUu7 JYW78XQzQiDuvO6fK8yD84y4EDIqTQQt7RZVhGTeZWKTI0begoxs72QkQmO1/d0lTKHG Ux3VuD63g1eVF1iTjR92CU+/yIm1lSzRSbCIcOVEMMeWDA3Qas2yV/ZMrfu3nDJ6qrai spWCOFXdxm+goXFp5avWh0UxncPFg7iSVvphQi2WInWbxp5c5A6CRSU8CIMkBrs60Opm 0ZjQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ODILqu5d; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m1si56936051pgi.218.2019.01.11.00.29.03; Fri, 11 Jan 2019 00:29:19 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ODILqu5d; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731034AbfAKGlg (ORCPT + 99 others); Fri, 11 Jan 2019 01:41:36 -0500 Received: from mail-ua1-f66.google.com ([209.85.222.66]:44611 "EHLO mail-ua1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728941AbfAKGlg (ORCPT ); Fri, 11 Jan 2019 01:41:36 -0500 Received: by mail-ua1-f66.google.com with SMTP id d19so4409186uaq.11 for ; Thu, 10 Jan 2019 22:41:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=insVKXAI2BdmwV+tijyrOG00REZx8cOa7WU0NuC4TI0=; b=ODILqu5dnmrqfImCcEVSmEtsCNihVzIzkrzUqk41vZxeCVWAZ55T/ppOs+RqYZbYQh BIZDM7eR2FkTRi7gQ77VBnE8GjxiMxU0yw5X1nFm1td28eNUbceS5vhFSzrpSI67vEhW MTURbW8vQnB0fRBMK92N1QTvXiCyvjPYgw6MY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=insVKXAI2BdmwV+tijyrOG00REZx8cOa7WU0NuC4TI0=; b=rjja0ZAzh8rnYGHa6oxPnsMZTzzV/ELfcL+0tzgO8YaDYeOWgvLVpMMGg2Fx9Pq9Vt l1LJjCyN1wynifHYEhl50djRkmnnTmZHbP4TwfN+mFrxh3PLHbgv/QDqmX7z/kQlQMQe bWEbwFf97RvNE2J62rn1MA70LiA5WPCYPCxjVMXYI0m7vQ20NOretWqE49BnJxPMeLFf 8XQJSoKqkaSqrjojmZxW2IpjTINpUSSe3LbzfA2YM3s34Ml3WhSvdQHAgnh0Zeh81T4D UHfBmrU9f4ZOjp1H3f0Rd3QylJFTLHcd6v0GwxLsUzwPJ0IebeVJWAf4QBfG7IAQsVSM pYIQ== X-Gm-Message-State: AJcUukdYZ1WKAOEzRiJsNTDYIbaTHYeGsgintCJ5ltk7LtRtO3bdnYxG BD0RxiQm0SamsT/iWbrCUVGEIbCaG5fX2YkzpbiBOw== X-Received: by 2002:a9f:314c:: with SMTP id n12mr5247700uab.33.1547188893591; Thu, 10 Jan 2019 22:41:33 -0800 (PST) MIME-Version: 1.0 References: <1547123097-16431-1-git-send-email-sumit.garg@linaro.org> <1547123097-16431-2-git-send-email-sumit.garg@linaro.org> <20190110140630.js7mrhu6nfnjsfhx@holly.lan> In-Reply-To: <20190110140630.js7mrhu6nfnjsfhx@holly.lan> From: Sumit Garg Date: Fri, 11 Jan 2019 12:11:22 +0530 Message-ID: Subject: Re: [PATCH v2 1/4] tee: add bus driver framework for TEE based devices To: Daniel Thompson Cc: linux-arm-kernel@lists.infradead.org, "open list:HARDWARE RANDOM NUMBER GENERATOR CORE" , linux-kernel@vger.kernel.org, Jens Wiklander , mpm@selenic.com, Herbert Xu , Rob Herring , Mark Rutland , Arnd Bergmann , Greg Kroah-Hartman , Ard Biesheuvel , Bhupesh Sharma , tee-dev@lists.linaro.org Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 10 Jan 2019 at 19:36, Daniel Thompson wrote: > > On Thu, Jan 10, 2019 at 05:54:54PM +0530, Sumit Garg wrote: > > Introduce a generic TEE bus driver concept for TEE based kernel drivers > > which would like to communicate with TEE based devices/services. > > > > In this TEE bus concept, devices/services are identified via Universally > > Unique Identifier (UUID) and drivers register a table of device UUIDs > > which they can support. > > > > So this TEE bus framework registers a match() callback function which > > iterates over the driver UUID table to find a corresponding match for > > device UUID. If a match is found, then this particular device is probed > > via corresponding probe api registered by the driver. This process > > happens whenever a device or a driver is registered with TEE bus. > > > > Also this framework allows for device enumeration to be specific to > > corresponding TEE implementation like OP-TEE etc. > > > > Signed-off-by: Sumit Garg > > --- > > drivers/tee/tee_core.c | 41 ++++++++++++++++++++++++++++++++++++++--- > > include/linux/tee_drv.h | 36 ++++++++++++++++++++++++++++++++++++ > > 2 files changed, 74 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c > > index 7b2bb4c..9ddb89e 100644 > > --- a/drivers/tee/tee_core.c > > +++ b/drivers/tee/tee_core.c > > @@ -15,7 +15,6 @@ > > #define pr_fmt(fmt) "%s: " fmt, __func__ > > > > #include > > -#include > > #include > > #include > > #include > > @@ -1027,6 +1026,30 @@ int tee_client_invoke_func(struct tee_context *ctx, > > } > > EXPORT_SYMBOL_GPL(tee_client_invoke_func); > > > > +static int tee_client_device_match(struct device *dev, > > + struct device_driver *drv) > > +{ > > + struct tee_client_device *tee_device; > > + const struct tee_client_device_id *id_table; > > + > > + tee_device = to_tee_client_device(dev); > > + id_table = to_tee_client_driver(drv)->id_table; > > + > > + while (!uuid_is_null(&id_table->uuid)) { > > + if (uuid_equal(&tee_device->id.uuid, &id_table->uuid)) > > + return 1; > > + id_table++; > > + } > > + > > + return 0; > > +} > > + > > +struct bus_type tee_bus_type = { > > + .name = "tee", > > + .match = tee_client_device_match, > > +}; > > +EXPORT_SYMBOL_GPL(tee_bus_type); > > + > > static int __init tee_init(void) > > { > > int rc; > > @@ -1040,10 +1063,21 @@ static int __init tee_init(void) > > rc = alloc_chrdev_region(&tee_devt, 0, TEE_NUM_DEVICES, "tee"); > > if (rc) { > > pr_err("failed to allocate char dev region\n"); > > - class_destroy(tee_class); > > - tee_class = NULL; > > + goto class_err; > > } > > > > + rc = bus_register(&tee_bus_type); > > + if (rc) { > > + pr_err("failed to register tee bus\n"); > > + goto class_err; > > There is an unregister_chrdev_region() in tee_exit(). Why isn't it > needed on this error path? > Will add "unregister_chrdev_region()" on this error path. -Sumit > > > + } > > + > > + return 0; > > + > > +class_err: > > + class_destroy(tee_class); > > + tee_class = NULL; > > + > > return rc; > > } > > > > @@ -1052,6 +1086,7 @@ static void __exit tee_exit(void) > > class_destroy(tee_class); > > tee_class = NULL; > > unregister_chrdev_region(tee_devt, TEE_NUM_DEVICES); > > + bus_unregister(&tee_bus_type); > > } > > > > subsys_initcall(tee_init); > > diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h > > index 6cfe058..ed16bf1 100644 > > --- a/include/linux/tee_drv.h > > +++ b/include/linux/tee_drv.h > > @@ -20,6 +20,8 @@ > > #include > > #include > > #include > > +#include > > +#include > > > > /* > > * The file describes the API provided by the generic TEE driver to the > > @@ -538,4 +540,38 @@ static inline bool tee_param_is_memref(struct tee_param *param) > > } > > } > > > > +extern struct bus_type tee_bus_type; > > + > > +/** > > + * struct tee_client_device_id - tee based device identifier > > + * @uuid: For TEE based client devices we use the device uuid > > + * as the identifier. > > + */ > > +struct tee_client_device_id { > > + uuid_t uuid; > > +}; > > + > > +/** > > + * struct tee_client_device - tee based device > > + * @id: device identifier > > + * @dev: device structure > > + */ > > +struct tee_client_device { > > + struct tee_client_device_id id; > > + struct device dev; > > +}; > > +#define to_tee_client_device(d) container_of(d, struct tee_client_device, dev) > > + > > +/** > > + * struct tee_client_driver - tee client driver > > + * @id_table: device id table supported by this driver > > + * @driver: driver structure > > + */ > > +struct tee_client_driver { > > + const struct tee_client_device_id *id_table; > > + struct device_driver driver; > > +}; > > +#define to_tee_client_driver(d) \ > > + container_of(d, struct tee_client_driver, driver) > > + > > #endif /*__TEE_DRV_H*/ > > -- > > 2.7.4 > >