硬件接口¶
DMA 通道¶
request_dma¶
函数签名:
int request_dma(unsigned int dmanr, const char *device_id);
说明: 请求和保留一个系统DMA通道
返回值:
参数:
dmanr:DMA通道编号device_id:保留设备ID字符串,用于/proc/dma
free_dma¶
函数签名:
void free_dma(unsigned int dmanr);
说明: 释放分配的DMA通道
参数:
dmanr:DMA通道编号
资源管理¶
request_resource_conflict¶
函数签名:
struct resource *request_resource_conflict(struct resource *root, struct resource *new);
说明: 请求和保留I/O或内存资源
返回值:
成功:返回0
失败:返回错误码
参数:
root:根资源描述符new:调用这所需的资源描述符
find_next_iomem_res¶
函数签名:
int find_next_iomem_res(resource_size_t start, resource_size_t end, unsigned long flags, unsigned long desc, struct resource *res);
说明: 查找覆盖[start..end]部分的最低iomem资源。
返回值: 成功:返回0 失败:没找到则返回 -ENODEV,参数错误则返回 -EINVAL
参数:
start:要搜索资源的开始地址end:要搜索资源的结束地址flags:资源必须具有的flagsdesc:资源必须具有的描述符res:如果资源找到,则返回它,这个指针指向找到的资源。
reallocate_resource¶
函数签名:
int reallocate_resource(struct resource *root, struct resource *old, resource_size_t newsize, struct resource_constraint *constraint);
说明: 在给定范围和对齐的资源树中分配一个槽。如果新的大小不能在当前位置重新分配,则资源将被重新定位。
返回值:
参数:
root:根资源描述符old:调用者需要的资源描述符newsize:资源描述符的新大小constraint:要满足的大小和对齐约束
lookup_resource¶
函数签名:
struct resource *lookup_resource(struct resource *root, resource_size_t start);
说明: 根据资源起始地址查找现有资源
返回值:
成功:返回资源指针
失败:NULL
参数:
root:根资源描述符start:资源开始地址
insert_resource_conflict¶
函数签名:
struct resource *insert_resource_conflict(struct resource *parent, struct resource *new);
说明: 在资源树中插入资源
返回值:
参数:
parent:新资源的parentnew:要插入的新资源
insert_resource_expand_to_fix¶
函数签名:
void insert_resource_expand_to_fit(struct resource *root, struct resource *new);
说明: 将资源插入到资源树
返回值:
参数:
root:根资源描述符new:要插入的新资源
resource_alignment¶
函数签名:
resource_size_t resource_alignment(struct resource *res);
说明: 计算资源的对齐位置
返回值:
成功:返回0
失败:
参数:
res:资源指针
release_mem_region_adjustable¶
函数签名:
void release_mem_region_adjustable(resource_size_t start, resource_size_t size);
说明: 释放先前保留的内存区域
参数:
start:资源的起始地址size:资源区域大小
merge_system_ram_resource¶
函数签名:
void merge_system_ram_resource(struct resource *res);
说明: 将系统RAM资源标记为可合并的,并尝试将其与相邻的可合并资源合并
参数:
res:资源描述符
alloc_free_mem_region¶
函数签名:
struct resource *alloc_free_mem_region(struct resource *base, unsigned long size, unsigned long align, const char *name);
说明:
找一个相对于 base 的空闲区域
像CXL这样可以动态实例化新内存区域的总线需要一种方法来为这些区域分配物理地址空间。分配并插入一个新资源,以覆盖base空间中一个空闲的、base的后代未占用的范围。
参数:
base:size:从base开始分配的内存大小align:name:资源名字
request_resource¶
函数签名:
int request_resource(struct resource *root, struct resource *new);
说明: 请求和保留I/O或内存资源
参数:
root:根资源描述符new:被调用这需要的资源描述符
release_resource¶
函数签名:
int release_resource(struct resource *old);
说明: 释放之前分配的资源
参数:
old:资源指针
walk_iomem_res_desc¶
函数签名:
int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end, void *arg, int (*func)(struct resource*, void*));
说明: 遍历iomem资源,并使用匹配的资源范围调用func()。
参数:
desc:I/O资源描述符。使用IORES_DESC_NONE跳过desc检查flags:I/O资源标志start:开始地址end:结束地址arg:func回调函数的参数func:为每个符合条件的资源区域调用的回调函数
region_intersects¶
函数签名:
int region_intersects(resource_size_t start, size_t size, unsigned long flags, unsigned long desc);
说明: 确定已知资源域的焦点
参数:
start:资源与的起始地址size:资源域的大小flags:资源标记desc:资源的描述符或IORES_DESC_NONE
allocate_resource¶
函数签名:
int allocate_resource(struct resource *root, struct resource *new, resource_size_t size, resource_size_t min, resource_size_t max, resource_size_t align, resource_size_t (*alignf)(void*, const struct resource*, resource_size_t, resource_size_t), void *alignf_data);
说明: 在给定范围和对齐的资源树中分配空槽。如果已经分配了资源,将使用新的大小重新分配资源
参数:
root:根资源描述符new:被调用这需要的资源描述符size:资源区域大小min:分配资源的地址低位max:分配资源的地址高位align:请求对齐的单位,以字节为单位alignf:对齐函数(可选),如果不是NULL则调用alignf_data:传递给alignf函数的任意数据
insert_resource¶
函数签名:
int insert_resource(struct resource *parent, struct resource *new);
说明: 在资源树中插入资源
参数:
parent:新资源的父节点new:要插入的新资源
remove_resource¶
函数签名:
int remove_resource(struct resource *old);
adjust_resource¶
函数签名:
int adjust_resource(struct resource *res, resource_size_t start, resource_size_t size)
说明: 修改资源的起始位置和大小
参数:
res:要修改的资源start:新的开始值size:新的大小值
__request_region¶
函数签名:
struct resource *__request_region(struct resource *parent, resource_size_t start, resource_size_t n, const char *name, int flags);
说明: 创建新的资源区域
参数:
parent:start:资源区域的起始位置n:资源区域的大小name:调用者的ID字符串flags:IO资源flags
__release_region¶
函数签名:
void __release_region(struct resource *parent, resource_size_t start, resource_size_t n);
说明: 释放之前分配的资源区域
参数:
parent:start:n:
devm_request_resource¶
函数签名:
int devm_request_resource(struct device *dev, struct resource *root, struct resource *new);
说明: 请求和保留一个I/O或者内存资源
这是request_resource()的设备管理版本。通常不需要显式地释放此函数请求的资源,因为当设备与其驱动程序解除绑定时,将会处理这些资源。如果由于某种原因需要显式释放资源,例如由于排序问题,驱动程序必须调用devm_release_resource()而不是常规的release_resource()。
当检测到任何现有资源与新请求的资源之间存在冲突时,将打印一条错误消息。
返回值: 成功时返回0,失败时返回负错误码。
参数:
dev:请求资源的设备root:资源树的根new:请求的资源描述符
devm_release_resource¶
函数签名:
void devm_release_resource(struct device *dev, struct resource *new);
说明: 释放之前分配的资源
参数:
dev:new:
devm_request_free_mem_region¶
函数签名:
struct resource *devm_request_free_mem_region(struct device *dev, struct resource *base, unsigned long size);
说明: 为设备私有内存找到空闲区域
参数:
dev:base:size:
MTRR Handling¶
MTRR(Memory Type Range Registers)。是指处理内存类型范围寄存器的机制。
MTRR 是 x86 架构中的一组寄存器,用于定义系统内存的访问类型。
MTRR 提供了一种机制,可以为系统内存的不同区域指定不同的访问类型,例如写回缓存(write-back cache)、写直达(write-through)或者禁止缓存(uncached)。这些访问类型可以影响内存的性能和一致性。
Linux 内核通过 MTRR handling 机制来管理和配置 MTRR 寄存器。这个机制允许内核在启动过程中读取和设置 MTRR 寄存器的值,以定义内存区域的访问类型。
MTRR handling 在Linux内核中的主要任务包括:
读取和解析系统中的MTRR寄存器的当前配置
提供接口和工具,使用户能够查询和修改 MTRR 寄存器的值
根据系统的需求,根据硬件限制和用户配置来自动配置MTRR寄存器
与其它内核子系统(如缓存管理)进行协调,以确保内存访问类型的一致性和正确性
通过适当配置MTRR寄存器,Linux内核可以优化系统的内存性能,特别是对于一些需要频繁访问的内存区域,如显存或者设备I/O区域。这些优化可以提高系统的响应速度和整体性能。
注意:MTRR Handling 主要适用于 x86 架构的系统,而其它架构可能采用不同的内存访问类型管理机制。
arch_phys_wc_add¶
函数签名:
int arch_phys_wc_add(unsigned long base, unsigned long size);
说明:
参数:
base:size: