// SPDX-License-Identifier: GPL-2.0 /* * Thunderbolt XDomain property support * * Copyright (C) 2017, Intel Corporation * Authors: Michael Jamet <[email protected]> * Mika Westerberg <[email protected]> */ #include <linux/err.h> #include <linux/slab.h> #include <linux/string.h> #include <linux/uuid.h> #include <linux/thunderbolt.h> struct tb_property_entry { … }; struct tb_property_rootdir_entry { … }; struct tb_property_dir_entry { … }; #define TB_PROPERTY_ROOTDIR_MAGIC … static struct tb_property_dir *__tb_property_parse_dir(const u32 *block, size_t block_len, unsigned int dir_offset, size_t dir_len, bool is_root); static inline void parse_dwdata(void *dst, const void *src, size_t dwords) { … } static inline void format_dwdata(void *dst, const void *src, size_t dwords) { … } static bool tb_property_entry_valid(const struct tb_property_entry *entry, size_t block_len) { … } static bool tb_property_key_valid(const char *key) { … } static struct tb_property * tb_property_alloc(const char *key, enum tb_property_type type) { … } static struct tb_property *tb_property_parse(const u32 *block, size_t block_len, const struct tb_property_entry *entry) { … } static struct tb_property_dir *__tb_property_parse_dir(const u32 *block, size_t block_len, unsigned int dir_offset, size_t dir_len, bool is_root) { … } /** * tb_property_parse_dir() - Parses properties from given property block * @block: Property block to parse * @block_len: Number of dword elements in the property block * * This function parses the XDomain properties data block into format that * can be traversed using the helper functions provided by this module. * Upon success returns the parsed directory. In case of error returns * %NULL. The resulting &struct tb_property_dir needs to be released by * calling tb_property_free_dir() when not needed anymore. * * The @block is expected to be root directory. */ struct tb_property_dir *tb_property_parse_dir(const u32 *block, size_t block_len) { … } /** * tb_property_create_dir() - Creates new property directory * @uuid: UUID used to identify the particular directory * * Creates new, empty property directory. If @uuid is %NULL then the * directory is assumed to be root directory. */ struct tb_property_dir *tb_property_create_dir(const uuid_t *uuid) { … } EXPORT_SYMBOL_GPL(…); static void tb_property_free(struct tb_property *property) { … } /** * tb_property_free_dir() - Release memory allocated for property directory * @dir: Directory to release * * This will release all the memory the directory occupies including all * descendants. It is OK to pass %NULL @dir, then the function does * nothing. */ void tb_property_free_dir(struct tb_property_dir *dir) { … } EXPORT_SYMBOL_GPL(…); static size_t tb_property_dir_length(const struct tb_property_dir *dir, bool recurse, size_t *data_len) { … } static ssize_t __tb_property_format_dir(const struct tb_property_dir *dir, u32 *block, unsigned int start_offset, size_t block_len) { … } /** * tb_property_format_dir() - Formats directory to the packed XDomain format * @dir: Directory to format * @block: Property block where the packed data is placed * @block_len: Length of the property block * * This function formats the directory to the packed format that can be * then send over the thunderbolt fabric to receiving host. Returns %0 in * case of success and negative errno on faulure. Passing %NULL in @block * returns number of entries the block takes. */ ssize_t tb_property_format_dir(const struct tb_property_dir *dir, u32 *block, size_t block_len) { … } /** * tb_property_copy_dir() - Take a deep copy of directory * @dir: Directory to copy * * This function takes a deep copy of @dir and returns back the copy. In * case of error returns %NULL. The resulting directory needs to be * released by calling tb_property_free_dir(). */ struct tb_property_dir *tb_property_copy_dir(const struct tb_property_dir *dir) { … } /** * tb_property_add_immediate() - Add immediate property to directory * @parent: Directory to add the property * @key: Key for the property * @value: Immediate value to store with the property */ int tb_property_add_immediate(struct tb_property_dir *parent, const char *key, u32 value) { … } EXPORT_SYMBOL_GPL(…); /** * tb_property_add_data() - Adds arbitrary data property to directory * @parent: Directory to add the property * @key: Key for the property * @buf: Data buffer to add * @buflen: Number of bytes in the data buffer * * Function takes a copy of @buf and adds it to the directory. */ int tb_property_add_data(struct tb_property_dir *parent, const char *key, const void *buf, size_t buflen) { … } EXPORT_SYMBOL_GPL(…); /** * tb_property_add_text() - Adds string property to directory * @parent: Directory to add the property * @key: Key for the property * @text: String to add * * Function takes a copy of @text and adds it to the directory. */ int tb_property_add_text(struct tb_property_dir *parent, const char *key, const char *text) { … } EXPORT_SYMBOL_GPL(…); /** * tb_property_add_dir() - Adds a directory to the parent directory * @parent: Directory to add the property * @key: Key for the property * @dir: Directory to add */ int tb_property_add_dir(struct tb_property_dir *parent, const char *key, struct tb_property_dir *dir) { … } EXPORT_SYMBOL_GPL(…); /** * tb_property_remove() - Removes property from a parent directory * @property: Property to remove * * Note memory for @property is released as well so it is not allowed to * touch the object after call to this function. */ void tb_property_remove(struct tb_property *property) { … } EXPORT_SYMBOL_GPL(…); /** * tb_property_find() - Find a property from a directory * @dir: Directory where the property is searched * @key: Key to look for * @type: Type of the property * * Finds and returns property from the given directory. Does not recurse * into sub-directories. Returns %NULL if the property was not found. */ struct tb_property *tb_property_find(struct tb_property_dir *dir, const char *key, enum tb_property_type type) { … } EXPORT_SYMBOL_GPL(…); /** * tb_property_get_next() - Get next property from directory * @dir: Directory holding properties * @prev: Previous property in the directory (%NULL returns the first) */ struct tb_property *tb_property_get_next(struct tb_property_dir *dir, struct tb_property *prev) { … } EXPORT_SYMBOL_GPL(…);