From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11013024.outbound.protection.outlook.com [52.101.83.24]) (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 E075B348898 for ; Fri, 19 Jun 2026 19:29:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.83.24 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781897348; cv=fail; b=j7xDhWujLGlOQMymYWYFQgqJmzbzpIGpqIpY9WP05wP1g7fpz3GbAJQImJmsrphxf6oipahou4jYJAW3GiK4Orl1PaAr5r7YD1LHI2h0elnUNiw7NtCfq2pwoeiYO/VNEMObnky0mNl7K/93qOlhpTuqJG8/oTpgadicfxf8wII= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781897348; c=relaxed/simple; bh=1+k8BSlrBvt5QA1V82AOcO2jPsYsqPtpMeF+JfrBdA4=; h=Date:From:To:Cc:Subject:Message-ID:References:Content-Type: Content-Disposition:In-Reply-To:MIME-Version; b=R87SVyhkBEIeOY91+vzzHBT26Bh6GnZX6obR0VNPwfRIitd/MJuhlun5FLxwGVK0lklYVoPGHdtI8Dd1dg62o8in3WhIYwlnDRxW8VgG6IT5S+zzSpQ/QQGLFrUxQDIL4PgYO2DhzBirpYbCQo/w5TVllyRp2U8gqJL+MxWp+QE= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=pKz9xwLY; arc=fail smtp.client-ip=52.101.83.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="pKz9xwLY" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OXWoPOthfRyK4f6Vq3fbq8WwrPxcHIT3BdqtWCWl7vdvEJaeBPPRV3hBMPNGz4mcOyzubKNn3nWynJ6DX0vVToQ5Rcrg7H96+zyK0537s9RgiKEpoVfFpOuo3ILKQHPfUYBjEPchjHpqw8PnqRGhWrTGc18pCKe2YV2tJnJ9idGQmCQGbbQ3tNbK/G/KQgJ0NXbIFhNr2cAvs0B5UYdtibqZtbuvx3+KUSN/HNZb/EfMos2hsl+vSEPKnyBoty4BZHunzn7ThvUasKm0SwWla4kZzAI7DEumC81//LHlLQbKp6FILb74Fxgq+MDOHk45vcUDPHpI5/tSJga/uIVumQ== 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=A1VJ2fQZL3pbSY/0MDYCShVgi+k8iBrPAIJn/tt09IY=; b=bWgmIHGzGNB5660UzIrhFuCkbMXFp+As+RfyhSF7ac499gcchYYcUY3c90g9Ev+NyYwl0D7sB7YxamkVWSJ1oHt0Js+5lYAK5SUfzx6sKGmot5uKyjQ89zuIv3vQzltJ0u9Mfe+VDiaxT3k+/d82FxsRboN0c9VAiMEmFAKoxSm6s8Pp3ORvl+PFbCNQZGhY75qG3D8y2lnM8HqjWwgOgyhH3ELwPHdubOQ+ZpLUEjd/l3KeprtWKcYRGF1lpKX+Xy8n5+odwcIzFILsnPNts/WX9DO94dD6TxiD+qmblAre6Eh8i0oncmlFOhYt9hnTQiiID/JRyEjYDgYgNBGWXQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=A1VJ2fQZL3pbSY/0MDYCShVgi+k8iBrPAIJn/tt09IY=; b=pKz9xwLYLV+byPVtBTkDQjbs09vrxb0CpKYRO5nlC6wTNpUAXGXaVYX1oRLjkuuWFRM6qPmYX80U/aer+z9oh8z2RZpU+hr5zTPEkd/fzi83+0I+8J/+DET6D48ZBk9onjKD9Zcc2+PtQz4KnvaKcfH3+tVswvm1zQ6COvxGnTRyaoZKuOkUMJFQ13UQiRIzdIH+kfRXpW+ZDRb3dmZzaBA5LTi5uoN7Nj7QT2fGBb8ipEbagK75/Cs3O4l1qzNQ+ynJgIfvoMYxUKu5s0MSg4uTl6YTwnRXgI87M06Iz2BBpGd/pa1it6JU1DYNEXKAhwtj7rxHIfvMch/OFGyW4Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from GV2PR04MB11799.eurprd04.prod.outlook.com (2603:10a6:150:2cf::9) by PA2PR04MB10279.eurprd04.prod.outlook.com (2603:10a6:102:406::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.139.11; Fri, 19 Jun 2026 19:29:03 +0000 Received: from GV2PR04MB11799.eurprd04.prod.outlook.com ([fe80::2146:83a2:5329:b7c]) by GV2PR04MB11799.eurprd04.prod.outlook.com ([fe80::2146:83a2:5329:b7c%6]) with mapi id 15.21.0113.015; Fri, 19 Jun 2026 19:29:02 +0000 Date: Fri, 19 Jun 2026 15:28:54 -0400 From: Frank Li To: tze.yee.ng@altera.com Cc: Alexandre Belloni , Frank Li , Adrian Ng Ho Yin , Felix Gu , Wolfram Sang , Manikanta Guntupalli , Jorge Marques , Sakari Ailus , linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v3 3/3] i3c: master: Validate GET CCC payload length and retry M0/M2 once Message-ID: References: Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-ClientProxiedBy: PH1PEPF00013315.namprd07.prod.outlook.com (2603:10b6:518:1::8) To GV2PR04MB11799.eurprd04.prod.outlook.com (2603:10a6:150:2cf::9) 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: GV2PR04MB11799:EE_|PA2PR04MB10279:EE_ X-MS-Office365-Filtering-Correlation-Id: 50655ebb-85df-40a1-a962-08dece3904fa X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|19092799006|1800799024|366016|376014|7416014|23010399003|3023799007|22082099003|18002099003|56012099006|11063799006|4143699003; X-Microsoft-Antispam-Message-Info: n0dvTAZwvS/EG4spZe2b+YrvHpzc3gqGJU7CMJ2k7tbZRaGsL8CHqql4/AhEE8wRHZNTSlexwzulyGFSrz7G3ZgCS4erkfXnoe3qgxfZtDnrN+Dn8jQw6vM+bVVsYf6iqmYsROMpSyqHeJcboKmCPfdl1q7P/ifbwRDESf86PHrLIKSZvLickKVc2OQQuyKY1o4YIhfeYOcqWLmub61Sx5JvcE5Io+zUe91NDt3okQihqNrbESrDmlBsl5n/CkZvzovOxgiNMiHCIdRhMPF8d7V9+ORritxXVpgj0kOk/vfjyXiJjmTcwtD3e1l/2E3UTHinbcFAFECOXX128pjNrbKHrjVNaVP6esPKXxD97E0zwZ+UMzUR1Hw6hDB2FR+VtcbHmPHbK8ku+zdWYzHl9BNQRfdrnheH3tfKDw7h5sRRaQImFGCV8z7I60YRH5yY7NRhYRTYSuFtZbKidQLu6/E3FbCL6rB1mIVBovJ8Y1uZifapZr4Pq4AvH8Dg/oe/vjNv2GaJ+jNLPygEzUmvQ6dFnLTDSWaRbArViDZXbw3mhpvBGDdAEFNXxkPnM8Us+gGnpMS1ThSKihdNtGNN7H3nWCsfnT5YovYTKNQhYGF8+BJelcMvOq45NY5U27zyuVZQeMonmRSazt4YucAnXngwebpeBjziFctuCvblFtc= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:GV2PR04MB11799.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(19092799006)(1800799024)(366016)(376014)(7416014)(23010399003)(3023799007)(22082099003)(18002099003)(56012099006)(11063799006)(4143699003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?HClbuwdD6uF+D48lL/g1NHsLl4+86A/Pw0dQ8lwgP30VH7a8GzsJvnOpY4YW?= =?us-ascii?Q?gDEnjNPfA7ns891fZYQ6DhTRCG4UYs5ksh8SP0cR6RIjBi/pR2QemdJCqXeN?= =?us-ascii?Q?lUAzigyJlM/EjJBkJ3g+vU9uTfeDZmb06sQlvocLyfnCkMKTJlDV01/XWboR?= =?us-ascii?Q?TCP8xiHOV6B3JZT+I/86sCaten6Xx/gx244x10TG9VgbzUgWtNlgOYuJHqmP?= =?us-ascii?Q?ye412nBClyWBBL0uN56g3EDr8iHm6tQhURVRdfxYo6WH12bei7t/X1sFFNrI?= =?us-ascii?Q?srHikT6pUUwVkjCTr2kJvwDx9W71Ms58zeyfFkgk+deDH0myk5ucXOm5ZXT5?= =?us-ascii?Q?pc2/qeg8eG8KRXn7/2NvzuV0v4dsqJivV9DbLVlYhbQ7UdIOxoqyIO4ZBmZs?= =?us-ascii?Q?uOBpflC+1rvej4SUnXSpL7ec8QGjZCB8XtwW7UYDnshr4O7fP+SHOg3WfE8a?= =?us-ascii?Q?84Sn0KFCH1jkcB10e4xGP/L/tpLObiFXaOvxfWFsojlYgsPe8Y4/E+KQaFXT?= =?us-ascii?Q?oZDvFAEuTkhQA/m9utLW4TdZjShJWZo39EV71tNoh+rKGmAShX1I01kMhmSh?= =?us-ascii?Q?puym+zKGVR0xDdsxQgHYf2apB7ER+u92yIKU8HF8/sAHHAwtUijPHZIjj9D1?= =?us-ascii?Q?sjmTJbvyXabu0gAaAHK2bh6b55Rwf5Leq1hxL9fTwHacdUU4lVGA5ZPik6Dk?= =?us-ascii?Q?v6AKpeyNDjFPI/gy1AmeVm9qx/Qr/1aszHhMvOcpOxAEk92iOvfoLifkZlRA?= =?us-ascii?Q?6UNo6cfW7ThAnEFS0w/t29h2uB81FkK2yiH0ayklIjdnsh8ju26205sUxMhV?= =?us-ascii?Q?QGtcDGs+t4C9t4QPWq6nFkWTc2yrMeCpi583yCrw9/XPwT9TV912P3BBkOl8?= =?us-ascii?Q?7A6dK+yJOXZUjUykcV8gbFFLwzLkim35+SYxOySLV4FzNRFHE3/hBZzUMZ/D?= =?us-ascii?Q?s6kZ1qgfe2PMXNcWObXQP3D8KmVBSw8fgaTI5ZURYGytFQX0tJiOPtIvHQmU?= =?us-ascii?Q?5W3XjZ+1KtXmEt/vcRYaX0vnaRhWFtgJcowdmhf8EUu6CCt8+5s4je20r1xG?= =?us-ascii?Q?+Sb1w8O/zTdvitNbD0GXgtNEXAPtiUa1KSSYdSJS0FDJ5fD+btZYxvidSCDW?= =?us-ascii?Q?tHbGt0T/lUv7ZdeVN+gU4Mena0VNDz/lEhx0moxiUypXNcup5W/7GKW85Qjc?= =?us-ascii?Q?ALQNtltEWunh5YJgVqga8CfcGDEyZWp4eTJ5nmmXp1ewEmzlULZMrb2xAHQ9?= =?us-ascii?Q?CEL6EnfgadK3Wd3+kiBrUazMpWDIaoy6Eh+Ne09X4LVpgF4pPxSZaunhebbG?= =?us-ascii?Q?NbOaUx0JVsXhBs8SzYgvlYEn4UTeVJ1U7vtDi0X1UAzHK+7vIA+dKhqejSmP?= =?us-ascii?Q?NGf4q4LgqJqBIhSXUFgxgIEdqZn7kBXskaqbwEhRWx0rxyX3bFc69hfSR+5p?= =?us-ascii?Q?SsmCWZEVCaBkduZGB7vIcQdjWAyYPtjbUN1wUrSPygoZrz97+FWOxzM/BwJZ?= =?us-ascii?Q?LRVa9wRv20DlNTPyO5RBxhodbHVZTIl4hjrPVadjucTe/Qcywh14whr+7uCe?= =?us-ascii?Q?WfSPyTHQOu94taxMNsniaiXvMIzOMfOoc8Iu3h98GAr960IlY75/mBct4cgE?= =?us-ascii?Q?P5+owqe48i1rcyCqy4KAHS1gEIVoO0qY9Tp37Ry7bQc4K1lUvARt2CXV55S9?= =?us-ascii?Q?ATNzSFWxp2kKEkqhZLr0mO3thDbD3PGd7JWo7TO3OAXQyQ0tLKDeFl/yjvfH?= =?us-ascii?Q?6eU707I7H9ZD3QlQPmXBiet0DZsD7LLQKeo8m85jvX+nCkz5m9Ey?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 50655ebb-85df-40a1-a962-08dece3904fa X-MS-Exchange-CrossTenant-AuthSource: GV2PR04MB11799.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2026 19:29:02.7184 (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: kmFyFFYTsDyFGUGtOuaHd+NezF/qGWrUzPR2e0qbqzPmOqWn6u0Uv7J6mP3gOIGy82uAb1V7OQHO2MY5f8fRmUQRQ2KYR/VY3L936STmRKl62jiXKydpbxEiduYWzVOU X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA2PR04MB10279 On Wed, Jun 10, 2026 at 06:54:08PM -0700, tze.yee.ng@altera.com wrote: > From: Adrian Ng Ho Yin > > Validate GET CCC payload length after a successful transfer. Treat a > short read as I3C_ERROR_M0 and return -EIO. GETMRL accepts exactly 2 or > 3 bytes per the I3C spec defined formats. GETMXDS may return 2 bytes > (format 1) or 5 bytes (format 2) per I3C spec. > > Retry GET CCCs once on retriable errors: I3C_ERROR_M0 (frame error) and > I3C_ERROR_M2 (address-header NACK, e.g. IBI or Controller Role Request > arbitration per I3C spec section 5.1.2.2.3). SET CCCs are not retried > to avoid repeating side-effecting commands. Restore dests[].payload.len > to the originally requested length before each attempt and again before > returning an error, so callers that adjust the length on failure (e.g. > i3c_master_getmxds_locked()) do not underflow a shortened value. > > Use a stack buffer for the common single-destination GET case and only > kmalloc when ndests > 1. > > Signed-off-by: Adrian Ng Ho Yin > Signed-off-by: Tze Yee Ng > --- > Changes in v3: > - Drop the change that moves RESPONSE_ERROR_ADDRESS_NACK to default case > in dw_i3c_master_end_xfer_locked(). Now dw_i3c_master_end_xfer_locked() > returns -EIO for RESPONSE_ERROR_ADDRESS_NACK. > --- > drivers/i3c/master.c | 111 ++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 110 insertions(+), 1 deletion(-) > > diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c > index 5cd4e5da2233..c94d37cd8b3f 100644 > --- a/drivers/i3c/master.c > +++ b/drivers/i3c/master.c > @@ -26,6 +26,12 @@ static DEFINE_MUTEX(i3c_core_lock); > static int __i3c_first_dynamic_bus_num; > static BLOCKING_NOTIFIER_HEAD(i3c_bus_notifier); > > +#define I3C_CCC_GETMRL_LEN_SHORT 2 > +#define I3C_CCC_GETMRL_LEN_FULL 3 > +#define I3C_CCC_GETMXDS_LEN_SHORT 2 > +#define I3C_CCC_GETMXDS_LEN_FULL 5 > +#define I3C_CCC_MAX_RETRIES 2 > + > /** > * i3c_bus_maintenance_lock - Lock the bus for a maintenance operation > * @bus: I3C bus to take the lock on > @@ -925,6 +931,61 @@ static void i3c_ccc_cmd_init(struct i3c_ccc_cmd *cmd, bool rnw, u8 id, > cmd->err = I3C_ERROR_UNKNOWN; > } > > +static bool i3c_ccc_get_payload_ok(u8 id, u16 req_len, u16 actual_len) > +{ > + if (actual_len > req_len) > + return false; > + > + if (!req_len) > + return actual_len == 0; > + > + if (id == I3C_CCC_GETMRL) > + return actual_len == I3C_CCC_GETMRL_LEN_SHORT || > + actual_len == I3C_CCC_GETMRL_LEN_FULL; > + > + if (id == I3C_CCC_GETMXDS) > + return actual_len == I3C_CCC_GETMXDS_LEN_SHORT || > + actual_len == I3C_CCC_GETMXDS_LEN_FULL; > + > + return actual_len == req_len; > +} > + > +static int i3c_ccc_validate_payload_len(struct i3c_ccc_cmd *cmd, > + const u16 *req_lens) > +{ > + unsigned int i; > + > + if (!cmd->rnw) > + return 0; > + > + for (i = 0; i < cmd->ndests; i++) { > + u16 actual = cmd->dests[i].payload.len; > + u16 req = req_lens[i]; > + > + if (!i3c_ccc_get_payload_ok(cmd->id, req, actual)) { > + cmd->err = I3C_ERROR_M0; > + return -EIO; > + } > + } > + > + return 0; > +} > + > +/* > + * M0: transient frame errors. > + * M2: address-header NACK (I3C spec section 5.1.2.2.3), e.g. when a target > + * simultaneously asserts an IBI or Controller Role Request and neither > + * side ACKs. Software should re-issue the transfer; the controller wins > + * arbitration after Repeated START. > + * > + * Retries apply to GET CCCs only; SET CCCs are not retried to avoid > + * repeating side-effecting commands. > + */ > +static bool i3c_ccc_err_retriable(enum i3c_error_code err) > +{ > + return err == I3C_ERROR_M0 || err == I3C_ERROR_M2; > +} > + > /** > * i3c_master_send_ccc_cmd_locked() - send a CCC (Common Command Codes) > * @master: master used to send frames on the bus > @@ -936,9 +997,17 @@ static void i3c_ccc_cmd_init(struct i3c_ccc_cmd *cmd, bool rnw, u8 id, > static int i3c_master_send_ccc_cmd_locked(struct i3c_master_controller *master, > struct i3c_ccc_cmd *cmd) > { > + u16 req_len; > + u16 *req_lens = NULL; > + u16 *req_lens_alloc = NULL; > + unsigned int i; > + int ret, retries; > + > if (!cmd || !master) > return -EINVAL; > > + retries = cmd->rnw ? I3C_CCC_MAX_RETRIES : 1; > + > if (WARN_ON(master->init_done && > !rwsem_is_locked(&master->bus.lock))) > return -EINVAL; > @@ -953,7 +1022,47 @@ static int i3c_master_send_ccc_cmd_locked(struct i3c_master_controller *master, > !master->ops->supports_ccc_cmd(master, cmd)) > return -EOPNOTSUPP; > > - return master->ops->send_ccc_cmd(master, cmd); > + if (cmd->rnw && cmd->dests && cmd->ndests) { > + if (cmd->ndests == 1) { > + req_len = cmd->dests[0].payload.len; > + req_lens = &req_len; > + } else { > + req_lens_alloc = kmalloc_array(cmd->ndests, > + sizeof(*req_lens_alloc), > + GFP_KERNEL); > + if (!req_lens_alloc) > + return -ENOMEM; > + > + req_lens = req_lens_alloc; > + for (i = 0; i < cmd->ndests; i++) > + req_lens[i] = cmd->dests[i].payload.len; > + } > + } > + > + do { > + cmd->err = I3C_ERROR_UNKNOWN; > + if (req_lens) { > + for (i = 0; i < cmd->ndests; i++) > + cmd->dests[i].payload.len = req_lens[i]; > + } > + ret = master->ops->send_ccc_cmd(master, cmd); why need retry here? Frank > + if (!ret && req_lens) > + ret = i3c_ccc_validate_payload_len(cmd, req_lens); > + } while (--retries && ret && i3c_ccc_err_retriable(cmd->err)); > + > + if (ret && req_lens) { > + /* > + * Drivers may update payload.len to the actual RX count; > + * restore the requested length so callers can safely adjust > + * it on error (e.g. i3c_master_getmxds_locked()). > + */ > + for (i = 0; i < cmd->ndests; i++) > + cmd->dests[i].payload.len = req_lens[i]; > + } > + > + kfree(req_lens_alloc); > + > + return ret; > } > > static struct i2c_dev_desc * > -- > 2.43.7 >