13e240c602
Sooner or later, some board was going to need extra FW_CONFIG bits for a field that was already in production, so this patch adds support for adding extra (unused) bits to a field. The extra are appended via a syntax like: `field FIELD_NAME START0 END0 | START1 END1 | START2 END2 ...` and the suffixed bits are all treated as if they are contiguous when defining option values. BUG=b:185190978 TEST=Modified volteer fw_config to the following: field AUDIO 8 10 | 29 29 | 31 31 option NONE 0 option MAX98357_ALC5682I_I2S 1 option MAX98373_ALC5682I_I2S 2 option MAX98373_ALC5682_SNDW 3 option MAX98373_ALC5682I_I2S_UP4 4 option MAX98360_ALC5682I_I2S 5 option RT1011_ALC5682I_I2S 6 option AUDIO_FOO 7 option AUDIO_BAR 8 option AUDIO_QUUX 9 option AUDIO_BLAH1 10 option AUDIO_BLAH2 15 option AUDIO_BLAH3 16 option AUDIO_BLAH4 31 end which yielded (in static_fw_config.h): FW_CONFIG_FIELD_AUDIO_MASK 0xa0000700 FW_CONFIG_FIELD_AUDIO_OPTION_NONE_VALUE 0x0 FW_CONFIG_FIELD_AUDIO_OPTION_MAX98357_ALC5682I_I2S_VALUE 0x100 FW_CONFIG_FIELD_AUDIO_OPTION_MAX98373_ALC5682I_I2S_VALUE 0x200 FW_CONFIG_FIELD_AUDIO_OPTION_MAX98373_ALC5682_SNDW_VALUE 0x300 FW_CONFIG_FIELD_AUDIO_OPTION_MAX98373_ALC5682I_I2S_UP4_VALUE 0x400 FW_CONFIG_FIELD_AUDIO_OPTION_MAX98360_ALC5682I_I2S_VALUE 0x500 FW_CONFIG_FIELD_AUDIO_OPTION_RT1011_ALC5682I_I2S_VALUE 0x600 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_FOO_VALUE 0x700 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_BAR_VALUE 0x20000000 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_QUUX_VALUE 0x20000100 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_BLAH1_VALUE 0x20000200 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_BLAH2_VALUE 0x20000700 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_BLAH3_VALUE 0x80000000 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_BLAH4_VALUE 0xa0000700 Change-Id: I5ed76706347ee9642198efc77139abdc3af1b8a6 Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/52747 Reviewed-by: Duncan Laurie <duncan@iceblink.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
231 lines
5.5 KiB
C
231 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 pci_irq_info {
|
|
int ioapic_irq_pin;
|
|
int ioapic_dst_id;
|
|
};
|
|
|
|
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 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;
|
|
|
|
/* PCI IRQ info. */
|
|
struct pci_irq_info pci_irq_info[4];
|
|
|
|
/* 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;
|
|
|
|
/* 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;
|
|
|
|
/* 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_ioapic_info(struct bus *bus, int apicid, const char *_srcpin,
|
|
int irqpin);
|
|
|
|
void add_slot_desc(struct bus *bus, char *type, char *length, char *designation,
|
|
char *data_width);
|
|
|
|
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);
|