diff options
Diffstat (limited to 'drivers/cdx/controller/cdx_controller.c')
| -rw-r--r-- | drivers/cdx/controller/cdx_controller.c | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/cdx/controller/cdx_controller.c b/drivers/cdx/controller/cdx_controller.c index 85fe4b1c4e5e..112a1541de6d 100644 --- a/drivers/cdx/controller/cdx_controller.c +++ b/drivers/cdx/controller/cdx_controller.c @@ -9,6 +9,7 @@  #include <linux/platform_device.h>  #include <linux/slab.h>  #include <linux/cdx/cdx_bus.h> +#include <linux/irqdomain.h>  #include "cdx_controller.h"  #include "../cdx.h" @@ -60,9 +61,19 @@ static int cdx_configure_device(struct cdx_controller *cdx,  				u8 bus_num, u8 dev_num,  				struct cdx_device_config *dev_config)  { +	u16 msi_index;  	int ret = 0; +	u32 data; +	u64 addr;  	switch (dev_config->type) { +	case CDX_DEV_MSI_CONF: +		msi_index = dev_config->msi.msi_index; +		data = dev_config->msi.data; +		addr = dev_config->msi.addr; + +		ret = cdx_mcdi_write_msi(cdx->priv, bus_num, dev_num, msi_index, addr, data); +		break;  	case CDX_DEV_RESET_CONF:  		ret = cdx_mcdi_reset_device(cdx->priv, bus_num, dev_num);  		break; @@ -70,6 +81,9 @@ static int cdx_configure_device(struct cdx_controller *cdx,  		ret = cdx_mcdi_bus_master_enable(cdx->priv, bus_num, dev_num,  						 dev_config->bus_master_enable);  		break; +	case CDX_DEV_MSI_ENABLE: +		ret = cdx_mcdi_msi_enable(cdx->priv, bus_num, dev_num, dev_config->msi_enable); +		break;  	default:  		ret = -EINVAL;  	} @@ -178,6 +192,14 @@ static int xlnx_cdx_probe(struct platform_device *pdev)  	cdx->priv = cdx_mcdi;  	cdx->ops = &cdx_ops; +	/* Create MSI domain */ +	cdx->msi_domain = cdx_msi_domain_init(&pdev->dev); +	if (!cdx->msi_domain) { +		dev_err(&pdev->dev, "cdx_msi_domain_init() failed"); +		ret = -ENODEV; +		goto cdx_msi_fail; +	} +  	ret = cdx_setup_rpmsg(pdev);  	if (ret) {  		if (ret != -EPROBE_DEFER) @@ -189,6 +211,8 @@ static int xlnx_cdx_probe(struct platform_device *pdev)  	return 0;  cdx_rpmsg_fail: +	irq_domain_remove(cdx->msi_domain); +cdx_msi_fail:  	kfree(cdx);  cdx_alloc_fail:  	cdx_mcdi_finish(cdx_mcdi); @@ -205,6 +229,7 @@ static int xlnx_cdx_remove(struct platform_device *pdev)  	cdx_destroy_rpmsg(pdev); +	irq_domain_remove(cdx->msi_domain);  	kfree(cdx);  	cdx_mcdi_finish(cdx_mcdi);  | 
