From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dy1-f170.google.com (mail-dy1-f170.google.com [74.125.82.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D921230E84A for ; Sat, 27 Jun 2026 15:35:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.170 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782574543; cv=none; b=BIep5mn455DzAmVpv+ssCtxNrf/5zaTzFFJvG59dhfrz998RNnhj2isOJOo7CUMjtNx0Y7IO+4JslAAehwm8/1+fIEwWnQip60mbgkh78qbCcN7OLNYZOmXtI+JqwwIa1kgu1S9Xa2upLORasUDYMnJa4eBEeN2h7MUBGdF/vGk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782574543; c=relaxed/simple; bh=KewN3u6Gz4JcSCHQS9sgydHkBx7wiNEAQRRyJg6iIIc=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=FqEibsWaxiyiYlU6wvn4zLJ+LOnIqfgg/IvM46mzPNct2ATmN2RKCi9t/c+uQYQULBNv2TUKSPRrkhazP5uN8jZxcHujIgEkemKAm0MB3d5KZmPZw/81RL+qZwfTbDKdKInz+D0fX/JrIUKciCDl1dQyHWjrtaJBTxxOEFTisYM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=b60s1Xkp; arc=none smtp.client-ip=74.125.82.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="b60s1Xkp" Received: by mail-dy1-f170.google.com with SMTP id 5a478bee46e88-30b6dad2382so3935185eec.0 for ; Sat, 27 Jun 2026 08:35:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782574540; x=1783179340; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=26fZRDnY2YIHaW3dI6zHmFrI0wJ7v//cQRa+/PWgmig=; b=b60s1Xkpskcttv3Gt4xEs7fiRUOzd+AJVJ3bxSNOFTyPeU0t6NwZ05wgTRd4+QGKi5 3VZjPRroPTXrFCO4H8LYAcUakmT2aMXAbBtnED5Iss7/uTCVTmN9P9D+I4Z1SG98DkaD 4wxMB8s4DDyMEDGiTuYQUY3lm8QzootxsRJpB+IXMgIpQK0K96TTrN2OE0V3djJrINnu 3RhY6qZ6WTddRO5quutWawMVsPcsdEhIu50/PT2qssGw3Y+V668ervMLr3FKMf10FUu8 WCM4dhjOU1X/biMuDxHHLmLN3wmuZ2nB9c8LLbW6auzTZK3BIVXlvGkWj1+5C9if3S6e hs4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782574540; x=1783179340; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=26fZRDnY2YIHaW3dI6zHmFrI0wJ7v//cQRa+/PWgmig=; b=ZRyZrhiiA1I2FXx3mAP8K3edKtwrM3OLTJcxPYITivWmYOOmaGiU4GZmS3gGYtaOEF j0oAaY7qppm5mc1BVK7Qgz+ln91khOTpTi9HdrJ6CCj2gvnptcyHgniBfJZnp+jZwPr6 dstPeJLtq3nbIhSjQhaCmoIUWiFAeWPJ0oy+vS2AvOIePPE5CjhPo879A+438iEmGPdQ KwNCTA4UPKuhhMolI1Q3YQ4TjkviXxHrOmK/yx3qc9Udp27QqDLVCYlXuFc+QO2xTkU1 kjXpNWYjkpnwKBkD69ErsAmATQ1qruPtL6LY7rLcT8O5ON8YnOcqEjI2PdL09uwJTWPJ DShA== X-Forwarded-Encrypted: i=1; AHgh+RrqX/B37lM3cfzGJAGSp8DxCv6fQNVCfS4ssUjXKR7J4BIrj1iKiiXMdm/usUtkRj5IU5R47iovxmYVCA4=@vger.kernel.org X-Gm-Message-State: AOJu0YwfGoiOl3OtDAuCZdXs6gKv+0duQ98cT/ypjXF30zCV5+1F7OVN 4z0BWRCaST5SRp9sw8XChpYl1Bkzrq9cPq5bDZB14iql2JYZX8M51qBzIx1R/A== X-Gm-Gg: AfdE7cnBucz4DzNPNNSQfC2nqXCFTPCNsj0acXCz056TWKEg4KNMoac0qQKv0MUxY23 cq8S5Df8aDxWu910hvCJAf+6Lzu0qoKXcYEVxQyQqCoSdJaz1KTekJHSvCzJ/pZOO6XqspF5VTS 4tQAdtHpsVgBoN+KO5BwngMEMV8/qNj/WFPtUg6WqCTRxYJ3dl0cPqdL5po+UcI1UrkvMdqx0fR Gv5MouY5mhuzVX23MnlwasC4mMKIhB7t2ayi3+O67QI3weadINUCg+ZfPQkEL7Z2WYCEUvaNRw7 f18DvIUViO/b9BO8oU5dbU+00+shELV84Efthp1OYt61hM2uIoZ+8dtLwht6SZV1si3thAJEb4z s7K3nQgBY0YniSgndXysQ4PDu0kAYDEEG0p3+Ni7xRgeMFGiVNeIzQ6dU6z8fUHg5hPFhO4e229 aAnv4HfIh6Rnz+Zdru X-Received: by 2002:a05:7300:8b85:b0:304:d835:274 with SMTP id 5a478bee46e88-30c84cfb442mr9198462eec.24.1782574539807; Sat, 27 Jun 2026 08:35:39 -0700 (PDT) Received: from amd.com ([165.204.156.251]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-30c7c58831asm31970846eec.13.2026.06.27.08.35.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 27 Jun 2026 08:35:39 -0700 (PDT) From: Paritosh Potukuchi X-Google-Original-From: Paritosh Potukuchi To: andi.shyti@kernel.org Cc: shyam-sundar.s-k@amd.com, linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Paritosh Potukuchi Subject: [PATCH] i2c: amd: fix SMBus block header and PEC handling in the RX path Date: Sat, 27 Jun 2026 15:35:32 +0000 Message-ID: <20260627153532.547719-1-paritosh.potukuchi@amd.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Strip SMBus block header bytes from the received buffer before forwarding the payload to the upper layers. Handles the optional PEC Byte at the end of the received payload. Signed-off-by: Paritosh Potukuchi --- drivers/i2c/busses/i2c-amd-asf-plat.c | 34 +++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/busses/i2c-amd-asf-plat.c b/drivers/i2c/busses/i2c-amd-asf-plat.c index e1699da838c2..daf318ce3bbb 100644 --- a/drivers/i2c/busses/i2c-amd-asf-plat.c +++ b/drivers/i2c/busses/i2c-amd-asf-plat.c @@ -46,6 +46,8 @@ #define ASF_BLOCK_MAX_BYTES 72 #define ASF_ERROR_STATUS GENMASK(3, 1) +#define SMBUS_BLOCK_HEADER_SIZE 2 + struct amd_asf_dev { struct i2c_adapter adap; void __iomem *eoi_base; @@ -61,7 +63,7 @@ static void amd_asf_process_target(struct work_struct *work) unsigned short piix4_smba = dev->port_addr->start; u8 data[ASF_BLOCK_MAX_BYTES]; u8 bank, reg, cmd; - u8 len = 0, idx, val; + u8 len = 0, idx, val, offset, data_len, payload_len, has_pec; /* Read target status register */ reg = inb_p(ASFSLVSTA); @@ -110,12 +112,40 @@ static void amd_asf_process_target(struct work_struct *work) if (cmd & BIT(0)) return; + + /*Below is the SMBus block header received on the wire: + * Command -- 1 Byte + * Data Length -- 1 Byte (number of data bytes) + * Data -- N Bytes + * PEC -- optional, 1 Byte + * + * PEC, if present, is the final byte of the transfer + */ + + offset = SMBUS_BLOCK_HEADER_SIZE; + if (len < offset) + return; + + payload_len = data[1]; + + if (payload_len > len - offset) + return; + + if (len == offset + payload_len + 1) + has_pec = 1; + else if (len == offset + payload_len) + has_pec = 0; + else + return; + + data_len = len - has_pec; + /* * Although i2c_slave_event() returns an appropriate error code, we * don't check it here because we're operating in the workqueue context. */ i2c_slave_event(dev->target, I2C_SLAVE_WRITE_REQUESTED, &val); - for (idx = 0; idx < len; idx++) { + for (idx = offset; idx < data_len; idx++) { val = data[idx]; i2c_slave_event(dev->target, I2C_SLAVE_WRITE_RECEIVED, &val); } -- 2.43.0