|
@@ -39,6 +39,7 @@
|
|
#include <linux/pci.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/dma-mapping.h>
|
|
#include <linux/dma-mapping.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
|
|
+#include <linux/io-mapping.h>
|
|
|
|
|
|
#include <linux/mlx4/device.h>
|
|
#include <linux/mlx4/device.h>
|
|
#include <linux/mlx4/doorbell.h>
|
|
#include <linux/mlx4/doorbell.h>
|
|
@@ -721,8 +722,31 @@ static void mlx4_free_icms(struct mlx4_dev *dev)
|
|
mlx4_free_icm(dev, priv->fw.aux_icm, 0);
|
|
mlx4_free_icm(dev, priv->fw.aux_icm, 0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int map_bf_area(struct mlx4_dev *dev)
|
|
|
|
+{
|
|
|
|
+ struct mlx4_priv *priv = mlx4_priv(dev);
|
|
|
|
+ resource_size_t bf_start;
|
|
|
|
+ resource_size_t bf_len;
|
|
|
|
+ int err = 0;
|
|
|
|
+
|
|
|
|
+ bf_start = pci_resource_start(dev->pdev, 2) + (dev->caps.num_uars << PAGE_SHIFT);
|
|
|
|
+ bf_len = pci_resource_len(dev->pdev, 2) - (dev->caps.num_uars << PAGE_SHIFT);
|
|
|
|
+ priv->bf_mapping = io_mapping_create_wc(bf_start, bf_len);
|
|
|
|
+ if (!priv->bf_mapping)
|
|
|
|
+ err = -ENOMEM;
|
|
|
|
+
|
|
|
|
+ return err;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void unmap_bf_area(struct mlx4_dev *dev)
|
|
|
|
+{
|
|
|
|
+ if (mlx4_priv(dev)->bf_mapping)
|
|
|
|
+ io_mapping_free(mlx4_priv(dev)->bf_mapping);
|
|
|
|
+}
|
|
|
|
+
|
|
static void mlx4_close_hca(struct mlx4_dev *dev)
|
|
static void mlx4_close_hca(struct mlx4_dev *dev)
|
|
{
|
|
{
|
|
|
|
+ unmap_bf_area(dev);
|
|
mlx4_CLOSE_HCA(dev, 0);
|
|
mlx4_CLOSE_HCA(dev, 0);
|
|
mlx4_free_icms(dev);
|
|
mlx4_free_icms(dev);
|
|
mlx4_UNMAP_FA(dev);
|
|
mlx4_UNMAP_FA(dev);
|
|
@@ -775,6 +799,9 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
|
|
goto err_stop_fw;
|
|
goto err_stop_fw;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (map_bf_area(dev))
|
|
|
|
+ mlx4_dbg(dev, "Failed to map blue flame area\n");
|
|
|
|
+
|
|
init_hca.log_uar_sz = ilog2(dev->caps.num_uars);
|
|
init_hca.log_uar_sz = ilog2(dev->caps.num_uars);
|
|
|
|
|
|
err = mlx4_init_icm(dev, &dev_cap, &init_hca, icm_size);
|
|
err = mlx4_init_icm(dev, &dev_cap, &init_hca, icm_size);
|
|
@@ -805,6 +832,7 @@ err_free_icm:
|
|
mlx4_free_icms(dev);
|
|
mlx4_free_icms(dev);
|
|
|
|
|
|
err_stop_fw:
|
|
err_stop_fw:
|
|
|
|
+ unmap_bf_area(dev);
|
|
mlx4_UNMAP_FA(dev);
|
|
mlx4_UNMAP_FA(dev);
|
|
mlx4_free_icm(dev, priv->fw.fw_icm, 0);
|
|
mlx4_free_icm(dev, priv->fw.fw_icm, 0);
|
|
|
|
|
|
@@ -1196,6 +1224,9 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
|
|
|
pci_read_config_byte(pdev, PCI_REVISION_ID, &dev->rev_id);
|
|
pci_read_config_byte(pdev, PCI_REVISION_ID, &dev->rev_id);
|
|
|
|
|
|
|
|
+ INIT_LIST_HEAD(&priv->bf_list);
|
|
|
|
+ mutex_init(&priv->bf_mutex);
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Now reset the HCA before we touch the PCI capabilities or
|
|
* Now reset the HCA before we touch the PCI capabilities or
|
|
* attempt a firmware command, since a boot ROM may have left
|
|
* attempt a firmware command, since a boot ROM may have left
|