cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

device_tree.h (8857B)


      1/*
      2 * Header with function prototypes to help device tree manipulation using
      3 * libfdt. It also provides functions to read entries from device tree proc
      4 * interface.
      5 *
      6 * Copyright 2008 IBM Corporation.
      7 * Authors: Jerone Young <jyoung5@us.ibm.com>
      8 *          Hollis Blanchard <hollisb@us.ibm.com>
      9 *
     10 * This work is licensed under the GNU GPL license version 2 or later.
     11 *
     12 */
     13
     14#ifndef DEVICE_TREE_H
     15#define DEVICE_TREE_H
     16
     17void *create_device_tree(int *sizep);
     18void *load_device_tree(const char *filename_path, int *sizep);
     19#ifdef CONFIG_LINUX
     20/**
     21 * load_device_tree_from_sysfs: reads the device tree information in the
     22 * /proc/device-tree directory and return the corresponding binary blob
     23 * buffer pointer. Asserts in case of error.
     24 */
     25void *load_device_tree_from_sysfs(void);
     26#endif
     27
     28/**
     29 * qemu_fdt_node_path: return the paths of nodes matching a given
     30 * name and compat string
     31 * @fdt: pointer to the dt blob
     32 * @name: node name
     33 * @compat: compatibility string
     34 * @errp: handle to an error object
     35 *
     36 * returns a newly allocated NULL-terminated array of node paths.
     37 * Use g_strfreev() to free it. If one or more nodes were found, the
     38 * array contains the path of each node and the last element equals to
     39 * NULL. If there is no error but no matching node was found, the
     40 * returned array contains a single element equal to NULL. If an error
     41 * was encountered when parsing the blob, the function returns NULL
     42 *
     43 * @name may be NULL to wildcard names and only match compatibility
     44 * strings.
     45 */
     46char **qemu_fdt_node_path(void *fdt, const char *name, const char *compat,
     47                          Error **errp);
     48
     49/**
     50 * qemu_fdt_node_unit_path: return the paths of nodes matching a given
     51 * node-name, ie. node-name and node-name@unit-address
     52 * @fdt: pointer to the dt blob
     53 * @name: node name
     54 * @errp: handle to an error object
     55 *
     56 * returns a newly allocated NULL-terminated array of node paths.
     57 * Use g_strfreev() to free it. If one or more nodes were found, the
     58 * array contains the path of each node and the last element equals to
     59 * NULL. If there is no error but no matching node was found, the
     60 * returned array contains a single element equal to NULL. If an error
     61 * was encountered when parsing the blob, the function returns NULL
     62 */
     63char **qemu_fdt_node_unit_path(void *fdt, const char *name, Error **errp);
     64
     65int qemu_fdt_setprop(void *fdt, const char *node_path,
     66                     const char *property, const void *val, int size);
     67int qemu_fdt_setprop_cell(void *fdt, const char *node_path,
     68                          const char *property, uint32_t val);
     69int qemu_fdt_setprop_u64(void *fdt, const char *node_path,
     70                         const char *property, uint64_t val);
     71int qemu_fdt_setprop_string(void *fdt, const char *node_path,
     72                            const char *property, const char *string);
     73
     74/**
     75 * qemu_fdt_setprop_string_array: set a string array property
     76 *
     77 * @fdt: pointer to the dt blob
     78 * @name: node name
     79 * @prop: property array
     80 * @array: pointer to an array of string pointers
     81 * @len: length of array
     82 *
     83 * assigns a string array to a property. This function converts and
     84 * array of strings to a sequential string with \0 separators before
     85 * setting the property.
     86 */
     87int qemu_fdt_setprop_string_array(void *fdt, const char *node_path,
     88                                  const char *prop, char **array, int len);
     89
     90int qemu_fdt_setprop_phandle(void *fdt, const char *node_path,
     91                             const char *property,
     92                             const char *target_node_path);
     93/**
     94 * qemu_fdt_getprop: retrieve the value of a given property
     95 * @fdt: pointer to the device tree blob
     96 * @node_path: node path
     97 * @property: name of the property to find
     98 * @lenp: fdt error if any or length of the property on success
     99 * @errp: handle to an error object
    100 *
    101 * returns a pointer to the property on success and NULL on failure
    102 */
    103const void *qemu_fdt_getprop(void *fdt, const char *node_path,
    104                             const char *property, int *lenp,
    105                             Error **errp);
    106/**
    107 * qemu_fdt_getprop_cell: retrieve the value of a given 4 byte property
    108 * @fdt: pointer to the device tree blob
    109 * @node_path: node path
    110 * @property: name of the property to find
    111 * @lenp: fdt error if any or -EINVAL if the property size is different from
    112 *        4 bytes, or 4 (expected length of the property) upon success.
    113 * @errp: handle to an error object
    114 *
    115 * returns the property value on success
    116 */
    117uint32_t qemu_fdt_getprop_cell(void *fdt, const char *node_path,
    118                               const char *property, int *lenp,
    119                               Error **errp);
    120uint32_t qemu_fdt_get_phandle(void *fdt, const char *path);
    121uint32_t qemu_fdt_alloc_phandle(void *fdt);
    122int qemu_fdt_nop_node(void *fdt, const char *node_path);
    123int qemu_fdt_add_subnode(void *fdt, const char *name);
    124
    125#define qemu_fdt_setprop_cells(fdt, node_path, property, ...)                 \
    126    do {                                                                      \
    127        uint32_t qdt_tmp[] = { __VA_ARGS__ };                                 \
    128        int i;                                                                \
    129                                                                              \
    130        for (i = 0; i < ARRAY_SIZE(qdt_tmp); i++) {                           \
    131            qdt_tmp[i] = cpu_to_be32(qdt_tmp[i]);                             \
    132        }                                                                     \
    133        qemu_fdt_setprop(fdt, node_path, property, qdt_tmp,                   \
    134                         sizeof(qdt_tmp));                                    \
    135    } while (0)
    136
    137void qemu_fdt_dumpdtb(void *fdt, int size);
    138
    139/**
    140 * qemu_fdt_setprop_sized_cells_from_array:
    141 * @fdt: device tree blob
    142 * @node_path: node to set property on
    143 * @property: property to set
    144 * @numvalues: number of values
    145 * @values: array of number-of-cells, value pairs
    146 *
    147 * Set the specified property on the specified node in the device tree
    148 * to be an array of cells. The values of the cells are specified via
    149 * the values list, which alternates between "number of cells used by
    150 * this value" and "value".
    151 * number-of-cells must be either 1 or 2 (other values will result in
    152 * an error being returned). If a value is too large to fit in the
    153 * number of cells specified for it, an error is returned.
    154 *
    155 * This function is useful because device tree nodes often have cell arrays
    156 * which are either lists of addresses or lists of address,size tuples, but
    157 * the number of cells used for each element vary depending on the
    158 * #address-cells and #size-cells properties of their parent node.
    159 * If you know all your cell elements are one cell wide you can use the
    160 * simpler qemu_fdt_setprop_cells(). If you're not setting up the
    161 * array programmatically, qemu_fdt_setprop_sized_cells may be more
    162 * convenient.
    163 *
    164 * Return value: 0 on success, <0 on error.
    165 */
    166int qemu_fdt_setprop_sized_cells_from_array(void *fdt,
    167                                            const char *node_path,
    168                                            const char *property,
    169                                            int numvalues,
    170                                            uint64_t *values);
    171
    172/**
    173 * qemu_fdt_setprop_sized_cells:
    174 * @fdt: device tree blob
    175 * @node_path: node to set property on
    176 * @property: property to set
    177 * @...: list of number-of-cells, value pairs
    178 *
    179 * Set the specified property on the specified node in the device tree
    180 * to be an array of cells. The values of the cells are specified via
    181 * the variable arguments, which alternates between "number of cells
    182 * used by this value" and "value".
    183 *
    184 * This is a convenience wrapper for the function
    185 * qemu_fdt_setprop_sized_cells_from_array().
    186 *
    187 * Return value: 0 on success, <0 on error.
    188 */
    189#define qemu_fdt_setprop_sized_cells(fdt, node_path, property, ...)       \
    190    ({                                                                    \
    191        uint64_t qdt_tmp[] = { __VA_ARGS__ };                             \
    192        qemu_fdt_setprop_sized_cells_from_array(fdt, node_path,           \
    193                                                property,                 \
    194                                                ARRAY_SIZE(qdt_tmp) / 2,  \
    195                                                qdt_tmp);                 \
    196    })
    197
    198#define FDT_PCI_RANGE_RELOCATABLE          0x80000000
    199#define FDT_PCI_RANGE_PREFETCHABLE         0x40000000
    200#define FDT_PCI_RANGE_ALIASED              0x20000000
    201#define FDT_PCI_RANGE_TYPE_MASK            0x03000000
    202#define FDT_PCI_RANGE_MMIO_64BIT           0x03000000
    203#define FDT_PCI_RANGE_MMIO                 0x02000000
    204#define FDT_PCI_RANGE_IOPORT               0x01000000
    205#define FDT_PCI_RANGE_CONFIG               0x00000000
    206
    207#endif /* DEVICE_TREE_H */