diff options
| -rw-r--r-- | Documentation/ABI/testing/sysfs-class-cxl | 8 | ||||
| -rw-r--r-- | arch/powerpc/platforms/powernv/opal-nvram.c | 14 | ||||
| -rw-r--r-- | drivers/misc/cxl/cxl.h | 1 | ||||
| -rw-r--r-- | drivers/misc/cxl/pci.c | 12 | ||||
| -rw-r--r-- | drivers/misc/cxl/sysfs.c | 10 |
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. |
| 246 | Users: https://github.com/ibm-capi/libcxl | 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 | ||
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 | */ | ||
| 47 | static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index) | 51 | static 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 | ||
| 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 | |||
| 81 | static ssize_t reset_adapter_store(struct device *device, | 90 | static 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), |
