From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id BBF16C8303C for ; Wed, 2 Jul 2025 22:16:11 +0000 (UTC) Received: from boromir.ozlabs.org (localhost [127.0.0.1]) by lists.ozlabs.org (Postfix) with ESMTP id 4bXZ2n558rz2yYJ; Thu, 3 Jul 2025 08:15:13 +1000 (AEST) Authentication-Results: lists.ozlabs.org; arc=none smtp.remote-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1751494511; cv=none; b=dognp7ne0jscC+8re2h+2wfrgzQtX5ft7gdWzhHgf1dn2fBu9vvIiYFnLZXlMPrtXERZlPnuUuthqgf4BwTJE+l4bZMG4LebQu0vsJJmSP5lYfrSCdXxJa+tyBGpAEt9pPEmUWVWTMNh+bGZx1YxkUZSyejX7c4AJ47KLnNbsWYNBal1NbTa9YjLnEGm30Tj5BZ4ooLVr0C8/FDFxIggro8UUkBZ59DcUEN986fzEhCFwss29L51OY2FmQAGq8iXtCb7jY2LwBlZneP0yGGP2y0jN858lmmACL7SndiE0OaCx1kXBZ7c0B2i18qERoZMfPq/koovnK8EaIWAohY9Hg== ARC-Message-Signature: i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1751494511; c=relaxed/relaxed; bh=beX79eOXlR3+dj6shhNCAtbb5Ayn99yavqV3vjZArhE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PJ0PJ+Ov2EvTvZMpdkf5gtGl4C+Mie6uCpuASjgbZuzOVZaeNff8qN52LUSCLRKEph8qciATGDdtA/k/kdUCLLar6NQT0lD6Q+G1jRoQ2inDLDJIiFBW/SpvKbAUSuY/UBbsWm7rUIbNymJn0VAsQOU7jmOzDlvtMhNhmgjUmPJO4vYwdysk8cg16qCqDV+iJtvsubpSU3vDxqiNjJhBrTtdiz8otzFL3ZureHyO9oSJJgd8ItVMEEOMsMUqM5FLaUibb/DGAQdRhReF9VKqffN0n99mMXMG3MlxnOxQTyAJ42d+tw6HugHxUMat8HX2OTFIR0aoeaMZlI3yPeIQPA== ARC-Authentication-Results: i=1; lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; dkim=pass (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=aoWO36kG; dkim-atps=neutral; spf=pass (client-ip=148.163.158.5; helo=mx0b-001b2d01.pphosted.com; envelope-from=haren@linux.ibm.com; receiver=lists.ozlabs.org) smtp.mailfrom=linux.ibm.com Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=aoWO36kG; dkim-atps=neutral Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=linux.ibm.com (client-ip=148.163.158.5; helo=mx0b-001b2d01.pphosted.com; envelope-from=haren@linux.ibm.com; receiver=lists.ozlabs.org) Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4bXZ2g5Glfz2xRq for ; Thu, 3 Jul 2025 08:15:07 +1000 (AEST) Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 562FBdFp024412; Wed, 2 Jul 2025 22:14:59 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=beX79eOXlR3+dj6sh hNCAtbb5Ayn99yavqV3vjZArhE=; b=aoWO36kGsaDHzE8o1rW+9Aam5Myn1FINT oPRfFfa6xCEOxmN2G/Mln41ukINKt7uXDCiEeQx9xkVPKrrJLQsfpGYgbX386OPQ bzdyVyCT4x+iBWapDmazvi/GVYwirWyWMFf1LuG76Dyxq07RsnJtMOC05boTOwh5 D8jrbMRR2pzuCB/gwxf5KDGxFOX37InRRvxt41uHKmcC7ZjVmVuLHscQ1nubNVL8 +WhjtfhhaS3dAA89DAPZQrAIOqKcR9WY/ey+UGMEEUC+ZI3s95zAhQdbtQAzDir3 Ku6y3kl7jDwgUUbuG9hhSajjnK7xIPIYZsok+RVwLQkLHwkBN0XBA== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 47j82fysbj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 02 Jul 2025 22:14:59 +0000 (GMT) Received: from m0360072.ppops.net (m0360072.ppops.net [127.0.0.1]) by pps.reinject (8.18.0.8/8.18.0.8) with ESMTP id 562MEMjP027704; Wed, 2 Jul 2025 22:14:58 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 47j82fysbe-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 02 Jul 2025 22:14:58 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 562K6CLT021112; Wed, 2 Jul 2025 22:14:57 GMT Received: from smtprelay01.wdc07v.mail.ibm.com ([172.16.1.68]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 47jtquhye3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 02 Jul 2025 22:14:57 +0000 Received: from smtpav03.dal12v.mail.ibm.com (smtpav03.dal12v.mail.ibm.com [10.241.53.102]) by smtprelay01.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 562MEsVs22741310 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 2 Jul 2025 22:14:54 GMT Received: from smtpav03.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1BEA15803F; Wed, 2 Jul 2025 22:14:54 +0000 (GMT) Received: from smtpav03.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 69D9C58056; Wed, 2 Jul 2025 22:14:53 +0000 (GMT) Received: from li-4910aacc-2eed-11b2-a85c-d93b702d4d28.ibm.com.com (unknown [9.61.17.45]) by smtpav03.dal12v.mail.ibm.com (Postfix) with ESMTP; Wed, 2 Jul 2025 22:14:53 +0000 (GMT) From: Haren Myneni To: linuxppc-dev@lists.ozlabs.org Cc: maddy@linux.ibm.com, mpe@ellerman.id.au, npiggin@gmail.com, msuchanek@suse.de, mahesh@linux.ibm.com, tyreld@linux.ibm.com, hbabu@us.ibm.com, haren@linux.ibm.com Subject: [PATCH RFC 4/9] powerpc/pseries: Send payload with ibm,send-hvpipe-msg RTAS Date: Wed, 2 Jul 2025 15:14:38 -0700 Message-ID: <20250702221444.879256-5-haren@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20250702221444.879256-1-haren@linux.ibm.com> References: <20250702221444.879256-1-haren@linux.ibm.com> X-Mailing-List: linuxppc-dev@lists.ozlabs.org List-Id: List-Help: List-Owner: List-Post: List-Archive: , List-Subscribe: , , List-Unsubscribe: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: w6qLnad6xQO8wBniqZcFtezgTzfsJA8b X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNzAyMDE4MSBTYWx0ZWRfXyz3zDx7X4Ztk KGoST6QQcJFIN12TIDKlfu6ojbYHcbl8iSYAvZ7lBX2RVxNTnT09hxf5uUcHQLUfoifRhioROVj G1uJ2Rp1jvoeN5bCg5/bkmNPoWrsaQ0oZQL3VUiDJ/g7AhvHPgIM4VF7olWOBlu8cg7b2OrxO5I 1Odf0pwDRz1SIgHNw2znpu+ytOavfHGVebx2LPCeKFRwrN7G/zKA2LbHv2XQ7OXskankAADqOVD bCz/0CtGZ2UEWzRJf8Hna5e1Tup7I9QYlYAF8eOo3bErbQKcmO5UpxbBi9mAF8Q1oamnZp+VxYz reTWIpyomMGgupzEvm9zgpfHNAWFGK4jbCZetMYYZB8HNYSdPl/TBzPVKJjGshOsteCUgY7Rey4 GqeF4DlLuf69PPlkr/6jBHcjoTOUWfgV/WauXzmbGBro4/X/6MBEOCI1dtbUdjfqJes6dnEt X-Authority-Analysis: v=2.4 cv=LpeSymdc c=1 sm=1 tr=0 ts=6865af63 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=Wb1JkmetP80A:10 a=VnNF1IyMAAAA:8 a=lTP4BkPL7ZkNV5ngu4UA:9 X-Proofpoint-GUID: vJmL1uokazXL_rwRpBzu9ZnzkDMBTXXA X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.7,FMLib:17.12.80.40 definitions=2025-07-02_04,2025-07-02_04,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 bulkscore=0 lowpriorityscore=0 adultscore=0 clxscore=1015 impostorscore=0 mlxscore=0 mlxlogscore=999 phishscore=0 suspectscore=0 malwarescore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505280000 definitions=main-2507020181 ibm,send-hvpipe-msg RTAS call is used to send data to the source (Ex: Hardware Management Console) over the hypervisor pipe. The maximum data length of 4048 bytes is supported with this RTAS call right now. The user space uses write() to send this payload which invokes this RTAS. Then the write returns the buffer length (including papr_hvpipe_hdr length) to the user space for success or RTAS failure error. ibm,send-hvpipe-msg call takes source ID as target and the buffer in the form of buffer list. The buffer list format consists of work area of size 4K to hold buffer list and number of 4K work areas depends on buffers is as follows: Length of Buffer List in bytes Address of 4K buffer 1 Length of 4K buffer 1 used ... Address of 4K buffer n Length of 4K buffer n used Only one buffer is used right now because of max payload size is 4088 bytes. writev() can be used in future when supported more than one buffer. Signed-off-by: Haren Myneni --- arch/powerpc/platforms/pseries/papr-hvpipe.c | 120 ++++++++++++++++++- arch/powerpc/platforms/pseries/papr-hvpipe.h | 7 ++ 2 files changed, 126 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/pseries/papr-hvpipe.c b/arch/powerpc/platforms/pseries/papr-hvpipe.c index 5768d072859d..c30f4d75e645 100644 --- a/arch/powerpc/platforms/pseries/papr-hvpipe.c +++ b/arch/powerpc/platforms/pseries/papr-hvpipe.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "pseries.h" #include "papr-hvpipe.h" @@ -59,6 +60,51 @@ static LIST_HEAD(hvpipe_src_list); * return code for failure. */ +/* + * ibm,send-hvpipe-msg RTAS call + * @area: Caller-provided work area buffer to send. + * @srcID: Target source for the send pipe message. + */ +static int rtas_ibm_send_hvpipe_msg(struct rtas_work_area *area, u32 srcID) +{ + const s32 token = rtas_function_token(RTAS_FN_IBM_SEND_HVPIPE_MSG); + s32 fwrc; + int ret; + + if (token == RTAS_UNKNOWN_SERVICE) + return -ENOENT; + + do { + fwrc = rtas_call(token, 2, 1, NULL, srcID, + rtas_work_area_phys(area)); + + } while (rtas_busy_delay(fwrc)); + + switch (fwrc) { + case RTAS_SUCCESS: + ret = 0; + break; + case RTAS_HARDWARE_ERROR: + ret = -EIO; + break; + case RTAS_INVALID_PARAMETER: + ret = -EINVAL; + break; + case RTAS_HVPIPE_CLOSED: + ret = -EACCES; + break; + case RTAS_FUNC_NOT_SUPPORTED: + ret = -EOPNOTSUPP; + break; + default: + ret = -EIO; + pr_err_ratelimited("unexpected ibm,receive-hvpipe-msg status %d\n", fwrc); + break; + } + + return ret; +} + static struct hvpipe_source_info *hvpipe_find_source(u32 srcID) { struct hvpipe_source_info *src_info; @@ -78,11 +124,83 @@ static ssize_t papr_hvpipe_handle_write(struct file *file, const char __user *buf, size_t size, loff_t *off) { struct hvpipe_source_info *src_info = file->private_data; + struct rtas_work_area *work_area, *work_buf; + unsigned long ret, len; + char *area_buf; if (!src_info) return -EIO; - return 0; + /* + * Send HVPIPE RTAS is used to send payload to the specific + * source with the input parameters source ID and the payload + * as buffer list. Each entry in the buffer list contains + * address/length pair of the buffer. + * + * The buffer list format is as follows: + * + * Header (length of address/length pairs and the header length) + * Address of 4K buffer 1 + * Length of 4K buffer 1 used + * ... + * Address of 4K buffer n + * Length of 4K buffer n used + * + * See PAPR 7.3.32.2 ibm,send-hvpipe-msg + * + * Even though can support max 1MB payload, the hypervisor + * supports only 4048 bytes payload at present and also + * just one address/length entry. + * + * writev() interface can be added in future when the + * hypervisor supports multiple buffer list entries. + */ + /* HVPIPE_MAX_WRITE_BUFFER_SIZE = 4048 bytes */ + if ((size > (HVPIPE_HDR_LEN + HVPIPE_MAX_WRITE_BUFFER_SIZE)) || + (size <= HVPIPE_HDR_LEN)) + return -EINVAL; + + /* + * The length of (address + length) pair + the length of header + */ + len = (2 * sizeof(u64)) + sizeof(u64); + size -= HVPIPE_HDR_LEN; + buf += HVPIPE_HDR_LEN; + mutex_lock(&rtas_ibm_send_hvpipe_msg_lock); + work_area = rtas_work_area_alloc(SZ_4K); + if (!work_area) { + ret = -ENOMEM; + goto out; + } + area_buf = rtas_work_area_raw_buf(work_area); + /* header */ + *(u64 *)area_buf = cpu_to_be64(len); + area_buf += sizeof(u64); + + work_buf = rtas_work_area_alloc(SZ_4K); + if (!area_buf) { + ret = -ENOMEM; + goto out_work; + } + /* First buffer address */ + *(u64 *)area_buf = cpu_to_be64(rtas_work_area_phys(work_buf)); + area_buf += sizeof(u64); + /* First buffer address length */ + *(u64 *)area_buf = cpu_to_be64(size); + + if (!copy_from_user(rtas_work_area_raw_buf(work_buf), buf, size)) { + ret = rtas_ibm_send_hvpipe_msg(work_area, src_info->srcID); + if (!ret) + ret = size + HVPIPE_HDR_LEN; + } else + ret = -EPERM; + + rtas_work_area_free(work_buf); +out_work: + rtas_work_area_free(work_area); +out: + mutex_unlock(&rtas_ibm_send_hvpipe_msg_lock); + return ret; } /* diff --git a/arch/powerpc/platforms/pseries/papr-hvpipe.h b/arch/powerpc/platforms/pseries/papr-hvpipe.h index 3b6f9e737913..6f98da4ec45f 100644 --- a/arch/powerpc/platforms/pseries/papr-hvpipe.h +++ b/arch/powerpc/platforms/pseries/papr-hvpipe.h @@ -3,6 +3,13 @@ #define _PAPR_HVPIPE_H #define HVPIPE_HMC_ID_MASK 0x02000000 /*02-HMC,00-reserved and HMC ID */ +#define HVPIPE_MAX_WRITE_BUFFER_SIZE 4048 +/* + * hvpipe specific RTAS return values + */ +#define RTAS_HVPIPE_CLOSED -4 + +#define HVPIPE_HDR_LEN sizeof(struct papr_hvpipe_hdr) struct hvpipe_source_info { struct list_head list; /* list of sources */ -- 2.43.5