mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 12:08:19 +00:00 
			
		
		
		
	In this patch, added are helper functions to directly manipulate SCMI power domain management protocol. DM compliant power domain driver will be implemented on top of those interfaces in a succeeding patch. Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
		
			
				
	
	
		
			1009 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1009 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
 | |
| /*
 | |
|  * Copyright (c) 2015-2019, Arm Limited and Contributors. All rights reserved.
 | |
|  * Copyright (C) 2019-2020, Linaro Limited
 | |
|  */
 | |
| #ifndef _SCMI_PROTOCOLS_H
 | |
| #define _SCMI_PROTOCOLS_H
 | |
| 
 | |
| #include <linux/bitops.h>
 | |
| #include <asm/types.h>
 | |
| 
 | |
| /*
 | |
|  * Subset the SCMI protocols definition
 | |
|  * based on SCMI specification v2.0 (DEN0056B)
 | |
|  * https://developer.arm.com/docs/den0056/b
 | |
|  */
 | |
| 
 | |
| enum scmi_std_protocol {
 | |
| 	SCMI_PROTOCOL_ID_BASE = 0x10,
 | |
| 	SCMI_PROTOCOL_ID_POWER_DOMAIN = 0x11,
 | |
| 	SCMI_PROTOCOL_ID_SYSTEM = 0x12,
 | |
| 	SCMI_PROTOCOL_ID_PERF = 0x13,
 | |
| 	SCMI_PROTOCOL_ID_CLOCK = 0x14,
 | |
| 	SCMI_PROTOCOL_ID_SENSOR = 0x15,
 | |
| 	SCMI_PROTOCOL_ID_RESET_DOMAIN = 0x16,
 | |
| 	SCMI_PROTOCOL_ID_VOLTAGE_DOMAIN = 0x17,
 | |
| };
 | |
| 
 | |
| enum scmi_status_code {
 | |
| 	SCMI_SUCCESS =  0,
 | |
| 	SCMI_NOT_SUPPORTED = -1,
 | |
| 	SCMI_INVALID_PARAMETERS = -2,
 | |
| 	SCMI_DENIED = -3,
 | |
| 	SCMI_NOT_FOUND = -4,
 | |
| 	SCMI_OUT_OF_RANGE = -5,
 | |
| 	SCMI_BUSY = -6,
 | |
| 	SCMI_COMMS_ERROR = -7,
 | |
| 	SCMI_GENERIC_ERROR = -8,
 | |
| 	SCMI_HARDWARE_ERROR = -9,
 | |
| 	SCMI_PROTOCOL_ERROR = -10,
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Generic message IDs
 | |
|  */
 | |
| enum scmi_discovery_id {
 | |
| 	SCMI_PROTOCOL_VERSION = 0x0,
 | |
| 	SCMI_PROTOCOL_ATTRIBUTES = 0x1,
 | |
| 	SCMI_PROTOCOL_MESSAGE_ATTRIBUTES = 0x2,
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * SCMI Base Protocol
 | |
|  */
 | |
| #define SCMI_BASE_PROTOCOL_VERSION 0x20000
 | |
| 
 | |
| enum scmi_base_message_id {
 | |
| 	SCMI_BASE_DISCOVER_VENDOR = 0x3,
 | |
| 	SCMI_BASE_DISCOVER_SUB_VENDOR = 0x4,
 | |
| 	SCMI_BASE_DISCOVER_IMPL_VERSION = 0x5,
 | |
| 	SCMI_BASE_DISCOVER_LIST_PROTOCOLS = 0x6,
 | |
| 	SCMI_BASE_DISCOVER_AGENT = 0x7,
 | |
| 	SCMI_BASE_NOTIFY_ERRORS = 0x8,
 | |
| 	SCMI_BASE_SET_DEVICE_PERMISSIONS = 0x9,
 | |
| 	SCMI_BASE_SET_PROTOCOL_PERMISSIONS = 0xa,
 | |
| 	SCMI_BASE_RESET_AGENT_CONFIGURATION = 0xb,
 | |
| };
 | |
| 
 | |
| #define SCMI_BASE_NAME_LENGTH_MAX 16
 | |
| 
 | |
| /**
 | |
|  * struct scmi_protocol_version_out - Response for SCMI_PROTOCOL_VERSION
 | |
|  *					command
 | |
|  * @status:	SCMI command status
 | |
|  * @version:	Protocol version
 | |
|  */
 | |
| struct scmi_protocol_version_out {
 | |
| 	s32 status;
 | |
| 	u32 version;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_protocol_attrs_out - Response for SCMI_PROTOCOL_ATTRIBUTES
 | |
|  *					command
 | |
|  * @status:	SCMI command status
 | |
|  * @attributes:	Protocol attributes or implementation details
 | |
|  */
 | |
| struct scmi_protocol_attrs_out {
 | |
| 	s32 status;
 | |
| 	u32 attributes;
 | |
| };
 | |
| 
 | |
| #define SCMI_PROTOCOL_ATTRS_NUM_AGENTS(attributes) \
 | |
| 				(((attributes) & GENMASK(15, 8)) >> 8)
 | |
| #define SCMI_PROTOCOL_ATTRS_NUM_PROTOCOLS(attributes) \
 | |
| 				((attributes) & GENMASK(7, 0))
 | |
| 
 | |
| /**
 | |
|  * struct scmi_protocol_msg_attrs_out - Response for
 | |
|  *					SCMI_PROTOCOL_MESSAGE_ATTRIBUTES command
 | |
|  * @status:	SCMI command status
 | |
|  * @attributes:	Message-specific attributes
 | |
|  */
 | |
| struct scmi_protocol_msg_attrs_out {
 | |
| 	s32 status;
 | |
| 	u32 attributes;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_base_discover_vendor_out - Response for
 | |
|  *					  SCMI_BASE_DISCOVER_VENDOR or
 | |
|  *					  SCMI_BASE_DISCOVER_SUB_VENDOR command
 | |
|  * @status:		SCMI command status
 | |
|  * @vendor_identifier:	Name of vendor or sub-vendor in string
 | |
|  */
 | |
| struct scmi_base_discover_vendor_out {
 | |
| 	s32 status;
 | |
| 	u8 vendor_identifier[SCMI_BASE_NAME_LENGTH_MAX];
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_base_discover_impl_version_out - Response for
 | |
|  *					SCMI_BASE_DISCOVER_IMPL_VERSION command
 | |
|  * @status:		SCMI command status
 | |
|  * @impl_version:	Vendor-specific implementation version
 | |
|  */
 | |
| struct scmi_base_discover_impl_version_out {
 | |
| 	s32 status;
 | |
| 	u32 impl_version;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_base_discover_list_protocols_out - Response for
 | |
|  *				SCMI_BASE_DISCOVER_LIST_PROTOCOLS command
 | |
|  * @status:		SCMI command status
 | |
|  * @num_protocols:	Number of SCMI protocols in @protocol
 | |
|  * @protocols:		Array of packed SCMI protocol ID's
 | |
|  */
 | |
| struct scmi_base_discover_list_protocols_out {
 | |
| 	s32 status;
 | |
| 	u32 num_protocols;
 | |
| 	u32 protocols[3];
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_base_discover_agent_out - Response for
 | |
|  *					 SCMI_BASE_DISCOVER_AGENT command
 | |
|  * @status:	SCMI command status
 | |
|  * @agent_id:	SCMI agent ID
 | |
|  * @name:	Name of agent in string
 | |
|  */
 | |
| struct scmi_base_discover_agent_out {
 | |
| 	s32 status;
 | |
| 	u32 agent_id;
 | |
| 	u8 name[SCMI_BASE_NAME_LENGTH_MAX];
 | |
| };
 | |
| 
 | |
| #define SCMI_BASE_NOTIFY_ERRORS_ENABLE BIT(0)
 | |
| 
 | |
| /**
 | |
|  * struct scmi_base_set_device_permissions_in - Parameters for
 | |
|  *					SCMI_BASE_SET_DEVICE_PERMISSIONS command
 | |
|  * @agent_id:	SCMI agent ID
 | |
|  * @device_id:	device ID
 | |
|  * @flags:	A set of flags
 | |
|  */
 | |
| struct scmi_base_set_device_permissions_in {
 | |
| 	u32 agent_id;
 | |
| 	u32 device_id;
 | |
| 	u32 flags;
 | |
| };
 | |
| 
 | |
| #define SCMI_BASE_SET_DEVICE_PERMISSIONS_ACCESS BIT(0)
 | |
| 
 | |
| /**
 | |
|  * struct scmi_base_set_protocol_permissions_in - Parameters for
 | |
|  *				SCMI_BASE_SET_PROTOCOL_PERMISSIONS command
 | |
|  * @agent_id:		SCMI agent ID
 | |
|  * @device_id:		device ID
 | |
|  * @command_id:		command ID
 | |
|  * @flags:		A set of flags
 | |
|  */
 | |
| struct scmi_base_set_protocol_permissions_in {
 | |
| 	u32 agent_id;
 | |
| 	u32 device_id;
 | |
| 	u32 command_id;
 | |
| 	u32 flags;
 | |
| };
 | |
| 
 | |
| #define SCMI_BASE_SET_PROTOCOL_PERMISSIONS_COMMAND GENMASK(7, 0)
 | |
| #define SCMI_BASE_SET_PROTOCOL_PERMISSIONS_ACCESS BIT(0)
 | |
| 
 | |
| /**
 | |
|  * struct scmi_base_reset_agent_configuration_in - Parameters for
 | |
|  *				SCMI_BASE_RESET_AGENT_CONFIGURATION command
 | |
|  * @agent_id:	SCMI agent ID
 | |
|  * @flags:	A set of flags
 | |
|  */
 | |
| struct scmi_base_reset_agent_configuration_in {
 | |
| 	u32 agent_id;
 | |
| 	u32 flags;
 | |
| };
 | |
| 
 | |
| #define SCMI_BASE_RESET_ALL_ACCESS_PERMISSIONS BIT(0)
 | |
| 
 | |
| /**
 | |
|  * struct scmi_base_ops - SCMI base protocol interfaces
 | |
|  */
 | |
| struct scmi_base_ops {
 | |
| 	/**
 | |
| 	 * protocol_version - get Base protocol version
 | |
| 	 * @dev:	SCMI protocol device
 | |
| 	 * @version:	Pointer to SCMI protocol version
 | |
| 	 *
 | |
| 	 * Obtain the protocol version number in @version for Base protocol.
 | |
| 	 *
 | |
| 	 * Return: 0 on success, error code on failure
 | |
| 	 */
 | |
| 	int (*protocol_version)(struct udevice *dev, u32 *version);
 | |
| 	/**
 | |
| 	 * protocol_attrs - get protocol attributes
 | |
| 	 * @dev:		SCMI protocol device
 | |
| 	 * @num_agents:		Number of SCMI agents
 | |
| 	 * @num_protocols:	Number of SCMI protocols
 | |
| 	 *
 | |
| 	 * Obtain the protocol attributes, the number of agents and the number
 | |
| 	 * of protocols, in @num_agents and @num_protocols respectively, that
 | |
| 	 * the device provides.
 | |
| 	 *
 | |
| 	 * Return: 0 on success, error code on failure
 | |
| 	 */
 | |
| 	int (*protocol_attrs)(struct udevice *dev, u32 *num_agents,
 | |
| 			      u32 *num_protocols);
 | |
| 	/**
 | |
| 	 * protocol_message_attrs - get message-specific attributes
 | |
| 	 * @dev:		SCMI protocol device
 | |
| 	 * @message_id:		SCMI message ID
 | |
| 	 * @attributes:		Message-specific attributes
 | |
| 	 *
 | |
| 	 * Obtain the message-specific attributes in @attributes.
 | |
| 	 * This command succeeds if the message is implemented and available.
 | |
| 	 *
 | |
| 	 * Return: 0 on success, error code on failure
 | |
| 	 */
 | |
| 	int (*protocol_message_attrs)(struct udevice *dev, u32 message_id,
 | |
| 				      u32 *attributes);
 | |
| 	/**
 | |
| 	 * base_discover_vendor - get vendor name
 | |
| 	 * @dev:	SCMI protocol device
 | |
| 	 * @vendor:	Pointer to vendor name
 | |
| 	 *
 | |
| 	 * Obtain the vendor's name in @vendor.
 | |
| 	 * It is a caller's responsibility to free @vendor.
 | |
| 	 *
 | |
| 	 * Return: 0 on success, error code on failure
 | |
| 	 */
 | |
| 	int (*base_discover_vendor)(struct udevice *dev, u8 **vendor);
 | |
| 	/**
 | |
| 	 * base_discover_sub_vendor - get sub-vendor name
 | |
| 	 * @dev:	SCMI protocol device
 | |
| 	 * @sub_vendor:	Pointer to sub-vendor name
 | |
| 	 *
 | |
| 	 * Obtain the sub-vendor's name in @sub_vendor.
 | |
| 	 * It is a caller's responsibility to free @sub_vendor.
 | |
| 	 *
 | |
| 	 * Return: 0 on success, error code on failure
 | |
| 	 */
 | |
| 	int (*base_discover_sub_vendor)(struct udevice *dev, u8 **sub_vendor);
 | |
| 	/**
 | |
| 	 * base_discover_impl_version - get implementation version
 | |
| 	 * @dev:		SCMI protocol device
 | |
| 	 * @impl_version:	Pointer to implementation version
 | |
| 	 *
 | |
| 	 * Obtain the implementation version number in @impl_version.
 | |
| 	 *
 | |
| 	 * Return: 0 on success, error code on failure
 | |
| 	 */
 | |
| 	int (*base_discover_impl_version)(struct udevice *dev,
 | |
| 					  u32 *impl_version);
 | |
| 	/**
 | |
| 	 * base_discover_list_protocols - get list of protocols
 | |
| 	 * @dev:	SCMI protocol device
 | |
| 	 * @protocols:	Pointer to array of SCMI protocols
 | |
| 	 *
 | |
| 	 * Obtain the list of protocols provided in @protocols.
 | |
| 	 * The number of elements in @protocols always match to the number of
 | |
| 	 * protocols returned by smci_protocol_attrs() when this function
 | |
| 	 * succeeds.
 | |
| 	 * It is a caller's responsibility to free @protocols.
 | |
| 	 *
 | |
| 	 * Return: the number of protocols in @protocols on success,
 | |
| 	 * error code on failure
 | |
| 	 */
 | |
| 	int (*base_discover_list_protocols)(struct udevice *dev,
 | |
| 					    u8 **protocols);
 | |
| 	/**
 | |
| 	 * base_discover_agent - identify agent
 | |
| 	 * @dev:		SCMI protocol device
 | |
| 	 * @agent_id:		SCMI agent ID
 | |
| 	 * @ret_agent_id:	Pointer to SCMI agent ID
 | |
| 	 * @name:		Pointer to SCMI agent name
 | |
| 	 *
 | |
| 	 * Obtain the agent's name in @name. If @agent_id is equal to
 | |
| 	 * 0xffffffff, * this function returns the caller's agent id in
 | |
| 	 * @ret_agent_id.
 | |
| 	 * It is a caller's responsibility to free @name.
 | |
| 	 *
 | |
| 	 * Return: 0 on success, error code on failure
 | |
| 	 */
 | |
| 	int (*base_discover_agent)(struct udevice *dev, u32 agent_id,
 | |
| 				   u32 *ret_agent_id, u8 **name);
 | |
| 	/**
 | |
| 	 * base_notify_errors - configure error notification
 | |
| 	 * @dev:	SCMI protocol device
 | |
| 	 * @enable:	Operation
 | |
| 	 *
 | |
| 	 * Enable or disable error notification from SCMI firmware.
 | |
| 	 *
 | |
| 	 * Return: 0 on success, error code on failure
 | |
| 	 */
 | |
| 	int (*base_notify_errors)(struct udevice *dev, u32 enable);
 | |
| 	/**
 | |
| 	 * base_set_device_permissions - configure access permission to device
 | |
| 	 * @dev:	SCMI protocol device
 | |
| 	 * @agent_id:	SCMI agent ID
 | |
| 	 * @device_id:	ID of device to access
 | |
| 	 * @flags:	A set of flags
 | |
| 	 *
 | |
| 	 * Ask for allowing or denying access permission to the device,
 | |
| 	 * @device_id. The meaning of @flags is defined in SCMI specification.
 | |
| 	 *
 | |
| 	 * Return: 0 on success, error code on failure
 | |
| 	 */
 | |
| 	int (*base_set_device_permissions)(struct udevice *dev, u32 agent_id,
 | |
| 					   u32 device_id, u32 flags);
 | |
| 	/**
 | |
| 	 * base_set_protocol_permissions - configure access permission to
 | |
| 	 *				   protocol on device
 | |
| 	 * @dev:	SCMI protocol device
 | |
| 	 * @agent_id:	SCMI agent ID
 | |
| 	 * @device_id:	ID of device to access
 | |
| 	 * @command_id:	command ID
 | |
| 	 * @flags:	A set of flags
 | |
| 	 *
 | |
| 	 * Ask for allowing or denying access permission to the protocol,
 | |
| 	 * @command_id, on the device, @device_id.
 | |
| 	 * The meaning of @flags is defined in SCMI specification.
 | |
| 	 *
 | |
| 	 * Return: 0 on success, error code on failure
 | |
| 	 */
 | |
| 	int (*base_set_protocol_permissions)(struct udevice *dev, u32 agent_id,
 | |
| 					     u32 device_id, u32 command_id,
 | |
| 					     u32 flags);
 | |
| 	/**
 | |
| 	 * base_reset_agent_configuration - reset resource settings
 | |
| 	 * @dev:	SCMI protocol device
 | |
| 	 * @agent_id:	SCMI agent ID
 | |
| 	 * @flags:	A set of flags
 | |
| 	 *
 | |
| 	 * Reset all the resource settings against @agent_id.
 | |
| 	 * The meaning of @flags is defined in SCMI specification.
 | |
| 	 *
 | |
| 	 * Return: 0 on success, error code on failure
 | |
| 	 */
 | |
| 	int (*base_reset_agent_configuration)(struct udevice *dev, u32 agent_id,
 | |
| 					      u32 flags);
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * scmi_generic_protocol_version - get protocol version
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @id:		SCMI protocol ID
 | |
|  * @version:	Pointer to SCMI protocol version
 | |
|  *
 | |
|  * Obtain the protocol version number in @version.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_generic_protocol_version(struct udevice *dev,
 | |
| 				  enum scmi_std_protocol id, u32 *version);
 | |
| 
 | |
| /**
 | |
|  * scmi_base_protocol_version - get Base protocol version
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @version:	Pointer to SCMI protocol version
 | |
|  *
 | |
|  * Obtain the protocol version number in @version for Base protocol.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_base_protocol_version(struct udevice *dev, u32 *version);
 | |
| 
 | |
| /**
 | |
|  * scmi_protocol_attrs - get protocol attributes
 | |
|  * @dev:		SCMI protocol device
 | |
|  * @num_agents:		Number of SCMI agents
 | |
|  * @num_protocols:	Number of SCMI protocols
 | |
|  *
 | |
|  * Obtain the protocol attributes, the number of agents and the number
 | |
|  * of protocols, in @num_agents and @num_protocols respectively, that
 | |
|  * the device provides.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_base_protocol_attrs(struct udevice *dev, u32 *num_agents,
 | |
| 			     u32 *num_protocols);
 | |
| 
 | |
| /**
 | |
|  * scmi_protocol_message_attrs - get message-specific attributes
 | |
|  * @dev:		SCMI protocol device
 | |
|  * @message_id:		SCMI message ID
 | |
|  * @attributes:		Message-specific attributes
 | |
|  *
 | |
|  * Obtain the message-specific attributes in @attributes.
 | |
|  * This command succeeds if the message is implemented and available.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_base_protocol_message_attrs(struct udevice *dev, u32 message_id,
 | |
| 				     u32 *attributes);
 | |
| 
 | |
| /**
 | |
|  * scmi_base_discover_vendor - get vendor name
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @vendor:	Pointer to vendor name
 | |
|  *
 | |
|  * Obtain the vendor's name in @vendor.
 | |
|  * It is a caller's responsibility to free @vendor.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_base_discover_vendor(struct udevice *dev, u8 **vendor);
 | |
| 
 | |
| /**
 | |
|  * scmi_base_discover_sub_vendor - get sub-vendor name
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @sub_vendor:	Pointer to sub-vendor name
 | |
|  *
 | |
|  * Obtain the sub-vendor's name in @sub_vendor.
 | |
|  * It is a caller's responsibility to free @sub_vendor.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_base_discover_sub_vendor(struct udevice *dev, u8 **sub_vendor);
 | |
| 
 | |
| /**
 | |
|  * scmi_base_discover_impl_version - get implementation version
 | |
|  * @dev:		SCMI protocol device
 | |
|  * @impl_version:	Pointer to implementation version
 | |
|  *
 | |
|  * Obtain the implementation version number in @impl_version.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_base_discover_impl_version(struct udevice *dev, u32 *impl_version);
 | |
| 
 | |
| /**
 | |
|  * scmi_base_discover_list_protocols - get list of protocols
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @protocols:	Pointer to array of SCMI protocols
 | |
|  *
 | |
|  * Obtain the list of protocols provided in @protocols.
 | |
|  * The number of elements in @protocols always match to the number of
 | |
|  * protocols returned by smci_protocol_attrs() when this function succeeds.
 | |
|  * It is a caller's responsibility to free @protocols.
 | |
|  *
 | |
|  * Return: the number of protocols in @protocols on success, error code on
 | |
|  * failure
 | |
|  */
 | |
| int scmi_base_discover_list_protocols(struct udevice *dev, u8 **protocols);
 | |
| 
 | |
| /**
 | |
|  * scmi_base_discover_agent - identify agent
 | |
|  * @dev:		SCMI protocol device
 | |
|  * @agent_id:		SCMI agent ID
 | |
|  * @ret_agent_id:	Pointer to SCMI agent ID
 | |
|  * @name:		Pointer to SCMI agent name
 | |
|  *
 | |
|  * Obtain the agent's name in @name. If @agent_id is equal to 0xffffffff,
 | |
|  * this function returns the caller's agent id in @ret_agent_id.
 | |
|  * It is a caller's responsibility to free @name.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_base_discover_agent(struct udevice *dev, u32 agent_id,
 | |
| 			     u32 *ret_agent_id, u8 **name);
 | |
| 
 | |
| /**
 | |
|  * scmi_base_notify_errors - configure error notification
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @enable:	Operation
 | |
|  *
 | |
|  * Enable or disable error notification from SCMI firmware.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_base_notify_errors(struct udevice *dev, u32 enable);
 | |
| 
 | |
| /**
 | |
|  * scmi_base_set_device_permissions - configure access permission to device
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @agent_id:	SCMI agent ID
 | |
|  * @device_id:	ID of device to access
 | |
|  * @flags:	A set of flags
 | |
|  *
 | |
|  * Ask for allowing or denying access permission to the device, @device_id.
 | |
|  * The meaning of @flags is defined in SCMI specification.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_base_set_device_permissions(struct udevice *dev, u32 agent_id,
 | |
| 				     u32 device_id, u32 flags);
 | |
| 
 | |
| /**
 | |
|  * scmi_base_set_protocol_permissions - configure access permission to
 | |
|  *					protocol on device
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @agent_id:	SCMI agent ID
 | |
|  * @device_id:	ID of device to access
 | |
|  * @command_id:	SCMI command ID
 | |
|  * @flags:	A set of flags
 | |
|  *
 | |
|  * Ask for allowing or denying access permission to the protocol, @command_id,
 | |
|  * on the device, @device_id.
 | |
|  * The meaning of @flags is defined in SCMI specification.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_base_set_protocol_permissions(struct udevice *dev,
 | |
| 				       u32 agent_id, u32 device_id,
 | |
| 				       u32 command_id, u32 flags);
 | |
| 
 | |
| /**
 | |
|  * scmi_base_reset_agent_configuration - reset resource settings
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @agent_id:	SCMI agent ID
 | |
|  * @flags:	A set of flags
 | |
|  *
 | |
|  * Reset all the resource settings against @agent_id.
 | |
|  * The meaning of @flags is defined in SCMI specification.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_base_reset_agent_configuration(struct udevice *dev, u32 agent_id,
 | |
| 					u32 flags);
 | |
| 
 | |
| /*
 | |
|  * SCMI Power Domain Management Protocol
 | |
|  */
 | |
| 
 | |
| #define SCMI_PWD_PROTOCOL_VERSION 0x30000
 | |
| #define SCMI_PWD_PSTATE_TYPE_LOST BIT(30)
 | |
| #define SCMI_PWD_PSTATE_ID GENMASK(27, 0)
 | |
| 
 | |
| enum scmi_power_domain_message_id {
 | |
| 	SCMI_PWD_ATTRIBUTES = 0x3,
 | |
| 	SCMI_PWD_STATE_SET = 0x4,
 | |
| 	SCMI_PWD_STATE_GET = 0x5,
 | |
| 	SCMI_PWD_STATE_NOTIFY = 0x6,
 | |
| 	SCMI_PWD_STATE_CHANGE_REQUESTED_NOTIFY = 0x7,
 | |
| 	SCMI_PWD_NAME_GET = 0x8,
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_pwd_protocol_attrs_out
 | |
|  * @status:		SCMI command status
 | |
|  * @attributes:		Protocol attributes
 | |
|  * @stats_addr_low:	Lower 32 bits of address of statistics memory region
 | |
|  * @stats_addr_high:	Higher 32 bits of address of statistics memory region
 | |
|  * @stats_len:		Length of statistics memory region
 | |
|  */
 | |
| struct scmi_pwd_protocol_attrs_out {
 | |
| 	s32 status;
 | |
| 	u32 attributes;
 | |
| 	u32 stats_addr_low;
 | |
| 	u32 stats_addr_high;
 | |
| 	u32 stats_len;
 | |
| };
 | |
| 
 | |
| #define SCMI_PWD_PROTO_ATTRS_NUM_PWD(attributes) ((attributes) & GENMASK(15, 0))
 | |
| 
 | |
| /**
 | |
|  * struct scmi_pwd_protocol_msg_attrs_out
 | |
|  * @status:		SCMI command status
 | |
|  * @attributes:		Message-specific attributes
 | |
|  */
 | |
| struct scmi_pwd_protocol_msg_attrs_out {
 | |
| 	s32 status;
 | |
| 	u32 attributes;
 | |
| };
 | |
| 
 | |
| #define SCMI_PWD_NAME_LENGTH_MAX 16
 | |
| 
 | |
| /**
 | |
|  * struct scmi_pwd_attrs_out
 | |
|  * @status:	SCMI command status
 | |
|  * @attributes:	Power domain attributes
 | |
|  * @name:	Name of power domain
 | |
|  */
 | |
| struct scmi_pwd_attrs_out {
 | |
| 	s32 status;
 | |
| 	u32 attributes;
 | |
| 	u8 name[SCMI_PWD_NAME_LENGTH_MAX];
 | |
| };
 | |
| 
 | |
| #define SCMI_PWD_ATTR_PSTATE_CHANGE_NOTIFY	BIT(31)
 | |
| #define SCMI_PWD_ATTR_PSTATE_ASYNC		BIT(30)
 | |
| #define SCMI_PWD_ATTR_PSTATE_SYNC		BIT(29)
 | |
| #define SCMI_PWD_ATTR_PSTATE_CHANGE_RQ_NOTIFY	BIT(28)
 | |
| #define SCMI_PWD_ATTR_EXTENDED_NAME		BIT(27)
 | |
| 
 | |
| /**
 | |
|  * struct scmi_pwd_state_set_in
 | |
|  * @flags:	Flags
 | |
|  * @domain_id:	Identifier of power domain
 | |
|  * @pstate:	Power state of the domain
 | |
|  */
 | |
| struct scmi_pwd_state_set_in {
 | |
| 	u32 flags;
 | |
| 	u32 domain_id;
 | |
| 	u32 pstate;
 | |
| };
 | |
| 
 | |
| #define SCMI_PWD_SET_FLAGS_ASYNC BIT(0)
 | |
| 
 | |
| /**
 | |
|  * struct scmi_pwd_state_get_out
 | |
|  * @status:	SCMI command status
 | |
|  * @pstate:	Power state of the domain
 | |
|  */
 | |
| struct scmi_pwd_state_get_out {
 | |
| 	s32 status;
 | |
| 	u32 pstate;
 | |
| };
 | |
| 
 | |
| #define SCMI_PWD_EXTENDED_NAME_MAX 64
 | |
| /**
 | |
|  * struct scmi_pwd_name_get_out
 | |
|  * @status:		SCMI command status
 | |
|  * @flags:		Parameter flags
 | |
|  * @extended_name:	Extended name of power domain
 | |
|  */
 | |
| struct scmi_pwd_name_get_out {
 | |
| 	s32 status;
 | |
| 	u32 flags;
 | |
| 	u8 extended_name[SCMI_PWD_EXTENDED_NAME_MAX];
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * scmi_pwd_protocol_attrs - get protocol attributes
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @num_pwdoms:	Number of power domains
 | |
|  * @stats_addr:	Address of statistics memory region
 | |
|  * @stats_len:	Length of statistics memory region
 | |
|  *
 | |
|  * Obtain the protocol attributes, the number of power domains and
 | |
|  * the information of statistics memory region.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_pwd_protocol_attrs(struct udevice *dev, int *num_pwdoms,
 | |
| 			    u64 *stats_addr, size_t *stats_len);
 | |
| /**
 | |
|  * scmi_pwd_protocol_message_attrs - get message-specific attributes
 | |
|  * @dev:		SCMI protocol device
 | |
|  * @message_id:		SCMI message ID
 | |
|  * @attributes:		Message-specific attributes
 | |
|  *
 | |
|  * Obtain the message-specific attributes in @attributes.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_pwd_protocol_message_attrs(struct udevice *dev, s32 message_id,
 | |
| 				    u32 *attributes);
 | |
| /**
 | |
|  * scmi_pwd_attrs - get power domain attributes
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @domain_id:	Identifier of power domain
 | |
|  * @attributes:	Power domain attributes
 | |
|  * @name:	Name of power domain
 | |
|  *
 | |
|  * Obtain the attributes of the given power domain, @domain_id, in @attributes
 | |
|  * as well as its name in @name.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_pwd_attrs(struct udevice *dev, u32 message_id, u32 *attributes,
 | |
| 		   u8 **name);
 | |
| /**
 | |
|  * scmi_pwd_state_set - set power state
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @flags:	Parameter flags
 | |
|  * @domain_id:	Identifier of power domain
 | |
|  * @pstate:	Power state
 | |
|  *
 | |
|  * Change the power state of the given power domain, @domain_id.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_pwd_state_set(struct udevice *dev, u32 flags, u32 domain_id,
 | |
| 		       u32 pstate);
 | |
| /**
 | |
|  * scmi_pwd_state_get - get power state
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @domain_id:	Identifier of power domain
 | |
|  * @pstate:	Power state
 | |
|  *
 | |
|  * Obtain the power state of the given power domain, @domain_id.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_pwd_state_get(struct udevice *dev, u32 domain_id, u32 *pstate);
 | |
| /**
 | |
|  * scmi_pwd_name_get - get extended name
 | |
|  * @dev:	SCMI protocol device
 | |
|  * @domain_id:	Identifier of power domain
 | |
|  * @name:	Extended name of the domain
 | |
|  *
 | |
|  * Obtain the extended name of the given power domain, @domain_id, in @name.
 | |
|  *
 | |
|  * Return: 0 on success, error code on failure
 | |
|  */
 | |
| int scmi_pwd_name_get(struct udevice *dev, u32 domain_id, u8 **name);
 | |
| 
 | |
| /*
 | |
|  * SCMI Clock Protocol
 | |
|  */
 | |
| 
 | |
| enum scmi_clock_message_id {
 | |
| 	SCMI_CLOCK_ATTRIBUTES = 0x3,
 | |
| 	SCMI_CLOCK_RATE_SET = 0x5,
 | |
| 	SCMI_CLOCK_RATE_GET = 0x6,
 | |
| 	SCMI_CLOCK_CONFIG_SET = 0x7,
 | |
| };
 | |
| 
 | |
| #define SCMI_CLK_PROTO_ATTR_COUNT_MASK	GENMASK(15, 0)
 | |
| #define SCMI_CLK_RATE_ASYNC_NOTIFY	BIT(0)
 | |
| #define SCMI_CLK_RATE_ASYNC_NORESP	(BIT(0) | BIT(1))
 | |
| #define SCMI_CLK_RATE_ROUND_DOWN	0
 | |
| #define SCMI_CLK_RATE_ROUND_UP		BIT(2)
 | |
| #define SCMI_CLK_RATE_ROUND_CLOSEST	BIT(3)
 | |
| 
 | |
| #define SCMI_CLOCK_NAME_LENGTH_MAX 16
 | |
| 
 | |
| /**
 | |
|  * struct scmi_clk_get_nb_out - Response for SCMI_PROTOCOL_ATTRIBUTES command
 | |
|  * @status:	SCMI command status
 | |
|  * @attributes:	Attributes of the clock protocol, mainly number of clocks exposed
 | |
|  */
 | |
| struct scmi_clk_protocol_attr_out {
 | |
| 	s32 status;
 | |
| 	u32 attributes;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_clk_attribute_in - Message payload for SCMI_CLOCK_ATTRIBUTES command
 | |
|  * @clock_id:	SCMI clock ID
 | |
|  */
 | |
| struct scmi_clk_attribute_in {
 | |
| 	u32 clock_id;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_clk_get_nb_out - Response payload for SCMI_CLOCK_ATTRIBUTES command
 | |
|  * @status:	SCMI command status
 | |
|  * @attributes:	clock attributes
 | |
|  * @clock_name:	name of the clock
 | |
|  */
 | |
| struct scmi_clk_attribute_out {
 | |
| 	s32 status;
 | |
| 	u32 attributes;
 | |
| 	char clock_name[SCMI_CLOCK_NAME_LENGTH_MAX];
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_clk_state_in - Message payload for CLOCK_CONFIG_SET command
 | |
|  * @clock_id:	SCMI clock ID
 | |
|  * @attributes:	Attributes of the targets clock state
 | |
|  */
 | |
| struct scmi_clk_state_in {
 | |
| 	u32 clock_id;
 | |
| 	u32 attributes;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_clk_state_out - Response payload for CLOCK_CONFIG_SET command
 | |
|  * @status:	SCMI command status
 | |
|  */
 | |
| struct scmi_clk_state_out {
 | |
| 	s32 status;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_clk_state_in - Message payload for CLOCK_RATE_GET command
 | |
|  * @clock_id:	SCMI clock ID
 | |
|  * @attributes:	Attributes of the targets clock state
 | |
|  */
 | |
| struct scmi_clk_rate_get_in {
 | |
| 	u32 clock_id;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_clk_rate_get_out - Response payload for CLOCK_RATE_GET command
 | |
|  * @status:	SCMI command status
 | |
|  * @rate_lsb:	32bit LSB of the clock rate in Hertz
 | |
|  * @rate_msb:	32bit MSB of the clock rate in Hertz
 | |
|  */
 | |
| struct scmi_clk_rate_get_out {
 | |
| 	s32 status;
 | |
| 	u32 rate_lsb;
 | |
| 	u32 rate_msb;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_clk_state_in - Message payload for CLOCK_RATE_SET command
 | |
|  * @flags:	Flags for the clock rate set request
 | |
|  * @clock_id:	SCMI clock ID
 | |
|  * @rate_lsb:	32bit LSB of the clock rate in Hertz
 | |
|  * @rate_msb:	32bit MSB of the clock rate in Hertz
 | |
|  */
 | |
| struct scmi_clk_rate_set_in {
 | |
| 	u32 flags;
 | |
| 	u32 clock_id;
 | |
| 	u32 rate_lsb;
 | |
| 	u32 rate_msb;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_clk_rate_set_out - Response payload for CLOCK_RATE_SET command
 | |
|  * @status:	SCMI command status
 | |
|  */
 | |
| struct scmi_clk_rate_set_out {
 | |
| 	s32 status;
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * SCMI Reset Domain Protocol
 | |
|  */
 | |
| 
 | |
| enum scmi_reset_domain_message_id {
 | |
| 	SCMI_RESET_DOMAIN_ATTRIBUTES = 0x3,
 | |
| 	SCMI_RESET_DOMAIN_RESET = 0x4,
 | |
| };
 | |
| 
 | |
| #define SCMI_RD_NAME_LEN		16
 | |
| 
 | |
| #define SCMI_RD_ATTRIBUTES_FLAG_ASYNC	BIT(31)
 | |
| #define SCMI_RD_ATTRIBUTES_FLAG_NOTIF	BIT(30)
 | |
| 
 | |
| #define SCMI_RD_RESET_FLAG_ASYNC	BIT(2)
 | |
| #define SCMI_RD_RESET_FLAG_ASSERT	BIT(1)
 | |
| #define SCMI_RD_RESET_FLAG_CYCLE	BIT(0)
 | |
| 
 | |
| /**
 | |
|  * struct scmi_rd_attr_in - Payload for RESET_DOMAIN_ATTRIBUTES message
 | |
|  * @domain_id:	SCMI reset domain ID
 | |
|  */
 | |
| struct scmi_rd_attr_in {
 | |
| 	u32 domain_id;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_rd_attr_out - Payload for RESET_DOMAIN_ATTRIBUTES response
 | |
|  * @status:	SCMI command status
 | |
|  * @attributes:	Retrieved attributes of the reset domain
 | |
|  * @latency:	Reset cycle max lantency
 | |
|  * @name:	Reset domain name
 | |
|  */
 | |
| struct scmi_rd_attr_out {
 | |
| 	s32 status;
 | |
| 	u32 attributes;
 | |
| 	u32 latency;
 | |
| 	char name[SCMI_RD_NAME_LEN];
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_rd_reset_in - Message payload for RESET command
 | |
|  * @domain_id:		SCMI reset domain ID
 | |
|  * @flags:		Flags for the reset request
 | |
|  * @reset_state:	Reset target state
 | |
|  */
 | |
| struct scmi_rd_reset_in {
 | |
| 	u32 domain_id;
 | |
| 	u32 flags;
 | |
| 	u32 reset_state;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_rd_reset_out - Response payload for RESET command
 | |
|  * @status:	SCMI command status
 | |
|  */
 | |
| struct scmi_rd_reset_out {
 | |
| 	s32 status;
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * SCMI Voltage Domain Protocol
 | |
|  */
 | |
| 
 | |
| enum scmi_voltage_domain_message_id {
 | |
| 	SCMI_VOLTAGE_DOMAIN_ATTRIBUTES = 0x3,
 | |
| 	SCMI_VOLTAGE_DOMAIN_CONFIG_SET = 0x5,
 | |
| 	SCMI_VOLTAGE_DOMAIN_CONFIG_GET = 0x6,
 | |
| 	SCMI_VOLTAGE_DOMAIN_LEVEL_SET = 0x7,
 | |
| 	SCMI_VOLTAGE_DOMAIN_LEVEL_GET = 0x8,
 | |
| };
 | |
| 
 | |
| #define SCMI_VOLTD_NAME_LEN		16
 | |
| 
 | |
| #define SCMI_VOLTD_CONFIG_MASK		GENMASK(3, 0)
 | |
| #define SCMI_VOLTD_CONFIG_OFF		0
 | |
| #define SCMI_VOLTD_CONFIG_ON		0x7
 | |
| 
 | |
| /**
 | |
|  * struct scmi_voltd_attr_in - Payload for VOLTAGE_DOMAIN_ATTRIBUTES message
 | |
|  * @domain_id:	SCMI voltage domain ID
 | |
|  */
 | |
| struct scmi_voltd_attr_in {
 | |
| 	u32 domain_id;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_voltd_attr_out - Payload for VOLTAGE_DOMAIN_ATTRIBUTES response
 | |
|  * @status:	SCMI command status
 | |
|  * @attributes:	Retrieved attributes of the voltage domain
 | |
|  * @name:	Voltage domain name
 | |
|  */
 | |
| struct scmi_voltd_attr_out {
 | |
| 	s32 status;
 | |
| 	u32 attributes;
 | |
| 	char name[SCMI_VOLTD_NAME_LEN];
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_voltd_config_set_in - Message payload for VOLTAGE_CONFIG_SET cmd
 | |
|  * @domain_id:	SCMI voltage domain ID
 | |
|  * @config:	Configuration data of the voltage domain
 | |
|  */
 | |
| struct scmi_voltd_config_set_in {
 | |
| 	u32 domain_id;
 | |
| 	u32 config;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_voltd_config_set_out - Response for VOLTAGE_CONFIG_SET command
 | |
|  * @status:	SCMI command status
 | |
|  */
 | |
| struct scmi_voltd_config_set_out {
 | |
| 	s32 status;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_voltd_config_get_in - Message payload for VOLTAGE_CONFIG_GET cmd
 | |
|  * @domain_id:	SCMI voltage domain ID
 | |
|  */
 | |
| struct scmi_voltd_config_get_in {
 | |
| 	u32 domain_id;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_voltd_config_get_out - Response for VOLTAGE_CONFIG_GET command
 | |
|  * @status:	SCMI command status
 | |
|  * @config:	Configuration data of the voltage domain
 | |
|  */
 | |
| struct scmi_voltd_config_get_out {
 | |
| 	s32 status;
 | |
| 	u32 config;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_voltd_level_set_in - Message payload for VOLTAGE_LEVEL_SET cmd
 | |
|  * @domain_id:		SCMI voltage domain ID
 | |
|  * @flags:		Parameter flags for configuring target level
 | |
|  * @voltage_level:	Target voltage level in microvolts (uV)
 | |
|  */
 | |
| struct scmi_voltd_level_set_in {
 | |
| 	u32 domain_id;
 | |
| 	u32 flags;
 | |
| 	s32 voltage_level;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_voltd_level_set_out - Response for VOLTAGE_LEVEL_SET command
 | |
|  * @status:	SCMI	command status
 | |
|  */
 | |
| struct scmi_voltd_level_set_out {
 | |
| 	s32 status;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_voltd_level_get_in - Message payload for VOLTAGE_LEVEL_GET cmd
 | |
|  * @domain_id:		SCMI voltage domain ID
 | |
|  */
 | |
| struct scmi_voltd_level_get_in {
 | |
| 	u32 domain_id;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct scmi_voltd_level_get_out - Response for VOLTAGE_LEVEL_GET command
 | |
|  * @status:		SCMI command status
 | |
|  * @voltage_level:	Voltage level in microvolts (uV)
 | |
|  */
 | |
| struct scmi_voltd_level_get_out {
 | |
| 	s32 status;
 | |
| 	s32 voltage_level;
 | |
| };
 | |
| 
 | |
| #endif /* _SCMI_PROTOCOLS_H */
 |