当前位置: 首页 > news >正文

linux 6.10.0 CXL/memdev.c 详解

文章目录

    • 前言
    • Ref
    • 正文
      • 1. devm_cxl_add_memdev()
      • 2. devm_cxl_setup_fw_upload()

前言

CXL 是一个比较新的技术,内核版本迭代太快,跟不上节奏,固定一个版本是不行了。

在阅读之前,希望读者能有一定的 PCIe/CXL 基础知识,精力有限,不能把所有知识点都能说的很详细,需要一定的基础才能理解,同时,希望在学习的过程中,手边能有 PCIe Spec 以及 CXL 2.0 /3.1 Spec,以便随时查看,当然,我也会尽量把重点的部分截图在博文中。

最后,如果有问题请留言讨论。

Ref

《PCI_Express_Base_5.0r1.0》
《CXL Specification_rev2p0_ver1p0_2020Oct26》
《CXL-3.1-Specification》

正文

Path: linux/drivers/cxl/core/memdev.c

1. devm_cxl_add_memdev()


struct cxl_memdev *devm_cxl_add_memdev(struct device *host,struct cxl_dev_state *cxlds)
{struct cxl_memdev *cxlmd;struct device *dev;struct cdev *cdev;int rc;cxlmd = cxl_memdev_alloc(cxlds, &cxl_memdev_fops);// 申请内存并初始化 cxlmd// device Obj 初始化// 总线设置为 cxl_bus, 总线通过 cxl_driver->id 与 dev->type 进行匹配// cdev_init 初始化,fops = cxl_memdev_fops, 文件系统创建相应文件// 通过操作 open ioctl 等动作传输到驱动层处理if (IS_ERR(cxlmd))return cxlmd;dev = &cxlmd->dev;rc = dev_set_name(dev, "mem%d", cxlmd->id);// cxlmd->id 通过 ida_alloc_max 分配if (rc)goto err;/** Activate ioctl operations, no cxl_memdev_rwsem manipulation* needed as this is ordered with cdev_add() publishing the device.*/cxlmd->cxlds = cxlds;cxlds->cxlmd = cxlmd;cdev = &cxlmd->cdev;rc = cdev_device_add(cdev, dev);// 创建字符设备驱动if (rc)goto err;rc = devm_add_action_or_reset(host, cxl_memdev_unregister, cxlmd);// 卸载操作if (rc)return ERR_PTR(rc);return cxlmd;err:/** The cdev was briefly live, shutdown any ioctl operations that* saw that state.*/cxl_memdev_shutdown(dev);put_device(dev);return ERR_PTR(rc);
}
EXPORT_SYMBOL_NS_GPL(devm_cxl_add_memdev, CXL);

2. devm_cxl_setup_fw_upload()

设备驱动使用 firmware_upload_register 注册 FW upload, 参数中列出识别设备的名字,可以在文件系统中 /sys/class/firware 找到;

  1. 用户可以写 1 给loading发起一个 FW upload 操作;
  2. 下一步,用户写 FW image 到 data 文件;
  3. 写完之后,写 0 到 loading 文件,表示写完成,然后驱动就会使用 cxl_memdev_fw_ops 提供的接口开始传输 FW;

FW upload 流程是 ops->prepare --》 ops->write --》 ops->poll_complete --》 ops->cleanup

The additional sysfs files are:

  • status - provides an indication of the progress of a firmware update
  • error - provides error information for a failed firmware update
  • remaining_size - tracks the data transfer portion of an update
  • cancel - echo 1 to this file to cancel the update

int devm_cxl_setup_fw_upload(struct device *host, struct cxl_memdev_state *mds)
{struct cxl_dev_state *cxlds = &mds->cxlds;struct device *dev = &cxlds->cxlmd->dev;struct fw_upload *fwl;if (!test_bit(CXL_MEM_COMMAND_ID_GET_FW_INFO, mds->enabled_cmds))// 先看命令支不支持return 0;fwl = firmware_upload_register(THIS_MODULE, dev, dev_name(dev),&cxl_memdev_fw_ops, mds);//  注册if (IS_ERR(fwl))return PTR_ERR(fwl);return devm_add_action_or_reset(host, cxl_remove_fw_upload, fwl);
}
EXPORT_SYMBOL_NS_GPL(devm_cxl_setup_fw_upload, CXL);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【json解析】控制台打印json字符串格式正确,但json.loads()解析失败问题解决
  • Java中等题-不同二叉搜索树(力扣)
  • sqli-labs-master
  • C++快速理解之封装
  • 使用开源 LLM 充当 LangChain 智能体
  • 【C++】5.类和对象(3)
  • 算法训练(leetcode)第四十六天 | 110. 字符串接龙、105. 有向图的完全可达性、106. 岛屿的周长
  • Oracle数据库巡检 - RAC巡检
  • Java常见面试题-11-MongoDb
  • 非线性表之堆的实际应用和二叉树的遍历
  • 三数之和与四数之和 | LeetCode-15 | LeetCode-18 | 双指针 | 降维 | 哈希集合 | Java | 详细注释
  • Hive3:数据的加载与导出
  • 算法板子:欧拉函数——求一个数的欧拉函数、线性时间内求1~n所有数的欧拉函数
  • 宝兰德JVM参数查看及优化
  • 使用ubuntu串口数据收和发不一致问题
  • [nginx文档翻译系列] 控制nginx
  • Android 控件背景颜色处理
  • Docker下部署自己的LNMP工作环境
  • Elasticsearch 参考指南(升级前重新索引)
  • FineReport中如何实现自动滚屏效果
  • java正则表式的使用
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Mysql优化
  • Odoo domain写法及运用
  • php ci框架整合银盛支付
  • Redis的resp协议
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Vue.js-Day01
  • Vue全家桶实现一个Web App
  • Vue组件定义
  • windows-nginx-https-本地配置
  • 闭包--闭包作用之保存(一)
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 机器学习学习笔记一
  • 新版博客前端前瞻
  • 自制字幕遮挡器
  • 阿里云ACE认证学习知识点梳理
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • #laravel 通过手动安装依赖PHPExcel#
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $.ajax()
  • $refs 、$nextTic、动态组件、name的使用
  • (4)Elastix图像配准:3D图像
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (二)学习JVM —— 垃圾回收机制
  • (计算机网络)物理层
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (四)js前端开发中设计模式之工厂方法模式
  • (四)linux文件内容查看
  • (转)visual stdio 书签功能介绍
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程