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

Re: [PATCH v1 3/3] xen/common: move device initialization code to common code



On Thu, 2024-09-12 at 17:28 +0200, Jan Beulich wrote:
> On 11.09.2024 12:04, Oleksii Kurochko wrote:
> > --- a/xen/common/Makefile
> > +++ b/xen/common/Makefile
> > @@ -6,6 +6,7 @@ obj-$(CONFIG_HYPFS_CONFIG) += config_data.o
> >  obj-$(CONFIG_CORE_PARKING) += core_parking.o
> >  obj-y += cpu.o
> >  obj-$(CONFIG_DEBUG_TRACE) += debugtrace.o
> > +obj-$(call or,$(CONFIG_HAS_DEVICE_TREE),$(CONFIG_HAS_ACPI)) +=
> > device.o
> 
> I can't spot any HAS_ACPI in the tree. And if this was switched to
> CONFIG_ACPI
> I'd further ask why the file needs building on x86.
Oh, there is no need for building this on x86. With what you suggested
here ...

> 
> Also I think I'd prefer to avoid the of the "or" macro here:
> 
> obj-$(CONFIG_ACPI) += device.o
> obj-$(CONFIG_HAS_DEVICE_TREE) += device.o
... IIUC it will fix the issue with building this file for x86 as
CONFIG_ACPI depends on (ARM_64 && ARM_EFI).

> 
> ought to be quite fine. There's de-duplication somewhere for what
> $(obj-y) lists.
> 
> > --- /dev/null
> > +++ b/xen/common/device.c
> > @@ -0,0 +1,82 @@
> > +/* SPDX-License-Identifier: GPL-2.0-or-later */
> > +/*
> > + * Based on the code from:
> > + *   xen/arch/arm/device.c
> > + */
> > +
> > +#include <xen/bug.h>
> > +#include <xen/device_tree.h>
> > +#include <xen/errno.h>
> > +#include <xen/init.h>
> > +
> > +#include <asm-generic/device.h>
> > +
> > +#ifdef CONFIG_ACPI
> > +extern const struct acpi_device_desc _asdevice[], _aedevice[];
> 
> Why does this live separately here, rather than ...
> 
> > +#endif
> > +
> > +#ifdef CONFIG_HAS_DEVICE_TREE
> > +
> > +extern const struct device_desc _sdevice[], _edevice[];
> 
> ... like this ...
> 
> > +int __init device_init(struct dt_device_node *dev, enum
> > device_class class,
> > +                       const void *data)
> > +{
> > +    const struct device_desc *desc;
> > +
> > +    ASSERT(dev != NULL);
> > +
> > +    if ( !dt_device_is_available(dev) ||
> > dt_device_for_passthrough(dev) )
> > +        return  -ENODEV;
> > +
> > +    for ( desc = _sdevice; desc != _edevice; desc++ )
> > +    {
> > +        if ( desc->class != class )
> > +            continue;
> > +
> > +        if ( dt_match_node(desc->dt_match, dev) )
> > +        {
> > +            ASSERT(desc->init != NULL);
> > +
> > +            return desc->init(dev, data);
> > +        }
> > +    }
> > +
> > +    return -EBADF;
> > +}
> > +
> > +enum device_class device_get_class(const struct dt_device_node
> > *dev)
> > +{
> > +    const struct device_desc *desc;
> > +
> > +    ASSERT(dev != NULL);
> > +
> > +    for ( desc = _sdevice; desc != _edevice; desc++ )
> > +    {
> > +        if ( dt_match_node(desc->dt_match, dev) )
> > +            return desc->class;
> > +    }
> > +
> > +    return DEVICE_UNKNOWN;
> > +}
> > +
> > +#endif
> > +
> > +#ifdef CONFIG_ACPI
> 
> ... in the section where it's needed? Leaving just one #ifdef for
> ACPI.
Just tried to follow the approach that first is going variables
declaration/definitions and then functions. But I am okay to move it to
CONFIG_ACPI #ifdef CONFIG_ACPI ... #endif.

Thanks.

~ Oleksii



 


Rackspace

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