blob: cb8f7b36eff2d0953ff1163fa30ba7679e0391ae [file] [log] [blame]
Patrick Georgiea063cb2020-05-08 19:28:13 +02001/* sconfig, coreboot device tree compiler */
Patrick Georgi7333a112020-05-08 20:48:04 +02002/* SPDX-License-Identifier: GPL-2.0-only */
Patrick Georgi114e7b22010-05-05 11:19:50 +00003
Tim Wawrzynczak24b4af62020-10-01 15:41:31 -06004#include <stdint.h>
Patrick Georgi114e7b22010-05-05 11:19:50 +00005#include <stdio.h>
6#include <stdlib.h>
7#include <string.h>
8#include <sys/types.h>
Patrick Georgi114e7b22010-05-05 11:19:50 +00009#include <unistd.h>
10#include <errno.h>
11
Patrick Georgi114e7b22010-05-05 11:19:50 +000012struct resource;
13struct resource {
14 int type;
15 int index;
16 int base;
17 struct resource *next;
18};
19
20struct reg;
21struct reg {
22 char *key;
23 char *value;
24 struct reg *next;
25};
26
Duncan Laurie47b7b342020-05-15 15:39:08 -070027struct fw_config_option;
28struct fw_config_option {
29 const char *name;
Tim Wawrzynczak24b4af62020-10-01 15:41:31 -060030 uint64_t value;
Duncan Laurie47b7b342020-05-15 15:39:08 -070031 struct fw_config_option *next;
32};
Tim Wawrzynczak13e240c2021-04-28 14:03:07 -060033
34struct fw_config_field_bits;
35struct fw_config_field_bits {
36 unsigned int start_bit;
37 unsigned int end_bit;
38 struct fw_config_field_bits *next;
39};
40
Duncan Laurie47b7b342020-05-15 15:39:08 -070041struct fw_config_field;
42struct fw_config_field {
43 const char *name;
Tim Wawrzynczak13e240c2021-04-28 14:03:07 -060044 struct fw_config_field_bits *bits;
Duncan Laurie47b7b342020-05-15 15:39:08 -070045 struct fw_config_field *next;
46 struct fw_config_option *options;
47};
48struct fw_config_probe;
49struct fw_config_probe {
50 const char *field;
51 const char *option;
52 struct fw_config_probe *next;
53};
54
Nico Huberc0fc38e2022-08-06 19:02:59 +020055struct identifier {
56 const char *id;
57 struct identifier *next;
58};
59
Furquan Shaikhc56ae2f2018-05-31 10:33:16 -070060struct chip;
61struct chip_instance {
Furquan Shaikh4ebe9532020-05-02 15:34:42 -070062 /* Monotonically increasing ID for each chip instance. */
Furquan Shaikh79e84122018-05-30 15:09:09 -070063 int id;
64
Furquan Shaikhc56ae2f2018-05-31 10:33:16 -070065 /* Pointer to registers for this chip. */
66 struct reg *reg;
67
Nico Huber8e1ea522020-06-03 10:20:07 -070068 /* Pointer to references for this chip. */
69 struct reg *ref;
70
Furquan Shaikhc56ae2f2018-05-31 10:33:16 -070071 /* Pointer to chip of which this is instance. */
72 struct chip *chip;
73
74 /* Pointer to next instance of the same chip. */
75 struct chip_instance *next;
Furquan Shaikh27efc502018-06-22 09:19:15 -070076
77 /*
Furquan Shaikhbbade242020-05-02 16:05:29 -070078 * Pointer to corresponding chip instance in base devicetree.
79 * a) If the chip instance belongs to the base devicetree, then this pointer is set to
80 * NULL.
81 * b) If the chip instance belongs to override tree, then this pointer is set to its
82 * corresponding chip instance in base devicetree (if it exists), else to NULL.
83 *
84 * This is useful when generating chip instances and chip_ops for a device to determine
85 * if this is the instance to emit or if there is a base chip instance to use instead.
Furquan Shaikh27efc502018-06-22 09:19:15 -070086 */
Furquan Shaikhbbade242020-05-02 16:05:29 -070087 struct chip_instance *base_chip_instance;
Furquan Shaikhc56ae2f2018-05-31 10:33:16 -070088};
89
90struct chip {
Furquan Shaikh79e84122018-05-30 15:09:09 -070091 /* Indicates if chip header exists for this chip. */
92 int chiph_exists;
93
94 /* Name of current chip. */
95 char *name;
96
97 /* Name of current chip normalized to _. */
98 char *name_underscore;
99
Furquan Shaikhc56ae2f2018-05-31 10:33:16 -0700100 /* Pointer to first instance of this chip. */
101 struct chip_instance *instance;
Furquan Shaikh79e84122018-05-30 15:09:09 -0700102
103 /* Pointer to next chip. */
104 struct chip *next;
105};
106
Patrick Georgi114e7b22010-05-05 11:19:50 +0000107struct device;
Furquan Shaikh93198262018-06-03 04:22:17 -0700108struct bus {
109 /* Instance/ID of the bus under the device. */
Patrick Georgi114e7b22010-05-05 11:19:50 +0000110 int id;
Furquan Shaikh93198262018-06-03 04:22:17 -0700111
112 /* Pointer to device to which this bus belongs. */
113 struct device *dev;
114
115 /* Pointer to list of children. */
116 struct device *children;
117
118 /* Pointer to next bus for the device. */
119 struct bus *next_bus;
120};
121
122struct device {
Hung-Te Lin936dbe12018-09-10 10:51:26 +0800123 /* Indicates device status (enabled / hidden or not). */
Patrick Georgi114e7b22010-05-05 11:19:50 +0000124 int enabled;
Hung-Te Lin936dbe12018-09-10 10:51:26 +0800125 int hidden;
Ronald G. Minnich466ca2c2019-10-22 02:02:24 +0000126 /* non-zero if the device should be included in all cases */
127 int mandatory;
Furquan Shaikh93198262018-06-03 04:22:17 -0700128
Furquan Shaikh93198262018-06-03 04:22:17 -0700129 /* Subsystem IDs for the device. */
Sven Schnelle270a9082011-03-01 19:58:15 +0000130 int subsystem_vendor;
131 int subsystem_device;
132 int inherit_subsystem;
Furquan Shaikh93198262018-06-03 04:22:17 -0700133
Furquan Shaikh93198262018-06-03 04:22:17 -0700134 /* Name of this device. */
Patrick Georgi114e7b22010-05-05 11:19:50 +0000135 char *name;
Furquan Shaikh93198262018-06-03 04:22:17 -0700136
Nico Huber8e1ea522020-06-03 10:20:07 -0700137 /* Alias of this device (for internal references) */
138 char *alias;
139
Furquan Shaikh93198262018-06-03 04:22:17 -0700140 /* Path of this device. */
Patrick Georgi114e7b22010-05-05 11:19:50 +0000141 char *path;
142 int path_a;
143 int path_b;
Furquan Shaikh93198262018-06-03 04:22:17 -0700144
145 /* Type of bus that exists under this device. */
Patrick Georgi114e7b22010-05-05 11:19:50 +0000146 int bustype;
Furquan Shaikh93198262018-06-03 04:22:17 -0700147
Furquan Shaikh93198262018-06-03 04:22:17 -0700148 /* Pointer to bus of parent on which this device resides. */
149 struct bus *parent;
150
151 /* Pointer to next child under the same parent. */
Patrick Georgi114e7b22010-05-05 11:19:50 +0000152 struct device *sibling;
Furquan Shaikh93198262018-06-03 04:22:17 -0700153
154 /* Pointer to resources for this device. */
Patrick Georgi114e7b22010-05-05 11:19:50 +0000155 struct resource *res;
Furquan Shaikh79e84122018-05-30 15:09:09 -0700156
Furquan Shaikh93198262018-06-03 04:22:17 -0700157 /* Pointer to chip instance for this device. */
Furquan Shaikhc56ae2f2018-05-31 10:33:16 -0700158 struct chip_instance *chip_instance;
Furquan Shaikh93198262018-06-03 04:22:17 -0700159
160 /* Pointer to list of buses under this device. */
161 struct bus *bus;
162 /* Pointer to last bus under this device. */
163 struct bus *last_bus;
Patrick Rudolphac24d3c2019-04-12 14:42:17 +0200164
Nico Huberc0fc38e2022-08-06 19:02:59 +0200165 /* Global identifier of the ops for this device. */
166 char *ops_id;
167
Patrick Rudolphac24d3c2019-04-12 14:42:17 +0200168 /* SMBIOS slot type */
169 char *smbios_slot_type;
170
171 /* SMBIOS slot data width */
172 char *smbios_slot_data_width;
173
174 /* SMBIOS slot description for reference designation */
175 char *smbios_slot_designation;
176
177 /* SMBIOS slot length */
178 char *smbios_slot_length;
Duncan Laurie47b7b342020-05-15 15:39:08 -0700179
Angel Pons437da712021-09-03 16:51:40 +0200180 /* SMBIOS type41 fields */
181 int smbios_instance_id_valid;
182 unsigned int smbios_instance_id;
183 const char *smbios_refdes;
184
Duncan Laurie47b7b342020-05-15 15:39:08 -0700185 /* List of field+option to probe. */
186 struct fw_config_probe *probe;
Patrick Georgi114e7b22010-05-05 11:19:50 +0000187};
188
Furquan Shaikh93198262018-06-03 04:22:17 -0700189extern struct bus *root_parent;
Patrick Georgi114e7b22010-05-05 11:19:50 +0000190
Duncan Lauriee335c2e2020-07-29 16:28:43 -0700191struct device *new_device_raw(struct bus *parent,
192 struct chip_instance *chip_instance,
193 const int bustype, const char *devnum,
194 char *alias, int status);
195
196struct device *new_device_reference(struct bus *parent,
197 struct chip_instance *chip_instance,
198 const char *reference, int status);
Furquan Shaikh93198262018-06-03 04:22:17 -0700199
200void add_resource(struct bus *bus, int type, int index, int base);
201
202void add_pci_subsystem_ids(struct bus *bus, int vendor, int device,
Martin Rothbec07532016-08-05 18:32:18 -0600203 int inherit);
Furquan Shaikh93198262018-06-03 04:22:17 -0700204
Patrick Rudolphac24d3c2019-04-12 14:42:17 +0200205void add_slot_desc(struct bus *bus, char *type, char *length, char *designation,
206 char *data_width);
207
Angel Pons437da712021-09-03 16:51:40 +0200208void add_smbios_dev_info(struct bus *bus, long instance_id, const char *refdes);
209
Stefan Reinauer2e78aa52016-05-07 01:11:14 -0700210void yyrestart(FILE *input_file);
Furquan Shaikh79e84122018-05-30 15:09:09 -0700211
212/* Add chip data to tail of queue. */
213void chip_enqueue_tail(void *data);
214
215/* Retrieve chip data from tail of queue. */
216void *chip_dequeue_tail(void);
Furquan Shaikhc56ae2f2018-05-31 10:33:16 -0700217
218struct chip_instance *new_chip_instance(char *path);
219void add_register(struct chip_instance *chip, char *name, char *val);
Nico Huber8e1ea522020-06-03 10:20:07 -0700220void add_reference(struct chip_instance *chip, char *name, char *alias);
Duncan Laurie47b7b342020-05-15 15:39:08 -0700221
222struct fw_config_field *get_fw_config_field(const char *name);
223
Tim Wawrzynczak13e240c2021-04-28 14:03:07 -0600224void add_fw_config_field_bits(struct fw_config_field *field,
225 unsigned int start_bit, unsigned int end_bit);
226
227struct fw_config_field *new_fw_config_field(const char *name, struct fw_config_field_bits *bits);
Duncan Laurie47b7b342020-05-15 15:39:08 -0700228
229void add_fw_config_option(struct fw_config_field *field, const char *name,
Tim Wawrzynczak24b4af62020-10-01 15:41:31 -0600230 uint64_t value);
Duncan Laurie47b7b342020-05-15 15:39:08 -0700231
232void add_fw_config_probe(struct bus *bus, const char *field, const char *option);
Tim Wawrzynczak13e240c2021-04-28 14:03:07 -0600233
234void append_fw_config_bits(struct fw_config_field_bits **bits,
235 unsigned int start_bit, unsigned int end_bit);
Nico Huberc0fc38e2022-08-06 19:02:59 +0200236
237void add_device_ops(struct bus *, char *ops_id);