From: "Nhi Pham via groups.io" <nhi=os.amperecomputing.com@groups.io>
To: Leif Lindholm <quic_llindhol@quicinc.com>, devel@edk2.groups.io
Cc: chuong@os.amperecomputing.com, rebecca@os.amperecomputing.com
Subject: Re: [edk2-devel] [edk2-platforms][PATCH 1/5] AmpereAltraPkg/DwI2cLib: Add SmbusRead() function
Date: Mon, 5 Aug 2024 10:44:18 +0700 [thread overview]
Message-ID: <4de61f1e-517f-4afb-8bab-1988462888e2@os.amperecomputing.com> (raw)
In-Reply-To: <ZqumOCamVgWCj0NL@qc-i7.hemma.eciton.net>
On 8/1/2024 10:14 PM, Leif Lindholm wrote:
> On Thu, Aug 01, 2024 at 16:36:14 +0700, Nhi Pham via groups.io wrote:
>> This adds the SmbusRead() function designed for SMBUS transaction to
>> support the extraction of the data lenth byte from the initial byte of
>
> length
I will fix, thanks.
>
>> the SMBUS Block Read, allowing the I2C master to accurately read the
>> SMBUS response with the exact data length. This addresses the issue
>> where the SmbusLib:SmBusReadBlock() function consistently reads a
>> 32-byte block of data.
>
> Doh, I managed to start reviewing on 2/5 instead 1/5.
> Regardless, since this is new code, please update to controller/target
> terminology to match current versions of protocol specifications,
> throughout the set.
I will update, thanks.
>
>> Signed-off-by: Nhi Pham <nhi@os.amperecomputing.com>
>> ---
>> Silicon/Ampere/AmpereAltraPkg/Include/Library/I2cLib.h | 31 +++++
>> Silicon/Ampere/AmpereAltraPkg/Library/DwI2cLib/DwI2cLib.c | 137 +++++++++++++++++++-
>> 2 files changed, 163 insertions(+), 5 deletions(-)
>>
>> diff --git a/Silicon/Ampere/AmpereAltraPkg/Include/Library/I2cLib.h b/Silicon/Ampere/AmpereAltraPkg/Include/Library/I2cLib.h
>> index f13794171029..d460f49efccb 100644
>> --- a/Silicon/Ampere/AmpereAltraPkg/Include/Library/I2cLib.h
>> +++ b/Silicon/Ampere/AmpereAltraPkg/Include/Library/I2cLib.h
>> @@ -65,6 +65,37 @@ I2cRead (
>> IN OUT UINT32 *ReadLength
>> );
>>
>> +/**
>> + SMBUS block read.
>> +
>> + @param[in] Bus I2C bus Id.
>> + @param[in] SlaveAddr The address of slave device on the bus.
>> + @param[in] BufCmd Buffer where to send the command.
>> + @param[in] CmdLength Length of BufCmd.
>> + @param[in,out] Buf Buffer where to put the read data to.
>> + @param[in,out] ReadLength Pointer to length of buffer.
>> + @param[in] PecCheck If Packet Error Code (PEC) checking is required for this operation.
>> +
>> + @retval EFI_SUCCESS Read successfully.
>> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
>> + @retval EFI_UNSUPPORTED The bus is not supported.
>> + @retval EFI_NOT_READY The device/bus is not ready.
>> + @retval EFI_TIMEOUT Timeout when transferring data.
>> + @retval EFI_CRC_ERROR There are errors on receiving data.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +SmbusRead (
>> + IN UINT32 Bus,
>> + IN UINT32 SlaveAddr,
>> + IN UINT8 *BufCmd,
>> + IN UINT32 CmdLength,
>> + IN OUT UINT8 *Buf,
>> + IN OUT UINT32 *ReadLength,
>> + IN BOOLEAN PecCheck
>> + );
>> +
>> /**
>> Setup new transaction with I2C slave device.
>>
>> diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/DwI2cLib/DwI2cLib.c b/Silicon/Ampere/AmpereAltraPkg/Library/DwI2cLib/DwI2cLib.c
>> index 669ba2ea98a4..9e52ae69e7cd 100644
>> --- a/Silicon/Ampere/AmpereAltraPkg/Library/DwI2cLib/DwI2cLib.c
>> +++ b/Silicon/Ampere/AmpereAltraPkg/Library/DwI2cLib/DwI2cLib.c
>> @@ -337,6 +337,11 @@ I2cWaitTxData (
>> DEBUG ((DEBUG_ERROR, "%a: Timeout waiting for TX buffer available\n", __FUNCTION__));
>> return EFI_TIMEOUT;
>> }
>> +
>> + if ((I2cCheckErrors (Bus) & DW_IC_INTR_TX_ABRT) != 0) {
>> + return EFI_ABORTED;
>> + }
>> +
>> MicroSecondDelay (mI2cBusList[Bus].PollingTime);
>> }
>>
>> @@ -542,13 +547,61 @@ InternalI2cWrite (
>> return Status;
>> }
>>
>> +EFI_STATUS
>> +InternalSmbusReadDataLength (
>> + UINT32 Bus,
>> + UINT32 *Length
>> + )
>> +{
>> + EFI_STATUS Status;
>> + UINTN Base;
>> + UINT32 CmdSend;
>> +
>> + Base = mI2cBusList[Bus].Base;
>> +
>> + CmdSend = DW_IC_DATA_CMD_CMD;
>> + MmioWrite32 (Base + DW_IC_DATA_CMD, CmdSend);
>> + I2cSync ();
>> +
>> + if (I2cCheckErrors (Bus) != 0) {
>> + DEBUG ((DEBUG_ERROR, "%a: Sending reading command error\n", __func__));
>> + return EFI_CRC_ERROR;
>> + }
>> +
>> + Status = I2cWaitRxData (Bus);
>> + if (EFI_ERROR (Status)) {
>> + DEBUG ((DEBUG_ERROR,
>> + "%a: Reading Smbus data length failed to wait data\n",
>> + __func__
>> + ));
>> +
>> + if (Status != EFI_ABORTED) {
>> + MmioWrite32 (Base + DW_IC_DATA_CMD, DW_IC_DATA_CMD_STOP);
>> + I2cSync ();
>> + }
>> +
>> + return Status;
>> + }
>> +
>> + *Length = MmioRead32 (Base + DW_IC_DATA_CMD) & DW_IC_DATA_CMD_DAT_MASK;
>> + I2cSync ();
>> +
>> + if (I2cCheckErrors (Bus) != 0) {
>> + DEBUG ((DEBUG_ERROR, "%a: Sending reading command error\n", __func__));
>> + return EFI_CRC_ERROR;
>> + }
>> + return EFI_SUCCESS;
>> +}
>> +
>> EFI_STATUS
>> InternalI2cRead (
>> UINT32 Bus,
>> - UINT8 *BufCmd,
>> - UINT32 CmdLength,
>> - UINT8 *Buf,
>> - UINT32 *Length
>> + UINT8 *BufCmd,
>> + UINT32 CmdLength,
>> + UINT8 *Buf,
>> + UINT32 *Length,
>> + BOOLEAN IsSmbus,
>
> Can this really change on a per-transaction basis?
> If not, can it move to a state held in DW_I2C_CONTEXT_T?
>
>> + BOOLEAN PecCheck
>
> I guess the same question as above really.
>
> /
> Leif
That makes sense, thanks Leif. I will pass IsSmbus and PecCheck in
I2cProbe() and cache in the DW_I2C_CONTEXT_T.
Regards,
Nhi
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#120220): https://edk2.groups.io/g/devel/message/120220
Mute This Topic: https://groups.io/mt/107662232/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
next prev parent reply other threads:[~2024-08-05 3:44 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-01 9:36 [edk2-devel] [edk2-platforms][PATCH 0/5] Add IPMI SSIF support Nhi Pham via groups.io
2024-08-01 9:36 ` [edk2-devel] [edk2-platforms][PATCH 1/5] AmpereAltraPkg/DwI2cLib: Add SmbusRead() function Nhi Pham via groups.io
2024-08-01 15:14 ` Leif Lindholm
2024-08-05 3:44 ` Nhi Pham via groups.io [this message]
2024-08-01 15:18 ` Leif Lindholm
2024-08-05 3:46 ` Nhi Pham via groups.io
2024-08-01 9:36 ` [edk2-devel] [edk2-platforms][PATCH 2/5] AmpereSiliconPkg: Define PCDs for SMBUS and BMC Nhi Pham via groups.io
2024-08-01 15:02 ` Leif Lindholm
2024-08-05 3:18 ` Nhi Pham via groups.io
2024-08-01 9:36 ` [edk2-devel] [edk2-platforms][PATCH 3/5] AmpereAltraPkg: Add SmbusHc PEI and DXE drivers Nhi Pham via groups.io
2024-08-01 9:36 ` [edk2-devel] [edk2-platforms][PATCH 4/5] JadePkg: Add PlatformBmcReadyLib to support BMC ready check Nhi Pham via groups.io
2024-08-01 9:36 ` [edk2-devel] [edk2-platforms][PATCH 5/5] Ampere/Jade: Enable IPMI SSIF Nhi Pham via groups.io
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4de61f1e-517f-4afb-8bab-1988462888e2@os.amperecomputing.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox