支持设备的待机唤醒功能

news2024/11/18 1:48:18

系统待机唤醒功能

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_store
	pm_suspend(state);
		enter_state(state);
			suspend_devices_and_enter(state); // 包含挂起和恢复的所有执行
				dpm_suspend_start(PMSG_SUSPEND); // 1
				suspend_enter(state, &wakeup); // 2

// 唤醒流程
// file: drivers/input/apm-power.c
apmpower_event
	system_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.coloradmin.cn/o/113178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rabbit MQ的基本使用

目录 1. MQ是什么,有哪些作用? 2. 主要的MQ框架有哪些? 3. RabbitMQ安装 4. RabbitMQ中的主要概念 5. 消息队列的核心概念 6. 一个简单的生产者和消费者示例。 6.1 消息发送者模块 1. MQ是什么,有哪些作用? 消…

Jenkins配合git构建持续构建流程

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 理解CI CI(Continuous Integration)翻译成持续集成,是指在源代码变更后自动检测、检出、构建、自动化测试到发布的过程。常见的开源CI工具有J…

Go类型与进制

iota:总是从0开始,递增为1的整数 一、进制 二进制0b1001000 0100 1000 八进制 0o110 01 001 000》 1 * 8^21 * 8^10 * 8^072 十六进制0x48 0100 1000 十进制转二进制 除以基数2,直到商为0为止,反向提取余数。 转为十六进制 除以基…

机器视觉(六):频域图像增强

目录: 机器视觉(一):概述 机器视觉(二):机器视觉硬件技术 机器视觉(三):摄像机标定技术 机器视觉(四):空域图像增强 …

【云原生】Grafana Alerting 告警模块介绍与实战操作

文章目录一、概述二、Grafana Alerting 模块介绍三、配置图表四、告警告警规则五、配置告警通道(Contact points)1)Email1、配置smtp(grafana.ini)2、配置消息模板3、配置告警通道2)WebHook1、编写webhook …

【问题记录与解决】TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

目录 一、报错内容二、尝试再运行(最终解决)一、报错内容 先来看报错截图: 再往上看看: 程序其实是正确执行了一部分的,可以看出首次运行时,是需要下载一些东西的。 二、尝试再运行(最终解决) 所测试的代码如下: # 昵 称:XieXu # 时 间: 2022/12/24/0024 18:44 fr…

刷机-把机顶盒当服务器使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、为啥要刷机顶盒什么?二、使用步骤1.拆机2.准备下载工具3.准备烧录软件和固件4.烧录5.如何使用总结前言 今天给大家分享一篇关于如何把机顶盒刷机…

国考省考行测:接语选择题,接下来最可能讲,上文可能谈,引言可能谈,有过渡句,看新主体,无过渡句,看主旨意思

国考省考行测:接语选择题,接下来最可能讲,上文可能谈,引言可能谈,有过渡句,看新主体,无过渡句,看主旨意思 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能…

vue3 +ts 第二篇

1.watch watchEffect 监听汇总 watchwatchEffect默认情况是惰性的,也就是说仅在侦听的源数据变更时才执行回调。不需要手动传入依赖更明确哪些状态的改变会触发侦听器重新运行副作用;会先执行一次用来自动收集依赖获取到侦听状态变化前后的值。无法获取…

【概念理解】内存对齐问题详述

内存之对齐,一文即可知 文章目录内存对齐1.概述2.如何进行内存对齐3.位域对齐大端存储与小端存储1.基本概念参考博客😊点此到文末惊喜↩︎ 内存对齐 1.概述 定义(什么是内存对齐) 编译器为程序中的每个数据单元安排在适当的位置…

【深入浅出Spring原理及实战】「开发实战系列」OAuth2的技术体系架构和开发概览

背景介绍 主要实现 OAuth2的三种授权模式:密码模式、客户端模式和授权码模式,包括展示授权服务器、资源服务器、客户端等几种角色的交互,以及JWT的整合。并且每个实例都提供两个代码版本:一个是基于旧的 Spring Security OAuth2 …

基于java学生成绩管理系统

开发工具eclipse,jdk1.8 技术:java swing 数据库:mysql5.7 学生选课系统功能:管理员、教师、学生三个角色 一、管理员功能: 1.登录、修改密码、退出系统 2.学生管理:添加、修改、删除、查询 3.班级管理&#x…

python文件夹拷贝思路

最近在做项目中,要使用python,对文件拷贝有了一些了解,这里将自己理解的文件拷贝整理出来。 如下所示,文件拷贝思路: 文件拷贝,从io上来说就是读文件,写文件到另一个指定的地方。 拷贝&#xff…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《1》

原论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 开源代码:https://github.com/ijkguo/mx-rcnn Parallel Faster R-CNN implementation with MXNet,使用MXNet实现快速并行的区域提议的卷积神经网络…

[oeasy]python0032_杀死进程_进程后台运行不输出_nohup_ps_显示进程

查看进程 回忆上次内容 上次先ctrl z 挂起进程 然后运行 bg程序继续跑起来而且不断输出到标准输出流甚至连ctrl c 都无法结束进程了这可怎么办呢?只能新开一个终端想办法 查询进程 搜索 debian进程查询找到具体方法 进程 具体方法动手试试 新开一个终端 运行ps…

新冠阳性的第五篇博客,宝塔面板如何快速部署一个SpringBoot项目

宝塔面板如何快速部署一个SpringBoot项目1.删除旧版本的Java2.安装Java3.配置Java环境变量4.宝塔快速部署1.删除旧版本的Java 删除旧版本的Java,防止对我们的服务产生影响! 如果你的服务器上没有下载过Java,则跳过此步骤! 查找…

【K3s】第1篇 K3s入门级介绍及架构详解

目录 1、什么是 K3s? 2、为什么叫 K3s? 3、适用场景 4、架构详解 单节点架构 高可用架构 K3s高可用架构: 固定 agent 节点的注册地址 注册 Agent 节点 1、什么是 K3s? K3s 是一个轻量级的 Kubernetes 发行版,它针对边缘计算、物联网等场景进…

SpringBoot图文详解 | 系统性学习 | 无知的我费曼笔记

无知的我复盘,顺便上传笔记。 对比Spring,SpringBoot 其实就是简化了固定的开发步骤。如坐标、Web3.0配置类、配置类 文章目录1 SpringBoot简介1.1 SpringBoot快速入门1.1.1 开发步骤1.1.1.1 创建新模块1.1.1.2 创建 Controller1.1.1.3 启动服务器1.1.1.…

【问题记录与解决】OSError: [WinError 127] 找不到指定的程序。

目录 一、报错记录二、尝试解决(已解决)2.1 先 卸载掉 几个与torch相关的模块2.2 重新下载几个模块,并分别安装一、报错记录 首先来看报错的截图: 报错的具体代码,可以看这里,和这里使用的一样的: 【Pytorch_Geometric】(GCN)基本使用:数据集与邻接矩阵格式,图形(…

河道水尺水位监测系统 基于opencv

河道水尺水位监测系统基于pythonopencv对现场画面中水位进行实时监测,当监测到画面中水位异常变化时,立即抓拍存档同步回传图片给后台。Python是一种由Guido van Rossum开发的通用编程语言,它很快就变得非常流行,主要是因为它的简…