Message ID | 20210428082133.6766-1-lingshan.zhu@intel.com |
---|---|
Headers | show |
Series | vDPA/ifcvf: implement doorbell mapping feature | expand |
在 2021/4/28 下午4:21, Zhu Lingshan 写道: > This commit records virtio notify base addr to implemente > doorbell mapping feature > > Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com> > --- > drivers/vdpa/ifcvf/ifcvf_base.c | 1 + > drivers/vdpa/ifcvf/ifcvf_base.h | 1 + > 2 files changed, 2 insertions(+) > > diff --git a/drivers/vdpa/ifcvf/ifcvf_base.c b/drivers/vdpa/ifcvf/ifcvf_base.c > index 1a661ab45af5..cc61a5bfc5b1 100644 > --- a/drivers/vdpa/ifcvf/ifcvf_base.c > +++ b/drivers/vdpa/ifcvf/ifcvf_base.c > @@ -133,6 +133,7 @@ int ifcvf_init_hw(struct ifcvf_hw *hw, struct pci_dev *pdev) > &hw->notify_off_multiplier); > hw->notify_bar = cap.bar; > hw->notify_base = get_cap_addr(hw, &cap); > + hw->notify_pa = pci_resource_start(pdev, cap.bar) + cap.offset; To be more generic and avoid future changes, let's use the math defined in the virtio spec. You may refer how it is implemented in virtio_pci vdpa driver[1]. Thanks [1] https://lore.kernel.org/virtualization/20210415073147.19331-5-jasowang@redhat.com/T/ > IFCVF_DBG(pdev, "hw->notify_base = %p\n", > hw->notify_base); > break; > diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h > index 0111bfdeb342..bcca7c1669dd 100644 > --- a/drivers/vdpa/ifcvf/ifcvf_base.h > +++ b/drivers/vdpa/ifcvf/ifcvf_base.h > @@ -98,6 +98,7 @@ struct ifcvf_hw { > char config_msix_name[256]; > struct vdpa_callback config_cb; > unsigned int config_irq; > + phys_addr_t notify_pa; > }; > > struct ifcvf_adapter {
On 4/28/2021 6:09 PM, Jason Wang wrote: > > 在 2021/4/28 下午6:00, Zhu, Lingshan 写道: >> >> >> On 4/28/2021 4:39 PM, Jason Wang wrote: >>> >>> 在 2021/4/28 下午4:21, Zhu Lingshan 写道: >>>> This commit records virtio notify base addr to implemente >>>> doorbell mapping feature >>>> >>>> Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com> >>>> --- >>>> drivers/vdpa/ifcvf/ifcvf_base.c | 1 + >>>> drivers/vdpa/ifcvf/ifcvf_base.h | 1 + >>>> 2 files changed, 2 insertions(+) >>>> >>>> diff --git a/drivers/vdpa/ifcvf/ifcvf_base.c >>>> b/drivers/vdpa/ifcvf/ifcvf_base.c >>>> index 1a661ab45af5..cc61a5bfc5b1 100644 >>>> --- a/drivers/vdpa/ifcvf/ifcvf_base.c >>>> +++ b/drivers/vdpa/ifcvf/ifcvf_base.c >>>> @@ -133,6 +133,7 @@ int ifcvf_init_hw(struct ifcvf_hw *hw, struct >>>> pci_dev *pdev) >>>> &hw->notify_off_multiplier); >>>> hw->notify_bar = cap.bar; >>>> hw->notify_base = get_cap_addr(hw, &cap); >>>> + hw->notify_pa = pci_resource_start(pdev, cap.bar) + >>>> cap.offset; >>> >>> >>> To be more generic and avoid future changes, let's use the math >>> defined in the virtio spec. >>> >>> You may refer how it is implemented in virtio_pci vdpa driver[1]. >> Are you suggesting every vq keep its own notify_pa? In this case, we >> still need to record notify_pa in hw when init_hw, then initialize >> vq->notify_pa accrediting to hw->notify_pa. > > > I meant you need to follow how virtio spec did to calculate the > doorbell address per vq: > > cap.offset + queue_notify_off * notify_off_multiplier > > Obviously, you ignore queue_notify_off and notify_off_multiplier here. > This may bring troubles for the existing device IFCVF and future devices. > > If I understand correctly, this device can be probed by virtio-pci > driver which use the above math. There's no reason for using ad-hoc hack. sure, when talking about initialize vq->notify_pa, I mean calculate with with notify_base and multiplier, V2 will include this. Thanks, Zhu Lingshan > > Thanks > > >> >> Thanks >> Zhu Lingshan >>> >>> Thanks >>> >>> [1] >>> https://lore.kernel.org/virtualization/20210415073147.19331-5-jasowang@redhat.com/T/ >>> >>> >>>> IFCVF_DBG(pdev, "hw->notify_base = %p\n", >>>> hw->notify_base); >>>> break; >>>> diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h >>>> b/drivers/vdpa/ifcvf/ifcvf_base.h >>>> index 0111bfdeb342..bcca7c1669dd 100644 >>>> --- a/drivers/vdpa/ifcvf/ifcvf_base.h >>>> +++ b/drivers/vdpa/ifcvf/ifcvf_base.h >>>> @@ -98,6 +98,7 @@ struct ifcvf_hw { >>>> char config_msix_name[256]; >>>> struct vdpa_callback config_cb; >>>> unsigned int config_irq; >>>> + phys_addr_t notify_pa; >>>> }; >>>> struct ifcvf_adapter { >>> >> >