fpga: dfl: add id_table for dfl private feature driver

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>
This commit is contained in:
Wu Hao 2019-08-04 18:20:15 +08:00 committed by Greg Kroah-Hartman
parent d2ad5ac1cd
commit 15bbb300fc
6 changed files with 59 additions and 15 deletions

View File

@ -323,6 +323,11 @@ port_hdr_ioctl(struct platform_device *pdev, struct dfl_feature *feature,
return ret; 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 = { static const struct dfl_feature_ops port_hdr_ops = {
.init = port_hdr_init, .init = port_hdr_init,
.uinit = port_hdr_uinit, .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); 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 = { static const struct dfl_feature_ops port_afu_ops = {
.init = port_afu_init, .init = port_afu_init,
.uinit = port_afu_uinit, .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[] = { static struct dfl_feature_driver port_feature_drvs[] = {
{ {
.id = PORT_FEATURE_ID_HEADER, .id_table = port_hdr_id_table,
.ops = &port_hdr_ops, .ops = &port_hdr_ops,
}, },
{ {
.id = PORT_FEATURE_ID_AFU, .id_table = port_afu_id_table,
.ops = &port_afu_ops, .ops = &port_afu_ops,
}, },
{ {

View File

@ -145,6 +145,11 @@ static long fme_hdr_ioctl(struct platform_device *pdev,
return -ENODEV; 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 = { static const struct dfl_feature_ops fme_hdr_ops = {
.init = fme_hdr_init, .init = fme_hdr_init,
.uinit = fme_hdr_uinit, .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[] = { static struct dfl_feature_driver fme_feature_drvs[] = {
{ {
.id = FME_FEATURE_ID_HEADER, .id_table = fme_hdr_id_table,
.ops = &fme_hdr_ops, .ops = &fme_hdr_ops,
}, },
{ {
.id = FME_FEATURE_ID_PR_MGMT, .id_table = fme_pr_mgmt_id_table,
.ops = &pr_mgmt_ops, .ops = &fme_pr_mgmt_ops,
}, },
{ {
.ops = NULL, .ops = NULL,

View File

@ -470,7 +470,12 @@ static long fme_pr_ioctl(struct platform_device *pdev,
return ret; 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, .init = pr_mgmt_init,
.uinit = pr_mgmt_uinit, .uinit = pr_mgmt_uinit,
.ioctl = fme_pr_ioctl, .ioctl = fme_pr_ioctl,

View File

@ -33,6 +33,7 @@ struct dfl_fme {
struct dfl_feature_platform_data *pdata; 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 */ #endif /* __DFL_FME_H */

View File

@ -281,6 +281,21 @@ static int dfl_feature_instance_init(struct platform_device *pdev,
return ret; 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 * dfl_fpga_dev_feature_init - init for sub features of dfl feature device
* @pdev: feature device. * @pdev: feature device.
@ -301,8 +316,7 @@ int dfl_fpga_dev_feature_init(struct platform_device *pdev,
while (drv->ops) { while (drv->ops) {
dfl_fpga_dev_for_each_feature(pdata, feature) { dfl_fpga_dev_for_each_feature(pdata, feature) {
/* match feature and drv using id */ if (dfl_feature_drv_match(feature, drv)) {
if (feature->id == drv->id) {
ret = dfl_feature_instance_init(pdev, pdata, ret = dfl_feature_instance_init(pdev, pdata,
feature, drv); feature, drv);
if (ret) if (ret)

View File

@ -30,8 +30,8 @@
/* plus one for fme device */ /* plus one for fme device */
#define MAX_DFL_FEATURE_DEV_NUM (MAX_DFL_FPGA_PORT_NUM + 1) #define MAX_DFL_FEATURE_DEV_NUM (MAX_DFL_FPGA_PORT_NUM + 1)
/* Reserved 0x0 for Header Group Register and 0xff for AFU */ /* Reserved 0xfe for Header Group Register and 0xff for AFU */
#define FEATURE_ID_FIU_HEADER 0x0 #define FEATURE_ID_FIU_HEADER 0xfe
#define FEATURE_ID_AFU 0xff #define FEATURE_ID_AFU 0xff
#define FME_FEATURE_ID_HEADER FEATURE_ID_FIU_HEADER #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); 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. * @id: unique dfl private feature id.
* @ops: ops of this sub feature. */
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 { struct dfl_feature_driver {
u64 id; const struct dfl_feature_id *id_table;
const struct dfl_feature_ops *ops; const struct dfl_feature_ops *ops;
}; };