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

dma_request_slave_channel_compat 与 dma_request_channel 的区别

1.代码示例

dma_request_channel

#define dma_request_channel(mask, x, y) \__dma_request_channel(&(mask), x, y, NULL)struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask,dma_filter_fn fn, void *fn_param,struct device_node *np)
{struct dma_device *device, *_d;struct dma_chan *chan = NULL;/* Find a channel */mutex_lock(&dma_list_mutex);list_for_each_entry_safe(device, _d, &dma_device_list, global_node) {/* Finds a DMA controller with matching device node */if (np && device->dev->of_node && np != device->dev->of_node)continue;chan = find_candidate(device, mask, fn, fn_param);if (!IS_ERR(chan))break;chan = NULL;}mutex_unlock(&dma_list_mutex);pr_debug("%s: %s (%s)\n",__func__,chan ? "success" : "fail",chan ? dma_chan_name(chan) : NULL);return chan;
}

dma_request_slave_channel_compat

#define dma_request_slave_channel_compat(mask, x, y, dev, name) \__dma_request_slave_channel_compat(&(mask), x, y, dev, name)static inline struct dma_chan
*__dma_request_slave_channel_compat(const dma_cap_mask_t *mask,dma_filter_fn fn, void *fn_param,struct device *dev, const char *name)
{struct dma_chan *chan;chan = dma_request_slave_channel(dev, name);if (chan)return chan;if (!fn || !fn_param)return NULL;return __dma_request_channel(mask, fn, fn_param, NULL);
}struct dma_chan *dma_request_chan(struct device *dev, const char *name)
{struct dma_device *d, *_d;struct dma_chan *chan = NULL;/* If device-tree is present get slave info from here */if (dev->of_node)chan = of_dma_request_slave_channel(dev->of_node, name);/* If device was enumerated by ACPI get slave info from here */if (has_acpi_companion(dev) && !chan)chan = acpi_dma_request_slave_chan_by_name(dev, name);if (chan) {/* Valid channel found or requester needs to be deferred */if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER)return chan;}/* Try to find the channel via the DMA filter map(s) */mutex_lock(&dma_list_mutex);list_for_each_entry_safe(d, _d, &dma_device_list, global_node) {dma_cap_mask_t mask;const struct dma_slave_map *map = dma_filter_match(d, name, dev);if (!map)continue;dma_cap_zero(mask);dma_cap_set(DMA_SLAVE, mask);chan = find_candidate(d, &mask, d->filter.fn, map->param);if (!IS_ERR(chan))break;}mutex_unlock(&dma_list_mutex);return chan ? chan : ERR_PTR(-EPROBE_DEFER);
}
EXPORT_SYMBOL_GPL(dma_request_chan);/*** dma_request_slave_channel - try to allocate an exclusive slave channel* @dev:	pointer to client device structure* @name:	slave channel name** Returns pointer to appropriate DMA channel on success or NULL.*/
struct dma_chan *dma_request_slave_channel(struct device *dev,const char *name)
{struct dma_chan *ch = dma_request_chan(dev, name);if (IS_ERR(ch))return NULL;return ch;
}
EXPORT_SYMBOL_GPL(dma_request_slave_channel);

2. 参数与匹配机制‌

‌dma_request_slave_channel_compat‌

参数包含设备节点(struct device *)、通道名称(const char *name),通过以下步骤匹配:

根据 name 匹配设备树中的 dma-names 值;返回绑定的 dma_chan 结构。

‌dma_request_channel‌

参数需指定 dma_cap_mask_t(通道能力掩码)和自定义过滤函数(dma_filter_fn),通过以下步骤筛选:

遍历所有 DMA 控制器,筛选出支持指定能力的通道(如 DMA_MEMCPY、DMA_SLAVE);调用过滤函数进一步校验通道参数;返回满足条件的通道。

‌3. 主从关系处理‌

‌dma_request_slave_channel_compat‌

隐含从设备(Slave)与 DMA 主控制器(Master)的绑定关系,需依赖设备树中 dmas 属性指向的主控制器节点。

‌dma_request_channel‌

不强制绑定主从关系,适用于内存到内存的传输(DMA_MEM_TO_MEM)或自定义主控制器场景。

4. 代码实现差异‌

‌设备树支持‌

dma_request_slave_channel_compat 内部调用 of_dma_request_slave_channel,直接解析设备树节点;

dma_request_channel 基于 dma_cap_mask 和过滤函数动态匹配,不依赖设备树。

‌兼容性处理‌

dma_request_slave_channel_compat 的 compat 参数可用于支持旧版设备树或不同厂商的控制器兼容;

dma_request_channel 无此机制,需通过过滤函数手动实现兼容性校验。

5.关键区别

6.dma_request_channel 匹配主机逻辑 

 示例

bool filter_by_fifo_size(struct dma_chan *chan, void *param) {struct dma_device *dma_dev = chan->device;return (dma_dev->max_fifo_size >= *(int *)param); // 校验 FIFO 容量
}
// 调用示例:筛选支持 128B FIFO 的控制器
int fifo_size = 128;
dma_request_channel(mask, filter_by_fifo_size, &fifo_size);

相关文章:

  • MySQL中的分组和多表连接
  • 你的私域该大扫除了
  • 什么是向量库和数据向量化?建设向量库有什么作用?
  • 通信原理第七版与第六版的区别附pdf
  • 力扣-数据结构-二叉树
  • 20250429在Ubuntu 20.04.6下安装VMware Workstation16
  • 三种机器学习类型
  • SDC命令详解:使用get_nets命令进行查询
  • 目标检测和目标跟踪的区别与联系
  • 前端——CSS1
  • IAP远程升级入门讲解
  • ​Indira量化APP集成IAS 2.0服务器矩阵协议,正式更新上线苹果App Store
  • conda添加新python版本环境,如何激活和销毁
  • 【MCP Node.js SDK 全栈进阶指南】高级篇(4):自定义传输层开发
  • 云钥科技红外短波工业相机
  • -webkit-line-clamp 的渲染机制
  • (2)python之虚拟环境管理工具venv和anaconda
  • TRAE历史版本下载参考
  • 【LeetCode】彩灯装饰记录 III
  • YOLO12改进-模块-引入边缘 - 可学习局部显著核模块LLSKM 引导网络捕捉小目标的点、边缘等显著特征,提升检测敏感性与多尺度适应性。
  • 陈文清:推进扫黑除恶常态化走深走实,有力回应人民群众对安居乐业的新期待
  • 深入贯彻中央八项规定精神学习教育中央指导组培训会议召开
  • 张元济和百日维新
  • 费高云调研党的建设工作:营造风清气正劲足的政治生态
  • 准85后青海海北州副州长、州公安局局长李贤荣赴山东临沂挂职
  • 2025厦门体育产业采风活动圆满举行