[PATCH] bsps/xqspipsu: Handle SMP systems properly

Chris Johns chrisj at rtems.org
Wed Jun 21 23:55:40 UTC 2023


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


More information about the devel mailing list