diff options
-rw-r--r-- | hw/npu2-hw-procedures.c | 2 | ||||
-rw-r--r-- | hw/npu2.c | 21 | ||||
-rw-r--r-- | include/npu2.h | 1 |
3 files changed, 22 insertions, 2 deletions
diff --git a/hw/npu2-hw-procedures.c b/hw/npu2-hw-procedures.c index b21c399..9e4a431 100644 --- a/hw/npu2-hw-procedures.c +++ b/hw/npu2-hw-procedures.c @@ -233,7 +233,7 @@ static bool poll_fence_status(struct npu2_dev *ndev, uint64_t val) } /* Procedure 1.2.1 - Reset NPU/NDL */ -static uint32_t reset_ntl(struct npu2_dev *ndev) +uint32_t reset_ntl(struct npu2_dev *ndev) { uint64_t val; int lane; @@ -1170,6 +1170,25 @@ static int64_t npu2_freset(struct pci_slot *slot __unused) return OPAL_SUCCESS; } +static int64_t npu2_creset(struct pci_slot *slot) +{ + struct npu2 *p; + int i; + struct npu2_dev *ndev; + + p = phb_to_npu2(slot->phb); + NPU2INF(p, "Creset PHB state\n"); + + for (i = 0; i < p->total_devices; i++) { + ndev = &p->devices[i]; + if (ndev) { + NPU2DEVINF(ndev, "Resetting device\n"); + reset_ntl(ndev); + } + } + return OPAL_SUCCESS; +} + static struct pci_slot *npu2_slot_create(struct phb *phb) { struct pci_slot *slot; @@ -1191,7 +1210,7 @@ static struct pci_slot *npu2_slot_create(struct phb *phb) slot->ops.poll_link = NULL; slot->ops.hreset = npu2_hreset; slot->ops.freset = npu2_freset; - slot->ops.creset = NULL; + slot->ops.creset = npu2_creset; return slot; } diff --git a/include/npu2.h b/include/npu2.h index dae152a..c1f3961 100644 --- a/include/npu2.h +++ b/include/npu2.h @@ -162,5 +162,6 @@ int64_t npu2_dev_procedure(void *dev, struct pci_cfg_reg_filter *pcrf, void npu2_dev_procedure_reset(struct npu2_dev *dev); void npu2_set_link_flag(struct npu2_dev *ndev, uint8_t flag); void npu2_clear_link_flag(struct npu2_dev *ndev, uint8_t flag); +uint32_t reset_ntl(struct npu2_dev *ndev); extern int nv_zcal_nominal; #endif /* __NPU2_H */ |