From: Alastair D'Silva <alastair@xxxxxxxxxxx> Similar to the previous patch, this adds support for near storage commands. Signed-off-by: Alastair D'Silva <alastair@xxxxxxxxxxx> --- arch/powerpc/platforms/powernv/pmem/ocxl.c | 6 +++ .../platforms/powernv/pmem/ocxl_internal.c | 41 +++++++++++++++++++ .../platforms/powernv/pmem/ocxl_internal.h | 37 +++++++++++++++++ 3 files changed, 84 insertions(+) diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl.c b/arch/powerpc/platforms/powernv/pmem/ocxl.c index 4e782d22605b..b8bd7e703b19 100644 --- a/arch/powerpc/platforms/powernv/pmem/ocxl.c +++ b/arch/powerpc/platforms/powernv/pmem/ocxl.c @@ -259,12 +259,18 @@ static int setup_command_metadata(struct ocxlpmem *ocxlpmem) int rc; mutex_init(&ocxlpmem->admin_command.lock); + mutex_init(&ocxlpmem->ns_command.lock); rc = extract_command_metadata(ocxlpmem, GLOBAL_MMIO_ACMA_CREQO, &ocxlpmem->admin_command); if (rc) return rc; + rc = extract_command_metadata(ocxlpmem, GLOBAL_MMIO_NSCMA_CREQO, + &ocxlpmem->ns_command); + if (rc) + return rc; + return 0; } diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c index 583f48023025..3e0b133feddf 100644 --- a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c +++ b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.c @@ -133,6 +133,47 @@ int admin_response_handled(const struct ocxlpmem *ocxlpmem) OCXL_LITTLE_ENDIAN, GLOBAL_MMIO_CHI_ACRA); } +int ns_command_request(struct ocxlpmem *ocxlpmem, u8 op_code) +{ + u64 val; + int rc = ocxl_global_mmio_read64(ocxlpmem->ocxl_afu, GLOBAL_MMIO_CHI, + OCXL_LITTLE_ENDIAN, &val); + if (rc) + return rc; + + if (!(val & GLOBAL_MMIO_CHI_NSCRA)) + return -EBUSY; + + return scm_command_request(ocxlpmem, &ocxlpmem->ns_command, op_code); +} + +int ns_response(const struct ocxlpmem *ocxlpmem) +{ + return command_response(ocxlpmem, &ocxlpmem->ns_command); +} + +int ns_command_execute(const struct ocxlpmem *ocxlpmem) +{ + return ocxl_global_mmio_set64(ocxlpmem->ocxl_afu, GLOBAL_MMIO_HCI, + OCXL_LITTLE_ENDIAN, GLOBAL_MMIO_HCI_NSCRW); +} + +bool ns_command_complete(const struct ocxlpmem *ocxlpmem) +{ + u64 val = 0; + int rc = ocxlpmem_chi(ocxlpmem, &val); + + WARN_ON(rc); + + return (val & GLOBAL_MMIO_CHI_NSCRA) != 0; +} + +int ns_response_handled(const struct ocxlpmem *ocxlpmem) +{ + return ocxl_global_mmio_set64(ocxlpmem->ocxl_afu, GLOBAL_MMIO_CHIC, + OCXL_LITTLE_ENDIAN, GLOBAL_MMIO_CHI_NSCRA); +} + void warn_status(const struct ocxlpmem *ocxlpmem, const char *message, u8 status) { diff --git a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h index 2fef68c71271..28e2020f6355 100644 --- a/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h +++ b/arch/powerpc/platforms/powernv/pmem/ocxl_internal.h @@ -107,6 +107,7 @@ struct ocxlpmem { struct ocxl_context *ocxl_context; void *metadata_addr; struct command_metadata admin_command; + struct command_metadata ns_command; struct resource pmem_res; struct nd_region *nd_region; char fw_version[8+1]; @@ -175,6 +176,42 @@ int admin_command_complete_timeout(const struct ocxlpmem *ocxlpmem, */ int admin_response_handled(const struct ocxlpmem *ocxlpmem); +/** + * ns_command_request() - Issue a near storage command request + * @ocxlpmem: the device metadata + * @op_code: The op-code for the command + * Returns an identifier for the command, or negative on error + */ +int ns_command_request(struct ocxlpmem *ocxlpmem, u8 op_code); + +/** + * ns_response() - Validate a near storage response + * @ocxlpmem: the device metadata + * Returns the status code of the command, or negative on error + */ +int ns_response(const struct ocxlpmem *ocxlpmem); + +/** + * ns_command_execute() - Notify the controller to start processing a pending near storage command + * @ocxlpmem: the device metadata + * Returns 0 on success, negative on error + */ +int ns_command_execute(const struct ocxlpmem *ocxlpmem); + +/** + * ns_command_complete() - Is a near storage command executing + * @ocxlpmem: the device metadata + * Returns true if the previous admin command has completed + */ +bool ns_command_complete(const struct ocxlpmem *ocxlpmem); + +/** + * ns_response_handled() - Notify the controller that the near storage response has been handled + * @ocxlpmem: the device metadata + * Returns 0 on success, negative on failure + */ +int ns_response_handled(const struct ocxlpmem *ocxlpmem); + /** * warn_status() - Emit a kernel warning showing a command status. * @ocxlpmem: the device metadata -- 2.24.1