如何将regmap write access打开

diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c
index 211a335a608d…ee3cccaf5f06 100644
— a/drivers/base/regmap/regmap-debugfs.c
+++ b/drivers/base/regmap/regmap-debugfs.c
@@ -290,7 +290,7 @@ static ssize_t regmap_map_read_file(struct file *file, char __user *user_buf,
count, ppos);
}

-#undef REGMAP_ALLOW_WRITE_DEBUGFS
+#define REGMAP_ALLOW_WRITE_DEBUGFS
#ifdef REGMAP_ALLOW_WRITE_DEBUGFS
/*

  • This can be dangerous especially when we have clients such as

将regmap write access打开

可以将寄存器都dump出来先看一下
cat sys/kernel/debug/regmap/xxxxxx/registers

<think>我们正在讨论regmap_access_table的作用。根据引用[1]中的内容,regmap_access_table是regmap_config结构体中的一部分,用于在读写操作中进行范围检查。具体来说,它包含以下字段: - yes_ranges:被认定为有效的地址范围列表。 - n_yes_ranges:yes_ranges中的条目数量。 - no_ranges:被认定为无效的地址范围列表。 - n_no_ranges:no_ranges中的条目数量。 regmap_access_table的作用是定义一个地址范围的访问规则,用于在读写寄存器时进行合法性检查。当没有提供相应的读写回调函数时,regmap会使用这些表来验证访问的寄存器地址是否在允许的范围内。 ### regmap_access_table的工作机制 1. **范围检查规则**: - 如果访问的寄存器地址落在`yes_ranges`中的任何一个范围内,则允许访问。 - 如果访问的寄存器地址落在`no_ranges`中的任何一个范围内,则拒绝访问。 - 如果既不在`yes_ranges`也不在`no_ranges`中,则默认允许访问(除非有其他限制)。 2. **优先级说明**: - 当同时存在`yes_ranges`和`no_ranges`时,`no_ranges`具有更高的优先级。即如果一个地址同时出现在两个表中,将根据`no_ranges`拒绝访问。 3. **实际应用场景**: - 防止误操作:例如,某些寄存器是只读的,或者某些地址范围保留给其他用途,通过`no_ranges`可以禁止写入。 - 提高安全性:避免驱动程序因编程错误访问到无效地址导致系统崩溃。 ### 示例代码 假设我们有一个设备,其寄存器地址范围是0x00到0x7F,但其中0x40到0x4F是保留区域,不允许访问。我们可以这样定义`regmap_access_table`: ```c static const struct regmap_range yes_ranges[] = { regmap_reg_range(0x00, 0x3F), // 允许访问0x00-0x3F regmap_reg_range(0x50, 0x7F), // 允许访问0x50-0x7F }; static const struct regmap_range no_ranges[] = { regmap_reg_range(0x40, 0x4F), // 禁止访问0x40-0x4F }; static const struct regmap_access_table access_table = { .yes_ranges = yes_ranges, .n_yes_ranges = ARRAY_SIZE(yes_ranges), .no_ranges = no_ranges, .n_no_ranges = ARRAY_SIZE(no_ranges), }; // 在regmap_config中引用 static const struct regmap_config config = { .reg_bits = 8, .val_bits = 8, .wr_table = &access_table, // 写操作使用此访问表 .rd_table = &access_table, // 读操作使用此访问表 .max_register = 0x7F, }; ``` ### 总结 | 功能 | 说明 | |------------------|----------------------------------------------------------------------| | **地址范围检查** | 确保读写操作只在允许的寄存器地址范围内进行 | | **防止非法访问** | 通过`no_ranges`明确禁止访问敏感或保留区域 | | **灵活性** | 可同时定义允许和禁止范围,适应复杂硬件寄存器布局 | [^1]: `regmap_access_table`用于定义寄存器访问的白名单和黑名单,是regmap安全机制的重要组成部分。 §§相关问题§§ 1. 如何定义`regmap_range`?有哪些宏可用? 2. 如果同时不设置`wr_table`和`rd_table`,regmap会如何处理寄存器访问? 3. 在什么情况下需要自定义读写回调函数而不是依赖`regmap_access_table`?</think>### `regmap_access_table` 的作用详解 `regmap_access_table` 是 Linux Regmap 子系统中用于**寄存器访问权限控制**的核心数据结构,其作用是通过定义地址范围规则来确保寄存器操作的安全性。以下是详细解析: --- #### 1. **核心功能:寄存器访问范围检查** 当通过 Regmap API(如 `regmap_write/read`)执行寄存器操作时: - **访问验证**:`regmap_access_table` 会检查目标寄存器地址是否在允许范围内 - **安全防护**:防止意外修改关键寄存器(如配置寄存器、状态寄存器等) - **错误拦截**:拦截非法地址访问,避免硬件损坏或系统崩溃 引用[1]明确指出: > "wr_table, rd_table和volatile_table是可选的表...在写和读操作时被regmap用来进行范围检查" [^1] --- #### 2. **数据结构解析** `regmap_access_table` 包含两个关键规则集: ```c struct regmap_access_table { const struct regmap_range *yes_ranges; // 允许访问的地址范围 unsigned int n_yes_ranges; // 允许范围的数量 const struct regmap_range *no_ranges; // 禁止访问的地址范围 unsigned int n_no_ranges; // 禁止范围的数量 }; ``` - **`yes_ranges`**:白名单,仅允许列表内的地址被访问 - **`no_ranges`**:黑名单,明确禁止访问的地址范围 **优先级规则**: 1. 若地址在 `no_ranges` 中 → 拒绝访问(最高优先级) 2. 若地址在 `yes_ranges` 中 → 允许访问 3. 若都不在 → 默认允许访问 --- #### 3. **实际应用场景** ##### 场景1:保护只读寄存器 ```c static const struct regmap_range read_only_ranges[] = { regmap_reg_range(0x10, 0x1F), // 0x10-0x1F为只读区域 }; static const struct regmap_access_table wr_table = { .no_ranges = read_only_ranges, .n_no_ranges = ARRAY_SIZE(read_only_ranges), }; // 配置到regmap_config static const struct regmap_config config = { .wr_table = &wr_table, // 应用写保护规则 ... }; ``` 效果:尝试写入 `0x10-0x1F` 时返回 `-EACCES` 错误[^1][^3] ##### 场景2:限制访问范围 ```c static const struct regmap_range valid_ranges[] = { regmap_reg_range(0x00, 0x0F), // 仅允许0x00-0x0F }; static const struct regmap_access_table rd_table = { .yes_ranges = valid_ranges, .n_yes_ranges = ARRAY_SIZE(valid_ranges), }; // 配置到regmap_config static const struct regmap_config config = { .rd_table = &rd_table, // 应用读限制 ... }; ``` 效果:读取 `0x10` 及以上地址时返回错误 --- #### 4. **在 Regmap 工作流中的位置** ```mermaid graph TD A[regmap_write/read调用] --> B{访问地址检查} B -->|通过regmap_access_table验证| C[执行硬件操作] B -->|验证失败| D[返回错误-EACCES] C -->|通过regmap_bus| E[实际硬件访问] ``` 关键点: - 在调用底层 `regmap_bus` 操作前完成检查[^4][^5] - 与 `regmap_config` 绑定,通过 `wr_table/rd_table` 字段启用[^1][^5] - 独立于硬件总线(I2C/SPI/MMIO等),提供统一访问控制层 --- #### 5. **设计优势** | 特性 | 说明 | |---------------------|----------------------------------------------------------------------| | **硬件无关性** | 同一套规则适用于I2C/SPI等不同总线设备[^2][^4] | | **运行时安全** | 拦截非法访问,避免硬件锁死或数据损坏 | | **配置灵活性** | 支持白名单+黑名单组合策略 | | **性能开销低** | 范围检查在软件层快速完成,不增加硬件操作延迟 | > 引用[5]强调: > "填充配置struct regmap_config,它是总线设备的一个抽象,直接关系到设备的寄存器操作" [^5] --- ### 总结 `regmap_access_table` 本质是**寄存器访问的防火墙**: 1. **安全屏障**:通过白名单/黑名单机制守护硬件安全 2. **错误预防**:在驱动层拦截非法操作,增强系统稳定性 3. **统一抽象**:为不同总线设备提供一致的访问控制接口 [^1]: 用于范围检查的关键数据结构 [^3]: 寄存器操作API的错误处理机制 [^4]: Regmap总线抽象层的实现基础 [^5]: Regmap配置的核心作用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值