linux/drivers/ntb/hw/intel/ntb_hw_intel.c
<<
>>
Prefs
   1/*
   2 * This file is provided under a dual BSD/GPLv2 license.  When using or
   3 *   redistributing this file, you may do so under either license.
   4 *
   5 *   GPL LICENSE SUMMARY
   6 *
   7 *   Copyright(c) 2012 Intel Corporation. All rights reserved.
   8 *   Copyright (C) 2015 EMC Corporation. All Rights Reserved.
   9 *   Copyright (C) 2016 T-Platforms. All Rights Reserved.
  10 *
  11 *   This program is free software; you can redistribute it and/or modify
  12 *   it under the terms of version 2 of the GNU General Public License as
  13 *   published by the Free Software Foundation.
  14 *
  15 *   BSD LICENSE
  16 *
  17 *   Copyright(c) 2012 Intel Corporation. All rights reserved.
  18 *   Copyright (C) 2015 EMC Corporation. All Rights Reserved.
  19 *   Copyright (C) 2016 T-Platforms. All Rights Reserved.
  20 *
  21 *   Redistribution and use in source and binary forms, with or without
  22 *   modification, are permitted provided that the following conditions
  23 *   are met:
  24 *
  25 *     * Redistributions of source code must retain the above copyright
  26 *       notice, this list of conditions and the following disclaimer.
  27 *     * Redistributions in binary form must reproduce the above copy
  28 *       notice, this list of conditions and the following disclaimer in
  29 *       the documentation and/or other materials provided with the
  30 *       distribution.
  31 *     * Neither the name of Intel Corporation nor the names of its
  32 *       contributors may be used to endorse or promote products derived
  33 *       from this software without specific prior written permission.
  34 *
  35 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  36 *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  37 *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  38 *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  39 *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  42 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  43 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  44 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  45 *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  46 *
  47 * Intel PCIe NTB Linux driver
  48 *
  49 * Contact Information:
  50 * Jon Mason <jon.mason@intel.com>
  51 */
  52
  53#include <linux/debugfs.h>
  54#include <linux/delay.h>
  55#include <linux/init.h>
  56#include <linux/interrupt.h>
  57#include <linux/module.h>
  58#include <linux/pci.h>
  59#include <linux/random.h>
  60#include <linux/slab.h>
  61#include <linux/ntb.h>
  62
  63#include "ntb_hw_intel.h"
  64
  65#define NTB_NAME        "ntb_hw_intel"
  66#define NTB_DESC        "Intel(R) PCI-E Non-Transparent Bridge Driver"
  67#define NTB_VER         "2.0"
  68
  69MODULE_DESCRIPTION(NTB_DESC);
  70MODULE_VERSION(NTB_VER);
  71MODULE_LICENSE("Dual BSD/GPL");
  72MODULE_AUTHOR("Intel Corporation");
  73
  74#define bar0_off(base, bar) ((base) + ((bar) << 2))
  75#define bar2_off(base, bar) bar0_off(base, (bar) - 2)
  76
  77static const struct intel_ntb_reg xeon_reg;
  78static const struct intel_ntb_alt_reg xeon_pri_reg;
  79static const struct intel_ntb_alt_reg xeon_sec_reg;
  80static const struct intel_ntb_alt_reg xeon_b2b_reg;
  81static const struct intel_ntb_xlat_reg xeon_pri_xlat;
  82static const struct intel_ntb_xlat_reg xeon_sec_xlat;
  83static struct intel_b2b_addr xeon_b2b_usd_addr;
  84static struct intel_b2b_addr xeon_b2b_dsd_addr;
  85static const struct intel_ntb_reg skx_reg;
  86static const struct intel_ntb_alt_reg skx_pri_reg;
  87static const struct intel_ntb_alt_reg skx_b2b_reg;
  88static const struct intel_ntb_xlat_reg skx_sec_xlat;
  89static const struct ntb_dev_ops intel_ntb_ops;
  90static const struct ntb_dev_ops intel_ntb3_ops;
  91
  92static const struct file_operations intel_ntb_debugfs_info;
  93static struct dentry *debugfs_dir;
  94
  95static int b2b_mw_idx = -1;
  96module_param(b2b_mw_idx, int, 0644);
  97MODULE_PARM_DESC(b2b_mw_idx, "Use this mw idx to access the peer ntb.  A "
  98                 "value of zero or positive starts from first mw idx, and a "
  99                 "negative value starts from last mw idx.  Both sides MUST "
 100                 "set the same value here!");
 101
 102static unsigned int b2b_mw_share;
 103module_param(b2b_mw_share, uint, 0644);
 104MODULE_PARM_DESC(b2b_mw_share, "If the b2b mw is large enough, configure the "
 105                 "ntb so that the peer ntb only occupies the first half of "
 106                 "the mw, so the second half can still be used as a mw.  Both "
 107                 "sides MUST set the same value here!");
 108
 109module_param_named(xeon_b2b_usd_bar2_addr64,
 110                   xeon_b2b_usd_addr.bar2_addr64, ullong, 0644);
 111MODULE_PARM_DESC(xeon_b2b_usd_bar2_addr64,
 112                 "XEON B2B USD BAR 2 64-bit address");
 113
 114module_param_named(xeon_b2b_usd_bar4_addr64,
 115                   xeon_b2b_usd_addr.bar4_addr64, ullong, 0644);
 116MODULE_PARM_DESC(xeon_b2b_usd_bar4_addr64,
 117                 "XEON B2B USD BAR 4 64-bit address");
 118
 119module_param_named(xeon_b2b_usd_bar4_addr32,
 120                   xeon_b2b_usd_addr.bar4_addr32, ullong, 0644);
 121MODULE_PARM_DESC(xeon_b2b_usd_bar4_addr32,
 122                 "XEON B2B USD split-BAR 4 32-bit address");
 123
 124module_param_named(xeon_b2b_usd_bar5_addr32,
 125                   xeon_b2b_usd_addr.bar5_addr32, ullong, 0644);
 126MODULE_PARM_DESC(xeon_b2b_usd_bar5_addr32,
 127                 "XEON B2B USD split-BAR 5 32-bit address");
 128
 129module_param_named(xeon_b2b_dsd_bar2_addr64,
 130                   xeon_b2b_dsd_addr.bar2_addr64, ullong, 0644);
 131MODULE_PARM_DESC(xeon_b2b_dsd_bar2_addr64,
 132                 "XEON B2B DSD BAR 2 64-bit address");
 133
 134module_param_named(xeon_b2b_dsd_bar4_addr64,
 135                   xeon_b2b_dsd_addr.bar4_addr64, ullong, 0644);
 136MODULE_PARM_DESC(xeon_b2b_dsd_bar4_addr64,
 137                 "XEON B2B DSD BAR 4 64-bit address");
 138
 139module_param_named(xeon_b2b_dsd_bar4_addr32,
 140                   xeon_b2b_dsd_addr.bar4_addr32, ullong, 0644);
 141MODULE_PARM_DESC(xeon_b2b_dsd_bar4_addr32,
 142                 "XEON B2B DSD split-BAR 4 32-bit address");
 143
 144module_param_named(xeon_b2b_dsd_bar5_addr32,
 145                   xeon_b2b_dsd_addr.bar5_addr32, ullong, 0644);
 146MODULE_PARM_DESC(xeon_b2b_dsd_bar5_addr32,
 147                 "XEON B2B DSD split-BAR 5 32-bit address");
 148
 149static inline enum ntb_topo xeon_ppd_topo(struct intel_ntb_dev *ndev, u8 ppd);
 150static int xeon_init_isr(struct intel_ntb_dev *ndev);
 151
 152#ifndef ioread64
 153#ifdef readq
 154#define ioread64 readq
 155#else
 156#define ioread64 _ioread64
 157static inline u64 _ioread64(void __iomem *mmio)
 158{
 159        u64 low, high;
 160
 161        low = ioread32(mmio);
 162        high = ioread32(mmio + sizeof(u32));
 163        return low | (high << 32);
 164}
 165#endif
 166#endif
 167
 168#ifndef iowrite64
 169#ifdef writeq
 170#define iowrite64 writeq
 171#else
 172#define iowrite64 _iowrite64
 173static inline void _iowrite64(u64 val, void __iomem *mmio)
 174{
 175        iowrite32(val, mmio);
 176        iowrite32(val >> 32, mmio + sizeof(u32));
 177}
 178#endif
 179#endif
 180
 181static inline int pdev_is_xeon(struct pci_dev *pdev)
 182{
 183        switch (pdev->device) {
 184        case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
 185        case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
 186        case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
 187        case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
 188        case PCI_DEVICE_ID_INTEL_NTB_SS_BDX:
 189        case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
 190        case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
 191        case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
 192        case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
 193        case PCI_DEVICE_ID_INTEL_NTB_PS_BDX:
 194        case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
 195        case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
 196        case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
 197        case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
 198        case PCI_DEVICE_ID_INTEL_NTB_B2B_BDX:
 199                return 1;
 200        }
 201        return 0;
 202}
 203
 204static inline int pdev_is_skx_xeon(struct pci_dev *pdev)
 205{
 206        if (pdev->device == PCI_DEVICE_ID_INTEL_NTB_B2B_SKX)
 207                return 1;
 208
 209        return 0;
 210}
 211
 212static inline void ndev_reset_unsafe_flags(struct intel_ntb_dev *ndev)
 213{
 214        ndev->unsafe_flags = 0;
 215        ndev->unsafe_flags_ignore = 0;
 216
 217        /* Only B2B has a workaround to avoid SDOORBELL */
 218        if (ndev->hwerr_flags & NTB_HWERR_SDOORBELL_LOCKUP)
 219                if (!ntb_topo_is_b2b(ndev->ntb.topo))
 220                        ndev->unsafe_flags |= NTB_UNSAFE_DB;
 221
 222        /* No low level workaround to avoid SB01BASE */
 223        if (ndev->hwerr_flags & NTB_HWERR_SB01BASE_LOCKUP) {
 224                ndev->unsafe_flags |= NTB_UNSAFE_DB;
 225                ndev->unsafe_flags |= NTB_UNSAFE_SPAD;
 226        }
 227}
 228
 229static inline int ndev_is_unsafe(struct intel_ntb_dev *ndev,
 230                                 unsigned long flag)
 231{
 232        return !!(flag & ndev->unsafe_flags & ~ndev->unsafe_flags_ignore);
 233}
 234
 235static inline int ndev_ignore_unsafe(struct intel_ntb_dev *ndev,
 236                                     unsigned long flag)
 237{
 238        flag &= ndev->unsafe_flags;
 239        ndev->unsafe_flags_ignore |= flag;
 240
 241        return !!flag;
 242}
 243
 244static int ndev_mw_to_bar(struct intel_ntb_dev *ndev, int idx)
 245{
 246        if (idx < 0 || idx >= ndev->mw_count)
 247                return -EINVAL;
 248        return ndev->reg->mw_bar[idx];
 249}
 250
 251static inline int ndev_db_addr(struct intel_ntb_dev *ndev,
 252                               phys_addr_t *db_addr, resource_size_t *db_size,
 253                               phys_addr_t reg_addr, unsigned long reg)
 254{
 255        if (ndev_is_unsafe(ndev, NTB_UNSAFE_DB))
 256                pr_warn_once("%s: NTB unsafe doorbell access", __func__);
 257
 258        if (db_addr) {
 259                *db_addr = reg_addr + reg;
 260                dev_dbg(&ndev->ntb.pdev->dev, "Peer db addr %llx\n", *db_addr);
 261        }
 262
 263        if (db_size) {
 264                *db_size = ndev->reg->db_size;
 265                dev_dbg(&ndev->ntb.pdev->dev, "Peer db size %llx\n", *db_size);
 266        }
 267
 268        return 0;
 269}
 270
 271static inline u64 ndev_db_read(struct intel_ntb_dev *ndev,
 272                               void __iomem *mmio)
 273{
 274        if (ndev_is_unsafe(ndev, NTB_UNSAFE_DB))
 275                pr_warn_once("%s: NTB unsafe doorbell access", __func__);
 276
 277        return ndev->reg->db_ioread(mmio);
 278}
 279
 280static inline int ndev_db_write(struct intel_ntb_dev *ndev, u64 db_bits,
 281                                void __iomem *mmio)
 282{
 283        if (ndev_is_unsafe(ndev, NTB_UNSAFE_DB))
 284                pr_warn_once("%s: NTB unsafe doorbell access", __func__);
 285
 286        if (db_bits & ~ndev->db_valid_mask)
 287                return -EINVAL;
 288
 289        ndev->reg->db_iowrite(db_bits, mmio);
 290
 291        return 0;
 292}
 293
 294static inline int ndev_db_set_mask(struct intel_ntb_dev *ndev, u64 db_bits,
 295                                   void __iomem *mmio)
 296{
 297        unsigned long irqflags;
 298
 299        if (ndev_is_unsafe(ndev, NTB_UNSAFE_DB))
 300                pr_warn_once("%s: NTB unsafe doorbell access", __func__);
 301
 302        if (db_bits & ~ndev->db_valid_mask)
 303                return -EINVAL;
 304
 305        spin_lock_irqsave(&ndev->db_mask_lock, irqflags);
 306        {
 307                ndev->db_mask |= db_bits;
 308                ndev->reg->db_iowrite(ndev->db_mask, mmio);
 309        }
 310        spin_unlock_irqrestore(&ndev->db_mask_lock, irqflags);
 311
 312        return 0;
 313}
 314
 315static inline int ndev_db_clear_mask(struct intel_ntb_dev *ndev, u64 db_bits,
 316                                     void __iomem *mmio)
 317{
 318        unsigned long irqflags;
 319
 320        if (ndev_is_unsafe(ndev, NTB_UNSAFE_DB))
 321                pr_warn_once("%s: NTB unsafe doorbell access", __func__);
 322
 323        if (db_bits & ~ndev->db_valid_mask)
 324                return -EINVAL;
 325
 326        spin_lock_irqsave(&ndev->db_mask_lock, irqflags);
 327        {
 328                ndev->db_mask &= ~db_bits;
 329                ndev->reg->db_iowrite(ndev->db_mask, mmio);
 330        }
 331        spin_unlock_irqrestore(&ndev->db_mask_lock, irqflags);
 332
 333        return 0;
 334}
 335
 336static inline int ndev_vec_mask(struct intel_ntb_dev *ndev, int db_vector)
 337{
 338        u64 shift, mask;
 339
 340        shift = ndev->db_vec_shift;
 341        mask = BIT_ULL(shift) - 1;
 342
 343        return mask << (shift * db_vector);
 344}
 345
 346static inline int ndev_spad_addr(struct intel_ntb_dev *ndev, int idx,
 347                                 phys_addr_t *spad_addr, phys_addr_t reg_addr,
 348                                 unsigned long reg)
 349{
 350        if (ndev_is_unsafe(ndev, NTB_UNSAFE_SPAD))
 351                pr_warn_once("%s: NTB unsafe scratchpad access", __func__);
 352
 353        if (idx < 0 || idx >= ndev->spad_count)
 354                return -EINVAL;
 355
 356        if (spad_addr) {
 357                *spad_addr = reg_addr + reg + (idx << 2);
 358                dev_dbg(&ndev->ntb.pdev->dev, "Peer spad addr %llx\n",
 359                        *spad_addr);
 360        }
 361
 362        return 0;
 363}
 364
 365static inline u32 ndev_spad_read(struct intel_ntb_dev *ndev, int idx,
 366                                 void __iomem *mmio)
 367{
 368        if (ndev_is_unsafe(ndev, NTB_UNSAFE_SPAD))
 369                pr_warn_once("%s: NTB unsafe scratchpad access", __func__);
 370
 371        if (idx < 0 || idx >= ndev->spad_count)
 372                return 0;
 373
 374        return ioread32(mmio + (idx << 2));
 375}
 376
 377static inline int ndev_spad_write(struct intel_ntb_dev *ndev, int idx, u32 val,
 378                                  void __iomem *mmio)
 379{
 380        if (ndev_is_unsafe(ndev, NTB_UNSAFE_SPAD))
 381                pr_warn_once("%s: NTB unsafe scratchpad access", __func__);
 382
 383        if (idx < 0 || idx >= ndev->spad_count)
 384                return -EINVAL;
 385
 386        iowrite32(val, mmio + (idx << 2));
 387
 388        return 0;
 389}
 390
 391static irqreturn_t ndev_interrupt(struct intel_ntb_dev *ndev, int vec)
 392{
 393        u64 vec_mask;
 394
 395        vec_mask = ndev_vec_mask(ndev, vec);
 396
 397        if ((ndev->hwerr_flags & NTB_HWERR_MSIX_VECTOR32_BAD) && (vec == 31))
 398                vec_mask |= ndev->db_link_mask;
 399
 400        dev_dbg(&ndev->ntb.pdev->dev, "vec %d vec_mask %llx\n", vec, vec_mask);
 401
 402        ndev->last_ts = jiffies;
 403
 404        if (vec_mask & ndev->db_link_mask) {
 405                if (ndev->reg->poll_link(ndev))
 406                        ntb_link_event(&ndev->ntb);
 407        }
 408
 409        if (vec_mask & ndev->db_valid_mask)
 410                ntb_db_event(&ndev->ntb, vec);
 411
 412        return IRQ_HANDLED;
 413}
 414
 415static irqreturn_t ndev_vec_isr(int irq, void *dev)
 416{
 417        struct intel_ntb_vec *nvec = dev;
 418
 419        dev_dbg(&nvec->ndev->ntb.pdev->dev, "irq: %d  nvec->num: %d\n",
 420                irq, nvec->num);
 421
 422        return ndev_interrupt(nvec->ndev, nvec->num);
 423}
 424
 425static irqreturn_t ndev_irq_isr(int irq, void *dev)
 426{
 427        struct intel_ntb_dev *ndev = dev;
 428
 429        return ndev_interrupt(ndev, irq - ndev->ntb.pdev->irq);
 430}
 431
 432static int ndev_init_isr(struct intel_ntb_dev *ndev,
 433                         int msix_min, int msix_max,
 434                         int msix_shift, int total_shift)
 435{
 436        struct pci_dev *pdev;
 437        int rc, i, msix_count, node;
 438
 439        pdev = ndev->ntb.pdev;
 440
 441        node = dev_to_node(&pdev->dev);
 442
 443        /* Mask all doorbell interrupts */
 444        ndev->db_mask = ndev->db_valid_mask;
 445        ndev->reg->db_iowrite(ndev->db_mask,
 446                              ndev->self_mmio +
 447                              ndev->self_reg->db_mask);
 448
 449        /* Try to set up msix irq */
 450
 451        ndev->vec = kzalloc_node(msix_max * sizeof(*ndev->vec),
 452                                 GFP_KERNEL, node);
 453        if (!ndev->vec)
 454                goto err_msix_vec_alloc;
 455
 456        ndev->msix = kzalloc_node(msix_max * sizeof(*ndev->msix),
 457                                  GFP_KERNEL, node);
 458        if (!ndev->msix)
 459                goto err_msix_alloc;
 460
 461        for (i = 0; i < msix_max; ++i)
 462                ndev->msix[i].entry = i;
 463
 464        msix_count = pci_enable_msix_range(pdev, ndev->msix,
 465                                           msix_min, msix_max);
 466        if (msix_count < 0)
 467                goto err_msix_enable;
 468
 469        for (i = 0; i < msix_count; ++i) {
 470                ndev->vec[i].ndev = ndev;
 471                ndev->vec[i].num = i;
 472                rc = request_irq(ndev->msix[i].vector, ndev_vec_isr, 0,
 473                                 "ndev_vec_isr", &ndev->vec[i]);
 474                if (rc)
 475                        goto err_msix_request;
 476        }
 477
 478        dev_dbg(&pdev->dev, "Using %d msix interrupts\n", msix_count);
 479        ndev->db_vec_count = msix_count;
 480        ndev->db_vec_shift = msix_shift;
 481        return 0;
 482
 483err_msix_request:
 484        while (i-- > 0)
 485                free_irq(ndev->msix[i].vector, &ndev->vec[i]);
 486        pci_disable_msix(pdev);
 487err_msix_enable:
 488        kfree(ndev->msix);
 489err_msix_alloc:
 490        kfree(ndev->vec);
 491err_msix_vec_alloc:
 492        ndev->msix = NULL;
 493        ndev->vec = NULL;
 494
 495        /* Try to set up msi irq */
 496
 497        rc = pci_enable_msi(pdev);
 498        if (rc)
 499                goto err_msi_enable;
 500
 501        rc = request_irq(pdev->irq, ndev_irq_isr, 0,
 502                         "ndev_irq_isr", ndev);
 503        if (rc)
 504                goto err_msi_request;
 505
 506        dev_dbg(&pdev->dev, "Using msi interrupts\n");
 507        ndev->db_vec_count = 1;
 508        ndev->db_vec_shift = total_shift;
 509        return 0;
 510
 511err_msi_request:
 512        pci_disable_msi(pdev);
 513err_msi_enable:
 514
 515        /* Try to set up intx irq */
 516
 517        pci_intx(pdev, 1);
 518
 519        rc = request_irq(pdev->irq, ndev_irq_isr, IRQF_SHARED,
 520                         "ndev_irq_isr", ndev);
 521        if (rc)
 522                goto err_intx_request;
 523
 524        dev_dbg(&pdev->dev, "Using intx interrupts\n");
 525        ndev->db_vec_count = 1;
 526        ndev->db_vec_shift = total_shift;
 527        return 0;
 528
 529err_intx_request:
 530        return rc;
 531}
 532
 533static void ndev_deinit_isr(struct intel_ntb_dev *ndev)
 534{
 535        struct pci_dev *pdev;
 536        int i;
 537
 538        pdev = ndev->ntb.pdev;
 539
 540        /* Mask all doorbell interrupts */
 541        ndev->db_mask = ndev->db_valid_mask;
 542        ndev->reg->db_iowrite(ndev->db_mask,
 543                              ndev->self_mmio +
 544                              ndev->self_reg->db_mask);
 545
 546        if (ndev->msix) {
 547                i = ndev->db_vec_count;
 548                while (i--)
 549                        free_irq(ndev->msix[i].vector, &ndev->vec[i]);
 550                pci_disable_msix(pdev);
 551                kfree(ndev->msix);
 552                kfree(ndev->vec);
 553        } else {
 554                free_irq(pdev->irq, ndev);
 555                if (pci_dev_msi_enabled(pdev))
 556                        pci_disable_msi(pdev);
 557        }
 558}
 559
 560static ssize_t ndev_ntb3_debugfs_read(struct file *filp, char __user *ubuf,
 561                                      size_t count, loff_t *offp)
 562{
 563        struct intel_ntb_dev *ndev;
 564        void __iomem *mmio;
 565        char *buf;
 566        size_t buf_size;
 567        ssize_t ret, off;
 568        union { u64 v64; u32 v32; u16 v16; } u;
 569
 570        ndev = filp->private_data;
 571        mmio = ndev->self_mmio;
 572
 573        buf_size = min(count, 0x800ul);
 574
 575        buf = kmalloc(buf_size, GFP_KERNEL);
 576        if (!buf)
 577                return -ENOMEM;
 578
 579        off = 0;
 580
 581        off += scnprintf(buf + off, buf_size - off,
 582                         "NTB Device Information:\n");
 583
 584        off += scnprintf(buf + off, buf_size - off,
 585                         "Connection Topology -\t%s\n",
 586                         ntb_topo_string(ndev->ntb.topo));
 587
 588        off += scnprintf(buf + off, buf_size - off,
 589                         "NTB CTL -\t\t%#06x\n", ndev->ntb_ctl);
 590        off += scnprintf(buf + off, buf_size - off,
 591                         "LNK STA -\t\t%#06x\n", ndev->lnk_sta);
 592
 593        if (!ndev->reg->link_is_up(ndev))
 594                off += scnprintf(buf + off, buf_size - off,
 595                                 "Link Status -\t\tDown\n");
 596        else {
 597                off += scnprintf(buf + off, buf_size - off,
 598                                 "Link Status -\t\tUp\n");
 599                off += scnprintf(buf + off, buf_size - off,
 600                                 "Link Speed -\t\tPCI-E Gen %u\n",
 601                                 NTB_LNK_STA_SPEED(ndev->lnk_sta));
 602                off += scnprintf(buf + off, buf_size - off,
 603                                 "Link Width -\t\tx%u\n",
 604                                 NTB_LNK_STA_WIDTH(ndev->lnk_sta));
 605        }
 606
 607        off += scnprintf(buf + off, buf_size - off,
 608                         "Memory Window Count -\t%u\n", ndev->mw_count);
 609        off += scnprintf(buf + off, buf_size - off,
 610                         "Scratchpad Count -\t%u\n", ndev->spad_count);
 611        off += scnprintf(buf + off, buf_size - off,
 612                         "Doorbell Count -\t%u\n", ndev->db_count);
 613        off += scnprintf(buf + off, buf_size - off,
 614                         "Doorbell Vector Count -\t%u\n", ndev->db_vec_count);
 615        off += scnprintf(buf + off, buf_size - off,
 616                         "Doorbell Vector Shift -\t%u\n", ndev->db_vec_shift);
 617
 618        off += scnprintf(buf + off, buf_size - off,
 619                         "Doorbell Valid Mask -\t%#llx\n", ndev->db_valid_mask);
 620        off += scnprintf(buf + off, buf_size - off,
 621                         "Doorbell Link Mask -\t%#llx\n", ndev->db_link_mask);
 622        off += scnprintf(buf + off, buf_size - off,
 623                         "Doorbell Mask Cached -\t%#llx\n", ndev->db_mask);
 624
 625        u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);
 626        off += scnprintf(buf + off, buf_size - off,
 627                         "Doorbell Mask -\t\t%#llx\n", u.v64);
 628
 629        u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);
 630        off += scnprintf(buf + off, buf_size - off,
 631                         "Doorbell Bell -\t\t%#llx\n", u.v64);
 632
 633        off += scnprintf(buf + off, buf_size - off,
 634                         "\nNTB Incoming XLAT:\n");
 635
 636        u.v64 = ioread64(mmio + SKX_IMBAR1XBASE_OFFSET);
 637        off += scnprintf(buf + off, buf_size - off,
 638                         "IMBAR1XBASE -\t\t%#018llx\n", u.v64);
 639
 640        u.v64 = ioread64(mmio + SKX_IMBAR2XBASE_OFFSET);
 641        off += scnprintf(buf + off, buf_size - off,
 642                         "IMBAR2XBASE -\t\t%#018llx\n", u.v64);
 643
 644        u.v64 = ioread64(mmio + SKX_IMBAR1XLMT_OFFSET);
 645        off += scnprintf(buf + off, buf_size - off,
 646                         "IMBAR1XLMT -\t\t\t%#018llx\n", u.v64);
 647
 648        u.v64 = ioread64(mmio + SKX_IMBAR2XLMT_OFFSET);
 649        off += scnprintf(buf + off, buf_size - off,
 650                         "IMBAR2XLMT -\t\t\t%#018llx\n", u.v64);
 651
 652        if (ntb_topo_is_b2b(ndev->ntb.topo)) {
 653                off += scnprintf(buf + off, buf_size - off,
 654                                 "\nNTB Outgoing B2B XLAT:\n");
 655
 656                u.v64 = ioread64(mmio + SKX_EMBAR1XBASE_OFFSET);
 657                off += scnprintf(buf + off, buf_size - off,
 658                                 "EMBAR1XBASE -\t\t%#018llx\n", u.v64);
 659
 660                u.v64 = ioread64(mmio + SKX_EMBAR2XBASE_OFFSET);
 661                off += scnprintf(buf + off, buf_size - off,
 662                                 "EMBAR2XBASE -\t\t%#018llx\n", u.v64);
 663
 664                u.v64 = ioread64(mmio + SKX_EMBAR1XLMT_OFFSET);
 665                off += scnprintf(buf + off, buf_size - off,
 666                                 "EMBAR1XLMT -\t\t%#018llx\n", u.v64);
 667
 668                u.v64 = ioread64(mmio + SKX_EMBAR2XLMT_OFFSET);
 669                off += scnprintf(buf + off, buf_size - off,
 670                                 "EMBAR2XLMT -\t\t%#018llx\n", u.v64);
 671
 672                off += scnprintf(buf + off, buf_size - off,
 673                                 "\nNTB Secondary BAR:\n");
 674
 675                u.v64 = ioread64(mmio + SKX_EMBAR0_OFFSET);
 676                off += scnprintf(buf + off, buf_size - off,
 677                                 "EMBAR0 -\t\t%#018llx\n", u.v64);
 678
 679                u.v64 = ioread64(mmio + SKX_EMBAR1_OFFSET);
 680                off += scnprintf(buf + off, buf_size - off,
 681                                 "EMBAR1 -\t\t%#018llx\n", u.v64);
 682
 683                u.v64 = ioread64(mmio + SKX_EMBAR2_OFFSET);
 684                off += scnprintf(buf + off, buf_size - off,
 685                                 "EMBAR2 -\t\t%#018llx\n", u.v64);
 686        }
 687
 688        off += scnprintf(buf + off, buf_size - off,
 689                         "\nNTB Statistics:\n");
 690
 691        u.v16 = ioread16(mmio + SKX_USMEMMISS_OFFSET);
 692        off += scnprintf(buf + off, buf_size - off,
 693                         "Upstream Memory Miss -\t%u\n", u.v16);
 694
 695        off += scnprintf(buf + off, buf_size - off,
 696                         "\nNTB Hardware Errors:\n");
 697
 698        if (!pci_read_config_word(ndev->ntb.pdev,
 699                                  SKX_DEVSTS_OFFSET, &u.v16))
 700                off += scnprintf(buf + off, buf_size - off,
 701                                 "DEVSTS -\t\t%#06x\n", u.v16);
 702
 703        if (!pci_read_config_word(ndev->ntb.pdev,
 704                                  SKX_LINK_STATUS_OFFSET, &u.v16))
 705                off += scnprintf(buf + off, buf_size - off,
 706                                 "LNKSTS -\t\t%#06x\n", u.v16);
 707
 708        if (!pci_read_config_dword(ndev->ntb.pdev,
 709                                   SKX_UNCERRSTS_OFFSET, &u.v32))
 710                off += scnprintf(buf + off, buf_size - off,
 711                                 "UNCERRSTS -\t\t%#06x\n", u.v32);
 712
 713        if (!pci_read_config_dword(ndev->ntb.pdev,
 714                                   SKX_CORERRSTS_OFFSET, &u.v32))
 715                off += scnprintf(buf + off, buf_size - off,
 716                                 "CORERRSTS -\t\t%#06x\n", u.v32);
 717
 718        ret = simple_read_from_buffer(ubuf, count, offp, buf, off);
 719        kfree(buf);
 720        return ret;
 721}
 722
 723static ssize_t ndev_ntb_debugfs_read(struct file *filp, char __user *ubuf,
 724                                     size_t count, loff_t *offp)
 725{
 726        struct intel_ntb_dev *ndev;
 727        struct pci_dev *pdev;
 728        void __iomem *mmio;
 729        char *buf;
 730        size_t buf_size;
 731        ssize_t ret, off;
 732        union { u64 v64; u32 v32; u16 v16; u8 v8; } u;
 733
 734        ndev = filp->private_data;
 735        pdev = ndev->ntb.pdev;
 736        mmio = ndev->self_mmio;
 737
 738        buf_size = min(count, 0x800ul);
 739
 740        buf = kmalloc(buf_size, GFP_KERNEL);
 741        if (!buf)
 742                return -ENOMEM;
 743
 744        off = 0;
 745
 746        off += scnprintf(buf + off, buf_size - off,
 747                         "NTB Device Information:\n");
 748
 749        off += scnprintf(buf + off, buf_size - off,
 750                         "Connection Topology -\t%s\n",
 751                         ntb_topo_string(ndev->ntb.topo));
 752
 753        if (ndev->b2b_idx != UINT_MAX) {
 754                off += scnprintf(buf + off, buf_size - off,
 755                                 "B2B MW Idx -\t\t%u\n", ndev->b2b_idx);
 756                off += scnprintf(buf + off, buf_size - off,
 757                                 "B2B Offset -\t\t%#lx\n", ndev->b2b_off);
 758        }
 759
 760        off += scnprintf(buf + off, buf_size - off,
 761                         "BAR4 Split -\t\t%s\n",
 762                         ndev->bar4_split ? "yes" : "no");
 763
 764        off += scnprintf(buf + off, buf_size - off,
 765                         "NTB CTL -\t\t%#06x\n", ndev->ntb_ctl);
 766        off += scnprintf(buf + off, buf_size - off,
 767                         "LNK STA -\t\t%#06x\n", ndev->lnk_sta);
 768
 769        if (!ndev->reg->link_is_up(ndev)) {
 770                off += scnprintf(buf + off, buf_size - off,
 771                                 "Link Status -\t\tDown\n");
 772        } else {
 773                off += scnprintf(buf + off, buf_size - off,
 774                                 "Link Status -\t\tUp\n");
 775                off += scnprintf(buf + off, buf_size - off,
 776                                 "Link Speed -\t\tPCI-E Gen %u\n",
 777                                 NTB_LNK_STA_SPEED(ndev->lnk_sta));
 778                off += scnprintf(buf + off, buf_size - off,
 779                                 "Link Width -\t\tx%u\n",
 780                                 NTB_LNK_STA_WIDTH(ndev->lnk_sta));
 781        }
 782
 783        off += scnprintf(buf + off, buf_size - off,
 784                         "Memory Window Count -\t%u\n", ndev->mw_count);
 785        off += scnprintf(buf + off, buf_size - off,
 786                         "Scratchpad Count -\t%u\n", ndev->spad_count);
 787        off += scnprintf(buf + off, buf_size - off,
 788                         "Doorbell Count -\t%u\n", ndev->db_count);
 789        off += scnprintf(buf + off, buf_size - off,
 790                         "Doorbell Vector Count -\t%u\n", ndev->db_vec_count);
 791        off += scnprintf(buf + off, buf_size - off,
 792                         "Doorbell Vector Shift -\t%u\n", ndev->db_vec_shift);
 793
 794        off += scnprintf(buf + off, buf_size - off,
 795                         "Doorbell Valid Mask -\t%#llx\n", ndev->db_valid_mask);
 796        off += scnprintf(buf + off, buf_size - off,
 797                         "Doorbell Link Mask -\t%#llx\n", ndev->db_link_mask);
 798        off += scnprintf(buf + off, buf_size - off,
 799                         "Doorbell Mask Cached -\t%#llx\n", ndev->db_mask);
 800
 801        u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);
 802        off += scnprintf(buf + off, buf_size - off,
 803                         "Doorbell Mask -\t\t%#llx\n", u.v64);
 804
 805        u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);
 806        off += scnprintf(buf + off, buf_size - off,
 807                         "Doorbell Bell -\t\t%#llx\n", u.v64);
 808
 809        off += scnprintf(buf + off, buf_size - off,
 810                         "\nNTB Window Size:\n");
 811
 812        pci_read_config_byte(pdev, XEON_PBAR23SZ_OFFSET, &u.v8);
 813        off += scnprintf(buf + off, buf_size - off,
 814                         "PBAR23SZ %hhu\n", u.v8);
 815        if (!ndev->bar4_split) {
 816                pci_read_config_byte(pdev, XEON_PBAR45SZ_OFFSET, &u.v8);
 817                off += scnprintf(buf + off, buf_size - off,
 818                                 "PBAR45SZ %hhu\n", u.v8);
 819        } else {
 820                pci_read_config_byte(pdev, XEON_PBAR4SZ_OFFSET, &u.v8);
 821                off += scnprintf(buf + off, buf_size - off,
 822                                 "PBAR4SZ %hhu\n", u.v8);
 823                pci_read_config_byte(pdev, XEON_PBAR5SZ_OFFSET, &u.v8);
 824                off += scnprintf(buf + off, buf_size - off,
 825                                 "PBAR5SZ %hhu\n", u.v8);
 826        }
 827
 828        pci_read_config_byte(pdev, XEON_SBAR23SZ_OFFSET, &u.v8);
 829        off += scnprintf(buf + off, buf_size - off,
 830                         "SBAR23SZ %hhu\n", u.v8);
 831        if (!ndev->bar4_split) {
 832                pci_read_config_byte(pdev, XEON_SBAR45SZ_OFFSET, &u.v8);
 833                off += scnprintf(buf + off, buf_size - off,
 834                                 "SBAR45SZ %hhu\n", u.v8);
 835        } else {
 836                pci_read_config_byte(pdev, XEON_SBAR4SZ_OFFSET, &u.v8);
 837                off += scnprintf(buf + off, buf_size - off,
 838                                 "SBAR4SZ %hhu\n", u.v8);
 839                pci_read_config_byte(pdev, XEON_SBAR5SZ_OFFSET, &u.v8);
 840                off += scnprintf(buf + off, buf_size - off,
 841                                 "SBAR5SZ %hhu\n", u.v8);
 842        }
 843
 844        off += scnprintf(buf + off, buf_size - off,
 845                         "\nNTB Incoming XLAT:\n");
 846
 847        u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2));
 848        off += scnprintf(buf + off, buf_size - off,
 849                         "XLAT23 -\t\t%#018llx\n", u.v64);
 850
 851        if (ndev->bar4_split) {
 852                u.v32 = ioread32(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));
 853                off += scnprintf(buf + off, buf_size - off,
 854                                 "XLAT4 -\t\t\t%#06x\n", u.v32);
 855
 856                u.v32 = ioread32(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 5));
 857                off += scnprintf(buf + off, buf_size - off,
 858                                 "XLAT5 -\t\t\t%#06x\n", u.v32);
 859        } else {
 860                u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));
 861                off += scnprintf(buf + off, buf_size - off,
 862                                 "XLAT45 -\t\t%#018llx\n", u.v64);
 863        }
 864
 865        u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2));
 866        off += scnprintf(buf + off, buf_size - off,
 867                         "LMT23 -\t\t\t%#018llx\n", u.v64);
 868
 869        if (ndev->bar4_split) {
 870                u.v32 = ioread32(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));
 871                off += scnprintf(buf + off, buf_size - off,
 872                                 "LMT4 -\t\t\t%#06x\n", u.v32);
 873                u.v32 = ioread32(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 5));
 874                off += scnprintf(buf + off, buf_size - off,
 875                                 "LMT5 -\t\t\t%#06x\n", u.v32);
 876        } else {
 877                u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));
 878                off += scnprintf(buf + off, buf_size - off,
 879                                 "LMT45 -\t\t\t%#018llx\n", u.v64);
 880        }
 881
 882        if (pdev_is_xeon(pdev)) {
 883                if (ntb_topo_is_b2b(ndev->ntb.topo)) {
 884                        off += scnprintf(buf + off, buf_size - off,
 885                                         "\nNTB Outgoing B2B XLAT:\n");
 886
 887                        u.v64 = ioread64(mmio + XEON_PBAR23XLAT_OFFSET);
 888                        off += scnprintf(buf + off, buf_size - off,
 889                                         "B2B XLAT23 -\t\t%#018llx\n", u.v64);
 890
 891                        if (ndev->bar4_split) {
 892                                u.v32 = ioread32(mmio + XEON_PBAR4XLAT_OFFSET);
 893                                off += scnprintf(buf + off, buf_size - off,
 894                                                 "B2B XLAT4 -\t\t%#06x\n",
 895                                                 u.v32);
 896                                u.v32 = ioread32(mmio + XEON_PBAR5XLAT_OFFSET);
 897                                off += scnprintf(buf + off, buf_size - off,
 898                                                 "B2B XLAT5 -\t\t%#06x\n",
 899                                                 u.v32);
 900                        } else {
 901                                u.v64 = ioread64(mmio + XEON_PBAR45XLAT_OFFSET);
 902                                off += scnprintf(buf + off, buf_size - off,
 903                                                 "B2B XLAT45 -\t\t%#018llx\n",
 904                                                 u.v64);
 905                        }
 906
 907                        u.v64 = ioread64(mmio + XEON_PBAR23LMT_OFFSET);
 908                        off += scnprintf(buf + off, buf_size - off,
 909                                         "B2B LMT23 -\t\t%#018llx\n", u.v64);
 910
 911                        if (ndev->bar4_split) {
 912                                u.v32 = ioread32(mmio + XEON_PBAR4LMT_OFFSET);
 913                                off += scnprintf(buf + off, buf_size - off,
 914                                                 "B2B LMT4 -\t\t%#06x\n",
 915                                                 u.v32);
 916                                u.v32 = ioread32(mmio + XEON_PBAR5LMT_OFFSET);
 917                                off += scnprintf(buf + off, buf_size - off,
 918                                                 "B2B LMT5 -\t\t%#06x\n",
 919                                                 u.v32);
 920                        } else {
 921                                u.v64 = ioread64(mmio + XEON_PBAR45LMT_OFFSET);
 922                                off += scnprintf(buf + off, buf_size - off,
 923                                                 "B2B LMT45 -\t\t%#018llx\n",
 924                                                 u.v64);
 925                        }
 926
 927                        off += scnprintf(buf + off, buf_size - off,
 928                                         "\nNTB Secondary BAR:\n");
 929
 930                        u.v64 = ioread64(mmio + XEON_SBAR0BASE_OFFSET);
 931                        off += scnprintf(buf + off, buf_size - off,
 932                                         "SBAR01 -\t\t%#018llx\n", u.v64);
 933
 934                        u.v64 = ioread64(mmio + XEON_SBAR23BASE_OFFSET);
 935                        off += scnprintf(buf + off, buf_size - off,
 936                                         "SBAR23 -\t\t%#018llx\n", u.v64);
 937
 938                        if (ndev->bar4_split) {
 939                                u.v32 = ioread32(mmio + XEON_SBAR4BASE_OFFSET);
 940                                off += scnprintf(buf + off, buf_size - off,
 941                                                 "SBAR4 -\t\t\t%#06x\n", u.v32);
 942                                u.v32 = ioread32(mmio + XEON_SBAR5BASE_OFFSET);
 943                                off += scnprintf(buf + off, buf_size - off,
 944                                                 "SBAR5 -\t\t\t%#06x\n", u.v32);
 945                        } else {
 946                                u.v64 = ioread64(mmio + XEON_SBAR45BASE_OFFSET);
 947                                off += scnprintf(buf + off, buf_size - off,
 948                                                 "SBAR45 -\t\t%#018llx\n",
 949                                                 u.v64);
 950                        }
 951                }
 952
 953                off += scnprintf(buf + off, buf_size - off,
 954                                 "\nXEON NTB Statistics:\n");
 955
 956                u.v16 = ioread16(mmio + XEON_USMEMMISS_OFFSET);
 957                off += scnprintf(buf + off, buf_size - off,
 958                                 "Upstream Memory Miss -\t%u\n", u.v16);
 959
 960                off += scnprintf(buf + off, buf_size - off,
 961                                 "\nXEON NTB Hardware Errors:\n");
 962
 963                if (!pci_read_config_word(pdev,
 964                                          XEON_DEVSTS_OFFSET, &u.v16))
 965                        off += scnprintf(buf + off, buf_size - off,
 966                                         "DEVSTS -\t\t%#06x\n", u.v16);
 967
 968                if (!pci_read_config_word(pdev,
 969                                          XEON_LINK_STATUS_OFFSET, &u.v16))
 970                        off += scnprintf(buf + off, buf_size - off,
 971                                         "LNKSTS -\t\t%#06x\n", u.v16);
 972
 973                if (!pci_read_config_dword(pdev,
 974                                           XEON_UNCERRSTS_OFFSET, &u.v32))
 975                        off += scnprintf(buf + off, buf_size - off,
 976                                         "UNCERRSTS -\t\t%#06x\n", u.v32);
 977
 978                if (!pci_read_config_dword(pdev,
 979                                           XEON_CORERRSTS_OFFSET, &u.v32))
 980                        off += scnprintf(buf + off, buf_size - off,
 981                                         "CORERRSTS -\t\t%#06x\n", u.v32);
 982        }
 983
 984        ret = simple_read_from_buffer(ubuf, count, offp, buf, off);
 985        kfree(buf);
 986        return ret;
 987}
 988
 989static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
 990                                 size_t count, loff_t *offp)
 991{
 992        struct intel_ntb_dev *ndev = filp->private_data;
 993
 994        if (pdev_is_xeon(ndev->ntb.pdev))
 995                return ndev_ntb_debugfs_read(filp, ubuf, count, offp);
 996        else if (pdev_is_skx_xeon(ndev->ntb.pdev))
 997                return ndev_ntb3_debugfs_read(filp, ubuf, count, offp);
 998
 999        return -ENXIO;
1000}
1001
1002static void ndev_init_debugfs(struct intel_ntb_dev *ndev)
1003{
1004        if (!debugfs_dir) {
1005                ndev->debugfs_dir = NULL;
1006                ndev->debugfs_info = NULL;
1007        } else {
1008                ndev->debugfs_dir =
1009                        debugfs_create_dir(pci_name(ndev->ntb.pdev),
1010                                           debugfs_dir);
1011                if (!ndev->debugfs_dir)
1012                        ndev->debugfs_info = NULL;
1013                else
1014                        ndev->debugfs_info =
1015                                debugfs_create_file("info", S_IRUSR,
1016                                                    ndev->debugfs_dir, ndev,
1017                                                    &intel_ntb_debugfs_info);
1018        }
1019}
1020
1021static void ndev_deinit_debugfs(struct intel_ntb_dev *ndev)
1022{
1023        debugfs_remove_recursive(ndev->debugfs_dir);
1024}
1025
1026static int intel_ntb_mw_count(struct ntb_dev *ntb, int pidx)
1027{
1028        if (pidx != NTB_DEF_PEER_IDX)
1029                return -EINVAL;
1030
1031        return ntb_ndev(ntb)->mw_count;
1032}
1033
1034static int intel_ntb_mw_get_align(struct ntb_dev *ntb, int pidx, int idx,
1035                                  resource_size_t *addr_align,
1036                                  resource_size_t *size_align,
1037                                  resource_size_t *size_max)
1038{
1039        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1040        resource_size_t bar_size, mw_size;
1041        int bar;
1042
1043        if (pidx != NTB_DEF_PEER_IDX)
1044                return -EINVAL;
1045
1046        if (idx >= ndev->b2b_idx && !ndev->b2b_off)
1047                idx += 1;
1048
1049        bar = ndev_mw_to_bar(ndev, idx);
1050        if (bar < 0)
1051                return bar;
1052
1053        bar_size = pci_resource_len(ndev->ntb.pdev, bar);
1054
1055        if (idx == ndev->b2b_idx)
1056                mw_size = bar_size - ndev->b2b_off;
1057        else
1058                mw_size = bar_size;
1059
1060        if (addr_align)
1061                *addr_align = pci_resource_len(ndev->ntb.pdev, bar);
1062
1063        if (size_align)
1064                *size_align = 1;
1065
1066        if (size_max)
1067                *size_max = mw_size;
1068
1069        return 0;
1070}
1071
1072static int intel_ntb_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
1073                                  dma_addr_t addr, resource_size_t size)
1074{
1075        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1076        unsigned long base_reg, xlat_reg, limit_reg;
1077        resource_size_t bar_size, mw_size;
1078        void __iomem *mmio;
1079        u64 base, limit, reg_val;
1080        int bar;
1081
1082        if (pidx != NTB_DEF_PEER_IDX)
1083                return -EINVAL;
1084
1085        if (idx >= ndev->b2b_idx && !ndev->b2b_off)
1086                idx += 1;
1087
1088        bar = ndev_mw_to_bar(ndev, idx);
1089        if (bar < 0)
1090                return bar;
1091
1092        bar_size = pci_resource_len(ndev->ntb.pdev, bar);
1093
1094        if (idx == ndev->b2b_idx)
1095                mw_size = bar_size - ndev->b2b_off;
1096        else
1097                mw_size = bar_size;
1098
1099        /* hardware requires that addr is aligned to bar size */
1100        if (addr & (bar_size - 1))
1101                return -EINVAL;
1102
1103        /* make sure the range fits in the usable mw size */
1104        if (size > mw_size)
1105                return -EINVAL;
1106
1107        mmio = ndev->self_mmio;
1108        base_reg = bar0_off(ndev->xlat_reg->bar0_base, bar);
1109        xlat_reg = bar2_off(ndev->xlat_reg->bar2_xlat, bar);
1110        limit_reg = bar2_off(ndev->xlat_reg->bar2_limit, bar);
1111
1112        if (bar < 4 || !ndev->bar4_split) {
1113                base = ioread64(mmio + base_reg) & NTB_BAR_MASK_64;
1114
1115                /* Set the limit if supported, if size is not mw_size */
1116                if (limit_reg && size != mw_size)
1117                        limit = base + size;
1118                else
1119                        limit = 0;
1120
1121                /* set and verify setting the translation address */
1122                iowrite64(addr, mmio + xlat_reg);
1123                reg_val = ioread64(mmio + xlat_reg);
1124                if (reg_val != addr) {
1125                        iowrite64(0, mmio + xlat_reg);
1126                        return -EIO;
1127                }
1128
1129                /* set and verify setting the limit */
1130                iowrite64(limit, mmio + limit_reg);
1131                reg_val = ioread64(mmio + limit_reg);
1132                if (reg_val != limit) {
1133                        iowrite64(base, mmio + limit_reg);
1134                        iowrite64(0, mmio + xlat_reg);
1135                        return -EIO;
1136                }
1137        } else {
1138                /* split bar addr range must all be 32 bit */
1139                if (addr & (~0ull << 32))
1140                        return -EINVAL;
1141                if ((addr + size) & (~0ull << 32))
1142                        return -EINVAL;
1143
1144                base = ioread32(mmio + base_reg) & NTB_BAR_MASK_32;
1145
1146                /* Set the limit if supported, if size is not mw_size */
1147                if (limit_reg && size != mw_size)
1148                        limit = base + size;
1149                else
1150                        limit = 0;
1151
1152                /* set and verify setting the translation address */
1153                iowrite32(addr, mmio + xlat_reg);
1154                reg_val = ioread32(mmio + xlat_reg);
1155                if (reg_val != addr) {
1156                        iowrite32(0, mmio + xlat_reg);
1157                        return -EIO;
1158                }
1159
1160                /* set and verify setting the limit */
1161                iowrite32(limit, mmio + limit_reg);
1162                reg_val = ioread32(mmio + limit_reg);
1163                if (reg_val != limit) {
1164                        iowrite32(base, mmio + limit_reg);
1165                        iowrite32(0, mmio + xlat_reg);
1166                        return -EIO;
1167                }
1168        }
1169
1170        return 0;
1171}
1172
1173static u64 intel_ntb_link_is_up(struct ntb_dev *ntb,
1174                                enum ntb_speed *speed,
1175                                enum ntb_width *width)
1176{
1177        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1178
1179        if (ndev->reg->link_is_up(ndev)) {
1180                if (speed)
1181                        *speed = NTB_LNK_STA_SPEED(ndev->lnk_sta);
1182                if (width)
1183                        *width = NTB_LNK_STA_WIDTH(ndev->lnk_sta);
1184                return 1;
1185        } else {
1186                /* TODO MAYBE: is it possible to observe the link speed and
1187                 * width while link is training? */
1188                if (speed)
1189                        *speed = NTB_SPEED_NONE;
1190                if (width)
1191                        *width = NTB_WIDTH_NONE;
1192                return 0;
1193        }
1194}
1195
1196static int intel_ntb_link_enable(struct ntb_dev *ntb,
1197                                 enum ntb_speed max_speed,
1198                                 enum ntb_width max_width)
1199{
1200        struct intel_ntb_dev *ndev;
1201        u32 ntb_ctl;
1202
1203        ndev = container_of(ntb, struct intel_ntb_dev, ntb);
1204
1205        if (ndev->ntb.topo == NTB_TOPO_SEC)
1206                return -EINVAL;
1207
1208        dev_dbg(&ntb->pdev->dev,
1209                "Enabling link with max_speed %d max_width %d\n",
1210                max_speed, max_width);
1211        if (max_speed != NTB_SPEED_AUTO)
1212                dev_dbg(&ntb->pdev->dev, "ignoring max_speed %d\n", max_speed);
1213        if (max_width != NTB_WIDTH_AUTO)
1214                dev_dbg(&ntb->pdev->dev, "ignoring max_width %d\n", max_width);
1215
1216        ntb_ctl = ioread32(ndev->self_mmio + ndev->reg->ntb_ctl);
1217        ntb_ctl &= ~(NTB_CTL_DISABLE | NTB_CTL_CFG_LOCK);
1218        ntb_ctl |= NTB_CTL_P2S_BAR2_SNOOP | NTB_CTL_S2P_BAR2_SNOOP;
1219        ntb_ctl |= NTB_CTL_P2S_BAR4_SNOOP | NTB_CTL_S2P_BAR4_SNOOP;
1220        if (ndev->bar4_split)
1221                ntb_ctl |= NTB_CTL_P2S_BAR5_SNOOP | NTB_CTL_S2P_BAR5_SNOOP;
1222        iowrite32(ntb_ctl, ndev->self_mmio + ndev->reg->ntb_ctl);
1223
1224        return 0;
1225}
1226
1227static int intel_ntb_link_disable(struct ntb_dev *ntb)
1228{
1229        struct intel_ntb_dev *ndev;
1230        u32 ntb_cntl;
1231
1232        ndev = container_of(ntb, struct intel_ntb_dev, ntb);
1233
1234        if (ndev->ntb.topo == NTB_TOPO_SEC)
1235                return -EINVAL;
1236
1237        dev_dbg(&ntb->pdev->dev, "Disabling link\n");
1238
1239        /* Bring NTB link down */
1240        ntb_cntl = ioread32(ndev->self_mmio + ndev->reg->ntb_ctl);
1241        ntb_cntl &= ~(NTB_CTL_P2S_BAR2_SNOOP | NTB_CTL_S2P_BAR2_SNOOP);
1242        ntb_cntl &= ~(NTB_CTL_P2S_BAR4_SNOOP | NTB_CTL_S2P_BAR4_SNOOP);
1243        if (ndev->bar4_split)
1244                ntb_cntl &= ~(NTB_CTL_P2S_BAR5_SNOOP | NTB_CTL_S2P_BAR5_SNOOP);
1245        ntb_cntl |= NTB_CTL_DISABLE | NTB_CTL_CFG_LOCK;
1246        iowrite32(ntb_cntl, ndev->self_mmio + ndev->reg->ntb_ctl);
1247
1248        return 0;
1249}
1250
1251static int intel_ntb_peer_mw_count(struct ntb_dev *ntb)
1252{
1253        /* Numbers of inbound and outbound memory windows match */
1254        return ntb_ndev(ntb)->mw_count;
1255}
1256
1257static int intel_ntb_peer_mw_get_addr(struct ntb_dev *ntb, int idx,
1258                                     phys_addr_t *base, resource_size_t *size)
1259{
1260        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1261        int bar;
1262
1263        if (idx >= ndev->b2b_idx && !ndev->b2b_off)
1264                idx += 1;
1265
1266        bar = ndev_mw_to_bar(ndev, idx);
1267        if (bar < 0)
1268                return bar;
1269
1270        if (base)
1271                *base = pci_resource_start(ndev->ntb.pdev, bar) +
1272                        (idx == ndev->b2b_idx ? ndev->b2b_off : 0);
1273
1274        if (size)
1275                *size = pci_resource_len(ndev->ntb.pdev, bar) -
1276                        (idx == ndev->b2b_idx ? ndev->b2b_off : 0);
1277
1278        return 0;
1279}
1280
1281static int intel_ntb_db_is_unsafe(struct ntb_dev *ntb)
1282{
1283        return ndev_ignore_unsafe(ntb_ndev(ntb), NTB_UNSAFE_DB);
1284}
1285
1286static u64 intel_ntb_db_valid_mask(struct ntb_dev *ntb)
1287{
1288        return ntb_ndev(ntb)->db_valid_mask;
1289}
1290
1291static int intel_ntb_db_vector_count(struct ntb_dev *ntb)
1292{
1293        struct intel_ntb_dev *ndev;
1294
1295        ndev = container_of(ntb, struct intel_ntb_dev, ntb);
1296
1297        return ndev->db_vec_count;
1298}
1299
1300static u64 intel_ntb_db_vector_mask(struct ntb_dev *ntb, int db_vector)
1301{
1302        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1303
1304        if (db_vector < 0 || db_vector > ndev->db_vec_count)
1305                return 0;
1306
1307        return ndev->db_valid_mask & ndev_vec_mask(ndev, db_vector);
1308}
1309
1310static u64 intel_ntb_db_read(struct ntb_dev *ntb)
1311{
1312        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1313
1314        return ndev_db_read(ndev,
1315                            ndev->self_mmio +
1316                            ndev->self_reg->db_bell);
1317}
1318
1319static int intel_ntb_db_clear(struct ntb_dev *ntb, u64 db_bits)
1320{
1321        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1322
1323        return ndev_db_write(ndev, db_bits,
1324                             ndev->self_mmio +
1325                             ndev->self_reg->db_bell);
1326}
1327
1328static int intel_ntb_db_set_mask(struct ntb_dev *ntb, u64 db_bits)
1329{
1330        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1331
1332        return ndev_db_set_mask(ndev, db_bits,
1333                                ndev->self_mmio +
1334                                ndev->self_reg->db_mask);
1335}
1336
1337static int intel_ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits)
1338{
1339        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1340
1341        return ndev_db_clear_mask(ndev, db_bits,
1342                                  ndev->self_mmio +
1343                                  ndev->self_reg->db_mask);
1344}
1345
1346static int intel_ntb_peer_db_addr(struct ntb_dev *ntb,
1347                                  phys_addr_t *db_addr,
1348                                  resource_size_t *db_size)
1349{
1350        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1351
1352        return ndev_db_addr(ndev, db_addr, db_size, ndev->peer_addr,
1353                            ndev->peer_reg->db_bell);
1354}
1355
1356static int intel_ntb_peer_db_set(struct ntb_dev *ntb, u64 db_bits)
1357{
1358        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1359
1360        return ndev_db_write(ndev, db_bits,
1361                             ndev->peer_mmio +
1362                             ndev->peer_reg->db_bell);
1363}
1364
1365static int intel_ntb_spad_is_unsafe(struct ntb_dev *ntb)
1366{
1367        return ndev_ignore_unsafe(ntb_ndev(ntb), NTB_UNSAFE_SPAD);
1368}
1369
1370static int intel_ntb_spad_count(struct ntb_dev *ntb)
1371{
1372        struct intel_ntb_dev *ndev;
1373
1374        ndev = container_of(ntb, struct intel_ntb_dev, ntb);
1375
1376        return ndev->spad_count;
1377}
1378
1379static u32 intel_ntb_spad_read(struct ntb_dev *ntb, int idx)
1380{
1381        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1382
1383        return ndev_spad_read(ndev, idx,
1384                              ndev->self_mmio +
1385                              ndev->self_reg->spad);
1386}
1387
1388static int intel_ntb_spad_write(struct ntb_dev *ntb,
1389                                int idx, u32 val)
1390{
1391        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1392
1393        return ndev_spad_write(ndev, idx, val,
1394                               ndev->self_mmio +
1395                               ndev->self_reg->spad);
1396}
1397
1398static int intel_ntb_peer_spad_addr(struct ntb_dev *ntb, int pidx, int sidx,
1399                                    phys_addr_t *spad_addr)
1400{
1401        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1402
1403        return ndev_spad_addr(ndev, sidx, spad_addr, ndev->peer_addr,
1404                              ndev->peer_reg->spad);
1405}
1406
1407static u32 intel_ntb_peer_spad_read(struct ntb_dev *ntb, int pidx, int sidx)
1408{
1409        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1410
1411        return ndev_spad_read(ndev, sidx,
1412                              ndev->peer_mmio +
1413                              ndev->peer_reg->spad);
1414}
1415
1416static int intel_ntb_peer_spad_write(struct ntb_dev *ntb, int pidx,
1417                                     int sidx, u32 val)
1418{
1419        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1420
1421        return ndev_spad_write(ndev, sidx, val,
1422                               ndev->peer_mmio +
1423                               ndev->peer_reg->spad);
1424}
1425
1426/* Skylake Xeon NTB */
1427
1428static int skx_poll_link(struct intel_ntb_dev *ndev)
1429{
1430        u16 reg_val;
1431        int rc;
1432
1433        ndev->reg->db_iowrite(ndev->db_link_mask,
1434                              ndev->self_mmio +
1435                              ndev->self_reg->db_clear);
1436
1437        rc = pci_read_config_word(ndev->ntb.pdev,
1438                                  SKX_LINK_STATUS_OFFSET, &reg_val);
1439        if (rc)
1440                return 0;
1441
1442        if (reg_val == ndev->lnk_sta)
1443                return 0;
1444
1445        ndev->lnk_sta = reg_val;
1446
1447        return 1;
1448}
1449
1450static u64 skx_db_ioread(void __iomem *mmio)
1451{
1452        return ioread64(mmio);
1453}
1454
1455static void skx_db_iowrite(u64 bits, void __iomem *mmio)
1456{
1457        iowrite64(bits, mmio);
1458}
1459
1460static int skx_init_isr(struct intel_ntb_dev *ndev)
1461{
1462        int i;
1463
1464        /*
1465         * The MSIX vectors and the interrupt status bits are not lined up
1466         * on Skylake. By default the link status bit is bit 32, however it
1467         * is by default MSIX vector0. We need to fixup to line them up.
1468         * The vectors at reset is 1-32,0. We need to reprogram to 0-32.
1469         */
1470
1471        for (i = 0; i < SKX_DB_MSIX_VECTOR_COUNT; i++)
1472                iowrite8(i, ndev->self_mmio + SKX_INTVEC_OFFSET + i);
1473
1474        /* move link status down one as workaround */
1475        if (ndev->hwerr_flags & NTB_HWERR_MSIX_VECTOR32_BAD) {
1476                iowrite8(SKX_DB_MSIX_VECTOR_COUNT - 2,
1477                         ndev->self_mmio + SKX_INTVEC_OFFSET +
1478                         (SKX_DB_MSIX_VECTOR_COUNT - 1));
1479        }
1480
1481        return ndev_init_isr(ndev, SKX_DB_MSIX_VECTOR_COUNT,
1482                             SKX_DB_MSIX_VECTOR_COUNT,
1483                             SKX_DB_MSIX_VECTOR_SHIFT,
1484                             SKX_DB_TOTAL_SHIFT);
1485}
1486
1487static int skx_setup_b2b_mw(struct intel_ntb_dev *ndev,
1488                            const struct intel_b2b_addr *addr,
1489                            const struct intel_b2b_addr *peer_addr)
1490{
1491        struct pci_dev *pdev;
1492        void __iomem *mmio;
1493        phys_addr_t bar_addr;
1494
1495        pdev = ndev->ntb.pdev;
1496        mmio = ndev->self_mmio;
1497
1498        /* setup incoming bar limits == base addrs (zero length windows) */
1499        bar_addr = addr->bar2_addr64;
1500        iowrite64(bar_addr, mmio + SKX_IMBAR1XLMT_OFFSET);
1501        bar_addr = ioread64(mmio + SKX_IMBAR1XLMT_OFFSET);
1502        dev_dbg(&pdev->dev, "IMBAR1XLMT %#018llx\n", bar_addr);
1503
1504        bar_addr = addr->bar4_addr64;
1505        iowrite64(bar_addr, mmio + SKX_IMBAR2XLMT_OFFSET);
1506        bar_addr = ioread64(mmio + SKX_IMBAR2XLMT_OFFSET);
1507        dev_dbg(&pdev->dev, "IMBAR2XLMT %#018llx\n", bar_addr);
1508
1509        /* zero incoming translation addrs */
1510        iowrite64(0, mmio + SKX_IMBAR1XBASE_OFFSET);
1511        iowrite64(0, mmio + SKX_IMBAR2XBASE_OFFSET);
1512
1513        ndev->peer_mmio = ndev->self_mmio;
1514
1515        return 0;
1516}
1517
1518static int skx_init_ntb(struct intel_ntb_dev *ndev)
1519{
1520        int rc;
1521
1522
1523        ndev->mw_count = XEON_MW_COUNT;
1524        ndev->spad_count = SKX_SPAD_COUNT;
1525        ndev->db_count = SKX_DB_COUNT;
1526        ndev->db_link_mask = SKX_DB_LINK_BIT;
1527
1528        /* DB fixup for using 31 right now */
1529        if (ndev->hwerr_flags & NTB_HWERR_MSIX_VECTOR32_BAD)
1530                ndev->db_link_mask |= BIT_ULL(31);
1531
1532        switch (ndev->ntb.topo) {
1533        case NTB_TOPO_B2B_USD:
1534        case NTB_TOPO_B2B_DSD:
1535                ndev->self_reg = &skx_pri_reg;
1536                ndev->peer_reg = &skx_b2b_reg;
1537                ndev->xlat_reg = &skx_sec_xlat;
1538
1539                if (ndev->ntb.topo == NTB_TOPO_B2B_USD) {
1540                        rc = skx_setup_b2b_mw(ndev,
1541                                              &xeon_b2b_dsd_addr,
1542                                              &xeon_b2b_usd_addr);
1543                } else {
1544                        rc = skx_setup_b2b_mw(ndev,
1545                                              &xeon_b2b_usd_addr,
1546                                              &xeon_b2b_dsd_addr);
1547                }
1548
1549                if (rc)
1550                        return rc;
1551
1552                /* Enable Bus Master and Memory Space on the secondary side */
1553                iowrite16(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER,
1554                          ndev->self_mmio + SKX_SPCICMD_OFFSET);
1555
1556                break;
1557
1558        default:
1559                return -EINVAL;
1560        }
1561
1562        ndev->db_valid_mask = BIT_ULL(ndev->db_count) - 1;
1563
1564        ndev->reg->db_iowrite(ndev->db_valid_mask,
1565                              ndev->self_mmio +
1566                              ndev->self_reg->db_mask);
1567
1568        return 0;
1569}
1570
1571static int skx_init_dev(struct intel_ntb_dev *ndev)
1572{
1573        struct pci_dev *pdev;
1574        u8 ppd;
1575        int rc;
1576
1577        pdev = ndev->ntb.pdev;
1578
1579        ndev->reg = &skx_reg;
1580
1581        rc = pci_read_config_byte(pdev, XEON_PPD_OFFSET, &ppd);
1582        if (rc)
1583                return -EIO;
1584
1585        ndev->ntb.topo = xeon_ppd_topo(ndev, ppd);
1586        dev_dbg(&pdev->dev, "ppd %#x topo %s\n", ppd,
1587                ntb_topo_string(ndev->ntb.topo));
1588        if (ndev->ntb.topo == NTB_TOPO_NONE)
1589                return -EINVAL;
1590
1591        if (pdev_is_skx_xeon(pdev))
1592                ndev->hwerr_flags |= NTB_HWERR_MSIX_VECTOR32_BAD;
1593
1594        rc = skx_init_ntb(ndev);
1595        if (rc)
1596                return rc;
1597
1598        return skx_init_isr(ndev);
1599}
1600
1601static int intel_ntb3_link_enable(struct ntb_dev *ntb,
1602                                  enum ntb_speed max_speed,
1603                                  enum ntb_width max_width)
1604{
1605        struct intel_ntb_dev *ndev;
1606        u32 ntb_ctl;
1607
1608        ndev = container_of(ntb, struct intel_ntb_dev, ntb);
1609
1610        dev_dbg(&ntb->pdev->dev,
1611                "Enabling link with max_speed %d max_width %d\n",
1612                max_speed, max_width);
1613
1614        if (max_speed != NTB_SPEED_AUTO)
1615                dev_dbg(&ntb->pdev->dev, "ignoring max_speed %d\n", max_speed);
1616        if (max_width != NTB_WIDTH_AUTO)
1617                dev_dbg(&ntb->pdev->dev, "ignoring max_width %d\n", max_width);
1618
1619        ntb_ctl = ioread32(ndev->self_mmio + ndev->reg->ntb_ctl);
1620        ntb_ctl &= ~(NTB_CTL_DISABLE | NTB_CTL_CFG_LOCK);
1621        ntb_ctl |= NTB_CTL_P2S_BAR2_SNOOP | NTB_CTL_S2P_BAR2_SNOOP;
1622        ntb_ctl |= NTB_CTL_P2S_BAR4_SNOOP | NTB_CTL_S2P_BAR4_SNOOP;
1623        iowrite32(ntb_ctl, ndev->self_mmio + ndev->reg->ntb_ctl);
1624
1625        return 0;
1626}
1627static int intel_ntb3_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
1628                                   dma_addr_t addr, resource_size_t size)
1629{
1630        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1631        unsigned long xlat_reg, limit_reg;
1632        resource_size_t bar_size, mw_size;
1633        void __iomem *mmio;
1634        u64 base, limit, reg_val;
1635        int bar;
1636
1637        if (pidx != NTB_DEF_PEER_IDX)
1638                return -EINVAL;
1639
1640        if (idx >= ndev->b2b_idx && !ndev->b2b_off)
1641                idx += 1;
1642
1643        bar = ndev_mw_to_bar(ndev, idx);
1644        if (bar < 0)
1645                return bar;
1646
1647        bar_size = pci_resource_len(ndev->ntb.pdev, bar);
1648
1649        if (idx == ndev->b2b_idx)
1650                mw_size = bar_size - ndev->b2b_off;
1651        else
1652                mw_size = bar_size;
1653
1654        /* hardware requires that addr is aligned to bar size */
1655        if (addr & (bar_size - 1))
1656                return -EINVAL;
1657
1658        /* make sure the range fits in the usable mw size */
1659        if (size > mw_size)
1660                return -EINVAL;
1661
1662        mmio = ndev->self_mmio;
1663        xlat_reg = ndev->xlat_reg->bar2_xlat + (idx * 0x10);
1664        limit_reg = ndev->xlat_reg->bar2_limit + (idx * 0x10);
1665        base = pci_resource_start(ndev->ntb.pdev, bar);
1666
1667        /* Set the limit if supported, if size is not mw_size */
1668        if (limit_reg && size != mw_size)
1669                limit = base + size;
1670        else
1671                limit = base + mw_size;
1672
1673        /* set and verify setting the translation address */
1674        iowrite64(addr, mmio + xlat_reg);
1675        reg_val = ioread64(mmio + xlat_reg);
1676        if (reg_val != addr) {
1677                iowrite64(0, mmio + xlat_reg);
1678                return -EIO;
1679        }
1680
1681        dev_dbg(&ntb->pdev->dev, "BAR %d IMBARXBASE: %#Lx\n", bar, reg_val);
1682
1683        /* set and verify setting the limit */
1684        iowrite64(limit, mmio + limit_reg);
1685        reg_val = ioread64(mmio + limit_reg);
1686        if (reg_val != limit) {
1687                iowrite64(base, mmio + limit_reg);
1688                iowrite64(0, mmio + xlat_reg);
1689                return -EIO;
1690        }
1691
1692        dev_dbg(&ntb->pdev->dev, "BAR %d IMBARXLMT: %#Lx\n", bar, reg_val);
1693
1694        /* setup the EP */
1695        limit_reg = ndev->xlat_reg->bar2_limit + (idx * 0x10) + 0x4000;
1696        base = ioread64(mmio + SKX_EMBAR1_OFFSET + (8 * idx));
1697        base &= ~0xf;
1698
1699        if (limit_reg && size != mw_size)
1700                limit = base + size;
1701        else
1702                limit = base + mw_size;
1703
1704        /* set and verify setting the limit */
1705        iowrite64(limit, mmio + limit_reg);
1706        reg_val = ioread64(mmio + limit_reg);
1707        if (reg_val != limit) {
1708                iowrite64(base, mmio + limit_reg);
1709                iowrite64(0, mmio + xlat_reg);
1710                return -EIO;
1711        }
1712
1713        dev_dbg(&ntb->pdev->dev, "BAR %d EMBARXLMT: %#Lx\n", bar, reg_val);
1714
1715        return 0;
1716}
1717
1718static int intel_ntb3_peer_db_set(struct ntb_dev *ntb, u64 db_bits)
1719{
1720        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1721        int bit;
1722
1723        if (db_bits & ~ndev->db_valid_mask)
1724                return -EINVAL;
1725
1726        while (db_bits) {
1727                bit = __ffs(db_bits);
1728                iowrite32(1, ndev->peer_mmio +
1729                                ndev->peer_reg->db_bell + (bit * 4));
1730                db_bits &= db_bits - 1;
1731        }
1732
1733        return 0;
1734}
1735
1736static u64 intel_ntb3_db_read(struct ntb_dev *ntb)
1737{
1738        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1739
1740        return ndev_db_read(ndev,
1741                            ndev->self_mmio +
1742                            ndev->self_reg->db_clear);
1743}
1744
1745static int intel_ntb3_db_clear(struct ntb_dev *ntb, u64 db_bits)
1746{
1747        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
1748
1749        return ndev_db_write(ndev, db_bits,
1750                             ndev->self_mmio +
1751                             ndev->self_reg->db_clear);
1752}
1753
1754/* XEON */
1755
1756static u64 xeon_db_ioread(void __iomem *mmio)
1757{
1758        return (u64)ioread16(mmio);
1759}
1760
1761static void xeon_db_iowrite(u64 bits, void __iomem *mmio)
1762{
1763        iowrite16((u16)bits, mmio);
1764}
1765
1766static int xeon_poll_link(struct intel_ntb_dev *ndev)
1767{
1768        u16 reg_val;
1769        int rc;
1770
1771        ndev->reg->db_iowrite(ndev->db_link_mask,
1772                              ndev->self_mmio +
1773                              ndev->self_reg->db_bell);
1774
1775        rc = pci_read_config_word(ndev->ntb.pdev,
1776                                  XEON_LINK_STATUS_OFFSET, &reg_val);
1777        if (rc)
1778                return 0;
1779
1780        if (reg_val == ndev->lnk_sta)
1781                return 0;
1782
1783        ndev->lnk_sta = reg_val;
1784
1785        return 1;
1786}
1787
1788static int xeon_link_is_up(struct intel_ntb_dev *ndev)
1789{
1790        if (ndev->ntb.topo == NTB_TOPO_SEC)
1791                return 1;
1792
1793        return NTB_LNK_STA_ACTIVE(ndev->lnk_sta);
1794}
1795
1796static inline enum ntb_topo xeon_ppd_topo(struct intel_ntb_dev *ndev, u8 ppd)
1797{
1798        switch (ppd & XEON_PPD_TOPO_MASK) {
1799        case XEON_PPD_TOPO_B2B_USD:
1800                return NTB_TOPO_B2B_USD;
1801
1802        case XEON_PPD_TOPO_B2B_DSD:
1803                return NTB_TOPO_B2B_DSD;
1804
1805        case XEON_PPD_TOPO_PRI_USD:
1806        case XEON_PPD_TOPO_PRI_DSD: /* accept bogus PRI_DSD */
1807                return NTB_TOPO_PRI;
1808
1809        case XEON_PPD_TOPO_SEC_USD:
1810        case XEON_PPD_TOPO_SEC_DSD: /* accept bogus SEC_DSD */
1811                return NTB_TOPO_SEC;
1812        }
1813
1814        return NTB_TOPO_NONE;
1815}
1816
1817static inline int xeon_ppd_bar4_split(struct intel_ntb_dev *ndev, u8 ppd)
1818{
1819        if (ppd & XEON_PPD_SPLIT_BAR_MASK) {
1820                dev_dbg(&ndev->ntb.pdev->dev, "PPD %d split bar\n", ppd);
1821                return 1;
1822        }
1823        return 0;
1824}
1825
1826static int xeon_init_isr(struct intel_ntb_dev *ndev)
1827{
1828        return ndev_init_isr(ndev, XEON_DB_MSIX_VECTOR_COUNT,
1829                             XEON_DB_MSIX_VECTOR_COUNT,
1830                             XEON_DB_MSIX_VECTOR_SHIFT,
1831                             XEON_DB_TOTAL_SHIFT);
1832}
1833
1834static void xeon_deinit_isr(struct intel_ntb_dev *ndev)
1835{
1836        ndev_deinit_isr(ndev);
1837}
1838
1839static int xeon_setup_b2b_mw(struct intel_ntb_dev *ndev,
1840                             const struct intel_b2b_addr *addr,
1841                             const struct intel_b2b_addr *peer_addr)
1842{
1843        struct pci_dev *pdev;
1844        void __iomem *mmio;
1845        resource_size_t bar_size;
1846        phys_addr_t bar_addr;
1847        int b2b_bar;
1848        u8 bar_sz;
1849
1850        pdev = ndev->ntb.pdev;
1851        mmio = ndev->self_mmio;
1852
1853        if (ndev->b2b_idx == UINT_MAX) {
1854                dev_dbg(&pdev->dev, "not using b2b mw\n");
1855                b2b_bar = 0;
1856                ndev->b2b_off = 0;
1857        } else {
1858                b2b_bar = ndev_mw_to_bar(ndev, ndev->b2b_idx);
1859                if (b2b_bar < 0)
1860                        return -EIO;
1861
1862                dev_dbg(&pdev->dev, "using b2b mw bar %d\n", b2b_bar);
1863
1864                bar_size = pci_resource_len(ndev->ntb.pdev, b2b_bar);
1865
1866                dev_dbg(&pdev->dev, "b2b bar size %#llx\n", bar_size);
1867
1868                if (b2b_mw_share && XEON_B2B_MIN_SIZE <= bar_size >> 1) {
1869                        dev_dbg(&pdev->dev, "b2b using first half of bar\n");
1870                        ndev->b2b_off = bar_size >> 1;
1871                } else if (XEON_B2B_MIN_SIZE <= bar_size) {
1872                        dev_dbg(&pdev->dev, "b2b using whole bar\n");
1873                        ndev->b2b_off = 0;
1874                        --ndev->mw_count;
1875                } else {
1876                        dev_dbg(&pdev->dev, "b2b bar size is too small\n");
1877                        return -EIO;
1878                }
1879        }
1880
1881        /* Reset the secondary bar sizes to match the primary bar sizes,
1882         * except disable or halve the size of the b2b secondary bar.
1883         *
1884         * Note: code for each specific bar size register, because the register
1885         * offsets are not in a consistent order (bar5sz comes after ppd, odd).
1886         */
1887        pci_read_config_byte(pdev, XEON_PBAR23SZ_OFFSET, &bar_sz);
1888        dev_dbg(&pdev->dev, "PBAR23SZ %#x\n", bar_sz);
1889        if (b2b_bar == 2) {
1890                if (ndev->b2b_off)
1891                        bar_sz -= 1;
1892                else
1893                        bar_sz = 0;
1894        }
1895        pci_write_config_byte(pdev, XEON_SBAR23SZ_OFFSET, bar_sz);
1896        pci_read_config_byte(pdev, XEON_SBAR23SZ_OFFSET, &bar_sz);
1897        dev_dbg(&pdev->dev, "SBAR23SZ %#x\n", bar_sz);
1898
1899        if (!ndev->bar4_split) {
1900                pci_read_config_byte(pdev, XEON_PBAR45SZ_OFFSET, &bar_sz);
1901                dev_dbg(&pdev->dev, "PBAR45SZ %#x\n", bar_sz);
1902                if (b2b_bar == 4) {
1903                        if (ndev->b2b_off)
1904                                bar_sz -= 1;
1905                        else
1906                                bar_sz = 0;
1907                }
1908                pci_write_config_byte(pdev, XEON_SBAR45SZ_OFFSET, bar_sz);
1909                pci_read_config_byte(pdev, XEON_SBAR45SZ_OFFSET, &bar_sz);
1910                dev_dbg(&pdev->dev, "SBAR45SZ %#x\n", bar_sz);
1911        } else {
1912                pci_read_config_byte(pdev, XEON_PBAR4SZ_OFFSET, &bar_sz);
1913                dev_dbg(&pdev->dev, "PBAR4SZ %#x\n", bar_sz);
1914                if (b2b_bar == 4) {
1915                        if (ndev->b2b_off)
1916                                bar_sz -= 1;
1917                        else
1918                                bar_sz = 0;
1919                }
1920                pci_write_config_byte(pdev, XEON_SBAR4SZ_OFFSET, bar_sz);
1921                pci_read_config_byte(pdev, XEON_SBAR4SZ_OFFSET, &bar_sz);
1922                dev_dbg(&pdev->dev, "SBAR4SZ %#x\n", bar_sz);
1923
1924                pci_read_config_byte(pdev, XEON_PBAR5SZ_OFFSET, &bar_sz);
1925                dev_dbg(&pdev->dev, "PBAR5SZ %#x\n", bar_sz);
1926                if (b2b_bar == 5) {
1927                        if (ndev->b2b_off)
1928                                bar_sz -= 1;
1929                        else
1930                                bar_sz = 0;
1931                }
1932                pci_write_config_byte(pdev, XEON_SBAR5SZ_OFFSET, bar_sz);
1933                pci_read_config_byte(pdev, XEON_SBAR5SZ_OFFSET, &bar_sz);
1934                dev_dbg(&pdev->dev, "SBAR5SZ %#x\n", bar_sz);
1935        }
1936
1937        /* SBAR01 hit by first part of the b2b bar */
1938        if (b2b_bar == 0)
1939                bar_addr = addr->bar0_addr;
1940        else if (b2b_bar == 2)
1941                bar_addr = addr->bar2_addr64;
1942        else if (b2b_bar == 4 && !ndev->bar4_split)
1943                bar_addr = addr->bar4_addr64;
1944        else if (b2b_bar == 4)
1945                bar_addr = addr->bar4_addr32;
1946        else if (b2b_bar == 5)
1947                bar_addr = addr->bar5_addr32;
1948        else
1949                return -EIO;
1950
1951        dev_dbg(&pdev->dev, "SBAR01 %#018llx\n", bar_addr);
1952        iowrite64(bar_addr, mmio + XEON_SBAR0BASE_OFFSET);
1953
1954        /* Other SBAR are normally hit by the PBAR xlat, except for b2b bar.
1955         * The b2b bar is either disabled above, or configured half-size, and
1956         * it starts at the PBAR xlat + offset.
1957         */
1958
1959        bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
1960        iowrite64(bar_addr, mmio + XEON_SBAR23BASE_OFFSET);
1961        bar_addr = ioread64(mmio + XEON_SBAR23BASE_OFFSET);
1962        dev_dbg(&pdev->dev, "SBAR23 %#018llx\n", bar_addr);
1963
1964        if (!ndev->bar4_split) {
1965                bar_addr = addr->bar4_addr64 +
1966                        (b2b_bar == 4 ? ndev->b2b_off : 0);
1967                iowrite64(bar_addr, mmio + XEON_SBAR45BASE_OFFSET);
1968                bar_addr = ioread64(mmio + XEON_SBAR45BASE_OFFSET);
1969                dev_dbg(&pdev->dev, "SBAR45 %#018llx\n", bar_addr);
1970        } else {
1971                bar_addr = addr->bar4_addr32 +
1972                        (b2b_bar == 4 ? ndev->b2b_off : 0);
1973                iowrite32(bar_addr, mmio + XEON_SBAR4BASE_OFFSET);
1974                bar_addr = ioread32(mmio + XEON_SBAR4BASE_OFFSET);
1975                dev_dbg(&pdev->dev, "SBAR4 %#010llx\n", bar_addr);
1976
1977                bar_addr = addr->bar5_addr32 +
1978                        (b2b_bar == 5 ? ndev->b2b_off : 0);
1979                iowrite32(bar_addr, mmio + XEON_SBAR5BASE_OFFSET);
1980                bar_addr = ioread32(mmio + XEON_SBAR5BASE_OFFSET);
1981                dev_dbg(&pdev->dev, "SBAR5 %#010llx\n", bar_addr);
1982        }
1983
1984        /* setup incoming bar limits == base addrs (zero length windows) */
1985
1986        bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
1987        iowrite64(bar_addr, mmio + XEON_SBAR23LMT_OFFSET);
1988        bar_addr = ioread64(mmio + XEON_SBAR23LMT_OFFSET);
1989        dev_dbg(&pdev->dev, "SBAR23LMT %#018llx\n", bar_addr);
1990
1991        if (!ndev->bar4_split) {
1992                bar_addr = addr->bar4_addr64 +
1993                        (b2b_bar == 4 ? ndev->b2b_off : 0);
1994                iowrite64(bar_addr, mmio + XEON_SBAR45LMT_OFFSET);
1995                bar_addr = ioread64(mmio + XEON_SBAR45LMT_OFFSET);
1996                dev_dbg(&pdev->dev, "SBAR45LMT %#018llx\n", bar_addr);
1997        } else {
1998                bar_addr = addr->bar4_addr32 +
1999                        (b2b_bar == 4 ? ndev->b2b_off : 0);
2000                iowrite32(bar_addr, mmio + XEON_SBAR4LMT_OFFSET);
2001                bar_addr = ioread32(mmio + XEON_SBAR4LMT_OFFSET);
2002                dev_dbg(&pdev->dev, "SBAR4LMT %#010llx\n", bar_addr);
2003
2004                bar_addr = addr->bar5_addr32 +
2005                        (b2b_bar == 5 ? ndev->b2b_off : 0);
2006                iowrite32(bar_addr, mmio + XEON_SBAR5LMT_OFFSET);
2007                bar_addr = ioread32(mmio + XEON_SBAR5LMT_OFFSET);
2008                dev_dbg(&pdev->dev, "SBAR5LMT %#05llx\n", bar_addr);
2009        }
2010
2011        /* zero incoming translation addrs */
2012        iowrite64(0, mmio + XEON_SBAR23XLAT_OFFSET);
2013
2014        if (!ndev->bar4_split) {
2015                iowrite64(0, mmio + XEON_SBAR45XLAT_OFFSET);
2016        } else {
2017                iowrite32(0, mmio + XEON_SBAR4XLAT_OFFSET);
2018                iowrite32(0, mmio + XEON_SBAR5XLAT_OFFSET);
2019        }
2020
2021        /* zero outgoing translation limits (whole bar size windows) */
2022        iowrite64(0, mmio + XEON_PBAR23LMT_OFFSET);
2023        if (!ndev->bar4_split) {
2024                iowrite64(0, mmio + XEON_PBAR45LMT_OFFSET);
2025        } else {
2026                iowrite32(0, mmio + XEON_PBAR4LMT_OFFSET);
2027                iowrite32(0, mmio + XEON_PBAR5LMT_OFFSET);
2028        }
2029
2030        /* set outgoing translation offsets */
2031        bar_addr = peer_addr->bar2_addr64;
2032        iowrite64(bar_addr, mmio + XEON_PBAR23XLAT_OFFSET);
2033        bar_addr = ioread64(mmio + XEON_PBAR23XLAT_OFFSET);
2034        dev_dbg(&pdev->dev, "PBAR23XLAT %#018llx\n", bar_addr);
2035
2036        if (!ndev->bar4_split) {
2037                bar_addr = peer_addr->bar4_addr64;
2038                iowrite64(bar_addr, mmio + XEON_PBAR45XLAT_OFFSET);
2039                bar_addr = ioread64(mmio + XEON_PBAR45XLAT_OFFSET);
2040                dev_dbg(&pdev->dev, "PBAR45XLAT %#018llx\n", bar_addr);
2041        } else {
2042                bar_addr = peer_addr->bar4_addr32;
2043                iowrite32(bar_addr, mmio + XEON_PBAR4XLAT_OFFSET);
2044                bar_addr = ioread32(mmio + XEON_PBAR4XLAT_OFFSET);
2045                dev_dbg(&pdev->dev, "PBAR4XLAT %#010llx\n", bar_addr);
2046
2047                bar_addr = peer_addr->bar5_addr32;
2048                iowrite32(bar_addr, mmio + XEON_PBAR5XLAT_OFFSET);
2049                bar_addr = ioread32(mmio + XEON_PBAR5XLAT_OFFSET);
2050                dev_dbg(&pdev->dev, "PBAR5XLAT %#010llx\n", bar_addr);
2051        }
2052
2053        /* set the translation offset for b2b registers */
2054        if (b2b_bar == 0)
2055                bar_addr = peer_addr->bar0_addr;
2056        else if (b2b_bar == 2)
2057                bar_addr = peer_addr->bar2_addr64;
2058        else if (b2b_bar == 4 && !ndev->bar4_split)
2059                bar_addr = peer_addr->bar4_addr64;
2060        else if (b2b_bar == 4)
2061                bar_addr = peer_addr->bar4_addr32;
2062        else if (b2b_bar == 5)
2063                bar_addr = peer_addr->bar5_addr32;
2064        else
2065                return -EIO;
2066
2067        /* B2B_XLAT_OFFSET is 64bit, but can only take 32bit writes */
2068        dev_dbg(&pdev->dev, "B2BXLAT %#018llx\n", bar_addr);
2069        iowrite32(bar_addr, mmio + XEON_B2B_XLAT_OFFSETL);
2070        iowrite32(bar_addr >> 32, mmio + XEON_B2B_XLAT_OFFSETU);
2071
2072        if (b2b_bar) {
2073                /* map peer ntb mmio config space registers */
2074                ndev->peer_mmio = pci_iomap(pdev, b2b_bar,
2075                                            XEON_B2B_MIN_SIZE);
2076                if (!ndev->peer_mmio)
2077                        return -EIO;
2078
2079                ndev->peer_addr = pci_resource_start(pdev, b2b_bar);
2080        }
2081
2082        return 0;
2083}
2084
2085static int xeon_init_ntb(struct intel_ntb_dev *ndev)
2086{
2087        struct device *dev = &ndev->ntb.pdev->dev;
2088        int rc;
2089        u32 ntb_ctl;
2090
2091        if (ndev->bar4_split)
2092                ndev->mw_count = HSX_SPLIT_BAR_MW_COUNT;
2093        else
2094                ndev->mw_count = XEON_MW_COUNT;
2095
2096        ndev->spad_count = XEON_SPAD_COUNT;
2097        ndev->db_count = XEON_DB_COUNT;
2098        ndev->db_link_mask = XEON_DB_LINK_BIT;
2099
2100        switch (ndev->ntb.topo) {
2101        case NTB_TOPO_PRI:
2102                if (ndev->hwerr_flags & NTB_HWERR_SDOORBELL_LOCKUP) {
2103                        dev_err(dev, "NTB Primary config disabled\n");
2104                        return -EINVAL;
2105                }
2106
2107                /* enable link to allow secondary side device to appear */
2108                ntb_ctl = ioread32(ndev->self_mmio + ndev->reg->ntb_ctl);
2109                ntb_ctl &= ~NTB_CTL_DISABLE;
2110                iowrite32(ntb_ctl, ndev->self_mmio + ndev->reg->ntb_ctl);
2111
2112                /* use half the spads for the peer */
2113                ndev->spad_count >>= 1;
2114                ndev->self_reg = &xeon_pri_reg;
2115                ndev->peer_reg = &xeon_sec_reg;
2116                ndev->xlat_reg = &xeon_sec_xlat;
2117                break;
2118
2119        case NTB_TOPO_SEC:
2120                if (ndev->hwerr_flags & NTB_HWERR_SDOORBELL_LOCKUP) {
2121                        dev_err(dev, "NTB Secondary config disabled\n");
2122                        return -EINVAL;
2123                }
2124                /* use half the spads for the peer */
2125                ndev->spad_count >>= 1;
2126                ndev->self_reg = &xeon_sec_reg;
2127                ndev->peer_reg = &xeon_pri_reg;
2128                ndev->xlat_reg = &xeon_pri_xlat;
2129                break;
2130
2131        case NTB_TOPO_B2B_USD:
2132        case NTB_TOPO_B2B_DSD:
2133                ndev->self_reg = &xeon_pri_reg;
2134                ndev->peer_reg = &xeon_b2b_reg;
2135                ndev->xlat_reg = &xeon_sec_xlat;
2136
2137                if (ndev->hwerr_flags & NTB_HWERR_SDOORBELL_LOCKUP) {
2138                        ndev->peer_reg = &xeon_pri_reg;
2139
2140                        if (b2b_mw_idx < 0)
2141                                ndev->b2b_idx = b2b_mw_idx + ndev->mw_count;
2142                        else
2143                                ndev->b2b_idx = b2b_mw_idx;
2144
2145                        if (ndev->b2b_idx >= ndev->mw_count) {
2146                                dev_dbg(dev,
2147                                        "b2b_mw_idx %d invalid for mw_count %u\n",
2148                                        b2b_mw_idx, ndev->mw_count);
2149                                return -EINVAL;
2150                        }
2151
2152                        dev_dbg(dev, "setting up b2b mw idx %d means %d\n",
2153                                b2b_mw_idx, ndev->b2b_idx);
2154
2155                } else if (ndev->hwerr_flags & NTB_HWERR_B2BDOORBELL_BIT14) {
2156                        dev_warn(dev, "Reduce doorbell count by 1\n");
2157                        ndev->db_count -= 1;
2158                }
2159
2160                if (ndev->ntb.topo == NTB_TOPO_B2B_USD) {
2161                        rc = xeon_setup_b2b_mw(ndev,
2162                                               &xeon_b2b_dsd_addr,
2163                                               &xeon_b2b_usd_addr);
2164                } else {
2165                        rc = xeon_setup_b2b_mw(ndev,
2166                                               &xeon_b2b_usd_addr,
2167                                               &xeon_b2b_dsd_addr);
2168                }
2169                if (rc)
2170                        return rc;
2171
2172                /* Enable Bus Master and Memory Space on the secondary side */
2173                iowrite16(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER,
2174                          ndev->self_mmio + XEON_SPCICMD_OFFSET);
2175
2176                break;
2177
2178        default:
2179                return -EINVAL;
2180        }
2181
2182        ndev->db_valid_mask = BIT_ULL(ndev->db_count) - 1;
2183
2184        ndev->reg->db_iowrite(ndev->db_valid_mask,
2185                              ndev->self_mmio +
2186                              ndev->self_reg->db_mask);
2187
2188        return 0;
2189}
2190
2191static int xeon_init_dev(struct intel_ntb_dev *ndev)
2192{
2193        struct pci_dev *pdev;
2194        u8 ppd;
2195        int rc, mem;
2196
2197        pdev = ndev->ntb.pdev;
2198
2199        switch (pdev->device) {
2200        /* There is a Xeon hardware errata related to writes to SDOORBELL or
2201         * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space,
2202         * which may hang the system.  To workaround this use the second memory
2203         * window to access the interrupt and scratch pad registers on the
2204         * remote system.
2205         */
2206        case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
2207        case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
2208        case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
2209        case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
2210        case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
2211        case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
2212        case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
2213        case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
2214        case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
2215        case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
2216        case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
2217        case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
2218        case PCI_DEVICE_ID_INTEL_NTB_SS_BDX:
2219        case PCI_DEVICE_ID_INTEL_NTB_PS_BDX:
2220        case PCI_DEVICE_ID_INTEL_NTB_B2B_BDX:
2221                ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
2222                break;
2223        }
2224
2225        switch (pdev->device) {
2226        /* There is a hardware errata related to accessing any register in
2227         * SB01BASE in the presence of bidirectional traffic crossing the NTB.
2228         */
2229        case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
2230        case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
2231        case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
2232        case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
2233        case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
2234        case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
2235        case PCI_DEVICE_ID_INTEL_NTB_SS_BDX:
2236        case PCI_DEVICE_ID_INTEL_NTB_PS_BDX:
2237        case PCI_DEVICE_ID_INTEL_NTB_B2B_BDX:
2238                ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
2239                break;
2240        }
2241
2242        switch (pdev->device) {
2243        /* HW Errata on bit 14 of b2bdoorbell register.  Writes will not be
2244         * mirrored to the remote system.  Shrink the number of bits by one,
2245         * since bit 14 is the last bit.
2246         */
2247        case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
2248        case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
2249        case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
2250        case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
2251        case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
2252        case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
2253        case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
2254        case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
2255        case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
2256        case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
2257        case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
2258        case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
2259        case PCI_DEVICE_ID_INTEL_NTB_SS_BDX:
2260        case PCI_DEVICE_ID_INTEL_NTB_PS_BDX:
2261        case PCI_DEVICE_ID_INTEL_NTB_B2B_BDX:
2262                ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
2263                break;
2264        }
2265
2266        ndev->reg = &xeon_reg;
2267
2268        rc = pci_read_config_byte(pdev, XEON_PPD_OFFSET, &ppd);
2269        if (rc)
2270                return -EIO;
2271
2272        ndev->ntb.topo = xeon_ppd_topo(ndev, ppd);
2273        dev_dbg(&pdev->dev, "ppd %#x topo %s\n", ppd,
2274                ntb_topo_string(ndev->ntb.topo));
2275        if (ndev->ntb.topo == NTB_TOPO_NONE)
2276                return -EINVAL;
2277
2278        if (ndev->ntb.topo != NTB_TOPO_SEC) {
2279                ndev->bar4_split = xeon_ppd_bar4_split(ndev, ppd);
2280                dev_dbg(&pdev->dev, "ppd %#x bar4_split %d\n",
2281                        ppd, ndev->bar4_split);
2282        } else {
2283                /* This is a way for transparent BAR to figure out if we are
2284                 * doing split BAR or not. There is no way for the hw on the
2285                 * transparent side to know and set the PPD.
2286                 */
2287                mem = pci_select_bars(pdev, IORESOURCE_MEM);
2288                ndev->bar4_split = hweight32(mem) ==
2289                        HSX_SPLIT_BAR_MW_COUNT + 1;
2290                dev_dbg(&pdev->dev, "mem %#x bar4_split %d\n",
2291                        mem, ndev->bar4_split);
2292        }
2293
2294        rc = xeon_init_ntb(ndev);
2295        if (rc)
2296                return rc;
2297
2298        return xeon_init_isr(ndev);
2299}
2300
2301static void xeon_deinit_dev(struct intel_ntb_dev *ndev)
2302{
2303        xeon_deinit_isr(ndev);
2304}
2305
2306static int intel_ntb_init_pci(struct intel_ntb_dev *ndev, struct pci_dev *pdev)
2307{
2308        int rc;
2309
2310        pci_set_drvdata(pdev, ndev);
2311
2312        rc = pci_enable_device(pdev);
2313        if (rc)
2314                goto err_pci_enable;
2315
2316        rc = pci_request_regions(pdev, NTB_NAME);
2317        if (rc)
2318                goto err_pci_regions;
2319
2320        pci_set_master(pdev);
2321
2322        rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
2323        if (rc) {
2324                rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2325                if (rc)
2326                        goto err_dma_mask;
2327                dev_warn(&pdev->dev, "Cannot DMA highmem\n");
2328        }
2329
2330        rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
2331        if (rc) {
2332                rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2333                if (rc)
2334                        goto err_dma_mask;
2335                dev_warn(&pdev->dev, "Cannot DMA consistent highmem\n");
2336        }
2337        rc = dma_coerce_mask_and_coherent(&ndev->ntb.dev,
2338                                          dma_get_mask(&pdev->dev));
2339        if (rc)
2340                goto err_dma_mask;
2341
2342        ndev->self_mmio = pci_iomap(pdev, 0, 0);
2343        if (!ndev->self_mmio) {
2344                rc = -EIO;
2345                goto err_mmio;
2346        }
2347        ndev->peer_mmio = ndev->self_mmio;
2348        ndev->peer_addr = pci_resource_start(pdev, 0);
2349
2350        return 0;
2351
2352err_mmio:
2353err_dma_mask:
2354        pci_clear_master(pdev);
2355        pci_release_regions(pdev);
2356err_pci_regions:
2357        pci_disable_device(pdev);
2358err_pci_enable:
2359        pci_set_drvdata(pdev, NULL);
2360        return rc;
2361}
2362
2363static void intel_ntb_deinit_pci(struct intel_ntb_dev *ndev)
2364{
2365        struct pci_dev *pdev = ndev->ntb.pdev;
2366
2367        if (ndev->peer_mmio && ndev->peer_mmio != ndev->self_mmio)
2368                pci_iounmap(pdev, ndev->peer_mmio);
2369        pci_iounmap(pdev, ndev->self_mmio);
2370
2371        pci_clear_master(pdev);
2372        pci_release_regions(pdev);
2373        pci_disable_device(pdev);
2374        pci_set_drvdata(pdev, NULL);
2375}
2376
2377static inline void ndev_init_struct(struct intel_ntb_dev *ndev,
2378                                    struct pci_dev *pdev)
2379{
2380        ndev->ntb.pdev = pdev;
2381        ndev->ntb.topo = NTB_TOPO_NONE;
2382        ndev->ntb.ops = &intel_ntb_ops;
2383
2384        ndev->b2b_off = 0;
2385        ndev->b2b_idx = UINT_MAX;
2386
2387        ndev->bar4_split = 0;
2388
2389        ndev->mw_count = 0;
2390        ndev->spad_count = 0;
2391        ndev->db_count = 0;
2392        ndev->db_vec_count = 0;
2393        ndev->db_vec_shift = 0;
2394
2395        ndev->ntb_ctl = 0;
2396        ndev->lnk_sta = 0;
2397
2398        ndev->db_valid_mask = 0;
2399        ndev->db_link_mask = 0;
2400        ndev->db_mask = 0;
2401
2402        spin_lock_init(&ndev->db_mask_lock);
2403}
2404
2405static int intel_ntb_pci_probe(struct pci_dev *pdev,
2406                               const struct pci_device_id *id)
2407{
2408        struct intel_ntb_dev *ndev;
2409        int rc, node;
2410
2411        node = dev_to_node(&pdev->dev);
2412
2413        if (pdev_is_xeon(pdev)) {
2414                ndev = kzalloc_node(sizeof(*ndev), GFP_KERNEL, node);
2415                if (!ndev) {
2416                        rc = -ENOMEM;
2417                        goto err_ndev;
2418                }
2419
2420                ndev_init_struct(ndev, pdev);
2421
2422                rc = intel_ntb_init_pci(ndev, pdev);
2423                if (rc)
2424                        goto err_init_pci;
2425
2426                rc = xeon_init_dev(ndev);
2427                if (rc)
2428                        goto err_init_dev;
2429
2430        } else if (pdev_is_skx_xeon(pdev)) {
2431                ndev = kzalloc_node(sizeof(*ndev), GFP_KERNEL, node);
2432                if (!ndev) {
2433                        rc = -ENOMEM;
2434                        goto err_ndev;
2435                }
2436
2437                ndev_init_struct(ndev, pdev);
2438                ndev->ntb.ops = &intel_ntb3_ops;
2439
2440                rc = intel_ntb_init_pci(ndev, pdev);
2441                if (rc)
2442                        goto err_init_pci;
2443
2444                rc = skx_init_dev(ndev);
2445                if (rc)
2446                        goto err_init_dev;
2447
2448        } else {
2449                rc = -EINVAL;
2450                goto err_ndev;
2451        }
2452
2453        ndev_reset_unsafe_flags(ndev);
2454
2455        ndev->reg->poll_link(ndev);
2456
2457        ndev_init_debugfs(ndev);
2458
2459        rc = ntb_register_device(&ndev->ntb);
2460        if (rc)
2461                goto err_register;
2462
2463        dev_info(&pdev->dev, "NTB device registered.\n");
2464
2465        return 0;
2466
2467err_register:
2468        ndev_deinit_debugfs(ndev);
2469        if (pdev_is_xeon(pdev) || pdev_is_skx_xeon(pdev))
2470                xeon_deinit_dev(ndev);
2471err_init_dev:
2472        intel_ntb_deinit_pci(ndev);
2473err_init_pci:
2474        kfree(ndev);
2475err_ndev:
2476        return rc;
2477}
2478
2479static void intel_ntb_pci_remove(struct pci_dev *pdev)
2480{
2481        struct intel_ntb_dev *ndev = pci_get_drvdata(pdev);
2482
2483        ntb_unregister_device(&ndev->ntb);
2484        ndev_deinit_debugfs(ndev);
2485        if (pdev_is_xeon(pdev) || pdev_is_skx_xeon(pdev))
2486                xeon_deinit_dev(ndev);
2487        intel_ntb_deinit_pci(ndev);
2488        kfree(ndev);
2489}
2490
2491static const struct intel_ntb_reg xeon_reg = {
2492        .poll_link              = xeon_poll_link,
2493        .link_is_up             = xeon_link_is_up,
2494        .db_ioread              = xeon_db_ioread,
2495        .db_iowrite             = xeon_db_iowrite,
2496        .db_size                = sizeof(u32),
2497        .ntb_ctl                = XEON_NTBCNTL_OFFSET,
2498        .mw_bar                 = {2, 4, 5},
2499};
2500
2501static const struct intel_ntb_alt_reg xeon_pri_reg = {
2502        .db_bell                = XEON_PDOORBELL_OFFSET,
2503        .db_mask                = XEON_PDBMSK_OFFSET,
2504        .spad                   = XEON_SPAD_OFFSET,
2505};
2506
2507static const struct intel_ntb_alt_reg xeon_sec_reg = {
2508        .db_bell                = XEON_SDOORBELL_OFFSET,
2509        .db_mask                = XEON_SDBMSK_OFFSET,
2510        /* second half of the scratchpads */
2511        .spad                   = XEON_SPAD_OFFSET + (XEON_SPAD_COUNT << 1),
2512};
2513
2514static const struct intel_ntb_alt_reg xeon_b2b_reg = {
2515        .db_bell                = XEON_B2B_DOORBELL_OFFSET,
2516        .spad                   = XEON_B2B_SPAD_OFFSET,
2517};
2518
2519static const struct intel_ntb_xlat_reg xeon_pri_xlat = {
2520        /* Note: no primary .bar0_base visible to the secondary side.
2521         *
2522         * The secondary side cannot get the base address stored in primary
2523         * bars.  The base address is necessary to set the limit register to
2524         * any value other than zero, or unlimited.
2525         *
2526         * WITHOUT THE BASE ADDRESS, THE SECONDARY SIDE CANNOT DISABLE the
2527         * window by setting the limit equal to base, nor can it limit the size
2528         * of the memory window by setting the limit to base + size.
2529         */
2530        .bar2_limit             = XEON_PBAR23LMT_OFFSET,
2531        .bar2_xlat              = XEON_PBAR23XLAT_OFFSET,
2532};
2533
2534static const struct intel_ntb_xlat_reg xeon_sec_xlat = {
2535        .bar0_base              = XEON_SBAR0BASE_OFFSET,
2536        .bar2_limit             = XEON_SBAR23LMT_OFFSET,
2537        .bar2_xlat              = XEON_SBAR23XLAT_OFFSET,
2538};
2539
2540static struct intel_b2b_addr xeon_b2b_usd_addr = {
2541        .bar2_addr64            = XEON_B2B_BAR2_ADDR64,
2542        .bar4_addr64            = XEON_B2B_BAR4_ADDR64,
2543        .bar4_addr32            = XEON_B2B_BAR4_ADDR32,
2544        .bar5_addr32            = XEON_B2B_BAR5_ADDR32,
2545};
2546
2547static struct intel_b2b_addr xeon_b2b_dsd_addr = {
2548        .bar2_addr64            = XEON_B2B_BAR2_ADDR64,
2549        .bar4_addr64            = XEON_B2B_BAR4_ADDR64,
2550        .bar4_addr32            = XEON_B2B_BAR4_ADDR32,
2551        .bar5_addr32            = XEON_B2B_BAR5_ADDR32,
2552};
2553
2554static const struct intel_ntb_reg skx_reg = {
2555        .poll_link              = skx_poll_link,
2556        .link_is_up             = xeon_link_is_up,
2557        .db_ioread              = skx_db_ioread,
2558        .db_iowrite             = skx_db_iowrite,
2559        .db_size                = sizeof(u32),
2560        .ntb_ctl                = SKX_NTBCNTL_OFFSET,
2561        .mw_bar                 = {2, 4},
2562};
2563
2564static const struct intel_ntb_alt_reg skx_pri_reg = {
2565        .db_bell                = SKX_EM_DOORBELL_OFFSET,
2566        .db_clear               = SKX_IM_INT_STATUS_OFFSET,
2567        .db_mask                = SKX_IM_INT_DISABLE_OFFSET,
2568        .spad                   = SKX_IM_SPAD_OFFSET,
2569};
2570
2571static const struct intel_ntb_alt_reg skx_b2b_reg = {
2572        .db_bell                = SKX_IM_DOORBELL_OFFSET,
2573        .db_clear               = SKX_EM_INT_STATUS_OFFSET,
2574        .db_mask                = SKX_EM_INT_DISABLE_OFFSET,
2575        .spad                   = SKX_B2B_SPAD_OFFSET,
2576};
2577
2578static const struct intel_ntb_xlat_reg skx_sec_xlat = {
2579/*      .bar0_base              = SKX_EMBAR0_OFFSET, */
2580        .bar2_limit             = SKX_IMBAR1XLMT_OFFSET,
2581        .bar2_xlat              = SKX_IMBAR1XBASE_OFFSET,
2582};
2583
2584/* operations for primary side of local ntb */
2585static const struct ntb_dev_ops intel_ntb_ops = {
2586        .mw_count               = intel_ntb_mw_count,
2587        .mw_get_align           = intel_ntb_mw_get_align,
2588        .mw_set_trans           = intel_ntb_mw_set_trans,
2589        .peer_mw_count          = intel_ntb_peer_mw_count,
2590        .peer_mw_get_addr       = intel_ntb_peer_mw_get_addr,
2591        .link_is_up             = intel_ntb_link_is_up,
2592        .link_enable            = intel_ntb_link_enable,
2593        .link_disable           = intel_ntb_link_disable,
2594        .db_is_unsafe           = intel_ntb_db_is_unsafe,
2595        .db_valid_mask          = intel_ntb_db_valid_mask,
2596        .db_vector_count        = intel_ntb_db_vector_count,
2597        .db_vector_mask         = intel_ntb_db_vector_mask,
2598        .db_read                = intel_ntb_db_read,
2599        .db_clear               = intel_ntb_db_clear,
2600        .db_set_mask            = intel_ntb_db_set_mask,
2601        .db_clear_mask          = intel_ntb_db_clear_mask,
2602        .peer_db_addr           = intel_ntb_peer_db_addr,
2603        .peer_db_set            = intel_ntb_peer_db_set,
2604        .spad_is_unsafe         = intel_ntb_spad_is_unsafe,
2605        .spad_count             = intel_ntb_spad_count,
2606        .spad_read              = intel_ntb_spad_read,
2607        .spad_write             = intel_ntb_spad_write,
2608        .peer_spad_addr         = intel_ntb_peer_spad_addr,
2609        .peer_spad_read         = intel_ntb_peer_spad_read,
2610        .peer_spad_write        = intel_ntb_peer_spad_write,
2611};
2612
2613static const struct ntb_dev_ops intel_ntb3_ops = {
2614        .mw_count               = intel_ntb_mw_count,
2615        .mw_get_align           = intel_ntb_mw_get_align,
2616        .mw_set_trans           = intel_ntb3_mw_set_trans,
2617        .peer_mw_count          = intel_ntb_peer_mw_count,
2618        .peer_mw_get_addr       = intel_ntb_peer_mw_get_addr,
2619        .link_is_up             = intel_ntb_link_is_up,
2620        .link_enable            = intel_ntb3_link_enable,
2621        .link_disable           = intel_ntb_link_disable,
2622        .db_valid_mask          = intel_ntb_db_valid_mask,
2623        .db_vector_count        = intel_ntb_db_vector_count,
2624        .db_vector_mask         = intel_ntb_db_vector_mask,
2625        .db_read                = intel_ntb3_db_read,
2626        .db_clear               = intel_ntb3_db_clear,
2627        .db_set_mask            = intel_ntb_db_set_mask,
2628        .db_clear_mask          = intel_ntb_db_clear_mask,
2629        .peer_db_addr           = intel_ntb_peer_db_addr,
2630        .peer_db_set            = intel_ntb3_peer_db_set,
2631        .spad_is_unsafe         = intel_ntb_spad_is_unsafe,
2632        .spad_count             = intel_ntb_spad_count,
2633        .spad_read              = intel_ntb_spad_read,
2634        .spad_write             = intel_ntb_spad_write,
2635        .peer_spad_addr         = intel_ntb_peer_spad_addr,
2636        .peer_spad_read         = intel_ntb_peer_spad_read,
2637        .peer_spad_write        = intel_ntb_peer_spad_write,
2638};
2639
2640static const struct file_operations intel_ntb_debugfs_info = {
2641        .owner = THIS_MODULE,
2642        .open = simple_open,
2643        .read = ndev_debugfs_read,
2644};
2645
2646static const struct pci_device_id intel_ntb_pci_tbl[] = {
2647        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_JSF)},
2648        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_SNB)},
2649        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_IVT)},
2650        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_HSX)},
2651        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_BDX)},
2652        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_PS_JSF)},
2653        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_PS_SNB)},
2654        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_PS_IVT)},
2655        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_PS_HSX)},
2656        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_PS_BDX)},
2657        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_JSF)},
2658        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_SNB)},
2659        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_IVT)},
2660        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_HSX)},
2661        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_SS_BDX)},
2662        {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_NTB_B2B_SKX)},
2663        {0}
2664};
2665MODULE_DEVICE_TABLE(pci, intel_ntb_pci_tbl);
2666
2667static struct pci_driver intel_ntb_pci_driver = {
2668        .name = KBUILD_MODNAME,
2669        .id_table = intel_ntb_pci_tbl,
2670        .probe = intel_ntb_pci_probe,
2671        .remove = intel_ntb_pci_remove,
2672};
2673
2674static int __init intel_ntb_pci_driver_init(void)
2675{
2676        pr_info("%s %s\n", NTB_DESC, NTB_VER);
2677
2678        if (debugfs_initialized())
2679                debugfs_dir = debugfs_create_dir(KBUILD_MODNAME, NULL);
2680
2681        return pci_register_driver(&intel_ntb_pci_driver);
2682}
2683module_init(intel_ntb_pci_driver_init);
2684
2685static void __exit intel_ntb_pci_driver_exit(void)
2686{
2687        pci_unregister_driver(&intel_ntb_pci_driver);
2688
2689        debugfs_remove_recursive(debugfs_dir);
2690}
2691module_exit(intel_ntb_pci_driver_exit);
2692