IB/qib: use arch_phys_wc_add()

This driver already makes use of ioremap_wc() on PIO buffers,
so convert it to use arch_phys_wc_add().

The qib driver uses a mmap() special case for when PAT is
not used, this behaviour used to be determined with a
module parameter but since we have been asked to just
remove that module parameter this checks for the WC cookie,
if not set we can assume PAT was used. If its set we do
what we used to do for the mmap for when MTRR was enabled.

The removal of the module parameter is OK given that Andy
notes that even if users of module parameter are still around
it will not prevent loading of the module on recent kernels.

Cc: Doug Ledford <dledford@redhat.com>
Cc: Toshi Kani <toshi.kani@hp.com>
Cc: Rickard Strandqvist <rickard_strandqvist@spectrumdigital.se>
Cc: Mike Marciniszyn <mike.marciniszyn@intel.com>
Cc: Roland Dreier <roland@purestorage.com>
Cc: Sean Hefty <sean.hefty@intel.com>
Cc: Hal Rosenstock <hal.rosenstock@gmail.com>
Cc: Dennis Dalessandro <dennis.dalessandro@intel.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Suresh Siddha <sbsiddha@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Juergen Gross <jgross@suse.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Antonino Daplas <adaplas@gmail.com>
Cc: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>
Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Stefan Bader <stefan.bader@canonical.com>
Cc: konrad.wilk@oracle.com
Cc: ville.syrjala@linux.intel.com
Cc: david.vrabel@citrix.com
Cc: jbeulich@suse.com
Cc: Roger Pau Monné <roger.pau@citrix.com>
Cc: infinipath@intel.com
Cc: linux-rdma@vger.kernel.org
Cc: linux-fbdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: xen-devel@lists.xensource.com
Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
Luis R. Rodriguez 2015-04-22 11:38:24 -07:00 committed by Doug Ledford
parent 87a26e976c
commit d4988623cc
7 changed files with 39 additions and 79 deletions

View file

@ -1136,7 +1136,6 @@ extern struct qib_devdata *qib_lookup(int unit);
extern u32 qib_cpulist_count; extern u32 qib_cpulist_count;
extern unsigned long *qib_cpulist; extern unsigned long *qib_cpulist;
extern unsigned qib_wc_pat;
extern unsigned qib_cc_table_size; extern unsigned qib_cc_table_size;
int qib_init(struct qib_devdata *, int); int qib_init(struct qib_devdata *, int);
int init_chip_wc_pat(struct qib_devdata *dd, u32); int init_chip_wc_pat(struct qib_devdata *dd, u32);

View file

@ -835,7 +835,8 @@ static int mmap_piobufs(struct vm_area_struct *vma,
vma->vm_flags &= ~VM_MAYREAD; vma->vm_flags &= ~VM_MAYREAD;
vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND; vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND;
if (qib_wc_pat) /* We used PAT if wc_cookie == 0 */
if (!dd->wc_cookie)
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
ret = io_remap_pfn_range(vma, vma->vm_start, phys >> PAGE_SHIFT, ret = io_remap_pfn_range(vma, vma->vm_start, phys >> PAGE_SHIFT,

View file

@ -3315,11 +3315,9 @@ static int init_6120_variables(struct qib_devdata *dd)
qib_6120_config_ctxts(dd); qib_6120_config_ctxts(dd);
qib_set_ctxtcnt(dd); qib_set_ctxtcnt(dd);
if (qib_wc_pat) { ret = init_chip_wc_pat(dd, 0);
ret = init_chip_wc_pat(dd, 0); if (ret)
if (ret) goto bail;
goto bail;
}
set_6120_baseaddrs(dd); /* set chip access pointers now */ set_6120_baseaddrs(dd); /* set chip access pointers now */
ret = 0; ret = 0;

View file

@ -4126,11 +4126,9 @@ static int qib_init_7220_variables(struct qib_devdata *dd)
qib_7220_config_ctxts(dd); qib_7220_config_ctxts(dd);
qib_set_ctxtcnt(dd); /* needed for PAT setup */ qib_set_ctxtcnt(dd); /* needed for PAT setup */
if (qib_wc_pat) { ret = init_chip_wc_pat(dd, 0);
ret = init_chip_wc_pat(dd, 0); if (ret)
if (ret) goto bail;
goto bail;
}
set_7220_baseaddrs(dd); /* set chip access pointers now */ set_7220_baseaddrs(dd); /* set chip access pointers now */
ret = 0; ret = 0;

View file

@ -6429,6 +6429,7 @@ static int qib_init_7322_variables(struct qib_devdata *dd)
unsigned features, pidx, sbufcnt; unsigned features, pidx, sbufcnt;
int ret, mtu; int ret, mtu;
u32 sbufs, updthresh; u32 sbufs, updthresh;
resource_size_t vl15off;
/* pport structs are contiguous, allocated after devdata */ /* pport structs are contiguous, allocated after devdata */
ppd = (struct qib_pportdata *)(dd + 1); ppd = (struct qib_pportdata *)(dd + 1);
@ -6677,29 +6678,27 @@ static int qib_init_7322_variables(struct qib_devdata *dd)
qib_7322_config_ctxts(dd); qib_7322_config_ctxts(dd);
qib_set_ctxtcnt(dd); qib_set_ctxtcnt(dd);
if (qib_wc_pat) { /*
resource_size_t vl15off; * We do not set WC on the VL15 buffers to avoid
/* * a rare problem with unaligned writes from
* We do not set WC on the VL15 buffers to avoid * interrupt-flushed store buffers, so we need
* a rare problem with unaligned writes from * to map those separately here. We can't solve
* interrupt-flushed store buffers, so we need * this for the rarely used mtrr case.
* to map those separately here. We can't solve */
* this for the rarely used mtrr case. ret = init_chip_wc_pat(dd, 0);
*/ if (ret)
ret = init_chip_wc_pat(dd, 0); goto bail;
if (ret)
goto bail;
/* vl15 buffers start just after the 4k buffers */ /* vl15 buffers start just after the 4k buffers */
vl15off = dd->physaddr + (dd->piobufbase >> 32) + vl15off = dd->physaddr + (dd->piobufbase >> 32) +
dd->piobcnt4k * dd->align4k; dd->piobcnt4k * dd->align4k;
dd->piovl15base = ioremap_nocache(vl15off, dd->piovl15base = ioremap_nocache(vl15off,
NUM_VL15_BUFS * dd->align4k); NUM_VL15_BUFS * dd->align4k);
if (!dd->piovl15base) { if (!dd->piovl15base) {
ret = -ENOMEM; ret = -ENOMEM;
goto bail; goto bail;
}
} }
qib_7322_set_baseaddrs(dd); /* set chip access pointers now */ qib_7322_set_baseaddrs(dd); /* set chip access pointers now */
ret = 0; ret = 0;

View file

@ -91,15 +91,6 @@ MODULE_PARM_DESC(krcvqs, "number of kernel receive queues per IB port");
unsigned qib_cc_table_size; unsigned qib_cc_table_size;
module_param_named(cc_table_size, qib_cc_table_size, uint, S_IRUGO); module_param_named(cc_table_size, qib_cc_table_size, uint, S_IRUGO);
MODULE_PARM_DESC(cc_table_size, "Congestion control table entries 0 (CCA disabled - default), min = 128, max = 1984"); MODULE_PARM_DESC(cc_table_size, "Congestion control table entries 0 (CCA disabled - default), min = 128, max = 1984");
/*
* qib_wc_pat parameter:
* 0 is WC via MTRR
* 1 is WC via PAT
* If PAT initialization fails, code reverts back to MTRR
*/
unsigned qib_wc_pat = 1; /* default (1) is to use PAT, not MTRR */
module_param_named(wc_pat, qib_wc_pat, uint, S_IRUGO);
MODULE_PARM_DESC(wc_pat, "enable write-combining via PAT mechanism");
static void verify_interrupt(unsigned long); static void verify_interrupt(unsigned long);
@ -1377,8 +1368,7 @@ static void cleanup_device_data(struct qib_devdata *dd)
spin_unlock(&dd->pport[pidx].cc_shadow_lock); spin_unlock(&dd->pport[pidx].cc_shadow_lock);
} }
if (!qib_wc_pat) qib_disable_wc(dd);
qib_disable_wc(dd);
if (dd->pioavailregs_dma) { if (dd->pioavailregs_dma) {
dma_free_coherent(&dd->pcidev->dev, PAGE_SIZE, dma_free_coherent(&dd->pcidev->dev, PAGE_SIZE,
@ -1547,14 +1537,12 @@ static int qib_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
goto bail; goto bail;
} }
if (!qib_wc_pat) { ret = qib_enable_wc(dd);
ret = qib_enable_wc(dd); if (ret) {
if (ret) { qib_dev_err(dd,
qib_dev_err(dd, "Write combining not enabled (err %d): performance may be poor\n",
"Write combining not enabled (err %d): performance may be poor\n", -ret);
-ret); ret = 0;
ret = 0;
}
} }
qib_verify_pioperf(dd); qib_verify_pioperf(dd);

View file

@ -116,21 +116,9 @@ int qib_enable_wc(struct qib_devdata *dd)
} }
if (!ret) { if (!ret) {
int cookie; dd->wc_cookie = arch_phys_wc_add(pioaddr, piolen);
if (dd->wc_cookie < 0)
cookie = mtrr_add(pioaddr, piolen, MTRR_TYPE_WRCOMB, 1); ret = -EINVAL;
if (cookie < 0) {
{
qib_devinfo(dd->pcidev,
"mtrr_add() WC for PIO bufs failed (%d)\n",
cookie);
ret = -EINVAL;
}
} else {
dd->wc_cookie = cookie;
dd->wc_base = (unsigned long) pioaddr;
dd->wc_len = (unsigned long) piolen;
}
} }
return ret; return ret;
@ -142,18 +130,7 @@ int qib_enable_wc(struct qib_devdata *dd)
*/ */
void qib_disable_wc(struct qib_devdata *dd) void qib_disable_wc(struct qib_devdata *dd)
{ {
if (dd->wc_cookie) { arch_phys_wc_del(dd->wc_cookie);
int r;
r = mtrr_del(dd->wc_cookie, dd->wc_base,
dd->wc_len);
if (r < 0)
qib_devinfo(dd->pcidev,
"mtrr_del(%lx, %lx, %lx) failed: %d\n",
dd->wc_cookie, dd->wc_base,
dd->wc_len, r);
dd->wc_cookie = 0; /* even on failure */
}
} }
/** /**