long acpi_video_get_capabilities(acpi_handle graphics_handle) { long caps = 0; struct acpi_device *tmp_dev; acpi_status status; if (acpi_video_caps_checked && graphics_handle == NULL) return acpi_video_support; if (!graphics_handle) { acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, find_video, &caps, NULL); acpi_video_support |= caps; acpi_video_caps_checked = 1; } else { status = acpi_bus_get_device(graphics_handle, &tmp_dev); if (ACPI_FAILURE(status)) { ACPI_EXCEPTION((AE_INFO, status, "Invalid device")); return 0; } acpi_walk_namespace(ACPI_TYPE_DEVICE, graphics_handle, ACPI_UINT32_MAX, find_video, &caps, NULL); } ACPI_DEBUG_PRINT((ACPI_DB_INFO, "We have 0x%lX video support %s %s\n", graphics_handle ? caps : acpi_video_support, graphics_handle ? "on device " : "in general", graphics_handle ? acpi_device_bid(tmp_dev) : "")); return caps; }
static int __init acpi_memory_device_init(void) { int result; acpi_status status; ACPI_FUNCTION_TRACE("acpi_memory_device_init"); result = acpi_bus_register_driver(&acpi_memory_device_driver); if (result < 0) return_VALUE(-ENODEV); status = acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, acpi_memory_register_notify_handler, NULL, NULL); if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "walk_namespace failed\n")); acpi_bus_unregister_driver(&acpi_memory_device_driver); return_VALUE(-ENODEV); } return_VALUE(0); }
static int __init check_acpi_ids(struct acpi_processor *pr_backup) { if (!pr_backup) return -ENODEV; /* All online CPUs have been processed at this stage. Now verify * whether in fact "online CPUs" == physical CPUs. */ acpi_id_present = kcalloc(BITS_TO_LONGS(nr_acpi_bits), sizeof(unsigned long), GFP_KERNEL); if (!acpi_id_present) return -ENOMEM; acpi_id_cst_present = kcalloc(BITS_TO_LONGS(nr_acpi_bits), sizeof(unsigned long), GFP_KERNEL); if (!acpi_id_cst_present) { kfree(acpi_id_present); return -ENOMEM; } acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, read_acpi_id, NULL, NULL, NULL); acpi_get_devices("ACPI0007", read_acpi_id, NULL, NULL); if (!bitmap_equal(acpi_id_present, acpi_ids_done, nr_acpi_bits)) { unsigned int i; for_each_set_bit(i, acpi_id_present, nr_acpi_bits) { pr_backup->acpi_id = i; /* Mask out C-states if there are no _CST or PBLK */ pr_backup->flags.power = test_bit(i, acpi_id_cst_present); (void)upload_pm_data(pr_backup); }
acpi_status acpi_db_display_objects ( NATIVE_CHAR *obj_type_arg, NATIVE_CHAR *display_count_arg) { acpi_object_type8 type; /* Get the object type */ type = acpi_db_match_argument (obj_type_arg, acpi_db_object_types); if (type == ACPI_TYPE_NOT_FOUND) { acpi_os_printf ("Invalid or unsupported argument\n"); return (AE_OK); } acpi_db_set_output_destination (DB_DUPLICATE_OUTPUT); acpi_os_printf ("Objects of type [%s] defined in the current ACPI Namespace: \n", acpi_ut_get_type_name (type)); acpi_db_set_output_destination (DB_REDIRECTABLE_OUTPUT); /* Walk the namespace from the root */ acpi_walk_namespace (type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, acpi_db_walk_for_specific_objects, (void *) &type, NULL); acpi_db_set_output_destination (DB_CONSOLE_OUTPUT); return (AE_OK); }
/* fjes_init_module - Driver Registration Routine */ static int __init fjes_init_module(void) { bool found = false; int result; acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, acpi_find_extended_socket_device, NULL, &found, NULL); if (!found) return -ENODEV; pr_info("%s - version %s - %s\n", fjes_driver_string, fjes_driver_version, fjes_copyright); fjes_dbg_init(); result = platform_driver_register(&fjes_driver); if (result < 0) { fjes_dbg_exit(); return result; } result = acpi_bus_register_driver(&fjes_acpi_driver); if (result < 0) goto fail_acpi_driver; return 0; fail_acpi_driver: platform_driver_unregister(&fjes_driver); fjes_dbg_exit(); return result; }
static ssize_t tpm_show_ppi_version(struct device *dev, struct device_attribute *attr, char *buf) { acpi_handle handle; acpi_status status; struct acpi_object_list input; struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object params[4]; union acpi_object *obj; input.count = 4; ppi_assign_params(params, TPM_PPI_FN_VERSION); input.pointer = params; status = acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, ppi_callback, NULL, tpm_device_name, &handle); if (ACPI_FAILURE(status)) return -ENXIO; status = acpi_evaluate_object_typed(handle, "_DSM", &input, &output, ACPI_TYPE_STRING); if (ACPI_FAILURE(status)) return -ENOMEM; obj = (union acpi_object *)output.pointer; status = scnprintf(buf, PAGE_SIZE, "%s\n", obj->string.pointer); kfree(output.pointer); return status; }
/* Returns true if the ACPI object is a video device which can be * handled by video.ko. * The device will get a Linux specific CID added in scan.c to * identify the device as an ACPI graphics device * Be aware that the graphics device may not be physically present * Use acpi_video_get_capabilities() to detect general ACPI video * capabilities of present cards */ long acpi_is_video_device(acpi_handle handle) { acpi_handle h_dummy; long video_caps = 0; /* Is this device able to support video switching ? */ if (ACPI_SUCCESS(acpi_get_handle(handle, "_DOD", &h_dummy)) || ACPI_SUCCESS(acpi_get_handle(handle, "_DOS", &h_dummy))) video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING; /* Is this device able to retrieve a video ROM ? */ if (ACPI_SUCCESS(acpi_get_handle(handle, "_ROM", &h_dummy))) video_caps |= ACPI_VIDEO_ROM_AVAILABLE; /* Is this device able to configure which video head to be POSTed ? */ if (ACPI_SUCCESS(acpi_get_handle(handle, "_VPO", &h_dummy)) && ACPI_SUCCESS(acpi_get_handle(handle, "_GPD", &h_dummy)) && ACPI_SUCCESS(acpi_get_handle(handle, "_SPD", &h_dummy))) video_caps |= ACPI_VIDEO_DEVICE_POSTING; /* Only check for backlight functionality if one of the above hit. */ if (video_caps) acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, ACPI_UINT32_MAX, acpi_backlight_cap_match, NULL, &video_caps, NULL); return video_caps; }
acpi_status acpi_db_find_name_in_namespace(char *name_arg) { char acpi_name[5] = "____"; char *acpi_name_ptr = acpi_name; if (strlen(name_arg) > ACPI_NAME_SIZE) { acpi_os_printf("Name must be no longer than 4 characters\n"); return (AE_OK); } /* Pad out name with underscores as necessary to create a 4-char name */ acpi_ut_strupr(name_arg); while (*name_arg) { *acpi_name_ptr = *name_arg; acpi_name_ptr++; name_arg++; } /* Walk the namespace from the root */ (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, acpi_db_walk_and_match_name, NULL, acpi_name, NULL); acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT); return (AE_OK); }
long acpi_is_video_device(struct acpi_device *device) { acpi_handle h_dummy; long video_caps = 0; if (!device) return 0; if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOD", &h_dummy)) || ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOS", &h_dummy))) video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING; if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_ROM", &h_dummy))) video_caps |= ACPI_VIDEO_ROM_AVAILABLE; if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_VPO", &h_dummy)) && ACPI_SUCCESS(acpi_get_handle(device->handle, "_GPD", &h_dummy)) && ACPI_SUCCESS(acpi_get_handle(device->handle, "_SPD", &h_dummy))) video_caps |= ACPI_VIDEO_DEVICE_POSTING; if (video_caps) acpi_walk_namespace(ACPI_TYPE_DEVICE, device->handle, ACPI_UINT32_MAX, acpi_backlight_cap_match, &video_caps, NULL); return video_caps; }
static int __init check_acpi_ids(struct acpi_processor *pr_backup) { if (!pr_backup) return -ENODEV; acpi_id_present = kcalloc(BITS_TO_LONGS(nr_acpi_bits), sizeof(unsigned long), GFP_KERNEL); if (!acpi_id_present) return -ENOMEM; acpi_id_cst_present = kcalloc(BITS_TO_LONGS(nr_acpi_bits), sizeof(unsigned long), GFP_KERNEL); if (!acpi_id_cst_present) { kfree(acpi_id_present); return -ENOMEM; } acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, read_acpi_id, NULL, NULL, NULL); acpi_get_devices("ACPI0007", read_acpi_id, NULL, NULL); if (!bitmap_equal(acpi_id_present, acpi_ids_done, nr_acpi_bits)) { unsigned int i; for_each_set_bit(i, acpi_id_present, nr_acpi_bits) { pr_backup->acpi_id = i; pr_backup->flags.power = test_bit(i, acpi_id_cst_present); (void)upload_pm_data(pr_backup); }
void acpi_db_display_resources(char *object_arg) { struct acpi_namespace_node *node; acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT); acpi_dbg_level |= ACPI_LV_RESOURCES; /* Asterisk means "display resources for all devices" */ if (!object_arg || (!strcmp(object_arg, "*"))) { (void)acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, acpi_db_device_resources, NULL, NULL, NULL); } else { /* Convert string to object pointer */ node = acpi_db_convert_to_node(object_arg); if (node) { if (node->type != ACPI_TYPE_DEVICE) { acpi_os_printf ("%4.4s: Name is not a device object (%s)\n", node->name.ascii, acpi_ut_get_type_name(node->type)); } else { (void)acpi_db_device_resources(node, 0, NULL, NULL); } } } acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT); }
static int __init intel_hid_init(void) { acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, check_acpi_dev, NULL, (void *)intel_hid_ids, NULL); return platform_driver_register(&intel_hid_pl_driver); }
void acpi_db_get_bus_info(void) { /* Search all nodes in namespace */ (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, acpi_db_bus_walk, NULL, NULL, NULL); }
void __init acpi_early_processor_set_pdc(void) { dmi_check_system(processor_idle_dmi_table); acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, early_init_pdc, NULL, NULL, NULL); acpi_get_devices("ACPI0007", early_init_pdc, NULL, NULL); }
static void acpi_processor_uninstall_hotplug_notify(void) { int action = UNINSTALL_NOTIFY_HANDLER; acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, processor_walk_namespace_cb, NULL, &action, NULL); }
void __init acpi_early_processor_set_pdc(void) { processor_dmi_check(); acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, early_init_pdc, NULL, NULL, NULL); acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID, early_init_pdc, NULL, NULL); }
static void __init acpi_processor_check_duplicates(void) { /* check the correctness for all processors in ACPI namespace */ acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, acpi_processor_ids_walk, NULL, NULL, NULL); acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID, acpi_processor_ids_walk, NULL, NULL); }
/* * Returns the video capabilities of a specific ACPI graphics device * * if NULL is passed as argument all ACPI devices are enumerated and * all graphics capabilities of physically present devices are * summarized and returned. This is cached and done only once. */ long acpi_video_get_capabilities(acpi_handle graphics_handle) { long caps = 0; struct acpi_device *tmp_dev; acpi_status status; if (acpi_video_caps_checked && graphics_handle == NULL) return acpi_video_support; if (!graphics_handle) { /* Only do the global walk through all graphics devices once */ acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, find_video, NULL, &caps, NULL); /* There might be boot param flags set already... */ acpi_video_support |= caps; acpi_video_caps_checked = 1; /* Add blacklists here. Be careful to use the right *DMI* bits * to still be able to override logic via boot params, e.g.: * * if (dmi_name_in_vendors("XY")) { * acpi_video_support |= * ACPI_VIDEO_BACKLIGHT_DMI_VENDOR; *} */ dmi_check_system(video_detect_dmi_table); } else { status = acpi_bus_get_device(graphics_handle, &tmp_dev); if (ACPI_FAILURE(status)) { ACPI_EXCEPTION((AE_INFO, status, "Invalid device")); return 0; } acpi_walk_namespace(ACPI_TYPE_DEVICE, graphics_handle, ACPI_UINT32_MAX, find_video, NULL, &caps, NULL); } ACPI_DEBUG_PRINT((ACPI_DB_INFO, "We have 0x%lX video support %s %s\n", graphics_handle ? caps : acpi_video_support, graphics_handle ? "on device " : "in general", graphics_handle ? acpi_device_bid(tmp_dev) : "")); return caps; }
/** * acpi_pci_detect_ejectable - check if the PCI bus has ejectable slots * @handle - handle of the PCI bus to scan * * Returns 1 if the PCI bus has ACPI based ejectable slots, 0 otherwise. */ int acpi_pci_detect_ejectable(acpi_handle handle) { int found = 0; if (!handle) return found; acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1, check_hotplug, NULL, (void *)&found, NULL); return found; }
static void acpi_processor_uninstall_hotplug_notify(void) { #ifdef CONFIG_ACPI_HOTPLUG_CPU int action = UNINSTALL_NOTIFY_HANDLER; acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, processor_walk_namespace_cb, &action, NULL); #endif }
static void acpi_processor_uninstall_hotplug_notify(void) { #ifdef CONFIG_ACPI_HOTPLUG_CPU int action = UNINSTALL_NOTIFY_HANDLER; acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, processor_walk_namespace_cb, NULL, &action, NULL); #endif unregister_hotcpu_notifier(&acpi_cpu_notifier); }
void __init acpi_early_processor_set_pdc(void) { /* * Check whether the system is DMI table. If yes, OSPM * should not use mwait for CPU-states. */ dmi_check_system(processor_idle_dmi_table); acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, early_init_pdc, NULL, NULL, NULL); }
acpi_status acpi_ds_initialize_objects(acpi_native_uint table_index, struct acpi_namespace_node * start_node) { acpi_status status; struct acpi_init_walk_info info; struct acpi_table_header *table; acpi_owner_id owner_id; ACPI_FUNCTION_TRACE(ds_initialize_objects); status = acpi_tb_get_owner_id(table_index, &owner_id); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "**** Starting initialization of namespace objects ****\n")); ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "Parsing all Control Methods:")); info.method_count = 0; info.op_region_count = 0; info.object_count = 0; info.device_count = 0; info.table_index = table_index; info.owner_id = owner_id; /* Walk entire namespace from the supplied root */ status = acpi_walk_namespace(ACPI_TYPE_ANY, start_node, ACPI_UINT32_MAX, acpi_ds_init_one_object, &info, NULL); if (ACPI_FAILURE(status)) { ACPI_EXCEPTION((AE_INFO, status, "During WalkNamespace")); } status = acpi_get_table_by_index(table_index, &table); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "\nTable [%4.4s](id %4.4X) - %hd Objects with %hd Devices %hd Methods %hd Regions\n", table->signature, owner_id, info.object_count, info.device_count, info.method_count, info.op_region_count)); ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "%hd Methods, %hd Regions\n", info.method_count, info.op_region_count)); return_ACPI_STATUS(AE_OK); }
static void acpi_db_test_all_objects(void) { acpi_status status; /* Install the debugger read-object control method if necessary */ if (!read_handle) { status = acpi_install_method(read_method_code); if (ACPI_FAILURE(status)) { acpi_os_printf ("%s, Could not install debugger read method\n", acpi_format_exception(status)); return; } status = acpi_get_handle(NULL, ACPI_DB_READ_METHOD, &read_handle); if (ACPI_FAILURE(status)) { acpi_os_printf ("Could not obtain handle for debug method %s\n", ACPI_DB_READ_METHOD); return; } } /* Install the debugger write-object control method if necessary */ if (!write_handle) { status = acpi_install_method(write_method_code); if (ACPI_FAILURE(status)) { acpi_os_printf ("%s, Could not install debugger write method\n", acpi_format_exception(status)); return; } status = acpi_get_handle(NULL, ACPI_DB_WRITE_METHOD, &write_handle); if (ACPI_FAILURE(status)) { acpi_os_printf ("Could not obtain handle for debug method %s\n", ACPI_DB_WRITE_METHOD); return; } } /* Walk the entire namespace, testing each supported named data object */ (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, acpi_db_test_one_object, NULL, NULL, NULL); }
void acpi_db_check_integrity(void) { struct acpi_integrity_info info = { 0, 0 }; /* Search all nodes in namespace */ (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, acpi_db_integrity_walk, NULL, (void *)&info, NULL); acpi_os_printf("Verified %u namespace nodes with %u Objects\n", info.nodes, info.objects); }
void acpi_db_check_predefined_names(void) { u32 count = 0; /* Search all nodes in namespace */ (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, acpi_db_walk_for_predefined_names, NULL, (void *)&count, NULL); acpi_os_printf("Found %u predefined names in the namespace\n", count); }
/** * sdw_intel_init() - SoundWire Intel init routine * @parent_handle: ACPI parent handle * @res: resource data * * This scans the namespace and creates SoundWire link controller devices * based on the info queried. */ void *sdw_intel_init(acpi_handle *parent_handle, struct sdw_intel_res *res) { acpi_status status; status = acpi_walk_namespace(ACPI_TYPE_DEVICE, parent_handle, 1, sdw_intel_acpi_cb, NULL, res, NULL); if (ACPI_FAILURE(status)) return NULL; return sdw_intel_add_controller(res); }
static void __exit acpi_container_exit(void) { int action = UNINSTALL_NOTIFY_HANDLER; acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, container_walk_namespace_cb, NULL, &action, NULL); acpi_bus_unregister_driver(&acpi_container_driver); return; }
/** * acpi_i2c_register_devices - enumerate I2C slave devices behind adapter * @adapter: pointer to adapter * * Enumerate all I2C slave devices behind this adapter by walking the ACPI * namespace. When a device is found it will be added to the Linux device * model and bound to the corresponding ACPI handle. */ void acpi_i2c_register_devices(struct i2c_adapter *adapter) { acpi_handle handle; acpi_status status; handle = ACPI_HANDLE(adapter->dev.parent); if (!handle) return; status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1, acpi_i2c_add_device, NULL, adapter, NULL); if (ACPI_FAILURE(status)) dev_warn(&adapter->dev, "failed to enumerate I2C slaves\n"); }
static ssize_t tpm_show_ppi_request(struct device *dev, struct device_attribute *attr, char *buf) { acpi_handle handle; acpi_status status; struct acpi_object_list input; struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object params[4]; union acpi_object *ret_obj; input.count = 4; ppi_assign_params(params, TPM_PPI_FN_GETREQ); input.pointer = params; status = acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, ppi_callback, NULL, tpm_device_name, &handle); if (ACPI_FAILURE(status)) return -ENXIO; status = acpi_evaluate_object_typed(handle, "_DSM", &input, &output, ACPI_TYPE_PACKAGE); if (ACPI_FAILURE(status)) return -ENOMEM; /* * output.pointer should be of package type, including two integers. * The first is function return code, 0 means success and 1 means * error. The second is pending TPM operation requested by the OS, 0 * means none and >0 means operation value. */ ret_obj = ((union acpi_object *)output.pointer)->package.elements; if (ret_obj->type == ACPI_TYPE_INTEGER) { if (ret_obj->integer.value) { status = -EFAULT; goto cleanup; } ret_obj++; if (ret_obj->type == ACPI_TYPE_INTEGER) status = scnprintf(buf, PAGE_SIZE, "%llu\n", ret_obj->integer.value); else status = -EINVAL; } else { status = -EINVAL; } cleanup: kfree(output.pointer); return status; }