Commit 2c71d338 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'powerpc-4.17-6' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux

Pull powerpc fixes from Michael Ellerman:
 "Just three commits.

  The two cxl ones are not fixes per se, but they modify code that was
  added this cycle so that it will work with a recent firmware change.

  And then a fix for a recent commit that added sleeps in the NVRAM
  code, which needs to be more careful and not sleep if eg. we're called
  in the panic() path.

  Thanks to Nicholas Piggin, Philippe Bergheaud, Christophe Lombard"

* tag 'powerpc-4.17-6' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  powerpc/powernv: Fix NVRAM sleep in invalid context when crashing
  cxl: Report the tunneled operations status
  cxl: Set the PBCQ Tunnel BAR register when enabling capi mode
parents d3154821 c1d2a313
...@@ -244,3 +244,11 @@ Description: read only ...@@ -244,3 +244,11 @@ Description: read only
Returns 1 if the psl timebase register is synchronized Returns 1 if the psl timebase register is synchronized
with the core timebase register, 0 otherwise. with the core timebase register, 0 otherwise.
Users: https://github.com/ibm-capi/libcxl Users: https://github.com/ibm-capi/libcxl
What: /sys/class/cxl/<card>/tunneled_ops_supported
Date: May 2018
Contact: linuxppc-dev@lists.ozlabs.org
Description: read only
Returns 1 if tunneled operations are supported in capi mode,
0 otherwise.
Users: https://github.com/ibm-capi/libcxl
...@@ -44,6 +44,10 @@ static ssize_t opal_nvram_read(char *buf, size_t count, loff_t *index) ...@@ -44,6 +44,10 @@ static ssize_t opal_nvram_read(char *buf, size_t count, loff_t *index)
return count; return count;
} }
/*
* This can be called in the panic path with interrupts off, so use
* mdelay in that case.
*/
static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index) static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index)
{ {
s64 rc = OPAL_BUSY; s64 rc = OPAL_BUSY;
...@@ -58,9 +62,15 @@ static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index) ...@@ -58,9 +62,15 @@ static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index)
while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) {
rc = opal_write_nvram(__pa(buf), count, off); rc = opal_write_nvram(__pa(buf), count, off);
if (rc == OPAL_BUSY_EVENT) { if (rc == OPAL_BUSY_EVENT) {
if (in_interrupt() || irqs_disabled())
mdelay(OPAL_BUSY_DELAY_MS);
else
msleep(OPAL_BUSY_DELAY_MS); msleep(OPAL_BUSY_DELAY_MS);
opal_poll_events(NULL); opal_poll_events(NULL);
} else if (rc == OPAL_BUSY) { } else if (rc == OPAL_BUSY) {
if (in_interrupt() || irqs_disabled())
mdelay(OPAL_BUSY_DELAY_MS);
else
msleep(OPAL_BUSY_DELAY_MS); msleep(OPAL_BUSY_DELAY_MS);
} }
} }
......
...@@ -717,6 +717,7 @@ struct cxl { ...@@ -717,6 +717,7 @@ struct cxl {
bool perst_select_user; bool perst_select_user;
bool perst_same_image; bool perst_same_image;
bool psl_timebase_synced; bool psl_timebase_synced;
bool tunneled_ops_supported;
/* /*
* number of contexts mapped on to this card. Possible values are: * number of contexts mapped on to this card. Possible values are:
......
...@@ -1742,6 +1742,15 @@ static int cxl_configure_adapter(struct cxl *adapter, struct pci_dev *dev) ...@@ -1742,6 +1742,15 @@ static int cxl_configure_adapter(struct cxl *adapter, struct pci_dev *dev)
/* Required for devices using CAPP DMA mode, harmless for others */ /* Required for devices using CAPP DMA mode, harmless for others */
pci_set_master(dev); pci_set_master(dev);
adapter->tunneled_ops_supported = false;
if (cxl_is_power9()) {
if (pnv_pci_set_tunnel_bar(dev, 0x00020000E0000000ull, 1))
dev_info(&dev->dev, "Tunneled operations unsupported\n");
else
adapter->tunneled_ops_supported = true;
}
if ((rc = pnv_phb_to_cxl_mode(dev, adapter->native->sl_ops->capi_mode))) if ((rc = pnv_phb_to_cxl_mode(dev, adapter->native->sl_ops->capi_mode)))
goto err; goto err;
...@@ -1768,6 +1777,9 @@ static void cxl_deconfigure_adapter(struct cxl *adapter) ...@@ -1768,6 +1777,9 @@ static void cxl_deconfigure_adapter(struct cxl *adapter)
{ {
struct pci_dev *pdev = to_pci_dev(adapter->dev.parent); struct pci_dev *pdev = to_pci_dev(adapter->dev.parent);
if (cxl_is_power9())
pnv_pci_set_tunnel_bar(pdev, 0x00020000E0000000ull, 0);
cxl_native_release_psl_err_irq(adapter); cxl_native_release_psl_err_irq(adapter);
cxl_unmap_adapter_regs(adapter); cxl_unmap_adapter_regs(adapter);
......
...@@ -78,6 +78,15 @@ static ssize_t psl_timebase_synced_show(struct device *device, ...@@ -78,6 +78,15 @@ static ssize_t psl_timebase_synced_show(struct device *device,
return scnprintf(buf, PAGE_SIZE, "%i\n", adapter->psl_timebase_synced); return scnprintf(buf, PAGE_SIZE, "%i\n", adapter->psl_timebase_synced);
} }
static ssize_t tunneled_ops_supported_show(struct device *device,
struct device_attribute *attr,
char *buf)
{
struct cxl *adapter = to_cxl_adapter(device);
return scnprintf(buf, PAGE_SIZE, "%i\n", adapter->tunneled_ops_supported);
}
static ssize_t reset_adapter_store(struct device *device, static ssize_t reset_adapter_store(struct device *device,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
...@@ -183,6 +192,7 @@ static struct device_attribute adapter_attrs[] = { ...@@ -183,6 +192,7 @@ static struct device_attribute adapter_attrs[] = {
__ATTR_RO(base_image), __ATTR_RO(base_image),
__ATTR_RO(image_loaded), __ATTR_RO(image_loaded),
__ATTR_RO(psl_timebase_synced), __ATTR_RO(psl_timebase_synced),
__ATTR_RO(tunneled_ops_supported),
__ATTR_RW(load_image_on_perst), __ATTR_RW(load_image_on_perst),
__ATTR_RW(perst_reloads_same_image), __ATTR_RW(perst_reloads_same_image),
__ATTR(reset, S_IWUSR, NULL, reset_adapter_store), __ATTR(reset, S_IWUSR, NULL, reset_adapter_store),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment