acpi_status acpi_get_irq_routing_table ( acpi_handle device_handle, struct acpi_buffer *ret_buffer) { acpi_status status; ACPI_FUNCTION_TRACE ("acpi_get_irq_routing_table "); /* * Must have a valid handle and buffer, So we have to have a handle * and a return buffer structure, and if there is a non-zero buffer length * we also need a valid pointer in the buffer. If it's a zero buffer length, * we'll be returning the needed buffer size, so keep going. */ if (!device_handle) { return_ACPI_STATUS (AE_BAD_PARAMETER); } status = acpi_ut_validate_buffer (ret_buffer); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } status = acpi_rs_get_prt_method_data (device_handle, ret_buffer); return_ACPI_STATUS (status); }
static acpi_status acpi_rs_validate_parameters(acpi_handle device_handle, struct acpi_buffer *buffer, struct acpi_namespace_node **return_node) { acpi_status status; struct acpi_namespace_node *node; ACPI_FUNCTION_TRACE(rs_validate_parameters); if (!device_handle) { return_ACPI_STATUS(AE_BAD_PARAMETER); } node = acpi_ns_validate_handle(device_handle); if (!node) { return_ACPI_STATUS(AE_BAD_PARAMETER); } if (node->type != ACPI_TYPE_DEVICE) { return_ACPI_STATUS(AE_TYPE); } status = acpi_ut_validate_buffer(buffer); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } *return_node = node; return_ACPI_STATUS(AE_OK); }
/****************************************************************************** * * FUNCTION: acpi_get_name * * PARAMETERS: Handle - Handle to be converted to a pathname * name_type - Full pathname or single segment * Buffer - Buffer for returned path * * RETURN: Pointer to a string containing the fully qualified Name. * * DESCRIPTION: This routine returns the fully qualified name associated with * the Handle parameter. This and the acpi_pathname_to_handle are * complementary functions. * ******************************************************************************/ acpi_status acpi_get_name(acpi_handle handle, u32 name_type, struct acpi_buffer * buffer) { acpi_status status; struct acpi_namespace_node *node; /* Parameter validation */ if (name_type > ACPI_NAME_TYPE_MAX) { return (AE_BAD_PARAMETER); } status = acpi_ut_validate_buffer(buffer); if (ACPI_FAILURE(status)) { return (status); } if (name_type == ACPI_FULL_PATHNAME) { /* Get the full pathname (From the namespace root) */ status = acpi_ns_handle_to_pathname(handle, buffer); return (status); } /* * Wants the single segment ACPI name. * Validate handle and convert to a namespace Node */ status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); if (ACPI_FAILURE(status)) { return (status); } node = acpi_ns_map_handle_to_node(handle); if (!node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; } /* Validate/Allocate/Clear caller buffer */ status = acpi_ut_initialize_buffer(buffer, ACPI_PATH_SEGMENT_LENGTH); if (ACPI_FAILURE(status)) { goto unlock_and_exit; } /* Just copy the ACPI name from the Node and zero terminate it */ ACPI_STRNCPY(buffer->pointer, acpi_ut_get_node_name(node), ACPI_NAME_SIZE); ((char *)buffer->pointer)[ACPI_NAME_SIZE] = 0; status = AE_OK; unlock_and_exit: (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); return (status); }
/******************************************************************************* * * FUNCTION: acpi_get_system_info * * PARAMETERS: out_buffer - A buffer to receive the resources for the * device * * RETURN: Status - the status of the call * * DESCRIPTION: This function is called to get information about the current * state of the ACPI subsystem. It will return system information * in the out_buffer. * * If the function fails an appropriate status will be returned * and the value of out_buffer is undefined. * ******************************************************************************/ acpi_status acpi_get_system_info(struct acpi_buffer * out_buffer) { struct acpi_system_info *info_ptr; acpi_status status; ACPI_FUNCTION_TRACE(acpi_get_system_info); /* Parameter validation */ status = acpi_ut_validate_buffer(out_buffer); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } /* Validate/Allocate/Clear caller buffer */ status = acpi_ut_initialize_buffer(out_buffer, sizeof(struct acpi_system_info)); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } /* * Populate the return buffer */ info_ptr = (struct acpi_system_info *)out_buffer->pointer; info_ptr->acpi_ca_version = ACPI_CA_VERSION; /* System flags (ACPI capabilities) */ info_ptr->flags = ACPI_SYS_MODE_ACPI; /* Timer resolution - 24 or 32 bits */ if (acpi_gbl_FADT.flags & ACPI_FADT_32BIT_TIMER) { info_ptr->timer_resolution = 24; } else { info_ptr->timer_resolution = 32; } /* Clear the reserved fields */ info_ptr->reserved1 = 0; info_ptr->reserved2 = 0; /* Current debug levels */ info_ptr->debug_layer = acpi_dbg_layer; info_ptr->debug_level = acpi_dbg_level; return_ACPI_STATUS(AE_OK); }
static acpi_status acpi_rs_validate_parameters(acpi_handle device_handle, struct acpi_buffer *buffer, struct acpi_namespace_node **return_node) { acpi_status status; struct acpi_namespace_node *node; ACPI_FUNCTION_TRACE(rs_validate_parameters); /* * Must have a valid handle to an ACPI device */ if (!device_handle) { return_ACPI_STATUS(AE_BAD_PARAMETER); } node = acpi_ns_map_handle_to_node(device_handle); if (!node) { return_ACPI_STATUS(AE_BAD_PARAMETER); } if (node->type != ACPI_TYPE_DEVICE) { return_ACPI_STATUS(AE_TYPE); } /* * Validate the user buffer object * * if there is a non-zero buffer length we also need a valid pointer in * the buffer. If it's a zero buffer length, we'll be returning the * needed buffer size (later), so keep going. */ status = acpi_ut_validate_buffer(buffer); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } *return_node = node; return_ACPI_STATUS(AE_OK); }
/****************************************************************************** * * FUNCTION: acpi_get_object_info * * PARAMETERS: Handle - Object Handle * Buffer - Where the info is returned * * RETURN: Status * * DESCRIPTION: Returns information about an object as gleaned from the * namespace node and possibly by running several standard * control methods (Such as in the case of a device.) * ******************************************************************************/ acpi_status acpi_get_object_info(acpi_handle handle, struct acpi_buffer * buffer) { acpi_status status; struct acpi_namespace_node *node; struct acpi_device_info *info; struct acpi_device_info *return_info; struct acpi_compatible_id_list *cid_list = NULL; acpi_size size; /* Parameter validation */ if (!handle || !buffer) { return (AE_BAD_PARAMETER); } status = acpi_ut_validate_buffer(buffer); if (ACPI_FAILURE(status)) { return (status); } info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_device_info)); if (!info) { return (AE_NO_MEMORY); } status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); if (ACPI_FAILURE(status)) { goto cleanup; } node = acpi_ns_map_handle_to_node(handle); if (!node) { (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); status = AE_BAD_PARAMETER; goto cleanup; } /* Init return structure */ size = sizeof(struct acpi_device_info); info->type = node->type; info->name = node->name.integer; info->valid = 0; if (node->type == ACPI_TYPE_METHOD) { info->param_count = node->object->method.param_count; } status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); if (ACPI_FAILURE(status)) { goto cleanup; } /* If not a device, we are all done */ if (info->type == ACPI_TYPE_DEVICE) { /* * Get extra info for ACPI Devices objects only: * Run the Device _HID, _UID, _CID, _STA, _ADR and _sx_d methods. * * Note: none of these methods are required, so they may or may * not be present for this device. The Info->Valid bitfield is used * to indicate which methods were found and ran successfully. */ /* Execute the Device._HID method */ status = acpi_ut_execute_HID(node, &info->hardware_id); if (ACPI_SUCCESS(status)) { info->valid |= ACPI_VALID_HID; } /* Execute the Device._UID method */ status = acpi_ut_execute_UID(node, &info->unique_id); if (ACPI_SUCCESS(status)) { info->valid |= ACPI_VALID_UID; } /* Execute the Device._CID method */ status = acpi_ut_execute_CID(node, &cid_list); if (ACPI_SUCCESS(status)) { size += cid_list->size; info->valid |= ACPI_VALID_CID; } /* Execute the Device._STA method */ status = acpi_ut_execute_STA(node, &info->current_status); if (ACPI_SUCCESS(status)) { info->valid |= ACPI_VALID_STA; } /* Execute the Device._ADR method */ status = acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR, node, &info->address); if (ACPI_SUCCESS(status)) { info->valid |= ACPI_VALID_ADR; } /* Execute the Device._sx_d methods */ status = acpi_ut_execute_sxds(node, info->highest_dstates); if (ACPI_SUCCESS(status)) { info->valid |= ACPI_VALID_SXDS; } } /* Validate/Allocate/Clear caller buffer */ status = acpi_ut_initialize_buffer(buffer, size); if (ACPI_FAILURE(status)) { goto cleanup; } /* Populate the return buffer */ return_info = buffer->pointer; ACPI_MEMCPY(return_info, info, sizeof(struct acpi_device_info)); if (cid_list) { ACPI_MEMCPY(&return_info->compatibility_id, cid_list, cid_list->size); } cleanup: ACPI_FREE(info); if (cid_list) { ACPI_FREE(cid_list); } return (status); }
acpi_status acpi_get_table ( acpi_table_type table_type, u32 instance, struct acpi_buffer *ret_buffer) { struct acpi_table_header *tbl_ptr; acpi_status status; acpi_size table_length; ACPI_FUNCTION_TRACE ("acpi_get_table"); /* Parameter validation */ if (instance == 0) { return_ACPI_STATUS (AE_BAD_PARAMETER); } status = acpi_ut_validate_buffer (ret_buffer); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } /* Check the table type and instance */ if ((table_type > ACPI_TABLE_MAX) || (ACPI_IS_SINGLE_TABLE (acpi_gbl_table_data[table_type].flags) && instance > 1)) { return_ACPI_STATUS (AE_BAD_PARAMETER); } /* Get a pointer to the entire table */ status = acpi_tb_get_table_ptr (table_type, instance, &tbl_ptr); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } /* * acpi_tb_get_table_ptr will return a NULL pointer if the * table is not loaded. */ if (tbl_ptr == NULL) { return_ACPI_STATUS (AE_NOT_EXIST); } /* Get the table length */ if (table_type == ACPI_TABLE_RSDP) { /* * RSD PTR is the only "table" without a header */ table_length = sizeof (struct rsdp_descriptor); } else { table_length = (acpi_size) tbl_ptr->length; } /* Validate/Allocate/Clear caller buffer */ status = acpi_ut_initialize_buffer (ret_buffer, table_length); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } /* Copy the table to the buffer */ ACPI_MEMCPY ((void *) ret_buffer->pointer, (void *) tbl_ptr, table_length); return_ACPI_STATUS (AE_OK); }
acpi_status acpi_get_system_info(struct acpi_buffer * out_buffer) { struct acpi_system_info *info_ptr; acpi_status status; u32 i; ACPI_FUNCTION_TRACE("acpi_get_system_info"); /* Parameter validation */ status = acpi_ut_validate_buffer(out_buffer); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } /* Validate/Allocate/Clear caller buffer */ status = acpi_ut_initialize_buffer(out_buffer, sizeof(struct acpi_system_info)); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } /* * Populate the return buffer */ info_ptr = (struct acpi_system_info *)out_buffer->pointer; info_ptr->acpi_ca_version = ACPI_CA_VERSION; /* System flags (ACPI capabilities) */ info_ptr->flags = ACPI_SYS_MODE_ACPI; /* Timer resolution - 24 or 32 bits */ if (!acpi_gbl_FADT) { info_ptr->timer_resolution = 0; } else if (acpi_gbl_FADT->tmr_val_ext == 0) { info_ptr->timer_resolution = 24; } else { info_ptr->timer_resolution = 32; } /* Clear the reserved fields */ info_ptr->reserved1 = 0; info_ptr->reserved2 = 0; /* Current debug levels */ info_ptr->debug_layer = acpi_dbg_layer; info_ptr->debug_level = acpi_dbg_level; /* Current status of the ACPI tables, per table type */ info_ptr->num_table_types = NUM_ACPI_TABLE_TYPES; for (i = 0; i < NUM_ACPI_TABLE_TYPES; i++) { info_ptr->table_info[i].count = acpi_gbl_table_lists[i].count; } return_ACPI_STATUS(AE_OK); }