|
| From: | Zhi Hui Li |
| Subject: | Re: [Qemu-devel] [PATCH 1/2 v5-test] add function DMA_set_return and DMA_set_channel_async in dma.c |
| Date: | Fri, 20 Apr 2012 10:36:13 +0800 |
| User-agent: | Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.28) Gecko/20120313 Thunderbird/3.1.20 |
+ +void DMA_set_return(int nret, int nchan) +{ + struct dma_regs *r; + struct dma_cont *d; + int icont, ichan; + + icont = nchan> 3; + ichan = nchan& 3; + d = dma_controllers; + r =&d[icont].regs[ichan]; + r->now[COUNT] = nret; + assert(r->channel_is_asynchronous); + assert(r->channel_running);Thanks, this is very much like what I had in mind, except that here I would have called DMA_run. Also you can then remove the bottom half (and rearm logic) completely. If calling DMA_run is not working, perhaps it is because you didn't remove the bottom half.
You have written to me :
assert(channel_is_asynchronous[ichan]);
assert(channel_running[ichan] == 1);
channel_running[ichan]--;
if ((0 == (d->mask & mask)) && (0 != (d->status & (mask << 4)))) {
channel_run (icont, ichan);
}
If I add the code :
if ((0 == (d->mask & mask)) && (0 != (d->status & (mask << 4)))) {
channel_run (icont, ichan);
}
Because function DMA_set_return is called in fdctrl_read_DMA_cb and
fdctrl_write_DMA_cb, the fdctrl_stop_transfer will release the channel,
but fdctrl_stop_transfer is after the DMA_set_return, so the channel_run
will run again, so here I delete the above code.
I would hope that you can also change the "if (running) goto out;" to an "assert(!running)", but I'm not so sure.
sorry, here I don't understand well,or you can explain in detail. :) Thank you very much for your feedback! :)
| [Prev in Thread] | Current Thread | [Next in Thread] |