From nobody Sun Feb 8 21:41:42 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011009.outbound.protection.outlook.com [52.101.70.9]) (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 98D091DF96B for ; Wed, 29 Jan 2025 20:06:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.9 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738181173; cv=fail; b=U/RxCsZFjuAbbxHOWeSGC1lJ9RwZ5Wfqa5jflMQAow9J0ckdHbUXRv7AVU6BB1czJ35AonLpG7oLWFVirXc+LNpuqiljbZag4cVGXh9iEEe/pFeR4WsRvJ9Ws1oO0gh8azgvJfs2CrBQoJsbMbDsNMLdc7o6LZUKaUuQdionpv0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738181173; c=relaxed/simple; bh=Qv+OIZUavFWAsZsR0hppGZh+8cB7gwaFIH0gV7V5F2Q=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=bcwOjMDGJx7uKNbQM2v9EKjU7C5tfq8E7QylvS4rqa6XTcRO6V+BnvtSwEKpib5CWEzF7lBINqEtI2bOoT7Ez7MQK4x5VTXTISXr1waNbRfIkMXQ94vMxqpCBmA/9bvRKd75R1w6kt70VEl4GyD5/o6hRCmPHysBLSh8eBxWE6k= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=koL8xuk4; arc=fail smtp.client-ip=52.101.70.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="koL8xuk4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=TlxbHDjDrWLMEj4QoQ4AgdGVBkl7q6A5TkPq+wZ2YtobbuRrr8+dhBmglKECw1j5N0baQIB7h1J3g5DbZVxvhaCiRYC8jrrR6MJcsiHBUp9i9KyTxKRZW9iYnqrhSwxCpZgYVwjlsgo5eR/lCtZenRWE9n20LCmeAIicUAarSHt0RCENdPbZx4jcMORtwUl6f/ybSyjkiP4pQEa5+FnloiHLS66wRO0u5Gp51Xwqz48WTLV8LwHs0QASoyyG5dR47icyVnQ20P6uZNtM9Vr52uej7XjvIikImHN6xcKUW+5ltO8jhfo21UFMiiQblA2diNoVxXiXZhfbVTBBvYk8Gg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=5xn3u/pAWnMVPiqNzEyEfz/JVJtr2ST8EZyxY/LMSig=; b=EmCLDg6teR+t5dNg+LkYWj/QTo3PJTsmIDhOeXhCR9up6AYmk5fwW1bmnxOMZHM9cYn/SN6a2bU/1TCcAmrWWRkGUtr/LMwCbInDsY0QQES5wKdsBcFrF86SKuWtXkerVQnUGOOZrd1MzGVQwVzLixr/Ooa7gMPGn8KZpO3gbF3DyDqCZkOPHOutBhxPj0KqnJSAj+Gq3mr2a6+I1Y13is2cHdsQjo0tcxXO6pNj7DCOzK6X/TwDaG9E2eWAEJzqIJY7ky5VqgFa6QnkZGOz900wFyCeEMloQi5rKf18sSOy5AVyxalYE36qWs1m/2qDN9sXXEUPUpOMCIAn7x4EuQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5xn3u/pAWnMVPiqNzEyEfz/JVJtr2ST8EZyxY/LMSig=; b=koL8xuk4hr9/FKboVdXoqp7vJrua7sS/ig4ZFb+dl0Mq3svcWNfqAJMCD5UJPiAVahcVkxZAjzIba7UFmD1tQBuMA4vTrLRr+dWNk3vYb8eLhs1j35CR3g41bdGaryrEam78l57+HbNma7GILNSloMWJIXnt6QQ9C4AhcnxbKdHxppJ4s7QxaZpEkcxYpn6yRJeWVI9gceZSsg1Itq0ugK27uY+KHkIdr4BF5BwYKYRLdEnar50Uy9u5mzZQuXM9MsCB/xfSg/UKZtIUkZkIzPRmIaFrHJHRnMqlyvQfw6IpzW70p0NHNg5VqyRON54ehQyyZU+8I9OrsZXX/Dp2fw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from PAXPR04MB9642.eurprd04.prod.outlook.com (2603:10a6:102:240::14) by AS8PR04MB8995.eurprd04.prod.outlook.com (2603:10a6:20b:42e::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.18; Wed, 29 Jan 2025 20:06:07 +0000 Received: from PAXPR04MB9642.eurprd04.prod.outlook.com ([fe80::9126:a61e:341d:4b06]) by PAXPR04MB9642.eurprd04.prod.outlook.com ([fe80::9126:a61e:341d:4b06%5]) with mapi id 15.20.8377.021; Wed, 29 Jan 2025 20:06:07 +0000 From: Frank Li Date: Wed, 29 Jan 2025 15:05:52 -0500 Subject: [PATCH 1/2] i3c: Add basic HDR support Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250129-i3c_ddr-v1-1-028a7a5d4324@nxp.com> References: <20250129-i3c_ddr-v1-0-028a7a5d4324@nxp.com> In-Reply-To: <20250129-i3c_ddr-v1-0-028a7a5d4324@nxp.com> To: Alexandre Belloni , Miquel Raynal , Conor Culhane Cc: linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, Frank Li X-Mailer: b4 0.13-dev-e586c X-Developer-Signature: v=1; a=ed25519-sha256; t=1738181163; l=6612; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=Qv+OIZUavFWAsZsR0hppGZh+8cB7gwaFIH0gV7V5F2Q=; b=wrmGPkIgbj/nyGtRsl41Dg9/ksdiyaa8YDyPFqFJsuwVmv+5LyiPATNBBUDi7EijUYL54GK// DJs11Sq/Q/DCWe7ctzzPqw0N7Zgmzliqx0bXQJDGsCFdZFn0S65tbfD X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: BY5PR03CA0012.namprd03.prod.outlook.com (2603:10b6:a03:1e0::22) To PAXPR04MB9642.eurprd04.prod.outlook.com (2603:10a6:102:240::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB9642:EE_|AS8PR04MB8995:EE_ X-MS-Office365-Filtering-Correlation-Id: 587ad316-beb0-4472-ad9d-08dd40a05e18 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?NkhGQS9zMkliOXZ0VHp5YWxYaldybUt2R2lRR2xOMWhTRkZwSHVSMzkvb1cv?= =?utf-8?B?RkNnZUFVRFQybmlpbG45N2s4VGFReWJsRUg4ckg0dFZodWNNdHFNcUxCa1NB?= =?utf-8?B?L1dUcUJyWjBVVlh3Um5nNXdva01HVnZ0ODVYbmM0eWVuVktEenpzWkVIMzVP?= =?utf-8?B?aE1BZkp6cUhwNVVJMWJENmM1OGV3ekw5WWdNRXJPZ05FN0twWXJHYzlLWnQx?= =?utf-8?B?NkpiNjRzaVkvclUyc0ZaeUkySnZkeDNUSXdEYmxHYnhjcHc1NjZQc055TUJG?= =?utf-8?B?QU5Fa0wySk1KUlBDRS9iVzRuKy9OcVJ0RXZsRXRMTGkwVnJNOTR6VEZMTjRI?= =?utf-8?B?V3hEcHNRVERWT29DSm1VbzFRQ2ZiQXdGQmZhd2gwL3VEZkoycjM1dyttNjFy?= =?utf-8?B?Vm1PZnp3RW53SWFHYTNyWWZHZnQyNGpYQXJvK0JTT2ppZVdmOFhWeWIxWTRs?= =?utf-8?B?SEZNc1RGaHcrRTRyVWxCRU9UdmFUelp6Wm16WDNRQ2c5aEtBNDROZUluVFFY?= =?utf-8?B?dUthQ3RUSnBsMUZ6OWx4S3dJYWtPMVg3NjA5ZzkrMW1UKzAyOXJqTzBVSjV5?= =?utf-8?B?eDlMbXdJSWM1RHg5czVXSXo3TTllMmt3ck0wVktqdmt1Nm0yeXJvdVVHRjhr?= =?utf-8?B?ZmRvTlZGTCtyOUZ6NnJuSk5GS01ROVRpZis4MXVWMExSNlJkOE1KM1hYUFRa?= =?utf-8?B?ZmJRRXRzdDBFQ1h4dWdEZTFlMjc2cVUxV0dld2R2d1dZNW9VdnZUTXJkUm9z?= =?utf-8?B?ZFRmdHI3TW04ZHZuSWVuSlg2TjhVQUV2VzhkZ0NUYUM2eldHZ3R2VU1WczFO?= =?utf-8?B?WTc3elNrcGEvWW9NZWF3ZlhQTS90WHZoKytzRmhEY3NPSERFM0N4RDU5LzNN?= =?utf-8?B?WUNlYmh4OUErUGgxcmJJZ0RMZ0tSQkhFVnd3UEpVL3lPd2FFSUJrcmNCRnVl?= =?utf-8?B?SENMd1NUVUNTSDZBb3dFeUFlSWNSR2NBbW40S0NhVUtkNUFpejN6TGdZblV5?= =?utf-8?B?Q1cvSGNhc0hvV0diMytLUENjamlaZjRqdVRERzN4SjVaU3YzcXhJNVRUbU90?= =?utf-8?B?anlDREF1Q25ZV3lrZTVGWXczZG9uVXlwR0NiaC9vbS9FVUowZlNNVFQ0MDJS?= =?utf-8?B?eVRvTnhLNGl6Ny9aajJSUXBrSk9kSVI1bE5aVVFwc2dlampmRTdvRSt4UVN5?= =?utf-8?B?bEtlTk5LMEpDQnUyWUQ0MTdWMUgvY1oyWjFwLzRjaDZHYmhaMy9yS2VlbzVk?= =?utf-8?B?QTdZV2p3K0Q5VFFIWGF5cGJIa2lKV3N1NW14clovUmtPTXNmS2VhWVg5R1g1?= =?utf-8?B?aWZnWEwwVTBlOXpZbUVQMlhyaVZteGdoVHRCY1pQT1JGait3MmtxRjF2SHZp?= =?utf-8?B?VnByTFl5bDA2RWpkVHZ1cjljZjJGNGtrc1Y0Sk1tT1VrMkJLeENNY0V1MlNN?= =?utf-8?B?K0YyZ2VEQmk1UnE2cyttUy8rRndSeFA1eklFSkVWbGcxOHpSYm9nQmRqUk9Y?= =?utf-8?B?YjROdXJXNmFzUTVjNlFVNHRXWUNrU0lObVIyOGZnaVB1Y3I0R0VoRjI1cHlq?= =?utf-8?B?R0pmZ1p6NXdGRFN0eFBhRzBIWHQ1K200eXFWeW44WnBlQ3lNY2FGVmhrMjlh?= =?utf-8?B?c3pCZUxNVzhscUNFMlBuakNaUnQxK1VmU09ScmczTGgyOGxGL0NXYlZTamtC?= =?utf-8?B?UkNLeVZxTXhsaUNFczUyRzN6cWJ4WXkyb1VKMHBsQUxCUzVOd3JhcTlWNkIz?= =?utf-8?B?d0ZyZG9TMEdoZjRXR3IyZmJZemt4aVYxNk9pWDY1WEpUN1NSbE1rd0R4Z2J5?= =?utf-8?B?TVRzUWNRUmgwVUk2RTNsYWpEYnZSU1FtZUphZlJtczBDeFF3UmliV0NzQXZW?= =?utf-8?B?d2xsNFFQaVhDMDcyZUVDUE5iSWZ3a0xwWHZoWGFBVlJJK0RRTzJnY3Q1c3BB?= =?utf-8?Q?YDODxmneh5RZ8BXD5W1tZu7IaQ6zK9KS?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXPR04MB9642.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UWVjaDBjQ3BpMURDc1FtYTRLWkZEaW1tRU5aWlo4eC9Bc1dycG8rdTVjaWoy?= =?utf-8?B?cm9XQXZ0c05zTHQ2Z1l5TC9WKzc1WWFtbEd5d1NxbUowaUxHbUR6WFR6SUpy?= =?utf-8?B?OUgrY0xTWjZpTmZSV29NcFlzb01SY3VKTG1lSHFsTUtpWjJKUGlzRHVnei9W?= =?utf-8?B?cmIvTVBRTDVqaXppdS83cU9NOWw5eHQ1TjVKUVBEZlNGMEtIdndEaGhmUmgr?= =?utf-8?B?ZUNITFhMK1IvWmEwY0c0WDFHc3FWeXFFRDVFaVAzRzJ4NXZKSnZtL2E3WitM?= =?utf-8?B?YkNibWgzcG1KK3EzOWQyU3JxNUxBVlZENzdac1lNRVo5M1M1bzBXbStEN0ZC?= =?utf-8?B?dHNhU3h1YkF5eVhFYTNwcklscWRUWUhIbnJIU3hnRXlOQmdMbjVEZHZtV25n?= =?utf-8?B?NW5qdWt3OVlSK1FQNWlGcWdoWXgrT0p4ZG1NcEd3SlZHaGp0SUZOQ2JhMXlt?= =?utf-8?B?aEc0TXVISlg5UlJpekVxS2pDNVRkekxkZCtxclZaUzJCdnZWKzJ1eEpFZ0x0?= =?utf-8?B?L05oa1pIODVHTFg0L1FHMXE1bkNrKzBILzl0WTM3V2k2NFBQdEFiaVZ4L1gw?= =?utf-8?B?ZWEvTkw3dHhCOW0xYUdndEpabHRkbUxXUWs4Uk9JdURVcVhucUZLWUZwTG9t?= =?utf-8?B?Tkx5NkVGdk03Y0FMQnZYanRqcjY5OWhsNUlzNUdoc1pKOG02MGZjUHVPYU5J?= =?utf-8?B?ancvYkVnVW94NElHZi9aRWZNamtqclZscEJXY0hCOWc2VUNUK3JEdGVMVlJO?= =?utf-8?B?Rms2SFp2NkxhY0g2L2JubEhLL0I4NWpMK2JBejVDa1Q1T1VNT1FxKytUTmFi?= =?utf-8?B?cllveXRhT3BCM3h6WUpGOVMvOTNSV2ZOOGxhS3haZU0ybFZvczNhc3lRN21h?= =?utf-8?B?cTM1N2NOUzlCaVZtS3o1Y0F5OUpkQWZUMDVEZ1V5S0xJQklickxQamtyZWNP?= =?utf-8?B?RFJrbGFHcUxBM2g0RzEwZ1lvRkZuTXBzcUs3TktzLy9oZHRNTkpJNUtCZFd2?= =?utf-8?B?bFUrczBSWjczd1pRSUFDcmtaR3F6WTZmek42M29vVURZRmxodHZjdlE5Slo1?= =?utf-8?B?TEtvQS9GdkhsMW51UFZaMEJKaVZxN2JwSkZPVDFFZUliL0pyYS94empEeU1E?= =?utf-8?B?NXZEWkxSNUFMajBNSkE3TWcrUDlIZlU3cXk5VlM4ZXA2WG1LTUVMcTVqSXg1?= =?utf-8?B?NWdpZC9hRUhxWWtXa044K0drREVzSjJJWkVaRGZVS1l0K0RsZWRKL0VHZjlj?= =?utf-8?B?M0pxRDVGblQ5Yjd6ZmN3amRwS0l1SWZsQnQzNSsvN3VPUVRDUVBvTTNQcU5K?= =?utf-8?B?OWF2UzBSZmhFTU9Pbk8vSWVjQ0UxTG9PdkVYOTFabFJ5aENWcThPNytiOXpx?= =?utf-8?B?K1JPbkVMSjYwdkVzUC9vcnBIRlVvRllMTVFTcTdtYkdIVEdjNnBaMjlpZkpj?= =?utf-8?B?clZURWo2cERjd1pMTkFRZlZvM2FJWWZ3OGRnNjdQNGpiSlVXek5KYVJURU5j?= =?utf-8?B?QVM2a2YzOVlyZ0FPZ2doUEZEdW1SRllkU2lWbjRlMzhweUpWVVJocTMxTUN6?= =?utf-8?B?a3pJR3ZCdGZpa2grMnR3aHpBeGljTlphSXNwTmxhSFk3N09UZjZnRkNmNUZF?= =?utf-8?B?c3drOXRlWjBWRk1pUUJCZmduZHVhR2dQR0JnL29FeWhXNE9qTWNld21KZDRt?= =?utf-8?B?cER0T0JzUys0TDlXSU90NjhWYVRlZ09rUzkvYWRvSTNIRHU2R0dzR2NTQlFp?= =?utf-8?B?Q21VQTlBTVoweDhwR1J1VEFReVNQaEx2YUswSEVNdzN3bEsySVRlMWpyVG9y?= =?utf-8?B?RjRaV3Ftdzd0UC90azAyeDZXRTREMkJFTCtrQWhpRVNNNEJXMVcvT1VsK2hM?= =?utf-8?B?ZlBibEdPRjlaRVBvcXlFK1ptT3BVYzcrcU1waHNXTFpQUFBvMFdORHVXeFRU?= =?utf-8?B?UC9TQVpTRkNQdUNOT0JINDk1ajlTYzhIbVVXZjdPL0RuSWxuK0toMFJ3SWpR?= =?utf-8?B?TkJMT2QxeE9VUWQxQTM2K1JyYko4RmpoSUdOc0UzbHdIQ3F1bzhmblpMRk5s?= =?utf-8?B?b1dGSWxHa0hEQzV3aWlLMDNqcVJmS0k2OGZJUUxZVENXa0t3ak4ycFBrY0Ew?= =?utf-8?Q?1xNFBxYp6deiwUzwXLq1rschQ?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 587ad316-beb0-4472-ad9d-08dd40a05e18 X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB9642.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jan 2025 20:06:07.5444 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: JwywFUA+AUHDHqXQgHAfg9Vqs8oh0/7GP32Ppd7DP0+amRdm1XZvJw80oB9zPqVdFqh/5uoITjGi53NeYwobcA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8995 I3C HDR requires enter/exit patterns during each I3C transfer. Add a new API i3c_device_do_priv_xfers_mode(). The existing i3c_device_do_priv_xfers() now calls i3c_device_do_priv_xfers_mode(I3C_SDR) to maintain backward compatibility. Introduce a 'cmd' field in 'struct i3c_priv_xfer', using an anonymous union with 'rnw' since HDR mode relies on read/write commands instead of the 'rnw' bit in the address as in SDR mode. Add a priv_xfers_mode callback for I3C master drivers. If priv_xfers_mode is not implemented, fallback to SDR mode using the existing priv_xfers callback. Signed-off-by: Frank Li --- Why not add hdr mode in struct i3c_priv_xfer because mode can't be mixed in one i3c transfer. for example, can't send a HDR follow one SDR between START and STOP. i3c_priv_xfer should be treat as whole i3c transactions. If user want send HDR follow SDR, should be call i3c_device_do_priv_xfers_mode() twice, instead put into a big i3c_priv_xfer[n]. --- drivers/i3c/device.c | 19 +++++++++++++------ drivers/i3c/internals.h | 2 +- drivers/i3c/master.c | 8 +++++++- include/linux/i3c/device.h | 12 +++++++++++- include/linux/i3c/master.h | 3 +++ 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/drivers/i3c/device.c b/drivers/i3c/device.c index e80e487569146..e3db3a6a9e4f6 100644 --- a/drivers/i3c/device.c +++ b/drivers/i3c/device.c @@ -15,12 +15,13 @@ #include "internals.h" =20 /** - * i3c_device_do_priv_xfers() - do I3C SDR private transfers directed to a - * specific device + * i3c_device_do_priv_xfers_mode() - do I3C SDR private transfers directed= to a + * specific device * * @dev: device with which the transfers should be done * @xfers: array of transfers * @nxfers: number of transfers + * @mode: transfer mode * * Initiate one or several private SDR transfers with @dev. * @@ -32,9 +33,9 @@ * driver needs to resend the 'xfers' some time later. * See I3C spec ver 1.1.1 09-Jun-2021. Section: 5.1.2.2.3. */ -int i3c_device_do_priv_xfers(struct i3c_device *dev, - struct i3c_priv_xfer *xfers, - int nxfers) +int i3c_device_do_priv_xfers_mode(struct i3c_device *dev, + struct i3c_priv_xfer *xfers, + int nxfers, enum i3c_hdr_mode mode) { int ret, i; =20 @@ -47,11 +48,17 @@ int i3c_device_do_priv_xfers(struct i3c_device *dev, } =20 i3c_bus_normaluse_lock(dev->bus); - ret =3D i3c_dev_do_priv_xfers_locked(dev->desc, xfers, nxfers); + ret =3D i3c_dev_do_priv_xfers_locked(dev->desc, xfers, nxfers, mode); i3c_bus_normaluse_unlock(dev->bus); =20 return ret; } +EXPORT_SYMBOL_GPL(i3c_device_do_priv_xfers_mode); + +int i3c_device_do_priv_xfers(struct i3c_device *dev, struct i3c_priv_xfer = *xfers, int nxfers) +{ + return i3c_device_do_priv_xfers_mode(dev, xfers, nxfers, I3C_SDR); +} EXPORT_SYMBOL_GPL(i3c_device_do_priv_xfers); =20 /** diff --git a/drivers/i3c/internals.h b/drivers/i3c/internals.h index 433f6088b7cec..553edc9846ac0 100644 --- a/drivers/i3c/internals.h +++ b/drivers/i3c/internals.h @@ -16,7 +16,7 @@ void i3c_bus_normaluse_unlock(struct i3c_bus *bus); int i3c_dev_setdasa_locked(struct i3c_dev_desc *dev); int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc *dev, struct i3c_priv_xfer *xfers, - int nxfers); + int nxfers, enum i3c_hdr_mode mode); int i3c_dev_disable_ibi_locked(struct i3c_dev_desc *dev); int i3c_dev_enable_ibi_locked(struct i3c_dev_desc *dev); int i3c_dev_request_ibi_locked(struct i3c_dev_desc *dev, diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c index d5dc4180afbcf..67aaba0a38db2 100644 --- a/drivers/i3c/master.c +++ b/drivers/i3c/master.c @@ -2945,7 +2945,7 @@ int i3c_dev_setdasa_locked(struct i3c_dev_desc *dev) =20 int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc *dev, struct i3c_priv_xfer *xfers, - int nxfers) + int nxfers, enum i3c_hdr_mode mode) { struct i3c_master_controller *master; =20 @@ -2956,9 +2956,15 @@ int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc= *dev, if (!master || !xfers) return -EINVAL; =20 + if (master->ops->priv_xfers_mode) + return master->ops->priv_xfers_mode(dev, xfers, nxfers, mode); + if (!master->ops->priv_xfers) return -ENOTSUPP; =20 + if (mode !=3D I3C_SDR) + return -EINVAL; + return master->ops->priv_xfers(dev, xfers, nxfers); } =20 diff --git a/include/linux/i3c/device.h b/include/linux/i3c/device.h index b674f64d0822e..7ce70d0967e27 100644 --- a/include/linux/i3c/device.h +++ b/include/linux/i3c/device.h @@ -40,11 +40,13 @@ enum i3c_error_code { =20 /** * enum i3c_hdr_mode - HDR mode ids + * @I3C_SDR: SDR mode (NOT HDR mode) * @I3C_HDR_DDR: DDR mode * @I3C_HDR_TSP: TSP mode * @I3C_HDR_TSL: TSL mode */ enum i3c_hdr_mode { + I3C_SDR, I3C_HDR_DDR, I3C_HDR_TSP, I3C_HDR_TSL, @@ -53,6 +55,7 @@ enum i3c_hdr_mode { /** * struct i3c_priv_xfer - I3C SDR private transfer * @rnw: encodes the transfer direction. true for a read, false for a write + * @cmd: Read/Write command in HDR mode, read: 0x80 - 0xff, write: 0x00 - = 0x7f * @len: transfer length in bytes of the transfer * @actual_len: actual length in bytes are transferred by the controller * @data: input/output buffer @@ -61,7 +64,10 @@ enum i3c_hdr_mode { * @err: I3C error code */ struct i3c_priv_xfer { - u8 rnw; + union { + u8 rnw; + u8 cmd; + }; u16 len; u16 actual_len; union { @@ -301,6 +307,10 @@ int i3c_device_do_priv_xfers(struct i3c_device *dev, struct i3c_priv_xfer *xfers, int nxfers); =20 +int i3c_device_do_priv_xfers_mode(struct i3c_device *dev, + struct i3c_priv_xfer *xfers, + int nxfers, enum i3c_hdr_mode mode); + int i3c_device_do_setdasa(struct i3c_device *dev); =20 void i3c_device_get_info(const struct i3c_device *dev, struct i3c_device_i= nfo *info); diff --git a/include/linux/i3c/master.h b/include/linux/i3c/master.h index 12d532b012c5a..352bd41139569 100644 --- a/include/linux/i3c/master.h +++ b/include/linux/i3c/master.h @@ -472,6 +472,9 @@ struct i3c_master_controller_ops { int (*priv_xfers)(struct i3c_dev_desc *dev, struct i3c_priv_xfer *xfers, int nxfers); + int (*priv_xfers_mode)(struct i3c_dev_desc *dev, + struct i3c_priv_xfer *xfers, + int nxfers, enum i3c_hdr_mode mode); int (*attach_i2c_dev)(struct i2c_dev_desc *dev); void (*detach_i2c_dev)(struct i2c_dev_desc *dev); int (*i2c_xfers)(struct i2c_dev_desc *dev, --=20 2.34.1 From nobody Sun Feb 8 21:41:42 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011009.outbound.protection.outlook.com [52.101.70.9]) (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 E8E571E2607 for ; Wed, 29 Jan 2025 20:06:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.9 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738181176; cv=fail; b=pk+M3GnT3eOlMiK6s+VcSDtv/ErJEJe4OUDX3+droezfQK6vbH34C6iuI6pYW8/Op98zVtE921KCwfrddjqwx5BjLSSo+4aQlnYm69XvpAL+kontaMMeNbUkNz4oILmelbH8e7RPZDy3ML8tMOZy/ybzLIWcsJWy52IyPztcEK0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738181176; c=relaxed/simple; bh=JEIsXJQCrGymehdd1Jleuv9Z0kCcnhQNHdjnEuYbQ1Y=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=A8VfjT82ULrx91QqFFsXfnCSnSIyPVHR6ed7cbxCztK0S3GCpAbNBTUvM9Hr7JDOPKCzdOgNtWDbMMLQU0zDKYdX++quWHmilMDsOnrDPyiYvhJ6uAYriyuCriu8kMnbw8jILXI6o4UaLILyVjjh/ZTs9uQWPOSbxeTHAINyEuc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=D2tZ28Pv; arc=fail smtp.client-ip=52.101.70.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="D2tZ28Pv" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=tF0cr4Nwihlyh4wjxIKWvM4WgXLzslI8fRGwb/zAWAeCXhfgJW7+WfyxbHhJpKdyHSFg7Fj0//Ssepe7qgwpZlUsOxd7GOf4ai1c3jfPb5p5rYQ7sZI1H907bG+7SoOL5ZgGCgm9BlZ1CyXRPtMoDpI5opTneRB0JSkV8OpSqIZPPQhnGmY5XCOhUwN2QcYA8mdtkqHEpHeZFuzc8E+tOwHfViI8CX8Xn/ZbQcQ82DeZJXIVgxPwhi6C+d3fytCqkUX2gqdiFN453q5C04j8OvMZ/FOpfcyXL/7uxZ88RvQHFcqE4CejxpfQRNJrR+IHhN+9Rdi1S5J+aCXZnWcp9g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=OgXky10trcn/+bt/y3+16l8vQezgvECWvae9pCH4Y9w=; b=w9YyUDrvT7Y+UTz0vTOOcZCxw1FERivZWA1q3s7fat7YB1iVUdEudzoV+nAPJk4onEpzhA0vijOYJKxQ9w9ZcDIMZ3f67ebKQQYbx7dGbCL/931hzommJJpxsrAqbTxmTkuL1+tZ+F7H2xBw3RBY+n5vUdGlPWILerjbladYfBNujBMGRUcuhGWkUuN3KVJumRbXP7ILvRfTVNSsFEfJ7wwm1CoV7szYL9ytDRYC91y1PwatX+V7s0IwI1Tz1t0Esn06U9obD/xchCj839ePWcGWFGnIXSQBWLlYHosHyoGKf4uIMJDANvJtUkNnX3dWDW9RCwlH4Rd7P39aVQYCTg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OgXky10trcn/+bt/y3+16l8vQezgvECWvae9pCH4Y9w=; b=D2tZ28PvWwkzIljwyzIBY9DfP7xJI4SM93RUPtaDq2KeayQbm82mPDSeEurdZHCW9Svv6wJD1dTL0YsrHPlnq0EuDNuzZ2XeY3ECO2uhbGRntecsYy2k8fDI+0gkNoYWMBHcIp6TfuFeDCb2XQbGXPlVKml7gXFTbU7tKl5fja2+2D7i+tTiey48LczNNUbj0AKj0dViudwhO/6MG7uB8h6H3u2pTuBwHUtURkoxEvr+3WqyFICXEVmbo7AKAMsqsCp10UVqIVBLjGByb9UP22P6XzcEXbSx5cor1q8BxOnGHFm7iXPE0i9zl3D6SkF/7Wj5ZL000y9nS8u2vq2hGw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from PAXPR04MB9642.eurprd04.prod.outlook.com (2603:10a6:102:240::14) by AS8PR04MB8995.eurprd04.prod.outlook.com (2603:10a6:20b:42e::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.18; Wed, 29 Jan 2025 20:06:09 +0000 Received: from PAXPR04MB9642.eurprd04.prod.outlook.com ([fe80::9126:a61e:341d:4b06]) by PAXPR04MB9642.eurprd04.prod.outlook.com ([fe80::9126:a61e:341d:4b06%5]) with mapi id 15.20.8377.021; Wed, 29 Jan 2025 20:06:09 +0000 From: Frank Li Date: Wed, 29 Jan 2025 15:05:53 -0500 Subject: [PATCH 2/2] i3c: master: svc: Add basic HDR mode support Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250129-i3c_ddr-v1-2-028a7a5d4324@nxp.com> References: <20250129-i3c_ddr-v1-0-028a7a5d4324@nxp.com> In-Reply-To: <20250129-i3c_ddr-v1-0-028a7a5d4324@nxp.com> To: Alexandre Belloni , Miquel Raynal , Conor Culhane Cc: linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, Frank Li X-Mailer: b4 0.13-dev-e586c X-Developer-Signature: v=1; a=ed25519-sha256; t=1738181163; l=7629; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=JEIsXJQCrGymehdd1Jleuv9Z0kCcnhQNHdjnEuYbQ1Y=; b=+zcPldY+xwTc1cXdayUYnO8yrl98j+jKLqjoeSEPPMt2k9vwcN0vnXAXTCxkGetbFeCkXqrZ3 W3IMtID44xLACAM+Tn7JLZi+imKbEeYZpjmSCKRCWZyIggAAEEVSt0P X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: BY5PR03CA0012.namprd03.prod.outlook.com (2603:10b6:a03:1e0::22) To PAXPR04MB9642.eurprd04.prod.outlook.com (2603:10a6:102:240::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB9642:EE_|AS8PR04MB8995:EE_ X-MS-Office365-Filtering-Correlation-Id: 80250fb9-0219-4257-5e9d-08dd40a05f6b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|52116014|376014|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?M1MxeWdOVkhDcklzYVpCbmNMK1kxOTNHTXpmSDJpbkE3TGZXREZFeFVyb200?= =?utf-8?B?eVl6WUsyei9kN2t0bEJaVVNGc3k3VkN3MGRDVklVR3laOE1TdTNZT1NwYmZu?= =?utf-8?B?ZFYzSU05cjIwclpyUlQ5WHZ4YWJkc3lBRG5nR0p5S0FSbjkrYWVRL0FFcmRs?= =?utf-8?B?NTFpQ2o3WTVLQXA2aThqTHY5KzZ6QlZGY0U0a1BBN2dJYWR3OFZBOVR4SnBF?= =?utf-8?B?blRqMW1LNytKS3V6aEQ5WnBUcThXN3V4SDRQK2hxMlFyRVF2NVdidE5hQXdF?= =?utf-8?B?TUFkZHJzQVMzdXJ6ZWZGOTN4ZEEwRnplYTNqUWxrbnppTjh2UTVvWEVPbk9C?= =?utf-8?B?SFJZUU5vdnVJU3prck9tczBYYzlpRHA1a1ptK09YS1J2b293Z0ZWTUl6enQ4?= =?utf-8?B?MzdnOTVmSTd6QXg5Z0NnRGtCaXROeTRqUGtkUjFWaXFUWjlvcnlBQlhZUHE3?= =?utf-8?B?V2NHZisrUFp0K0RJOXRaUDRWVVpoV0MrMGR6aUx5LzgwNG5QUmNXZFVKNyt2?= =?utf-8?B?MEhZempFd2hzem1hektFRklEQ25kRm1yVGZTL1RRRVlOelBEb25MWHRGckw3?= =?utf-8?B?c2k2cFFWL3BBS3BjTW1LcTY0Z1QyT25CQndrYnBHWitwdU1aVVJaRkZrZ3NK?= =?utf-8?B?VEp3RXpsRU54QUxuUHE4VkVOYldCZzFhbExlN3RhYmRHK3IvRGV5Y1Myd2VE?= =?utf-8?B?UTZINktTVEZHZ0JaeUo3TThyVW5QRmJxdEc5YnZZWWl0NVduYVk5ZFRtT2sv?= =?utf-8?B?Y3JuQ0ZrY2ErcjVIUmNoTk5KTEJ6MG9FTk9MYWZwZ3FPTmVJMVVVMmtvdWlD?= =?utf-8?B?NkYrRkRjWEZ4Qm5YN3I3THJYd1pPaXIrZWVFRUhEVnJ2Sk13bllxaS9kWVU1?= =?utf-8?B?SDJhMkJ2UWJPdDd1RjZGbUx3VTFjdGJJWGx5NmhZcGIvUGhhWjE5L3Z0Y3Fn?= =?utf-8?B?OFVLMGc0V254ZU4vbWtlSUFGcktFTlJDQXFzU004ZXJvb2FQY2V6aE5aZExv?= =?utf-8?B?VFB4VzdoMjV6S0ZNNGJEajBITXN5VnFUN0hSVEl1TEhMeUxUUXk0aXJRanQ0?= =?utf-8?B?WE5NU1pnMEZ6TDlwMlVzNTRqcjJHVHZ3YzJ1WXVZbVZ1MjNKc2RucjBzZU9H?= =?utf-8?B?azZoK2hmNE50RjhsaklrbnlPTXhhOHkwTWFYNXBaSGRac01kaWtuRndxZlY1?= =?utf-8?B?YzJxM3h4Z05MNTdqVVlrYSt0bU5Jd2N1Q3RSVHRnSG84bjMvR2drdmtHZmc3?= =?utf-8?B?ZlVLdWVIeUN6Sk5McW5WZURBTEJiT2Z3RUpiUDJmVFN2RGYrOTRUcTNFRmJm?= =?utf-8?B?bkVSVEZjblJSMGlGbjJuU0ZhTXZXRFd4cW5mOXhxS3FEUGNEanNvaVI3Slp4?= =?utf-8?B?WndWZSs0K2pSSzVaYW55R21sTHFxL0IxRVNyRXEydDNOZmpmcURDR1MxWU5m?= =?utf-8?B?bENHWVJWNVI0WmxhNWIxOW1URm1XUlpIOWd2cU9IeGp4YklQS2NSaUE1TDBU?= =?utf-8?B?QW5rODAxMWhodlYzeGxWM2pLZFNxMys2VWdBaU40Y24zdFlzYUE0RkFBeFBE?= =?utf-8?B?YWpCdGpWeEJBa1FrWVZORlNQeHk1aXluc1k3cFQ0VjB5VUFMdVYyRG1ucTZS?= =?utf-8?B?Y1Vsa0d1OWU1UjlzZEExTnlxaC9uQmo3VFBDTFNOZnNYRCsvbmpjeTNwTG9n?= =?utf-8?B?Q1M0Y3M5c2Iza2hEMFRNck41Y1cxS2QxbVJPcks3TmNRNE0wdWZpUTdsN0tB?= =?utf-8?B?R0M4ZWdiYXpuRkVieCtWSkhDVTV0eVRKK0tTNkc3TVJ4TEFTMmhrNFB1MzlX?= =?utf-8?B?UFQrd0tkclBkNFZXQklUMzRBVUkyNlJzL1Y0bVgwOGVWeXZoWUVoQzl2aHpG?= =?utf-8?B?ckNkR2JISHhmeWlOUU0xZXRoQjNMeGRLMTdyOHdMU0QwdVA2N25BVjBkc2Nk?= =?utf-8?Q?Rwzgon29d+1S/S/CFy8OkztPtJ1W8rNH?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXPR04MB9642.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(52116014)(376014)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?M2g4MHNqWXZaYkFKMGd5QVZSNm42V2xoRlZ0dlhXQ3dtQnM5RHpXM1BGTSsz?= =?utf-8?B?MTEwa054a1puYkJBTkFuTEEyNTBQMHhqWk40Q0dyUDk4RHcyTldDUkFtZ1RW?= =?utf-8?B?SXBBY3dZdGU0dVMvTXJ3NERhNDlmZWxEeGtoMUt4SE0xSlNWcE56T3dGeGow?= =?utf-8?B?RzY4NDkxMlE1a3pWakp3WitzNU9sQllOaDJlN1hncUVpVldxUm5GaDAvMmcr?= =?utf-8?B?c1pxbUJWQzZOU0JYQ0RMeldoZVgvY3RvRmVFWjJHa1ZGOXorWkJGSlhIRE4w?= =?utf-8?B?REUyZ3VnWUdxQktyZkZqaDl1dHptekI5Vkg2RWZmVUdKM0NuWktDcy9uWjlh?= =?utf-8?B?QzlPY3RPYXB0T1l5RkdTbHFHUUtETS82T0lyMXEra3Q1dDZOdWF2SW4yandM?= =?utf-8?B?VVVuYmV4RGg4M2xaa3puYU9wa24wbFFJUldhQytVRWpEV2NxckJGVENEd2Mv?= =?utf-8?B?R2hXYitHSi9GQ0ZkUVFKRTVOTHhESi9HTkozK0l1RWlrSDVnMnpqTDJFUDZ1?= =?utf-8?B?a1dFNDNlYUJxZCtrTlZGYWoyNkxxU2xDdWlDb2RMbnNhN2RLd1ZVakF3cmMx?= =?utf-8?B?Y3I1VkRPZ3JBTjFaODNOZEtmTWJyTUNjZmIyU1NwNldEazZmdXpmSDRsRDhZ?= =?utf-8?B?aXcwbE5JWVpTSWEwZ3kvdEZHaW1TbDJrUjZoRmkwa1FQUDNINW1EWGVhZlox?= =?utf-8?B?WG1GL0p3akprSVRsZEpCWG5zOGVqakF6WHN6QnhicEluRzVjRzBDRjV6Z3Fv?= =?utf-8?B?WFcrYmVMc292QzB5RVpZQUNBQ3hXWFE4czFoZVFiMTFGZWNOZ2JLUDBXNEsr?= =?utf-8?B?U0RPNHFIeDAxTlNpSnF3eUQySVh5TDlEVzdNci95NGdGVUZuaTJQNDVBTmZl?= =?utf-8?B?L0lYaGVaektJMm5pWlp2emtXc2loeDVmU2xxV0h5WmlRYlJlNkF1bWZKUXRJ?= =?utf-8?B?WHA0dVNyamhmWjF6Uy9aZTNZRThTMFhPd2pxUnNrd3lTMWFxK1RYaWNNMXBq?= =?utf-8?B?MmlYckdOVExjUU1UODI2MzRMcWhIODA5NHpKVWQ3K1pLRlQzR2tSbjJ6Qzg1?= =?utf-8?B?ZTdVZVIvN0hJMkFyV0grbmNJTkZSMUdOb1ZNVTJYUURvdE5BeG84Q2dvN2o0?= =?utf-8?B?Q2tadEZwWm9tS2V5NkVIY1RRUGY4a244Q3VaVFBSTUw0ZjZzUWhJa3NWUGVD?= =?utf-8?B?UDdzYzdBZXZGV29SVDR5RW1MN0tidkpyQ2Q2dlNqc2t2Yk03Nk5aSkp1c2Nq?= =?utf-8?B?Z1I4UlEzeXVybS9Bd1djZWRxV05LN2U0ZlgxRGo5WWJGZDF6ck5EaU9pQTFH?= =?utf-8?B?QkpaZ3ZxVkQ2SWcyUUxtSXdOeUoxajEyeVF0YWR3Z3FwY08rZVZZNDIvYTYv?= =?utf-8?B?WG5lUXN1ZUxyenM1R1djOGk4clRTRFRnY2ZKL3NyVTl5VUlzSGlkdG9sVWt4?= =?utf-8?B?SWRZemdlUU1mMnU5bllueUtLUk1OaDVFKzdUeE4ybVFOaVhyZWIrVEMrL1pD?= =?utf-8?B?WFBFazFCdjNGMUxlQVRrdWIwNGE1MS94MU55RVVWbi9IeVVxYWtHRng0OWo1?= =?utf-8?B?TmtMUld6aVFPQldWbFZVVjE1R0h2andzdURYRDFhYS9RVG5IaHdzNFJKRGla?= =?utf-8?B?K0hTWHJIVEZIblBEc0Z6ZEJZNGJRNmEzaXBGckZyRjQxTXFHcGt0ZzZMVWk0?= =?utf-8?B?UEp0UnphbEVTWEJIbk14KzcvQmt2bTByWEw4aUpJWCtzbFJ6ZkdaZWdpNW1Q?= =?utf-8?B?UkJJV1NzNWRCU1Q2dUMydzFOWU5kbmdHWjRUOGxBSDBxWXpHWnpGZERpdjlK?= =?utf-8?B?ODkxNSthYmhHVC84bDlPYUNYMU1yS29PUkJYWFhnTjdlbzhNdDhwTzQ3aFA5?= =?utf-8?B?Z1RHWUhGZHA2RzVFQ1FYY00wK21ITUJVUiszSjhtTjY4Q3QzWW1sYmpaM0Jm?= =?utf-8?B?YUVjOGJhTW53U3JhZlJpMkhFTnFsZ3BOUlUyTEsxQU1Ua3JRZlhRbm1HUzFk?= =?utf-8?B?bHQ2YlpjdGxSUWZzN3JYTGdEUWYrV1pQUEJoUko1a2dPclFUWitzclJrdXRH?= =?utf-8?B?Sk5lbkFqZlpmTE9MbkZpRkRZaTQyRmYzYlNkQkNqSTNXY3IwbmVkQ1JsVTU1?= =?utf-8?Q?W/tk2u9ilf82R7KN9DhDed+7a?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 80250fb9-0219-4257-5e9d-08dd40a05f6b X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB9642.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jan 2025 20:06:09.7429 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: jUP36dF8AUo1y9mXsgb1NKTQEm7umzOvwLesxPJwzIHuLGv03AUPf4Qu+jtvbn5Kwjk3i1T+ktih7Kh1uwWP3Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8995 Add basic HDR mode support for the svs I3C master driver. Supports HDR only for private transfers and does not support sending CCC commands in HDR mode. Key differences: - HDR uses commands (0x00-0x7F for write, 0x80-0xFF for read) to distinguish transfer direction. - HDR read/write commands must be written to FIFO before issuing the I3C address command. The hardware automatically sends the standard CCC command to enter HDR mode. - HDR exit pattern must be sent instead of send a stop after transfer completion. - Read/write data size must be an even number. Signed-off-by: Frank Li --- drivers/i3c/master/svc-i3c-master.c | 69 +++++++++++++++++++++++++++------= ---- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i= 3c-master.c index 19a16eb44220c..28b14972ca987 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -39,11 +39,13 @@ #define SVC_I3C_MCTRL_REQUEST_NONE 0 #define SVC_I3C_MCTRL_REQUEST_START_ADDR 1 #define SVC_I3C_MCTRL_REQUEST_STOP 2 +#define SVC_I3C_MCTRL_REQUEST_FORCE_EXIT 6 #define SVC_I3C_MCTRL_REQUEST_IBI_ACKNACK 3 #define SVC_I3C_MCTRL_REQUEST_PROC_DAA 4 #define SVC_I3C_MCTRL_REQUEST_AUTO_IBI 7 #define SVC_I3C_MCTRL_TYPE_I3C 0 #define SVC_I3C_MCTRL_TYPE_I2C BIT(4) +#define SVC_I3C_MCTRL_TYPE_DDR BIT(5) #define SVC_I3C_MCTRL_IBIRESP_AUTO 0 #define SVC_I3C_MCTRL_IBIRESP_ACK_WITHOUT_BYTE 0 #define SVC_I3C_MCTRL_IBIRESP_ACK_WITH_BYTE BIT(7) @@ -135,12 +137,13 @@ =20 struct svc_i3c_cmd { u8 addr; - bool rnw; + u8 rnw; u8 *in; const void *out; unsigned int len; unsigned int actual_len; struct i3c_priv_xfer *xfer; + enum i3c_hdr_mode mode; bool continued; }; =20 @@ -337,6 +340,20 @@ svc_i3c_master_dev_from_addr(struct svc_i3c_master *ma= ster, return master->descs[i]; } =20 +static bool svc_is_read(u8 rnw_cmd, u32 type) +{ + return (type =3D=3D SVC_I3C_MCTRL_TYPE_DDR) ? !!(rnw_cmd & 0x80) : rnw_cm= d; +} + +static void svc_i3c_master_emit_force_exit(struct svc_i3c_master *master) +{ + u32 reg =3D 0; + + writel(SVC_I3C_MCTRL_REQUEST_FORCE_EXIT, master->regs + SVC_I3C_MCTRL); + readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, + SVC_I3C_MSTATUS_MCTRLDONE(reg), 0, 1000); + udelay(1); +} static void svc_i3c_master_emit_stop(struct svc_i3c_master *master) { writel(SVC_I3C_MCTRL_REQUEST_STOP, master->regs + SVC_I3C_MCTRL); @@ -1205,6 +1222,7 @@ static int svc_i3c_master_xfer(struct svc_i3c_master = *master, u8 *in, const u8 *out, unsigned int xfer_len, unsigned int *actual_len, bool continued) { + unsigned int rdterm_len =3D *actual_len; int retry =3D 2; u32 reg; int ret; @@ -1212,14 +1230,19 @@ static int svc_i3c_master_xfer(struct svc_i3c_maste= r *master, /* clean SVC_I3C_MINT_IBIWON w1c bits */ writel(SVC_I3C_MINT_IBIWON, master->regs + SVC_I3C_MSTATUS); =20 + if (xfer_type =3D=3D SVC_I3C_MCTRL_TYPE_DDR) { + writel(rnw, master->regs + SVC_I3C_MWDATAB); + if (svc_is_read(rnw, xfer_type)) + rdterm_len =3D DIV_ROUND_UP(*actual_len, 2); + } =20 while (retry--) { writel(SVC_I3C_MCTRL_REQUEST_START_ADDR | xfer_type | SVC_I3C_MCTRL_IBIRESP_NACK | - SVC_I3C_MCTRL_DIR(rnw) | + SVC_I3C_MCTRL_DIR(svc_is_read(rnw, xfer_type)) | SVC_I3C_MCTRL_ADDR(addr) | - SVC_I3C_MCTRL_RDTERM(*actual_len), + SVC_I3C_MCTRL_RDTERM(rdterm_len), master->regs + SVC_I3C_MCTRL); =20 ret =3D readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, @@ -1279,15 +1302,14 @@ static int svc_i3c_master_xfer(struct svc_i3c_maste= r *master, break; } } - - if (rnw) + if (svc_is_read(rnw, xfer_type)) ret =3D svc_i3c_master_read(master, in, xfer_len); else ret =3D svc_i3c_master_write(master, out, xfer_len); if (ret < 0) goto emit_stop; =20 - if (rnw) + if (svc_is_read(rnw, xfer_type)) *actual_len =3D ret; =20 ret =3D readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, @@ -1298,7 +1320,10 @@ static int svc_i3c_master_xfer(struct svc_i3c_master= *master, writel(SVC_I3C_MINT_COMPLETE, master->regs + SVC_I3C_MSTATUS); =20 if (!continued) { - svc_i3c_master_emit_stop(master); + if (xfer_type !=3D SVC_I3C_MCTRL_TYPE_DDR) + svc_i3c_master_emit_stop(master); + else + svc_i3c_master_emit_force_exit(master); =20 /* Wait idle if stop is sent. */ readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, @@ -1308,7 +1333,11 @@ static int svc_i3c_master_xfer(struct svc_i3c_master= *master, return 0; =20 emit_stop: - svc_i3c_master_emit_stop(master); + if (xfer_type !=3D SVC_I3C_MCTRL_TYPE_DDR) + svc_i3c_master_emit_stop(master); + else + svc_i3c_master_emit_force_exit(master); + svc_i3c_master_clear_merrwarn(master); =20 return ret; @@ -1354,6 +1383,11 @@ static void svc_i3c_master_dequeue_xfer(struct svc_i= 3c_master *master, spin_unlock_irqrestore(&master->xferqueue.lock, flags); } =20 +static int mode_to_type(enum i3c_hdr_mode mode) +{ + return (mode =3D=3D I3C_SDR) ? SVC_I3C_MCTRL_TYPE_I3C : SVC_I3C_MCTRL_TYP= E_DDR; +} + static void svc_i3c_master_start_xfer_locked(struct svc_i3c_master *master) { struct svc_i3c_xfer *xfer =3D master->xferqueue.cur; @@ -1368,7 +1402,7 @@ static void svc_i3c_master_start_xfer_locked(struct s= vc_i3c_master *master) for (i =3D 0; i < xfer->ncmds; i++) { struct svc_i3c_cmd *cmd =3D &xfer->cmds[i]; =20 - ret =3D svc_i3c_master_xfer(master, cmd->rnw, xfer->type, + ret =3D svc_i3c_master_xfer(master, cmd->rnw, mode_to_type(cmd->mode), cmd->addr, cmd->in, cmd->out, cmd->len, &cmd->actual_len, cmd->continued); @@ -1544,9 +1578,8 @@ static int svc_i3c_master_send_ccc_cmd(struct i3c_mas= ter_controller *m, return ret; } =20 -static int svc_i3c_master_priv_xfers(struct i3c_dev_desc *dev, - struct i3c_priv_xfer *xfers, - int nxfers) +static int svc_i3c_master_priv_xfers_mode(struct i3c_dev_desc *dev, struct= i3c_priv_xfer *xfers, + int nxfers, enum i3c_hdr_mode mode) { struct i3c_master_controller *m =3D i3c_dev_get_master(dev); struct svc_i3c_master *master =3D to_svc_i3c_master(m); @@ -1558,16 +1591,16 @@ static int svc_i3c_master_priv_xfers(struct i3c_dev= _desc *dev, if (!xfer) return -ENOMEM; =20 - xfer->type =3D SVC_I3C_MCTRL_TYPE_I3C; =20 for (i =3D 0; i < nxfers; i++) { + u8 rnw_cmd =3D (mode =3D=3D I3C_SDR) ? xfers[i].rnw : xfers[i].cmd; struct svc_i3c_cmd *cmd =3D &xfer->cmds[i]; - + cmd->mode =3D mode; cmd->xfer =3D &xfers[i]; cmd->addr =3D master->addrs[data->index]; - cmd->rnw =3D xfers[i].rnw; - cmd->in =3D xfers[i].rnw ? xfers[i].data.in : NULL; - cmd->out =3D xfers[i].rnw ? NULL : xfers[i].data.out; + cmd->rnw =3D rnw_cmd; + cmd->in =3D svc_is_read(rnw_cmd, mode_to_type(mode)) ? xfers[i].data.in = : NULL; + cmd->out =3D svc_is_read(rnw_cmd, mode_to_type(mode)) ? NULL : xfers[i].= data.out; cmd->len =3D xfers[i].len; cmd->actual_len =3D xfers[i].rnw ? xfers[i].len : 0; cmd->continued =3D (i + 1) < nxfers; @@ -1766,7 +1799,7 @@ static const struct i3c_master_controller_ops svc_i3c= _master_ops =3D { .do_daa =3D svc_i3c_master_do_daa, .supports_ccc_cmd =3D svc_i3c_master_supports_ccc_cmd, .send_ccc_cmd =3D svc_i3c_master_send_ccc_cmd, - .priv_xfers =3D svc_i3c_master_priv_xfers, + .priv_xfers_mode =3D svc_i3c_master_priv_xfers_mode, .i2c_xfers =3D svc_i3c_master_i2c_xfers, .request_ibi =3D svc_i3c_master_request_ibi, .free_ibi =3D svc_i3c_master_free_ibi, --=20 2.34.1