Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / include / linux / sdb.h
diff --git a/kernel/include/linux/sdb.h b/kernel/include/linux/sdb.h
new file mode 100644 (file)
index 0000000..fbb76a4
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * 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__ */