本文共 1199 字,大约阅读时间需要 3 分钟。
acpi_os_read_memory(acpi_physical_address phys_addr, u64 *value, u32 width) 这个函数用于读取一个物理io memory里面的值其源码分析如下:acpi_statusacpi_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地址之前释放映射。
转载地址:http://mdnmi.baihongyu.com/