⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bus.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	 * Make sure this device's parent is present before we go about	 * messing with the device.	 */	if (device->parent && !device->parent->status.present) {		device->status = device->parent->status;		if (STRUCT_TO_INT(old_status) != STRUCT_TO_INT(device->status)) {			if (status_changed)				*status_changed = 1;		}		return 0;	}	status = acpi_bus_get_status(device);	if (ACPI_FAILURE(status))		return -ENODEV;	if (STRUCT_TO_INT(old_status) == STRUCT_TO_INT(device->status))		return 0;	if (status_changed)		*status_changed = 1;	/*	 * Device Insertion/Removal	 */	if ((device->status.present) && !(old_status.present)) {		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device insertion detected\n"));		/* TBD: Handle device insertion */	} else if (!(device->status.present) && (old_status.present)) {		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device removal detected\n"));		/* TBD: Handle device removal */	}	return 0;}static int acpi_bus_check_scope(struct acpi_device *device){	int result = 0;	int status_changed = 0;	if (!device)		return -EINVAL;	/* Status Change? */	result = acpi_bus_check_device(device, &status_changed);	if (result)		return result;	if (!status_changed)		return 0;	/*	 * TBD: Enumerate child devices within this device's scope and	 *       run acpi_bus_check_device()'s on them.	 */	return 0;}/** * acpi_bus_notify * --------------- * Callback for all 'system-level' device notifications (values 0x00-0x7F). */static void acpi_bus_notify(acpi_handle handle, u32 type, void *data){	int result = 0;	struct acpi_device *device = NULL;	if (acpi_bus_get_device(handle, &device))		return;	switch (type) {	case ACPI_NOTIFY_BUS_CHECK:		ACPI_DEBUG_PRINT((ACPI_DB_INFO,				  "Received BUS CHECK notification for device [%s]\n",				  device->pnp.bus_id));		result = acpi_bus_check_scope(device);		/*		 * TBD: We'll need to outsource certain events to non-ACPI		 *      drivers via the device manager (device.c).		 */		break;	case ACPI_NOTIFY_DEVICE_CHECK:		ACPI_DEBUG_PRINT((ACPI_DB_INFO,				  "Received DEVICE CHECK notification for device [%s]\n",				  device->pnp.bus_id));		result = acpi_bus_check_device(device, NULL);		/*		 * TBD: We'll need to outsource certain events to non-ACPI		 *      drivers via the device manager (device.c).		 */		break;	case ACPI_NOTIFY_DEVICE_WAKE:		ACPI_DEBUG_PRINT((ACPI_DB_INFO,				  "Received DEVICE WAKE notification for device [%s]\n",				  device->pnp.bus_id));		/* TBD */		break;	case ACPI_NOTIFY_EJECT_REQUEST:		ACPI_DEBUG_PRINT((ACPI_DB_INFO,				  "Received EJECT REQUEST notification for device [%s]\n",				  device->pnp.bus_id));		/* TBD */		break;	case ACPI_NOTIFY_DEVICE_CHECK_LIGHT:		ACPI_DEBUG_PRINT((ACPI_DB_INFO,				  "Received DEVICE CHECK LIGHT notification for device [%s]\n",				  device->pnp.bus_id));		/* TBD: Exactly what does 'light' mean? */		break;	case ACPI_NOTIFY_FREQUENCY_MISMATCH:		ACPI_DEBUG_PRINT((ACPI_DB_INFO,				  "Received FREQUENCY MISMATCH notification for device [%s]\n",				  device->pnp.bus_id));		/* TBD */		break;	case ACPI_NOTIFY_BUS_MODE_MISMATCH:		ACPI_DEBUG_PRINT((ACPI_DB_INFO,				  "Received BUS MODE MISMATCH notification for device [%s]\n",				  device->pnp.bus_id));		/* TBD */		break;	case ACPI_NOTIFY_POWER_FAULT:		ACPI_DEBUG_PRINT((ACPI_DB_INFO,				  "Received POWER FAULT notification for device [%s]\n",				  device->pnp.bus_id));		/* TBD */		break;	default:		ACPI_DEBUG_PRINT((ACPI_DB_INFO,				  "Received unknown/unsupported notification [%08x]\n",				  type));		break;	}	return;}/* --------------------------------------------------------------------------                             Initialization/Cleanup   -------------------------------------------------------------------------- */static int __init acpi_bus_init_irq(void){	acpi_status status = AE_OK;	union acpi_object arg = { ACPI_TYPE_INTEGER };	struct acpi_object_list arg_list = { 1, &arg };	char *message = NULL;	/*	 * Let the system know what interrupt model we are using by	 * evaluating the \_PIC object, if exists.	 */	switch (acpi_irq_model) {	case ACPI_IRQ_MODEL_PIC:		message = "PIC";		break;	case ACPI_IRQ_MODEL_IOAPIC:		message = "IOAPIC";		break;	case ACPI_IRQ_MODEL_IOSAPIC:		message = "IOSAPIC";		break;	case ACPI_IRQ_MODEL_PLATFORM:		message = "platform specific model";		break;	default:		printk(KERN_WARNING PREFIX "Unknown interrupt routing model\n");		return -ENODEV;	}	printk(KERN_INFO PREFIX "Using %s for interrupt routing\n", message);	arg.integer.value = acpi_irq_model;	status = acpi_evaluate_object(NULL, "\\_PIC", &arg_list, NULL);	if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) {		ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PIC"));		return -ENODEV;	}	return 0;}acpi_native_uint acpi_gbl_permanent_mmap;void __init acpi_early_init(void){	acpi_status status = AE_OK;	if (acpi_disabled)		return;	printk(KERN_INFO PREFIX "Core revision %08x\n", ACPI_CA_VERSION);	/* enable workarounds, unless strict ACPI spec. compliance */	if (!acpi_strict)		acpi_gbl_enable_interpreter_slack = TRUE;	acpi_gbl_permanent_mmap = 1;	status = acpi_reallocate_root_table();	if (ACPI_FAILURE(status)) {		printk(KERN_ERR PREFIX		       "Unable to reallocate ACPI tables\n");		goto error0;	}	status = acpi_initialize_subsystem();	if (ACPI_FAILURE(status)) {		printk(KERN_ERR PREFIX		       "Unable to initialize the ACPI Interpreter\n");		goto error0;	}	status = acpi_load_tables();	if (ACPI_FAILURE(status)) {		printk(KERN_ERR PREFIX		       "Unable to load the System Description Tables\n");		goto error0;	}#ifdef CONFIG_X86	if (!acpi_ioapic) {		extern u8 acpi_sci_flags;		/* compatible (0) means level (3) */		if (!(acpi_sci_flags & ACPI_MADT_TRIGGER_MASK)) {			acpi_sci_flags &= ~ACPI_MADT_TRIGGER_MASK;			acpi_sci_flags |= ACPI_MADT_TRIGGER_LEVEL;		}		/* Set PIC-mode SCI trigger type */		acpi_pic_sci_set_trigger(acpi_gbl_FADT.sci_interrupt,					 (acpi_sci_flags & ACPI_MADT_TRIGGER_MASK) >> 2);	} else {		extern int acpi_sci_override_gsi;		/*		 * now that acpi_gbl_FADT is initialized,		 * update it with result from INT_SRC_OVR parsing		 */		acpi_gbl_FADT.sci_interrupt = acpi_sci_override_gsi;	}#endif	status =	    acpi_enable_subsystem(~				  (ACPI_NO_HARDWARE_INIT |				   ACPI_NO_ACPI_ENABLE));	if (ACPI_FAILURE(status)) {		printk(KERN_ERR PREFIX "Unable to enable ACPI\n");		goto error0;	}	return;      error0:	disable_acpi();	return;}static int __init acpi_bus_init(void){	int result = 0;	acpi_status status = AE_OK;	extern acpi_status acpi_os_initialize1(void);	status = acpi_os_initialize1();	status =	    acpi_enable_subsystem(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE);	if (ACPI_FAILURE(status)) {		printk(KERN_ERR PREFIX		       "Unable to start the ACPI Interpreter\n");		goto error1;	}	if (ACPI_FAILURE(status)) {		printk(KERN_ERR PREFIX		       "Unable to initialize ACPI OS objects\n");		goto error1;	}#ifdef CONFIG_ACPI_EC	/*	 * ACPI 2.0 requires the EC driver to be loaded and work before	 * the EC device is found in the namespace (i.e. before acpi_initialize_objects()	 * is called).	 *	 * This is accomplished by looking for the ECDT table, and getting	 * the EC parameters out of that.	 */	status = acpi_ec_ecdt_probe();	/* Ignore result. Not having an ECDT is not fatal. */#endif	status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION);	if (ACPI_FAILURE(status)) {		printk(KERN_ERR PREFIX "Unable to initialize ACPI objects\n");		goto error1;	}	printk(KERN_INFO PREFIX "Interpreter enabled\n");	/* Initialize sleep structures */	acpi_sleep_init();	/*	 * Get the system interrupt model and evaluate \_PIC.	 */	result = acpi_bus_init_irq();	if (result)		goto error1;	/*	 * Register the for all standard device notifications.	 */	status =	    acpi_install_notify_handler(ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY,					&acpi_bus_notify, NULL);	if (ACPI_FAILURE(status)) {		printk(KERN_ERR PREFIX		       "Unable to register for device notifications\n");		goto error1;	}	/*	 * Create the top ACPI proc directory	 */	acpi_root_dir = proc_mkdir(ACPI_BUS_FILE_ROOT, NULL);	return 0;	/* Mimic structured exception handling */      error1:	acpi_terminate();	return -ENODEV;}decl_subsys(acpi, NULL, NULL);static int __init acpi_init(void){	int result = 0;	if (acpi_disabled) {		printk(KERN_INFO PREFIX "Interpreter disabled.\n");		return -ENODEV;	}	result = firmware_register(&acpi_subsys);	if (result < 0)		printk(KERN_WARNING "%s: firmware_register error: %d\n",			__FUNCTION__, result);	result = acpi_bus_init();	if (!result) {		if (!(pm_flags & PM_APM))			pm_flags |= PM_ACPI;		else {			printk(KERN_INFO PREFIX			       "APM is already active, exiting\n");			disable_acpi();			result = -ENODEV;		}	} else		disable_acpi();	return result;}subsys_initcall(acpi_init);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -