public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "PierreGondois" <pierre.gondois@arm.com>
To: devel@edk2.groups.io, sahil.kaushal@arm.com
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>,
	Leif Lindholm <quic_llindhol@quicinc.com>,
	Sami Mujawar <sami.mujawar@arm.com>, sahil <sahil@arm.com>,
	"levi.yun" <yeoreum.yun@arm.com>
Subject: Re: [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 12/14] Platform/ARM: Add CadenceQspiNorFlashDeviceLib for NorFlashDxe
Date: Thu, 2 May 2024 15:17:09 +0200	[thread overview]
Message-ID: <8f292b6a-4c18-48c5-8e20-5eb9c86538e0@arm.com> (raw)
In-Reply-To: <20240423055638.1271531-13-Sahil.Kaushal@arm.com>

Hello Sahil,

On 4/23/24 07:56, Sahil Kaushal via groups.io wrote:
> From: sahil <sahil@arm.com>
> 
> In N1Sdp platform, the SoC is connected to IOFPGA which has a
> Cadence Quad SPI (QSPI) controller. This QSPI controller manages
> the flash chip device via QSPI bus.
> 
> This patch adds CadenceQspiNorFlashDeviceLib which is used to
> manage and access the above configuration.
> 
> Signed-off-by: sahil <sahil@arm.com>
> ---
>   Platform/ARM/Library/CadenceQspiNorFlashDeviceLib/CadenceQspiNorFlashDeviceLib.inf |   32 +
>   Platform/ARM/Library/CadenceQspiNorFlashDeviceLib/CadenceQspiNorFlashDeviceLib.h   |   44 +
>   Platform/ARM/Library/CadenceQspiNorFlashDeviceLib/CadenceQspiNorFlashDeviceLib.c   | 1011 ++++++++++++++++++++
>   3 files changed, 1087 insertions(+)
> 

[snip]

> +
> +/**
> +  Converts milliseconds into number of ticks of the performance counter.
> +
> +  @param[in] Milliseconds  Milliseconds to convert into ticks.
> +
> +  @retval Milliseconds expressed as number of ticks.
> +
> +**/
> +STATIC
> +UINT64
> +MilliSecondsToTicks (
> +  IN UINTN  Milliseconds
> +  )
> +{
> +  CONST UINT64  NanoSecondsPerTick = GetTimeInNanoSecond (1);
> +
> +  return (Milliseconds * 1000000) / NanoSecondsPerTick;

Should use DivU64x64Remainder() here:
{
   UINT64  NanoSecondsPerTick;
   UINT64  NanoSeconds;

   NanoSecondsPerTick = GetTimeInNanoSecond (1);
   NanoSeconds = MultU64x32 (Milliseconds, 1000000);

   return DivU64x64Remainder (NanoSeconds, NanoSecondsPerTick, NULL);
}

> +}
> +
> +/**
> +  Poll Status register for NOR flash erase/write completion.
> +
> +  @param[in]      Instance           NOR flash Instance.
> +
> +  @retval         EFI_SUCCESS        Request is executed successfully.
> +  @retval         EFI_TIMEOUT        Operation timed out.
> +  @retval         EFI_DEVICE_ERROR   Controller operartion failed.

operartion -> typo
(same at another place I think)

[snip]

> +
> +/**
> +  Read from nor flash.
> +
> +  @param[in]     Instance               NOR flash Instance of variable store region.
> +  @param[in]     Lba                    The starting logical block index to read from.
> +  @param[in]     Offset                 Offset into the block at which to begin reading.
> +  @param[in]     BufferSizeInBytes      The number of bytes to read.
> +  @param[out]    Buffer                 The pointer to a caller-allocated buffer that
> +                                        should copied with read data.
> +
> +  @retval        EFI_SUCCESS            The read is completed.
> +  @retval        EFI_INVALID_PARAMETER  Invalid parameters passed.
> +**/
> +EFI_STATUS
> +NorFlashRead (
> +  IN NOR_FLASH_INSTANCE  *Instance,
> +  IN EFI_LBA             Lba,
> +  IN UINTN               Offset,
> +  IN UINTN               BufferSizeInBytes,
> +  OUT VOID               *Buffer
> +  )
> +{
> +  UINTN  StartAddress;
> +
> +  // The buffer must be valid
> +  if (Buffer == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  // Return if we do not have any byte to read
> +  if (BufferSizeInBytes == 0) {
> +    return EFI_SUCCESS;
> +  }
> +
> +  if (((Lba * Instance->Media.BlockSize) + Offset + BufferSizeInBytes) >
> +      Instance->Size)
> +  {
> +    DEBUG ((
> +      DEBUG_ERROR,
> +      "NorFlashRead: ERROR - Read will exceed device size.\n"
> +      ));
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  // Get the address to start reading from
> +  StartAddress = GET_NOR_BLOCK_ADDRESS (
> +                   Instance->RegionBaseAddress,
> +                   Lba,
> +                   Instance->Media.BlockSize
> +                   );
> +
> +  // Readout the data
> +  CopyMem (Buffer, (UINTN *)(StartAddress + Offset), BufferSizeInBytes);

The original code at:
   Platform/ARM/Library/P30NorFlashDeviceLib/P30NorFlashDeviceLib.c

implements and uses AlignedCopyMem()/NorFlashWriteBuffer() which seems
to be more efficient.
Just to be sure I understand correctly, is the maximal read/write size
of 4 bytes ? Meaning that these functions are not needed ?

---

NorFlashWriteBuffer() is not implemented here IIUC won't be implemtned as not
needed. Maybe in an additional patch, the function could be removed from the
library interface at:
   Platform/ARM/Include/Library/NorFlashDeviceLib.h
and made static in:
   Platform/ARM/Library/P30NorFlashDeviceLib/P30NorFlashDeviceLib.c

> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Write a full or portion of a block.
> +
> +  @param[in]       Instance              NOR flash Instance of variable store region.
> +  @param[in]       Lba                   The starting logical block index to write to.
> +  @param[in]       Offset                Offset into the block at which to begin writing.
> +  @param[in, out]  NumBytes              The total size of the buffer.
> +  @param[in]       Buffer                The pointer to a caller-allocated buffer that
> +                                         contains the source for the write.
> +
> +  @retval          EFI_SUCCESS           The write is completed.
> +  @retval          EFI_OUT_OF_RESOURCES  Invalid Buffer passed.
> +  @retval          EFI_BAD_BUFFER_SIZE   Buffer size not enough.
> +  @retval          EFI_DEVICE_ERROR      The device reported an error.
> +**/
> +EFI_STATUS
> +NorFlashWriteSingleBlock (
> +  IN        NOR_FLASH_INSTANCE  *Instance,
> +  IN        EFI_LBA             Lba,
> +  IN        UINTN               Offset,
> +  IN OUT    UINTN               *NumBytes,
> +  IN        UINT8               *Buffer
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      Tmp;
> +  UINT32      TmpBuf;
> +  UINT32      WordToWrite;
> +  UINT32      Mask;
> +  BOOLEAN     DoErase;
> +  UINTN       BytesToWrite;
> +  UINTN       CurOffset;
> +  UINTN       WordAddr;
> +  UINTN       BlockSize;
> +  UINTN       BlockAddress;
> +  UINTN       PrevBlockAddress;
> +
> +  if (Buffer == NULL) {
> +    DEBUG ((
> +      DEBUG_ERROR,
> +      "NorFlashWriteSingleBlock: ERROR - Buffer is invalid\n"
> +      ));
> +    return EFI_OUT_OF_RESOURCES;

EFI_INVALID_PARAMETER instead I think

> +  }
> +
> +  PrevBlockAddress = 0;
> +
> +  DEBUG ((
> +    DEBUG_INFO,
> +    "NorFlashWriteSingleBlock(Parameters: Lba=%ld, Offset=0x%x, "
> +    "*NumBytes=0x%x, Buffer @ 0x%08x)\n",
> +    Lba,
> +    Offset,
> +    *NumBytes,
> +    Buffer
> +    ));
> +
> +  // Localise the block size to avoid de-referencing pointers all the time

Localise -> Locate

> +  BlockSize = Instance->Media.BlockSize;
> +

[snip]


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#118509): https://edk2.groups.io/g/devel/message/118509
Mute This Topic: https://groups.io/mt/105690947/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



  parent reply	other threads:[~2024-05-02 13:17 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-23  5:56 [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 00/14] Split NorFlashDxe driver and add CadenceQspiNorFlashDeviceLib library Sahil Kaushal
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 01/14] Platform/ARM/NorFlashDxe: Move DiskIo related functions out of NorFlash.c Sahil Kaushal
2024-04-24  9:49   ` levi.yun
2024-05-16 15:17   ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 02/14] Platform/ARM/NorFlashDxe: Move NorFlashVirtualNotifyEvent Sahil Kaushal
2024-05-16 15:17   ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 03/14] Platform/ARM/NorFlashDxe: Add NorFlashCommon.h header file Sahil Kaushal
2024-04-24  9:49   ` levi.yun
2024-05-16 15:17   ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 04/14] Platform/ARM/NorFlashDxe: Move flash specific functions to NorFlash.c Sahil Kaushal
2024-04-24  9:49   ` levi.yun
2024-05-16 15:17   ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 05/14] Platform/ARM: Create NorFlashDeviceLib library interface for flash specific functions Sahil Kaushal
2024-04-24  9:50   ` levi.yun
2024-05-16 15:18   ` Sami Mujawar
2024-05-21  8:37     ` sahil
2024-05-21 14:05       ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 06/14] Platform/ARM: Add P30NorFlashDeviceLib Library Sahil Kaushal
2024-04-24  9:49   ` levi.yun
2024-05-16 15:18   ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 07/14] Platform/ARM/NorFlashDxe: Switch from NorFlash.c to NorFlashDeviceLib Sahil Kaushal
2024-04-24  9:50   ` levi.yun
2024-05-16 15:18   ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 08/14] Platform/ARM: Add HostRegisterBaseAddress variable Sahil Kaushal
2024-04-24  9:50   ` levi.yun
2024-05-16 15:22   ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 09/14] Platform/ARM: Add optional provision to fetch and print NOR Flash info Sahil Kaushal
2024-04-24  9:51   ` levi.yun
2024-05-16 15:23   ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 10/14] Silicon/ARM/NeoverseN1Soc: Enable SCP QSPI flash region Sahil Kaushal
2024-04-24  9:50   ` levi.yun
2024-05-16 15:23   ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 11/14] Silicon/ARM/NeoverseN1Soc: NOR flash library for N1Sdp Sahil Kaushal
2024-04-24  9:50   ` levi.yun
2024-05-16 15:23   ` Sami Mujawar
2024-05-21  9:24     ` sahil
2024-05-21 12:59       ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 12/14] Platform/ARM: Add CadenceQspiNorFlashDeviceLib for NorFlashDxe Sahil Kaushal
2024-04-24  9:55   ` levi.yun
2024-05-02 13:17   ` PierreGondois [this message]
2024-05-09  6:25     ` sahil
2024-05-16 15:25       ` Sami Mujawar
2024-05-16 15:24   ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 13/14] Platform/ARM/N1Sdp: Persistent storage for N1Sdp Sahil Kaushal
2024-04-24  9:55   ` levi.yun
2024-05-16 15:24   ` Sami Mujawar
2024-04-23  5:56 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 14/14] Platform/ARM/N1Sdp: Enable FaultTolerantWrite Dxe driver " Sahil Kaushal
2024-04-24  9:51   ` levi.yun
2024-05-16 15:24   ` Sami Mujawar
2024-05-02 13:16 ` [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 00/14] Split NorFlashDxe driver and add CadenceQspiNorFlashDeviceLib library PierreGondois

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=8f292b6a-4c18-48c5-8e20-5eb9c86538e0@arm.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