DRM系列四:初始化drm设备--drm_dev_init
本系列文章基于linux 5.15
一、drm_dev_alloc
用于分配并初始化一个新的 DRM 设备(即drm_device),初始化主要调用drm_dev_init函数
1.1drm_dev_init
drm_device的初始化操作,但是并不会注册,函数定义在drivers/gpu/drm/drm_drv.c
其主要的作用:
- 对应成员变量的简单初始化
- 检测 drm_driver 的 driver_features 标志位是否设置 DRIVER_RENDER , 有则创建对应的设备
dev/dri/enderD(128 - 192) - 创建一个 DRM_MINOR_PRIMARY 子设备, 每个 drm_device 必须有一个默认的 DRM_MINOR_PRIMARY 设备dev/dri/card(0 - 64)
- 检测drm_device的 drm_driver 的 driver_features 标志位是否设置 DRIVER_GEM ,如果设置了则会为我们分配并创建一个默认的起始偏移地址为 DRM_FILE_PAGE_OFFSET_START内存大小为 DRM_FILE_PAGE_OFFSET_SIZE的 vma_offset_manager
- 将父设备名称用作 DRM 设备的唯一标识符 unique(drm_device的成员变量),没有父设备则使用驱动程序名称作为 unique唯一标识符.
static int drm_dev_init(struct drm_device *dev,const struct drm_driver *driver,struct device *parent)
{int ret;if (!drm_core_init_complete) {DRM_ERROR("DRM core is not initialized\n");return -ENODEV;}if (WARN_ON(!parent))return -EINVAL;kref_init(&dev->ref);dev->dev = get_device(parent);dev->driver = driver;INIT_LIST_HEAD(&dev->managed.resources);spin_lock_init(&dev->managed.lock);/* no per-device feature limits by default */dev->driver_features = ~0u;drm_legacy_init_members(dev);INIT_LIST_HEAD(&dev->filelist);INIT_LIST_HEAD(&dev->filelist_internal);INIT_LIST_HEAD(&dev->clientlist);INIT_LIST_HEAD(&dev->vblank_event_list);spin_lock_init(&dev->event_lock);mutex_init(&dev->struct_mutex);mutex_init(&dev->filelist_mutex);mutex_init(&dev->clientlist_mutex);mutex_init(&dev->master_mutex);ret = drmm_add_action(dev, drm_dev_init_release, NULL);if (ret)return ret;dev->anon_inode = drm_fs_inode_new();if (IS_ERR(dev->anon_inode)) {ret = PTR_ERR(dev->anon_inode);DRM_ERROR("Cannot allocate anonymous inode: %d\n", ret);goto err;}/*检测 drm_driver 的 driver_features 标志位是否设置 DRIVER_RENDER , 有则创建对应的设备dev/dri/enderD(128 - 192)*/if (drm_core_check_feature(dev, DRIVER_RENDER)) {ret = drm_minor_alloc(dev, DRM_MINOR_RENDER);if (ret)goto err;}/*创建一个 DRM_MINOR_PRIMARY 子设备, 每个 drm_device 必须有一个默认的 DRM_MINOR_PRIMARY 设备dev/dri/card(0 - 64)*/ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);if (ret)goto err;ret = drm_legacy_create_map_hash(dev);if (ret)goto err;drm_legacy_ctxbitmap_init(dev);
/*检测drm_device的 drm_driver 的 driver_features 标志位是否设置 DRIVER_GEM ,
如果设置了则会为我们分配并创建一个默认的起始偏移地址为 DRM_FILE_PAGE_OFFSET_START内存大小为 DRM_FILE_PAGE_OFFSET_SIZE的 vma_offset_manager*/if (drm_core_check_feature(dev, DRIVER_GEM)) {ret = drm_gem_init(dev);if (ret) {DRM_ERROR("Cannot initialize graphics execution manager (GEM)\n");goto err;}}ret = drm_dev_set_unique(dev, dev_name(parent));if (ret)goto err;return 0;err:drm_managed_release(dev);return ret;
}
1.1.1drm_minor_alloc
根据传入的 type 在 drm_minors_idr 链表中申请一个可用的 id, 并且使用这个 id 作为次设备号, 创建对应的 minor 设备.
- DRM_MINOR_PRIMARY id 范围 0 - 64 ==> dev/dri/card0 - dev/dri/card64
- DRM_MINOR_RENDER id 范围 128 - 192 ==> dev/dri/enderD128 - dev/dri/enderD192
static int drm_minor_alloc(struct drm_device *dev, unsigned int type)
{struct drm_minor *minor;unsigned long flags;int r;minor = drmm_kzalloc(dev, sizeof(*minor), GFP_KERNEL);if (!minor)return -ENOMEM;minor->type = type;minor->dev = dev;idr_preload(GFP_KERNEL);spin_lock_irqsave(&drm_minor_lock, flags);r = idr_alloc(&drm_minors_idr,NULL,64 * type,64 * (type + 1),GFP_NOWAIT);spin_unlock_irqrestore(&drm_minor_lock, flags);idr_preload_end();if (r < 0)return r;minor->index = r;r = drmm_add_action_or_reset(dev, drm_minor_alloc_release, minor);if (r)return r;minor->kdev = drm_sysfs_minor_alloc(minor);if (IS_ERR(minor->kdev))return PTR_ERR(minor->kdev);*drm_minor_get_slot(dev, type) = minor;return 0;
}
1.1.1.1drm_sysfs_minor_alloc
用于为 DRM minor 分配并初始化一个 struct device,其作用如下:
struct device *drm_sysfs_minor_alloc(struct drm_minor *minor)
{const char *minor_str;struct device *kdev;int r;
/*根据 minor->type 的值,选择对应的设备名称格式字符串: a.如果是渲染节点(DRM_MINOR_RENDER),则使用b. "renderD%d"。 如果是普通节点(DRM_MINOR_PRIMARY),则使用 "card%d"。*/if (minor->type == DRM_MINOR_RENDER)minor_str = "renderD%d";elseminor_str = "card%d";kdev = kzalloc(sizeof(*kdev), GFP_KERNEL);if (!kdev)return ERR_PTR(-ENOMEM);/*设置设备属性*/device_initialize(kdev);/*通过 MKDEV 宏将主设备号 DRM_MAJOR 和次设备号 minor->index 组合成设备号*/kdev->devt = MKDEV(DRM_MAJOR, minor->index);kdev->class = drm_class;kdev->type = &drm_sysfs_device_minor;kdev->parent = minor->dev->dev;kdev->release = drm_sysfs_release;dev_set_drvdata(kdev, minor);/*使用 dev_set_name 设置设备名称,格式为 "renderD%d" 或 "card%d",其中 %d 是 minor->index。*/r = dev_set_name(kdev, minor_str, minor->index);if (r < 0)goto err_free;return kdev;err_free:put_device(kdev);return ERR_PTR(r);
}
相关文章:
DRM系列四:初始化drm设备--drm_dev_init
本系列文章基于linux 5.15 一、drm_dev_alloc 用于分配并初始化一个新的 DRM 设备(即drm_device),初始化主要调用drm_dev_init函数 1.1drm_dev_init drm_device的初始化操作,但是并不会注册,函数定义在drivers/gpu/drm/drm_drv.c 其主要的作用&#…...
SpringMVC的参数处理
一、参数接收 1.使用servlet API接收参数 在方法参数中添加HttpServletRequest类型的参数,然后就可以像servlet的方法一样来接收参数 2.在方法中定义同名参数 如果url地址中的参数名与方法的参数名不一致时,可以使用RequestParam注解进行重新关联 url地…...
一觉醒来全球编码能力下降100000倍,新手小白的我决定科普C语言——函数
1. 函数的概念 数学中我们其实就⻅过函数的概念,⽐如:⼀次函数 y kx b ,k和b都是常数,给⼀个任意的 x,就得到⼀个y值。其实在C语⾔也引⼊函数(function)的概念,有些翻译为…...
台账思维和GIS思维在资产管理中的不同模式
最近一些习惯用台账统计资产的网友聊天引发一些感想和大家分享一下:传统台账思维注重统计资产的数量及信息完整性,而GIS除了关心前两个指标外,更注重数据与现实世界是否能一一对应,即数据的现实准确性! 例如࿱…...
AI-ISP论文Learning to See in the Dark解读
论文地址:Learning to See in the Dark 图1. 利用卷积网络进行极微光成像。黑暗的室内环境。相机处的照度小于0.1勒克斯。索尼α7S II传感器曝光时间为1/30秒。(a) 相机在ISO 8000下拍摄的图像。(b) 相机在ISO 409600下拍摄的图像。该图像存在噪点和色彩偏差。©…...
性能优化2-删除无效引用
依赖错综复杂,如何判断是有效依赖 1. package.json webpack升到3以后,未使用的dependence不会被打包;devDependence和dependence基本没啥区别;即生产依赖放入dev中,也能正常打包;但我们仍需遵守依赖的放置…...
Kafka SASL/PLAIN介绍
文章目录 Kafka SASL/PLAIN介绍1. SASL/PLAIN 简介2. 配置步骤(1)Kafka 服务器端配置(2)Kafka 客户端配置(3)测试连接 3. 认证过程3.1 SASL/PLAIN 认证工作原理3.2 认证过程描述 4. 安全性考虑4.1 SASL/PLA…...
Unbutu虚拟机+eclipse+CDT编译调试环境搭建
问题1: 安装CDT,直接Help->eclipse Market space-> 搜cdt , install,等待重启即可. 问题2:C变量不识别vector ’could not be resolved 这是库的头文件没加好,右键Properties->C Build->Enviroment,增加…...
G. XOUR
题目链接:Problem - G - Codeforces 题目大意:给你一个n长的序列, 其中你可以将a[i] XOR a[j] 的值 严格小于4的数对进行交换。 你可以操作任何几次, 让最后的数列最小。如果在 x 和 y 不同的第一个位置, xi<yi &…...
利用metaGPT多智能体框架实现智能体-1
1.metaGPT简介 MetaGPT 是一个基于大语言模型(如 GPT-4)的多智能体协作框架,旨在通过模拟人类团队的工作模式,让多个 AI 智能体分工合作,共同完成复杂的任务。它通过赋予不同智能体特定的角色(如产品经理、…...
[CVPR 2024] AnyDoor: Zero-shot Object-level Image Customization
github.com/ali-vilab/AnyDoor.写在前面: 【论文速读】按照#论文十问#提炼出论文核心知识点,方便相关科研工作者快速掌握论文内容。过程中并不对论文相关内容进行翻译。博主认为翻译难免会损坏论文的原本含义,也鼓励诸位入门级科研人员阅读文…...
高可用 Keepalived 服务部署流程
一、配置文件 vim /etc/keepalived/keepalived.confGLOBAL CONFIGURATION --- 全局配置部分VRRPD CONFIGURATION --- VRRP协议配置部分LVS CONFIGURATION --- LVS服务管理配置部分[rootlb01 ~]# cat /etc/keepalived/keepalived.…...
文件系统分析
文件系统与磁盘管理详解 一、存储设备基础 1. 存储设备类型对比 设备类型特点典型接口应用场景机械硬盘依赖磁头机械读写,转速影响性能(5400/7200/10000rpm),价格低容量大SATA/SAS冷数据存储、备份固态硬盘无机械结构ÿ…...
JS面相对象小案例:自定义安全数组
在JS中,数组不像其他语言(java、python)中那样安全,它具有动态性和弱类型性,切越界访问没有具体的报错,而是返回空,为提升数组的安全性,我们可以自行定义一个安全数组。 一、增加报…...
Microsoft Power BI:融合 AI 的文本分析
Microsoft Power BI 是微软推出的一款功能强大的商业智能工具,旨在帮助用户从各种数据源中提取、分析和可视化数据,以支持业务决策和洞察。以下是关于 Power BI 的深度介绍: 1. 核心功能与特点 Power BI 提供了全面的数据分析和可视化功能&…...
如何实现滑动列表功能
文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了沉浸式状态栏相关的内容,本章回中将介绍SliverList组件.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的SliverList组件是一种列表类组件,类似我们之前介…...
计算机网络一点事(23)
传输层 端口作用:标识主机特定进程,TCP,UDP协议 端口号分类:服务器:0-1023,熟知 1024-49151 登记 客户端:49152-65535 功能:实现端到端,进程到进程的通信,…...
Linux——网络(tcp)
文章目录 目录 文章目录 前言 一、TCP逻辑 1. 面向连接 三次握手(建立连接) 四次挥手(关闭连接) 2. 可靠性 3. 流量控制 4. 拥塞控制 5. 基于字节流 6. 全双工通信 7. 状态机 8. TCP头部结构 9. TCP的应用场景 二、编写tcp代码函数…...
算法题(54):插入区间
审题: 需要我们把newinterval的区间与interval的区间合并起来,并返回合并后的二维数组地址 思路: 方法一:排序合并区间 我们可以先把newinterval插入到interval中,进行排序然后复用合并区间的代码 方法二:模…...
UE学习日志#18 C++笔记#4 基础复习4 指派初始化器和指针
1 指派初始化器 C20引入了指派初始化器,以使用他们的名称初始化所谓聚合的数据成员。 聚合类型是满足以下限制的数组类型的对象或结构或类的对象: 1.仅public数据成员, 2.无用户声明或继承的构造函数, 3.无虚函数和无虚基类、priv…...
【算法】回溯算法专题① ——子集型回溯 python
目录 引入变形实战演练总结 引入 子集 https://leetcode.cn/problems/subsets/description/ 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 …...
Gradle配置指南:深入解析settings.gradle.kts(Kotlin DSL版)
文章目录 Gradle配置指南:深入解析settings.gradle.kts(Kotlin DSL版)settings.gradle.kts 基础配置选项单项目配置多项目配置 高级配置选项插件管理(Plugin Management)基础配置模板案例:Android项目标准配…...
makailio-alias_db模块详解
ALIAS_DB 模块 作者 Daniel-Constantin Mierla micondagmail.com Elena-Ramona Modroiu ramonaasipto.com 编辑 Daniel-Constantin Mierla micondagmail.com 版权 © 2005 Voice Sistem SRL © 2008 asipto.com 目录 管理员指南 概述依赖 2.1 Kamailio 模块 2.2 外…...
【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数
一、使用pytorch框架实现逻辑回归 1. 数据部分: 首先自定义了一个简单的数据集,特征 X 是 100 个随机样本,每个样本一个特征,目标值 y 基于线性关系并添加了噪声。将 numpy 数组转换为 PyTorch 张量,方便后续在模型中…...
Spring Boot - 数据库集成06 - 集成ElasticSearch
Spring boot 集成 ElasticSearch 文章目录 Spring boot 集成 ElasticSearch一:前置工作1:项目搭建和依赖导入2:客户端连接相关构建3:实体类相关注解配置说明 二:客户端client相关操作说明1:检索流程1.1&…...
Java篇之继承
目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…...
32. C 语言 安全函数( _s 尾缀)
本章目录 前言什么是安全函数?安全函数的特点主要的安全函数1. 字符串操作安全函数2. 格式化输出安全函数3. 内存操作安全函数4. 其他常用安全函数 安全函数实例示例 1:strcpy_s 和 strcat_s示例 2:memcpy_s示例 3:strtok_s 总结 …...
ArkTS编程规范
文章目录 目标和适用范围规则来源章节概览代码风格编程实践 术语和定义总体原则命名类名、枚举名、命名空间名采用UpperCamelCase风格变量名、方法名、参数名采用lowerCamelCase风格常量名、枚举值名采用全部大写,单词间使用下划线隔开避免使用否定的布尔变量名&…...
SQL进阶实战技巧:断点去重技术详解
目录 一、核心概念 二、典型应用场景 三、实现步骤与SQL示例 场景 目标 步骤 分析 结果 四、核心原理解释 1. 核心原理:相邻比较 2. 去重的本质 3. 与传统方法的对比 4 类别理解 五、如何应对复杂场景? 1. 多字段断点检测 2. 时间窗口断点 …...
深度学习之“向量范数和距离度量”
在深度学习中,范数和向量距离是两个不同的概念。向量范数是一种函数,用于将一个实数或复数向量映射为一个值。虽然范数通常用于度量向量之间的距离,但是同样也有其它的一些表示距离的方式。 范数距离 范数是具有“长度”概念的函数。在向量…...
