支持设备的待机唤醒功能

news/2024/5/16 5:31:51/文章来源:https://blog.csdn.net/feit2417/article/details/128428192

系统待机唤醒功能

1 说明背景

1.1 需求

支持 GPU 进入低功耗模式,让用户选择降低设备的功耗

1.2 概念

上位词:APM, ACPI

同类词:睡眠模式, S0~S5

下位词:系统挂起, 系统唤醒, 运行时设备电源管理

1)ACPI

在计算机中,高级配置和电源接口(ACPI)提供了一个开放标准,操作系统可以使用该标准来发现和配置计算机硬件组件,执行电源管理(例如将未使用的硬件组件休眠),执行自动配置(例如即插即用和热插拔),并执行状态监控。and to perform status monitoring.

ACPI是一个标准化的接口规范,其中有对电源管理规范的部分; APM是与之相对的另一项电源管理技术。相比APM,ACPI更加智能。

2)电源管理

在这里插入图片描述

  1. CPU 在运行时根据系统负载进行动态电压和频率变换的 CPUFreq。
  2. CPU 在系统空闲时根据空闲的情况进行低功耗模式的 CPUIdle。
  3. 多核系统下 CPU 的热插拔支持。
  4. 系统和设备针对延迟的特别需求而提出申请的 PM QoS,它会作用于 CPUIdle 的具体策略。
  5. 设备驱动针对系统挂起到 RAM/DISK 的一系列入口函数。
  6. SoC 进入挂起状态,SDRAM 自刷新的入口。
  7. 设备的运行时动态电源管理,根据使用情况动态开关设备。
  8. 底层的时钟、稳压器、频率/电压表(OPP模块完成)支撑,各驱动子系统都可能用到。

3) S3/S4 模式

  • S3:待机到内存,即内存之外把其他设备都进入低功耗模式,对应 ACPI state S3
  • S4:待机到硬盘,即休眠,把电脑的当前状态保存到硬盘,几乎不消耗外部电源,对应 ACPI state S4

4)驱动支持 S3

在这里插入图片描述

关键流程:即将系统的状态保存于内存中,并将 SDRAM置于自刷新状态,待用户按键等操作后再重新恢复系统。

2 调研阶段

2.1 系统操作接口

// file: include/linux/pm.h
// struct device_driver {
struct dev_pm_ops {int (*prepare)(struct device *dev);void (*complete)(struct device *dev);int (*suspend)(struct device *dev);int (*resume)(struct device *dev);int (*freeze)(struct device *dev);int (*thaw)(struct device *dev);int (*poweroff)(struct device *dev);int (*restore)(struct device *dev);int (*suspend_late)(struct device *dev);int (*resume_early)(struct device *dev);int (*freeze_late)(struct device *dev);int (*thaw_early)(struct device *dev);int (*poweroff_late)(struct device *dev);int (*restore_early)(struct device *dev);int (*suspend_noirq)(struct device *dev);int (*resume_noirq)(struct device *dev);int (*freeze_noirq)(struct device *dev);int (*thaw_noirq)(struct device *dev);int (*poweroff_noirq)(struct device *dev);int (*restore_noirq)(struct device *dev);int (*runtime_suspend)(struct device *dev);int (*runtime_resume)(struct device *dev);int (*runtime_idle)(struct device *dev);
};

2.2 完整系统流程

在这里插入图片描述

2.3 驱动接口注册

1)注册接口: 到driver的pm成员

/* amdgpu DRIVER */
static const struct dev_pm_ops amdgpu_pm_ops = {.suspend = amdgpu_pmops_suspend, // 2.resume = amdgpu_pmops_resume, // 3....
};static struct pci_driver amdgpu_kms_pci_driver = {.....driver.pm = &amdgpu_pm_ops, // 1
};

2)实现接口: 挂起和恢复

static int amdgpu_pmops_suspend(struct device *dev)
{....
}static int amdgpu_pmops_resume(struct device *dev)====
{....
}

2.4 系统执行过程

0)挂起事件入口,执行程序

// 挂起流程
// file: kernel/power/main.c
state_storepm_suspend(state);enter_state(state);suspend_devices_and_enter(state); // 包含挂起和恢复的所有执行dpm_suspend_start(PMSG_SUSPEND); // 1suspend_enter(state, &wakeup); // 2// 唤醒流程
// file: drivers/input/apm-power.c
apmpower_eventsystem_power_event(code);apm_queue_event(APM_USER_SUSPEND);
  1. 系统挂起流程,分为四个阶段(prepare, suspend, suspend_late, suspend_noirq)。参考文档
  2. 设备挂起顺序,按照自下而上的顺序执行设备挂起; 按照自上而下的顺序恢复这些设备。参考文档

2.5 驱动执行过程

  • 接口注册流程:函数amdgpu_pmops_suspend通过 struct dev_pm_ops对象amdgpu_pm_ops完成注册到struct pci_driver对象amdgpu_kms_pci_driver.driver.pm.suspend接口。
  • 设备挂起流程:函数amdgpu_pmops_suspend调用amdgpu_device_suspend(drm_dev, true, true);完成amdgpu设备的挂起功能。
  • 设备恢复流程:N/A

3 开发阶段: 前提条件

大前提:在对amdgpu驱动进行开发和测试之前,确保系统在无amdgpu驱动的情况下是可用的。内核文档

sudo su# 方法一
rtcwake -s 30 -m mem # S3
rtcwake -s 30 -m disk # S4# 方法二
echo mem > /sys/power/state # S3
echo disk > /sys/power/state # S4

References

  • Advanced Configuration and Power Interface - Wikipedia
  • Debugging hibernation and suspend
  • PCI Power Management
  • Generic PM之Suspend功能 - wowo
  • Generic PM之基本概念和软件架构
  • Hibernate功能
  • 《Linux设备驱动开发详解:基于最新的Linux4.0内核》
  • S3待机 S4休眠 - pycod

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_239703.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第10章_索引优化与查询优化

第10章_索引优化与查询优化 都有哪些维度可以进行数据库调优?简言之: 索引失效、没有充分利用到索引——索引建立关联查询太多JOIN (设计缺陷或不得已的需求)——SQL优化服务器调优及各个参数设置(缓冲、线程数等)———调整my.cnf。数据过多――分库分表 关于数据库调优的…

net/http 库的客户端实现(下)

前言 上一篇文章我们讲了 net/http 库客户端 request 的构建,接下来继续讲构建HTTP请求之后的处理操作 net/http 库的客户端实现(上) net/http 库的客户端实现(下) net/http 库的服务端实现 启动事务 构建 HTTP 请求后,接着需要开启HTTP事务进行请…

Python——几个常用的数学函数

1. min()函数:取出给定参数的最小值 说明:获取指定数值或者指定序列中最小值。 print(min(1, 5)) print(min(1, 2, 3, 4, 5, 6)) print(min([2, 3, 4, 5])) 2.max()函数:取出给定参数的最大值 说明:获取指定数值或者指定序列中…

XDocReport使用入门

XDocReport 简介 XDocReport是GitHub上根据麻省理工学院许可证开源的Wrod导出框架。XDocReport可以根据ODT、Doc、Docx文档模板通过模板引擎语法(Freemarker、Velocity)转换为另外一种格式文档(Doc、Docx、XHTML、PDF)。 XDocR…

前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

文章目录6. 控制台打印(Console)模拟Java日志打印格式美化对象打印(表格形式打印输出)日志等级输出(让其在控制台显示时有颜色提示)代码运行时间统计打印输出6. 控制台打印(Console)…

用树莓派4B安装gitlab,亲测可用~

最近成功在CentOS7上安装了gitlab,忽然想到是不是可以把吃灰的树莓派4B也装上gitlab,于是研究了一下,做个分享。 树莓派是4B 8G版本。本身装的是官方的64位系统。之前可能还装过一些乱七八糟的东西,这里就不提了。 上gitlab官网…

移动 IP(计算机网络-网络层)

目录 移动性对网络应用的影响 移动IP中数据报的转发过程 移动IP中数据报的转发过程 三角路由的低效性 解决三角路由的低效性 移动IP的标准 移动性对网络应用的影响 现在先考虑这样一种情况,一个用户拿着无线移动设备在一个Wi-Fi服务区内走动,并且边…

【python圣诞树的实现】

🤵‍♂️ 个人主页老虎也淘气 个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏…

http 库的服务端实现

前言 net/http 库的客户端实现(上) net/http 库的客户端实现(下) net/http 库的服务端实现 上两篇文章介绍了 http 客户端的实现,这篇文章看一下服务端的实现 服务端 使用 net/http 库可以快速搭建HTTP服务,HTTP服务端主要包含两部分: …

【圣诞特辑】码一个漂漂亮亮的圣诞树(Single Dog版)

目录 前言 一、C语言版圣诞树 1.代码实现 2.效果图 二、python版圣诞树 1.代码实现 2.效果图​ 三、html5版圣诞树 1.代码实现 2.效果图 总结 前言 圣诞节即将来临,圣诞树也是必不可少的装饰之一。圣诞树是一棵绿叶繁茂的树,上面挂满了彩色的灯…

Python pandas有好几百个库函数,你都用过吗(4)

上一篇链接: https://blog.csdn.net/boysoft2002/article/details/128428569 S~W: Function46~56 Types[Function][45:] [set_eng_float_format, show_versions, test, timedelta_range, to_datetime, to_numeric, to_pickle, to_timedelta, unique,…

VSCode 最全实用插件

一、必备插件 🌾Chinese(中文) Settings Sync(配置同步到云端) 可以让我们的vscode配置同步到云端,当我们跟换电脑或者再次安装vscode的时候,只需要登录账号即可同步配置了 wakatime&#xf…

技术分享 Oracle下启用块跟踪

创建存放块跟踪文件目录 [oraclehost01 ~]$ cd /u01/app [oraclehost01 app]$ mkdir BCT 启用块跟踪 SQL> alter database enable block change tracking using file /u01/app/BCT/rman.bct; 检查块跟踪状态 SQL> col filename for a22 SQL> select filename, status,…

RabbitMQ——延迟队列

目录 一、延迟队列的应用场景 1. 场景:"订单下单成功后,15分钟未支付自动取消" ① 传统处理超时订单 ② RabbitMQ延时队列方案 二、延迟队列中的消息投递和消息消费 1.TTL 和 DLX ① TTL ② DLX和死信队列 ③ 延迟队列 ④ 开发步骤 …

get/post/put/delete请求头说明

目录 1.请求头说明 2.get 3.delete 4.post 5.put 6. 说明 7.Content-Type说明 1.请求头说明 前端发出的请求通过浏览器进行查看,可以发现分为四个部分。常规信息(General),请求头信息(Request Headers),响应头信息(Response Headers)…

ConvLSTM时空预测实战代码详解

写在前面 时空预测是很多领域都存在的问题,不同于时间序列,时空预测不仅需要探究时间的变化,也需要关注空间的变化。许多预测问题都只片面的关注时间问题,如预测某人未来3年患某种病的概率,食堂就餐人数等&#xff0c…

35. 池化层 / 汇聚层 代码实现

1. 池化层 在下面的代码中的pool2d函数,我们实现汇聚层的前向传播。 这类似于之前文章中的的corr2d函数。 然而,这里我们没有卷积核,输出为输入中每个区域的最大值或平均值。 from torch import nn from d2l import torch as d2l# X是输入&…

springcloud-gateway简介

目录 1. gateway简介 1.1 是什么 1.2 作用 1.3 主要特征 1.4 与zuul的主要区别 1.5 主要组件 1.6 架构图 2. 开发示例 2.1 创建一个gateway模块 2.2 与nacos结合使用 2.2.1 默认规则 2.2.2 通过配置文件配置路由 2.2.3 动态路由 1. gateway简介 1.1 是什么 SpringC…

VuePress初学之利用模板theme创建一个个人博客网站

目录前言官方文档创建项目创建目录安装VuePress初始化项目创建文档修改package.json运行项目修改README.md的编码显示官方默认主题创建.vuepress文件创建config.js修改README.md补充logo资源运行效果更多默认主题配置开源主题vuepress-theme-reco安装脚手架初始化项目安装npm运…

10.2、Django入门--前台管理

文章目录1、URLconf 路由管理展示首页2、视图函数处理业务逻辑展示书籍的详细页3、模板管理实现好看的HTML页面3.1 模板引擎配置3.2 模板语法:变量3.3 模板语法: 常用标签3.4 主页与详情页前端HTML设计常用的HTML编写基础标题标签列表标签图片标签链接标签表格标签表…