On Tue, Sep 29, 2020 at 01:10:12PM +0000, Sherry Sun wrote: > > > if (!offset) { > > > - *pa = virt_to_phys(vpdev->hw_ops->get_dp(vpdev)); > > > + if (vpdev->hw_ops->get_dp_dma) > > > + *pa = vpdev->hw_ops->get_dp_dma(vpdev); > > > + else { > > > + dev_err(vop_dev(vdev), "can't get device page > > physical address\n"); > > > + return -EINVAL; > > > + } > > > > I don't think we need the NULL check here. Wouldn't it also make sense to > > return the virtual and DMA address from ->get_dp instead of adding another > > method? > > Do you mean that we should only change the original ->get_dp callback to return virtual > and DMA address at the same time, instead of adding the ->get_dp_dma callback? That was my intention when writing it, yes. But it seems like most other callers don't care. Maybe move the invocation of dma_mmap_coherent into a new ->mmap helper, that way it seems like the calling code doesn't need to know about the dma_addr_t at all. That being said the layering in the code keeps puzzling me. As far as I can tell only a single instance of struct vop_driver even exists, so we might be able to kill all the indirections entirely.