On 18/08/18 21:21, Mark Cave-Ayland wrote:

> Hi all,
> 
> As part of testing my OpenBIOS virtio-blk implementation, I've been
> trying to use it under the 40p machine and have some questions related
> to how address spaces are interpreted.
> 
> The 40p PCI address space is aliased onto the CPU physical address space
> with an offset of 0x80000000 i.e.
> 
>    PCI address space 0x80001234 -> CPU address space 0x1234
> 
> For the LSI SCSI controller this just works: when configuring the DMA
> descriptors I write the destination address to the LSI registers in PCI
> address space i.e. 0x80001234. Internally this calls pci_dma_read() and
> pci_dma_write() and the data gets transferred correctly to physical
> address 0x1234.
> 
> When trying to configure a virtio device I'm not seeing the same
> behaviour: firstly it seems that I need to write the CPU address 0x1234
> to VIRTIO_PCI_QUEUE_PFN rather than the PCI address 0x80001234 as I
> would expect.
> 
> Following this I've tried to configure the address in the virtio
> descriptors with both the CPU address and PCI address and neither seems
> to work in my tests here.
> 
> Looking through the virtio code I can't see any references to
> pci_dma_read()/pci_dma_write() so I was wondering if someone can confirm
> whether I should be using CPU or PCI addresses when programming virtio
> registers and descriptors for machines such as 40p, and where I can find
> the address space being used for virtio device reads/writes?

So after quite a lot more searching I think I've finally found the answer:

- Enable VIRTIO_F_IOMMU_PLATFORM feature bit via iommu_platform property
to enable use of iovas in the descriptor rings

- Write the physical address to VIRTIO_PCI_QUEUE_PFN

Does this sound right?


ATB,

Mark.

Reply via email to