160 lines
		
	
	
	
		
			4.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			160 lines
		
	
	
	
		
			4.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * 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__ */
							 |