/******************************************************************************
 *
 * Name: acnamesp.h - Namespace subcomponent prototypes and defines
 *
 *****************************************************************************/

/*
 * Copyright (C) 2000 - 2005, R. Byron Moore
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    substantially similar to the "NO WARRANTY" disclaimer below
 *    ("Disclaimer") and any redistribution must be conditioned upon
 *    including a substantially similar Disclaimer requirement for further
 *    binary redistribution.
 * 3. Neither the names of the above-listed copyright holders nor the names
 *    of any contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 */

#ifndef __ACNAMESP_H__
#define __ACNAMESP_H__


/* To search the entire name space, pass this as search_base */

#define ACPI_NS_ALL                 ((acpi_handle)0)

/*
 * Elements of acpi_ns_properties are bit significant
 * and should be one-to-one with values of acpi_object_type
 */
#define ACPI_NS_NORMAL              0
#define ACPI_NS_NEWSCOPE            1   /* a definition of this type opens a name scope */
#define ACPI_NS_LOCAL               2   /* suppress search of enclosing scopes */

/* Flags for acpi_ns_lookup, acpi_ns_search_and_enter */

#define ACPI_NS_NO_UPSEARCH         0
#define ACPI_NS_SEARCH_PARENT       0x01
#define ACPI_NS_DONT_OPEN_SCOPE     0x02
#define ACPI_NS_NO_PEER_SEARCH      0x04
#define ACPI_NS_ERROR_IF_FOUND      0x08

#define ACPI_NS_WALK_UNLOCK         TRUE
#define ACPI_NS_WALK_NO_UNLOCK      FALSE


/*
 * nsinit - Namespace initialization
 */
acpi_status
acpi_ns_initialize_objects (
	void);

acpi_status
acpi_ns_initialize_devices (
	void);


/*
 * nsload -  Namespace loading
 */
acpi_status
acpi_ns_load_namespace (
	void);

acpi_status
acpi_ns_load_table (
	struct acpi_table_desc          *table_desc,
	struct acpi_namespace_node      *node);


/*
 * nswalk - walk the namespace
 */
acpi_status
acpi_ns_walk_namespace (
	acpi_object_type                type,
	acpi_handle                     start_object,
	u32                             max_depth,
	u8                              unlock_before_callback,
	acpi_walk_callback              user_function,
	void                            *context,
	void                            **return_value);

struct acpi_namespace_node *
acpi_ns_get_next_node (
	acpi_object_type                type,
	struct acpi_namespace_node      *parent,
	struct acpi_namespace_node      *child);


/*
 * nsparse - table parsing
 */
acpi_status
acpi_ns_parse_table (
	struct acpi_table_desc          *table_desc,
	struct acpi_namespace_node      *scope);

acpi_status
acpi_ns_one_complete_parse (
	u32                             pass_number,
	struct acpi_table_desc          *table_desc);


/*
 * nsaccess - Top-level namespace access
 */
acpi_status
acpi_ns_root_initialize (
	void);

acpi_status
acpi_ns_lookup (
	union acpi_generic_state        *scope_info,
	char                            *name,
	acpi_object_type                type,
	acpi_interpreter_mode           interpreter_mode,
	u32                             flags,
	struct acpi_walk_state          *walk_state,
	struct acpi_namespace_node      **ret_node);


/*
 * nsalloc - Named object allocation/deallocation
 */
struct acpi_namespace_node *
acpi_ns_create_node (
	u32                             name);

void
acpi_ns_delete_node (
	struct acpi_namespace_node      *node);

void
acpi_ns_delete_namespace_subtree (
	struct acpi_namespace_node      *parent_handle);

void
acpi_ns_delete_namespace_by_owner (
	u16                             table_id);

void
acpi_ns_detach_object (
	struct acpi_namespace_node      *node);

void
acpi_ns_delete_children (
	struct acpi_namespace_node      *parent);

int
acpi_ns_compare_names (
	char                            *name1,
	char                            *name2);


/*
 * nsdump - Namespace dump/print utilities
 */
#ifdef	ACPI_FUTURE_USAGE
void
acpi_ns_dump_tables (
	acpi_handle                     search_base,
	u32                             max_depth);
#endif	/* ACPI_FUTURE_USAGE */

void
acpi_ns_dump_entry (
	acpi_handle                     handle,
	u32                             debug_level);

void
acpi_ns_dump_pathname (
	acpi_handle                     handle,
	char                            *msg,
	u32                             level,
	u32                             component);

void
acpi_ns_print_pathname (
	u32                             num_segments,
	char                            *pathname);

acpi_status
acpi_ns_dump_one_object (
	acpi_handle                     obj_handle,
	u32                             level,
	void                            *context,
	void                            **return_value);

#ifdef	ACPI_FUTURE_USAGE
void
acpi_ns_dump_objects (
	acpi_object_type                type,
	u8                              display_type,
	u32                             max_depth,
	u32                             ownder_id,
	acpi_handle                     start_handle);
#endif	/* ACPI_FUTURE_USAGE */


/*
 * nseval - Namespace evaluation functions
 */
acpi_status
acpi_ns_evaluate_by_handle (
	struct acpi_parameter_info      *info);

acpi_status
acpi_ns_evaluate_by_name (
	char                            *pathname,
	struct acpi_parameter_info      *info);

acpi_status
acpi_ns_evaluate_relative (
	char                            *pathname,
	struct acpi_parameter_info      *info);


/*
 * nsnames - Name and Scope manipulation
 */
u32
acpi_ns_opens_scope (
	acpi_object_type                type);

char *
acpi_ns_get_external_pathname (
	struct acpi_namespace_node      *node);

char *
acpi_ns_name_of_current_scope (
	struct acpi_walk_state          *walk_state);

acpi_status
acpi_ns_handle_to_pathname (
	acpi_handle                     target_handle,
	struct acpi_buffer              *buffer);

u8
acpi_ns_pattern_match (
	struct acpi_namespace_node      *obj_node,
	char                            *search_for);

acpi_status
acpi_ns_get_node_by_path (
	char                            *external_pathname,
	struct acpi_namespace_node      *in_prefix_node,
	u32                             flags,
	struct acpi_namespace_node      **out_node);

acpi_size
acpi_ns_get_pathname_length (
	struct acpi_namespace_node      *node);


/*
 * nsobject - Object management for namespace nodes
 */
acpi_status
acpi_ns_attach_object (
	struct acpi_namespace_node      *node,
	union acpi_operand_object       *object,
	acpi_object_type                type);

union acpi_operand_object *
acpi_ns_get_attached_object (
	struct acpi_namespace_node      *node);

union acpi_operand_object *
acpi_ns_get_secondary_object (
	union acpi_operand_object       *obj_desc);

acpi_status
acpi_ns_attach_data (
	struct acpi_namespace_node      *node,
	acpi_object_handler             handler,
	void                            *data);

acpi_status
acpi_ns_detach_data (
	struct acpi_namespace_node      *node,
	acpi_object_handler             handler);

acpi_status
acpi_ns_get_attached_data (
	struct acpi_namespace_node      *node,
	acpi_object_handler             handler,
	void                            **data);


/*
 * nssearch - Namespace searching and entry
 */
acpi_status
acpi_ns_search_and_enter (
	u32                             entry_name,
	struct acpi_walk_state          *walk_state,
	struct acpi_namespace_node      *node,
	acpi_interpreter_mode           interpreter_mode,
	acpi_object_type                type,
	u32                             flags,
	struct acpi_namespace_node      **ret_node);

acpi_status
acpi_ns_search_node (
	u32                             entry_name,
	struct acpi_namespace_node      *node,
	acpi_object_type                type,
	struct acpi_namespace_node      **ret_node);

void
acpi_ns_install_node (
	struct acpi_walk_state          *walk_state,
	struct acpi_namespace_node      *parent_node,
	struct acpi_namespace_node      *node,
	acpi_object_type                type);


/*
 * nsutils - Utility functions
 */
u8
acpi_ns_valid_root_prefix (
	char                            prefix);

acpi_object_type
acpi_ns_get_type (
	struct acpi_namespace_node      *node);

u32
acpi_ns_local (
	acpi_object_type                type);

void
acpi_ns_report_error (
	char                            *module_name,
	u32                             line_number,
	u32                             component_id,
	char                            *internal_name,
	acpi_status                     lookup_status);

void
acpi_ns_report_method_error (
	char                            *module_name,
	u32                             line_number,
	u32                             component_id,
	char                            *message,
	struct acpi_namespace_node      *node,
	char                            *path,
	acpi_status                     lookup_status);

void
acpi_ns_print_node_pathname (
	struct acpi_namespace_node      *node,
	char                            *msg);

acpi_status
acpi_ns_build_internal_name (
	struct acpi_namestring_info     *info);

void
acpi_ns_get_internal_name_length (
	struct acpi_namestring_info     *info);

acpi_status
acpi_ns_internalize_name (
	char                            *dotted_name,
	char                            **converted_name);

acpi_status
acpi_ns_externalize_name (
	u32                             internal_name_length,
	char                            *internal_name,
	u32                             *converted_name_length,
	char                            **converted_name);

struct acpi_namespace_node *
acpi_ns_map_handle_to_node (
	acpi_handle                     handle);

acpi_handle
acpi_ns_convert_entry_to_handle(
	struct acpi_namespace_node      *node);

void
acpi_ns_terminate (
	void);

struct acpi_namespace_node *
acpi_ns_get_parent_node (
	struct acpi_namespace_node      *node);


struct acpi_namespace_node *
acpi_ns_get_next_valid_node (
	struct acpi_namespace_node      *node);

#endif /* __ACNAMESP_H__ */
