From: Auger Eric <eric.auger@redhat.com>
Up to now the vfio-platform device has been abstract and could not be
instantiated. The integration of a new vfio platform device required
creating a dummy derived device which only set the compatible string.
Following the few vfio-platform device integrations we have seen the
actual requested adaptation happens on device tree node creation
(sysbus-fdt).
Hence remove the abstract setting, and read the list of compatible
values from sysfs if not set by a derived device.
Update the amd-xgbe and calxeda-xgmac drivers to fill in the number of
compatible values, as there can now be more than one.
Note that sysbus-fdt does not support the instantiation of the
vfio-platform device yet.
Signed-off-by: Eric Auger <eric.auger@redhat.com>
[geert: Rebase, set user_creatable=true, use compatible values in sysfs
instead of user-supplied manufacturer/model options, reword]
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v3:
- Read all compatible values from sysfs instead of using user-supplied
manufacturer and model options,
- Reword patch description,
- Drop RFC state,
v2:
- No changes,
v1:
- Rebase, Set user_creatable=true,
v0:
- Original version from Eric.
---
hw/vfio/amd-xgbe.c | 1 +
hw/vfio/calxeda-xgmac.c | 1 +
hw/vfio/platform.c | 22 +++++++++++++++++++++-
include/hw/vfio/vfio-platform.h | 3 ++-
4 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/hw/vfio/amd-xgbe.c b/hw/vfio/amd-xgbe.c
index 0c4ec4ba25170366..ee64a3b4a2e45bf5 100644
--- a/hw/vfio/amd-xgbe.c
+++ b/hw/vfio/amd-xgbe.c
@@ -20,6 +20,7 @@ static void amd_xgbe_realize(DeviceState *dev, Error **errp)
VFIOAmdXgbeDeviceClass *k = VFIO_AMD_XGBE_DEVICE_GET_CLASS(dev);
vdev->compat = g_strdup("amd,xgbe-seattle-v1a");
+ vdev->num_compat = 1;
k->parent_realize(dev, errp);
}
diff --git a/hw/vfio/calxeda-xgmac.c b/hw/vfio/calxeda-xgmac.c
index 24cee6d06512c1b6..e7767c4b021be566 100644
--- a/hw/vfio/calxeda-xgmac.c
+++ b/hw/vfio/calxeda-xgmac.c
@@ -20,6 +20,7 @@ static void calxeda_xgmac_realize(DeviceState *dev, Error **errp)
VFIOCalxedaXgmacDeviceClass *k = VFIO_CALXEDA_XGMAC_DEVICE_GET_CLASS(dev);
vdev->compat = g_strdup("calxeda,hb-xgmac");
+ vdev->num_compat = 1;
k->parent_realize(dev, errp);
}
diff --git a/hw/vfio/platform.c b/hw/vfio/platform.c
index 57c4a0ee2b58da70..e264555cd5dafb16 100644
--- a/hw/vfio/platform.c
+++ b/hw/vfio/platform.c
@@ -655,6 +655,25 @@ static void vfio_platform_realize(DeviceState *dev, Error **errp)
goto out;
}
+ if (!vdev->compat) {
+ gchar *contents;
+ gsize length;
+ char *tmp;
+
+ tmp = g_strdup_printf("%s/of_node/compatible", vbasedev->sysfsdev);
+ if (!g_file_get_contents(tmp, &contents, &length, NULL)) {
+ error_report("failed to load \"%s\"", tmp);
+ exit(1);
+ }
+ g_free(tmp);
+ vdev->compat = contents;
+ for (vdev->num_compat = 0; length; vdev->num_compat++) {
+ size_t skip = strlen(contents) + 1;
+ contents += skip;
+ length -= skip;
+ }
+ }
+
for (i = 0; i < vbasedev->num_regions; i++) {
if (vfio_region_mmap(vdev->regions[i])) {
error_report("%s mmap unsupported. Performance may be slow",
@@ -700,6 +719,8 @@ static void vfio_platform_class_init(ObjectClass *klass, void *data)
dc->desc = "VFIO-based platform device assignment";
sbc->connect_irq_notifier = vfio_start_irqfd_injection;
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
+ /* Supported by TYPE_VIRT_MACHINE */
+ dc->user_creatable = true;
}
static const TypeInfo vfio_platform_dev_info = {
@@ -708,7 +729,6 @@ static const TypeInfo vfio_platform_dev_info = {
.instance_size = sizeof(VFIOPlatformDevice),
.class_init = vfio_platform_class_init,
.class_size = sizeof(VFIOPlatformDeviceClass),
- .abstract = true,
};
static void register_vfio_platform_dev_type(void)
diff --git a/include/hw/vfio/vfio-platform.h b/include/hw/vfio/vfio-platform.h
index 9baaa2db09b84f3e..0ee10b1d71ed2503 100644
--- a/include/hw/vfio/vfio-platform.h
+++ b/include/hw/vfio/vfio-platform.h
@@ -54,7 +54,8 @@ typedef struct VFIOPlatformDevice {
QLIST_HEAD(, VFIOINTp) intp_list; /* list of IRQs */
/* queue of pending IRQs */
QSIMPLEQ_HEAD(pending_intp_queue, VFIOINTp) pending_intp_queue;
- char *compat; /* compatibility string */
+ char *compat; /* DT compatible values, separated by NUL */
+ unsigned int num_compat; /* number of compatible values */
uint32_t mmap_timeout; /* delay to re-enable mmaps after interrupt */
QEMUTimer *mmap_timer; /* allows fast-path resume after IRQ hit */
QemuMutex intp_mutex; /* protect the intp_list IRQ state */
--
2.17.1
Hi Geert,
On 07/25/2018 04:34 PM, Geert Uytterhoeven wrote:
> From: Auger Eric <eric.auger@redhat.com>
>
> Up to now the vfio-platform device has been abstract and could not be
> instantiated. The integration of a new vfio platform device required
> creating a dummy derived device which only set the compatible string.
>
> Following the few vfio-platform device integrations we have seen the
> actual requested adaptation happens on device tree node creation
> (sysbus-fdt).
>
> Hence remove the abstract setting, and read the list of compatible
> values from sysfs if not set by a derived device.
>
> Update the amd-xgbe and calxeda-xgmac drivers to fill in the number of
> compatible values, as there can now be more than one.
>
> Note that sysbus-fdt does not support the instantiation of the
> vfio-platform device yet.
>
> Signed-off-by: Eric Auger <eric.auger@redhat.com>
> [geert: Rebase, set user_creatable=true, use compatible values in sysfs
> instead of user-supplied manufacturer/model options, reword]
> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
> ---
> v3:
> - Read all compatible values from sysfs instead of using user-supplied
> manufacturer and model options,
> - Reword patch description,
> - Drop RFC state,
>
> v2:
> - No changes,
>
> v1:
> - Rebase, Set user_creatable=true,
>
> v0:
> - Original version from Eric.
> ---
> hw/vfio/amd-xgbe.c | 1 +
> hw/vfio/calxeda-xgmac.c | 1 +
> hw/vfio/platform.c | 22 +++++++++++++++++++++-
> include/hw/vfio/vfio-platform.h | 3 ++-
> 4 files changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/hw/vfio/amd-xgbe.c b/hw/vfio/amd-xgbe.c
> index 0c4ec4ba25170366..ee64a3b4a2e45bf5 100644
> --- a/hw/vfio/amd-xgbe.c
> +++ b/hw/vfio/amd-xgbe.c
> @@ -20,6 +20,7 @@ static void amd_xgbe_realize(DeviceState *dev, Error **errp)
> VFIOAmdXgbeDeviceClass *k = VFIO_AMD_XGBE_DEVICE_GET_CLASS(dev);
>
> vdev->compat = g_strdup("amd,xgbe-seattle-v1a");
> + vdev->num_compat = 1;
>
> k->parent_realize(dev, errp);
> }
> diff --git a/hw/vfio/calxeda-xgmac.c b/hw/vfio/calxeda-xgmac.c
> index 24cee6d06512c1b6..e7767c4b021be566 100644
> --- a/hw/vfio/calxeda-xgmac.c
> +++ b/hw/vfio/calxeda-xgmac.c
> @@ -20,6 +20,7 @@ static void calxeda_xgmac_realize(DeviceState *dev, Error **errp)
> VFIOCalxedaXgmacDeviceClass *k = VFIO_CALXEDA_XGMAC_DEVICE_GET_CLASS(dev);
>
> vdev->compat = g_strdup("calxeda,hb-xgmac");
> + vdev->num_compat = 1;
>
> k->parent_realize(dev, errp);
> }
> diff --git a/hw/vfio/platform.c b/hw/vfio/platform.c
> index 57c4a0ee2b58da70..e264555cd5dafb16 100644
> --- a/hw/vfio/platform.c
> +++ b/hw/vfio/platform.c
> @@ -655,6 +655,25 @@ static void vfio_platform_realize(DeviceState *dev, Error **errp)
> goto out;
> }
>
> + if (!vdev->compat) {
> + gchar *contents;
> + gsize length;
> + char *tmp;
> +
> + tmp = g_strdup_printf("%s/of_node/compatible", vbasedev->sysfsdev);
> + if (!g_file_get_contents(tmp, &contents, &length, NULL)) {
> + error_report("failed to load \"%s\"", tmp);
> + exit(1);
You should set errp instead so that the error gets properly propagated.
> + }
> + g_free(tmp);
> + vdev->compat = contents;
> + for (vdev->num_compat = 0; length; vdev->num_compat++) {
> + size_t skip = strlen(contents) + 1;
> + contents += skip;
> + length -= skip;
> + }
> + }
> +
> for (i = 0; i < vbasedev->num_regions; i++) {
> if (vfio_region_mmap(vdev->regions[i])) {
> error_report("%s mmap unsupported. Performance may be slow",
> @@ -700,6 +719,8 @@ static void vfio_platform_class_init(ObjectClass *klass, void *data)
> dc->desc = "VFIO-based platform device assignment";
> sbc->connect_irq_notifier = vfio_start_irqfd_injection;
> set_bit(DEVICE_CATEGORY_MISC, dc->categories);
> + /* Supported by TYPE_VIRT_MACHINE */
> + dc->user_creatable = true;
> }
>
> static const TypeInfo vfio_platform_dev_info = {
> @@ -708,7 +729,6 @@ static const TypeInfo vfio_platform_dev_info = {
> .instance_size = sizeof(VFIOPlatformDevice),
> .class_init = vfio_platform_class_init,
> .class_size = sizeof(VFIOPlatformDeviceClass),
> - .abstract = true,
> };
>
> static void register_vfio_platform_dev_type(void)
> diff --git a/include/hw/vfio/vfio-platform.h b/include/hw/vfio/vfio-platform.h
> index 9baaa2db09b84f3e..0ee10b1d71ed2503 100644
> --- a/include/hw/vfio/vfio-platform.h
> +++ b/include/hw/vfio/vfio-platform.h
> @@ -54,7 +54,8 @@ typedef struct VFIOPlatformDevice {
> QLIST_HEAD(, VFIOINTp) intp_list; /* list of IRQs */
> /* queue of pending IRQs */
> QSIMPLEQ_HEAD(pending_intp_queue, VFIOINTp) pending_intp_queue;
> - char *compat; /* compatibility string */
> + char *compat; /* DT compatible values, separated by NUL */
by NULL characters?
> + unsigned int num_compat; /* number of compatible values */
> uint32_t mmap_timeout; /* delay to re-enable mmaps after interrupt */
> QEMUTimer *mmap_timer; /* allows fast-path resume after IRQ hit */
> QemuMutex intp_mutex; /* protect the intp_list IRQ state */
Thanks
Eric
>
Hi Eric,
On Tue, Aug 7, 2018 at 4:18 PM Auger Eric <eric.auger@redhat.com> wrote:
> On 07/25/2018 04:34 PM, Geert Uytterhoeven wrote:
> > From: Auger Eric <eric.auger@redhat.com>
> >
> > Up to now the vfio-platform device has been abstract and could not be
> > instantiated. The integration of a new vfio platform device required
> > creating a dummy derived device which only set the compatible string.
> >
> > Following the few vfio-platform device integrations we have seen the
> > actual requested adaptation happens on device tree node creation
> > (sysbus-fdt).
> >
> > Hence remove the abstract setting, and read the list of compatible
> > values from sysfs if not set by a derived device.
> >
> > Update the amd-xgbe and calxeda-xgmac drivers to fill in the number of
> > compatible values, as there can now be more than one.
> >
> > Note that sysbus-fdt does not support the instantiation of the
> > vfio-platform device yet.
> >
> > Signed-off-by: Eric Auger <eric.auger@redhat.com>
> > [geert: Rebase, set user_creatable=true, use compatible values in sysfs
> > instead of user-supplied manufacturer/model options, reword]
> > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
> > ---
> > v3:
> > - Read all compatible values from sysfs instead of using user-supplied
> > manufacturer and model options,
> > - Reword patch description,
> > - Drop RFC state,
> >
> > v2:
> > - No changes,
> >
> > v1:
> > - Rebase, Set user_creatable=true,
> >
> > v0:
> > - Original version from Eric.
> > --- a/hw/vfio/platform.c
> > +++ b/hw/vfio/platform.c
> > @@ -655,6 +655,25 @@ static void vfio_platform_realize(DeviceState *dev, Error **errp)
> > goto out;
> > }
> >
> > + if (!vdev->compat) {
> > + gchar *contents;
> > + gsize length;
> > + char *tmp;
> > +
> > + tmp = g_strdup_printf("%s/of_node/compatible", vbasedev->sysfsdev);
> > + if (!g_file_get_contents(tmp, &contents, &length, NULL)) {
> > + error_report("failed to load \"%s\"", tmp);
> > + exit(1);
> You should set errp instead so that the error gets properly propagated.
Thanks, will do.
> > --- a/include/hw/vfio/vfio-platform.h
> > +++ b/include/hw/vfio/vfio-platform.h
> > @@ -54,7 +54,8 @@ typedef struct VFIOPlatformDevice {
> > QLIST_HEAD(, VFIOINTp) intp_list; /* list of IRQs */
> > /* queue of pending IRQs */
> > QSIMPLEQ_HEAD(pending_intp_queue, VFIOINTp) pending_intp_queue;
> > - char *compat; /* compatibility string */
> > + char *compat; /* DT compatible values, separated by NUL */
> by NULL characters?
"NUL" is the character ('\0'), "NULL" is the pointer.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Hi Geert,
On 08/07/2018 05:00 PM, Geert Uytterhoeven wrote:
> Hi Eric,
>
> On Tue, Aug 7, 2018 at 4:18 PM Auger Eric <eric.auger@redhat.com> wrote:
>> On 07/25/2018 04:34 PM, Geert Uytterhoeven wrote:
>>> From: Auger Eric <eric.auger@redhat.com>
>>>
>>> Up to now the vfio-platform device has been abstract and could not be
>>> instantiated. The integration of a new vfio platform device required
>>> creating a dummy derived device which only set the compatible string.
>>>
>>> Following the few vfio-platform device integrations we have seen the
>>> actual requested adaptation happens on device tree node creation
>>> (sysbus-fdt).
>>>
>>> Hence remove the abstract setting, and read the list of compatible
>>> values from sysfs if not set by a derived device.
>>>
>>> Update the amd-xgbe and calxeda-xgmac drivers to fill in the number of
>>> compatible values, as there can now be more than one.
>>>
>>> Note that sysbus-fdt does not support the instantiation of the
>>> vfio-platform device yet.
>>>
>>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>>> [geert: Rebase, set user_creatable=true, use compatible values in sysfs
>>> instead of user-supplied manufacturer/model options, reword]
>>> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
>>> ---
>>> v3:
>>> - Read all compatible values from sysfs instead of using user-supplied
>>> manufacturer and model options,
>>> - Reword patch description,
>>> - Drop RFC state,
>>>
>>> v2:
>>> - No changes,
>>>
>>> v1:
>>> - Rebase, Set user_creatable=true,
>>>
>>> v0:
>>> - Original version from Eric.
>
>>> --- a/hw/vfio/platform.c
>>> +++ b/hw/vfio/platform.c
>>> @@ -655,6 +655,25 @@ static void vfio_platform_realize(DeviceState *dev, Error **errp)
>>> goto out;
>>> }
>>>
>>> + if (!vdev->compat) {
>>> + gchar *contents;
>>> + gsize length;
>>> + char *tmp;
>>> +
>>> + tmp = g_strdup_printf("%s/of_node/compatible", vbasedev->sysfsdev);
>>> + if (!g_file_get_contents(tmp, &contents, &length, NULL)) {
>>> + error_report("failed to load \"%s\"", tmp);
>>> + exit(1);
>> You should set errp instead so that the error gets properly propagated.
>
> Thanks, will do.
>
>>> --- a/include/hw/vfio/vfio-platform.h
>>> +++ b/include/hw/vfio/vfio-platform.h
>>> @@ -54,7 +54,8 @@ typedef struct VFIOPlatformDevice {
>>> QLIST_HEAD(, VFIOINTp) intp_list; /* list of IRQs */
>>> /* queue of pending IRQs */
>>> QSIMPLEQ_HEAD(pending_intp_queue, VFIOINTp) pending_intp_queue;
>>> - char *compat; /* compatibility string */
>>> + char *compat; /* DT compatible values, separated by NUL */
>> by NULL characters?
>
> "NUL" is the character ('\0'), "NULL" is the pointer.
Ah OK ;-)
Thanks
Eric
>
> Gr{oetje,eeting}s,
>
> Geert
>
© 2016 - 2025 Red Hat, Inc.