Re: [PATCH v3 22/27] powerpc/powernv/pmem: Implement the heartbeat command
From: Frederic Barrat <hidden>
Date: 2020-03-04 14:26:13
Also in:
linux-mm, lkml, nvdimm
Le 21/02/2020 à 04:27, Alastair D'Silva a écrit :
From: Alastair D'Silva <redacted> The heartbeat admin command is a simple admin command that exercises the communication mechanisms within the controller. This patch issues a heartbeat command to the card during init to ensure we can communicate with the card's controller. Signed-off-by: Alastair D'Silva <redacted> ---
Nothing to add compared to what has already been commented on previous patches (rc not set in probe(), higher level function to execute admin command in one call). Fred
quoted hunk ↗ jump to hunk
arch/powerpc/platforms/powernv/pmem/ocxl.c | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+)diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl.c b/arch/powerpc/platforms/powernv/pmem/ocxl.c index 081883a8247a..e01f6f9fc180 100644 --- a/arch/powerpc/platforms/powernv/pmem/ocxl.c +++ b/arch/powerpc/platforms/powernv/pmem/ocxl.c@@ -306,6 +306,44 @@ static bool is_usable(const struct ocxlpmem *ocxlpmem, bool verbose) return true; } +/** + * heartbeat() - Issue a heartbeat command to the controller + * @ocxlpmem: the device metadata + * Return: 0 if the controller responded correctly, negative on error + */ +static int heartbeat(struct ocxlpmem *ocxlpmem) +{ + int rc; + + mutex_lock(&ocxlpmem->admin_command.lock); + + rc = admin_command_request(ocxlpmem, ADMIN_COMMAND_HEARTBEAT); + if (rc) + goto out; + + rc = admin_command_execute(ocxlpmem); + if (rc) + goto out; + + rc = admin_command_complete_timeout(ocxlpmem, ADMIN_COMMAND_HEARTBEAT); + if (rc < 0) { + dev_err(&ocxlpmem->dev, "Heartbeat timeout\n"); + goto out; + } + + rc = admin_response(ocxlpmem); + if (rc < 0) + goto out; + if (rc != STATUS_SUCCESS) + warn_status(ocxlpmem, "Unexpected status from heartbeat", rc); + + (void)admin_response_handled(ocxlpmem); + +out: + mutex_unlock(&ocxlpmem->admin_command.lock); + return rc; +} + /** * allocate_minor() - Allocate a minor number to use for an OpenCAPI pmem device * @ocxlpmem: the device metadata@@ -1458,6 +1496,11 @@ static int probe(struct pci_dev *pdev, const struct pci_device_id *ent) goto err; } + if (heartbeat(ocxlpmem)) { + dev_err(&pdev->dev, "Heartbeat failed\n"); + goto err; + } + elapsed = 0; timeout = ocxlpmem->readiness_timeout + ocxlpmem->memory_available_timeout; while (!is_usable(ocxlpmem, false)) {