在现代SoC设计中,性能域(Performance Domain)是一个关键的系统资源管理单元。它代表了一组共享相同性能特性的硬件组件,通常包括CPU集群、GPU或特定加速器。通过性能域划分,系统可以对不同计算单元实施差异化的频率和电压调控。
性能域的核心特征是动态性能调节能力。以Arm big.LITTLE架构为例,大核集群和小核集群通常被划分为不同的性能域。当系统检测到高负载任务时,可以通过PERFORMANCE_LEVEL_SET命令将大核域提升到更高性能级别,同时保持小核域在节能状态。
关键提示:性能域与电源域(Power Domain)的区别在于,前者关注计算单元的性能状态调节,后者负责电源开关控制。两者协同工作但管理维度不同。
SCMI性能域管理协议(Protocol ID 0x13)包含三类核心命令:
属性查询类:
性能控制类:
QoS配置类:
典型交互流程如下:
mermaid复制sequenceDiagram
Agent->>Platform: PERFORMANCE_DOMAIN_ATTRIBUTES
Platform-->>Agent: 返回域属性(含支持的功能位)
Agent->>Platform: PERFORMANCE_LIMITS_GET
Platform-->>Agent: 返回当前性能范围[min,max]
Agent->>Platform: PERFORMANCE_LEVEL_SET(目标level)
Platform-->>Agent: 返回SUCCESS/NOT_FOUND等状态
domain_id采用32位无符号整数标识,分配规则通常遵循:
性能级别有两种表示模式:
c复制// 示例:设置CPU域到2GHz
PERFORMANCE_LEVEL_SET {
domain_id = 0, // CPU集群
performance_level = 2000000 // 单位KHz
}
c复制// 平台预定义级别映射表
level_index[0] = 1000000 // 1.0GHz
level_index[1] = 1500000 // 1.5GHz
level_index[2] = 2000000 // 2.0GHz
PERFORMANCE_LEVEL_SET命令的完整处理流程包含以下阶段:
参数验证阶段:
平台调度阶段:
异步通知阶段(如果注册):
实测案例:在Cortex-A76平台上,从1.5GHz切换到2.0GHz典型延迟为200-500μs,具体取决于PMIC响应速度和PLL锁定时间。
REDUCE_SUSTAINED_PERFORMANCE_LEVEL命令常用于温度控制场景:
c复制// 当检测到温度超过阈值时
REDUCE_SUSTAINED_PERFORMANCE_LEVEL {
domain_id = 0, // CPU域
sustained_level = sustained_perf_level * 0.8 // 降低20%
}
关键注意事项:
QoS能力描述符(表14)采用位域编码:
c复制struct qos_capability {
uint32_t type_range : 1; // 0=标准类型 1=OEM类型
uint32_t type : 8; // 类型位图
uint32_t subtype_range : 1; // 0=标准子类型 1=OEM子类型
uint32_t subtype : 8; // 子类型位图
};
典型应用场景:
当需要批量更新QoS配置时,推荐异步模式:
c复制PERFORMANCE_QOS_CONFIG_SET {
domain_id = 1,
capability = 0x00010001, // 标准类型1
flags = 0x06, // Bit[1]=1启用异步, Bit[2]=1重置域配置
qos_value = 0 // 被忽略
}
后续通过PERFORMANCE_QOS_CONFIG_COMPLETE接收操作结果。这种模式可避免阻塞调用线程,特别适合实时系统。
性能统计区域(表15)包含以下关键信息:
c复制struct perf_stats_header {
uint32_t signature; // 'PERF'
uint16_t revision; // 0x1
uint16_t num_domains; // 支持的域数量
uint32_t offsets[]; // 各域数据偏移量
};
struct domain_stats {
uint16_t num_levels;
uint16_t current_level;
uint64_t last_change_time;
struct {
uint32_t level;
uint64_t usage_count;
uint64_t residency;
} levels[];
};
典型调试方法:
性能限制变更通知的典型处理流程:
c复制// 注册通知
PERFORMANCE_NOTIFY_LIMITS {
domain_id = 0,
notify_enable = 1 // 启用通知
}
// 在中断上下文中处理
void handle_notify(uint32_t message_id) {
if (message_id == 0x0) { // PERFORMANCE_LIMITS_CHANGED
uint32_t new_min = read_parameter(2);
uint32_t new_max = read_parameter(3);
update_thermal_policy(new_min, new_max);
}
}
注意事项:
可靠的功能检测应遵循以下步骤:
c复制#define PERF_DOMAIN_ATTR_QOS_SUPPORTED (1 << 23)
#define PERF_DOMAIN_ATTR_LEVEL_INDEXING (1 << 24)
FastChannel通过共享内存实现高性能通信:
c复制struct fastchannel {
uint64_t chan_addr; // 通道地址
uint32_t chan_size; // 数据区大小
uint32_t rate_limit; // 最小请求间隔(μs)
struct {
uint64_t db_addr; // 门铃地址
uint32_t set_mask; // 写入掩码
uint32_t preserve_mask; // 保留位
} doorbell;
};
优化建议:
| 状态码 | 可能原因 | 解决方案 |
|---|---|---|
| NOT_FOUND | 无效domain_id | 检查PERFORMANCE_DOMAIN_ATTRIBUTES |
| OUT_OF_RANGE | 超出[min,max]范围 | 先调用PERFORMANCE_LIMITS_GET |
| DENIED | 权限不足 | 验证access_control字段 |
| INVALID_PARAMETERS | QoS能力描述符错误 | 检查type/subtype位设置 |
现象:PERFORMANCE_LEVEL_SET返回SUCCESS但实际频率未变
排查步骤:
c复制PERFORMANCE_NOTIFY_LEVEL {
domain_id = target_domain,
notify_enable = 1
}
bash复制echo 1 > /sys/kernel/debug/tracing/events/scmi/enable
cat /sys/kernel/debug/tracing/trace_pipe
安全边界设计:
实时性优化:
电源管理集成:
c复制void enter_low_power_mode() {
// 先降低性能级别
PERFORMANCE_LEVEL_SET(domain, min_level);
// 再触发电源状态转换
POWER_STATE_SET(domain, LOW_POWER);
}
调试工具链搭建:
在Armv9平台的实际测试中,合理配置性能域可使能效比提升30%-40%。特别是在混合负载场景下,通过细粒度的QoS配置可以确保关键任务获得稳定的性能保障,同时优化整体系统功耗。