Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp3051124pxj; Mon, 10 May 2021 17:29:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzC5iMsJ6nM7KLv3fxmInF3FMrlp3UPcLhCpmJaCU8QZ6O2Jlvu4S8fm9tYyOd3GfvuqBP/ X-Received: by 2002:a05:6e02:1985:: with SMTP id g5mr23748196ilf.103.1620692981190; Mon, 10 May 2021 17:29:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620692981; cv=none; d=google.com; s=arc-20160816; b=BlFO2jM8ITvM6i01r2BiAdFWZVa+50hu4zqWt64gJrfWUsQrjk+5nXqmpZGvwTd0fQ a2vSi+WegTrmzDhpztHd8eEZE9KaHk08FkidFyvNo47usYTC8GCYYz74vO1uHnSktwq8 GvFyqhUFDP9QTlb8Ezkx5ZnpEnmr2On/FdvWS583165pTs/lK7JoERT2JApyDJalNGOF 4QRh58kALVScPdOyewbIWCbAZlbw5q6suL1SZrOitcppdknOWhnpoO8oFmJiOLXd39EQ Yl4fhMWrmn/VVF9yyhK5QwXdERu7Z0l58Bg66YGfbshCiLif93IYKIWWSGsRvju+VPmZ 5Hyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=P6aDOohx/CnLNSOtZzTr/KKqECyrpqq0nGc8kYRUUw8=; b=tT5u6bT4fmfCsgu7STTEQKnxOmuyTtTTZW6/rt9s4qh1atEhoKUzBBeFmusH5m9dZa iNEKIVSXzcsb+YJ/3Z3vtH98wVfpgMAW5VQGQo59fgoFlMSZyNyB0NUV9XK0/evdMszo fqxYZ3w+UhQ5pYg66AGo6KVps9Fg73/ZmqwTBgol2UF1dY+bBolcWZqKngnvEzQGbj/N rlz73DIj/KIX18fAhxPQbNuVrS6NVKraag4fvTosrhkWVNP9jQjeI1wKJ6k4qv65DhBG Ana3lPBe0iFvzD/Z930Qq8QZSZNkOb1ocD9vjUP76E/hIV5YcGHyV9196DguirS1yq9r WKAA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@opensynergy.com header.s=srmailgate02 header.b=lfOULUUk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=opensynergy.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f4si18440169ilq.1.2021.05.10.17.29.29; Mon, 10 May 2021 17:29:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@opensynergy.com header.s=srmailgate02 header.b=lfOULUUk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=opensynergy.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231537AbhEKA3w (ORCPT + 99 others); Mon, 10 May 2021 20:29:52 -0400 Received: from mx1.opensynergy.com ([217.66.60.4]:2477 "EHLO mx1.opensynergy.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231218AbhEKA3o (ORCPT ); Mon, 10 May 2021 20:29:44 -0400 Received: from SR-MAILGATE-02.opensynergy.com (localhost.localdomain [127.0.0.1]) by mx1.opensynergy.com (Proxmox) with ESMTP id C2CE4A1A34; Tue, 11 May 2021 02:22:09 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=opensynergy.com; h=cc:cc:content-transfer-encoding:content-type:content-type :date:from:from:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=srmailgate02; bh=P6aDOohx/CnL NSOtZzTr/KKqECyrpqq0nGc8kYRUUw8=; b=lfOULUUkRdEbM33ODp84rarqB3eL oRp6r512RnPzAuj6sib4ZfsuUKhBSbNM4O9gevs1DpvGU6G1ZmpbjchQRlYTdSjl UJtVwKI9VQgGKGQecHOO2fQ/1xgc4X6iAT2iCDTgppVYbATBFkiJDdaiJXf7enbd kXTPMkLqm82/ZJqxi7yx+nMu11n7tEc26mltk9gQqnUDkfhU8S5Q21i0SOu6poek DJ7ewQhsH9Q5WEmPmbtkkSvd35Z3nvAdkHbetfj90mLhO0bT1w7iolmmePpirYuc iqkBKchUsC6UM5jQzuvNZFRuaQkxPQLOwT3ikbXIqJUB3JlJFPmhlWgw2A== From: Peter Hilber To: , CC: Peter Hilber , Rob Herring , , , , , , , , , Vasyl Vavrychuk , Andriy Tryshnivskyy , Cristian Marussi Subject: [RFC PATCH v3 09/12] firmware: arm_scmi: Add message passing abstractions for transports Date: Tue, 11 May 2021 02:20:37 +0200 Message-ID: <20210511002040.802226-10-peter.hilber@opensynergy.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210511002040.802226-1-peter.hilber@opensynergy.com> References: <20210511002040.802226-1-peter.hilber@opensynergy.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: SR-MAIL-01.open-synergy.com (10.26.10.21) To SR-MAIL-02.open-synergy.com (10.26.10.22) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add abstractions for future transports using message passing, such as virtio. Derive the abstractions from the shared memory abstractions. Abstract the transport SDU through the opaque struct scmi_msg_payld. Also enable the transport to determine all other required information about the transport SDU. Signed-off-by: Peter Hilber --- drivers/firmware/Kconfig | 8 +- drivers/firmware/arm_scmi/Makefile | 1 + drivers/firmware/arm_scmi/common.h | 15 ++++ drivers/firmware/arm_scmi/msg.c | 113 +++++++++++++++++++++++++++++ 4 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 drivers/firmware/arm_scmi/msg.c diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index 80ff49dadf35..e8377b12e4d0 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -9,7 +9,7 @@ menu "Firmware Drivers" config ARM_SCMI_PROTOCOL tristate "ARM System Control and Management Interface (SCMI) Message Protocol" depends on ARM || ARM64 || COMPILE_TEST - depends on ARM_SCMI_HAVE_SHMEM + depends on ARM_SCMI_HAVE_SHMEM || ARM_SCMI_HAVE_MSG help ARM System Control and Management Interface (SCMI) protocol is a set of operating system-independent software interfaces that are @@ -33,6 +33,12 @@ config ARM_SCMI_HAVE_SHMEM This declares whether a shared memory based transport for SCMI is available. +config ARM_SCMI_HAVE_MSG + bool + help + This declares whether a message passing based transport for SCMI is + available. + config ARM_SCMI_POWER_DOMAIN tristate "SCMI power domain driver" depends on ARM_SCMI_PROTOCOL || (COMPILE_TEST && OF) diff --git a/drivers/firmware/arm_scmi/Makefile b/drivers/firmware/arm_scmi/Makefile index 5a2d4c32e0ae..f6b4acb8abdb 100644 --- a/drivers/firmware/arm_scmi/Makefile +++ b/drivers/firmware/arm_scmi/Makefile @@ -4,6 +4,7 @@ scmi-driver-y = driver.o notify.o scmi-transport-$(CONFIG_ARM_SCMI_HAVE_SHMEM) = shmem.o scmi-transport-$(CONFIG_MAILBOX) += mailbox.o scmi-transport-$(CONFIG_HAVE_ARM_SMCCC_DISCOVERY) += smc.o +scmi-transport-$(CONFIG_ARM_SCMI_HAVE_MSG) += msg.o scmi-protocols-y = base.o clock.o perf.o power.o reset.o sensors.o system.o voltage.o scmi-module-objs := $(scmi-bus-y) $(scmi-driver-y) $(scmi-protocols-y) \ $(scmi-transport-y) diff --git a/drivers/firmware/arm_scmi/common.h b/drivers/firmware/arm_scmi/common.h index 51ee08bdcb0c..4cb6571c7aaf 100644 --- a/drivers/firmware/arm_scmi/common.h +++ b/drivers/firmware/arm_scmi/common.h @@ -369,6 +369,21 @@ void shmem_clear_channel(struct scmi_shared_mem __iomem *shmem); bool shmem_poll_done(struct scmi_shared_mem __iomem *shmem, struct scmi_xfer *xfer); +/* declarations for message passing transports */ +struct scmi_msg_payld; + +/** Maximum overhead of message w.r.t. struct scmi_desc.max_msg_size */ +#define SCMI_MSG_MAX_PROT_OVERHEAD (2 * sizeof(__le32)) + +size_t msg_response_size(struct scmi_xfer *xfer); +size_t msg_command_size(struct scmi_xfer *xfer); +void msg_tx_prepare(struct scmi_msg_payld *msg, struct scmi_xfer *xfer); +u32 msg_read_header(struct scmi_msg_payld *msg); +void msg_fetch_response(struct scmi_msg_payld *msg, size_t len, + struct scmi_xfer *xfer); +void msg_fetch_notification(struct scmi_msg_payld *msg, size_t len, + size_t max_len, struct scmi_xfer *xfer); + void scmi_notification_instance_data_set(const struct scmi_handle *handle, void *priv); void *scmi_notification_instance_data_get(const struct scmi_handle *handle); diff --git a/drivers/firmware/arm_scmi/msg.c b/drivers/firmware/arm_scmi/msg.c new file mode 100644 index 000000000000..8a2d3303d281 --- /dev/null +++ b/drivers/firmware/arm_scmi/msg.c @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * For transports using message passing. + * + * Derived from shm.c. + * + * Copyright (C) 2019 ARM Ltd. + * Copyright (C) 2020 OpenSynergy GmbH + */ + +#include +#include +#include + +#include "common.h" + +/* + * struct scmi_msg_payld - Transport SDU layout + * + * The SCMI specification requires all parameters, message headers, return + * arguments or any protocol data to be expressed in little endian format only. + */ +struct scmi_msg_payld { + __le32 msg_header; + __le32 msg_payload[]; +}; + +/** + * msg_command_size() - Actual size of transport SDU for command. + * + * @xfer: message which core has prepared for sending + * + * Return: transport SDU size. + */ +size_t msg_command_size(struct scmi_xfer *xfer) +{ + return sizeof(struct scmi_msg_payld) + xfer->tx.len; +} + +/** + * msg_response_size() - Maximum size of transport SDU for response. + * + * @xfer: message which core has prepared for sending + * + * Return: transport SDU size. + */ +size_t msg_response_size(struct scmi_xfer *xfer) +{ + return sizeof(struct scmi_msg_payld) + sizeof(__le32) + xfer->rx.len; +} + +/** + * msg_tx_prepare() - Set up transport SDU for command. + * + * @msg: transport SDU for command + * @xfer: message which is being sent + */ +void msg_tx_prepare(struct scmi_msg_payld *msg, struct scmi_xfer *xfer) +{ + msg->msg_header = cpu_to_le32(pack_scmi_header(&xfer->hdr)); + if (xfer->tx.buf) + memcpy(msg->msg_payload, xfer->tx.buf, xfer->tx.len); +} + +/** + * msg_read_header() - Read SCMI header from transport SDU. + * + * @msg: transport SDU + * + * Return: SCMI header + */ +u32 msg_read_header(struct scmi_msg_payld *msg) +{ + return le32_to_cpu(msg->msg_header); +} + +/** + * msg_fetch_response() - Fetch response SCMI payload from transport SDU. + * + * @msg: transport SDU with response + * @len: transport SDU size + * @xfer: message being responded to + */ +void msg_fetch_response(struct scmi_msg_payld *msg, size_t len, + struct scmi_xfer *xfer) +{ + size_t prefix_len = sizeof(*msg) + sizeof(msg->msg_payload[0]); + + xfer->hdr.status = le32_to_cpu(msg->msg_payload[0]); + xfer->rx.len = min_t(size_t, xfer->rx.len, + len >= prefix_len ? len - prefix_len : 0); + + /* Take a copy to the rx buffer.. */ + memcpy(xfer->rx.buf, &msg->msg_payload[1], xfer->rx.len); +} + +/** + * msg_fetch_notification() - Fetch notification payload from transport SDU. + * + * @msg: transport SDU with notification + * @len: transport SDU size + * @max_len: maximum SCMI payload size to fetch + * @xfer: notification message + */ +void msg_fetch_notification(struct scmi_msg_payld *msg, size_t len, + size_t max_len, struct scmi_xfer *xfer) +{ + xfer->rx.len = min_t(size_t, max_len, + len >= sizeof(*msg) ? len - sizeof(*msg) : 0); + + /* Take a copy to the rx buffer.. */ + memcpy(xfer->rx.buf, msg->msg_payload, xfer->rx.len); +} -- 2.25.1