161 lines
4.2 KiB
C
161 lines
4.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* This is the official version 1.1 of sdb.h
|
|
*/
|
|
#ifndef __SDB_H__
|
|
#define __SDB_H__
|
|
#ifdef __KERNEL__
|
|
#include <linux/types.h>
|
|
#else
|
|
#include <stdint.h>
|
|
#endif
|
|
|
|
/*
|
|
* All structures are 64 bytes long and are expected
|
|
* to live in an array, one for each interconnect.
|
|
* Most fields of the structures are shared among the
|
|
* various types, and most-specific fields are at the
|
|
* beginning (for alignment reasons, and to keep the
|
|
* magic number at the head of the interconnect record
|
|
*/
|
|
|
|
/* Product, 40 bytes at offset 24, 8-byte aligned
|
|
*
|
|
* device_id is vendor-assigned; version is device-specific,
|
|
* date is hex (e.g 0x20120501), name is UTF-8, blank-filled
|
|
* and not terminated with a 0 byte.
|
|
*/
|
|
struct sdb_product {
|
|
uint64_t vendor_id; /* 0x18..0x1f */
|
|
uint32_t device_id; /* 0x20..0x23 */
|
|
uint32_t version; /* 0x24..0x27 */
|
|
uint32_t date; /* 0x28..0x2b */
|
|
uint8_t name[19]; /* 0x2c..0x3e */
|
|
uint8_t record_type; /* 0x3f */
|
|
};
|
|
|
|
/*
|
|
* Component, 56 bytes at offset 8, 8-byte aligned
|
|
*
|
|
* The address range is first to last, inclusive
|
|
* (for example 0x100000 - 0x10ffff)
|
|
*/
|
|
struct sdb_component {
|
|
uint64_t addr_first; /* 0x08..0x0f */
|
|
uint64_t addr_last; /* 0x10..0x17 */
|
|
struct sdb_product product; /* 0x18..0x3f */
|
|
};
|
|
|
|
/* Type of the SDB record */
|
|
enum sdb_record_type {
|
|
sdb_type_interconnect = 0x00,
|
|
sdb_type_device = 0x01,
|
|
sdb_type_bridge = 0x02,
|
|
sdb_type_integration = 0x80,
|
|
sdb_type_repo_url = 0x81,
|
|
sdb_type_synthesis = 0x82,
|
|
sdb_type_empty = 0xFF,
|
|
};
|
|
|
|
/* Type 0: interconnect (first of the array)
|
|
*
|
|
* sdb_records is the length of the table including this first
|
|
* record, version is 1. The bus type is enumerated later.
|
|
*/
|
|
#define SDB_MAGIC 0x5344422d /* "SDB-" */
|
|
struct sdb_interconnect {
|
|
uint32_t sdb_magic; /* 0x00-0x03 */
|
|
uint16_t sdb_records; /* 0x04-0x05 */
|
|
uint8_t sdb_version; /* 0x06 */
|
|
uint8_t sdb_bus_type; /* 0x07 */
|
|
struct sdb_component sdb_component; /* 0x08-0x3f */
|
|
};
|
|
|
|
/* Type 1: device
|
|
*
|
|
* class is 0 for "custom device", other values are
|
|
* to be standardized; ABI version is for the driver,
|
|
* bus-specific bits are defined by each bus (see below)
|
|
*/
|
|
struct sdb_device {
|
|
uint16_t abi_class; /* 0x00-0x01 */
|
|
uint8_t abi_ver_major; /* 0x02 */
|
|
uint8_t abi_ver_minor; /* 0x03 */
|
|
uint32_t bus_specific; /* 0x04-0x07 */
|
|
struct sdb_component sdb_component; /* 0x08-0x3f */
|
|
};
|
|
|
|
/* Type 2: bridge
|
|
*
|
|
* child is the address of the nested SDB table
|
|
*/
|
|
struct sdb_bridge {
|
|
uint64_t sdb_child; /* 0x00-0x07 */
|
|
struct sdb_component sdb_component; /* 0x08-0x3f */
|
|
};
|
|
|
|
/* Type 0x80: integration
|
|
*
|
|
* all types with bit 7 set are meta-information, so
|
|
* software can ignore the types it doesn't know. Here we
|
|
* just provide product information for an aggregate device
|
|
*/
|
|
struct sdb_integration {
|
|
uint8_t reserved[24]; /* 0x00-0x17 */
|
|
struct sdb_product product; /* 0x08-0x3f */
|
|
};
|
|
|
|
/* Type 0x81: Top module repository url
|
|
*
|
|
* again, an informative field that software can ignore
|
|
*/
|
|
struct sdb_repo_url {
|
|
uint8_t repo_url[63]; /* 0x00-0x3e */
|
|
uint8_t record_type; /* 0x3f */
|
|
};
|
|
|
|
/* Type 0x82: Synthesis tool information
|
|
*
|
|
* this informative record
|
|
*/
|
|
struct sdb_synthesis {
|
|
uint8_t syn_name[16]; /* 0x00-0x0f */
|
|
uint8_t commit_id[16]; /* 0x10-0x1f */
|
|
uint8_t tool_name[8]; /* 0x20-0x27 */
|
|
uint32_t tool_version; /* 0x28-0x2b */
|
|
uint32_t date; /* 0x2c-0x2f */
|
|
uint8_t user_name[15]; /* 0x30-0x3e */
|
|
uint8_t record_type; /* 0x3f */
|
|
};
|
|
|
|
/* Type 0xff: empty
|
|
*
|
|
* this allows keeping empty slots during development,
|
|
* so they can be filled later with minimal efforts and
|
|
* no misleading description is ever shipped -- hopefully.
|
|
* It can also be used to pad a table to a desired length.
|
|
*/
|
|
struct sdb_empty {
|
|
uint8_t reserved[63]; /* 0x00-0x3e */
|
|
uint8_t record_type; /* 0x3f */
|
|
};
|
|
|
|
/* The type of bus, for bus-specific flags */
|
|
enum sdb_bus_type {
|
|
sdb_wishbone = 0x00,
|
|
sdb_data = 0x01,
|
|
};
|
|
|
|
#define SDB_WB_WIDTH_MASK 0x0f
|
|
#define SDB_WB_ACCESS8 0x01
|
|
#define SDB_WB_ACCESS16 0x02
|
|
#define SDB_WB_ACCESS32 0x04
|
|
#define SDB_WB_ACCESS64 0x08
|
|
#define SDB_WB_LITTLE_ENDIAN 0x80
|
|
|
|
#define SDB_DATA_READ 0x04
|
|
#define SDB_DATA_WRITE 0x02
|
|
#define SDB_DATA_EXEC 0x01
|
|
|
|
#endif /* __SDB_H__ */
|