aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-05-18 13:24:03 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-05-18 13:24:03 -0400
commit2c71d338bef2cc8a2e5f8ebe70788eeff246fcd8 (patch)
tree27614afca1a4f8b966124ed01586189ab7331889
parentd3154821686531964735a17ee0466c832e69d6d5 (diff)
parentc1d2a31397ec51f0370f6bd17b19b39152c263cb (diff)
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
-rw-r--r--Documentation/ABI/testing/sysfs-class-cxl8
-rw-r--r--arch/powerpc/platforms/powernv/opal-nvram.c14
-rw-r--r--drivers/misc/cxl/cxl.h1
-rw-r--r--drivers/misc/cxl/pci.c12
-rw-r--r--drivers/misc/cxl/sysfs.c10
5 files changed, 43 insertions, 2 deletions
diff --git a/Documentation/ABI/testing/sysfs-class-cxl b/Documentation/ABI/testing/sysfs-class-cxl
index 640f65e79ef1..8e69345c37cc 100644
--- a/Documentation/ABI/testing/sysfs-class-cxl
+++ b/Documentation/ABI/testing/sysfs-class-cxl
@@ -244,3 +244,11 @@ Description: read only
244 Returns 1 if the psl timebase register is synchronized 244 Returns 1 if the psl timebase register is synchronized
245 with the core timebase register, 0 otherwise. 245 with the core timebase register, 0 otherwise.
246Users: https://github.com/ibm-capi/libcxl 246Users: https://github.com/ibm-capi/libcxl
247
248What: /sys/class/cxl/<card>/tunneled_ops_supported
249Date: May 2018
250Contact: linuxppc-dev@lists.ozlabs.org
251Description: read only
252 Returns 1 if tunneled operations are supported in capi mode,
253 0 otherwise.
254Users: https://github.com/ibm-capi/libcxl
diff --git a/arch/powerpc/platforms/powernv/opal-nvram.c b/arch/powerpc/platforms/powernv/opal-nvram.c
index 1bceb95f422d..5584247f5029 100644
--- a/arch/powerpc/platforms/powernv/opal-nvram.c
+++ b/arch/powerpc/platforms/powernv/opal-nvram.c
@@ -44,6 +44,10 @@ static ssize_t opal_nvram_read(char *buf, size_t count, loff_t *index)
44 return count; 44 return count;
45} 45}
46 46
47/*
48 * This can be called in the panic path with interrupts off, so use
49 * mdelay in that case.
50 */
47static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index) 51static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index)
48{ 52{
49 s64 rc = OPAL_BUSY; 53 s64 rc = OPAL_BUSY;
@@ -58,10 +62,16 @@ static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index)
58 while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { 62 while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) {
59 rc = opal_write_nvram(__pa(buf), count, off); 63 rc = opal_write_nvram(__pa(buf), count, off);
60 if (rc == OPAL_BUSY_EVENT) { 64 if (rc == OPAL_BUSY_EVENT) {
61 msleep(OPAL_BUSY_DELAY_MS); 65 if (in_interrupt() || irqs_disabled())
66 mdelay(OPAL_BUSY_DELAY_MS);
67 else
68 msleep(OPAL_BUSY_DELAY_MS);
62 opal_poll_events(NULL); 69 opal_poll_events(NULL);
63 } else if (rc == OPAL_BUSY) { 70 } else if (rc == OPAL_BUSY) {
64 msleep(OPAL_BUSY_DELAY_MS); 71 if (in_interrupt() || irqs_disabled())
72 mdelay(OPAL_BUSY_DELAY_MS);
73 else
74 msleep(OPAL_BUSY_DELAY_MS);
65 } 75 }
66 } 76 }
67 77
diff --git a/drivers/misc/cxl/cxl.h b/drivers/misc/cxl/cxl.h
index a4c9c8297a6d..918d4fb742d1 100644
--- a/drivers/misc/cxl/cxl.h
+++ b/drivers/misc/cxl/cxl.h
@@ -717,6 +717,7 @@ struct cxl {
717 bool perst_select_user; 717 bool perst_select_user;
718 bool perst_same_image; 718 bool perst_same_image;
719 bool psl_timebase_synced; 719 bool psl_timebase_synced;
720 bool tunneled_ops_supported;
720 721
721 /* 722 /*
722 * number of contexts mapped on to this card. Possible values are: 723 * number of contexts mapped on to this card. Possible values are:
diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
index 83f1d08058fc..4d6736f9d463 100644
--- a/drivers/misc/cxl/pci.c
+++ b/drivers/misc/cxl/pci.c
@@ -1742,6 +1742,15 @@ static int cxl_configure_adapter(struct cxl *adapter, struct pci_dev *dev)
1742 /* Required for devices using CAPP DMA mode, harmless for others */ 1742 /* Required for devices using CAPP DMA mode, harmless for others */
1743 pci_set_master(dev); 1743 pci_set_master(dev);
1744 1744
1745 adapter->tunneled_ops_supported = false;
1746
1747 if (cxl_is_power9()) {
1748 if (pnv_pci_set_tunnel_bar(dev, 0x00020000E0000000ull, 1))
1749 dev_info(&dev->dev, "Tunneled operations unsupported\n");
1750 else
1751 adapter->tunneled_ops_supported = true;
1752 }
1753
1745 if ((rc = pnv_phb_to_cxl_mode(dev, adapter->native->sl_ops->capi_mode))) 1754 if ((rc = pnv_phb_to_cxl_mode(dev, adapter->native->sl_ops->capi_mode)))
1746 goto err; 1755 goto err;
1747 1756
@@ -1768,6 +1777,9 @@ static void cxl_deconfigure_adapter(struct cxl *adapter)
1768{ 1777{
1769 struct pci_dev *pdev = to_pci_dev(adapter->dev.parent); 1778 struct pci_dev *pdev = to_pci_dev(adapter->dev.parent);
1770 1779
1780 if (cxl_is_power9())
1781 pnv_pci_set_tunnel_bar(pdev, 0x00020000E0000000ull, 0);
1782
1771 cxl_native_release_psl_err_irq(adapter); 1783 cxl_native_release_psl_err_irq(adapter);
1772 cxl_unmap_adapter_regs(adapter); 1784 cxl_unmap_adapter_regs(adapter);
1773 1785
diff --git a/drivers/misc/cxl/sysfs.c b/drivers/misc/cxl/sysfs.c
index 95285b7f636f..4b5a4c5d3c01 100644
--- a/drivers/misc/cxl/sysfs.c
+++ b/drivers/misc/cxl/sysfs.c
@@ -78,6 +78,15 @@ static ssize_t psl_timebase_synced_show(struct device *device,
78 return scnprintf(buf, PAGE_SIZE, "%i\n", adapter->psl_timebase_synced); 78 return scnprintf(buf, PAGE_SIZE, "%i\n", adapter->psl_timebase_synced);
79} 79}
80 80
81static ssize_t tunneled_ops_supported_show(struct device *device,
82 struct device_attribute *attr,
83 char *buf)
84{
85 struct cxl *adapter = to_cxl_adapter(device);
86
87 return scnprintf(buf, PAGE_SIZE, "%i\n", adapter->tunneled_ops_supported);
88}
89
81static ssize_t reset_adapter_store(struct device *device, 90static ssize_t reset_adapter_store(struct device *device,
82 struct device_attribute *attr, 91 struct device_attribute *attr,
83 const char *buf, size_t count) 92 const char *buf, size_t count)
@@ -183,6 +192,7 @@ static struct device_attribute adapter_attrs[] = {
183 __ATTR_RO(base_image), 192 __ATTR_RO(base_image),
184 __ATTR_RO(image_loaded), 193 __ATTR_RO(image_loaded),
185 __ATTR_RO(psl_timebase_synced), 194 __ATTR_RO(psl_timebase_synced),
195 __ATTR_RO(tunneled_ops_supported),
186 __ATTR_RW(load_image_on_perst), 196 __ATTR_RW(load_image_on_perst),
187 __ATTR_RW(perst_reloads_same_image), 197 __ATTR_RW(perst_reloads_same_image),
188 __ATTR(reset, S_IWUSR, NULL, reset_adapter_store), 198 __ATTR(reset, S_IWUSR, NULL, reset_adapter_store),