[Skiboot] [PATCH v2 3/3] npu2: Add vendor cap for IRQ testing

Sam Bobroff sam.bobroff at au1.ibm.com
Fri Aug 18 13:53:15 AEST 2017


Provide a way to test recoverable data link interrupts via a new
vendor capability byte.

Signed-off-by: Sam Bobroff <sam.bobroff at au1.ibm.com>
---
====== Version 1 -> version 2: ======

* Patch added.

 hw/npu2.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/hw/npu2.c b/hw/npu2.c
index ef3452d4..1fdcabf7 100644
--- a/hw/npu2.c
+++ b/hw/npu2.c
@@ -1395,6 +1395,25 @@ static uint32_t npu2_populate_pcie_cap(struct npu2_dev *dev,
 	return start + PCICAP_EXP_SCTL2 + 8;
 }
 
+static int64_t npu2_misc_irq_request(void *dev, struct pci_cfg_reg_filter *pcrf __unused,
+			   uint32_t offset __unused, uint32_t len __unused, uint32_t *data,
+			   bool write)
+{
+	struct pci_virt_device *pvd = dev;
+	struct npu2_dev *ndev = pvd->data;
+	struct npu2 *npu2 = ndev->npu;
+
+	uint32_t idx = (ndev->index * 2) + 1;
+	uint64_t irq_bit = 1ULL << (63 - idx);
+	uint64_t reg = NPU2_REG_OFFSET(NPU2_STACK_MISC, NPU2_BLOCK_MISC, NPU2_MISC_IRQ_REQUEST);
+
+	if (write)
+		npu2_write(npu2, reg, (*data ? irq_bit : 0));
+	else
+		*data = !!(npu2_read(npu2, reg) & irq_bit);
+	return OPAL_SUCCESS;
+}
+
 static uint32_t npu2_populate_vendor_cap(struct npu2_dev *dev,
 					 uint32_t start,
 					 uint32_t prev_cap)
@@ -1426,6 +1445,15 @@ static uint32_t npu2_populate_vendor_cap(struct npu2_dev *dev,
 	/* Link index */
 	PCI_VIRT_CFG_INIT_RO(pvd, start + 0xc, 1, dev->index);
 
+	/* Note: VENDOR_CAP_PCI_DEV_OFFSET is next at 0x0d
+	 * but it is setup later. */
+
+	/* Allow triggering of interrupts (MISC_IRQ_REQUEST) by a write to config
+	 * space: */
+	pci_virt_add_filter(pvd, start + 0xe, 1,
+	                    PCI_REG_FLAG_READ | PCI_REG_FLAG_WRITE,
+	                    npu2_misc_irq_request, NULL);
+
 	return start + VENDOR_CAP_LEN;
 }
 
-- 
2.14.1.2.g4274c698f



More information about the Skiboot mailing list