[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v6 9/9] xen/asm-generic: introduce generic device.h



Hi Julien,

On Thu, 2023-12-21 at 19:38 +0000, Julien Grall wrote:
> Hi,
> 
> On 20/12/2023 14:08, Oleksii Kurochko wrote:
> > Arm, PPC and RISC-V use the same device.h thereby device.h
> > was moved to asm-generic. Arm's device.h was taken as a base with
> > the following changes:
> >   - #ifdef PCI related things.
> >   - #ifdef ACPI related things.
> >   - Rename #ifdef guards.
> >   - Add SPDX tag.
> >   - #ifdef CONFIG_HAS_DEVICE_TREE related things.
> >   - #ifdef-ing iommu related things with CONFIG_HAS_PASSTHROUGH.
> > 
> > Also Arm and PPC are switched to asm-generic version of device.h
> > 
> > Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
> > ---
> > 
> >       Jan wrote the following:
> >         Overall I think there are too many changes done all in one
> > go here.
> >         But it's mostly Arm which is affected, so I'll leave
> > judging about that
> >         to the Arm maintainers.
> >       
> >       Arm maintainers, will it be fine for you to not split the
> > patch?
> 
> So in general I agree with Jan, patches should be kept small so they
> are 
> easy to review.
> 
> Given the discussion has been on-going for a while (we are at v6),  I
> will give an attempt to review the patch as-is. But in the future, 
> please try to split. The smaller it is, the easier to review. For
> code 
> movement and refactoring, I tend to first have a few refactoring
> patches 
> and then move the code in a separate patch. So it is easier to spot
> the 
> differences.
Thanks, I'll separate the patch.
> 
> > ---
> > Changes in V6:
> >   - Rebase only.
> > ---
> > Changes in V5:
> >    - Removed generated file: xen/include/headers++.chk.new
> >    - Removed pointless #ifdef CONFIG_HAS_DEVICE_TREE ... #endif for
> > PPC as
> >      CONFIG_HAS_DEVICE_TREE will be always used for PPC.
> > ---
> > Changes in V4:
> >   - Updated the commit message
> >   - Switched Arm and PPC to asm-generic version of device.h
> >   - Replaced HAS_PCI with CONFIG_HAS_PCI
> >   - ifdef-ing iommu filed of dev_archdata struct with
> > CONFIG_HAS_PASSTHROUGH
> >   - ifdef-ing iommu_fwspec of device struct with
> > CONFIG_HAS_PASSTHROUGH
> >   - ifdef-ing DT related things with CONFIG_HAS_DEVICE_TREE
> >   - Updated the commit message ( remove a note with question about
> >     if device.h should be in asm-generic or not )
> >   - Replaced DEVICE_IC with DEVICE_INTERRUPT_CONTROLLER
> >   - Rationalized usage of CONFIG_HAS_* in device.h
> >   - Fixed indents for ACPI_DEVICE_START and ACPI_DEVICE_END
> > ---
> > Changes in V3:
> >   - ifdef device tree related things.
> >   - update the commit message
> > ---
> > Changes in V2:
> >     - take ( as common ) device.h from Arm as PPC and RISC-V
> > use it as a base.
> >     - #ifdef PCI related things.
> >     - #ifdef ACPI related things.
> >     - rename DEVICE_GIC to DEVIC_IC.
> >     - rename #ifdef guards.
> >     - switch Arm and PPC to generic device.h
> >     - add SPDX tag
> >     - update the commit message
> > 
> > ---
> >   xen/arch/arm/device.c                         |  15 ++-
> >   xen/arch/arm/domain_build.c                   |   2 +-
> >   xen/arch/arm/gic-v2.c                         |   4 +-
> >   xen/arch/arm/gic-v3.c                         |   6 +-
> >   xen/arch/arm/gic.c                            |   4 +-
> >   xen/arch/arm/include/asm/Makefile             |   1 +
> >   xen/arch/ppc/include/asm/Makefile             |   1 +
> >   xen/arch/ppc/include/asm/device.h             |  53 --------
> >   .../asm => include/asm-generic}/device.h      | 125 +++++++++++--
> > -----
> >   9 files changed, 102 insertions(+), 109 deletions(-)
> >   delete mode 100644 xen/arch/ppc/include/asm/device.h
> >   rename xen/{arch/arm/include/asm => include/asm-generic}/device.h
> > (79%)
> > 
> > diff --git a/xen/arch/arm/device.c b/xen/arch/arm/device.c
> > index 1f631d3274..affbe79f9a 100644
> > --- a/xen/arch/arm/device.c
> > +++ b/xen/arch/arm/device.c
> > @@ -16,7 +16,10 @@
> >   #include <xen/lib.h>
> >   
> >   extern const struct device_desc _sdevice[], _edevice[];
> > +
> > +#ifdef CONFIG_ACPI
> >   extern const struct acpi_device_desc _asdevice[], _aedevice[];
> > +#endif
> >   
> >   int __init device_init(struct dt_device_node *dev, enum
> > device_class class,
> >                          const void *data)
> > @@ -45,6 +48,7 @@ int __init device_init(struct dt_device_node
> > *dev, enum device_class class,
> >       return -EBADF;
> >   }
> >   
> > +#ifdef CONFIG_ACPI
> >   int __init acpi_device_init(enum device_class class, const void
> > *data, int class_type)
> >   {
> >       const struct acpi_device_desc *desc;
> > @@ -61,6 +65,7 @@ int __init acpi_device_init(enum device_class
> > class, const void *data, int class
> >   
> >       return -EBADF;
> >   }
> > +#endif
> >   
> >   enum device_class device_get_class(const struct dt_device_node
> > *dev)
> >   {
> > @@ -329,9 +334,13 @@ int handle_device(struct domain *d, struct
> > dt_device_node *dev, p2m_type_t p2mt,
> >       struct map_range_data mr_data = {
> >           .d = d,
> >           .p2mt = p2mt,
> > -        .skip_mapping = !own_device ||
> > -                        (is_pci_passthrough_enabled() &&
> > -                        (device_get_class(dev) ==
> > DEVICE_PCI_HOSTBRIDGE)),
> > +        .skip_mapping =
> > +                        !own_device
> > +#ifdef CONFIG_HAS_PCI
> > +                        || (is_pci_passthrough_enabled() &&
> > +                        (device_get_class(dev) ==
> > DEVICE_PCI_HOSTBRIDGE))
> > +#endif
> 
> So the #ifdef is only here because DEVICE_PCI_HOSTBRIDGE is not
> defined. 
> It is not clear what's the actual problem of keeping 
> DEVICE_PCI_HOSTBRIDGE available for every build.
The only reason for that is that it seems to be used only in thecase when 
CONFIG_HAS_PCI is enabled ( probably not all archs will
have PCI support ). Generally,
I think it's okay not to use #ifdef DEVICE_PCI_HOSTBRIDGE to keep
the Arm code cleaner.

Does it make sense?
> 
> In fact, we have tried to get away from #ifdef in order to make
> ensure 
> we can catch any build failure without a randconfig (see use of 
> IS_ENABLED() which would not apply work here).
It would be nice to use IS_ENABLED but in this case still need to
something with definition of DEVICE_PCI_HOSTBRIDGE.

> 
> [...]
> 
> > diff --git a/xen/arch/ppc/include/asm/device.h
> > b/xen/arch/ppc/include/asm/device.h
> > deleted file mode 100644
> > index 8253e61d51..0000000000
> > --- a/xen/arch/ppc/include/asm/device.h
> > +++ /dev/null
> > @@ -1,53 +0,0 @@
> > -/* SPDX-License-Identifier: GPL-2.0-only */
> > -#ifndef __ASM_PPC_DEVICE_H__
> > -#define __ASM_PPC_DEVICE_H__
> > -
> > -enum device_type
> > -{
> > -    DEV_DT,
> > -    DEV_PCI,
> > -};
> > -
> > -struct device {
> > -    enum device_type type;
> > -#ifdef CONFIG_HAS_DEVICE_TREE
> > -    struct dt_device_node *of_node; /* Used by drivers imported
> > from Linux */
> > -#endif
> > -};
> > -
> > -enum device_class
> > -{
> > -    DEVICE_SERIAL,
> > -    DEVICE_IOMMU,
> > -    DEVICE_PCI_HOSTBRIDGE,
> > -    /* Use for error */
> > -    DEVICE_UNKNOWN,
> > -};
> > -
> > -struct device_desc {
> > -    /* Device name */
> > -    const char *name;
> > -    /* Device class */
> > -    enum device_class class;
> > -    /* List of devices supported by this driver */
> > -    const struct dt_device_match *dt_match;
> > -    /*
> > -     * Device initialization.
> > -     *
> > -     * -EAGAIN is used to indicate that device probing is
> > deferred.
> > -     */
> > -    int (*init)(struct dt_device_node *dev, const void *data);
> > -};
> > -
> > -typedef struct device device_t;
> > -
> > -#define DT_DEVICE_START(name_, namestr_,
> > class_)                    \
> > -static const struct device_desc __dev_desc_##name_
> > __used           \
> > -__section(".dev.info") =
> > {                                          \
> > -    .name =
> > namestr_,                                               \
> > -    .class =
> > class_,                                                \
> > -
> > -#define
> > DT_DEVICE_END                                               \
> > -};
> > -
> > -#endif /* __ASM_PPC_DEVICE_H__ */
> > diff --git a/xen/arch/arm/include/asm/device.h b/xen/include/asm-
> > generic/device.h
> > similarity index 79%
> > rename from xen/arch/arm/include/asm/device.h
> > rename to xen/include/asm-generic/device.h
> > index b5d451e087..063c448c4e 100644
> > --- a/xen/arch/arm/include/asm/device.h
> > +++ b/xen/include/asm-generic/device.h
> > @@ -1,14 +1,37 @@
> > -#ifndef __ASM_ARM_DEVICE_H
> > -#define __ASM_ARM_DEVICE_H
> > +/* SPDX-License-Identifier: GPL-2.0-only */
> > +#ifndef __ASM_GENERIC_DEVICE_H__
> > +#define __ASM_GENERIC_DEVICE_H__
> > +
> > +#include <xen/stdbool.h>
> >   
> >   enum device_type
> >   {
> > +#ifdef CONFIG_HAS_DEVICE_TREE
> >       DEV_DT,
> > +#endif
> > +
> > +#ifdef CONFIG_HAS_PCI
> >       DEV_PCI,
> > +#endif
> > +    DEV_TYPE_MAX,
> Nobody is using it. AFAICT, this was introduced because enum may be 
> empty if !HAS_DEVICE_TREE and !HAS_PCI. If so, can you add a comment 
> explaining it on top?
Sure, thanks. I'll add the comment.

> 
> The rest LGTM.
> 
> Cheers,
> 
~ Oleksii





 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.