u-boot-brain/include/dm/acpi.h
Simon Glass 61cc93396a acpi: Support generation of ACPI code
Add a new file to handle generating ACPI code programatically. This is
used when information must be dynamically added to the tables, e.g. the
SSDT.

Initial support is just for writing simple values. Also add a 'base' value
so that the table can be freed. This likely doesn't happen in normal code,
but is nice to do in tests.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
2020-07-17 14:32:24 +08:00

117 lines
3.0 KiB
C

/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Core ACPI (Advanced Configuration and Power Interface) support
*
* Copyright 2019 Google LLC
* Written by Simon Glass <sjg@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)
#if !defined(__ACPI__)
/**
* struct acpi_ctx - Context used for writing ACPI tables
*
* This contains a few useful pieces of information used when writing
*
* @base: Base address of ACPI tables
* @current: Current address for writing
* @rsdp: Pointer to the Root System Description Pointer, typically used when
* adding a new table. The RSDP holds pointers to the RSDT and XSDT.
* @rsdt: Pointer to the Root System Description Table
* @xsdt: Pointer to the Extended System Description Table
*/
struct acpi_ctx {
void *base;
void *current;
struct acpi_rsdp *rsdp;
struct acpi_rsdt *rsdt;
struct acpi_xsdt *xsdt;
};
/**
* 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);
/**
* write_tables() - Write out any tables required by this device
*
* @dev: Device to write
* @ctx: ACPI context to use
* @return 0 if OK, -ve on error
*/
int (*write_tables)(const struct udevice *dev, struct acpi_ctx *ctx);
};
#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);
/**
* acpi_write_dev_tables() - Write ACPI tables required by devices
*
* This scans through all devices and tells them to write any tables they want
* to write.
*
* @return 0 if OK, -ve if any device returned an error
*/
int acpi_write_dev_tables(struct acpi_ctx *ctx);
#endif /* __ACPI__ */
#endif