Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+43 -2
+8
Documentation/ABI/testing/sysfs-class-cxl
··· 244 Returns 1 if the psl timebase register is synchronized 245 with the core timebase register, 0 otherwise. 246 Users: https://github.com/ibm-capi/libcxl
··· 244 Returns 1 if the psl timebase register is synchronized 245 with the core timebase register, 0 otherwise. 246 Users: https://github.com/ibm-capi/libcxl 247 + 248 + What: /sys/class/cxl/<card>/tunneled_ops_supported 249 + Date: May 2018 250 + Contact: linuxppc-dev@lists.ozlabs.org 251 + Description: read only 252 + Returns 1 if tunneled operations are supported in capi mode, 253 + 0 otherwise. 254 + Users: https://github.com/ibm-capi/libcxl
+12 -2
arch/powerpc/platforms/powernv/opal-nvram.c
··· 44 return count; 45 } 46 47 static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index) 48 { 49 s64 rc = OPAL_BUSY; ··· 62 while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { 63 rc = opal_write_nvram(__pa(buf), count, off); 64 if (rc == OPAL_BUSY_EVENT) { 65 - msleep(OPAL_BUSY_DELAY_MS); 66 opal_poll_events(NULL); 67 } else if (rc == OPAL_BUSY) { 68 - msleep(OPAL_BUSY_DELAY_MS); 69 } 70 } 71
··· 44 return count; 45 } 46 47 + /* 48 + * This can be called in the panic path with interrupts off, so use 49 + * mdelay in that case. 50 + */ 51 static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index) 52 { 53 s64 rc = OPAL_BUSY; ··· 58 while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { 59 rc = opal_write_nvram(__pa(buf), count, off); 60 if (rc == OPAL_BUSY_EVENT) { 61 + if (in_interrupt() || irqs_disabled()) 62 + mdelay(OPAL_BUSY_DELAY_MS); 63 + else 64 + msleep(OPAL_BUSY_DELAY_MS); 65 opal_poll_events(NULL); 66 } else if (rc == OPAL_BUSY) { 67 + if (in_interrupt() || irqs_disabled()) 68 + mdelay(OPAL_BUSY_DELAY_MS); 69 + else 70 + msleep(OPAL_BUSY_DELAY_MS); 71 } 72 } 73
+1
drivers/misc/cxl/cxl.h
··· 717 bool perst_select_user; 718 bool perst_same_image; 719 bool psl_timebase_synced; 720 721 /* 722 * number of contexts mapped on to this card. Possible values are:
··· 717 bool perst_select_user; 718 bool perst_same_image; 719 bool psl_timebase_synced; 720 + bool tunneled_ops_supported; 721 722 /* 723 * number of contexts mapped on to this card. Possible values are:
+12
drivers/misc/cxl/pci.c
··· 1742 /* Required for devices using CAPP DMA mode, harmless for others */ 1743 pci_set_master(dev); 1744 1745 if ((rc = pnv_phb_to_cxl_mode(dev, adapter->native->sl_ops->capi_mode))) 1746 goto err; 1747 ··· 1776 static void cxl_deconfigure_adapter(struct cxl *adapter) 1777 { 1778 struct pci_dev *pdev = to_pci_dev(adapter->dev.parent); 1779 1780 cxl_native_release_psl_err_irq(adapter); 1781 cxl_unmap_adapter_regs(adapter);
··· 1742 /* Required for devices using CAPP DMA mode, harmless for others */ 1743 pci_set_master(dev); 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 + 1754 if ((rc = pnv_phb_to_cxl_mode(dev, adapter->native->sl_ops->capi_mode))) 1755 goto err; 1756 ··· 1767 static void cxl_deconfigure_adapter(struct cxl *adapter) 1768 { 1769 struct pci_dev *pdev = to_pci_dev(adapter->dev.parent); 1770 + 1771 + if (cxl_is_power9()) 1772 + pnv_pci_set_tunnel_bar(pdev, 0x00020000E0000000ull, 0); 1773 1774 cxl_native_release_psl_err_irq(adapter); 1775 cxl_unmap_adapter_regs(adapter);
+10
drivers/misc/cxl/sysfs.c
··· 78 return scnprintf(buf, PAGE_SIZE, "%i\n", adapter->psl_timebase_synced); 79 } 80 81 static ssize_t reset_adapter_store(struct device *device, 82 struct device_attribute *attr, 83 const char *buf, size_t count) ··· 192 __ATTR_RO(base_image), 193 __ATTR_RO(image_loaded), 194 __ATTR_RO(psl_timebase_synced), 195 __ATTR_RW(load_image_on_perst), 196 __ATTR_RW(perst_reloads_same_image), 197 __ATTR(reset, S_IWUSR, NULL, reset_adapter_store),
··· 78 return scnprintf(buf, PAGE_SIZE, "%i\n", adapter->psl_timebase_synced); 79 } 80 81 + static 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 + 90 static ssize_t reset_adapter_store(struct device *device, 91 struct device_attribute *attr, 92 const char *buf, size_t count) ··· 183 __ATTR_RO(base_image), 184 __ATTR_RO(image_loaded), 185 __ATTR_RO(psl_timebase_synced), 186 + __ATTR_RO(tunneled_ops_supported), 187 __ATTR_RW(load_image_on_perst), 188 __ATTR_RW(perst_reloads_same_image), 189 __ATTR(reset, S_IWUSR, NULL, reset_adapter_store),