OK

Chris

On 22/6/2023 2:09 am, Kinsey Moore wrote:
> The NOR driver was not written with SMP systems and caching in mind.
> This makes the IsBusy flag volatile for updates across cores and
> introduces cache flushing and invalidation where necessary for data
> manipulated by the DMA engine in the QSPI peripheral.
> ---
>  bsps/include/dev/spi/xqspipsu.h             |  3 +++
>  bsps/shared/dev/spi/xqspipsu-flash-helper.c |  3 +++
>  bsps/shared/dev/spi/xqspipsu.c              | 23 +++++++++++++++++++++
>  3 files changed, 29 insertions(+)
> 
> diff --git a/bsps/include/dev/spi/xqspipsu.h b/bsps/include/dev/spi/xqspipsu.h
> index 7d9b662464..92d38eb0c8 100644
> --- a/bsps/include/dev/spi/xqspipsu.h
> +++ b/bsps/include/dev/spi/xqspipsu.h
> @@ -259,6 +259,9 @@ typedef struct {
>       s32 TxBytes;     /**< Number of bytes to transfer (state) */
>       s32 RxBytes;     /**< Number of bytes left to transfer(state) */
>       s32 GenFifoEntries;      /**< Number of Gen FIFO entries remaining */
> +#ifdef __rtems__
> +     volatile
> +#endif
>       u32 IsBusy;              /**< A transfer is in progress (state) */
>       u32 ReadMode;            /**< DMA or IO mode */
>       u32 GenFifoCS;          /**< Gen FIFO chip selection */
> diff --git a/bsps/shared/dev/spi/xqspipsu-flash-helper.c 
> b/bsps/shared/dev/spi/xqspipsu-flash-helper.c
> index 4e018bf2fa..c9d8273b87 100644
> --- a/bsps/shared/dev/spi/xqspipsu-flash-helper.c
> +++ b/bsps/shared/dev/spi/xqspipsu-flash-helper.c
> @@ -314,6 +314,7 @@ static int FlashReadID(XQspiPsu *QspiPsuPtr)
>    }
>    while (TransferInProgress);
>  
> +  rtems_cache_invalidate_multiple_data_lines(ReadBfrPtr, 3);
>    /* In case of dual, read both and ensure they are same make/size */
>  
>    /*
> @@ -860,6 +861,7 @@ int QspiPsu_NOR_Read(
>      while (TransferInProgress);
>  
>    }
> +  rtems_cache_invalidate_multiple_data_lines(ReadBuffer, ByteCount);
>    return 0;
>  }
>  
> @@ -1047,6 +1049,7 @@ static int MultiDieRead(
>      Address += data_len;
>      remain_len -= data_len;
>    }
> +  rtems_cache_invalidate_multiple_data_lines(ReadBfrPtr, ByteCount);
>    return 0;
>  }
>  
> diff --git a/bsps/shared/dev/spi/xqspipsu.c b/bsps/shared/dev/spi/xqspipsu.c
> index 1286efd359..c77407bdf4 100644
> --- a/bsps/shared/dev/spi/xqspipsu.c
> +++ b/bsps/shared/dev/spi/xqspipsu.c
> @@ -84,6 +84,9 @@
>  #include "xqspipsu.h"
>  #include "xqspipsu_control.h"
>  #include "sleep.h"
> +#ifdef __rtems__
> +#include <rtems/rtems/cache.h>
> +#endif
>  
>  /************************** Constant Definitions 
> *****************************/
>  #define MAX_DELAY_CNT        10000000U       /**< Max delay count */
> @@ -442,7 +445,16 @@ s32 XQspiPsu_PolledTransfer(XQspiPsu *InstancePtr, 
> XQspiPsu_Msg *Msg,
>  
>       for (Index = 0; Index < (s32)NumMsg; Index++) {
>               Xil_AssertNonvoid(Msg[Index].ByteCount > 0U);
> +#ifdef __rtems__
> +             if (Msg[Index].TxBfrPtr != NULL) {
> +                     
> rtems_cache_flush_multiple_data_lines(Msg[Index].TxBfrPtr, 
> Msg[Index].ByteCount);
> +             }
> +#endif
>       }
> +#ifdef __rtems__
> +     rtems_cache_flush_multiple_data_lines(Msg, NumMsg * sizeof(*Msg));
> +#endif
> +
>       /*
>        * Check whether there is another transfer in progress.
>        * Not thread-safe
> @@ -582,7 +594,18 @@ s32 XQspiPsu_InterruptTransfer(XQspiPsu *InstancePtr, 
> XQspiPsu_Msg *Msg,
>       Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
>  
>       for (Index = 0; Index < (s32)NumMsg; Index++)
> +#ifdef __rtems__
> +     {
> +#endif
>               Xil_AssertNonvoid(Msg[Index].ByteCount > 0U);
> +#ifdef __rtems__
> +             if (Msg[Index].TxBfrPtr != NULL) {
> +                     
> rtems_cache_flush_multiple_data_lines(Msg[Index].TxBfrPtr, 
> Msg[Index].ByteCount);
> +             }
> +     }
> +     rtems_cache_flush_multiple_data_lines(Msg, NumMsg * sizeof(*Msg));
> +#endif
> +
>       /*
>        * Check whether there is another transfer in progress.
>        * Not thread-safe
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to