16#include "iLink_internal.h"
18extern unsigned short int LocalNodeID;
19extern int IntrEventFlag;
21extern int GenerationNumber;
24extern unsigned int *TargetBuffer;
25extern unsigned int LocalCachedIntr0Register;
30static int iLinkPHTSendData(
struct TransactionContextData *trContext,
unsigned char tCode,
unsigned short int offset_high,
unsigned int offset_low,
unsigned int *payload,
unsigned int nBytes,
char ByteSwap);
32void iLinkInitPHT(
void)
35 iLinkDMACRegs[0].chcr = iLinkDMACRegs[2].chcr = 0;
37 ILINKRegisterBase->PHT_ctrl_ST_R0 = PHT_CTRL_ST_PHTRst;
38 ILINKRegisterBase->PHT_ctrl_ST_R1 = PHT_CTRL_ST_PHTRst;
40 while ((ILINKRegisterBase->PHT_ctrl_ST_R0 & PHT_CTRL_ST_PHTRst) || (ILINKRegisterBase->PHT_ctrl_ST_R1 & PHT_CTRL_ST_PHTRst)) {};
42 ILINKRegisterBase->dmar = 0x00000020;
43 ILINKRegisterBase->PHT_ctrl_ST_R1 = PHT_CTRL_ST_EnDMAS | PHT_CTRL_ST_IHdr;
44 ILINKRegisterBase->PHT_ctrl_ST_R0 = 0;
46 ILINKRegisterBase->STRxNIDSel0_R1 = ILINKRegisterBase->STRxNIDSel1_R1 = 0xFFFFFFFF;
47 ILINKRegisterBase->STRxNIDSel0_R0 = ILINKRegisterBase->STRxNIDSel1_R0 = 0;
49 iLinkDMACRegs[0].slice = iLinkDMACRegs[2].slice = 0x400;
52 iLinkDMACRegs[0].DmarReadStart = iLinkDMACRegs[2].DmarReadStart = iLinkDMARRegs->DmarWriteStart = 0x00000800;
53 iLinkDMACRegs[0].DmarReadEnd = iLinkDMACRegs[2].DmarReadEnd = iLinkDMARRegs->DmarWriteEnd = 0x00200000;
55 ILINKRegisterBase->dmaTransTRSH0 = 0x03FF0000;
56 ILINKRegisterBase->dmaTransTRSH1 = 0x000F03FF;
57 ILINKRegisterBase->dmaCtrlSR0 = ILINKRegisterBase->dmaCtrlSR1 = iLinkDMA_CTRL_SR_LFirst | iLinkDMA_CTRL_SR_DWidth(2) | iLinkDMA_CTRL_SR_DEn | iLinkDMA_CTRL_SR_RActl;
59 ILINKRegisterBase->PHT_split_TO_R1 = ILINKRegisterBase->PHT_split_TO_R0 = 0x00000800;
62static int iLinkPHTSendData(
struct TransactionContextData *trContext,
unsigned char tCode,
unsigned short int offset_high,
unsigned int offset_low,
unsigned int *payload,
unsigned int nBytes,
char ByteSwap)
65 unsigned int PHT_ctrl_ST_R0_flags;
69 if (trContext->GenerationNumber != GenerationNumber)
72 ClearEventFlag(IntrEventFlag, ~(iLinkEventDMATransEnd | iLinkEventError));
74 PHT_ctrl_ST_R0_flags = (tCode == IEEE1394_TCODE_WRITEB) ? PHT_CTRL_ST_EPCNT | PHT_CTRL_ST_EWREQ : PHT_CTRL_ST_EPCNT | PHT_CTRL_ST_ERREQ;
77 ILINKRegisterBase->PHT_ReqResHdr0_R0 = (((
unsigned int)trContext->NodeID) << 16) | offset_high;
78 ILINKRegisterBase->PHT_ReqResHdr1_R0 = offset_low;
79 ILINKRegisterBase->PHT_ReqResHdr2_R0 = (((
unsigned int)tLabel) << 19) | (((
unsigned int)trContext->speed) << 16) | nBytes;
81 ILINKRegisterBase->DTransCTRL0 = 1;
82 ILINKRegisterBase->PHT_ctrl_ST_R0 |= PHT_ctrl_ST_R0_flags;
84 iLinkDMACRegs[0].madr = (
unsigned int)payload;
85 iLinkDMACRegs[0].dlen = nBytes;
88 DEBUG_PRINTF(
"Waiting for interrupt...\n");
89 WaitEventFlag(IntrEventFlag, iLinkEventDMATransEnd | iLinkEventError, WEF_OR, NULL);
91 ILINKRegisterBase->PHT_ctrl_ST_R0 &= (~PHT_ctrl_ST_R0_flags);
93 DEBUG_PRINTF(
"Processing results...\n");
95 if (LocalCachedIntr0Register & iLink_INTR0_InvAck)
97 if (LocalCachedIntr0Register & iLink_INTR0_STO)
99 if (LocalCachedIntr0Register & iLink_INTR0_AckMiss)
101 if (LocalCachedIntr0Register & iLink_INTR0_RetEx)
108int iLinkReadPHTReq(
struct TransactionContextData *trContext,
unsigned short int offset_high,
unsigned int offset_low,
void *buffer,
unsigned int nBytes)
110 DEBUG_PRINTF(
"iLinkReadPHTReq() 0x%08x 0x%08x; nbytes: 0x%08x. Node: 0x%04x.\n", offset_high, offset_low, nBytes, trContext->NodeID);
112 TargetBuffer = buffer;
114 return (iLinkPHTSendData(trContext, IEEE1394_TCODE_READB, offset_high, offset_low, NULL, nBytes, 0));
118int iLinkWritePHTReq(
struct TransactionContextData *trContext,
unsigned short int offset_high,
unsigned int offset_low,
void *buffer,
unsigned int nBytes)
120 DEBUG_PRINTF(
"iLinkWritePHTReq() 0x%08x 0x%08x; nbytes: 0x%08x. Node: 0x%04x.\n", offset_high, offset_low, nBytes, trContext->NodeID);
122 return (iLinkPHTSendData(trContext, IEEE1394_TCODE_WRITEB, offset_high, offset_low, buffer, nBytes, 1));