From nobody Sun Feb 8 17:40:41 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3DF372D46A2 for ; Tue, 4 Nov 2025 05:39:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762234760; cv=none; b=K9T8H8dSuJs5IcvfrVee8+hgCnnV7z4GJdrMSGK6+Ch4P9qbj23PV31Kzg+wIM8jC4BXrYAy8NcsQfFon3PRyEH3CKKwRooq/1EphRNC8KSAZ0QNEwK5ZFDp0H9gi+1xjDKuHlxklXnH5GT5/rMpvEtOJTljKTeCJlyDjkV/Bhw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762234760; c=relaxed/simple; bh=kaPZfxDmcOGlouBOCCGfzoFVA+IiVr7/OjA0nNyoRvo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pxXE71zrO7DhghXjSU2KOpZf94UFt9hTgttYvc228oefBjzcjzT9cyrCljlMjFaIDq5YHfntQVVGaqrDwrhVR3XYxmicMpfhTlYdd9TV6oTUbyOwmsF9ee+RAZo9YF1cFQR12j5J9BNuwXvW8wI+u1MbiSg8FGDOYYWP9uu1R54= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=ETmTyWbj; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Xdj8W3xz; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="ETmTyWbj"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Xdj8W3xz" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5A45HQBQ1062183 for ; Tue, 4 Nov 2025 05:39:17 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= ZBxNszv/E0Kr5cUurGe5uw2qNNxsAhWhxVOI99s9tns=; b=ETmTyWbjVedQgQvP B7Vb1cTBMFp3nIe71MJVLqq0vXtI33gHNttj0ExUCAStrNcl0E3qimG8ChryMvXh 29xLY6XsTp4iUfPaPXgA+d1hQVKZpKoC/OfgvVn+BpZaOqqfnpNBgS1SAG4TGSW6 jTJUhoDKvgKpxN9cuXYh6IcxtY7dnWYapfrEbHbs/RJ8aGpjGHFSiHRJ4uSczchS C2CXvN0xRbtggaBUK5UwH6lh47PqE41B3rWJL34vzLuiM/esYdyObq6E/nBWVNdt VmpNJYdvPO6rmqyuv4OT3NICD/R8uG24L1zvjvI4H2bWmWpWhXMkAaUq4mV6aFEo 66ayiw== Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4a7b6pr1kc-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 04 Nov 2025 05:39:17 +0000 (GMT) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-781253de15aso12646726b3a.2 for ; Mon, 03 Nov 2025 21:39:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1762234757; x=1762839557; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ZBxNszv/E0Kr5cUurGe5uw2qNNxsAhWhxVOI99s9tns=; b=Xdj8W3xzY1CvUThzXBw4E+8xLcRSE91fDtfW/T4rHbHHM/WtwxFdBSjGL359cUTDJM sqTKqT/ir3AeHYFrgKrGF0TUo7IkmSYOAgVVniPNgoAK/Beb385oOw5TwpPYdlLAR9oa Jdldm52ZPQs18TvcpMNJsM2VTChOXpkNNEZYz6ZH80yvFDyo4tn5DX511T3gmZoW4y8N xBpk0SbBXzmGdi3vVJkfAkkzhkhLG4TA+h1SADfkzj61rpeAWfUkrsXb6hoy/r4xjq0u 231QAUmI5QbdVotDXQyBu65DdI30UPZOgjeubTK5YbIyZ5/vSc6MEZaDKNEMWKxJz3At IBOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762234757; x=1762839557; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZBxNszv/E0Kr5cUurGe5uw2qNNxsAhWhxVOI99s9tns=; b=TqN4TqqI821Yx9kraf8QBojBwQypJeMpEw5uCZ8fS+LPQlqsZ+T7YVDAvoLKqee4by 15/W1JDid+VFDmtV7uB7XAHZFtffV4RTKiRzSRHjUHC/+E4hPj/cwLUpw4Jl4ZDskxlJ +MQ3A1KWSUmACE1EIk32vvpjD4cBy/KeMotz1uMar3JgOBNfb7mmNf04DCu824kLb7vr 8AxYpesOEiE0l5gWAH0FTkTJniustXlJ5qOLlkEmwXtb9SA4ZA/zl/0GaemYJrsnDnSo KFaHKzWZl3C/yGzh7ARkJmEW3Ll63WyK89G7D45M6x68vVc/490RBcFCoWWkjfuRVwos XsPw== X-Forwarded-Encrypted: i=1; AJvYcCXaShG7wU9XxaLZR2pxmBzCVOZ1ZGuzjCLEVFmYRbDUj65BCPYr/GrEbiI/dWbIJbW2n8gbA7FyA6C8alA=@vger.kernel.org X-Gm-Message-State: AOJu0YwUNk59n6fOL+DbJxXgbbdwGtlCheGqo8FJnOUa5JsU3G+yDMa0 2ql29D4iKGfUeu3xpxtojxtxefmRInhBYcDtVIW0+Zs0WfvmjIlEc21BQurne3Tr2CvYg1jjs+m MaZ0GaJZCyqZlmHkkUfDI7GazeKgY+sDYkstOdIeLu/Q3QLzQ+4OPaUXxlgWdo03QBao= X-Gm-Gg: ASbGncuRWnXmrH53BaordhQfVdQC6cYZ+2Z27wG978WJd+HxtAn1CtCSiNCqLbgF/Zd 0n6kht+t8kEBnxXnL1XiAvVb5SaVGajHGyv/Y38fPgXqc1SrVfnBf5sdSJ2z7juSVVKibufk1Bw 7lZUopD8rPjerHKJqfkuxXcFwJDMWmbaJIm2zWvaCn0rO/XI5Xnv4vM6KOlyQPOstJBa1l1GIfT Un/gNXujb2ff3QV3TYFqh6qtdSSFAbqLjO9dmmnpKeu2/9oK5NyxLSfOERoLVosFnuPctG+1ErO 95lcy1FERoZ5Mn5TmtJDYouK4pYQwg3CvF4+q9l3htkOWnSzxieRq9BT9LqBkrMb9A5dqP2Imhg CqFydgb5oGa6cqxbwrGPa9NwZ X-Received: by 2002:a05:6a00:94db:b0:7a2:6485:f336 with SMTP id d2e1a72fcca58-7a7788ffe7cmr19239448b3a.16.1762234756720; Mon, 03 Nov 2025 21:39:16 -0800 (PST) X-Google-Smtp-Source: AGHT+IFXM4m2XR8dijko5+Hh4DhL2QdvemJAkeUf3MHkWwUCsB0vre3ViPGThhyyqTAsTZOKoHAARw== X-Received: by 2002:a05:6a00:94db:b0:7a2:6485:f336 with SMTP id d2e1a72fcca58-7a7788ffe7cmr19239425b3a.16.1762234756110; Mon, 03 Nov 2025 21:39:16 -0800 (PST) Received: from hu-sumk-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7acd3150f0asm1462402b3a.2.2025.11.03.21.39.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Nov 2025 21:39:15 -0800 (PST) From: Sumit Kumar Date: Tue, 04 Nov 2025 11:09:05 +0530 Subject: [PATCH v2 1/3] bus: mhi: host: Add loopback driver with sysfs interface Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251104-loopback_mhi-v2-1-727a3fd9aa74@oss.qualcomm.com> References: <20251104-loopback_mhi-v2-0-727a3fd9aa74@oss.qualcomm.com> In-Reply-To: <20251104-loopback_mhi-v2-0-727a3fd9aa74@oss.qualcomm.com> To: Manivannan Sadhasivam Cc: Krishna Chaitanya Chundru , Akhil Vinod , Subramanian Ananthanarayanan , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-arm-msm@vger.kernel.org, quic_vpernami@quicinc.com, Sumit Kumar X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1762234749; l=12222; i=sumit.kumar@oss.qualcomm.com; s=20250409; h=from:subject:message-id; bh=kaPZfxDmcOGlouBOCCGfzoFVA+IiVr7/OjA0nNyoRvo=; b=wt0kgpOwING3qGfkHdjF/YUzDgEHSacUP+qtyPJeF2mYZiBJt0qFJ3hcrPydCUL2wvSaa0RBW Oqd8WdTqHLECW7tz6e/yqBA723qAXEqrNVTHxv18VL+CBZTcpcf2nSk X-Developer-Key: i=sumit.kumar@oss.qualcomm.com; a=ed25519; pk=3cys6srXqLACgA68n7n7KjDeM9JiMK1w6VxzMxr0dnM= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTA0MDA0NCBTYWx0ZWRfX/91wTzigQNAv 4sh9teA6G1JrRWfA4ODjuUxJ6WxYSCOJnTDOVDD+Z6WdyUw7aSMRNPxqTgFPBE1W+a4SFcUe3z7 l1GkdxCOCeBBYUSgXe7WmHOYdMR5fd8fxlDX+ABqoSEpJ62zLm9PklLauWhNQkT0zHIit4f6URe 9DS0ylB9BQM/mki7M3TrqqkQ/RBw2SgqYDo/lfRuKLWPYP3OyZsQIoM0qbYdPjvs1VFT+pTaBo9 NcF5V7bjxqYDInk2Lxm7S6gmq0XahHcnkktATkOCuc+UBv5dDINvnoLYjJYcX1SRA3ABc8/gVfY x6+pGVdlqjpvdWup/2RfuZwobKi56c6UhPIu/DmM8X9lrXwiqStLIOhygHeFkn7O4fHqD2HUNgv /2lywCdukfRPe/MpfjSEFN9y1EcB8w== X-Proofpoint-GUID: IJ9T6mH8MGg2iwgjfJZRfe8xKiVEGviq X-Proofpoint-ORIG-GUID: IJ9T6mH8MGg2iwgjfJZRfe8xKiVEGviq X-Authority-Analysis: v=2.4 cv=Y4L1cxeN c=1 sm=1 tr=0 ts=69099185 cx=c_pps a=m5Vt/hrsBiPMCU0y4gIsQw==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=6UeiqGixMTsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=bacY0d_NKaLyk7ydmrwA:9 a=QEXdDO2ut3YA:10 a=IoOABgeZipijB_acs4fv:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-11-03_06,2025-11-03_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 suspectscore=0 phishscore=0 bulkscore=0 impostorscore=0 spamscore=0 adultscore=0 malwarescore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2511040044 Add loopback driver for MHI host controllers that provides sysfs based testing interface for data path validation. The driver supports the "LOOPBACK" channel and offers configurable test parameters. Sysfs interface provides: - size: Configure TRE size - num_tre: Set number of TREs for chained transfers - start: Initiate loopback test - status: Read test results Co-developed-by: Krishna Chaitanya Chundru Signed-off-by: Krishna Chaitanya Chundru Signed-off-by: Sumit Kumar --- drivers/bus/mhi/host/Kconfig | 7 + drivers/bus/mhi/host/Makefile | 1 + drivers/bus/mhi/host/mhi_loopback.c | 347 ++++++++++++++++++++++++++++++++= ++++ 3 files changed, 355 insertions(+) diff --git a/drivers/bus/mhi/host/Kconfig b/drivers/bus/mhi/host/Kconfig index da5cd0c9fc620ab595e742c422f1a22a2a84c7b9..08a39ecb47f585bf39721c101ed= 5e2ff44bdd5f8 100644 --- a/drivers/bus/mhi/host/Kconfig +++ b/drivers/bus/mhi/host/Kconfig @@ -29,3 +29,10 @@ config MHI_BUS_PCI_GENERIC This driver provides MHI PCI controller driver for devices such as Qualcomm SDX55 based PCIe modems. =20 +config MHI_BUS_LOOPBACK + tristate "MHI loopback driver" + depends on MHI_BUS + help + MHI loopback driver for data path testing. This driver + provides a mechanism to test MHI data transfer functionality + by implementing an echo service between host and endpoint. diff --git a/drivers/bus/mhi/host/Makefile b/drivers/bus/mhi/host/Makefile index 859c2f38451c669b3d3014c374b2b957c99a1cfe..e5d6dccf5a976eaeb827c47924a= d0614c9958f8b 100644 --- a/drivers/bus/mhi/host/Makefile +++ b/drivers/bus/mhi/host/Makefile @@ -4,3 +4,4 @@ mhi-$(CONFIG_MHI_BUS_DEBUG) +=3D debugfs.o =20 obj-$(CONFIG_MHI_BUS_PCI_GENERIC) +=3D mhi_pci_generic.o mhi_pci_generic-y +=3D pci_generic.o +obj-$(CONFIG_MHI_BUS_LOOPBACK) +=3D mhi_loopback.o diff --git a/drivers/bus/mhi/host/mhi_loopback.c b/drivers/bus/mhi/host/mhi= _loopback.c new file mode 100644 index 0000000000000000000000000000000000000000..980ace675718a79c97d9b2968cc= ef04c992a6c20 --- /dev/null +++ b/drivers/bus/mhi/host/mhi_loopback.c @@ -0,0 +1,347 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MHI_LOOPBACK_DEFAULT_TRE_SIZE 32 +#define MHI_LOOPBACK_DEFAULT_NUM_TRE 1 +#define MHI_LOOPBACK_TIMEOUT_MS 5000 +#define MHI_LOOPBACK_MAX_TRE_SIZE SZ_64K + +struct mhi_loopback { + struct mhi_device *mdev; + struct mutex lb_mutex; + struct completion comp; + atomic_t num_completions_received; + char result[32]; + u32 num_tre; + u32 size; + bool loopback_in_progress; +}; + +static ssize_t size_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mhi_loopback *mhi_lb =3D dev_get_drvdata(dev); + + return sysfs_emit(buf, "%u\n", mhi_lb->size); +} + +static ssize_t size_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct mhi_loopback *mhi_lb =3D dev_get_drvdata(dev); + u32 val; + + if (kstrtou32(buf, 0, &val)) { + dev_err(dev, "Invalid size value\n"); + return -EINVAL; + } + + if (val =3D=3D 0 || val > MHI_LOOPBACK_MAX_TRE_SIZE) { + dev_err(dev, "Size must be between 1 and %u bytes\n", + MHI_LOOPBACK_MAX_TRE_SIZE); + return -EINVAL; + } + + guard(mutex)(&mhi_lb->lb_mutex); + if (mhi_lb->loopback_in_progress) + return -EBUSY; + + mhi_lb->size =3D val; + return count; +} +static DEVICE_ATTR_RW(size); + +static ssize_t num_tre_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mhi_loopback *mhi_lb =3D dev_get_drvdata(dev); + + return sysfs_emit(buf, "%u\n", mhi_lb->num_tre); +} + +static ssize_t num_tre_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct mhi_loopback *mhi_lb =3D dev_get_drvdata(dev); + u32 val; + int el_num; + + if (kstrtou32(buf, 0, &val)) { + dev_err(dev, "Invalid num_tre value\n"); + return -EINVAL; + } + + if (val =3D=3D 0) { + dev_err(dev, "Number of TREs cannot be zero\n"); + return -EINVAL; + } + + guard(mutex)(&mhi_lb->lb_mutex); + if (mhi_lb->loopback_in_progress) + return -EBUSY; + + el_num =3D mhi_get_free_desc_count(mhi_lb->mdev, DMA_TO_DEVICE); + if (val > el_num) { + dev_err(dev, "num_tre (%u) exceeds ring capacity (%d)\n", val, el_num); + return -EINVAL; + } + + mhi_lb->num_tre =3D val; + return count; +} +static DEVICE_ATTR_RW(num_tre); + +static ssize_t start_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct mhi_loopback *mhi_lb =3D dev_get_drvdata(dev); + void *send_buf __free(kfree) =3D NULL; + void *recv_buf __free(kfree) =3D NULL; + u32 total_size, tre_count, tre_size; + int ret, i; + + guard(mutex)(&mhi_lb->lb_mutex); + + if (mhi_lb->loopback_in_progress) + return -EBUSY; + + atomic_set(&mhi_lb->num_completions_received, 0); + mhi_lb->loopback_in_progress =3D true; + + tre_size =3D mhi_lb->size; + tre_count =3D mhi_lb->num_tre; + + strscpy(mhi_lb->result, "Loopback started", sizeof(mhi_lb->result)); + + total_size =3D tre_count * tre_size; + + recv_buf =3D kzalloc(total_size, GFP_KERNEL); + if (!recv_buf) { + strscpy(mhi_lb->result, "Memory allocation failed", sizeof(mhi_lb->resul= t)); + mhi_lb->loopback_in_progress =3D false; + return -ENOMEM; + } + + send_buf =3D kzalloc(total_size, GFP_KERNEL); + if (!send_buf) { + strscpy(mhi_lb->result, "Memory allocation failed", sizeof(mhi_lb->resul= t)); + mhi_lb->loopback_in_progress =3D false; + return -ENOMEM; + } + + for (i =3D 0; i < tre_count; i++) { + ret =3D mhi_queue_buf(mhi_lb->mdev, DMA_FROM_DEVICE, recv_buf + (i * tre= _size), + tre_size, MHI_EOT); + if (ret) { + dev_err(dev, "Unable to queue read TRE %d: %d\n", i, ret); + strscpy(mhi_lb->result, "Queue tre failed", sizeof(mhi_lb->result)); + mhi_lb->loopback_in_progress =3D false; + return ret; + } + } + + get_random_bytes(send_buf, total_size); + + reinit_completion(&mhi_lb->comp); + + for (i =3D 0; i < tre_count - 1; i++) { + ret =3D mhi_queue_buf(mhi_lb->mdev, DMA_TO_DEVICE, send_buf + (i * tre_s= ize), + tre_size, MHI_CHAIN); + if (ret) { + dev_err(dev, "Unable to queue send TRE %d (chained): %d\n", i, ret); + strscpy(mhi_lb->result, "Queue send failed", sizeof(mhi_lb->result)); + mhi_lb->loopback_in_progress =3D false; + return ret; + } + } + + ret =3D mhi_queue_buf(mhi_lb->mdev, DMA_TO_DEVICE, send_buf + (i * tre_si= ze), + tre_size, MHI_EOT); + if (ret) { + dev_err(dev, "Unable to queue final TRE: %d\n", ret); + strscpy(mhi_lb->result, "Queue final tre failed", sizeof(mhi_lb->result)= ); + mhi_lb->loopback_in_progress =3D false; + return ret; + } + + if (!wait_for_completion_timeout(&mhi_lb->comp, + msecs_to_jiffies(MHI_LOOPBACK_TIMEOUT_MS))) { + strscpy(mhi_lb->result, "Loopback timeout", sizeof(mhi_lb->result)); + dev_err(dev, "Loopback test timed out\n"); + mhi_lb->loopback_in_progress =3D false; + return -ETIMEDOUT; + } + + ret =3D memcmp(send_buf, recv_buf, total_size); + if (!ret) { + strscpy(mhi_lb->result, "Loopback successful", sizeof(mhi_lb->result)); + dev_info(dev, "Loopback test passed\n"); + } else { + strscpy(mhi_lb->result, "Loopback data mismatch", sizeof(mhi_lb->result)= ); + dev_err(dev, "Loopback test failed\n"); + ret =3D -EIO; + } + + mhi_lb->loopback_in_progress =3D false; + return ret; +} + +static DEVICE_ATTR_WO(start); + +static ssize_t status_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mhi_loopback *mhi_lb =3D dev_get_drvdata(dev); + + return sysfs_emit(buf, "%s\n", mhi_lb->result); +} +static DEVICE_ATTR_RO(status); + +static void mhi_loopback_dl_callback(struct mhi_device *mhi_dev, + struct mhi_result *mhi_res) +{ + struct mhi_loopback *mhi_lb =3D dev_get_drvdata(&mhi_dev->dev); + + if (!mhi_res->transaction_status) { + if (atomic_inc_return(&mhi_lb->num_completions_received) >=3D mhi_lb->nu= m_tre) { + atomic_set(&mhi_lb->num_completions_received, 0); + complete(&mhi_lb->comp); + } + } else { + dev_err(&mhi_dev->dev, "DL callback error: status %d\n", + mhi_res->transaction_status); + atomic_set(&mhi_lb->num_completions_received, 0); + complete(&mhi_lb->comp); + } +} + +static void mhi_loopback_ul_callback(struct mhi_device *mhi_dev, + struct mhi_result *mhi_res) +{ +} + +static int mhi_loopback_probe(struct mhi_device *mhi_dev, + const struct mhi_device_id *id) +{ + struct mhi_loopback *mhi_lb; + int rc; + + mhi_lb =3D devm_kzalloc(&mhi_dev->dev, sizeof(*mhi_lb), GFP_KERNEL); + if (!mhi_lb) + return -ENOMEM; + + mhi_lb->mdev =3D mhi_dev; + + dev_set_drvdata(&mhi_dev->dev, mhi_lb); + + mhi_lb->size =3D MHI_LOOPBACK_DEFAULT_TRE_SIZE; + mhi_lb->num_tre =3D MHI_LOOPBACK_DEFAULT_NUM_TRE; + mhi_lb->loopback_in_progress =3D false; + + mutex_init(&mhi_lb->lb_mutex); + strscpy(mhi_lb->result, "Loopback not started", sizeof(mhi_lb->result)); + + rc =3D sysfs_create_file(&mhi_dev->dev.kobj, &dev_attr_size.attr); + if (rc) { + dev_err(&mhi_dev->dev, "failed to create size sysfs file\n"); + goto out; + } + + rc =3D sysfs_create_file(&mhi_dev->dev.kobj, &dev_attr_num_tre.attr); + if (rc) { + dev_err(&mhi_dev->dev, "failed to create num_tre sysfs file\n"); + goto del_size_sysfs; + } + + rc =3D sysfs_create_file(&mhi_dev->dev.kobj, &dev_attr_start.attr); + if (rc) { + dev_err(&mhi_dev->dev, "failed to create start sysfs file\n"); + goto del_num_tre_sysfs; + } + + rc =3D sysfs_create_file(&mhi_dev->dev.kobj, &dev_attr_status.attr); + if (rc) { + dev_err(&mhi_dev->dev, "failed to create status sysfs file\n"); + goto del_start_sysfs; + } + + rc =3D mhi_prepare_for_transfer(mhi_lb->mdev); + if (rc) { + dev_err(&mhi_dev->dev, "failed to prepare for transfers\n"); + goto del_status_sysfs; + } + + init_completion(&mhi_lb->comp); + + return 0; + +del_status_sysfs: + sysfs_remove_file(&mhi_dev->dev.kobj, &dev_attr_status.attr); +del_start_sysfs: + sysfs_remove_file(&mhi_dev->dev.kobj, &dev_attr_start.attr); +del_num_tre_sysfs: + sysfs_remove_file(&mhi_dev->dev.kobj, &dev_attr_num_tre.attr); +del_size_sysfs: + sysfs_remove_file(&mhi_dev->dev.kobj, &dev_attr_size.attr); +out: + return rc; +} + +static void mhi_loopback_remove(struct mhi_device *mhi_dev) +{ + struct mhi_loopback *mhi_lb =3D dev_get_drvdata(&mhi_dev->dev); + + if (mhi_lb) + complete(&mhi_lb->comp); + + sysfs_remove_file(&mhi_dev->dev.kobj, &dev_attr_status.attr); + sysfs_remove_file(&mhi_dev->dev.kobj, &dev_attr_start.attr); + sysfs_remove_file(&mhi_dev->dev.kobj, &dev_attr_num_tre.attr); + sysfs_remove_file(&mhi_dev->dev.kobj, &dev_attr_size.attr); + mhi_unprepare_from_transfer(mhi_dev); + dev_set_drvdata(&mhi_dev->dev, NULL); +} + +static const struct mhi_device_id mhi_loopback_id_table[] =3D { + { .chan =3D "LOOPBACK"}, + {} +}; +MODULE_DEVICE_TABLE(mhi, mhi_loopback_id_table); + +static struct mhi_driver mhi_loopback_driver =3D { + .probe =3D mhi_loopback_probe, + .remove =3D mhi_loopback_remove, + .dl_xfer_cb =3D mhi_loopback_dl_callback, + .ul_xfer_cb =3D mhi_loopback_ul_callback, + .id_table =3D mhi_loopback_id_table, + .driver =3D { + .name =3D "mhi_loopback", + }, +}; + +module_mhi_driver(mhi_loopback_driver); + +MODULE_AUTHOR("Krishna chaitanya chundru "); +MODULE_AUTHOR("Sumit Kumar "); +MODULE_DESCRIPTION("MHI Host Loopback Driver"); +MODULE_LICENSE("GPL"); --=20 2.34.1 From nobody Sun Feb 8 17:40:41 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6D0FE2D9498 for ; Tue, 4 Nov 2025 05:39:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762234762; cv=none; b=lokR5c94SN1Bc9yu9X2WZ+vUEV1hgjtRB32l55uOQYWnDs9UPXtoAfxNW5DiCByjOLyNzhctJgEB1n2nwoWLXwSUy0l4Ft7HOPw5dPmWc1VYUJ8MN+3NrrtH0Umhfr6hJP4z2je6CRX1YomTkRfM6W1AbSLYP0mle3wn82paE+c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762234762; c=relaxed/simple; bh=dtuRZyZEtqGlK3U1hCkrQMWdm+YNj/fJVZiAp7dQZSw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=M1cZ2kJykuIkqDwkHq09zIpqOk+2y3mdGjvC9O/nSQbZb5PyHpCUfwEkpl8STkem8Bw5rmhCe9eCjo0+MAtqNLtue9pzHRkEd1SNiUn6t21NES1VdCHJaP2wnbqVdppJZG3rA8g/YM6wDjg03j4SahcfzaZwiOWN8UGBv4mzg38= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=HCtI5r6V; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=IHE/3FcT; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="HCtI5r6V"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="IHE/3FcT" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5A43bwTA3616850 for ; Tue, 4 Nov 2025 05:39:21 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= IjuSOJy8CVVTczhbx4CkNfodIVaw9oUxb4d0A+FKYtg=; b=HCtI5r6VEh9rj/9a EhN5tEhvLFJs5RahS6bAgJJZNBja75eoeGOqYVN4CLM6YDaVJHph7vXHJwgmTqWk 9ZmVA7zA2CwEnS9GtYwhZPWXmkWYsaVG8HRLCqJ12etY1+kgztlCn7HKREa3X/eS NeqZ5tJILoq8UGI6WCq9tHR/wTpCb7pxJ7ZNLGmiZTr6gV2QjW+oW3amk0TVSMw4 aNyxusM1/0T5GIrIU9NGfB+JmW+jrNLd+LB8ywWcx3DX0J5XDKB7O41C0fC4/Akj N9Dj3XArUU+rNgNFuv8Fne85+A3Tl2nJgcczyw+Ww1j4BOy1ezGOc70snqB8eRVL 84rWUg== Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4a70fhsry4-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 04 Nov 2025 05:39:20 +0000 (GMT) Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-b9939dc50e7so1779920a12.2 for ; Mon, 03 Nov 2025 21:39:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1762234760; x=1762839560; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=IjuSOJy8CVVTczhbx4CkNfodIVaw9oUxb4d0A+FKYtg=; b=IHE/3FcTafuS0OdXIuLsqm4IdY8q2Jx6Tr0NKJWjOUihqFbiif/aWW4aVRKznE2/Fg wPK2b0eVceYWPonF+BkcEzmaf5jIXReBfodS5E42LBTpVbQWFGnAGnS+VPIrlnGBrdhb e8Q8yADvRpHrvurG7ELQJmQoE3OPa8Fbco4yaUkXyKR5yCHujVVSB7T/u5NzNlABMkhZ y98Mvlk2w24E7Kv2K1e0hWGc5VVQBPHspzEpgH+oPiYXZppTuH7n3fNdXMyjMtfWXoJl /QW+Lhp+6TDybunvxuDqiwvX3/dX5fuGD5DgLkIAN7oiTNfeI+F735gDjpnNGs4pYm+8 wWLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762234760; x=1762839560; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IjuSOJy8CVVTczhbx4CkNfodIVaw9oUxb4d0A+FKYtg=; b=LJVUBHGalg0tZbmBjxqWFsx4IBfbu8uyUU9gYTWAuZm3KHb1DgGNlpuXqLuhzZiy0k VNJEmEsbPJDnXpKG5imZojG6TwjEGnaY5vsloOf2OcnuPKXL+EE5ZH+lRb7nrsjJwUaZ RVK+J+ZARZj9OjmrhSx2LXxJfON133AFkx7m5abCa+GeV64BzuqnngH7zQMnT6yGTpYg 6t6f+BOyR6x3QUqhgoElJ1j5idEBsXdKpKBpYpRzQNe0iIKRriLCFDI621injxKTyvmj WlU0O2QPfzz/ak3F3tUOw7stnb0SEz8Ppqz3zXv6Ff1PoZJ4ctQlt0CsiVYmVl8XQfvF F+Kg== X-Forwarded-Encrypted: i=1; AJvYcCW+BDrBvYSYXaxCIILDKCqs/cBH9oXeIuQmCrSebFn+vKMQJlZvrKxB2uoBwsfNlwNmuhEsb2aK3A2mp5Y=@vger.kernel.org X-Gm-Message-State: AOJu0Yw1zke72TvokgA+fnbY6l9ebHWyRYRlWvB/KwzNn/cCLmiHb+9g ld69PhT19uqAZBjkfMtc6ad7dqEwuH4osn2QaUv1ZlUWxIF/Sq9jZUAA9Je55t/3X8Hu4DEaQgx xht2ie7G2W7wmQhil8TOswOIL5xdChliPS1h3ELkFnEUgyqeJww6J1DBwt4EwnG/YXZw= X-Gm-Gg: ASbGncuJts97yBEP93IyaWY+oqjg5XBDeo00bPLf6ITlTQoc4HUJ3m8+CWUM7h+S3gp nX+46RxY29O3qihSgZjaXdQxJFcw7jqu07WHCDkJXvMRavrHGCJM1emwQyrSlK+rX5MgYp5vXSR kcFFDNrFwIT7fjvD3D1SpGMJaGCQF53DsvIFdGmBDitKXKH7S6ni4qXG/Sne1El+RyLbhkMTFKq 0SXxSXMHH8GeInpaVso0GaHJ48kCWOvecpggHsMC+cUcwRB08QAE1xGa8j9/lgcozu9lHaVXyMH CRg74PtgSvule9TDCs9RAWpmzFl1xyx5wuJXlIT+sVIoH6LDuMiNmLKp+woJMRqOKibb3mQfnjN iEr78NKqZo4xtS08r3QbEok4Q X-Received: by 2002:a05:6a21:33a9:b0:341:3b91:69d1 with SMTP id adf61e73a8af0-348c9d69eabmr16053844637.5.1762234760172; Mon, 03 Nov 2025 21:39:20 -0800 (PST) X-Google-Smtp-Source: AGHT+IH4oakAA99qWn20v9F+HqkC6GSdg8e3l70zkxie1GH4jCVBdFgzAOkin2sgcj0o0WonnR9e3A== X-Received: by 2002:a05:6a21:33a9:b0:341:3b91:69d1 with SMTP id adf61e73a8af0-348c9d69eabmr16053809637.5.1762234759546; Mon, 03 Nov 2025 21:39:19 -0800 (PST) Received: from hu-sumk-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7acd3150f0asm1462402b3a.2.2025.11.03.21.39.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Nov 2025 21:39:19 -0800 (PST) From: Sumit Kumar Date: Tue, 04 Nov 2025 11:09:06 +0530 Subject: [PATCH v2 2/3] bus: mhi: ep: Create mhi_ep_queue_buf API for raw buffer queuing Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251104-loopback_mhi-v2-2-727a3fd9aa74@oss.qualcomm.com> References: <20251104-loopback_mhi-v2-0-727a3fd9aa74@oss.qualcomm.com> In-Reply-To: <20251104-loopback_mhi-v2-0-727a3fd9aa74@oss.qualcomm.com> To: Manivannan Sadhasivam Cc: Krishna Chaitanya Chundru , Akhil Vinod , Subramanian Ananthanarayanan , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-arm-msm@vger.kernel.org, quic_vpernami@quicinc.com, Sumit Kumar X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1762234749; l=3486; i=sumit.kumar@oss.qualcomm.com; s=20250409; h=from:subject:message-id; bh=dtuRZyZEtqGlK3U1hCkrQMWdm+YNj/fJVZiAp7dQZSw=; b=anM+z/tuk/MuWJ6IIFZE7opgozQIgdOmTmSJhVlWnAbN8ndTGBEJix6HMiTuOgjL1hPgl7ZJw Hu6PxWCqPrwBg1wAsEYa93j9wN6jSQA0BPlntypUuxDxLWg09ZLZeql X-Developer-Key: i=sumit.kumar@oss.qualcomm.com; a=ed25519; pk=3cys6srXqLACgA68n7n7KjDeM9JiMK1w6VxzMxr0dnM= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTA0MDA0NCBTYWx0ZWRfX8iP41b4WFMfl Vt/OoKgztGTj0VK0kF1Un5IGwVA4s8kohYt/Mw/77usUhxHV3FpDQz8sPMsbo6UVjZBDzGlVpAf 8/pF19+BhNZlUVSZW5bhJE0xgcoca9d3zI2YE1G5fZ1HLAILKXCNZ60ItJfu0ny6KDvI+CoW6uJ ZoptNHKdhDtb9X6X3eEDukPvaQxn8EZaaeAGCK03ZCKUpGAxfclhiyhomPHOM7Cn0GTZXuEf2Xz AirLneCe8J9/Tzl/mbs64Ou53r5k76j0wzAsNGSAifkznYr8mf/GIlrAmdQXTmUzBPD5hpBMf/Q WULmswF0DSoLolv73RmUgaCIULvqwH1Vmc06im2G++Ay1wGE03gX74GdwhE+ogiBFh/2d/cSiPB PlN4wStNCg6nHeBW+DRSCUg3+wdPIg== X-Proofpoint-ORIG-GUID: NvckNwEbwZwZQU1sGsPzxYjW1f4UjD08 X-Authority-Analysis: v=2.4 cv=CbsFJbrl c=1 sm=1 tr=0 ts=69099188 cx=c_pps a=Qgeoaf8Lrialg5Z894R3/Q==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=6UeiqGixMTsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=udtdykpXU_nWVPwV3aUA:9 a=QEXdDO2ut3YA:10 a=x9snwWr2DeNwDh03kgHS:22 X-Proofpoint-GUID: NvckNwEbwZwZQU1sGsPzxYjW1f4UjD08 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-11-03_06,2025-11-03_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 bulkscore=0 impostorscore=0 suspectscore=0 lowpriorityscore=0 clxscore=1015 malwarescore=0 adultscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2511040044 Create and export a new mhi_ep_queue_buf() API that allows raw buffer queuing for client not using skb. Extract core logic for queuing buffers into a new internal mhi_ep_queue() function that provides a unified implementation for both mhi_ep_queue_skb() and mhi_ep_queue_buf(). This internal function uses a cb_buf parameter to handle both socket buffers and raw buffers through the same code path. --- drivers/bus/mhi/ep/main.c | 23 +++++++++++++++++------ include/linux/mhi_ep.h | 10 ++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/drivers/bus/mhi/ep/main.c b/drivers/bus/mhi/ep/main.c index b3eafcf2a2c50d95e3efd3afb27038ecf55552a5..f4b119a8dca2dbfb3ffc24b04c8= 5743fb57088fd 100644 --- a/drivers/bus/mhi/ep/main.c +++ b/drivers/bus/mhi/ep/main.c @@ -544,9 +544,9 @@ static void mhi_ep_skb_completion(struct mhi_ep_buf_inf= o *buf_info) =20 mhi_ep_ring_inc_index(ring); } - /* TODO: Handle partially formed TDs */ -int mhi_ep_queue_skb(struct mhi_ep_device *mhi_dev, struct sk_buff *skb) +static int mhi_ep_queue(struct mhi_ep_device *mhi_dev, void *buf, size_t l= en, + void *cb_buf) { struct mhi_ep_cntrl *mhi_cntrl =3D mhi_dev->mhi_cntrl; struct mhi_ep_chan *mhi_chan =3D mhi_dev->dl_chan; @@ -559,7 +559,7 @@ int mhi_ep_queue_skb(struct mhi_ep_device *mhi_dev, str= uct sk_buff *skb) u32 tre_len; int ret; =20 - buf_left =3D skb->len; + buf_left =3D len; ring =3D &mhi_cntrl->mhi_chan[mhi_chan->chan].ring; =20 mutex_lock(&mhi_chan->lock); @@ -582,13 +582,13 @@ int mhi_ep_queue_skb(struct mhi_ep_device *mhi_dev, s= truct sk_buff *skb) tre_len =3D MHI_TRE_DATA_GET_LEN(el); =20 tr_len =3D min(buf_left, tre_len); - read_offset =3D skb->len - buf_left; + read_offset =3D len - buf_left; =20 - buf_info.dev_addr =3D skb->data + read_offset; + buf_info.dev_addr =3D buf + read_offset; buf_info.host_addr =3D MHI_TRE_DATA_GET_PTR(el); buf_info.size =3D tr_len; buf_info.cb =3D mhi_ep_skb_completion; - buf_info.cb_buf =3D skb; + buf_info.cb_buf =3D cb_buf; buf_info.mhi_dev =3D mhi_dev; =20 /* @@ -627,8 +627,19 @@ int mhi_ep_queue_skb(struct mhi_ep_device *mhi_dev, st= ruct sk_buff *skb) =20 return ret; } + +int mhi_ep_queue_skb(struct mhi_ep_device *mhi_dev, struct sk_buff *skb) +{ + return mhi_ep_queue(mhi_dev, skb->data, skb->len, skb); +} EXPORT_SYMBOL_GPL(mhi_ep_queue_skb); =20 +int mhi_ep_queue_buf(struct mhi_ep_device *mhi_dev, void *buf, size_t len) +{ + return mhi_ep_queue(mhi_dev, buf, len, buf); +} +EXPORT_SYMBOL_GPL(mhi_ep_queue_buf); + static int mhi_ep_cache_host_cfg(struct mhi_ep_cntrl *mhi_cntrl) { size_t cmd_ctx_host_size, ch_ctx_host_size, ev_ctx_host_size; diff --git a/include/linux/mhi_ep.h b/include/linux/mhi_ep.h index 7b40fc8cbe77ab8419d167e89264b69a817b9fb1..7186eb667b081009927af485135= 19084fb0be3a6 100644 --- a/include/linux/mhi_ep.h +++ b/include/linux/mhi_ep.h @@ -302,4 +302,14 @@ bool mhi_ep_queue_is_empty(struct mhi_ep_device *mhi_d= ev, enum dma_data_directio */ int mhi_ep_queue_skb(struct mhi_ep_device *mhi_dev, struct sk_buff *skb); =20 +/** + * mhi_ep_queue_buf - Send buffer to host over MHI Endpoint + * @mhi_dev: Device associated with the DL channel + * @buf: Buffer to be queued + * @len: Size of the buffer + * + * Return: 0 if the buffer has been sent successfully, a negative error co= de otherwise. + */ +int mhi_ep_queue_buf(struct mhi_ep_device *mhi_dev, void *buf, size_t len); + #endif --=20 2.34.1 From nobody Sun Feb 8 17:40:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 146152DC798 for ; Tue, 4 Nov 2025 05:39:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762234767; cv=none; b=Ekug+QnxQQUdz78Gv99SJrdIQqpOF6oyaLfo1tBBqFCS2TXFqaqjIoMkjR/3mKgBvPawYAU1GYEnwgSUqWLM6x2PoBPzY4V3x/sr1MTJK6bealwGCilt1cKbw3VsdGq/L4TRg+Mz31EE8WAhlwsaoktb2ApoXnzSidlvg7yzths= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762234767; c=relaxed/simple; bh=55g5w1v7atZqC7FlHEyUgZm2ivpUlSG09PoKfW0YLDs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MiBovLUih8pBY9XkLjSkqsIsq+uDI6XZbq06X4jJNNqOyFr1T1eOetm6Cd8Yk/y5vgbvziQu0N4+MRA2kHgebCqXFoY0+KiJOgEWReMwg6UZnC7qAsAP4/DYpDZ8fqIIjF2+IE67xRwdSwymOrwbEI88pgl/mz8ScwIZzoAEaKw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=RaLZOUIY; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=egl8Nlzl; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="RaLZOUIY"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="egl8Nlzl" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5A42ChbV3682841 for ; Tue, 4 Nov 2025 05:39:25 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= HrNsyrAAQeANKLO/A4qgRpf2x7znZFLyg4LxquGbdIQ=; b=RaLZOUIYSddSVbNp 4IZjq9WCHxJua71F3TYJnNnOWayOkPZ5p6dG4rTbTUYfRt/nKLHQAEyUeXn9Ov2K QN/wqqDZAef2s7cqtjZSYv/dLNFJiUJSB1tWIMeO8yYOVs/Et89WGMKm4+kdPyzA R5t6/spZpnarsXkGMegfPSSCFJt7KhmgZA45PN4+ES76bJA0J5H2c78D6G8i0Xjj 6vCD4VXfMjUGJh5YgT4GIfLp9FcohpDtVe8kUssbFuVMDJJ+yjbKTMDsCYFvfsdr 0npAlvUWkAA21drOS84ZQmTvHC4lrCjPXjXX3BOvmiUAEtRoCfJYXinBoGsRSluI fX1zOQ== Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4a6xjqt7jw-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 04 Nov 2025 05:39:24 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-781171fe1c5so5118910b3a.0 for ; Mon, 03 Nov 2025 21:39:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1762234764; x=1762839564; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=HrNsyrAAQeANKLO/A4qgRpf2x7znZFLyg4LxquGbdIQ=; b=egl8Nlzlx3ojvrjB8vSsKwsvgW4xSJqeymqJJlTKDMC4+r47eflLlj68NabHBKx0pp VwGSJg0vZWFDVxKU5VUaGX32sSNSy5SjSR1iB3IE62Darfks9SSM/rglV2Z4yAxAzGfu CcfbHGreQzz4bbaVIG6wTYRPC/hDlEPT35oqWGdg6S1k5u11hdxnWs0Cy5j5m9EU1/nD FUHxWYZrJHh1Meq63fMi6Lp3+yYtbMrkye6B5mB5PnzaSZQfqk+mOwrE0beD1k4hH3HD CQu4IhlNNpSuIhJNvnwmQWnCXkkOJMlT1j22FY6Wll0bGukcA1eChXGkkPJqy6jjGOo3 EBvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762234764; x=1762839564; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HrNsyrAAQeANKLO/A4qgRpf2x7znZFLyg4LxquGbdIQ=; b=HFae0U39hfVcqlSb4BadDyd+QbPQBMTcDnubDFlKRAL2ef7o5ZGy44AtJWLUUDC/wd 4ov6+96zjjxWKrmzCe4GDgm2UJCqMd3Wn2Do38irvMWYfmOHuSoXMLnMIFQaJsZdBWdJ 2SxG99W+xMNgi48T06C+WN44QAbCMuoEKgmFqZxrT6s3XNnKm0AraoRY8GRu1p+BSmks 5qGY9dnBnRrfhauQs11APqRPyNOwMwefKoBVeKTsQtXKCFH+STscmVYjrQ1HKiifCWJ7 WcAGurxiIgRm/AXEeHLnHN/GBDBgr2DFlcyJYjSer3KfNy7/IgAcRIIWXB7hOgzCd/tH A8eg== X-Forwarded-Encrypted: i=1; AJvYcCUxwNGb/2Y++cRHK+4RtzNvAdTYMrZDLjrnwyzTQW9MDHYo5xWhXs211pt2EnfV55PX0NtX7wLJwB+hMd8=@vger.kernel.org X-Gm-Message-State: AOJu0YychMspW2lluIDka0PWkIbAjJcppgt7MXDoPU/nkX7ZgYBmLE8v p1qw1QW10v3eAlv8kpdRBDVDcoFSRHAXtJJ2eKp4HbHByjjs2KvvhZZyzkFOLT5YlaSOQSwlRX0 X/N1QLgAxWiB0/Y0ofiSerKu9pP2IQfFr5NjQVsyssq9QWAVE4hHbVWJLKO7SHckHQMNuHzeNb7 4= X-Gm-Gg: ASbGncvRVncvIDu8mM0IqlIN4iEihKi8TkLdJW0gy6555uCT7m0pdSbicfclsCJXdHH Xz//h4zb7OWdLitbfPo1EER3+fB/YKMeTVWi5HHAc1D9Lf7CMzkKYP98PGksim8G+KiaR8ScaON KEAur02AZvYtd3CfAGaolT4lJ4foZW070rbO5tFay6kiCeoL89Ne0NOsxCcCF2N1MljEKq4+Ajn SuJAz3PT+pmMbhvSp3O6X8M2TGgx4PN2/dC1V7msNR6XFXsF131FHBXdOE+dx/mEAFeQa8+hfvK klg2tasePTrTvam/4raReZH9KYaRhN2tWaS0uyopGefKPv+93qwRA4Lx6Z+PgcyY28kevT5eEhl 6KrbCwK+3ThtDvtoyjphyqwCZ X-Received: by 2002:a05:6a00:14d0:b0:77f:2dc4:4c16 with SMTP id d2e1a72fcca58-7a7791d1095mr18877078b3a.21.1762234763681; Mon, 03 Nov 2025 21:39:23 -0800 (PST) X-Google-Smtp-Source: AGHT+IEijn/jz8S7gAQ+A+SBLqSusKhoWImqfxlcp7ot10qdXI/K3YzGqGQaeNZiSmxENWVhzlFBfg== X-Received: by 2002:a05:6a00:14d0:b0:77f:2dc4:4c16 with SMTP id d2e1a72fcca58-7a7791d1095mr18877054b3a.21.1762234763045; Mon, 03 Nov 2025 21:39:23 -0800 (PST) Received: from hu-sumk-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7acd3150f0asm1462402b3a.2.2025.11.03.21.39.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Nov 2025 21:39:22 -0800 (PST) From: Sumit Kumar Date: Tue, 04 Nov 2025 11:09:07 +0530 Subject: [PATCH v2 3/3] bus: mhi: ep: Add loopback driver for data path testing Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251104-loopback_mhi-v2-3-727a3fd9aa74@oss.qualcomm.com> References: <20251104-loopback_mhi-v2-0-727a3fd9aa74@oss.qualcomm.com> In-Reply-To: <20251104-loopback_mhi-v2-0-727a3fd9aa74@oss.qualcomm.com> To: Manivannan Sadhasivam Cc: Krishna Chaitanya Chundru , Akhil Vinod , Subramanian Ananthanarayanan , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-arm-msm@vger.kernel.org, quic_vpernami@quicinc.com, Sumit Kumar X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1762234749; l=5851; i=sumit.kumar@oss.qualcomm.com; s=20250409; h=from:subject:message-id; bh=55g5w1v7atZqC7FlHEyUgZm2ivpUlSG09PoKfW0YLDs=; b=kjeVsgjb69vvWgdU7yVyZm+TBKSCTxucL+1PNaZwhP8PV4sxUhL0IANRu+uLhhqkvUiF0Kow1 hMFrvzyAYHfDzZ1st8Di7Jb8jSOJ0s+JEQ8YVv8z/4+OQa0QEJcHoAA X-Developer-Key: i=sumit.kumar@oss.qualcomm.com; a=ed25519; pk=3cys6srXqLACgA68n7n7KjDeM9JiMK1w6VxzMxr0dnM= X-Proofpoint-GUID: 1ROqaupctxdm2MNcrwRFtTd4waIsOxLg X-Proofpoint-ORIG-GUID: 1ROqaupctxdm2MNcrwRFtTd4waIsOxLg X-Authority-Analysis: v=2.4 cv=criWUl4i c=1 sm=1 tr=0 ts=6909918c cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=6UeiqGixMTsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=RyQsIt2LcgCPV6mEHuQA:9 a=QEXdDO2ut3YA:10 a=2VI0MkxyNR6bbpdq8BZq:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTA0MDA0NCBTYWx0ZWRfX7ueIsNAFGs1e N5GzSLLYUFcIekv0i94SVhltXAkFSiGzOCXFA2h3bre0L7LGE5ufX57wUhXeXwmdP6mNsvJDNKS t9B4cII2uo8J67pUEXKd/0/3VIDSZK4Qmv7T6YXsyHSKGaM4hjoMVVlbLxpNlIG+S9Xf3R+plCZ YF1EoPb7JxHtZIuVEQxQr+LmFSQWdZWZNYf3OuSQuMWI1jUa0pu2S8E7FKw5jU4QZLF71IoiBsW zxRkseC+l/Efjycmbo9wgcWic8VU3O14y/p9b41aklJNt0HnkVhekWHq7NPqrveQfp+CaQPitLI dqTlOGtmUhaKyMv5P2ch1cXWR1soBNd0UR0IS0+R32gfYIAtwtxAVSClVYii++FVyaEiUcPyda0 tjJvD0C1vroU8gRfibjMEaPM7IZVdA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-11-03_06,2025-11-03_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 priorityscore=1501 lowpriorityscore=0 phishscore=0 impostorscore=0 clxscore=1015 spamscore=0 suspectscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2511040044 Add loopback driver for MHI endpoint devices. The driver receives data on the uplink channel and echoes it back on the downlink channel using a workqueue for asynchronous processing. The driver is useful for testing MHI endpoint data path functionality and debugging communication issues. Co-developed-by: Krishna Chaitanya Chundru Signed-off-by: Krishna Chaitanya Chundru Signed-off-by: Sumit Kumar --- drivers/bus/mhi/ep/Kconfig | 8 +++ drivers/bus/mhi/ep/Makefile | 1 + drivers/bus/mhi/ep/mhi_ep_loopback.c | 134 +++++++++++++++++++++++++++++++= ++++ 3 files changed, 143 insertions(+) diff --git a/drivers/bus/mhi/ep/Kconfig b/drivers/bus/mhi/ep/Kconfig index 90ab3b040672e0f04181d4802e3062afcc7cf782..ce7b63c2da82a6ca49528517687= f4910552c35bb 100644 --- a/drivers/bus/mhi/ep/Kconfig +++ b/drivers/bus/mhi/ep/Kconfig @@ -8,3 +8,11 @@ config MHI_BUS_EP =20 MHI_BUS_EP implements the MHI protocol for the endpoint devices, such as SDX55 modem connected to the host machine over PCIe. + +config MHI_BUS_EP_LOOPBACK + tristate "MHI Endpoint loopback driver" + depends on MHI_BUS_EP + help + MHI endpoint loopback driver for data path testing. + This driver receives data on the uplink channel and echoes + it back on the downlink channel for testing purposes. diff --git a/drivers/bus/mhi/ep/Makefile b/drivers/bus/mhi/ep/Makefile index aad85f180b707fb997fcb541837eda9bbbb67437..02e4700e8dc3f860d40290476b0= a852286683f8f 100644 --- a/drivers/bus/mhi/ep/Makefile +++ b/drivers/bus/mhi/ep/Makefile @@ -1,2 +1,3 @@ obj-$(CONFIG_MHI_BUS_EP) +=3D mhi_ep.o mhi_ep-y :=3D main.o mmio.o ring.o sm.o +obj-$(CONFIG_MHI_BUS_EP_LOOPBACK) +=3D mhi_ep_loopback.o diff --git a/drivers/bus/mhi/ep/mhi_ep_loopback.c b/drivers/bus/mhi/ep/mhi_= ep_loopback.c new file mode 100644 index 0000000000000000000000000000000000000000..ba6154dd9b785f051043c10a980= ab340012ba986 --- /dev/null +++ b/drivers/bus/mhi/ep/mhi_ep_loopback.c @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#include +#include +#include + +struct mhi_ep_loopback { + struct workqueue_struct *loopback_wq; + struct mhi_ep_device *mdev; +}; + +struct mhi_ep_loopback_work { + struct mhi_ep_device *mdev; + struct work_struct work; + void *buf; + size_t len; +}; + +static void mhi_ep_loopback_work_handler(struct work_struct *work) +{ + struct mhi_ep_loopback_work *mhi_ep_lb_work =3D container_of(work, + struct mhi_ep_loopback_work, work); + int ret; + + ret =3D mhi_ep_queue_buf(mhi_ep_lb_work->mdev, mhi_ep_lb_work->buf, + mhi_ep_lb_work->len); + if (ret) { + dev_err(&mhi_ep_lb_work->mdev->dev, "Failed to send the packet\n"); + kfree(mhi_ep_lb_work->buf); + } + + kfree(mhi_ep_lb_work); +} + +static void mhi_ep_loopback_ul_callback(struct mhi_ep_device *mhi_dev, + struct mhi_result *mhi_res) +{ + struct mhi_ep_loopback *mhi_ep_lb =3D dev_get_drvdata(&mhi_dev->dev); + struct mhi_ep_loopback_work *mhi_ep_lb_work; + void *buf; + + if (!(mhi_res->transaction_status)) { + buf =3D kmalloc(mhi_res->bytes_xferd, GFP_KERNEL); + if (!buf) { + dev_err(&mhi_dev->dev, "Failed to allocate buffer\n"); + return; + } + + memcpy(buf, mhi_res->buf_addr, mhi_res->bytes_xferd); + + mhi_ep_lb_work =3D kmalloc(sizeof(*mhi_ep_lb_work), GFP_KERNEL); + if (!mhi_ep_lb_work) { + dev_err(&mhi_dev->dev, "Unable to allocate the work structure\n"); + kfree(buf); + return; + } + + INIT_WORK(&mhi_ep_lb_work->work, mhi_ep_loopback_work_handler); + mhi_ep_lb_work->mdev =3D mhi_dev; + mhi_ep_lb_work->buf =3D buf; + mhi_ep_lb_work->len =3D mhi_res->bytes_xferd; + + queue_work(mhi_ep_lb->loopback_wq, &mhi_ep_lb_work->work); + } +} + +static void mhi_ep_loopback_dl_callback(struct mhi_ep_device *mhi_dev, + struct mhi_result *mhi_res) +{ + void *buf; + + if (mhi_res->transaction_status) + return; + + buf =3D mhi_res->buf_addr; + if (buf) + kfree(buf); +} + +static int mhi_ep_loopback_probe(struct mhi_ep_device *mhi_dev, const stru= ct mhi_device_id *id) +{ + struct mhi_ep_loopback *mhi_ep_lb; + + mhi_ep_lb =3D devm_kzalloc(&mhi_dev->dev, sizeof(struct mhi_ep_loopback),= GFP_KERNEL); + if (!mhi_ep_lb) + return -ENOMEM; + + mhi_ep_lb->loopback_wq =3D alloc_ordered_workqueue("mhi_loopback", WQ_MEM= _RECLAIM); + if (!mhi_ep_lb->loopback_wq) { + dev_err(&mhi_dev->dev, "Failed to create workqueue.\n"); + return -ENOMEM; + } + + mhi_ep_lb->mdev =3D mhi_dev; + dev_set_drvdata(&mhi_dev->dev, mhi_ep_lb); + + return 0; +} + +static void mhi_ep_loopback_remove(struct mhi_ep_device *mhi_dev) +{ + struct mhi_ep_loopback *mhi_ep_lb =3D dev_get_drvdata(&mhi_dev->dev); + + destroy_workqueue(mhi_ep_lb->loopback_wq); + dev_set_drvdata(&mhi_dev->dev, NULL); +} + +static const struct mhi_device_id mhi_ep_loopback_id_table[] =3D { + { .chan =3D "LOOPBACK"}, + {} +}; +MODULE_DEVICE_TABLE(mhi, mhi_ep_loopback_id_table); + +static struct mhi_ep_driver mhi_ep_loopback_driver =3D { + .probe =3D mhi_ep_loopback_probe, + .remove =3D mhi_ep_loopback_remove, + .dl_xfer_cb =3D mhi_ep_loopback_dl_callback, + .ul_xfer_cb =3D mhi_ep_loopback_ul_callback, + .id_table =3D mhi_ep_loopback_id_table, + .driver =3D { + .name =3D "mhi_ep_loopback", + .owner =3D THIS_MODULE, + }, +}; + +module_mhi_ep_driver(mhi_ep_loopback_driver); + +MODULE_AUTHOR("Krishna chaitanya chundru "); +MODULE_AUTHOR("Sumit Kumar "); +MODULE_DESCRIPTION("MHI Endpoint Loopback driver"); +MODULE_LICENSE("GPL"); --=20 2.34.1