On Sun, Mar 02, 2025 at 05:12:07PM +0800, Jason Chien wrote: > This commit adds the BDF to the memory attributes for DMA operations. > > Signed-off-by: Jason Chien <jason.ch...@sifive.com> > --- > include/hw/pci/pci_device.h | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/include/hw/pci/pci_device.h b/include/hw/pci/pci_device.h > index add208edfa..968f1ba3e9 100644 > --- a/include/hw/pci/pci_device.h > +++ b/include/hw/pci/pci_device.h > @@ -244,6 +244,8 @@ static inline MemTxResult pci_dma_rw(PCIDevice *dev, > dma_addr_t addr, > void *buf, dma_addr_t len, > DMADirection dir, MemTxAttrs attrs) > { > + attrs.unspecified = 0; > + attrs.requester_id = pci_requester_id(dev); > return dma_memory_rw(pci_get_address_space(dev), addr, buf, len, > dir, attrs); > } > @@ -292,6 +294,8 @@ static inline MemTxResult pci_dma_write(PCIDevice *dev, > dma_addr_t addr, > uint##_bits##_t *val, \ > MemTxAttrs attrs) \ > { \ > + attrs.unspecified = 0; \ > + attrs.requester_id = pci_requester_id(dev); \ > return ld##_l##_dma(pci_get_address_space(dev), addr, val, attrs); \ > } \ > static inline MemTxResult st##_s##_pci_dma(PCIDevice *dev, \ > @@ -299,6 +303,8 @@ static inline MemTxResult pci_dma_write(PCIDevice *dev, > dma_addr_t addr, > uint##_bits##_t val, \ > MemTxAttrs attrs) \ > { \ > + attrs.unspecified = 0; \ > + attrs.requester_id = pci_requester_id(dev); \ > return st##_s##_dma(pci_get_address_space(dev), addr, val, attrs); \ > } > > @@ -327,8 +333,8 @@ PCI_DMA_DEFINE_LDST(q_be, q_be, 64); > static inline void *pci_dma_map(PCIDevice *dev, dma_addr_t addr, > dma_addr_t *plen, DMADirection dir) > { > - return dma_memory_map(pci_get_address_space(dev), addr, plen, dir, > - MEMTXATTRS_UNSPECIFIED); > + MemTxAttrs attrs = {.requester_id = pci_requester_id(dev)}; > + return dma_memory_map(pci_get_address_space(dev), addr, plen, dir, > attrs); > }
Map is the only issue - bdf can technically change between map and unmap. The use in hw/net/net_tx_pkt.c is fine as it's under BQL. I don't know about the use in megasas though. I think it is probably fine as it seems to deal with commands and I think any driver would flush these if changing BDF. Cc megasas maintainers just to make sure though. Also, adding a code comment here can't hurt. > static inline void pci_dma_unmap(PCIDevice *dev, void *buffer, dma_addr_t > len, > -- > 2.43.2