acpi_os_read_memory(acpi_physical_address phys_addr, u64 *value, u32 width) 这个函数用于读取一个物理io memory里面的值
其源码分析如下:
acpi_status
acpi_os_read_memory(acpi_physical_address phys_addr, u64 *value, u32 width)
{
void __iomem *virt_addr;
unsigned int size = width / 8;
bool unmap = false;
u64 dummy;
int error;
rcu_read_lock();
#首先查找这个物理地址对应的虚拟地址
virt_addr = acpi_map_vaddr_lookup(phys_addr, size);
if (!virt_addr) {
#如果虚拟地址为null,说明这个物理地址还没有映射,这里会临时映射
rcu_read_unlock();
#映射这个物理地址到虚拟地址
virt_addr = acpi_os_ioremap(phys_addr, size);
if (!virt_addr)
return AE_BAD_ADDRESS;
unmap = true;
}
if (!value)
value = &dummy;
#开始读虚拟地址里面的值
error = acpi_os_read_iomem(virt_addr, value, width);
BUG_ON(error);
#如果在这个函数中映射了虚拟地址,则这里取消映射
if (unmap)
iounmap(virt_addr);
else
rcu_read_unlock();
return AE_OK;
}
其中读虚拟地址值的函数如下:
int acpi_os_read_iomem(void __iomem *virt_addr, u64 *value, u32 width)
{
switch (width) {
case 8:
*(u8 *) value = readb(virt_addr);
break;
case 16:
*(u16 *) value = readw(virt_addr);
break;
case 32:
*(u32 *) value = readl(virt_addr);
break;
case 64:
*(u64 *) value = readq(virt_addr);
break;
default:
return -EINVAL;
}
return 0;
}
从这里可以知道acpi_os_read_memory 可以读取物理io memory里面的值,不管这个物理io地址之前释放映射。
内核ACPI函数API之acpi_os_read_memory
最新推荐文章于 2024-08-27 22:47:34 发布