内核ACPI函数API之acpi_reboot

7人阅读 评论(0) 收藏 举报
分类:
acpi_reboot 这个函数用于写pci/io/memory的相关寄存器让其重启

其源码分析如下:

void acpi_reboot(void)
{
	struct acpi_generic_address *rr;
	struct pci_bus *bus0;
	u8 reset_value;
	unsigned int devfn;

	if (acpi_disabled)
		return;
	#得到reboot寄存器的地址
	rr = &acpi_gbl_FADT.reset_register;

	/* ACPI reset register was only introduced with v2 of the FADT */

	if (acpi_gbl_FADT.header.revision < 2)
		return;

	/* Is the reset register supported? The spec says we should be
	 * checking the bit width and bit offset, but Windows ignores
	 * these fields */
	if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER))
		return;
	#要reboot寄存器的值
	reset_value = acpi_gbl_FADT.reset_value;

	/* The reset register can only exist in I/O, Memory or PCI config space
	 * on a device on bus 0. */
	 #根据space_id 判断要reboot是pcie 还是 io/memory
	switch (rr->space_id) {
	case ACPI_ADR_SPACE_PCI_CONFIG:
		/* The reset register can only live on bus 0. */
		#看起来reboot的寄存器只能在bus 0
		bus0 = pci_find_bus(0, 0);
		if (!bus0)
			return;
		/* Form PCI device/function pair. */
		devfn = PCI_DEVFN((rr->address >> 32) & 0xffff,
				  (rr->address >> 16) & 0xffff);
		printk(KERN_DEBUG "Resetting with ACPI PCI RESET_REG.");
		/* Write the value that resets us. */
		#写配置空间寄存器来reboot
		pci_bus_write_config_byte(bus0, devfn,
				(rr->address & 0xffff), reset_value);
		break;
	#如果是io/memory的话,需要调用acpi_reset这个函数来进行.
	case ACPI_ADR_SPACE_SYSTEM_MEMORY:
	case ACPI_ADR_SPACE_SYSTEM_IO:
		printk(KERN_DEBUG "ACPI MEMORY or I/O RESET_REG.\n");
		acpi_reset();
		break;
	}
}

查看评论

sys_reboot()&acpi_enter_sleep_state()

asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd, void * arg) { char buffer[2...
  • wbcuc
  • wbcuc
  • 2012-08-16 16:31:13
  • 2213

内核ACPI函数API之acpi_is_root_bridge

acpi_is_root_bridge 用于判断一个形参的acpi_handle 是否是root bridge 其源码分析如下: int acpi_is_root_bridge(acpi_handle...
  • tiantao2012
  • tiantao2012
  • 2018-04-16 08:28:13
  • 11

内核ACPI函数API之acpi_pci_find_root

acpi_pci_find_root 函数根据形参的handle返回对应的pci root bridge 其源码分析如下: struct acpi_pci_root *acpi_pci_fin...
  • tiantao2012
  • tiantao2012
  • 2018-04-16 09:34:27
  • 9

内核ACPI函数API之acpi_create_platform_device

acpi_create_platform_device 这个函数会为没有platform_driver 自动创建platform_device设备。只有当用户只调用register_platform_...
  • tiantao2012
  • tiantao2012
  • 2018-04-08 08:45:04
  • 9

内核ACPI函数API之acpi_os_map_iomem

void __iomem *__ref acpi_os_map_iomem(acpi_physical_address phys, acpi_size size) 的作用是将形参指定的物理地址的范围映...
  • tiantao2012
  • tiantao2012
  • 2018-04-03 08:20:17
  • 10

内核ACPI函数API之acpi_os_unmap_iomem

acpi_os_unmap_iomem函数用于释放acpi_os_map_iomem 映射的虚拟地址 其源码分析如下: void __ref acpi_os_unmap_iomem(void __i...
  • tiantao2012
  • tiantao2012
  • 2018-04-03 08:21:07
  • 12

内核ACPI函数API之acpi_get_first_physical_node

acpi_get_first_physical_node 这个函数用于获取acpi_device的第一个物理节点。 其源码分析如下: struct device *acpi_get_first_phy...
  • tiantao2012
  • tiantao2012
  • 2018-04-11 08:28:21
  • 13

内核ACPI函数API之acpi_dev_get_resources

acpi_dev_get_resources 用于获取形参指定的acpi_device 所有的资源,这里的资源包括 memory/io/interrupt等 部分资源定义如下: #define IOR...
  • tiantao2012
  • tiantao2012
  • 2018-04-02 09:50:07
  • 18

内核ACPI函数API之acpi_scan_add_handler

int acpi_scan_add_handler(struct acpi_scan_handler *handler)用于将一个acpi handler添加到acpi_scan_handlers_l...
  • tiantao2012
  • tiantao2012
  • 2018-04-09 08:29:15
  • 9

内核ACPI函数API之acpi_bus_get_device

acpi_bus_get_device 这个函数可以通过acpi_handle得到一个acpi_device 其用法如下: if (acpi_bus_get_device(ACPI_HANDLE(&...
  • tiantao2012
  • tiantao2012
  • 2018-04-04 08:31:14
  • 12
    个人资料
    持之以恒
    等级:
    访问量: 37万+
    积分: 1万+
    排名: 810
    最新评论