21 static u32 dma_chcr[10] = { 0x10008000, 0x10009000, 0x1000A000, 0x1000B000, 0x1000B400, 0x1000C000, 0x1000C400, 0x1000C800, 0x1000D000, 0x1000D400 };
23 static u32 dma_qwc[10] = { 0x10008020, 0x10009020, 0x1000A020, 0x1000B020, 0x1000B420, 0x1000C020, 0x1000C420, 0x1000C820, 0x1000D020, 0x1000D420 };
25 static u32 dma_madr[10] = { 0x10008010, 0x10009010, 0x1000A010, 0x1000B010, 0x1000B410, 0x1000C010, 0x1000C410, 0x1000C810, 0x1000D010, 0x1000D410 };
27 static u32 dma_tadr[10] = { 0x10008030, 0x10009030, 0x1000A030, 0x1000B030, 0x1000B430, 0x1000C030, 0x1000C430, 0x1000C830, 0x1000D030, 0x1000D430 };
29 static u32 dma_asr0[10] = { 0x10008040, 0x10009040, 0x1000A040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 };
31 static u32 dma_asr1[10] = { 0x10008050, 0x10009050, 0x1000A050, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 };
33 static u32 dma_sadr[10] = { 0x10008080, 0x10009080, 0x1000A080, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1000D080, 0x1000D480 };
35 static int dma_handler_id[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
37 static int dma_channel_initialized[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
45 for(i = 0; i < 10; i++)
68 if (dma_asr0[channel])
70 *(vu32 *)dma_asr0[channel] = 0;
71 *(vu32 *)dma_asr1[channel] = 0;
75 if (dma_sadr[channel])
77 *(vu32 *)dma_sadr[channel] = 0;
85 dma_handler_id[channel] = AddDmacHandler(channel, handler, 0);
88 if (flags & DMA_FLAG_INTERRUPTSAFE)
100 dma_channel_initialized[channel] = 1;
120 __asm__ __volatile__ (
135 while (*((vu32 *)dma_chcr[channel]) & 0x00000100)
162 if (packet2->
mode == P2_MODE_CHAIN)
169 (
void *)((u32)packet2->base & 0x0FFFFFFF),
171 packet2->
tte ? DMA_FLAG_TRANSFERTAG : 0,
178 (
void *)((u32)packet2->base & 0x0FFFFFFF),
179 ((u32)packet2->
next - (u32)packet2->base) >> 4,
192 if (flags & DMA_FLAG_INTERRUPTSAFE)
194 iSyncDCache(data, (
void *)((u8 *)data + (data_size<<4)));
198 SyncDCache(data, (
void *)((u8 *)data + (data_size<<4)));
202 *(vu32 *)dma_qwc[channel] = DMA_SET_QWC(0);
205 *(vu32 *)dma_madr[channel] = DMA_SET_MADR(0, 0);
208 *(vu32 *)dma_tadr[channel] = DMA_SET_TADR((u32)data, spr);
211 *(vu32 *)dma_chcr[channel] =
DMA_SET_CHCR(1, 1, 0, flags & DMA_FLAG_TRANSFERTAG, 1, 1, 0);
225 *(vu32 *)dma_qwc[channel] = DMA_SET_QWC(0);
228 *(vu32 *)dma_madr[channel] = DMA_SET_MADR(0, 0);
231 *(vu32 *)dma_tadr[channel] = DMA_SET_TADR((u32)data - 0x30000000, 0);
234 *(vu32 *)dma_chcr[channel] =
DMA_SET_CHCR(1, 1, 0, flags & DMA_FLAG_TRANSFERTAG, 1, 1, 0);
248 if (flags & DMA_FLAG_INTERRUPTSAFE)
250 iSyncDCache(data, (
void *)((u8 *)data + (qwc<<4)));
254 SyncDCache(data, (
void *)((u8 *)data + (qwc<<4)));
258 *(vu32 *)dma_qwc[channel] = DMA_SET_QWC(qwc);
261 *(vu32 *)dma_madr[channel] = DMA_SET_MADR((u32)data, spr);
264 *(vu32 *)dma_chcr[channel] =
DMA_SET_CHCR(1, 0, 0, flags & DMA_FLAG_TRANSFERTAG, 1, 1, 0);
277 if (flags & DMA_FLAG_INTERRUPTSAFE)
279 iSyncDCache(data, (
void *)((u8 *)data + (qwc<<4)));
283 SyncDCache(data, (
void *)((u8 *)data + (qwc<<4)));
287 *(vu32 *)dma_qwc[channel] = DMA_SET_QWC(qwc);
290 *(vu32 *)dma_madr[channel] = DMA_SET_MADR((u32)data - 0x30000000, 0);
293 *(vu32 *)dma_chcr[channel] =
DMA_SET_CHCR(1, 0, 0, flags & DMA_FLAG_TRANSFERTAG, 1, 1, 0);
303 if (dma_channel_initialized[channel] < 0)
315 *(vu32 *)dma_qwc[channel] = DMA_SET_QWC((data_size + 15) >> 4);
318 *(vu32 *)dma_madr[channel] = DMA_SET_MADR((u32)data, spr);
321 *(vu32 *)dma_chcr[channel] =
DMA_SET_CHCR(0, 1, 0, 0, 0, 1, 0);
332 if (dma_channel_initialized[channel] < 0)
344 *(vu32 *)dma_qwc[channel] = DMA_SET_QWC((data_size + 15) >> 4);
347 *(vu32 *)dma_madr[channel] = DMA_SET_MADR((u32)data, spr);
350 *(vu32 *)dma_chcr[channel] =
DMA_SET_CHCR(0, 0, 0, 0, 0, 1, 0);
361 if (dma_channel_initialized[channel] < 0)
367 if (dma_handler_id[channel] != 0)
371 if (flags & DMA_FLAG_INTERRUPTSAFE)
373 iDisableDmac(channel);
377 DisableDmac(channel);
381 RemoveDmacHandler(channel, dma_handler_id[channel]);
384 dma_handler_id[channel] = 0;
389 dma_channel_initialized[channel] = 0;