401 |
401 |
uint32_t saved_data_buf;
|
402 |
402 |
unsigned char buf[2 * 1024];
|
403 |
403 |
|
|
404 |
struct dma_context_metadata meta;
|
|
405 |
bool send_context = true;
|
|
406 |
|
404 |
407 |
if (ctrl->channels[c].eol)
|
405 |
408 |
return 0;
|
406 |
409 |
|
407 |
410 |
do {
|
|
411 |
bool out_eop;
|
408 |
412 |
D(printf("ch=%d buf=%x after=%x\n",
|
409 |
413 |
c,
|
410 |
414 |
(uint32_t)ctrl->channels[c].current_d.buf,
|
411 |
415 |
(uint32_t)ctrl->channels[c].current_d.after));
|
412 |
416 |
|
|
417 |
if (send_context) {
|
|
418 |
if (ctrl->channels[c].client->client.metadata_push) {
|
|
419 |
meta.metadata = ctrl->channels[c].current_d.md;
|
|
420 |
ctrl->channels[c].client->client.metadata_push(
|
|
421 |
ctrl->channels[c].client->client.opaque,
|
|
422 |
&meta);
|
|
423 |
}
|
|
424 |
send_context = false;
|
|
425 |
}
|
|
426 |
|
413 |
427 |
channel_load_d(ctrl, c);
|
414 |
428 |
saved_data_buf = channel_reg(ctrl, c, RW_SAVED_DATA_BUF);
|
415 |
429 |
len = (uint32_t)(unsigned long)
|
... | ... | |
420 |
434 |
len = sizeof buf;
|
421 |
435 |
cpu_physical_memory_read (saved_data_buf, buf, len);
|
422 |
436 |
|
423 |
|
D(printf("channel %d pushes %x %u bytes\n", c,
|
424 |
|
saved_data_buf, len));
|
|
437 |
out_eop = ((saved_data_buf + len) ==
|
|
438 |
ctrl->channels[c].current_d.after) &&
|
|
439 |
ctrl->channels[c].current_d.out_eop;
|
|
440 |
|
|
441 |
D(printf("channel %d pushes %x %u bytes eop=%u\n", c,
|
|
442 |
saved_data_buf, len, out_eop));
|
425 |
443 |
|
426 |
444 |
if (ctrl->channels[c].client->client.push)
|
427 |
445 |
ctrl->channels[c].client->client.push(
|
428 |
446 |
ctrl->channels[c].client->client.opaque,
|
429 |
|
buf, len);
|
|
447 |
buf, len, out_eop);
|
430 |
448 |
else
|
431 |
449 |
printf("WARNING: DMA ch%d dataloss,"
|
432 |
450 |
" no attached client.\n", c);
|
... | ... | |
437 |
455 |
ctrl->channels[c].current_d.after) {
|
438 |
456 |
/* Done. Step to next. */
|
439 |
457 |
if (ctrl->channels[c].current_d.out_eop) {
|
440 |
|
/* TODO: signal eop to the client. */
|
441 |
|
D(printf("signal eop\n"));
|
|
458 |
send_context = true;
|
442 |
459 |
}
|
443 |
460 |
if (ctrl->channels[c].current_d.intr) {
|
444 |
|
/* TODO: signal eop to the client. */
|
445 |
461 |
/* data intr. */
|
446 |
462 |
D(printf("signal intr %d eol=%d\n",
|
447 |
463 |
len, ctrl->channels[c].current_d.eol));
|