X86 platform drivers
 help / color / mirror / Atom feed
From: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
To: Vadim Pasternak <vadimp@nvidia.com>
Cc: hdegoede@redhat.com, platform-driver-x86@vger.kernel.org
Subject: Re: [PATCH platform-next 13/16] platform: mellanox: Add initial support for PCIe based programming logic device
Date: Mon, 14 Aug 2023 17:07:37 +0300 (EEST)	[thread overview]
Message-ID: <e742d08e-1135-0c4-39cd-5e88ab642833@linux.intel.com> (raw)
In-Reply-To: <20230814085910.56069-14-vadimp@nvidia.com>

On Mon, 14 Aug 2023, Vadim Pasternak wrote:

> Extend driver to support logic implemented by FPGA device connected
> through PCIe bus.
> 
> The motivation two support new generation of Nvidia COME module
> equipped with Lattice LFD2NX-40 FPGA device.
> 
> In order to support new Nvidia COME module FPGA device driver
> initialization flow is modified. In case FPGA device is detected,
> system resources are to be mapped to this device, otherwise system
> resources are to be mapped same as it has been done before for Lattice
> LPC based CPLD.
> 
> FPGA device is associated with three PCIe devices:
> - PCIe-LPC bridge for main register space access.
> - PCIe-I2C bridge for I2C controller access.
> - PCIe-JTAG bridge for JTAG access.
> 
> Signed-off-by: Vadim Pasternak <vadimp@nvidia.com>
> Reviewed-by: Michael Shych <michaelsh@nvidia.com>
> ---
>  drivers/platform/x86/mlx-platform.c | 134 +++++++++++++++++++++++++++-
>  1 file changed, 132 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c
> index a70b86e60721..d60f7470e208 100644
> --- a/drivers/platform/x86/mlx-platform.c
> +++ b/drivers/platform/x86/mlx-platform.c
> @@ -12,6 +12,7 @@
>  #include <linux/i2c-mux.h>
>  #include <linux/io.h>
>  #include <linux/module.h>
> +#include <linux/pci.h>
>  #include <linux/platform_device.h>
>  #include <linux/platform_data/i2c-mux-reg.h>
>  #include <linux/platform_data/mlxreg.h>
> @@ -330,6 +331,12 @@
>  #define MLXPLAT_I2C_MAIN_BUS_NOTIFIED		0x01
>  #define MLXPLAT_I2C_MAIN_BUS_HANDLE_CREATED	0x02
>  
> +/* Lattice FPGA PCI configuration */
> +#define PCI_VENDOR_ID_LATTICE			0x1204
> +#define PCI_DEVICE_ID_LATTICE_I2C_BRIDGE	0x9c2f
> +#define PCI_DEVICE_ID_LATTICE_JTAG_BRIDGE	0x9c30
> +#define PCI_DEVICE_ID_LATTICE_LPC_BRIDGE	0x9c32
> +
>  /* mlxplat_priv - platform private data
>   * @pdev_i2c - i2c controller platform device
>   * @pdev_mux - array of mux platform devices
> @@ -361,6 +368,7 @@ struct mlxplat_priv {
>  
>  static struct platform_device *mlxplat_dev;
>  static int mlxplat_i2c_main_complition_notify(void *handle, int id);
> +static void __iomem *i2c_bridge_addr, *jtag_bridge_addr;
>  
>  /* Regions for LPC I2C controller and LPC base register space */
>  static const struct resource mlxplat_lpc_resources[] = {
> @@ -5543,6 +5551,9 @@ static struct mlxreg_core_platform_data *mlxplat_fan;
>  static struct mlxreg_core_platform_data
>  	*mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS];
>  static const struct regmap_config *mlxplat_regmap_config;
> +static struct pci_dev *lpc_bridge;
> +static struct pci_dev *i2c_bridge;
> +static struct pci_dev *jtag_bridge;
>  
>  /* Platform default reset function */
>  static int mlxplat_reboot_notifier(struct notifier_block *nb, unsigned long action, void *unused)
> @@ -6171,15 +6182,131 @@ static void mlxplat_lpc_cpld_device_exit(void)
>  {
>  }
>  
> +static int
> +mlxplat_pci_fpga_device_init(unsigned int device, const char *res_name, struct pci_dev **pci_bridge,
> +			     void __iomem **pci_bridge_addr)
> +{
> +	void __iomem *pci_mem_addr;
> +	struct pci_dev *pci_dev;
> +	int err;
> +
> +	pci_dev = pci_get_device(PCI_VENDOR_ID_LATTICE, device, NULL);
> +	if (!pci_dev)
> +		return -ENODEV;
> +
> +	err = pci_enable_device(pci_dev);
> +	if (err) {
> +		dev_err(&pci_dev->dev, "pci_enable_device failed with error %d\n", err);
> +		goto fail_pci_enable_device;
> +	}
> +
> +	err = pci_request_region(pci_dev, 0, res_name);
> +	if (err) {
> +		dev_err(&pci_dev->dev, "pci_request_regions failed with error %d\n", err);
> +		goto fail_pci_request_regions;
> +	}
> +
> +	err = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(64));
> +	if (err) {
> +		err = dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32));
> +		if (err) {
> +			dev_err(&pci_dev->dev, "dma_set_mask failed with error %d\n", err);
> +			goto fail_pci_set_dma_mask;
> +		}
> +	}
> +
> +	pci_set_master(pci_dev);
> +
> +	pci_mem_addr = devm_ioremap(&pci_dev->dev, pci_resource_start(pci_dev, 0),
> +				    pci_resource_len(pci_dev, 0));
> +	if (!pci_mem_addr) {
> +		dev_err(&mlxplat_dev->dev, "ioremap failed\n");
> +		err = -EIO;
> +		goto fail_ioremap;
> +	}
> +
> +	*pci_bridge = pci_dev;
> +	*pci_bridge_addr = pci_mem_addr;
> +
> +	return 0;
> +
> +fail_ioremap:
> +fail_pci_set_dma_mask:

The problem with using what fails to name labels produces this very 
problem of duplicated labels. If you'd have a label called 
release_regions: it wouldn't be necessary.

-- 
 i.

> +	pci_release_regions(pci_dev);
> +fail_pci_request_regions:
> +	pci_disable_device(pci_dev);
> +fail_pci_enable_device:
> +	return err;
> +}
> +
> +static void
> +mlxplat_pci_fpga_device_exit(struct pci_dev *pci_bridge,
> +			     void __iomem *pci_bridge_addr)
> +{
> +	iounmap(pci_bridge_addr);
> +	pci_release_regions(pci_bridge);
> +	pci_disable_device(pci_bridge);
> +}
> +
> +static int
> +mlxplat_pci_fpga_devices_init(struct resource **hotplug_resources,
> +			      unsigned int *hotplug_resources_size)
> +{
> +	int err;
> +
> +	err = mlxplat_pci_fpga_device_init(PCI_DEVICE_ID_LATTICE_LPC_BRIDGE,
> +					   "mlxplat_lpc_bridge", &lpc_bridge,
> +					   &mlxplat_mlxcpld_regmap_ctx.base);
> +	if (err)
> +		goto mlxplat_pci_fpga_device_init_lpc_fail;
> +
> +	err = mlxplat_pci_fpga_device_init(PCI_DEVICE_ID_LATTICE_I2C_BRIDGE,
> +					   "mlxplat_i2c_bridge", &i2c_bridge,
> +					    &i2c_bridge_addr);
> +	if (err)
> +		goto mlxplat_pci_fpga_device_init_i2c_fail;
> +
> +	err = mlxplat_pci_fpga_device_init(PCI_DEVICE_ID_LATTICE_JTAG_BRIDGE,
> +					   "mlxplat_jtag_bridge", &jtag_bridge,
> +					    &jtag_bridge_addr);
> +	if (err)
> +		goto mlxplat_pci_fpga_device_init_jtag_fail;
> +
> +	return 0;
> +
> +mlxplat_pci_fpga_device_init_jtag_fail:
> +	mlxplat_pci_fpga_device_exit(i2c_bridge, i2c_bridge_addr);
> +mlxplat_pci_fpga_device_init_i2c_fail:
> +	mlxplat_pci_fpga_device_exit(lpc_bridge, mlxplat_mlxcpld_regmap_ctx.base);
> +mlxplat_pci_fpga_device_init_lpc_fail:
> +	return err;
> +}
> +
> +static void mlxplat_pci_fpga_devices_exit(void)
> +{
> +	mlxplat_pci_fpga_device_exit(jtag_bridge, jtag_bridge_addr);
> +	mlxplat_pci_fpga_device_exit(i2c_bridge, i2c_bridge_addr);
> +	mlxplat_pci_fpga_device_exit(lpc_bridge, mlxplat_mlxcpld_regmap_ctx.base);
> +}
> +
>  static int
>  mlxplat_pre_init(struct resource **hotplug_resources, unsigned int *hotplug_resources_size)
>  {
> -	return mlxplat_lpc_cpld_device_init(hotplug_resources, hotplug_resources_size);
> +	int err;
> +
> +	err = mlxplat_pci_fpga_devices_init(hotplug_resources, hotplug_resources_size);
> +	if (err == -ENODEV)
> +		return mlxplat_lpc_cpld_device_init(hotplug_resources, hotplug_resources_size);
> +
> +	return err;
>  }
>  
>  static void mlxplat_post_exit(void)
>  {
> -	mlxplat_lpc_cpld_device_exit();
> +	if (lpc_bridge)
> +		mlxplat_pci_fpga_devices_exit();
> +	else
> +		mlxplat_lpc_cpld_device_exit();
>  }
>  
>  static int mlxplat_post_init(struct mlxplat_priv *priv)
> @@ -6365,6 +6492,9 @@ static int mlxplat_i2c_main_init(struct mlxplat_priv *priv)
>  	mlxplat_i2c->regmap = priv->regmap;
>  	mlxplat_i2c->handle = priv;
>  
> +	/* Set mapped base address of I2C-LPC bridge over PCIe */
> +	if (lpc_bridge)
> +		mlxplat_i2c->addr = i2c_bridge_addr;
>  	priv->pdev_i2c = platform_device_register_resndata(&mlxplat_dev->dev, "i2c_mlxcpld",
>  							   nr, priv->hotplug_resources,
>  							   priv->hotplug_resources_size,
> 

  reply	other threads:[~2023-08-14 14:14 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-14  8:58 [PATCH platform-next 00/16] Add new features and amendments for Nvidia systems Vadim Pasternak
2023-08-14  8:58 ` [PATCH platform-next 01/16] platform: mellanox: Add new attributes Vadim Pasternak
2023-08-14  8:58 ` [PATCH platform-next 02/16] platform: mellanox: Add field upgrade capability register Vadim Pasternak
2023-08-14  8:58 ` [PATCH platform-next 03/16] platform: mellanox: Modify reset causes description Vadim Pasternak
2023-08-14 13:40   ` Ilpo Järvinen
2023-08-14  8:58 ` [PATCH platform-next 04/16] platform: mellanox: mlx-platform: Modify health and power hotplug action Vadim Pasternak
2023-08-14  8:58 ` [PATCH platform-next 05/16] platform: mellanox: mlx-platform: Add reset cause attribute Vadim Pasternak
2023-08-14  8:59 ` [PATCH platform-next 06/16] platform: mellanox: mlx-platform: add support for additional CPLD Vadim Pasternak
2023-08-14  8:59 ` [PATCH platform-next 07/16] platform: mellanox: mlx-platform: Modify power off callback Vadim Pasternak
2023-08-14 13:43   ` Ilpo Järvinen
2023-08-14  8:59 ` [PATCH platform-next 08/16] platform: mellanox: Cosmetic changes Vadim Pasternak
2023-08-14 13:46   ` Ilpo Järvinen
2023-08-14  8:59 ` [PATCH platform-next 09/16] platform: mellanox: mlx-platform: Add reset callback Vadim Pasternak
2023-08-14 13:49   ` Ilpo Järvinen
2023-08-14  8:59 ` [PATCH platform-next 10/16] platform: mellanox: mlx-platform: Prepare driver to allow probing through ACPI infrastructure Vadim Pasternak
2023-08-14  8:59 ` [PATCH platform-next 11/16] platform: mellanox: mlx-platform: Introduce ACPI init flow Vadim Pasternak
2023-08-14  8:59 ` [PATCH platform-next 12/16] platform: mellanox: mlx-platform: Get interrupt line through ACPI Vadim Pasternak
2023-08-14 13:53   ` Ilpo Järvinen
2023-08-14  8:59 ` [PATCH platform-next 13/16] platform: mellanox: Add initial support for PCIe based programming logic device Vadim Pasternak
2023-08-14 14:07   ` Ilpo Järvinen [this message]
2023-08-14  8:59 ` [PATCH platform-next 14/16] platform/mellanox: mlxreg-hotplug: Extend condition for notification callback processing Vadim Pasternak
2023-08-14  8:59 ` [PATCH platform-next 15/16] platform: mellanox: nvsw-sn2201: change fans i2c busses Vadim Pasternak
2023-08-14  8:59 ` [PATCH platform-next 16/16] Documentation/ABI: Add new attribute for mlxreg-io sysfs interfaces Vadim Pasternak

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e742d08e-1135-0c4-39cd-5e88ab642833@linux.intel.com \
    --to=ilpo.jarvinen@linux.intel.com \
    --cc=hdegoede@redhat.com \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=vadimp@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox