]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
fpga: dfl: add id_table for dfl private feature driver
authorWu Hao <hao.wu@intel.com>
Sun, 4 Aug 2019 10:20:15 +0000 (18:20 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 5 Aug 2019 16:01:24 +0000 (18:01 +0200)
This patch adds id_table for each dfl private feature driver,
it allows to reuse same private feature driver to match and support
multiple dfl private features.

Signed-off-by: Xu Yilun <yilun.xu@intel.com>
Signed-off-by: Wu Hao <hao.wu@intel.com>
Acked-by: Moritz Fischer <mdf@kernel.org>
Acked-by: Alan Tull <atull@kernel.org>
Signed-off-by: Moritz Fischer <mdf@kernel.org>
Link: https://lore.kernel.org/r/1564914022-3710-6-git-send-email-hao.wu@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/fpga/dfl-afu-main.c
drivers/fpga/dfl-fme-main.c
drivers/fpga/dfl-fme-pr.c
drivers/fpga/dfl-fme.h
drivers/fpga/dfl.c
drivers/fpga/dfl.h

index 12175bbd90c17dc892beedb2cfa7c149e5365511..e50c45ed40acd0ac0c2cba52859cd0c56cf8f2ff 100644 (file)
@@ -323,6 +323,11 @@ port_hdr_ioctl(struct platform_device *pdev, struct dfl_feature *feature,
        return ret;
 }
 
+static const struct dfl_feature_id port_hdr_id_table[] = {
+       {.id = PORT_FEATURE_ID_HEADER,},
+       {0,}
+};
+
 static const struct dfl_feature_ops port_hdr_ops = {
        .init = port_hdr_init,
        .uinit = port_hdr_uinit,
@@ -384,6 +389,11 @@ static void port_afu_uinit(struct platform_device *pdev,
        device_remove_groups(&pdev->dev, port_afu_groups);
 }
 
+static const struct dfl_feature_id port_afu_id_table[] = {
+       {.id = PORT_FEATURE_ID_AFU,},
+       {0,}
+};
+
 static const struct dfl_feature_ops port_afu_ops = {
        .init = port_afu_init,
        .uinit = port_afu_uinit,
@@ -391,11 +401,11 @@ static const struct dfl_feature_ops port_afu_ops = {
 
 static struct dfl_feature_driver port_feature_drvs[] = {
        {
-               .id = PORT_FEATURE_ID_HEADER,
+               .id_table = port_hdr_id_table,
                .ops = &port_hdr_ops,
        },
        {
-               .id = PORT_FEATURE_ID_AFU,
+               .id_table = port_afu_id_table,
                .ops = &port_afu_ops,
        },
        {
index dfea2dee78c3d38c6c80ea1f087ba4784b066bd5..5fdce548f8213ea5d392c1eadb1c318d08e60cd6 100644 (file)
@@ -145,6 +145,11 @@ static long fme_hdr_ioctl(struct platform_device *pdev,
        return -ENODEV;
 }
 
+static const struct dfl_feature_id fme_hdr_id_table[] = {
+       {.id = FME_FEATURE_ID_HEADER,},
+       {0,}
+};
+
 static const struct dfl_feature_ops fme_hdr_ops = {
        .init = fme_hdr_init,
        .uinit = fme_hdr_uinit,
@@ -153,12 +158,12 @@ static const struct dfl_feature_ops fme_hdr_ops = {
 
 static struct dfl_feature_driver fme_feature_drvs[] = {
        {
-               .id = FME_FEATURE_ID_HEADER,
+               .id_table = fme_hdr_id_table,
                .ops = &fme_hdr_ops,
        },
        {
-               .id = FME_FEATURE_ID_PR_MGMT,
-               .ops = &pr_mgmt_ops,
+               .id_table = fme_pr_mgmt_id_table,
+               .ops = &fme_pr_mgmt_ops,
        },
        {
                .ops = NULL,
index 3c71dc3faaf5b99bc632d86a73f776fbb94cd581..a233a53db708175f7637470b173e4c3fe52c5b4f 100644 (file)
@@ -470,7 +470,12 @@ static long fme_pr_ioctl(struct platform_device *pdev,
        return ret;
 }
 
-const struct dfl_feature_ops pr_mgmt_ops = {
+const struct dfl_feature_id fme_pr_mgmt_id_table[] = {
+       {.id = FME_FEATURE_ID_PR_MGMT,},
+       {0}
+};
+
+const struct dfl_feature_ops fme_pr_mgmt_ops = {
        .init = pr_mgmt_init,
        .uinit = pr_mgmt_uinit,
        .ioctl = fme_pr_ioctl,
index 5394a216c5c0fc5f9a7b8a4c35c28d71ce71d6ef..e4131e857dae673f51f3bcb30a6e6a35d32e940e 100644 (file)
@@ -33,6 +33,7 @@ struct dfl_fme {
        struct dfl_feature_platform_data *pdata;
 };
 
-extern const struct dfl_feature_ops pr_mgmt_ops;
+extern const struct dfl_feature_ops fme_pr_mgmt_ops;
+extern const struct dfl_feature_id fme_pr_mgmt_id_table[];
 
 #endif /* __DFL_FME_H */
index b9137044b667b9e6c9671233e0eca600f04a2594..87eaef6d2723f61aa6edf846619ddd869931a45a 100644 (file)
@@ -281,6 +281,21 @@ static int dfl_feature_instance_init(struct platform_device *pdev,
        return ret;
 }
 
+static bool dfl_feature_drv_match(struct dfl_feature *feature,
+                                 struct dfl_feature_driver *driver)
+{
+       const struct dfl_feature_id *ids = driver->id_table;
+
+       if (ids) {
+               while (ids->id) {
+                       if (ids->id == feature->id)
+                               return true;
+                       ids++;
+               }
+       }
+       return false;
+}
+
 /**
  * dfl_fpga_dev_feature_init - init for sub features of dfl feature device
  * @pdev: feature device.
@@ -301,8 +316,7 @@ int dfl_fpga_dev_feature_init(struct platform_device *pdev,
 
        while (drv->ops) {
                dfl_fpga_dev_for_each_feature(pdata, feature) {
-                       /* match feature and drv using id */
-                       if (feature->id == drv->id) {
+                       if (dfl_feature_drv_match(feature, drv)) {
                                ret = dfl_feature_instance_init(pdev, pdata,
                                                                feature, drv);
                                if (ret)
index 6625d73bade8189d394cee3a252c060cde153f4c..856ea4ebc44501a84269a31dbbfe9c9b3e6f31c5 100644 (file)
@@ -30,8 +30,8 @@
 /* plus one for fme device */
 #define MAX_DFL_FEATURE_DEV_NUM    (MAX_DFL_FPGA_PORT_NUM + 1)
 
-/* Reserved 0x0 for Header Group Register and 0xff for AFU */
-#define FEATURE_ID_FIU_HEADER          0x0
+/* Reserved 0xfe for Header Group Register and 0xff for AFU */
+#define FEATURE_ID_FIU_HEADER          0xfe
 #define FEATURE_ID_AFU                 0xff
 
 #define FME_FEATURE_ID_HEADER          FEATURE_ID_FIU_HEADER
@@ -165,13 +165,22 @@ void dfl_fpga_port_ops_put(struct dfl_fpga_port_ops *ops);
 int dfl_fpga_check_port_id(struct platform_device *pdev, void *pport_id);
 
 /**
- * struct dfl_feature_driver - sub feature's driver
+ * struct dfl_feature_id - dfl private feature id
  *
- * @id: sub feature id.
- * @ops: ops of this sub feature.
+ * @id: unique dfl private feature id.
  */
-struct dfl_feature_driver {
+struct dfl_feature_id {
        u64 id;
+};
+
+/**
+ * struct dfl_feature_driver - dfl private feature driver
+ *
+ * @id_table: id_table for dfl private features supported by this driver.
+ * @ops: ops of this dfl private feature driver.
+ */
+struct dfl_feature_driver {
+       const struct dfl_feature_id *id_table;
        const struct dfl_feature_ops *ops;
 };