
/******************************************************************************
 *
 * Name: acpiosxf.h - All interfaces to the OS Services Layer (OSL).  These
 *                    interfaces must be implemented by OSL to interface the
 *                    ACPI components to the host operating system.
 *
 *****************************************************************************/


/*
 * 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 __ACPIOSXF_H__
#define __ACPIOSXF_H__

#include "platform/acenv.h"
#include "actypes.h"


/* Priorities for acpi_os_queue_for_execution */

#define OSD_PRIORITY_GPE            1
#define OSD_PRIORITY_HIGH           2
#define OSD_PRIORITY_MED            3
#define OSD_PRIORITY_LO             4

#define ACPI_NO_UNIT_LIMIT          ((u32) -1)
#define ACPI_MUTEX_SEM              1


/* Functions for acpi_os_signal */

#define ACPI_SIGNAL_FATAL           0
#define ACPI_SIGNAL_BREAKPOINT      1

struct acpi_signal_fatal_info
{
	u32                             type;
	u32                             code;
	u32                             argument;
};


/*
 * OSL Initialization and shutdown primitives
 */

acpi_status
acpi_os_initialize (
	void);

acpi_status
acpi_os_terminate (
	void);


/*
 * ACPI Table interfaces
 */

acpi_status
acpi_os_get_root_pointer (
	u32                             flags,
	struct acpi_pointer             *address);

acpi_status
acpi_os_predefined_override (
	const struct acpi_predefined_names *init_val,
	acpi_string                         *new_val);

acpi_status
acpi_os_table_override (
	struct acpi_table_header        *existing_table,
	struct acpi_table_header        **new_table);


/*
 * Synchronization primitives
 */

acpi_status
acpi_os_create_semaphore (
	u32                             max_units,
	u32                             initial_units,
	acpi_handle                     *out_handle);

acpi_status
acpi_os_delete_semaphore (
	acpi_handle                     handle);

acpi_status
acpi_os_wait_semaphore (
	acpi_handle                     handle,
	u32                             units,
	u16                             timeout);

acpi_status
acpi_os_signal_semaphore (
	acpi_handle                     handle,
	u32                             units);

acpi_status
acpi_os_create_lock (
	acpi_handle                     *out_handle);

void
acpi_os_delete_lock (
	acpi_handle                     handle);

void
acpi_os_acquire_lock (
	acpi_handle                     handle,
	u32                             flags);

void
acpi_os_release_lock (
	acpi_handle                     handle,
	u32                             flags);


/*
 * Memory allocation and mapping
 */

void *
acpi_os_allocate (
	acpi_size                       size);

void
acpi_os_free (
	void *                          memory);

acpi_status
acpi_os_map_memory (
	acpi_physical_address           physical_address,
	acpi_size                       size,
	void __iomem                  **logical_address);

void
acpi_os_unmap_memory (
	void __iomem                  *logical_address,
	acpi_size                       size);

#ifdef ACPI_FUTURE_USAGE
acpi_status
acpi_os_get_physical_address (
	void                            *logical_address,
	acpi_physical_address           *physical_address);
#endif


/*
 * Interrupt handlers
 */

acpi_status
acpi_os_install_interrupt_handler (
	u32                             gsi,
	acpi_osd_handler                service_routine,
	void                            *context);

acpi_status
acpi_os_remove_interrupt_handler (
	u32                             gsi,
	acpi_osd_handler                service_routine);


/*
 * Threads and Scheduling
 */

u32
acpi_os_get_thread_id (
	void);

acpi_status
acpi_os_queue_for_execution (
	u32                             priority,
	acpi_osd_exec_callback          function,
	void                            *context);

void
acpi_os_wait_events_complete(
	void * context);

void
acpi_os_wait_events_complete (
	void                            *context);

void
acpi_os_sleep (
	acpi_integer                    milliseconds);

void
acpi_os_stall (
	u32                             microseconds);


/*
 * Platform and hardware-independent I/O interfaces
 */

acpi_status
acpi_os_read_port (
	acpi_io_address                 address,
	u32                             *value,
	u32                             width);

acpi_status
acpi_os_write_port (
	acpi_io_address                 address,
	u32                             value,
	u32                             width);


/*
 * Platform and hardware-independent physical memory interfaces
 */

acpi_status
acpi_os_read_memory (
	acpi_physical_address           address,
	u32                             *value,
	u32                             width);

acpi_status
acpi_os_write_memory (
	acpi_physical_address           address,
	u32                             value,
	u32                             width);


/*
 * Platform and hardware-independent PCI configuration space access
 * Note: Can't use "Register" as a parameter, changed to "Reg" --
 * certain compilers complain.
 */

acpi_status
acpi_os_read_pci_configuration (
	struct acpi_pci_id              *pci_id,
	u32                             reg,
	void                            *value,
	u32                             width);

acpi_status
acpi_os_write_pci_configuration (
	struct acpi_pci_id              *pci_id,
	u32                             reg,
	acpi_integer                    value,
	u32                             width);

/*
 * Interim function needed for PCI IRQ routing
 */

void
acpi_os_derive_pci_id(
	acpi_handle                     rhandle,
	acpi_handle                     chandle,
	struct acpi_pci_id              **pci_id);

/*
 * Miscellaneous
 */

u8
acpi_os_readable (
	void                            *pointer,
	acpi_size                       length);

#ifdef ACPI_FUTURE_USAGE
u8
acpi_os_writable (
	void                            *pointer,
	acpi_size                       length);
#endif

u64
acpi_os_get_timer (
	void);

acpi_status
acpi_os_signal (
	u32                             function,
	void                            *info);

/*
 * Debug print routines
 */

void ACPI_INTERNAL_VAR_XFACE
acpi_os_printf (
	const char                      *format,
	...);

void
acpi_os_vprintf (
	const char                      *format,
	va_list                 args);

void
acpi_os_redirect_output (
	void                            *destination);


/*
 * Debug input
 */

#ifdef ACPI_FUTURE_USAGE
u32
acpi_os_get_line (
	char                            *buffer);
#endif


/*
 * Directory manipulation
 */

void *
acpi_os_open_directory (
	char                            *pathname,
	char                            *wildcard_spec,
	char                            requested_file_type);

/* requeste_file_type values */

#define REQUEST_FILE_ONLY                   0
#define REQUEST_DIR_ONLY                    1


char *
acpi_os_get_next_filename (
	void                            *dir_handle);

void
acpi_os_close_directory (
	void                            *dir_handle);

/*
 * Debug
 */

void
acpi_os_dbg_assert(
	void                            *failed_assertion,
	void                            *file_name,
	u32                             line_number,
	char                            *message);


#endif /* __ACPIOSXF_H__ */
