0 0 votes
Article Rating

好的,我们来详细解释一下这个 C 语言程序 cyan_skillfish_ppt.c(located at drivers/gpu/drm/amd/pm/swsmu/mu11)。

程序总体概述

这是一个为 AMD GPU 编写的 Linux 内核驱动程序的一部分。具体来说,它负责 AMD “Cyan Skillfish” 这款特定型号 GPU 的电源管理功能。

“Cyan Skillfish” 是 AMD 的一个 APU (加速处理单元) 的代号,这个文件是 amdgpu 开源驱动中的一部分,主要功能是让操作系统 (Linux) 能够与 GPU 内部一个叫做 SMU (System Management Unit, 系统管理单元) 的微控制器进行通信和交互。SMU 负责实时监控和控制 GPU 的电压、频率、温度和功耗等。

简单来说,这个程序就是驱动和 GPU 硬件之间的“翻译官”,专门处理与性能和功耗相关的所有事务。


主要功能和代码结构解析

我们可以把这个文件的功能分为几个核心部分:

1. 定义硬件参数和常量

程序首先定义了 “Cyan Skillfish” 这款 GPU 的一些核心工作范围限制。

C

/* unit: MHz */
#define CYAN_SKILLFISH_SCLK_MIN			350
#define CYAN_SKILLFISH_SCLK_MAX			2230

/* unit: mV */
#define CYAN_SKILLFISH_VDDC_MIN			570
#define CYAN_SKILLFISH_VDDC_MAX			1050
  • CYAN_SKILLFISH_SCLK_MIN / _MAX: 定义了 GPU 核心频率 (SCLK) 的最低和最高值,分别是 350 MHz 和 2230 MHz。
  • CYAN_SKILLFISH_VDDC_MIN / _MAX: 定义了 GPU 核心电压 (VDDC) 的最低和最高值,分别是 570 mV 和 1050 mV。

这些是硬件的安全工作范围,驱动程序会确保用户的设置不会超过这个范围,以防止损坏硬件。

2. 与 SMU 的通信接口

程序定义了驱动如何向 SMU 发送命令(消息)和交换数据(表)。

  • cyan_skillfish_message_map: 这是一个消息映射表。它将驱动中定义的通用消息(例如 GetSmuVersion)“翻译”成 SMU 固件能听懂的特定消息码(例如 PPSMC_MSG_GetSmuVersion)。
  • cyan_skillfish_table_map: 这是一个数据表映射,定义了驱动和 SMU 之间需要共享的数据区域,比如用于存放监控数据的 SMU_METRICS 表。

3. 核心功能函数

这部分是程序的主体,实现具体的电源管理逻辑。

  • cyan_skillfish_get_smu_metrics_data:
    • 功能: 这是最核心的数据读取函数之一。它通过 SMU 从 GPU 的传感器中读取实时的运行数据。
    • 能读取什么:
      • 各种时钟频率:核心频率 (Gfxclk)、内存频率 (Memclk)、SoC 频率 (Socclk) 等。
      • 功耗:整个芯片的实时功耗 (CurrentSocketPower) 和平均功耗 (AverageSocketPower)。
      • 温度:GPU 边缘温度 (GfxTemperature) 和热点温度 (SocTemperature)。
      • 电压:核心电压 (Voltage[1]) 和 SoC 电压 (Voltage[0])。
  • cyan_skillfish_read_sensor:
    • 功能: 这个函数是对上一个函数的封装。它为 Linux 的 hwmon (硬件监控) 子系统提供一个标准的接口,让用户可以通过命令行工具(如 sensors)或者图形化软件(如 radeontop)来查看 GPU 的状态。例如,当用户想查看核心频率时,这个函数就会被调用,然后它再去调用 cyan_skillfish_get_smu_metrics_data 来获取具体数值。
  • cyan_skillfish_print_clk_levels:
    • 功能: 这个函数负责在 Linux 的 sysfs 文件系统下生成可读的频率和电压信息。当你在终端里执行类似 cat /sys/class/drm/card0/device/pp_dpm_sclk 这样的命令时,看到的内容就是由这个函数生成的。它会清晰地列出当前频率、最低频率和最高频率,并用 * 标记当前所处的档位。
  • cyan_skillfish_od_edit_dpm_table:
    • 功能: 这个函数实现了 OverDrive (OD) 功能,也就是超频/降压。它处理来自用户的设置请求。
    • 工作流程:
      1. PP_OD_EDIT_VDDC_CURVE: 当用户尝试设置一个新的频率和电压时(例如 echo "0 2000 1000" > ...),这个分支会接收输入值(频率 2000MHz,电压 1000mV),并检查它们是否在安全范围内。
      2. PP_OD_RESTORE_DEFAULT_TABLE: 恢复到默认的频率和电压设置。
      3. PP_OD_COMMIT_DPM_TABLE: 当用户确认要应用设置时,这个分支会被触发。它会通过 smu_cmn_send_smc_msg_with_param 函数向 SMU 发送 RequestGfxclk (请求核心频率) 和 ForceGfxVid (强制核心电压) 命令,让硬件真正应用新的设置。

4. 功能注册

  • cyan_skillfish_set_ppt_funcs:
    • 功能: 这是最后的“组装”步骤。它创建了一个名为 cyan_skillfish_ppt_funcs 的结构体,并将上面实现的所有函数(如 read_sensor, print_clk_levels 等)的地址都填充进去。
    • 作用: 最后,它将这个包含所有功能函数的结构体注册到 amdgpu 主驱动中。这样,主驱动就知道对于 “Cyan Skillfish” 这款 GPU,应该调用这个文件里的这些函数来执行电源管理任务。

总结

这个 cyan_skillfish_ppt.c 文件是 amdgpu Linux 驱动中一个高度特化、针对 “Cyan Skillfish” APU 的底层电源管理模块。它的核心使命是:

  1. 监控 (Monitor): 从硬件传感器读取实时的频率、温度、功耗和电压。
  2. 控制 (Control): 向 SMU 发送指令,以调整 GPU 的性能状态,包括应用超频或降压设置。
  3. 报告 (Report): 将硬件状态信息通过标准接口暴露给操作系统和用户,让用户能够查看和修改。

没有这个文件,操作系统将无法有效管理该 GPU 的性能和功耗,可能会导致 GPU 要么一直运行在低性能状态,要么功耗过高、过热。

Categories: Blog

Chris

Chris

Just me, need more info?

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x