| /* sconfig, coreboot device tree compiler */ |
| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <sys/types.h> |
| #include <unistd.h> |
| #include <errno.h> |
| |
| struct resource; |
| struct resource { |
| int type; |
| int index; |
| int base; |
| struct resource *next; |
| }; |
| |
| struct reg; |
| struct reg { |
| char *key; |
| char *value; |
| struct reg *next; |
| }; |
| |
| struct fw_config_option; |
| struct fw_config_option { |
| const char *name; |
| uint64_t value; |
| struct fw_config_option *next; |
| }; |
| |
| struct fw_config_field_bits; |
| struct fw_config_field_bits { |
| unsigned int start_bit; |
| unsigned int end_bit; |
| struct fw_config_field_bits *next; |
| }; |
| |
| struct fw_config_field; |
| struct fw_config_field { |
| const char *name; |
| struct fw_config_field_bits *bits; |
| struct fw_config_field *next; |
| struct fw_config_option *options; |
| }; |
| struct fw_config_probe; |
| struct fw_config_probe { |
| const char *field; |
| const char *option; |
| struct fw_config_probe *next; |
| }; |
| |
| struct identifier { |
| const char *id; |
| struct identifier *next; |
| }; |
| |
| struct chip; |
| struct chip_instance { |
| /* Monotonically increasing ID for each chip instance. */ |
| int id; |
| |
| /* Pointer to registers for this chip. */ |
| struct reg *reg; |
| |
| /* Pointer to references for this chip. */ |
| struct reg *ref; |
| |
| /* Pointer to chip of which this is instance. */ |
| struct chip *chip; |
| |
| /* Pointer to next instance of the same chip. */ |
| struct chip_instance *next; |
| |
| /* |
| * Pointer to corresponding chip instance in base devicetree. |
| * a) If the chip instance belongs to the base devicetree, then this pointer is set to |
| * NULL. |
| * b) If the chip instance belongs to override tree, then this pointer is set to its |
| * corresponding chip instance in base devicetree (if it exists), else to NULL. |
| * |
| * This is useful when generating chip instances and chip_ops for a device to determine |
| * if this is the instance to emit or if there is a base chip instance to use instead. |
| */ |
| struct chip_instance *base_chip_instance; |
| }; |
| |
| struct chip { |
| /* Indicates if chip header exists for this chip. */ |
| int chiph_exists; |
| |
| /* Name of current chip. */ |
| char *name; |
| |
| /* Name of current chip normalized to _. */ |
| char *name_underscore; |
| |
| /* Pointer to first instance of this chip. */ |
| struct chip_instance *instance; |
| |
| /* Pointer to next chip. */ |
| struct chip *next; |
| }; |
| |
| struct device; |
| struct bus { |
| /* Instance/ID of the bus under the device. */ |
| int id; |
| |
| /* Pointer to device to which this bus belongs. */ |
| struct device *dev; |
| |
| /* Pointer to list of children. */ |
| struct device *children; |
| |
| /* Pointer to next bus for the device. */ |
| struct bus *next_bus; |
| }; |
| |
| struct device { |
| /* Indicates device status (enabled / hidden or not). */ |
| int enabled; |
| int hidden; |
| /* non-zero if the device should be included in all cases */ |
| int mandatory; |
| |
| /* Subsystem IDs for the device. */ |
| int subsystem_vendor; |
| int subsystem_device; |
| int inherit_subsystem; |
| |
| /* Name of this device. */ |
| char *name; |
| |
| /* Alias of this device (for internal references) */ |
| char *alias; |
| |
| /* Path of this device. */ |
| char *path; |
| int path_a; |
| int path_b; |
| |
| /* Type of bus that exists under this device. */ |
| int bustype; |
| |
| /* Pointer to bus of parent on which this device resides. */ |
| struct bus *parent; |
| |
| /* Pointer to next child under the same parent. */ |
| struct device *sibling; |
| |
| /* Pointer to resources for this device. */ |
| struct resource *res; |
| |
| /* Pointer to chip instance for this device. */ |
| struct chip_instance *chip_instance; |
| |
| /* Pointer to list of buses under this device. */ |
| struct bus *bus; |
| /* Pointer to last bus under this device. */ |
| struct bus *last_bus; |
| |
| /* Global identifier of the ops for this device. */ |
| char *ops_id; |
| |
| /* SMBIOS slot type */ |
| char *smbios_slot_type; |
| |
| /* SMBIOS slot data width */ |
| char *smbios_slot_data_width; |
| |
| /* SMBIOS slot description for reference designation */ |
| char *smbios_slot_designation; |
| |
| /* SMBIOS slot length */ |
| char *smbios_slot_length; |
| |
| /* SMBIOS type41 fields */ |
| int smbios_instance_id_valid; |
| unsigned int smbios_instance_id; |
| const char *smbios_refdes; |
| |
| /* List of field+option to probe. */ |
| struct fw_config_probe *probe; |
| }; |
| |
| extern struct bus *root_parent; |
| |
| struct device *new_device_raw(struct bus *parent, |
| struct chip_instance *chip_instance, |
| const int bustype, const char *devnum, |
| char *alias, int status); |
| |
| struct device *new_device_reference(struct bus *parent, |
| struct chip_instance *chip_instance, |
| const char *reference, int status); |
| |
| void add_resource(struct bus *bus, int type, int index, int base); |
| |
| void add_pci_subsystem_ids(struct bus *bus, int vendor, int device, |
| int inherit); |
| |
| void add_slot_desc(struct bus *bus, char *type, char *length, char *designation, |
| char *data_width); |
| |
| void add_smbios_dev_info(struct bus *bus, long instance_id, const char *refdes); |
| |
| void yyrestart(FILE *input_file); |
| |
| /* Add chip data to tail of queue. */ |
| void chip_enqueue_tail(void *data); |
| |
| /* Retrieve chip data from tail of queue. */ |
| void *chip_dequeue_tail(void); |
| |
| struct chip_instance *new_chip_instance(char *path); |
| void add_register(struct chip_instance *chip, char *name, char *val); |
| void add_reference(struct chip_instance *chip, char *name, char *alias); |
| |
| struct fw_config_field *get_fw_config_field(const char *name); |
| |
| void add_fw_config_field_bits(struct fw_config_field *field, |
| unsigned int start_bit, unsigned int end_bit); |
| |
| struct fw_config_field *new_fw_config_field(const char *name, struct fw_config_field_bits *bits); |
| |
| void add_fw_config_option(struct fw_config_field *field, const char *name, |
| uint64_t value); |
| |
| void add_fw_config_probe(struct bus *bus, const char *field, const char *option); |
| |
| void append_fw_config_bits(struct fw_config_field_bits **bits, |
| unsigned int start_bit, unsigned int end_bit); |
| |
| void add_device_ops(struct bus *, char *ops_id); |