On 07/22/15 13:30, Andrew Jones wrote:
> On Tue, Jul 21, 2015 at 09:44:49PM +0200, Laszlo Ersek wrote:
>> On 07/21/15 18:03, Marc Marí wrote:
>>> +static void fw_cfg_dma_transfer(FWCfgState *s)
>>> +{
>>> + dma_addr_t len;
>>> + uint8_t *ptr;
>>> + uint32_t i;
>>> +
>>> + if (s->dma_ctl & FW_CFG_DMA_CTL_ERROR) {
>>> + return;
>>> + }
>>> + if (!(s->dma_ctl & FW_CFG_DMA_CTL_READ)) {
>>> + return;
>>> + }
>>> +
>>> + while (s->dma_len > 0) {
>>> + len = s->dma_len;
>>> + ptr = dma_memory_map(s->dma_as, s->dma_addr, &len,
>>> + DMA_DIRECTION_FROM_DEVICE);
>>> + if (!ptr || !len) {
>>> + s->dma_ctl |= FW_CFG_DMA_CTL_ERROR;
>>> + return;
>>> + }
>>> +
>>> + for (i = 0; i < len; i++) {
>>> + ptr[i] = fw_cfg_read(s);
>>> + }
>>> +
>>> + s->dma_addr += i;
>>> + s->dma_len -= i;
>>> + dma_memory_unmap(s->dma_as, ptr, len,
>>> + DMA_DIRECTION_FROM_DEVICE, i);
>>> + }
>>> + s->dma_ctl = 0;
>>> +}
>>
>> On Aarch64 KVM, is this going to show the same cache coherence problems
>> as VGA memory access?
>>
>
> Does the guest (AAVMF) need to map all regions it DMAs to/from as
> noncacheable? If so, then yes. If not, then I don't think it should
> map fw-cfg DMA regions that way. fw-cfg is a paravirt device, so I
> don't think we should have to treat it like a real one.
I'd just point the address registers (or the address fields in the
descriptor structure) to a block of normal guest RAM, before flipping
the appropriate bit in the MMIO register that actually fires off the
transfer.
... Seems like that should work, then. Thanks!
Laszlo