Message ID | 20200409102611.v6.12.Ia5e9ba1f146567b18e9183395484bf04d2e5ba6a@changeid |
---|---|
State | Superseded |
Headers | show |
Series | None | expand |
On Thu, Apr 09, 2020 at 10:27:38AM -0600, Simon Glass wrote: > ACPI (Advanced Configuration and Power Interface) is a standard for > specifying information about a platform. It is a little like device > tree but the bindings are part of the specification and it supports an > interpreted bytecode language. > > Driver model does not use ACPI for U-Boot's configuration, but it is > convenient to have it support generation of ACPI tables for passing to > Linux, etc. > > As a starting point, add an optional set of ACPI operations to each > device. Initially only a single operation is available, to obtain the > ACPI name for the device. More operations are added later. > > Enable ACPI for sandbox to ensure build coverage and so that we can add > tests. > Both looks good to me now, thanks! > Reviewed-by: Bin Meng <bmeng.cn at gmail.com> > Reviewed-by: Wolfgang Wallner <wolfgang.wallner at br-automation.com> > Signed-off-by: Simon Glass <sjg at chromium.org> > --- > > Changes in v6: > - Use ACPI_NAME_LEN in acpi_copy_name since we add the nul anyway > > Changes in v5: > - Capitalise ACPI_OPS_PTR since it includes a comma > > Changes in v4: None > Changes in v3: > - Drop 'Intel' from 'Intel ACPI' > - Reword commit message to drop the bit about ACPI being complicated > - Compute ACPI_NAME_MAX from ACPI_NAME_LEN > - Rename acpi_return_name() to acpi_copy_name() > - Use strncpy() instead of strcpy() in acpi_copy_name() > > Changes in v2: > - Move LOGC_ACPI definition to this patch > > configs/tools-only_defconfig | 1 + > drivers/core/Kconfig | 9 +++++ > drivers/core/Makefile | 1 + > drivers/core/acpi.c | 33 ++++++++++++++++ > include/dm/acpi.h | 73 ++++++++++++++++++++++++++++++++++++ > include/dm/device.h | 5 +++ > include/log.h | 2 + > 7 files changed, 124 insertions(+) > create mode 100644 drivers/core/acpi.c > create mode 100644 include/dm/acpi.h > > diff --git a/configs/tools-only_defconfig b/configs/tools-only_defconfig > index 6ca50dc5fd3..2811b2cd37d 100644 > --- a/configs/tools-only_defconfig > +++ b/configs/tools-only_defconfig > @@ -26,3 +26,4 @@ CONFIG_SYSRESET=y > # CONFIG_VIRTIO_PCI is not set > # CONFIG_VIRTIO_SANDBOX is not set > # CONFIG_EFI_LOADER is not set > +# CONFIG_ACPIGEN is not set > diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig > index 3b95b5387b9..a3b03993423 100644 > --- a/drivers/core/Kconfig > +++ b/drivers/core/Kconfig > @@ -261,4 +261,13 @@ config DM_DEV_READ_INLINE > bool > default y if !OF_LIVE > > +config ACPIGEN > + bool "Support ACPI table generation in driver model" > + default y if SANDBOX || GENERATE_ACPI_TABLE > + help > + This option enables generation of ACPI tables using driver-model > + devices. It adds a new operation struct to each driver, to support > + things like generating device-specific tables and returning the ACPI > + name of a device. > + > endmenu > diff --git a/drivers/core/Makefile b/drivers/core/Makefile > index bce7467da1d..c707026a3a0 100644 > --- a/drivers/core/Makefile > +++ b/drivers/core/Makefile > @@ -3,6 +3,7 @@ > # Copyright (c) 2013 Google, Inc > > obj-y += device.o fdtaddr.o lists.o root.o uclass.o util.o > +obj-$(CONFIG_$(SPL_TPL_)ACPIGEN) += acpi.o > obj-$(CONFIG_DEVRES) += devres.o > obj-$(CONFIG_$(SPL_)DM_DEVICE_REMOVE) += device-remove.o > obj-$(CONFIG_$(SPL_)SIMPLE_BUS) += simple-bus.o > diff --git a/drivers/core/acpi.c b/drivers/core/acpi.c > new file mode 100644 > index 00000000000..ba50d688fef > --- /dev/null > +++ b/drivers/core/acpi.c > @@ -0,0 +1,33 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * Core driver model support for ACPI table generation > + * > + * Copyright 2019 Google LLC > + * Written by Simon Glass <sjg at chromium.org> > + */ > + > +#define LOG_CATEOGRY LOGC_ACPI > + > +#include <common.h> > +#include <dm.h> > +#include <dm/acpi.h> > +#include <dm/root.h> > + > +int acpi_copy_name(char *out_name, const char *name) > +{ > + strncpy(out_name, name, ACPI_NAME_LEN); > + out_name[ACPI_NAME_LEN] = '\0'; > + > + return 0; > +} > + > +int acpi_get_name(const struct udevice *dev, char *out_name) > +{ > + struct acpi_ops *aops; > + > + aops = device_get_acpi_ops(dev); > + if (aops && aops->get_name) > + return aops->get_name(dev, out_name); > + > + return -ENOSYS; > +} > diff --git a/include/dm/acpi.h b/include/dm/acpi.h > new file mode 100644 > index 00000000000..ba0813fa21c > --- /dev/null > +++ b/include/dm/acpi.h > @@ -0,0 +1,73 @@ > +/* SPDX-License-Identifier: GPL-2.0+ */ > +/* > + * Core ACPI (Advanced Configuration and Power Interface) support > + * > + * Copyright 2019 Google LLC > + * Written by Simon Glass <sjg at chromium.org> > + */ > + > +#ifndef __DM_ACPI_H__ > +#define __DM_ACPI_H__ > + > +/* Allow operations to be optional for ACPI */ > +#if CONFIG_IS_ENABLED(ACPIGEN) > +#define ACPI_OPS_PTR(_ptr) .acpi_ops = _ptr, > +#else > +#define ACPI_OPS_PTR(_ptr) > +#endif > + > +/* Length of an ACPI name string, excluding nul terminator */ > +#define ACPI_NAME_LEN 4 > + > +/* Length of an ACPI name string including nul terminator */ > +#define ACPI_NAME_MAX (ACPI_NAME_LEN + 1) > + > +/** > + * struct acpi_ops - ACPI operations supported by driver model > + */ > +struct acpi_ops { > + /** > + * get_name() - Obtain the ACPI name of a device > + * > + * @dev: Device to check > + * @out_name: Place to put the name, must hold at least ACPI_NAME_MAX > + * bytes > + * @return 0 if OK, -ENOENT if no name is available, other -ve value on > + * other error > + */ > + int (*get_name)(const struct udevice *dev, char *out_name); > +}; > + > +#define device_get_acpi_ops(dev) ((dev)->driver->acpi_ops) > + > +/** > + * acpi_get_name() - Obtain the ACPI name of a device > + * > + * @dev: Device to check > + * @out_name: Place to put the name, must hold at least ACPI_NAME_MAX > + * bytes > + * @return 0 if OK, -ENOENT if no name is available, other -ve value on > + * other error > + */ > +int acpi_get_name(const struct udevice *dev, char *out_name); > + > +/** > + * acpi_copy_name() - Copy an ACPI name to an output buffer > + * > + * This convenience function can be used to return a literal string as a name > + * in functions that implement the get_name() method. > + * > + * For example: > + * > + * static int mydev_get_name(const struct udevice *dev, char *out_name) > + * { > + * return acpi_copy_name(out_name, "WIBB"); > + * } > + * > + * @out_name: Place to put the name > + * @name: Name to copy > + * @return 0 (always) > + */ > +int acpi_copy_name(char *out_name, const char *name); > + > +#endif > diff --git a/include/dm/device.h b/include/dm/device.h > index a56164b19bb..35e19d87005 100644 > --- a/include/dm/device.h > +++ b/include/dm/device.h > @@ -245,6 +245,8 @@ struct udevice_id { > * pointers defined by the driver, to implement driver functions required by > * the uclass. > * @flags: driver flags - see DM_FLAGS_... > + * @acpi_ops: Advanced Configuration and Power Interface (ACPI) operations, > + * allowing the device to add things to the ACPI tables passed to Linux > */ > struct driver { > char *name; > @@ -264,6 +266,9 @@ struct driver { > int per_child_platdata_auto_alloc_size; > const void *ops; /* driver-specific operations */ > uint32_t flags; > +#if CONFIG_IS_ENABLED(ACPIGEN) > + struct acpi_ops *acpi_ops; > +#endif > }; > > /* Declare a new U-Boot driver */ > diff --git a/include/log.h b/include/log.h > index 62fb8afbd0e..fbcbd42fb4b 100644 > --- a/include/log.h > +++ b/include/log.h > @@ -51,6 +51,8 @@ enum log_category_t { > LOGC_SANDBOX, /* Related to the sandbox board */ > LOGC_BLOBLIST, /* Bloblist */ > LOGC_DEVRES, /* Device resources (devres_... functions) */ > + /* Advanced Configuration and Power Interface (ACPI) */ > + LOGC_ACPI, > > LOGC_COUNT, /* Number of log categories */ > LOGC_END, /* Sentinel value for a list of log categories */ > -- > 2.26.0.292.g33ef6b2f38-goog >
On Thu, 9 Apr 2020 at 11:40, Andy Shevchenko <andriy.shevchenko at linux.intel.com> wrote: > > On Thu, Apr 09, 2020 at 10:27:38AM -0600, Simon Glass wrote: > > ACPI (Advanced Configuration and Power Interface) is a standard for > > specifying information about a platform. It is a little like device > > tree but the bindings are part of the specification and it supports an > > interpreted bytecode language. > > > > Driver model does not use ACPI for U-Boot's configuration, but it is > > convenient to have it support generation of ACPI tables for passing to > > Linux, etc. > > > > As a starting point, add an optional set of ACPI operations to each > > device. Initially only a single operation is available, to obtain the > > ACPI name for the device. More operations are added later. > > > > Enable ACPI for sandbox to ensure build coverage and so that we can add > > tests. > > > > Both looks good to me now, thanks! > > > Reviewed-by: Bin Meng <bmeng.cn at gmail.com> > > Reviewed-by: Wolfgang Wallner <wolfgang.wallner at br-automation.com> > > Signed-off-by: Simon Glass <sjg at chromium.org> > > --- > > > > Changes in v6: > > - Use ACPI_NAME_LEN in acpi_copy_name since we add the nul anyway > > > > Changes in v5: > > - Capitalise ACPI_OPS_PTR since it includes a comma > > > > Changes in v4: None > > Changes in v3: > > - Drop 'Intel' from 'Intel ACPI' > > - Reword commit message to drop the bit about ACPI being complicated > > - Compute ACPI_NAME_MAX from ACPI_NAME_LEN > > - Rename acpi_return_name() to acpi_copy_name() > > - Use strncpy() instead of strcpy() in acpi_copy_name() > > > > Changes in v2: > > - Move LOGC_ACPI definition to this patch > > > > configs/tools-only_defconfig | 1 + > > drivers/core/Kconfig | 9 +++++ > > drivers/core/Makefile | 1 + > > drivers/core/acpi.c | 33 ++++++++++++++++ > > include/dm/acpi.h | 73 ++++++++++++++++++++++++++++++++++++ > > include/dm/device.h | 5 +++ > > include/log.h | 2 + > > 7 files changed, 124 insertions(+) > > create mode 100644 drivers/core/acpi.c > > create mode 100644 include/dm/acpi.h Andy let me add your tag. Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Hi Simon, On Fri, Apr 10, 2020 at 3:36 AM Simon Glass <sjg at chromium.org> wrote: > > On Thu, 9 Apr 2020 at 11:40, Andy Shevchenko > <andriy.shevchenko at linux.intel.com> wrote: > > > > On Thu, Apr 09, 2020 at 10:27:38AM -0600, Simon Glass wrote: > > > ACPI (Advanced Configuration and Power Interface) is a standard for > > > specifying information about a platform. It is a little like device > > > tree but the bindings are part of the specification and it supports an > > > interpreted bytecode language. > > > > > > Driver model does not use ACPI for U-Boot's configuration, but it is > > > convenient to have it support generation of ACPI tables for passing to > > > Linux, etc. > > > > > > As a starting point, add an optional set of ACPI operations to each > > > device. Initially only a single operation is available, to obtain the > > > ACPI name for the device. More operations are added later. > > > > > > Enable ACPI for sandbox to ensure build coverage and so that we can add > > > tests. > > > > > > > Both looks good to me now, thanks! > > > > > Reviewed-by: Bin Meng <bmeng.cn at gmail.com> > > > Reviewed-by: Wolfgang Wallner <wolfgang.wallner at br-automation.com> > > > Signed-off-by: Simon Glass <sjg at chromium.org> > > > --- > > > > > > Changes in v6: > > > - Use ACPI_NAME_LEN in acpi_copy_name since we add the nul anyway > > > > > > Changes in v5: > > > - Capitalise ACPI_OPS_PTR since it includes a comma > > > > > > Changes in v4: None > > > Changes in v3: > > > - Drop 'Intel' from 'Intel ACPI' > > > - Reword commit message to drop the bit about ACPI being complicated > > > - Compute ACPI_NAME_MAX from ACPI_NAME_LEN > > > - Rename acpi_return_name() to acpi_copy_name() > > > - Use strncpy() instead of strcpy() in acpi_copy_name() > > > > > > Changes in v2: > > > - Move LOGC_ACPI definition to this patch > > > > > > configs/tools-only_defconfig | 1 + > > > drivers/core/Kconfig | 9 +++++ > > > drivers/core/Makefile | 1 + > > > drivers/core/acpi.c | 33 ++++++++++++++++ > > > include/dm/acpi.h | 73 ++++++++++++++++++++++++++++++++++++ > > > include/dm/device.h | 5 +++ > > > include/log.h | 2 + > > > 7 files changed, 124 insertions(+) > > > create mode 100644 drivers/core/acpi.c > > > create mode 100644 include/dm/acpi.h > > Andy let me add your tag. > > Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com> Do you know what happened to this series? I only see 2 patches in this series showing up on the patchwork. http://patchwork.ozlabs.org/user/todo/uboot/?series=169449 Regards, Bin
Hi Simon, On Wed, Apr 15, 2020 at 10:31 PM Bin Meng <bmeng.cn at gmail.com> wrote: > > Hi Simon, > > On Fri, Apr 10, 2020 at 3:36 AM Simon Glass <sjg at chromium.org> wrote: > > > > On Thu, 9 Apr 2020 at 11:40, Andy Shevchenko > > <andriy.shevchenko at linux.intel.com> wrote: > > > > > > On Thu, Apr 09, 2020 at 10:27:38AM -0600, Simon Glass wrote: > > > > ACPI (Advanced Configuration and Power Interface) is a standard for > > > > specifying information about a platform. It is a little like device > > > > tree but the bindings are part of the specification and it supports an > > > > interpreted bytecode language. > > > > > > > > Driver model does not use ACPI for U-Boot's configuration, but it is > > > > convenient to have it support generation of ACPI tables for passing to > > > > Linux, etc. > > > > > > > > As a starting point, add an optional set of ACPI operations to each > > > > device. Initially only a single operation is available, to obtain the > > > > ACPI name for the device. More operations are added later. > > > > > > > > Enable ACPI for sandbox to ensure build coverage and so that we can add > > > > tests. > > > > > > > > > > Both looks good to me now, thanks! > > > > > > > Reviewed-by: Bin Meng <bmeng.cn at gmail.com> > > > > Reviewed-by: Wolfgang Wallner <wolfgang.wallner at br-automation.com> > > > > Signed-off-by: Simon Glass <sjg at chromium.org> > > > > --- > > > > > > > > Changes in v6: > > > > - Use ACPI_NAME_LEN in acpi_copy_name since we add the nul anyway > > > > > > > > Changes in v5: > > > > - Capitalise ACPI_OPS_PTR since it includes a comma > > > > > > > > Changes in v4: None > > > > Changes in v3: > > > > - Drop 'Intel' from 'Intel ACPI' > > > > - Reword commit message to drop the bit about ACPI being complicated > > > > - Compute ACPI_NAME_MAX from ACPI_NAME_LEN > > > > - Rename acpi_return_name() to acpi_copy_name() > > > > - Use strncpy() instead of strcpy() in acpi_copy_name() > > > > > > > > Changes in v2: > > > > - Move LOGC_ACPI definition to this patch > > > > > > > > configs/tools-only_defconfig | 1 + > > > > drivers/core/Kconfig | 9 +++++ > > > > drivers/core/Makefile | 1 + > > > > drivers/core/acpi.c | 33 ++++++++++++++++ > > > > include/dm/acpi.h | 73 ++++++++++++++++++++++++++++++++++++ > > > > include/dm/device.h | 5 +++ > > > > include/log.h | 2 + > > > > 7 files changed, 124 insertions(+) > > > > create mode 100644 drivers/core/acpi.c > > > > create mode 100644 include/dm/acpi.h > > > > Andy let me add your tag. > > > > Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com> > > Do you know what happened to this series? > > I only see 2 patches in this series showing up on the patchwork. > http://patchwork.ozlabs.org/user/todo/uboot/?series=169449 Or show I replace the 2 patches tagged as v6 in the v5 sereis? http://patchwork.ozlabs.org/user/todo/uboot/?series=169328 Regards, Bin
Hi Bin, On Wed, 15 Apr 2020 at 08:38, Bin Meng <bmeng.cn at gmail.com> wrote: > > Hi Simon, > > On Wed, Apr 15, 2020 at 10:31 PM Bin Meng <bmeng.cn at gmail.com> wrote: > > > > Hi Simon, > > > > On Fri, Apr 10, 2020 at 3:36 AM Simon Glass <sjg at chromium.org> wrote: > > > > > > On Thu, 9 Apr 2020 at 11:40, Andy Shevchenko > > > <andriy.shevchenko at linux.intel.com> wrote: > > > > > > > > On Thu, Apr 09, 2020 at 10:27:38AM -0600, Simon Glass wrote: > > > > > ACPI (Advanced Configuration and Power Interface) is a standard for > > > > > specifying information about a platform. It is a little like device > > > > > tree but the bindings are part of the specification and it supports an > > > > > interpreted bytecode language. > > > > > > > > > > Driver model does not use ACPI for U-Boot's configuration, but it is > > > > > convenient to have it support generation of ACPI tables for passing to > > > > > Linux, etc. > > > > > > > > > > As a starting point, add an optional set of ACPI operations to each > > > > > device. Initially only a single operation is available, to obtain the > > > > > ACPI name for the device. More operations are added later. > > > > > > > > > > Enable ACPI for sandbox to ensure build coverage and so that we can add > > > > > tests. > > > > > > > > > > > > > Both looks good to me now, thanks! > > > > > > > > > Reviewed-by: Bin Meng <bmeng.cn at gmail.com> > > > > > Reviewed-by: Wolfgang Wallner <wolfgang.wallner at br-automation.com> > > > > > Signed-off-by: Simon Glass <sjg at chromium.org> > > > > > --- > > > > > > > > > > Changes in v6: > > > > > - Use ACPI_NAME_LEN in acpi_copy_name since we add the nul anyway > > > > > > > > > > Changes in v5: > > > > > - Capitalise ACPI_OPS_PTR since it includes a comma > > > > > > > > > > Changes in v4: None > > > > > Changes in v3: > > > > > - Drop 'Intel' from 'Intel ACPI' > > > > > - Reword commit message to drop the bit about ACPI being complicated > > > > > - Compute ACPI_NAME_MAX from ACPI_NAME_LEN > > > > > - Rename acpi_return_name() to acpi_copy_name() > > > > > - Use strncpy() instead of strcpy() in acpi_copy_name() > > > > > > > > > > Changes in v2: > > > > > - Move LOGC_ACPI definition to this patch > > > > > > > > > > configs/tools-only_defconfig | 1 + > > > > > drivers/core/Kconfig | 9 +++++ > > > > > drivers/core/Makefile | 1 + > > > > > drivers/core/acpi.c | 33 ++++++++++++++++ > > > > > include/dm/acpi.h | 73 ++++++++++++++++++++++++++++++++++++ > > > > > include/dm/device.h | 5 +++ > > > > > include/log.h | 2 + > > > > > 7 files changed, 124 insertions(+) > > > > > create mode 100644 drivers/core/acpi.c > > > > > create mode 100644 include/dm/acpi.h > > > > > > Andy let me add your tag. > > > > > > Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com> > > > > Do you know what happened to this series? > > > > I only see 2 patches in this series showing up on the patchwork. > > http://patchwork.ozlabs.org/user/todo/uboot/?series=169449 > > Or show I replace the 2 patches tagged as v6 in the v5 sereis? > http://patchwork.ozlabs.org/user/todo/uboot/?series=169328 Yes that's right. I didn't send the whole thing again as there were just those two minor changes. Regards, Simon
On Fri, Apr 10, 2020 at 12:28 AM Simon Glass <sjg at chromium.org> wrote: > > ACPI (Advanced Configuration and Power Interface) is a standard for > specifying information about a platform. It is a little like device > tree but the bindings are part of the specification and it supports an > interpreted bytecode language. > > Driver model does not use ACPI for U-Boot's configuration, but it is > convenient to have it support generation of ACPI tables for passing to > Linux, etc. > > As a starting point, add an optional set of ACPI operations to each > device. Initially only a single operation is available, to obtain the > ACPI name for the device. More operations are added later. > > Enable ACPI for sandbox to ensure build coverage and so that we can add > tests. > > Reviewed-by: Bin Meng <bmeng.cn at gmail.com> > Reviewed-by: Wolfgang Wallner <wolfgang.wallner at br-automation.com> > Signed-off-by: Simon Glass <sjg at chromium.org> > --- > > Changes in v6: > - Use ACPI_NAME_LEN in acpi_copy_name since we add the nul anyway > > Changes in v5: > - Capitalise ACPI_OPS_PTR since it includes a comma > > Changes in v4: None > Changes in v3: > - Drop 'Intel' from 'Intel ACPI' > - Reword commit message to drop the bit about ACPI being complicated > - Compute ACPI_NAME_MAX from ACPI_NAME_LEN > - Rename acpi_return_name() to acpi_copy_name() > - Use strncpy() instead of strcpy() in acpi_copy_name() > > Changes in v2: > - Move LOGC_ACPI definition to this patch > > configs/tools-only_defconfig | 1 + > drivers/core/Kconfig | 9 +++++ > drivers/core/Makefile | 1 + > drivers/core/acpi.c | 33 ++++++++++++++++ > include/dm/acpi.h | 73 ++++++++++++++++++++++++++++++++++++ > include/dm/device.h | 5 +++ > include/log.h | 2 + > 7 files changed, 124 insertions(+) > create mode 100644 drivers/core/acpi.c > create mode 100644 include/dm/acpi.h > applied to u-boot-x86, thanks!
diff --git a/configs/tools-only_defconfig b/configs/tools-only_defconfig index 6ca50dc5fd3..2811b2cd37d 100644 --- a/configs/tools-only_defconfig +++ b/configs/tools-only_defconfig @@ -26,3 +26,4 @@ CONFIG_SYSRESET=y # CONFIG_VIRTIO_PCI is not set # CONFIG_VIRTIO_SANDBOX is not set # CONFIG_EFI_LOADER is not set +# CONFIG_ACPIGEN is not set diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig index 3b95b5387b9..a3b03993423 100644 --- a/drivers/core/Kconfig +++ b/drivers/core/Kconfig @@ -261,4 +261,13 @@ config DM_DEV_READ_INLINE bool default y if !OF_LIVE +config ACPIGEN + bool "Support ACPI table generation in driver model" + default y if SANDBOX || GENERATE_ACPI_TABLE + help + This option enables generation of ACPI tables using driver-model + devices. It adds a new operation struct to each driver, to support + things like generating device-specific tables and returning the ACPI + name of a device. + endmenu diff --git a/drivers/core/Makefile b/drivers/core/Makefile index bce7467da1d..c707026a3a0 100644 --- a/drivers/core/Makefile +++ b/drivers/core/Makefile @@ -3,6 +3,7 @@ # Copyright (c) 2013 Google, Inc obj-y += device.o fdtaddr.o lists.o root.o uclass.o util.o +obj-$(CONFIG_$(SPL_TPL_)ACPIGEN) += acpi.o obj-$(CONFIG_DEVRES) += devres.o obj-$(CONFIG_$(SPL_)DM_DEVICE_REMOVE) += device-remove.o obj-$(CONFIG_$(SPL_)SIMPLE_BUS) += simple-bus.o diff --git a/drivers/core/acpi.c b/drivers/core/acpi.c new file mode 100644 index 00000000000..ba50d688fef --- /dev/null +++ b/drivers/core/acpi.c @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Core driver model support for ACPI table generation + * + * Copyright 2019 Google LLC + * Written by Simon Glass <sjg at chromium.org> + */ + +#define LOG_CATEOGRY LOGC_ACPI + +#include <common.h> +#include <dm.h> +#include <dm/acpi.h> +#include <dm/root.h> + +int acpi_copy_name(char *out_name, const char *name) +{ + strncpy(out_name, name, ACPI_NAME_LEN); + out_name[ACPI_NAME_LEN] = '\0'; + + return 0; +} + +int acpi_get_name(const struct udevice *dev, char *out_name) +{ + struct acpi_ops *aops; + + aops = device_get_acpi_ops(dev); + if (aops && aops->get_name) + return aops->get_name(dev, out_name); + + return -ENOSYS; +} diff --git a/include/dm/acpi.h b/include/dm/acpi.h new file mode 100644 index 00000000000..ba0813fa21c --- /dev/null +++ b/include/dm/acpi.h @@ -0,0 +1,73 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Core ACPI (Advanced Configuration and Power Interface) support + * + * Copyright 2019 Google LLC + * Written by Simon Glass <sjg at chromium.org> + */ + +#ifndef __DM_ACPI_H__ +#define __DM_ACPI_H__ + +/* Allow operations to be optional for ACPI */ +#if CONFIG_IS_ENABLED(ACPIGEN) +#define ACPI_OPS_PTR(_ptr) .acpi_ops = _ptr, +#else +#define ACPI_OPS_PTR(_ptr) +#endif + +/* Length of an ACPI name string, excluding nul terminator */ +#define ACPI_NAME_LEN 4 + +/* Length of an ACPI name string including nul terminator */ +#define ACPI_NAME_MAX (ACPI_NAME_LEN + 1) + +/** + * struct acpi_ops - ACPI operations supported by driver model + */ +struct acpi_ops { + /** + * get_name() - Obtain the ACPI name of a device + * + * @dev: Device to check + * @out_name: Place to put the name, must hold at least ACPI_NAME_MAX + * bytes + * @return 0 if OK, -ENOENT if no name is available, other -ve value on + * other error + */ + int (*get_name)(const struct udevice *dev, char *out_name); +}; + +#define device_get_acpi_ops(dev) ((dev)->driver->acpi_ops) + +/** + * acpi_get_name() - Obtain the ACPI name of a device + * + * @dev: Device to check + * @out_name: Place to put the name, must hold at least ACPI_NAME_MAX + * bytes + * @return 0 if OK, -ENOENT if no name is available, other -ve value on + * other error + */ +int acpi_get_name(const struct udevice *dev, char *out_name); + +/** + * acpi_copy_name() - Copy an ACPI name to an output buffer + * + * This convenience function can be used to return a literal string as a name + * in functions that implement the get_name() method. + * + * For example: + * + * static int mydev_get_name(const struct udevice *dev, char *out_name) + * { + * return acpi_copy_name(out_name, "WIBB"); + * } + * + * @out_name: Place to put the name + * @name: Name to copy + * @return 0 (always) + */ +int acpi_copy_name(char *out_name, const char *name); + +#endif diff --git a/include/dm/device.h b/include/dm/device.h index a56164b19bb..35e19d87005 100644 --- a/include/dm/device.h +++ b/include/dm/device.h @@ -245,6 +245,8 @@ struct udevice_id { * pointers defined by the driver, to implement driver functions required by * the uclass. * @flags: driver flags - see DM_FLAGS_... + * @acpi_ops: Advanced Configuration and Power Interface (ACPI) operations, + * allowing the device to add things to the ACPI tables passed to Linux */ struct driver { char *name; @@ -264,6 +266,9 @@ struct driver { int per_child_platdata_auto_alloc_size; const void *ops; /* driver-specific operations */ uint32_t flags; +#if CONFIG_IS_ENABLED(ACPIGEN) + struct acpi_ops *acpi_ops; +#endif }; /* Declare a new U-Boot driver */ diff --git a/include/log.h b/include/log.h index 62fb8afbd0e..fbcbd42fb4b 100644 --- a/include/log.h +++ b/include/log.h @@ -51,6 +51,8 @@ enum log_category_t { LOGC_SANDBOX, /* Related to the sandbox board */ LOGC_BLOBLIST, /* Bloblist */ LOGC_DEVRES, /* Device resources (devres_... functions) */ + /* Advanced Configuration and Power Interface (ACPI) */ + LOGC_ACPI, LOGC_COUNT, /* Number of log categories */ LOGC_END, /* Sentinel value for a list of log categories */