sdps: Cache support for switch command

High speed/wide bus operations involve data transfers. Hence these
buffers should be aligned and flushed/invalidated where required.

Signed-off-by: Harini Katakam <harinik@xilinx.com>
This commit is contained in:
Harini Katakam 2014-08-11 15:35:44 +05:30 committed by Jagannadha Sutradharudu Teki
parent 9aee07a7b5
commit ceb52d805c
2 changed files with 27 additions and 0 deletions

View file

@ -203,6 +203,8 @@ int XSdPs_Get_BusWidth(XSdPs *InstancePtr, u8 *SCR)
XSDPS_XFER_MODE_OFFSET,
XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK);
Xil_DCacheInvalidateRange(SCR, 8);
Status = XSdPs_CmdTransfer(InstancePtr, ACMD51, 0, BlkCnt);
if (Status != XST_SUCCESS) {
Status = XST_FAILURE;
@ -380,6 +382,8 @@ int XSdPs_Get_BusSpeed(XSdPs *InstancePtr, u8 *ReadBuff)
Arg = XSDPS_SWITCH_CMD_HS_GET;
Xil_DCacheInvalidateRange(ReadBuff, 64);
Status = XSdPs_CmdTransfer(InstancePtr, CMD6, Arg, 1);
if (Status != XST_SUCCESS) {
Status = XST_FAILURE;
@ -444,7 +448,13 @@ int XSdPs_Change_BusSpeed(XSdPs *InstancePtr)
#ifndef MMC_CARD
u32 ClockReg;
#ifdef __ICCARM__
#pragma data_alignment = 32
u8 ReadBuff[64];
#pragma data_alignment = 4
#else
u8 ReadBuff[64] __attribute__ ((aligned(32)));
#endif
u16 BlkCnt;
u16 BlkSize;
#endif
@ -462,6 +472,8 @@ int XSdPs_Change_BusSpeed(XSdPs *InstancePtr)
XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, ReadBuff);
Xil_DCacheFlushRange(ReadBuff, 64);
XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
XSDPS_XFER_MODE_OFFSET,
XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK);
@ -752,6 +764,8 @@ int XSdPs_Get_Mmc_ExtCsd(XSdPs *InstancePtr, u8 *ReadBuff)
XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, ReadBuff);
Xil_DCacheInvalidateRange(ReadBuff, 512);
XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
XSDPS_XFER_MODE_OFFSET,
XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK);

View file

@ -107,7 +107,13 @@ static DSTATUS Stat; /* Disk status */
static XSdPs SdInstance;
#endif
#ifdef __ICCARM__
#pragma data_alignment = 32
u8 ExtCsd[512];
#pragma data_alignment = 4
#else
u8 ExtCsd[512] __attribute__ ((aligned(32)));
#endif
/*-----------------------------------------------------------------------*/
/* Get Disk Status */
@ -185,8 +191,15 @@ DSTATUS disk_initialize (
{
DSTATUS s;
int Status;
#ifdef __ICCARM__
#pragma data_alignment = 32
u8 SCR[8];
u8 ReadBuff[64];
#pragma data_alignment = 4
#else
u8 SCR[8] __attribute__ ((aligned(32)));
u8 ReadBuff[64] __attribute__ ((aligned(32)));
#endif
#ifdef FILE_SYSTEM_INTERFACE_SD