acpi: Add a method to write tables for a device
[oweals/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  * @current: Current address for writing
33  */
34 struct acpi_ctx {
35         void *current;
36 };
37
38 /**
39  * struct acpi_ops - ACPI operations supported by driver model
40  */
41 struct acpi_ops {
42         /**
43          * get_name() - Obtain the ACPI name of a device
44          *
45          * @dev: Device to check
46          * @out_name: Place to put the name, must hold at least ACPI_NAME_MAX
47          *      bytes
48          * @return 0 if OK, -ENOENT if no name is available, other -ve value on
49          *      other error
50          */
51         int (*get_name)(const struct udevice *dev, char *out_name);
52
53         /**
54          * write_tables() - Write out any tables required by this device
55          *
56          * @dev: Device to write
57          * @ctx: ACPI context to use
58          * @return 0 if OK, -ve on error
59          */
60         int (*write_tables)(const struct udevice *dev, struct acpi_ctx *ctx);
61 };
62
63 #define device_get_acpi_ops(dev)        ((dev)->driver->acpi_ops)
64
65 /**
66  * acpi_get_name() - Obtain the ACPI name of a device
67  *
68  * @dev: Device to check
69  * @out_name: Place to put the name, must hold at least ACPI_NAME_MAX
70  *      bytes
71  * @return 0 if OK, -ENOENT if no name is available, other -ve value on
72  *      other error
73  */
74 int acpi_get_name(const struct udevice *dev, char *out_name);
75
76 /**
77  * acpi_copy_name() - Copy an ACPI name to an output buffer
78  *
79  * This convenience function can be used to return a literal string as a name
80  * in functions that implement the get_name() method.
81  *
82  * For example:
83  *
84  *      static int mydev_get_name(const struct udevice *dev, char *out_name)
85  *      {
86  *              return acpi_copy_name(out_name, "WIBB");
87  *      }
88  *
89  * @out_name: Place to put the name
90  * @name: Name to copy
91  * @return 0 (always)
92  */
93 int acpi_copy_name(char *out_name, const char *name);
94
95 /**
96  * acpi_write_dev_tables() - Write ACPI tables required by devices
97  *
98  * This scans through all devices and tells them to write any tables they want
99  * to write.
100  *
101  * @return 0 if OK, -ve if any device returned an error
102  */
103 int acpi_write_dev_tables(struct acpi_ctx *ctx);
104
105 #endif /* __ACPI__ */
106
107 #endif