141 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
/* SPDX-License-Identifier: GPL-2.0+ */
 | 
						|
/*
 | 
						|
 * Copyright (c) 2021 Linaro Limited
 | 
						|
 *			Author: AKASHI Takahiro
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _DM_TAG_H
 | 
						|
#define _DM_TAG_H
 | 
						|
 | 
						|
#include <linux/list.h>
 | 
						|
#include <linux/types.h>
 | 
						|
 | 
						|
struct dm_stats;
 | 
						|
struct udevice;
 | 
						|
 | 
						|
enum dm_tag_t {
 | 
						|
	/* Types of core tags that can be attached to devices */
 | 
						|
	DM_TAG_PLAT,
 | 
						|
	DM_TAG_PARENT_PLAT,
 | 
						|
	DM_TAG_UC_PLAT,
 | 
						|
 | 
						|
	DM_TAG_PRIV,
 | 
						|
	DM_TAG_PARENT_PRIV,
 | 
						|
	DM_TAG_UC_PRIV,
 | 
						|
	DM_TAG_DRIVER_DATA,
 | 
						|
	DM_TAG_ATTACH_COUNT,
 | 
						|
 | 
						|
	/* EFI_LOADER */
 | 
						|
	DM_TAG_EFI = DM_TAG_ATTACH_COUNT,
 | 
						|
 | 
						|
	DM_TAG_COUNT,
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * dmtag_node
 | 
						|
 *
 | 
						|
 * @sibling: List of dm-tag nodes
 | 
						|
 * @dev:     Associated udevice
 | 
						|
 * @tag:     Tag type
 | 
						|
 * @ptr:     Pointer as a value
 | 
						|
 * @val:     Value
 | 
						|
 */
 | 
						|
struct dmtag_node {
 | 
						|
	struct list_head sibling;
 | 
						|
	struct  udevice *dev;
 | 
						|
	enum dm_tag_t tag;
 | 
						|
	union {
 | 
						|
		void *ptr;
 | 
						|
		ulong val;
 | 
						|
	};
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * dev_tag_set_ptr() - set a tag's value as a pointer
 | 
						|
 * @dev: Device to operate
 | 
						|
 * @tag: Tag type
 | 
						|
 * @ptr: Pointer to set
 | 
						|
 *
 | 
						|
 * Set the value, @ptr, as of @tag associated with the device, @dev
 | 
						|
 *
 | 
						|
 * Return: 0 on success, -ve on error
 | 
						|
 */
 | 
						|
int dev_tag_set_ptr(struct udevice *dev, enum dm_tag_t tag, void *ptr);
 | 
						|
 | 
						|
/**
 | 
						|
 * dev_tag_set_val() set a tag's value as an integer
 | 
						|
 * @dev: Device to operate
 | 
						|
 * @tag: Tag type
 | 
						|
 * @val: Value to set
 | 
						|
 *
 | 
						|
 * Set the value, @val, as of @tag associated with the device, @dev
 | 
						|
 *
 | 
						|
 * Return: on success, -ve on error
 | 
						|
 */
 | 
						|
int dev_tag_set_val(struct udevice *dev, enum dm_tag_t tag, ulong val);
 | 
						|
 | 
						|
/**
 | 
						|
 * dev_tag_get_ptr() - get a tag's value as a pointer
 | 
						|
 * @dev: Device to operate
 | 
						|
 * @tag: Tag type
 | 
						|
 * @ptrp: Pointer to tag's value (pointer)
 | 
						|
 *
 | 
						|
 * Get a tag's value as a pointer
 | 
						|
 *
 | 
						|
 * Return: on success, -ve on error
 | 
						|
 */
 | 
						|
int dev_tag_get_ptr(struct udevice *dev, enum dm_tag_t tag, void **ptrp);
 | 
						|
 | 
						|
/**
 | 
						|
 * dev_tag_get_val() - get a tag's value as an integer
 | 
						|
 * @dev: Device to operate
 | 
						|
 * @tag: Tag type
 | 
						|
 * @valp: Pointer to tag's value (ulong)
 | 
						|
 *
 | 
						|
 * Get a tag's value as an integer
 | 
						|
 *
 | 
						|
 * Return: 0 on success, -ve on error
 | 
						|
 */
 | 
						|
int dev_tag_get_val(struct udevice *dev, enum dm_tag_t tag, ulong *valp);
 | 
						|
 | 
						|
/**
 | 
						|
 * dev_tag_del() - delete a tag
 | 
						|
 * @dev: Device to operate
 | 
						|
 * @tag: Tag type
 | 
						|
 *
 | 
						|
 * Delete a tag of @tag associated with the device, @dev
 | 
						|
 *
 | 
						|
 * Return: 0 on success, -ve on error
 | 
						|
 */
 | 
						|
int dev_tag_del(struct udevice *dev, enum dm_tag_t tag);
 | 
						|
 | 
						|
/**
 | 
						|
 * dev_tag_del_all() - delete all tags
 | 
						|
 * @dev: Device to operate
 | 
						|
 *
 | 
						|
 * Delete all the tags associated with the device, @dev
 | 
						|
 *
 | 
						|
 * Return: 0 on success, -ve on error
 | 
						|
 */
 | 
						|
int dev_tag_del_all(struct udevice *dev);
 | 
						|
 | 
						|
/**
 | 
						|
 * dev_tag_collect_stats() - Collect information on driver model performance
 | 
						|
 *
 | 
						|
 * This collects information on how driver model is performing. For now it only
 | 
						|
 * includes memory usage
 | 
						|
 *
 | 
						|
 * @stats: Place to put the collected information
 | 
						|
 */
 | 
						|
void dev_tag_collect_stats(struct dm_stats *stats);
 | 
						|
 | 
						|
/**
 | 
						|
 * tag_get_name() - Get the name of a tag
 | 
						|
 *
 | 
						|
 * @tag: Tag to look up, which must be valid
 | 
						|
 * Returns: Name of tag
 | 
						|
 */
 | 
						|
const char *tag_get_name(enum dm_tag_t tag);
 | 
						|
 | 
						|
#endif /* _DM_TAG_H */
 |