Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文搞懂 | Linux互连子系统

一文搞懂 | Linux互连子系统

作者头像
刘盼
发布于 2021-11-15 09:30:58
发布于 2021-11-15 09:30:58
1.1K00
代码可运行
举报
文章被收录于专栏:人人都是极客人人都是极客
运行总次数:0
代码可运行

该框架旨在提供标准内核接口来控制 SoC 上的互连设置。这些设置可以是多个互连设备或功能块之间的吞吐量、延迟和优先级。这可以动态控制以节省功率或提供最大性能

互连总线是具有可配置参数的硬件,可以根据从各种驱动程序接收到的请求在数据路径上设置这些参数。互连总线的一个例子是芯片组中各种组件或功能块之间的互连。一个 SoC 上可以有多个互连,这些互连可以是多层的。

下面是 SoC 互连总线拓扑的简化图。

互连子系统的设计

互连子系统用以下几个概念抽象硬件的实现。

Interconnect provider

以软件的方式定义互连硬件模块,比如上图中的 M NoC、S NoC、C NoC、P NoC 和 Mem NoC。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct icc_provider {
        //注册互连供应商名单
        struct list_head        provider_list;
        //互连供应商节点的内部列表
        struct list_head        nodes;
        //指向设备特定设置操作函数的指针
        int (*set)(struct icc_node *src, struct icc_node *dst);
        //指向设备特定聚合操作函数的指针
        int (*aggregate)(struct icc_node *node, u32 tag, u32 avg_bw,
                         u32 peak_bw, u32 *agg_avg, u32 *agg_peak);
        //指向在聚合开始之前调用的特定于设备的函数的指针
        void (*pre_aggregate)(struct icc_node *node);
        //指向设备特定函数的指针以获取当前带宽
        int (*get_bw)(struct icc_node *node, u32 *avg, u32 *peak);
        //用于从 phandle 参数映射节点的特定于提供程序的回调
        struct icc_node* (*xlate)(struct of_phandle_args *spec, void *data);
        //用于从 phandle 参数映射节点数据的供应商特定回调
        struct icc_node_data* (*xlate_extended)(struct of_phandle_args *spec, void *data);
        //此互连提供程序所属的设备
        struct device           *dev;
        //活跃用户数
        int                     users;
        //是否将使用set配置提供商间对
        bool                    inter_set;
        //指向私有数据的指针
        void                    *data;
};
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct icc_onecell_data {
        /此设备中的节点数
        unsigned int num_nodes;
        //指向此设备中节点的指针数组
        struct icc_node *nodes[];
};

Interconnect provider 提供的相关 API 如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//#include <linux/interconnect-provider.h>
int icc_std_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
                      u32 peak_bw, u32 *agg_avg, u32 *agg_peak);
struct icc_node *icc_node_create(int id);
void icc_node_destroy(int id);
int icc_link_create(struct icc_node *node, const int dst_id);
int icc_link_destroy(struct icc_node *src, struct icc_node *dst);
void icc_node_add(struct icc_node *node, struct icc_provider *provider);
void icc_node_del(struct icc_node *node);
int icc_nodes_remove(struct icc_provider *provider);
int icc_provider_add(struct icc_provider *provider);
int icc_provider_del(struct icc_provider *provider);
struct icc_node_data *of_icc_get_from_provider(struct of_phandle_args *spec);
void icc_sync_state(struct device *dev);

Interconnect node

互连节点定义这些互连硬件的端口。比如图中 CPU 连接到内存的点称为互连节点,属于 Mem NoC 模块。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct icc_node {
        //平台特定的节点 ID
        int                     id;
        //debugfs 中使用的节点名称
        const char              *name;
        //指向我们在遍历时下一步可以去哪里的目标列表
        struct icc_node         **links;
        //到其他互连节点的链接数
        size_t                  num_links;

        //指向此节点的互连供应商
        struct icc_provider     *provider;
        //父提供者的“节点”列表中的列表条目
        struct list_head        node_list;
        //遍历节点图时使用的列表
        struct list_head        search_list;
        //遍历节点图时指向前一个节点的指针
        struct icc_node         *reverse;
        //遍历节点图时使用的标志
        u8                      is_traversed:1;
        //与此节点关联的 QoS 约束请求列表
        struct hlist_head       req_list;
        //来自所有消费者的平均带宽请求的总和
        u32                     avg_bw;
        //来自所有消费者的峰值带宽请求的总和
        u32                     peak_bw;
        //在初始化期间从硬件读取的平均带宽值
        u32                     init_avg;
        //在初始化期间从硬件读取的峰值带宽值
        u32                     init_peak;
        //指向私有数据的指针
        void                    *data;
};

Interconnect endpoints

互连端点是路径的第一个或最后一个元素。每个端点都是一个节点,但并非每个节点都是一个端点。

Interconnect path

互连路径是两个端点之间的一切,包括从源节点到达目标节点必须遍历的所有节点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct icc_path {
        const char *name;
        size_t num_nodes;
        struct icc_req reqs[];
};

Interconnect consumers

向 provider 发送请求,请求各种吞吐量、延迟和优先级。通常是设备驱动程序,根据他们的需要发送请求。

Interconnect consumers 提供的相关 API 如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//include/linux/interconnect.h
struct icc_path *icc_get(struct device *dev, const int src_id,
                         const int dst_id);
struct icc_path *of_icc_get(struct device *dev, const char *name);
struct icc_path *devm_of_icc_get(struct device *dev, const char *name);
struct icc_path *of_icc_get_by_index(struct device *dev, int idx);
void icc_put(struct icc_path *path);
int icc_enable(struct icc_path *path);
int icc_disable(struct icc_path *path);
int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw);
void icc_set_tag(struct icc_path *path, u32 tag);
const char *icc_get_name(struct icc_path *path);

互连子系统的 debugfs 接口

在用户态可以通过 debugfs 的接口去调试互联子系统的信息。

  • /sys/kernel/debug/interconnect/interconnect_graph
  • /sys/kernel/debug/interconnect/interconnect_summary

结果如下所示:

互连子系统的软件流程

最后我们用一张图总结下互连子系统的软件架构

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人人都是极客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文搞懂 | Linux 时钟子系统
Clock 时钟就是 SoC 中的脉搏,由它来控制各个部件按各自的节奏跳动。比如,CPU主频设置,串口的波特率设置,I2S的采样率设置,I2C的速率设置等等。这些不同的clock设置,都需要从某个或某几个时钟源头而来,最终开枝散叶,形成一颗时钟树。可通过 cat /sys/kernel/debug/clk/clk_summary 查看这棵时钟树。
刘盼
2022/01/04
4.6K0
一文搞懂 | Linux 时钟子系统
一文搞懂 | Linux pinctrl/gpio子系统
pinctrl 子系统和 gpio 子系统虽然难度不大,但在内核里的使用率非常高,本文争取一次性把相关内容介绍一遍。
刘盼
2023/01/05
1.5K0
一文搞懂 | Linux pinctrl/gpio子系统
一文搞懂 Linux 网络 Phy 驱动
上图来自 瑞昱半导体 (RealTek) 的 RTL8201F 系列网卡 PHY 芯片手册。按OSI 7层网络模型划分,网卡PHY 芯片(图中的RTL8201F)位于物理层,对应的软件层就是本文讨论的 PHY 驱动层;而 MAC 位于 数据链路层,也是通常软件上所说的网卡驱动层,它不是本文的重点,不做展开。另外,可通过 MDIO 接口对 PHY 芯片进行配置(如PHY芯片寄存器读写),而 PHY 和 MAC 通过 MII/RMII 进行数据传输。
刘盼
2023/11/05
3.7K0
一文搞懂 Linux 网络 Phy 驱动
Linux驱动之PCI子系统剖析
PCI是外围设备互连(Peripheral Component Interconnect)的简称,作为一种通用的总线接口标准,它已经普遍使用在了计算机中。PCI总线常见于x86体系,本文默认面向的体系为x86,注意x86架构下IO与内存是独立编址的。
菜菜cc
2022/11/15
3.8K1
Linux驱动之PCI子系统剖析
VFS四大对象之二 struct inode
继上一篇文章:https://cloud.tencent.com/developer/article/1053842 二、inode结构体:(转自http://blog.csdn.net/shanshanpt/article/details/38943731) inode结构体在(include/linux/fs.h中): 保存的其实是实际的数据的一些信息,这些信息称为“元数据”(也就是对文件属性的描述)。例如:文件大小,设备标识符,用户标识符,用户组标识符,文件模式,扩展属性,文件读取或修改的时间戳,链接
233333
2018/03/07
3K0
Linux input子系统(一)
Linux将按键、键盘、鼠标、触摸屏等设备统称为输入设备,其本质还是字符设备。在一般情况下,这些输入设备在被按下时会产生一个中断或者由CPU定时轮询这些输入设备,如果输入有效,那么cpu会将读到的键值存在缓冲区,驱动的read接口就可以让用户层获取到这些键值。 对于上述流程,在cpu读到有效键值之后的处理都是一样的,也就是read接口只会读取键值,不会关心具体是哪个设备。因此,Linux就设计了一个input框架来处理输入事件,这就是——input子系统。 总结起来就是——Linux内核输入子系统是对不同类别的输入设备进行抽象,随后调用统一的服务函数进行处理。
知否知否应是绿肥红瘦
2025/02/19
2120
Linux input子系统(一)
万字长文教你设备树语法 | 设备树实例解析
在之前使用 S3C2440 开发板移植 Linux 3.4.2 内核时,修改了很多关于 c 文件去适配开发板,和开发板相关的文件放在arch/arm/mxch-xxx目录下,因此 linux 内核 arm 架构下添加了很多开发板的适配文件:
Mculover666
2022/05/23
7.8K1
万字长文教你设备树语法 | 设备树实例解析
文件系统专栏 | 之文件系统架构
文件系统层次分析 由上而下主要分为用户层、VFS层、文件系统层、缓存层、块设备层、磁盘驱动层、磁盘物理层 用户层:最上面用户层就是我们日常使用的各种程序,需要的接口主要是文件的创建、删除、打开、关闭、写、读等。 VFS层:我们知道Linux分为用户态和内核态,用户态请求硬件资源需要调用System Call通过内核态去实现。用户的这些文件相关操作都有对应的System Call函数接口,接口调用 VFS对应的函数。 文件系统层:不同的文件系统实现了VFS的这些函数,通过指针注册到VFS里面。所以,用户的操作
刘盼
2022/08/26
2.9K0
文件系统专栏 | 之文件系统架构
聊聊内核中IO子系统-上篇
I/O子系统概貌 VFS:内核提供不同实现文件系统的抽象,应用端一般请求到vfs,vfs在调用实际文件系统的posix语义函数,可以理解为vfs作为用户态和实际文件系统的之间的转换桥梁,为用户态提供对于底层磁盘文件系统无感知的文件系统服务层。 Page Cache: 缓存文件系统的数据,这里包括文件系统元数据和文件系统数据,在块缓存之上构建页缓存(常说的Buffer/Cache). Mapping Layer:如果内核需要从块设备上读取数据,就必须知道数据在物理设备上的位置,这个是由映射层Mappin
用户4700054
2022/08/17
6100
聊聊内核中IO子系统-上篇
Linux V4L2子系统-Video设备框架分析
在V4L2子系统中,Video设备是一个字符设备,设备节点为/dev/videoX,主设备号为81,次设备号范围为0-63。在用户空间,应用可以通过open/close/ioctl/mmap/read/write系统调用操作Video设备。在内核空间中,Video设备的具体操作方法由驱动中的struct video_device提供。驱动使用video_register_device函数将struct video_device注册到V4L2的核心层,然后V4L2的核心层在向上注册一个字符设备,该字符设备实现了虚拟文件系统要求的方法。这样应用就可以使用系统调用访问虚拟文件系统中Video设备提供的方法,然后进一步访问V4L2核心层提供的v4l2_fops方法集合,最后通过struct video_device结构体中的fops和ioctl_ops方法集合访问Video主设备。Video主设备通过v4l2_subdev_call方法访问Video从设备,同时Video从设备可以通过notify回掉方法通知主设备发生了事件。Camera Host控制器为Video主设备,Camear Sensor(摄像头)为Video从设备,一般为I2C设备。
用户6280468
2023/08/31
7900
Linux V4L2子系统-Video设备框架分析
第三课:linux内核对设备树的处理
转载请注明文章地址 http://wiki.100ask.org/Linux_devicetree
韦东山
2020/09/30
1.6K0
第三课:linux内核对设备树的处理
Linux V4L2子系统-videobuf2框架分析
Video设备产生的数据较多,传统的缓冲机制已不能满足需求。为此,Linux内核抽象出了videobuf2机制,用于管理存放视频图像的帧缓冲。videobuf2抽象层像一座桥梁,将用户空间和V4L2 driver连接起来。videobuf2抽象层向用户空间提供了标准POSIX I/O系统调用,包括read、poll及mmap等,同时还提供了大量与流式I/O相关的V4L2 ioctl调用,包括缓冲区分配、缓冲区入队、缓冲区出队及流控制。虽然使用videobuf2会给驱动程序强加一些设计决策,但是使用它的收益是videobuf2可以减少驱动程序代码和保持V4L2子系统在用户空间API的一致性,显然使用videobuf2更为合理。
用户6280468
2023/08/31
1.4K0
Linux V4L2子系统-videobuf2框架分析
Linux笔记(22)| 设备树初探
今天跟大家分享的是设备树,设备树是Linux3.x以后的版本才引入的,设备树用于描述一个硬件平台的板级细节。
飞哥
2021/03/03
2.4K0
Linux笔记(22)| 设备树初探
一文搞定 Linux 设备树
在Linux 2.6中, ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx中,采用设备树后,许多硬件的细节可以直接通过它传递给Linux,而不再需要在内核中进行大量的冗余编码。
刘盼
2021/10/12
6K0
USB总线-Linux内核USB3.0控制器初始化代码分析(三)
RK33999使用synopsys dwc3的USB3.0控制器IP。早期的初始化需要在两个模块中进行,一个在rockchip官方提供的驱动中初始化,位于drivers/usb/dwc3/dwc3-rockchip.c文件中,主要初始化和CPU紧密相关的内容,如时钟、复位、电源、extcon(用于USB模式切换),另一个在synopsys提供的驱动中初始化,位于drivers/usb/dwc3/core.c文件中,这部分和USB3.0控制器密切相关,如USB3.0控制器内部寄存器地址、USB3.0的PHY、中断等。只有两个模块都初始化完毕,USB3.0控制器才能正常工作。本节只分析USB驱动早期初始化部分。
233333
2022/12/09
6.9K0
USB总线-Linux内核USB3.0控制器初始化代码分析(三)
一文秒懂|Linux字符设备驱动
众所周知,Linux内核主要包括三种驱动模型,字符设备驱动,块设备驱动以及网络设备驱动。
董哥聊技术
2023/11/30
1.9K0
一文秒懂|Linux字符设备驱动
Linux设备树(Device Tree)机制
在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data绝大多数纯属垃圾冗余代码。为了解决这一问题,ARM内核版本3.x之后引入了原先在Power PC等其他体系架构已经使用的Flattened Device Tree。
全栈程序员站长
2022/09/10
5.9K0
Linux设备树(Device Tree)机制
谈谈 Linux 文件系统
最近在看一本 Linux 环境编程的书,加上之前工作中接触了一些关于存储的东西,便突然有兴趣整理一下 Linux 是怎么支撑文件系统的。
CS实验室
2021/07/14
4.7K0
谈谈 Linux 文件系统
Linux Led 子系统
内核中驱动维护者针对每种驱动设计一套【成熟的、标准的、典型的】驱动实现,并把不同厂家的同类硬件驱动中相同的部分抽出来实现好,再把不同部分留出接口给具体的驱动工程师来实现,这就叫驱动框架。
Jasonangel
2023/08/22
6770
Linux Led 子系统
通俗易懂!快速了解虚拟文件系统(VFS)
为什么 Linux 内核的文件系统类型那么多,都能挂载上呢?为什么系统里可以直接 mount 其他文件系统呢?甚至能把 windows 下的文件夹挂载到 windows 上,为什么 Linux 的虚拟文件系统这么强大?这得益于它的数据结构设计得十分精妙。好像听过,Linux 有什么解决不了的?加一层。
哆哆jarvis
2022/08/23
2.7K0
通俗易懂!快速了解虚拟文件系统(VFS)
相关推荐
一文搞懂 | Linux 时钟子系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验