summaryrefslogtreecommitdiff
path: root/drivers/ntb/hw/intel/ntb_hw_intel.c
diff options
context:
space:
mode:
authorDave Jiang <dave.jiang@intel.com>2018-01-29 13:22:24 -0700
committerJon Mason <jdmason@kudzu.us>2018-06-11 15:20:59 -0400
commitf6e51c354b60c177a4287f236d353b430d3dc6c1 (patch)
tree05ac8d016d9d9ccde66a105183d3e73a6b851bcf /drivers/ntb/hw/intel/ntb_hw_intel.c
parenta9065055ed09fe6e59e5bbfd12c8de629c53005d (diff)
downloadlinux-f6e51c354b60c177a4287f236d353b430d3dc6c1.tar.gz
linux-f6e51c354b60c177a4287f236d353b430d3dc6c1.tar.bz2
linux-f6e51c354b60c177a4287f236d353b430d3dc6c1.zip
ntb: intel: split out the gen3 code
Move the Intel hw gen3 code to its own source file. The ntb_hw_intel.c was getting too large and makes it hard to maintain with future hardware changes. Signed-off-by: Dave Jiang <dave.jiang@intel.com> Signed-off-by: Jon Mason <jdmason@kudzu.us>
Diffstat (limited to 'drivers/ntb/hw/intel/ntb_hw_intel.c')
-rw-r--r--drivers/ntb/hw/intel/ntb_hw_intel.c2693
1 files changed, 0 insertions, 2693 deletions
diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c
deleted file mode 100644
index 44bf2f4eb068..000000000000
--- a/drivers/ntb/hw/intel/ntb_hw_intel.c
+++ /dev/null
@@ -1,2693 +0,0 @@
-/*
- * This file is provided under a dual BSD/GPLv2 license. When using or
- * redistributing this file, you may do so under either license.
- *
- * GPL LICENSE SUMMARY
- *
- * Copyright(c) 2012 Intel Corporation. All rights reserved.
- * Copyright (C) 2015 EMC Corporation. All Rights Reserved.
- * Copyright (C) 2016 T-Platforms. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * BSD LICENSE
- *
- * Copyright(c) 2012 Intel Corporation. All rights reserved.
- * Copyright (C) 2015 EMC Corporation. All Rights Reserved.
- * Copyright (C) 2016 T-Platforms. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copy
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Intel Corporation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Intel PCIe NTB Linux driver
- *
- * Contact Information:
- * Jon Mason <jon.mason@intel.com>
- */
-
-#include <linux/debugfs.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/random.h>
-#include <linux/slab.h>
-#include <linux/ntb.h>
-
-#include "ntb_hw_gen1.h"
-#include "ntb_hw_gen3.h"
-#include "ntb_hw_intel.h"
-
-#define NTB_NAME "ntb_hw_intel"
-#define NTB_DESC "Intel(R) PCI-E Non-Transparent Bridge Driver"
-#define NTB_VER "2.0"
-
-MODULE_DESCRIPTION(NTB_DESC);
-MODULE_VERSION(NTB_VER);
-MODULE_LICENSE("Dual BSD/GPL");
-MODULE_AUTHOR("Intel Corporation");
-
-#define bar0_off(base, bar) ((base) + ((bar) << 2))
-#define bar2_off(base, bar) bar0_off(base, (bar) - 2)
-
-static const struct intel_ntb_reg xeon_reg;
-static const struct intel_ntb_alt_reg xeon_pri_reg;
-static const struct intel_ntb_alt_reg xeon_sec_reg;
-static const struct intel_ntb_alt_reg xeon_b2b_reg;
-static const struct intel_ntb_xlat_reg xeon_pri_xlat;
-static const struct intel_ntb_xlat_reg xeon_sec_xlat;
-static struct intel_b2b_addr xeon_b2b_usd_addr;
-static struct intel_b2b_addr xeon_b2b_dsd_addr;
-static const struct intel_ntb_reg skx_reg;
-static const struct intel_ntb_alt_reg skx_pri_reg;
-static const struct intel_ntb_alt_reg skx_b2b_reg;
-static const struct intel_ntb_xlat_reg skx_sec_xlat;
-static const struct ntb_dev_ops intel_ntb_ops;
-static const struct ntb_dev_ops intel_ntb3_ops;
-
-static const struct file_operations intel_ntb_debugfs_info;
-static struct dentry *debugfs_dir;
-
-static int b2b_mw_idx = -1;
-module_param(b2b_mw_idx, int, 0644);
-MODULE_PARM_DESC(b2b_mw_idx, "Use this mw idx to access the peer ntb. A "
- "value of zero or positive starts from first mw idx, and a "
- "negative value starts from last mw idx. Both sides MUST "
- "set the same value here!");
-
-static unsigned int b2b_mw_share;
-module_param(b2b_mw_share, uint, 0644);
-MODULE_PARM_DESC(b2b_mw_share, "If the b2b mw is large enough, configure the "
- "ntb so that the peer ntb only occupies the first half of "
- "the mw, so the second half can still be used as a mw. Both "
- "sides MUST set the same value here!");
-
-module_param_named(xeon_b2b_usd_bar2_addr64,
- xeon_b2b_usd_addr.bar2_addr64, ullong, 0644);
-MODULE_PARM_DESC(xeon_b2b_usd_bar2_addr64,
- "XEON B2B USD BAR 2 64-bit address");
-
-module_param_named(xeon_b2b_usd_bar4_addr64,
- xeon_b2b_usd_addr.bar4_addr64, ullong, 0644);
-MODULE_PARM_DESC(xeon_b2b_usd_bar4_addr64,
- "XEON B2B USD BAR 4 64-bit address");
-
-module_param_named(xeon_b2b_usd_bar4_addr32,
- xeon_b2b_usd_addr.bar4_addr32, ullong, 0644);
-MODULE_PARM_DESC(xeon_b2b_usd_bar4_addr32,
- "XEON B2B USD split-BAR 4 32-bit address");
-
-module_param_named(xeon_b2b_usd_bar5_addr32,
- xeon_b2b_usd_addr.bar5_addr32, ullong, 0644);
-MODULE_PARM_DESC(xeon_b2b_usd_bar5_addr32,
- "XEON B2B USD split-BAR 5 32-bit address");
-
-module_param_named(xeon_b2b_dsd_bar2_addr64,
- xeon_b2b_dsd_addr.bar2_addr64, ullong, 0644);
-MODULE_PARM_DESC(xeon_b2b_dsd_bar2_addr64,
- "XEON B2B DSD BAR 2 64-bit address");
-
-module_param_named(xeon_b2b_dsd_bar4_addr64,
- xeon_b2b_dsd_addr.bar4_addr64, ullong, 0644);
-MODULE_PARM_DESC(xeon_b2b_dsd_bar4_addr64,
- "XEON B2B DSD BAR 4 64-bit address");
-
-module_param_named(xeon_b2b_dsd_bar4_addr32,
- xeon_b2b_dsd_addr.bar4_addr32, ullong, 0644);
-MODULE_PARM_DESC(xeon_b2b_dsd_bar4_addr32,
- "XEON B2B DSD split-BAR 4 32-bit address");
-
-module_param_named(xeon_b2b_dsd_bar5_addr32,
- xeon_b2b_dsd_addr.bar5_addr32, ullong, 0644);
-MODULE_PARM_DESC(xeon_b2b_dsd_bar5_addr32,
- "XEON B2B DSD split-BAR 5 32-bit address");
-
-static inline enum ntb_topo xeon_ppd_topo(struct intel_ntb_dev *ndev, u8 ppd);
-static int xeon_init_isr(struct intel_ntb_dev *ndev);
-
-#ifndef ioread64
-#ifdef readq
-#define ioread64 readq
-#else
-#define ioread64 _ioread64
-static inline u64 _ioread64(void __iomem *mmio)
-{
- u64 low, high;
-
- low = ioread32(mmio);
- high = ioread32(mmio + sizeof(u32));
- return low | (high << 32);
-}
-#endif
-#endif
-
-#ifndef iowrite64
-#ifdef writeq
-#define iowrite64 writeq
-#else
-#define iowrite64 _iowrite64
-static inline void _iowrite64(u64 val, void __iomem *mmio)
-{
- iowrite32(val, mmio);
- iowrite32(val >> 32, mmio + sizeof(u32));
-}
-#endif
-#endif
-
-static inline int pdev_is_xeon(struct pci_dev *pdev)
-{
- switch (pdev->device) {
- case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
- case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
- case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
- case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
- case PCI_DEVICE_ID_INTEL_NTB_SS_BDX:
- case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
- case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
- case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
- case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
- case PCI_DEVICE_ID_INTEL_NTB_PS_BDX:
- case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
- case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
- case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
- case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
- case PCI_DEVICE_ID_INTEL_NTB_B2B_BDX:
- return 1;
- }
- return 0;
-}
-
-static inline int pdev_is_skx_xeon(struct pci_dev *pdev)
-{
- if (pdev->device == PCI_DEVICE_ID_INTEL_NTB_B2B_SKX)
- return 1;
-
- return 0;
-}
-
-static inline void ndev_reset_unsafe_flags(struct intel_ntb_dev *ndev)
-{
- ndev->unsafe_flags = 0;
- ndev->unsafe_flags_ignore = 0;
-
- /* Only B2B has a workaround to avoid SDOORBELL */
- if (ndev->hwerr_flags & NTB_HWERR_SDOORBELL_LOCKUP)
- if (!ntb_topo_is_b2b(ndev->ntb.topo))
- ndev->unsafe_flags |= NTB_UNSAFE_DB;
-
- /* No low level workaround to avoid SB01BASE */
- if (ndev->hwerr_flags & NTB_HWERR_SB01BASE_LOCKUP) {
- ndev->unsafe_flags |= NTB_UNSAFE_DB;
- ndev->unsafe_flags |= NTB_UNSAFE_SPAD;
- }
-}
-
-static inline int ndev_is_unsafe(struct intel_ntb_dev *ndev,
- unsigned long flag)
-{
- return !!(flag & ndev->unsafe_flags & ~ndev->unsafe_flags_ignore);
-}
-
-static inline int ndev_ignore_unsafe(struct intel_ntb_dev *ndev,
- unsigned long flag)
-{
- flag &= ndev->unsafe_flags;
- ndev->unsafe_flags_ignore |= flag;
-
- return !!flag;
-}
-
-static int ndev_mw_to_bar(struct intel_ntb_dev *ndev, int idx)
-{
- if (idx < 0 || idx >= ndev->mw_count)
- return -EINVAL;
- return ndev->reg->mw_bar[idx];
-}
-
-static inline int ndev_db_addr(struct intel_ntb_dev *ndev,
- phys_addr_t *db_addr, resource_size_t *db_size,
- phys_addr_t reg_addr, unsigned long reg)
-{
- if (ndev_is_unsafe(ndev, NTB_UNSAFE_DB))
- pr_warn_once("%s: NTB unsafe doorbell access", __func__);
-
- if (db_addr) {
- *db_addr = reg_addr + reg;
- dev_dbg(&ndev->ntb.pdev->dev, "Peer db addr %llx\n", *db_addr);
- }
-
- if (db_size) {
- *db_size = ndev->reg->db_size;
- dev_dbg(&ndev->ntb.pdev->dev, "Peer db size %llx\n", *db_size);
- }
-
- return 0;
-}
-
-static inline u64 ndev_db_read(struct intel_ntb_dev *ndev,
- void __iomem *mmio)
-{
- if (ndev_is_unsafe(ndev, NTB_UNSAFE_DB))
- pr_warn_once("%s: NTB unsafe doorbell access", __func__);
-
- return ndev->reg->db_ioread(mmio);
-}
-
-static inline int ndev_db_write(struct intel_ntb_dev *ndev, u64 db_bits,
- void __iomem *mmio)
-{
- if (ndev_is_unsafe(ndev, NTB_UNSAFE_DB))
- pr_warn_once("%s: NTB unsafe doorbell access", __func__);
-
- if (db_bits & ~ndev->db_valid_mask)
- return -EINVAL;
-
- ndev->reg->db_iowrite(db_bits, mmio);
-
- return 0;
-}
-
-static inline int ndev_db_set_mask(struct intel_ntb_dev *ndev, u64 db_bits,
- void __iomem *mmio)
-{
- unsigned long irqflags;
-
- if (ndev_is_unsafe(ndev, NTB_UNSAFE_DB))
- pr_warn_once("%s: NTB unsafe doorbell access", __func__);
-
- if (db_bits & ~ndev->db_valid_mask)
- return -EINVAL;
-
- spin_lock_irqsave(&ndev->db_mask_lock, irqflags);
- {
- ndev->db_mask |= db_bits;
- ndev->reg->db_iowrite(ndev->db_mask, mmio);
- }
- spin_unlock_irqrestore(&ndev->db_mask_lock, irqflags);
-
- return 0;
-}
-
-static inline int ndev_db_clear_mask(struct intel_ntb_dev *ndev, u64 db_bits,
- void __iomem *mmio)
-{
- unsigned long irqflags;
-
- if (ndev_is_unsafe(ndev, NTB_UNSAFE_DB))
- pr_warn_once("%s: NTB unsafe doorbell access", __func__);
-
- if (db_bits & ~ndev->db_valid_mask)
- return -EINVAL;
-
- spin_lock_irqsave(&ndev->db_mask_lock, irqflags);
- {
- ndev->db_mask &= ~db_bits;
- ndev->reg->db_iowrite(ndev->db_mask, mmio);
- }
- spin_unlock_irqrestore(&ndev->db_mask_lock, irqflags);
-
- return 0;
-}
-
-static inline int ndev_vec_mask(struct intel_ntb_dev *ndev, int db_vector)
-{
- u64 shift, mask;
-
- shift = ndev->db_vec_shift;
- mask = BIT_ULL(shift) - 1;
-
- return mask << (shift * db_vector);
-}
-
-static inline int ndev_spad_addr(struct intel_ntb_dev *ndev, int idx,
- phys_addr_t *spad_addr, phys_addr_t reg_addr,
- unsigned long reg)
-{
- if (ndev_is_unsafe(ndev, NTB_UNSAFE_SPAD))
- pr_warn_once("%s: NTB unsafe scratchpad access", __func__);
-
- if (idx < 0 || idx >= ndev->spad_count)
- return -EINVAL;
-
- if (spad_addr) {
- *spad_addr = reg_addr + reg + (idx << 2);
- dev_dbg(&ndev->ntb.pdev->dev, "Peer spad addr %llx\n",
- *spad_addr);
- }
-
- return 0;
-}
-
-static inline u32 ndev_spad_read(struct intel_ntb_dev *ndev, int idx,
- void __iomem *mmio)
-{
- if (ndev_is_unsafe(ndev, NTB_UNSAFE_SPAD))
- pr_warn_once("%s: NTB unsafe scratchpad access", __func__);
-
- if (idx < 0 || idx >= ndev->spad_count)
- return 0;
-
- return ioread32(mmio + (idx << 2));
-}
-
-static inline int ndev_spad_write(struct intel_ntb_dev *ndev, int idx, u32 val,
- void __iomem *mmio)
-{
- if (ndev_is_unsafe(ndev, NTB_UNSAFE_SPAD))
- pr_warn_once("%s: NTB unsafe scratchpad access", __func__);
-
- if (idx < 0 || idx >= ndev->spad_count)
- return -EINVAL;
-
- iowrite32(val, mmio + (idx << 2));
-
- return 0;
-}
-
-static irqreturn_t ndev_interrupt(struct intel_ntb_dev *ndev, int vec)
-{
- u64 vec_mask;
-
- vec_mask = ndev_vec_mask(ndev, vec);
-
- if ((ndev->hwerr_flags & NTB_HWERR_MSIX_VECTOR32_BAD) && (vec == 31))
- vec_mask |= ndev->db_link_mask;
-
- dev_dbg(&ndev->ntb.pdev->dev, "vec %d vec_mask %llx\n", vec, vec_mask);
-
- ndev->last_ts = jiffies;
-
- if (vec_mask & ndev->db_link_mask) {
- if (ndev->reg->poll_link(ndev))
- ntb_link_event(&ndev->ntb);
- }
-
- if (vec_mask & ndev->db_valid_mask)
- ntb_db_event(&ndev->ntb, vec);
-
- return IRQ_HANDLED;
-}
-
-static irqreturn_t ndev_vec_isr(int irq, void *dev)
-{
- struct intel_ntb_vec *nvec = dev;
-
- dev_dbg(&nvec->ndev->ntb.pdev->dev, "irq: %d nvec->num: %d\n",
- irq, nvec->num);
-
- return ndev_interrupt(nvec->ndev, nvec->num);
-}
-
-static irqreturn_t ndev_irq_isr(int irq, void *dev)
-{
- struct intel_ntb_dev *ndev = dev;
-
- return ndev_interrupt(ndev, irq - ndev->ntb.pdev->irq);
-}
-
-static int ndev_init_isr(struct intel_ntb_dev *ndev,
- int msix_min, int msix_max,
- int msix_shift, int total_shift)
-{
- struct pci_dev *pdev;
- int rc, i, msix_count, node;
-
- pdev = ndev->ntb.pdev;
-
- node = dev_to_node(&pdev->dev);
-
- /* Mask all doorbell interrupts */
- ndev->db_mask = ndev->db_valid_mask;
- ndev->reg->db_iowrite(ndev->db_mask,
- ndev->self_mmio +
- ndev->self_reg->db_mask);
-
- /* Try to set up msix irq */
-
- ndev->vec = kzalloc_node(msix_max * sizeof(*ndev->vec),
- GFP_KERNEL, node);
- if (!ndev->vec)
- goto err_msix_vec_alloc;
-
- ndev->msix = kzalloc_node(msix_max * sizeof(*ndev->msix),
- GFP_KERNEL, node);
- if (!ndev->msix)
- goto err_msix_alloc;
-
- for (i = 0; i < msix_max; ++i)
- ndev->msix[i].entry = i;
-
- msix_count = pci_enable_msix_range(pdev, ndev->msix,
- msix_min, msix_max);
- if (msix_count < 0)
- goto err_msix_enable;
-
- for (i = 0; i < msix_count; ++i) {
- ndev->vec[i].ndev = ndev;
- ndev->vec[i].num = i;
- rc = request_irq(ndev->msix[i].vector, ndev_vec_isr, 0,
- "ndev_vec_isr", &ndev->vec[i]);
- if (rc)
- goto err_msix_request;
- }
-
- dev_dbg(&pdev->dev, "Using %d msix interrupts\n", msix_count);
- ndev->db_vec_count = msix_count;
- ndev->db_vec_shift = msix_shift;
- return 0;
-
-err_msix_request:
- while (i-- > 0)
- free_irq(ndev->msix[i].vector, &ndev->vec[i]);
- pci_disable_msix(pdev);
-err_msix_enable:
- kfree(ndev->msix);
-err_msix_alloc:
- kfree(ndev->vec);
-err_msix_vec_alloc:
- ndev->msix = NULL;
- ndev->vec = NULL;
-
- /* Try to set up msi irq */
-
- rc = pci_enable_msi(pdev);
- if (rc)
- goto err_msi_enable;
-
- rc = request_irq(pdev->irq, ndev_irq_isr, 0,
- "ndev_irq_isr", ndev);
- if (rc)
- goto err_msi_request;
-
- dev_dbg(&pdev->dev, "Using msi interrupts\n");
- ndev->db_vec_count = 1;
- ndev->db_vec_shift = total_shift;
- return 0;
-
-err_msi_request:
- pci_disable_msi(pdev);
-err_msi_enable:
-
- /* Try to set up intx irq */
-
- pci_intx(pdev, 1);
-
- rc = request_irq(pdev->irq, ndev_irq_isr, IRQF_SHARED,
- "ndev_irq_isr", ndev);
- if (rc)
- goto err_intx_request;
-
- dev_dbg(&pdev->dev, "Using intx interrupts\n");
- ndev->db_vec_count = 1;
- ndev->db_vec_shift = total_shift;
- return 0;
-
-err_intx_request:
- return rc;
-}
-
-static void ndev_deinit_isr(struct intel_ntb_dev *ndev)
-{
- struct pci_dev *pdev;
- int i;
-
- pdev = ndev->ntb.pdev;
-
- /* Mask all doorbell interrupts */
- ndev->db_mask = ndev->db_valid_mask;
- ndev->reg->db_iowrite(ndev->db_mask,
- ndev->self_mmio +
- ndev->self_reg->db_mask);
-
- if (ndev->msix) {
- i = ndev->db_vec_count;
- while (i--)
- free_irq(ndev->msix[i].vector, &ndev->vec[i]);
- pci_disable_msix(pdev);
- kfree(ndev->msix);
- kfree(ndev->vec);
- } else {
- free_irq(pdev->irq, ndev);
- if (pci_dev_msi_enabled(pdev))
- pci_disable_msi(pdev);
- }
-}
-
-static ssize_t ndev_ntb3_debugfs_read(struct file *filp, char __user *ubuf,
- size_t count, loff_t *offp)
-{
- struct intel_ntb_dev *ndev;
- void __iomem *mmio;
- char *buf;
- size_t buf_size;
- ssize_t ret, off;
- union { u64 v64; u32 v32; u16 v16; } u;
-
- ndev = filp->private_data;
- mmio = ndev->self_mmio;
-
- buf_size = min(count, 0x800ul);
-
- buf = kmalloc(buf_size, GFP_KERNEL);
- if (!buf)
- return -ENOMEM;
-
- off = 0;
-
- off += scnprintf(buf + off, buf_size - off,
- "NTB Device Information:\n");
-
- off += scnprintf(buf + off, buf_size - off,
- "Connection Topology -\t%s\n",
- ntb_topo_string(ndev->ntb.topo));
-
- off += scnprintf(buf + off, buf_size - off,
- "NTB CTL -\t\t%#06x\n", ndev->ntb_ctl);
- off += scnprintf(buf + off, buf_size - off,
- "LNK STA -\t\t%#06x\n", ndev->lnk_sta);
-
- if (!ndev->reg->link_is_up(ndev))
- off += scnprintf(buf + off, buf_size - off,
- "Link Status -\t\tDown\n");
- else {
- off += scnprintf(buf + off, buf_size - off,
- "Link Status -\t\tUp\n");
- off += scnprintf(buf + off, buf_size - off,
- "Link Speed -\t\tPCI-E Gen %u\n",
- NTB_LNK_STA_SPEED(ndev->lnk_sta));
- off += scnprintf(buf + off, buf_size - off,
- "Link Width -\t\tx%u\n",
- NTB_LNK_STA_WIDTH(ndev->lnk_sta));
- }
-
- off += scnprintf(buf + off, buf_size - off,
- "Memory Window Count -\t%u\n", ndev->mw_count);
- off += scnprintf(buf + off, buf_size - off,
- "Scratchpad Count -\t%u\n", ndev->spad_count);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Count -\t%u\n", ndev->db_count);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Vector Count -\t%u\n", ndev->db_vec_count);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Vector Shift -\t%u\n", ndev->db_vec_shift);
-
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Valid Mask -\t%#llx\n", ndev->db_valid_mask);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Link Mask -\t%#llx\n", ndev->db_link_mask);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Mask Cached -\t%#llx\n", ndev->db_mask);
-
- u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Mask -\t\t%#llx\n", u.v64);
-
- u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Bell -\t\t%#llx\n", u.v64);
-
- off += scnprintf(buf + off, buf_size - off,
- "\nNTB Incoming XLAT:\n");
-
- u.v64 = ioread64(mmio + SKX_IMBAR1XBASE_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "IMBAR1XBASE -\t\t%#018llx\n", u.v64);
-
- u.v64 = ioread64(mmio + SKX_IMBAR2XBASE_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "IMBAR2XBASE -\t\t%#018llx\n", u.v64);
-
- u.v64 = ioread64(mmio + SKX_IMBAR1XLMT_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "IMBAR1XLMT -\t\t\t%#018llx\n", u.v64);
-
- u.v64 = ioread64(mmio + SKX_IMBAR2XLMT_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "IMBAR2XLMT -\t\t\t%#018llx\n", u.v64);
-
- if (ntb_topo_is_b2b(ndev->ntb.topo)) {
- off += scnprintf(buf + off, buf_size - off,
- "\nNTB Outgoing B2B XLAT:\n");
-
- u.v64 = ioread64(mmio + SKX_EMBAR1XBASE_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "EMBAR1XBASE -\t\t%#018llx\n", u.v64);
-
- u.v64 = ioread64(mmio + SKX_EMBAR2XBASE_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "EMBAR2XBASE -\t\t%#018llx\n", u.v64);
-
- u.v64 = ioread64(mmio + SKX_EMBAR1XLMT_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "EMBAR1XLMT -\t\t%#018llx\n", u.v64);
-
- u.v64 = ioread64(mmio + SKX_EMBAR2XLMT_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "EMBAR2XLMT -\t\t%#018llx\n", u.v64);
-
- off += scnprintf(buf + off, buf_size - off,
- "\nNTB Secondary BAR:\n");
-
- u.v64 = ioread64(mmio + SKX_EMBAR0_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "EMBAR0 -\t\t%#018llx\n", u.v64);
-
- u.v64 = ioread64(mmio + SKX_EMBAR1_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "EMBAR1 -\t\t%#018llx\n", u.v64);
-
- u.v64 = ioread64(mmio + SKX_EMBAR2_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "EMBAR2 -\t\t%#018llx\n", u.v64);
- }
-
- off += scnprintf(buf + off, buf_size - off,
- "\nNTB Statistics:\n");
-
- u.v16 = ioread16(mmio + SKX_USMEMMISS_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "Upstream Memory Miss -\t%u\n", u.v16);
-
- off += scnprintf(buf + off, buf_size - off,
- "\nNTB Hardware Errors:\n");
-
- if (!pci_read_config_word(ndev->ntb.pdev,
- SKX_DEVSTS_OFFSET, &u.v16))
- off += scnprintf(buf + off, buf_size - off,
- "DEVSTS -\t\t%#06x\n", u.v16);
-
- if (!pci_read_config_word(ndev->ntb.pdev,
- SKX_LINK_STATUS_OFFSET, &u.v16))
- off += scnprintf(buf + off, buf_size - off,
- "LNKSTS -\t\t%#06x\n", u.v16);
-
- if (!pci_read_config_dword(ndev->ntb.pdev,
- SKX_UNCERRSTS_OFFSET, &u.v32))
- off += scnprintf(buf + off, buf_size - off,
- "UNCERRSTS -\t\t%#06x\n", u.v32);
-
- if (!pci_read_config_dword(ndev->ntb.pdev,
- SKX_CORERRSTS_OFFSET, &u.v32))
- off += scnprintf(buf + off, buf_size - off,
- "CORERRSTS -\t\t%#06x\n", u.v32);
-
- ret = simple_read_from_buffer(ubuf, count, offp, buf, off);
- kfree(buf);
- return ret;
-}
-
-static ssize_t ndev_ntb_debugfs_read(struct file *filp, char __user *ubuf,
- size_t count, loff_t *offp)
-{
- struct intel_ntb_dev *ndev;
- struct pci_dev *pdev;
- void __iomem *mmio;
- char *buf;
- size_t buf_size;
- ssize_t ret, off;
- union { u64 v64; u32 v32; u16 v16; u8 v8; } u;
-
- ndev = filp->private_data;
- pdev = ndev->ntb.pdev;
- mmio = ndev->self_mmio;
-
- buf_size = min(count, 0x800ul);
-
- buf = kmalloc(buf_size, GFP_KERNEL);
- if (!buf)
- return -ENOMEM;
-
- off = 0;
-
- off += scnprintf(buf + off, buf_size - off,
- "NTB Device Information:\n");
-
- off += scnprintf(buf + off, buf_size - off,
- "Connection Topology -\t%s\n",
- ntb_topo_string(ndev->ntb.topo));
-
- if (ndev->b2b_idx != UINT_MAX) {
- off += scnprintf(buf + off, buf_size - off,
- "B2B MW Idx -\t\t%u\n", ndev->b2b_idx);
- off += scnprintf(buf + off, buf_size - off,
- "B2B Offset -\t\t%#lx\n", ndev->b2b_off);
- }
-
- off += scnprintf(buf + off, buf_size - off,
- "BAR4 Split -\t\t%s\n",
- ndev->bar4_split ? "yes" : "no");
-
- off += scnprintf(buf + off, buf_size - off,
- "NTB CTL -\t\t%#06x\n", ndev->ntb_ctl);
- off += scnprintf(buf + off, buf_size - off,
- "LNK STA -\t\t%#06x\n", ndev->lnk_sta);
-
- if (!ndev->reg->link_is_up(ndev)) {
- off += scnprintf(buf + off, buf_size - off,
- "Link Status -\t\tDown\n");
- } else {
- off += scnprintf(buf + off, buf_size - off,
- "Link Status -\t\tUp\n");
- off += scnprintf(buf + off, buf_size - off,
- "Link Speed -\t\tPCI-E Gen %u\n",
- NTB_LNK_STA_SPEED(ndev->lnk_sta));
- off += scnprintf(buf + off, buf_size - off,
- "Link Width -\t\tx%u\n",
- NTB_LNK_STA_WIDTH(ndev->lnk_sta));
- }
-
- off += scnprintf(buf + off, buf_size - off,
- "Memory Window Count -\t%u\n", ndev->mw_count);
- off += scnprintf(buf + off, buf_size - off,
- "Scratchpad Count -\t%u\n", ndev->spad_count);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Count -\t%u\n", ndev->db_count);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Vector Count -\t%u\n", ndev->db_vec_count);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Vector Shift -\t%u\n", ndev->db_vec_shift);
-
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Valid Mask -\t%#llx\n", ndev->db_valid_mask);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Link Mask -\t%#llx\n", ndev->db_link_mask);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Mask Cached -\t%#llx\n", ndev->db_mask);
-
- u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Mask -\t\t%#llx\n", u.v64);
-
- u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);
- off += scnprintf(buf + off, buf_size - off,
- "Doorbell Bell -\t\t%#llx\n", u.v64);
-
- off += scnprintf(buf + off, buf_size - off,
- "\nNTB Window Size:\n");
-
- pci_read_config_byte(pdev, XEON_PBAR23SZ_OFFSET, &u.v8);
- off += scnprintf(buf + off, buf_size - off,
- "PBAR23SZ %hhu\n", u.v8);
- if (!ndev->bar4_split) {
- pci_read_config_byte(pdev, XEON_PBAR45SZ_OFFSET, &u.v8);
- off += scnprintf(buf + off, buf_size - off,
- "PBAR45SZ %hhu\n", u.v8);
- } else {
- pci_read_config_byte(pdev, XEON_PBAR4SZ_OFFSET, &u.v8);
- off += scnprintf(buf + off, buf_size - off,
- "PBAR4SZ %hhu\n", u.v8);
- pci_read_config_byte(pdev, XEON_PBAR5SZ_OFFSET, &u.v8);
- off += scnprintf(buf + off, buf_size - off,
- "PBAR5SZ %hhu\n", u.v8);
- }
-
- pci_read_config_byte(pdev, XEON_SBAR23SZ_OFFSET, &u.v8);
- off += scnprintf(buf + off, buf_size - off,
- "SBAR23SZ %hhu\n", u.v8);
- if (!ndev->bar4_split) {
- pci_read_config_byte(pdev, XEON_SBAR45SZ_OFFSET, &u.v8);
- off += scnprintf(buf + off, buf_size - off,
- "SBAR45SZ %hhu\n", u.v8);
- } else {
- pci_read_config_byte(pdev, XEON_SBAR4SZ_OFFSET, &u.v8);
- off += scnprintf(buf + off, buf_size - off,
- "SBAR4SZ %hhu\n", u.v8);
- pci_read_config_byte(pdev, XEON_SBAR5SZ_OFFSET, &u.v8);
- off += scnprintf(buf + off, buf_size - off,
- "SBAR5SZ %hhu\n", u.v8);
- }
-
- off += scnprintf(buf + off, buf_size - off,
- "\nNTB Incoming XLAT:\n");
-
- u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2));
- off += scnprintf(buf + off, buf_size - off,
- "XLAT23 -\t\t%#018llx\n", u.v64);
-
- if (ndev->bar4_split) {
- u.v32 = ioread32(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));
- off += scnprintf(buf + off, buf_size - off,
- "XLAT4 -\t\t\t%#06x\n", u.v32);
-
- u.v32 = ioread32(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 5));
- off += scnprintf(buf + off, buf_size - off,
- "XLAT5 -\t\t\t%#06x\n", u.v32);
- } else {
- u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));
- off += scnprintf(buf + off, buf_size - off,
- "XLAT45 -\t\t%#018llx\n", u.v64);
- }
-
- u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2));
- off += scnprintf(buf + off, buf_size - off,
- "LMT23 -\t\t\t%#018llx\n", u.v64);
-
- if (ndev->bar4_split) {
- u.v32 = ioread32(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));
- off += scnprintf(buf + off, buf_size - off,
- "LMT4 -\t\t\t%#06x\n", u.v32);
- u.v32 = ioread32(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 5));
- off += scnprintf(buf + off, buf_size - off,
- "LMT5 -\t\t\t%#06x\n", u.v32);
- } else {
- u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));
- off += scnprintf(buf + off, buf_size - off,
- "LMT45 -\t\t\t%#018llx\n", u.v64);
- }
-
- if (pdev_is_xeon(pdev)) {
- if (ntb_topo_is_b2b(ndev->ntb.topo)) {
- off += scnprintf(buf + off, buf_size - off,
- "\nNTB Outgoing B2B XLAT:\n");
-
- u.v64 = ioread64(mmio + XEON_PBAR23XLAT_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "B2B XLAT23 -\t\t%#018llx\n", u.v64);
-
- if (ndev->bar4_split) {
- u.v32 = ioread32(mmio + XEON_PBAR4XLAT_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "B2B XLAT4 -\t\t%#06x\n",
- u.v32);
- u.v32 = ioread32(mmio + XEON_PBAR5XLAT_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "B2B XLAT5 -\t\t%#06x\n",
- u.v32);
- } else {
- u.v64 = ioread64(mmio + XEON_PBAR45XLAT_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "B2B XLAT45 -\t\t%#018llx\n",
- u.v64);
- }
-
- u.v64 = ioread64(mmio + XEON_PBAR23LMT_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "B2B LMT23 -\t\t%#018llx\n", u.v64);
-
- if (ndev->bar4_split) {
- u.v32 = ioread32(mmio + XEON_PBAR4LMT_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "B2B LMT4 -\t\t%#06x\n",
- u.v32);
- u.v32 = ioread32(mmio + XEON_PBAR5LMT_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "B2B LMT5 -\t\t%#06x\n",
- u.v32);
- } else {
- u.v64 = ioread64(mmio + XEON_PBAR45LMT_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "B2B LMT45 -\t\t%#018llx\n",
- u.v64);
- }
-
- off += scnprintf(buf + off, buf_size - off,
- "\nNTB Secondary BAR:\n");
-
- u.v64 = ioread64(mmio + XEON_SBAR0BASE_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "SBAR01 -\t\t%#018llx\n", u.v64);
-
- u.v64 = ioread64(mmio + XEON_SBAR23BASE_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "SBAR23 -\t\t%#018llx\n", u.v64);
-
- if (ndev->bar4_split) {
- u.v32 = ioread32(mmio + XEON_SBAR4BASE_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "SBAR4 -\t\t\t%#06x\n", u.v32);
- u.v32 = ioread32(mmio + XEON_SBAR5BASE_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "SBAR5 -\t\t\t%#06x\n", u.v32);
- } else {
- u.v64 = ioread64(mmio + XEON_SBAR45BASE_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "SBAR45 -\t\t%#018llx\n",
- u.v64);
- }
- }
-
- off += scnprintf(buf + off, buf_size - off,
- "\nXEON NTB Statistics:\n");
-
- u.v16 = ioread16(mmio + XEON_USMEMMISS_OFFSET);
- off += scnprintf(buf + off, buf_size - off,
- "Upstream Memory Miss -\t%u\n", u.v16);
-
- off += scnprintf(buf + off, buf_size - off,
- "\nXEON NTB Hardware Errors:\n");
-
- if (!pci_read_config_word(pdev,
- XEON_DEVSTS_OFFSET, &u.v16))
- off += scnprintf(buf + off, buf_size - off,
- "DEVSTS -\t\t%#06x\n", u.v16);
-
- if (!pci_read_config_word(pdev,
- XEON_LINK_STATUS_OFFSET, &u.v16))
- off += scnprintf(buf + off, buf_size - off,
- "LNKSTS -\t\t%#06x\n", u.v16);
-
- if (!pci_read_config_dword(pdev,
- XEON_UNCERRSTS_OFFSET, &u.v32))
- off += scnprintf(buf + off, buf_size - off,
- "UNCERRSTS -\t\t%#06x\n", u.v32);
-
- if (!pci_read_config_dword(pdev,
- XEON_CORERRSTS_OFFSET, &u.v32))
- off += scnprintf(buf + off, buf_size - off,
- "CORERRSTS -\t\t%#06x\n", u.v32);
- }
-
- ret = simple_read_from_buffer(ubuf, count, offp, buf, off);
- kfree(buf);
- return ret;
-}
-
-static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
- size_t count, loff_t *offp)
-{
- struct intel_ntb_dev *ndev = filp->private_data;
-
- if (pdev_is_xeon(ndev->ntb.pdev))
- return ndev_ntb_debugfs_read(filp, ubuf, count, offp);
- else if (pdev_is_skx_xeon(ndev->ntb.pdev))
- return ndev_ntb3_debugfs_read(filp, ubuf, count, offp);
-
- return -ENXIO;
-}
-
-static void ndev_init_debugfs(struct intel_ntb_dev *ndev)
-{
- if (!debugfs_dir) {
- ndev->debugfs_dir = NULL;
- ndev->debugfs_info = NULL;
- } else {
- ndev->debugfs_dir =
- debugfs_create_dir(pci_name(ndev->ntb.pdev),
- debugfs_dir);
- if (!ndev->debugfs_dir)
- ndev->debugfs_info = NULL;
- else
- ndev->debugfs_info =
- debugfs_create_file("info", S_IRUSR,
- ndev->debugfs_dir, ndev,
- &intel_ntb_debugfs_info);
- }
-}
-
-static void ndev_deinit_debugfs(struct intel_ntb_dev *ndev)
-{
- debugfs_remove_recursive(ndev->debugfs_dir);
-}
-
-static int intel_ntb_mw_count(struct ntb_dev *ntb, int pidx)
-{
- if (pidx != NTB_DEF_PEER_IDX)
- return -EINVAL;
-
- return ntb_ndev(ntb)->mw_count;
-}
-
-static int intel_ntb_mw_get_align(struct ntb_dev *ntb, int pidx, int idx,
- resource_size_t *addr_align,
- resource_size_t *size_align,
- resource_size_t *size_max)
-{
- struct intel_ntb_dev *ndev = ntb_ndev(ntb);
- resource_size_t bar_size, mw_size;
- int bar;
-
- if (pidx != NTB_DEF_PEER_IDX)
- return -EINVAL;
-
- if (idx >= ndev->b2b_idx && !ndev->b2b_off)
- idx += 1;
-
- bar = ndev_mw_to_bar(ndev, idx);
- if (bar < 0)
- return bar;
-
- bar_size = pci_resource_len(ndev->ntb.pdev, bar);
-
- if (idx == ndev->b2b_idx)
- mw_size = bar_size - ndev->b2b_off;
- else
- mw_size = bar_size;
-
- if (addr_align)
- *addr_align = pci_resource_len(ndev->ntb.pdev, bar);
-
- if (size_align)
- *size_align = 1;
-
- if (size_max)
- *size_max =