Revision 73a511de hw/etraxfs_dma.c
b/hw/etraxfs_dma.c | ||
---|---|---|
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)); |
Also available in: Unified diff