| /* 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 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 */ |