Received: by 10.223.185.116 with SMTP id b49csp3395930wrg; Tue, 13 Feb 2018 01:45:57 -0800 (PST) X-Google-Smtp-Source: AH8x224otifvryX5i27GUUEiqK3jigtkEBmFnCP2OrnOmzCx2n1ZdvKbn7Gw93TDR127vNufSpgZ X-Received: by 2002:a17:902:9683:: with SMTP id n3-v6mr560185plp.177.1518515157079; Tue, 13 Feb 2018 01:45:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518515157; cv=none; d=google.com; s=arc-20160816; b=gnNeAr70a/FMEWaoX8MCHUwiMX/BDxcNWPGw99CKSiKyOIfKgiz1dR1ToOjHw9rN91 MR0bdM14POv3Vg1AQjAL20DFVSgy4sx86mWU0xIpS7zKIYfkPasJ/Mr5oKq/2uAIRV8b GTkSssnvKnq3PCI/ffnKwR81gdcyoDYaXIR2RZLjEhpAq/HwE882QulEHnO1+7XwthFn eJfYkb+E+99plVJTVdmebV/xMyuVsp5H0Zh0UfzIjarv5TVAI50oU3AEtrV0dBMpilnF Y+hkPJLv+0iB3ty61D25aUbSvDVo8gdzoOu0FlvDXbwnwaP72DEZ5f2dgbXMEEVEO0GO E7ew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=+nK894bhoJBN5WUhXyeyFJbgZbHZNgmo3HP8KF3CJOg=; b=LVKlOySypLYmqicyQ5mB1n2vCk9MMr5opeG0MpAKm8Y2a2ucrCjaeMWPM1ORXvpZ/V vAKWNlIyfXE0o7ppFUpV4C5/uUrkSyi0pa6X5KiljHyN/esp7feyMqWTqEZ6RS6egrsy o0wHti/B8ThKvDaRAXhK6d2XbcrsPaaYHgvRs5YSaTr8upSgmZS2NbS9jY7AyOOJzOJo IDYaRyMoBg1uVfXsVtzXfG+I1X9ctk4+fWKhAeY/vSdGRHjC4+5+pWYCkuscD8UQShrR piWNmlmodVEWqpIzJ7fC8czr1uOZr/T/mvMZvg6XUkXMZOhtnE3ztebcxYKwSNrVhZGc jOzA== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f13si1293577pgn.155.2018.02.13.01.45.42; Tue, 13 Feb 2018 01:45:57 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934487AbeBMJoB (ORCPT + 99 others); Tue, 13 Feb 2018 04:44:01 -0500 Received: from mga03.intel.com ([134.134.136.65]:27121 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934582AbeBMJf0 (ORCPT ); Tue, 13 Feb 2018 04:35:26 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Feb 2018 01:35:25 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,507,1511856000"; d="scan'208";a="26889507" Received: from hao-dev.bj.intel.com ([10.238.157.61]) by FMSMGA003.fm.intel.com with ESMTP; 13 Feb 2018 01:35:22 -0800 From: Wu Hao To: atull@kernel.org, mdf@kernel.org, linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org Cc: linux-api@vger.kernel.org, luwei.kang@intel.com, yi.z.zhang@intel.com, hao.wu@intel.com, Tim Whisonant , Enno Luebbers , Shiva Rao , Christopher Rauer , Xiao Guangrong Subject: [PATCH v4 05/24] fpga: dfl: add chardev support for feature devices Date: Tue, 13 Feb 2018 17:24:34 +0800 Message-Id: <1518513893-4719-6-git-send-email-hao.wu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1518513893-4719-1-git-send-email-hao.wu@intel.com> References: <1518513893-4719-1-git-send-email-hao.wu@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For feature devices drivers, both the FPGA Management Engine (FME) and Accelerated Function Unit (AFU) driver need to expose user interfaces via the device file, for example, mmap and ioctls. This patch adds chardev support in the dfl driver for feature devices, FME and AFU. It reserves the chardev regions for FME and AFU, and provide interfaces for FME and AFU driver to register their device file operations. Signed-off-by: Tim Whisonant Signed-off-by: Enno Luebbers Signed-off-by: Shiva Rao Signed-off-by: Christopher Rauer Signed-off-by: Zhang Yi Signed-off-by: Xiao Guangrong Signed-off-by: Wu Hao --- v2: rebased v3: move chardev support to fpga-dfl framework v4: rebase, and add more comments in code. --- drivers/fpga/dfl.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++- drivers/fpga/dfl.h | 14 ++++++++ 2 files changed, 117 insertions(+), 1 deletion(-) diff --git a/drivers/fpga/dfl.c b/drivers/fpga/dfl.c index f50694e..dcfe5ab 100644 --- a/drivers/fpga/dfl.c +++ b/drivers/fpga/dfl.c @@ -74,6 +74,96 @@ static enum fpga_id_type feature_dev_id_type(struct platform_device *pdev) return FPGA_ID_MAX; } +struct fpga_chardev_info { + const char *name; + dev_t devt; +}; + +/* indexed by enum fpga_devt_type */ +struct fpga_chardev_info fpga_chrdevs[] = { + {.name = FPGA_FEATURE_DEV_FME}, /* FPGA_DEVT_FME */ + {.name = FPGA_FEATURE_DEV_PORT}, /* FPGA_DEVT_AFU */ +}; + +static void fpga_chardev_uinit(void) +{ + int i; + + for (i = 0; i < FPGA_DEVT_MAX; i++) + if (MAJOR(fpga_chrdevs[i].devt)) { + unregister_chrdev_region(fpga_chrdevs[i].devt, + MINORMASK); + fpga_chrdevs[i].devt = MKDEV(0, 0); + } +} + +static int fpga_chardev_init(void) +{ + int i, ret; + + for (i = 0; i < FPGA_DEVT_MAX; i++) { + ret = alloc_chrdev_region(&fpga_chrdevs[i].devt, 0, MINORMASK, + fpga_chrdevs[i].name); + if (ret) + goto exit; + } + + return 0; + +exit: + fpga_chardev_uinit(); + return ret; +} + +static dev_t fpga_get_devt(enum fpga_devt_type type, int id) +{ + WARN_ON(type >= FPGA_DEVT_MAX); + + return MKDEV(MAJOR(fpga_chrdevs[type].devt), id); +} + +/** + * fpga_register_dev_ops - register cdev ops for feature dev + * + * @pdev: feature dev. + * @fops: file operations for feature dev's cdev. + * @owner: owning module/driver. + * + * Return: 0 on success, negative error code otherwise. + */ +int fpga_register_dev_ops(struct platform_device *pdev, + const struct file_operations *fops, + struct module *owner) +{ + struct feature_platform_data *pdata = dev_get_platdata(&pdev->dev); + + cdev_init(&pdata->cdev, fops); + pdata->cdev.owner = owner; + + /* + * set parent to the feature device so that its refcount is + * decreased after the last refcount of cdev is gone, that + * makes sure the feature device is valid during device + * file's life-cycle. + */ + pdata->cdev.kobj.parent = &pdev->dev.kobj; + + return cdev_add(&pdata->cdev, pdev->dev.devt, 1); +} +EXPORT_SYMBOL_GPL(fpga_register_dev_ops); + +/** + * fpga_unregister_dev_ops - unregister cdev ops for feature dev + * @pdev: feature dev. + */ +void fpga_unregister_dev_ops(struct platform_device *pdev) +{ + struct feature_platform_data *pdata = dev_get_platdata(&pdev->dev); + + cdev_del(&pdata->cdev); +} +EXPORT_SYMBOL_GPL(fpga_unregister_dev_ops); + /** * struct build_feature_devs_info - info collected during feature dev build. * @@ -207,8 +297,12 @@ build_info_create_dev(struct build_feature_devs_info *binfo, void __iomem *ioaddr) { struct platform_device *fdev; + enum fpga_devt_type devt_type = FPGA_DEVT_FME; int ret; + if (type == PORT_ID) + devt_type = FPGA_DEVT_PORT; + /* we will create a new device, commit current device first */ ret = build_info_commit_dev(binfo); if (ret) @@ -232,6 +326,7 @@ build_info_create_dev(struct build_feature_devs_info *binfo, return fdev->id; fdev->dev.parent = &binfo->cdev->region.dev; + fdev->dev.devt = fpga_get_devt(devt_type, fdev->id); return 0; } @@ -769,13 +864,20 @@ EXPORT_SYMBOL_GPL(__fpga_port_disable); static int __init dfl_fpga_init(void) { + int ret; + fpga_ids_init(); - return 0; + ret = fpga_chardev_init(); + if (ret) + fpga_ids_destroy(); + + return ret; } static void __exit dfl_fpga_exit(void) { + fpga_chardev_uinit(); fpga_ids_destroy(); } diff --git a/drivers/fpga/dfl.h b/drivers/fpga/dfl.h index 22dcf73..9b19399 100644 --- a/drivers/fpga/dfl.h +++ b/drivers/fpga/dfl.h @@ -15,6 +15,7 @@ #define __FPGA_DFL_H #include +#include #include #include #include @@ -150,6 +151,7 @@ struct feature { * * @node: node to link feature devs to container device's port_dev_list. * @lock: mutex to protect platform data. + * @cdev: cdev of feature dev. * @dev: ptr to platform device linked with this platform data. * @disable_count: count for port disable. * @num: number for sub features. @@ -158,6 +160,7 @@ struct feature { struct feature_platform_data { struct list_head node; struct mutex lock; + struct cdev cdev; struct platform_device *dev; unsigned int disable_count; @@ -174,6 +177,17 @@ static inline int feature_platform_data_size(const int num) num * sizeof(struct feature); } +enum fpga_devt_type { + FPGA_DEVT_FME, + FPGA_DEVT_PORT, + FPGA_DEVT_MAX, +}; + +int fpga_register_dev_ops(struct platform_device *pdev, + const struct file_operations *fops, + struct module *owner); +void fpga_unregister_dev_ops(struct platform_device *pdev); + int fpga_port_id(struct platform_device *pdev); static inline int fpga_port_check_id(struct platform_device *pdev, -- 2.7.4