From patchwork Fri Dec 17 03:42:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jay Chen X-Patchwork-Id: 12696575 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 09C73C433EF for ; Fri, 17 Dec 2021 03:43:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=xIoSIgBKdYY+4VL2xgf+n/TPxDKOwKEHrcmJtZS2WX8=; b=tKaqjsMZ9NzUiA XNVdSIJ4bOrE+NjQCEe5WSIGsiMTdFYmEOujLFr3U1cvmIus4lVjQk1Y84my9TiHGBahrlYlZx50E j7fAAo9MEQa3bKQKBWnxFYC28BQRkmKmpwNmT7pZgqLljtV2p/f8Y7dKRL+4Xjh38ipAEScHAPn7Q vUB+F7wQVrJe27LfhFVZ9WBpg6YjjCb2g8VF9chhGbhzE3BL0T7kNwwkg3PZsb67uVyNd9B8O/zPG LQFwwXO3dyA5zcENqc4ADkmqPOUZ1bD0nQfXOj5JNEi528il67jcwfJ65cLrEtUU71KMHF75D0rKI kdEAuPH/eHu44QrEY07A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1my48U-008VEX-1V; Fri, 17 Dec 2021 03:42:22 +0000 Received: from out30-131.freemail.mail.aliyun.com ([115.124.30.131]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1my48P-008VDn-NF for linux-arm-kernel@lists.infradead.org; Fri, 17 Dec 2021 03:42:20 +0000 X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R111e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=e01e04357; MF=jkchen@linux.alibaba.com; NM=1; PH=DS; RN=7; SR=0; TI=SMTPD_---0V-rzSGD_1639712528; Received: from localhost(mailfrom:jkchen@linux.alibaba.com fp:SMTPD_---0V-rzSGD_1639712528) by smtp.aliyun-inc.com(127.0.0.1); Fri, 17 Dec 2021 11:42:08 +0800 From: Jay Chen To: mathieu.poirier@linaro.org, suzuki.poulose@arm.com, linux-arm-kernel@lists.infradead.org, coresight@lists.linaro.org, mike.leach@linaro.org, leo.yan@linaro.org Cc: zhangliguang@linux.alibaba.com Subject: [RFC V2 PATCH] coresight: change tmc from misc device to cdev device Date: Fri, 17 Dec 2021 11:42:08 +0800 Message-Id: <20211217034208.64290-1-jkchen@linux.alibaba.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211216_194217_980840_705AE64C X-CRM114-Status: GOOD ( 21.33 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: root For coresight in the server scenario, if there are too many funnel (about 130) and tmc (about 130) peripherals, the error of insufficient device numbers will occur by misc device Signed-off-by: root --- .../hwtracing/coresight/coresight-tmc-core.c | 84 +++++++++++++++---- drivers/hwtracing/coresight/coresight-tmc.h | 10 ++- 2 files changed, 75 insertions(+), 19 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-tmc-core.c b/drivers/hwtracing/coresight/coresight-tmc-core.c index d0276af82494..03b114c0616a 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-core.c +++ b/drivers/hwtracing/coresight/coresight-tmc-core.c @@ -31,6 +31,11 @@ DEFINE_CORESIGHT_DEVLIST(etb_devs, "tmc_etb"); DEFINE_CORESIGHT_DEVLIST(etf_devs, "tmc_etf"); DEFINE_CORESIGHT_DEVLIST(etr_devs, "tmc_etr"); +static dev_t tmc_major; +static struct class *tmc_class; + +#define TMC_DEV_MAX (MINORMASK + 1) + void tmc_wait_for_tmcready(struct tmc_drvdata *drvdata) { struct coresight_device *csdev = drvdata->csdev; @@ -147,7 +152,7 @@ static int tmc_open(struct inode *inode, struct file *file) { int ret; struct tmc_drvdata *drvdata = container_of(file->private_data, - struct tmc_drvdata, miscdev); + struct tmc_drvdata, cdev); ret = tmc_read_prepare(drvdata); if (ret) @@ -179,7 +184,7 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, char *bufp; ssize_t actual; struct tmc_drvdata *drvdata = container_of(file->private_data, - struct tmc_drvdata, miscdev); + struct tmc_drvdata, cdev); actual = tmc_get_sysfs_trace(drvdata, *ppos, len, &bufp); if (actual <= 0) return 0; @@ -200,7 +205,7 @@ static int tmc_release(struct inode *inode, struct file *file) { int ret; struct tmc_drvdata *drvdata = container_of(file->private_data, - struct tmc_drvdata, miscdev); + struct tmc_drvdata, cdev); ret = tmc_read_unprepare(drvdata); if (ret) @@ -449,8 +454,9 @@ static u32 tmc_etr_get_max_burst_size(struct device *dev) static int tmc_probe(struct amba_device *adev, const struct amba_id *id) { - int ret = 0; + int ret = 0, tmc_num = 0; u32 devid; + dev_t devt; void __iomem *base; struct device *dev = &adev->dev; struct coresight_platform_data *pdata = NULL; @@ -546,14 +552,26 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id) goto out; } - drvdata->miscdev.name = desc.name; - drvdata->miscdev.minor = MISC_DYNAMIC_MINOR; - drvdata->miscdev.fops = &tmc_fops; - ret = misc_register(&drvdata->miscdev); - if (ret) + tmc_num = etb_devs.nr_idx + etf_devs.nr_idx + + etr_devs.nr_idx; + + cdev_init(&drvdata->cdev.cdev, &tmc_fops); + drvdata->cdev.cdev.owner = THIS_MODULE; + devt = MKDEV(MAJOR(tmc_major), tmc_num - 1); + ret = cdev_add(&drvdata->cdev.cdev, devt, 1); + if (ret) { coresight_unregister(drvdata->csdev); - else + goto out; + } + + drvdata->cdev.dev = device_create(tmc_class, NULL, devt, &drvdata->cdev, desc.name); + if (IS_ERR(drvdata->cdev.dev)) { + ret = PTR_ERR(drvdata->cdev.dev); + cdev_del(&drvdata->cdev.cdev); + coresight_unregister(drvdata->csdev); + } else pm_runtime_put(&adev->dev); + out: return ret; } @@ -584,12 +602,8 @@ static void tmc_remove(struct amba_device *adev) { struct tmc_drvdata *drvdata = dev_get_drvdata(&adev->dev); - /* - * Since misc_open() holds a refcount on the f_ops, which is - * etb fops in this case, device is there until last file - * handler to this device is closed. - */ - misc_deregister(&drvdata->miscdev); + device_destroy(tmc_class, drvdata->cdev.dev->devt); + cdev_del(&drvdata->cdev.cdev); coresight_unregister(drvdata->csdev); } @@ -618,7 +632,43 @@ static struct amba_driver tmc_driver = { .id_table = tmc_ids, }; -module_amba_driver(tmc_driver); +static int __init tmc_init(void) +{ + int ret; + + ret = alloc_chrdev_region(&tmc_major, 0, TMC_DEV_MAX, "tmc"); + if (ret < 0) { + pr_err("tmc: failed to allocate char dev region\n"); + return ret; + } + + tmc_class = class_create(THIS_MODULE, "tmc"); + if (IS_ERR(tmc_class)) { + pr_err("failed to create tmc class\n"); + ret = PTR_ERR(tmc_class); + unregister_chrdev_region(tmc_major, TMC_DEV_MAX); + return ret; + } + + ret = amba_driver_register(&tmc_driver); + if (ret) { + pr_err("tmc: error registering amba driver\n"); + class_destroy(tmc_class); + unregister_chrdev_region(tmc_major, TMC_DEV_MAX); + } + + return ret; +} + +static void __exit tmc_exit(void) +{ + amba_driver_unregister(&tmc_driver); + class_destroy(tmc_class); + unregister_chrdev_region(tmc_major, TMC_DEV_MAX); +} + +module_init(tmc_init); +module_exit(tmc_exit); MODULE_AUTHOR("Pratik Patel "); MODULE_DESCRIPTION("Arm CoreSight Trace Memory Controller driver"); diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h index 6bec20a392b3..b65ac363f9e4 100644 --- a/drivers/hwtracing/coresight/coresight-tmc.h +++ b/drivers/hwtracing/coresight/coresight-tmc.h @@ -7,6 +7,7 @@ #ifndef _CORESIGHT_TMC_H #define _CORESIGHT_TMC_H +#include #include #include #include @@ -163,11 +164,16 @@ struct etr_buf { void *private; }; +struct tmc_cdev { + struct cdev cdev; + struct device *dev; +}; + /** * struct tmc_drvdata - specifics associated to an TMC component * @base: memory mapped base address for this component. * @csdev: component vitals needed by the framework. - * @miscdev: specifics to handle "/dev/xyz.tmc" entry. + * @tmc_cdev: specifics to handle "/dev/xyz.tmc" entry. * @spinlock: only one at a time pls. * @pid: Process ID of the process being monitored by the session * that is using this component. @@ -191,7 +197,7 @@ struct etr_buf { struct tmc_drvdata { void __iomem *base; struct coresight_device *csdev; - struct miscdevice miscdev; + struct tmc_cdev cdev; spinlock_t spinlock; pid_t pid; bool reading;