230 lines
5.5 KiB
C
230 lines
5.5 KiB
C
/* 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 {
|
|
/* Pointer to device to which this bus belongs. */
|
|
struct device *dev;
|
|
|
|
/* Pointer to list of children. */
|
|
struct device *children;
|
|
};
|
|
|
|
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 the bus under this device. */
|
|
struct bus *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);
|