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