acpi: Support generation of ACPI code
[platform/kernel/u-boot.git] / include / dm / acpi.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Core ACPI (Advanced Configuration and Power Interface) support
4  *
5  * Copyright 2019 Google LLC
6  * Written by Simon Glass <sjg@chromium.org>
7  */
8
9 #ifndef __DM_ACPI_H__
10 #define __DM_ACPI_H__
11
12 /* Allow operations to be optional for ACPI */
13 #if CONFIG_IS_ENABLED(ACPIGEN)
14 #define ACPI_OPS_PTR(_ptr)      .acpi_ops       = _ptr,
15 #else
16 #define ACPI_OPS_PTR(_ptr)
17 #endif
18
19 /* Length of an ACPI name string, excluding nul terminator */
20 #define ACPI_NAME_LEN   4
21
22 /* Length of an ACPI name string including nul terminator */
23 #define ACPI_NAME_MAX   (ACPI_NAME_LEN + 1)
24
25 #if !defined(__ACPI__)
26
27 /**
28  * struct acpi_ctx - Context used for writing ACPI tables
29  *
30  * This contains a few useful pieces of information used when writing
31  *
32  * @base: Base address of ACPI tables
33  * @current: Current address for writing
34  * @rsdp: Pointer to the Root System Description Pointer, typically used when
35  *      adding a new table. The RSDP holds pointers to the RSDT and XSDT.
36  * @rsdt: Pointer to the Root System Description Table
37  * @xsdt: Pointer to the Extended System Description Table
38  */
39 struct acpi_ctx {
40         void *base;
41         void *current;
42         struct acpi_rsdp *rsdp;
43         struct acpi_rsdt *rsdt;
44         struct acpi_xsdt *xsdt;
45 };
46
47 /**
48  * struct acpi_ops - ACPI operations supported by driver model
49  */
50 struct acpi_ops {
51         /**
52          * get_name() - Obtain the ACPI name of a device
53          *
54          * @dev: Device to check
55          * @out_name: Place to put the name, must hold at least ACPI_NAME_MAX
56          *      bytes
57          * @return 0 if OK, -ENOENT if no name is available, other -ve value on
58          *      other error
59          */
60         int (*get_name)(const struct udevice *dev, char *out_name);
61
62         /**
63          * write_tables() - Write out any tables required by this device
64          *
65          * @dev: Device to write
66          * @ctx: ACPI context to use
67          * @return 0 if OK, -ve on error
68          */
69         int (*write_tables)(const struct udevice *dev, struct acpi_ctx *ctx);
70 };
71
72 #define device_get_acpi_ops(dev)        ((dev)->driver->acpi_ops)
73
74 /**
75  * acpi_get_name() - Obtain the ACPI name of a device
76  *
77  * @dev: Device to check
78  * @out_name: Place to put the name, must hold at least ACPI_NAME_MAX
79  *      bytes
80  * @return 0 if OK, -ENOENT if no name is available, other -ve value on
81  *      other error
82  */
83 int acpi_get_name(const struct udevice *dev, char *out_name);
84
85 /**
86  * acpi_copy_name() - Copy an ACPI name to an output buffer
87  *
88  * This convenience function can be used to return a literal string as a name
89  * in functions that implement the get_name() method.
90  *
91  * For example:
92  *
93  *      static int mydev_get_name(const struct udevice *dev, char *out_name)
94  *      {
95  *              return acpi_copy_name(out_name, "WIBB");
96  *      }
97  *
98  * @out_name: Place to put the name
99  * @name: Name to copy
100  * @return 0 (always)
101  */
102 int acpi_copy_name(char *out_name, const char *name);
103
104 /**
105  * acpi_write_dev_tables() - Write ACPI tables required by devices
106  *
107  * This scans through all devices and tells them to write any tables they want
108  * to write.
109  *
110  * @return 0 if OK, -ve if any device returned an error
111  */
112 int acpi_write_dev_tables(struct acpi_ctx *ctx);
113
114 #endif /* __ACPI__ */
115
116 #endif