This series enabled Intel FGPA SmartNIC C5000X-PL
virtio-net for vDPA.
vDPA requires VIRTIO_F_ACCESS_PLATFORM as a must, this series
verify this feature bit when set features.
Changes from V2:
verify VIRTIO_F_ACCESS_PLATFORM when set features(Jason)
Changes from V1:
remove version number string(Leon)
add new device ids and remove original device ids in
separate patches(Jason)
Zhu Lingshan (6):
vDPA/ifcvf: get_vendor_id returns a device specific vendor id
vDPA/ifcvf: enable Intel C5000X-PL virtio-net for vDPA
vDPA/ifcvf: rename original IFCVF dev ids to N3000 ids
vDPA/ifcvf: remove the version number string
vDPA/ifcvf: fetch device feature bits when probe
vDPA/ifcvf: verify mandatory feature bits for vDPA
drivers/vdpa/ifcvf/ifcvf_base.c | 20 ++++++++++++++++++--
drivers/vdpa/ifcvf/ifcvf_base.h | 16 ++++++++++++----
drivers/vdpa/ifcvf/ifcvf_main.c | 27 ++++++++++++++++++++-------
3 files changed, 50 insertions(+), 13 deletions(-)
--
2.27.0
In this commit, ifcvf_get_vendor_id() will return
a device specific vendor id of the probed pci device
than a hard code.
Signed-off-by: Zhu Lingshan <redacted>
---
drivers/vdpa/ifcvf/ifcvf_main.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
IFCVF driver probes multiple types of devices now,
to distinguish the original device driven by IFCVF
from others, it is renamed as "N3000".
Signed-off-by: Zhu Lingshan <redacted>
---
drivers/vdpa/ifcvf/ifcvf_base.h | 8 ++++----
drivers/vdpa/ifcvf/ifcvf_main.c | 8 ++++----
2 files changed, 8 insertions(+), 8 deletions(-)
This commit removes the version number string, using kernel
version is enough.
Signed-off-by: Zhu Lingshan <redacted>
---
drivers/vdpa/ifcvf/ifcvf_main.c | 2 --
1 file changed, 2 deletions(-)
This commit would read and store device feature
bits when probe.
rename ifcvf_get_features() to ifcvf_get_hw_features(),
it reads and stores features of the probed device.
new ifcvf_get_features() simply returns stored
feature bits.
Signed-off-by: Zhu Lingshan <redacted>
---
drivers/vdpa/ifcvf/ifcvf_base.c | 12 ++++++++++--
drivers/vdpa/ifcvf/ifcvf_base.h | 2 ++
drivers/vdpa/ifcvf/ifcvf_main.c | 2 ++
3 files changed, 14 insertions(+), 2 deletions(-)
From: Leon Romanovsky <leon@kernel.org> Date: 2021-03-10 09:16:49
On Wed, Mar 10, 2021 at 05:00:50PM +0800, Zhu Lingshan wrote:
This commit removes the version number string, using kernel
version is enough.
Signed-off-by: Zhu Lingshan <redacted>
---
drivers/vdpa/ifcvf/ifcvf_main.c | 2 --
1 file changed, 2 deletions(-)
I already added my ROB, but will add again.
Thanks,
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
From: Jason Wang <hidden> Date: 2021-03-11 03:23:45
On 2021/3/10 5:00 下午, Zhu Lingshan wrote:
quoted hunk
In this commit, ifcvf_get_vendor_id() will return
a device specific vendor id of the probed pci device
than a hard code.
Signed-off-by: Zhu Lingshan <redacted>
---
drivers/vdpa/ifcvf/ifcvf_main.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
While at this, I wonder if we can do something similar in
get_device_id() if it could be simple deduced from some simple math from
the pci device id?
Thanks
From: Jason Wang <hidden> Date: 2021-03-11 03:27:01
On 2021/3/10 5:00 下午, Zhu Lingshan wrote:
quoted hunk
IFCVF driver probes multiple types of devices now,
to distinguish the original device driven by IFCVF
from others, it is renamed as "N3000".
Signed-off-by: Zhu Lingshan <redacted>
---
drivers/vdpa/ifcvf/ifcvf_base.h | 8 ++++----
drivers/vdpa/ifcvf/ifcvf_main.c | 8 ++++----
2 files changed, 8 insertions(+), 8 deletions(-)
I am not sure the plan for Intel but I wonder if we can simply use
PCI_ANY_ID for device id here. Otherewise you need to maintain a very
long list of ids here.
Thanks
vdpa_device *vdpa_dev)
static int ifcvf_vdpa_set_features(struct vdpa_device *vdpa_dev,
u64 features)
{
struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev);
+ int ret;
+
+ ret = ifcvf_verify_min_features(vf);
So this validate device features instead of driver which is the one we
really want to check?
Thanks
Hi Jason,
Here we check device feature bits to make sure the device support
ACCESS_PLATFORM. In get_features(),
it will return a intersection of device features bit and driver
supported features bits(which includes ACCESS_PLATFORM).
Other components like QEMU should not set features bits more than this
intersection of bits. so we can make sure if this
ifcvf_verify_min_features() passed, both device and driver support
ACCESS_PLATFORM.
Are you suggesting check driver feature bits in
ifcvf_verify_min_features() in the meantime as well?
Thanks!
quoted
+ if (ret)
+ return ret;
vf->req_features = features;
In this commit, ifcvf_get_vendor_id() will return
a device specific vendor id of the probed pci device
than a hard code.
Signed-off-by: Zhu Lingshan <redacted>
---
drivers/vdpa/ifcvf/ifcvf_main.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c
b/drivers/vdpa/ifcvf/ifcvf_main.c
index fa1af301cf55..e501ee07de17 100644
While at this, I wonder if we can do something similar in
get_device_id() if it could be simple deduced from some simple math
from the pci device id?
Thanks
Hi Jason,
IMHO, this implementation is just some memory read ops, I think other
implementations may not save many cpu cycles, an if cost at least three
cpu cycles.
Thanks!
IFCVF driver probes multiple types of devices now,
to distinguish the original device driven by IFCVF
from others, it is renamed as "N3000".
Signed-off-by: Zhu Lingshan <redacted>
---
drivers/vdpa/ifcvf/ifcvf_base.h | 8 ++++----
drivers/vdpa/ifcvf/ifcvf_main.c | 8 ++++----
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h
b/drivers/vdpa/ifcvf/ifcvf_base.h
index 75d9a8052039..794d1505d857 100644
I am not sure the plan for Intel but I wonder if we can simply use
PCI_ANY_ID for device id here. Otherewise you need to maintain a very
long list of ids here.
Thanks
Hi Jason,
Thanks! but maybe if we present a very simple and clear list like what
e1000 does can help the users understand what we support easily.
Thanks!
From: Jason Wang <hidden> Date: 2021-03-11 06:14:37
On 2021/3/11 12:21 下午, Zhu Lingshan wrote:
On 3/11/2021 11:23 AM, Jason Wang wrote:
quoted
On 2021/3/10 5:00 下午, Zhu Lingshan wrote:
quoted
In this commit, ifcvf_get_vendor_id() will return
a device specific vendor id of the probed pci device
than a hard code.
Signed-off-by: Zhu Lingshan <redacted>
---
drivers/vdpa/ifcvf/ifcvf_main.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c
b/drivers/vdpa/ifcvf/ifcvf_main.c
index fa1af301cf55..e501ee07de17 100644
While at this, I wonder if we can do something similar in
get_device_id() if it could be simple deduced from some simple math
from the pci device id?
Thanks
Hi Jason,
IMHO, this implementation is just some memory read ops, I think other
implementations may not save many cpu cycles, an if cost at least
three cpu cycles.
Thanks!
Well, I meant whehter you can deduce virtio device id from
pdev->subsystem_device.
Thanks
From: Jason Wang <hidden> Date: 2021-03-11 06:15:41
On 2021/3/11 12:23 下午, Zhu Lingshan wrote:
On 3/11/2021 11:25 AM, Jason Wang wrote:
quoted
On 2021/3/10 5:00 下午, Zhu Lingshan wrote:
quoted
IFCVF driver probes multiple types of devices now,
to distinguish the original device driven by IFCVF
from others, it is renamed as "N3000".
Signed-off-by: Zhu Lingshan <redacted>
---
drivers/vdpa/ifcvf/ifcvf_base.h | 8 ++++----
drivers/vdpa/ifcvf/ifcvf_main.c | 8 ++++----
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h
b/drivers/vdpa/ifcvf/ifcvf_base.h
index 75d9a8052039..794d1505d857 100644
I am not sure the plan for Intel but I wonder if we can simply use
PCI_ANY_ID for device id here. Otherewise you need to maintain a very
long list of ids here.
Thanks
Hi Jason,
Thanks! but maybe if we present a very simple and clear list like what
e1000 does can help the users understand what we support easily.
Thanks!
vdpa_device *vdpa_dev)
static int ifcvf_vdpa_set_features(struct vdpa_device *vdpa_dev,
u64 features)
{
struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev);
+ int ret;
+
+ ret = ifcvf_verify_min_features(vf);
So this validate device features instead of driver which is the one
we really want to check?
Thanks
Hi Jason,
Here we check device feature bits to make sure the device support
ACCESS_PLATFORM.
If you want to check device features, you need to do that during probe()
and fail the probing if without the feature. But I think you won't ship
cards without ACCESS_PLATFORM.
In get_features(),
it will return a intersection of device features bit and driver
supported features bits(which includes ACCESS_PLATFORM).
Other components like QEMU should not set features bits more than this
intersection of bits. so we can make sure if this
ifcvf_verify_min_features() passed, both device and driver support
ACCESS_PLATFORM.
Are you suggesting check driver feature bits in
ifcvf_verify_min_features() in the meantime as well?
So it really depends on your hardware. If you hardware can always offer
ACCESS_PLATFORM, you just need to check driver features. This is how
vdpa_sim and mlx5_vdpa work.
Thanks
Thanks!
quoted
quoted
+ if (ret)
+ return ret;
vf->req_features = features;
vdpa_device *vdpa_dev)
static int ifcvf_vdpa_set_features(struct vdpa_device *vdpa_dev,
u64 features)
{
struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev);
+ int ret;
+
+ ret = ifcvf_verify_min_features(vf);
So this validate device features instead of driver which is the one
we really want to check?
Thanks
Hi Jason,
Here we check device feature bits to make sure the device support
ACCESS_PLATFORM.
If you want to check device features, you need to do that during
probe() and fail the probing if without the feature. But I think you
won't ship cards without ACCESS_PLATFORM.
Yes, there are no reasons ship a card without ACCESS_PLATFORM
quoted
In get_features(),
it will return a intersection of device features bit and driver
supported features bits(which includes ACCESS_PLATFORM).
Other components like QEMU should not set features bits more than
this intersection of bits. so we can make sure if this
ifcvf_verify_min_features() passed, both device and driver support
ACCESS_PLATFORM.
Are you suggesting check driver feature bits in
ifcvf_verify_min_features() in the meantime as well?
So it really depends on your hardware. If you hardware can always
offer ACCESS_PLATFORM, you just need to check driver features. This is
how vdpa_sim and mlx5_vdpa work.
Yes, we always support ACCESS_PLATFORM, so it is hard coded in the macro
IFCVF_SUPPORTED_FEATURES.
Now we check whether device support this feature bit as a double
conformation, are you suggesting we should check whether ACCESS_PLATFORM
& IFCVF_SUPPORTED_FEATURES
in set_features() as well? I prefer check both device and
IFCVF_SUPPORTED_FEATURES both, more reliable.
Thanks!
Thanks
quoted
Thanks!
quoted
quoted
+ if (ret)
+ return ret;
vf->req_features = features;
In this commit, ifcvf_get_vendor_id() will return
a device specific vendor id of the probed pci device
than a hard code.
Signed-off-by: Zhu Lingshan <redacted>
---
drivers/vdpa/ifcvf/ifcvf_main.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c
b/drivers/vdpa/ifcvf/ifcvf_main.c
index fa1af301cf55..e501ee07de17 100644
While at this, I wonder if we can do something similar in
get_device_id() if it could be simple deduced from some simple math
from the pci device id?
Thanks
Hi Jason,
IMHO, this implementation is just some memory read ops, I think other
implementations may not save many cpu cycles, an if cost at least
three cpu cycles.
Thanks!
Well, I meant whehter you can deduce virtio device id from
pdev->subsystem_device.
Thanks
vdpa_device *vdpa_dev)
static int ifcvf_vdpa_set_features(struct vdpa_device *vdpa_dev,
u64 features)
{
struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev);
+ int ret;
+
+ ret = ifcvf_verify_min_features(vf);
So this validate device features instead of driver which is the one
we really want to check?
Thanks
Hi Jason,
Here we check device feature bits to make sure the device support
ACCESS_PLATFORM.
If you want to check device features, you need to do that during
probe() and fail the probing if without the feature. But I think you
won't ship cards without ACCESS_PLATFORM.
Yes, there are no reasons ship a card without ACCESS_PLATFORM
quoted
quoted
In get_features(),
it will return a intersection of device features bit and driver
supported features bits(which includes ACCESS_PLATFORM).
Other components like QEMU should not set features bits more than
this intersection of bits. so we can make sure if this
ifcvf_verify_min_features() passed, both device and driver support
ACCESS_PLATFORM.
Are you suggesting check driver feature bits in
ifcvf_verify_min_features() in the meantime as well?
So it really depends on your hardware. If you hardware can always
offer ACCESS_PLATFORM, you just need to check driver features. This
is how vdpa_sim and mlx5_vdpa work.
Yes, we always support ACCESS_PLATFORM, so it is hard coded in the
macro IFCVF_SUPPORTED_FEATURES.
That's not what I read from the code:
features = ifcvf_get_features(vf) & IFCVF_SUPPORTED_FEATURES;
Now we check whether device support this feature bit as a double
conformation, are you suggesting we should check whether
ACCESS_PLATFORM & IFCVF_SUPPORTED_FEATURES
in set_features() as well?
If we know device will always offer ACCESS_PLATFORM, there's no need to
check it again. What we should check if whether driver set that, and if
it doesn't we need to fail set_features(). I think there's little chance
that IFCVF can work when IOMMU_PLATFORM is not negotiated.
I prefer check both device and IFCVF_SUPPORTED_FEATURES both, more
reliable.
So again, if you want to check device features, set_features() is not
the proper place. We need to fail the probe in this case.
Thanks
Thanks!
quoted
Thanks
quoted
Thanks!
quoted
quoted
+ if (ret)
+ return ret;
vf->req_features = features;
vdpa_device *vdpa_dev)
static int ifcvf_vdpa_set_features(struct vdpa_device
*vdpa_dev, u64 features)
{
struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev);
+ int ret;
+
+ ret = ifcvf_verify_min_features(vf);
So this validate device features instead of driver which is the
one we really want to check?
Thanks
Hi Jason,
Here we check device feature bits to make sure the device support
ACCESS_PLATFORM.
If you want to check device features, you need to do that during
probe() and fail the probing if without the feature. But I think you
won't ship cards without ACCESS_PLATFORM.
Yes, there are no reasons ship a card without ACCESS_PLATFORM
quoted
quoted
In get_features(),
it will return a intersection of device features bit and driver
supported features bits(which includes ACCESS_PLATFORM).
Other components like QEMU should not set features bits more than
this intersection of bits. so we can make sure if this
ifcvf_verify_min_features() passed, both device and driver support
ACCESS_PLATFORM.
Are you suggesting check driver feature bits in
ifcvf_verify_min_features() in the meantime as well?
So it really depends on your hardware. If you hardware can always
offer ACCESS_PLATFORM, you just need to check driver features. This
is how vdpa_sim and mlx5_vdpa work.
Yes, we always support ACCESS_PLATFORM, so it is hard coded in the
macro IFCVF_SUPPORTED_FEATURES.
That's not what I read from the code:
features = ifcvf_get_features(vf) & IFCVF_SUPPORTED_FEATURES;
ifcvf_get_features() reads device feature bits(which should always has
ACCSSS_PLATFORM) and IFCVF_SUPPORTED_FEATURES is the driver supported
feature bits which hard coded ACCESS_PLATFORM, so the intersection
should include ACCESS_PLATFORM.
the intersection "features" is returned in get_features(), qemu should
set features according to it.
quoted
Now we check whether device support this feature bit as a double
conformation, are you suggesting we should check whether
ACCESS_PLATFORM & IFCVF_SUPPORTED_FEATURES
in set_features() as well?
If we know device will always offer ACCESS_PLATFORM, there's no need
to check it again. What we should check if whether driver set that,
and if it doesn't we need to fail set_features(). I think there's
little chance that IFCVF can work when IOMMU_PLATFORM is not negotiated.
Agree, will check the features bit to set instead of device feature
bits. Thanks!
quoted
I prefer check both device and IFCVF_SUPPORTED_FEATURES both, more
reliable.
So again, if you want to check device features, set_features() is not
the proper place. We need to fail the probe in this case.
Thanks
quoted
Thanks!
quoted
Thanks
quoted
Thanks!
quoted
quoted
+ if (ret)
+ return ret;
vf->req_features = features;
vdpa_device *vdpa_dev)
static int ifcvf_vdpa_set_features(struct vdpa_device
*vdpa_dev, u64 features)
{
struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev);
+ int ret;
+
+ ret = ifcvf_verify_min_features(vf);
So this validate device features instead of driver which is the
one we really want to check?
Thanks
Hi Jason,
Here we check device feature bits to make sure the device support
ACCESS_PLATFORM.
If you want to check device features, you need to do that during
probe() and fail the probing if without the feature. But I think
you won't ship cards without ACCESS_PLATFORM.
Yes, there are no reasons ship a card without ACCESS_PLATFORM
quoted
quoted
In get_features(),
it will return a intersection of device features bit and driver
supported features bits(which includes ACCESS_PLATFORM).
Other components like QEMU should not set features bits more than
this intersection of bits. so we can make sure if this
ifcvf_verify_min_features() passed, both device and driver support
ACCESS_PLATFORM.
Are you suggesting check driver feature bits in
ifcvf_verify_min_features() in the meantime as well?
So it really depends on your hardware. If you hardware can always
offer ACCESS_PLATFORM, you just need to check driver features. This
is how vdpa_sim and mlx5_vdpa work.
Yes, we always support ACCESS_PLATFORM, so it is hard coded in the
macro IFCVF_SUPPORTED_FEATURES.
That's not what I read from the code:
features = ifcvf_get_features(vf) & IFCVF_SUPPORTED_FEATURES;
ifcvf_get_features() reads device feature bits(which should always has
ACCSSS_PLATFORM) and IFCVF_SUPPORTED_FEATURES is the driver supported
feature bits
For "driver" you probably mean IFCVF. So there's some misunderstanding
before, what I meant for "driver" is virtio driver that do feature
negotaitation with the device.
I wonder what features are supported by the device but not the IFCVF driver?
Thanks
which hard coded ACCESS_PLATFORM, so the intersection should include
ACCESS_PLATFORM.
the intersection "features" is returned in get_features(), qemu should
set features according to it.
quoted
quoted
Now we check whether device support this feature bit as a double
conformation, are you suggesting we should check whether
ACCESS_PLATFORM & IFCVF_SUPPORTED_FEATURES
in set_features() as well?
If we know device will always offer ACCESS_PLATFORM, there's no need
to check it again. What we should check if whether driver set that,
and if it doesn't we need to fail set_features(). I think there's
little chance that IFCVF can work when IOMMU_PLATFORM is not negotiated.
Agree, will check the features bit to set instead of device feature
bits. Thanks!
quoted
quoted
I prefer check both device and IFCVF_SUPPORTED_FEATURES both, more
reliable.
So again, if you want to check device features, set_features() is not
the proper place. We need to fail the probe in this case.
Thanks
quoted
Thanks!
quoted
Thanks
quoted
Thanks!
quoted
quoted
+ if (ret)
+ return ret;
vf->req_features = features;
vdpa_device *vdpa_dev)
static int ifcvf_vdpa_set_features(struct vdpa_device
*vdpa_dev, u64 features)
{
struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev);
+ int ret;
+
+ ret = ifcvf_verify_min_features(vf);
So this validate device features instead of driver which is the
one we really want to check?
Thanks
Hi Jason,
Here we check device feature bits to make sure the device support
ACCESS_PLATFORM.
If you want to check device features, you need to do that during
probe() and fail the probing if without the feature. But I think
you won't ship cards without ACCESS_PLATFORM.
Yes, there are no reasons ship a card without ACCESS_PLATFORM
quoted
quoted
In get_features(),
it will return a intersection of device features bit and driver
supported features bits(which includes ACCESS_PLATFORM).
Other components like QEMU should not set features bits more than
this intersection of bits. so we can make sure if this
ifcvf_verify_min_features() passed, both device and driver
support ACCESS_PLATFORM.
Are you suggesting check driver feature bits in
ifcvf_verify_min_features() in the meantime as well?
So it really depends on your hardware. If you hardware can always
offer ACCESS_PLATFORM, you just need to check driver features.
This is how vdpa_sim and mlx5_vdpa work.
Yes, we always support ACCESS_PLATFORM, so it is hard coded in the
macro IFCVF_SUPPORTED_FEATURES.
That's not what I read from the code:
features = ifcvf_get_features(vf) & IFCVF_SUPPORTED_FEATURES;
ifcvf_get_features() reads device feature bits(which should always
has ACCSSS_PLATFORM) and IFCVF_SUPPORTED_FEATURES is the driver
supported feature bits
For "driver" you probably mean IFCVF. So there's some misunderstanding
before, what I meant for "driver" is virtio driver that do feature
negotaitation with the device.
I wonder what features are supported by the device but not the IFCVF
driver?
Thanks
we did not use TSO hardware feature bits in IFCVF driver for now.
Anyway, we will check the features bits to set in set_features than
hw/ifcvf driver feature bits.
THanks!
quoted
which hard coded ACCESS_PLATFORM, so the intersection should include
ACCESS_PLATFORM.
the intersection "features" is returned in get_features(), qemu
should set features according to it.
quoted
quoted
Now we check whether device support this feature bit as a double
conformation, are you suggesting we should check whether
ACCESS_PLATFORM & IFCVF_SUPPORTED_FEATURES
in set_features() as well?
If we know device will always offer ACCESS_PLATFORM, there's no need
to check it again. What we should check if whether driver set that,
and if it doesn't we need to fail set_features(). I think there's
little chance that IFCVF can work when IOMMU_PLATFORM is not
negotiated.
Agree, will check the features bit to set instead of device feature
bits. Thanks!
quoted
quoted
I prefer check both device and IFCVF_SUPPORTED_FEATURES both, more
reliable.
So again, if you want to check device features, set_features() is
not the proper place. We need to fail the probe in this case.
Thanks
quoted
Thanks!
quoted
Thanks
quoted
Thanks!
quoted
quoted
+ if (ret)
+ return ret;
vf->req_features = features;