40 #define SDMA_DESCQ_SZ PAGE_SIZE
63 static void vl15_watchdog_timeout(
unsigned long opaque)
68 ipath_dbg(
"vl15 watchdog timeout - clearing\n");
73 "condition already cleared\n");
87 addr = (desc[1] << 32) | (desc[0] >> 32);
88 len = (desc[0] >> 14) & (0x7ffULL << 2);
115 dmahead = (
u16)ipath_read_kreg32(dd, dd->
ipath_kregs->kr_senddmahead);
137 vl15_watchdog_deq(dd);
164 list_del_init(&txp->
list);
177 INIT_LIST_HEAD(&list);
185 ipath_sdma_notify(dd, &list);
197 static void sdma_notify_task(
unsigned long opaque)
202 sdma_notify_taskbody(dd);
209 reg = ipath_read_kreg64(dd, dd->
ipath_kregs->kr_senddmastatus);
212 reg = ipath_read_kreg64(dd, dd->
ipath_kregs->kr_sendctrl);
215 reg = ipath_read_kreg64(dd, dd->
ipath_kregs->kr_senddmabufmask0);
218 reg = ipath_read_kreg64(dd, dd->
ipath_kregs->kr_senddmabufmask1);
221 reg = ipath_read_kreg64(dd, dd->
ipath_kregs->kr_senddmabufmask2);
224 reg = ipath_read_kreg64(dd, dd->
ipath_kregs->kr_senddmatail);
227 reg = ipath_read_kreg64(dd, dd->
ipath_kregs->kr_senddmahead);
231 static void sdma_abort_task(
unsigned long opaque)
251 goto resched_noprint;
253 ipath_dbg(
"give up waiting for SDMADISABLED intr\n");
264 hwstatus = ipath_read_kreg64(dd,
277 "status after SDMA reset, continuing\n");
286 vl15_watchdog_deq(dd);
301 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmalengen,
322 ipath_read_kreg64(dd, dd->
ipath_kregs->kr_scratch);
345 ipath_dbg(
"looping with status 0x%08lx\n",
397 ipath_dev_err(dd,
"failed to allocate SendDMA head memory\n");
424 u64 senddmabufmask[3] = { 0 };
427 ret = alloc_sdma(dd);
450 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmabase,
455 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmalengen, tmp64);
457 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmatail,
460 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmaheadaddr,
471 unsigned word = i / 64;
472 unsigned bit = i & 63;
474 senddmabufmask[
word] |= 1ULL <<
bit;
476 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmabufmask0,
478 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmabufmask1,
480 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmabufmask2,
488 tasklet_init(&dd->ipath_sdma_abort_task, sdma_abort_task,
499 ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl, dd->ipath_sendctrl);
500 ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch);
502 spin_unlock_irqrestore(&dd->ipath_sendctrl_lock, flags);
514 void *sdma_descq =
NULL;
515 void *sdma_head_dma =
NULL;
531 ipath_read_kreg64(dd, dd->
ipath_kregs->kr_scratch);
540 vl15_watchdog_deq(dd);
545 sdma_notify_taskbody(dd);
553 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmabase, 0);
554 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmalengen, 0);
555 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmatail, 0);
556 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmaheadaddr, 0);
557 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmabufmask0, 0);
558 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmabufmask1, 0);
559 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmabufmask2, 0);
579 sdma_head_dma, sdma_head_phys);
583 sdma_descq, sdma_descq_phys);
615 ipath_dbg(
"invalid attempt to restart SDMA, status 0x%08lx\n",
626 ipath_read_kreg64(dd, dd->
ipath_kregs->kr_scratch);
629 ipath_read_kreg64(dd, dd->
ipath_kregs->kr_scratch);
644 sdmadesc[1] = addr >> 32;
646 sdmadesc[0] = (addr & 0xfffffffcULL) << 32;
650 sdmadesc[0] |= (dwlen & 0x7ffULL) << 16;
652 sdmadesc[0] |= dwoffset & 0x7ffULL;
679 ipath_dbg(
"packet size %X > ibmax %X, fail\n",
693 if (tx->
txreq.sg_count > ipath_sdma_descq_freecnt(dd)) {
706 make_sdma_desc(dd, sdmadesc, (
u64) addr, dwoffset, 0);
709 sdmadesc[0] |= 1ULL << 12;
711 sdmadesc[0] |= 1ULL << 14;
745 make_sdma_desc(dd, sdmadesc, (
u64) addr, dw, dwoffset);
748 sdmadesc[0] |= 1ULL << 14;
767 if (++sge->
m >= sge->
mr->mapsz)
772 sge->
mr->map[sge->
m]->segs[sge->
n].vaddr;
774 sge->
mr->map[sge->
m]->segs[sge->
n].length;
793 ipath_write_kreg(dd, dd->
ipath_kregs->kr_senddmatail, tail);
801 vl15_watchdog_enq(dd);
810 unmap_desc(dd, tail);