/******************************************************************************1*2* Name: aclinux.h - OS specific defines, etc. for Linux3*4*****************************************************************************/56/*7* Copyright (C) 2000 - 2011, Intel Corp.8* All rights reserved.9*10* Redistribution and use in source and binary forms, with or without11* modification, are permitted provided that the following conditions12* are met:13* 1. Redistributions of source code must retain the above copyright14* notice, this list of conditions, and the following disclaimer,15* without modification.16* 2. Redistributions in binary form must reproduce at minimum a disclaimer17* substantially similar to the "NO WARRANTY" disclaimer below18* ("Disclaimer") and any redistribution must be conditioned upon19* including a substantially similar Disclaimer requirement for further20* binary redistribution.21* 3. Neither the names of the above-listed copyright holders nor the names22* of any contributors may be used to endorse or promote products derived23* from this software without specific prior written permission.24*25* Alternatively, this software may be distributed under the terms of the26* GNU General Public License ("GPL") version 2 as published by the Free27* Software Foundation.28*29* NO WARRANTY30* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS31* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT32* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR33* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT34* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL35* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS36* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)37* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,38* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING39* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE40* POSSIBILITY OF SUCH DAMAGES.41*/4243#ifndef __ACLINUX_H__44#define __ACLINUX_H__4546/* Common (in-kernel/user-space) ACPICA configuration */4748#define ACPI_USE_SYSTEM_CLIBRARY49#define ACPI_USE_DO_WHILE_050#define ACPI_MUTEX_TYPE ACPI_BINARY_SEMAPHORE515253#ifdef __KERNEL__5455#include <linux/string.h>56#include <linux/kernel.h>57#include <linux/module.h>58#include <linux/ctype.h>59#include <linux/sched.h>60#include <asm/system.h>61#include <asm/atomic.h>62#include <asm/div64.h>63#include <asm/acpi.h>64#include <linux/slab.h>65#include <linux/spinlock_types.h>66#include <asm/current.h>6768/* Host-dependent types and defines for in-kernel ACPICA */6970#define ACPI_MACHINE_WIDTH BITS_PER_LONG71#define ACPI_EXPORT_SYMBOL(symbol) EXPORT_SYMBOL(symbol);72#define strtoul simple_strtoul7374#define acpi_cache_t struct kmem_cache75#define acpi_spinlock spinlock_t *76#define acpi_cpu_flags unsigned long7778#else /* !__KERNEL__ */7980#include <stdarg.h>81#include <string.h>82#include <stdlib.h>83#include <ctype.h>84#include <unistd.h>8586/* Host-dependent types and defines for user-space ACPICA */8788#define ACPI_FLUSH_CPU_CACHE()89#define ACPI_CAST_PTHREAD_T(pthread) ((acpi_thread_id) (pthread))9091#if defined(__ia64__) || defined(__x86_64__)92#define ACPI_MACHINE_WIDTH 6493#define COMPILER_DEPENDENT_INT64 long94#define COMPILER_DEPENDENT_UINT64 unsigned long95#else96#define ACPI_MACHINE_WIDTH 3297#define COMPILER_DEPENDENT_INT64 long long98#define COMPILER_DEPENDENT_UINT64 unsigned long long99#define ACPI_USE_NATIVE_DIVIDE100#endif101102#ifndef __cdecl103#define __cdecl104#endif105106#endif /* __KERNEL__ */107108/* Linux uses GCC */109110#include "acgcc.h"111112113#ifdef __KERNEL__114#include <acpi/actypes.h>115/*116* Overrides for in-kernel ACPICA117*/118static inline acpi_thread_id acpi_os_get_thread_id(void)119{120return (acpi_thread_id)(unsigned long)current;121}122123/*124* The irqs_disabled() check is for resume from RAM.125* Interrupts are off during resume, just like they are for boot.126* However, boot has (system_state != SYSTEM_RUNNING)127* to quiet __might_sleep() in kmalloc() and resume does not.128*/129static inline void *acpi_os_allocate(acpi_size size)130{131return kmalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);132}133134static inline void *acpi_os_allocate_zeroed(acpi_size size)135{136return kzalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);137}138139static inline void *acpi_os_acquire_object(acpi_cache_t * cache)140{141return kmem_cache_zalloc(cache,142irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);143}144145#define ACPI_ALLOCATE(a) acpi_os_allocate(a)146#define ACPI_ALLOCATE_ZEROED(a) acpi_os_allocate_zeroed(a)147#define ACPI_FREE(a) kfree(a)148149#ifndef CONFIG_PREEMPT150/*151* Used within ACPICA to show where it is safe to preempt execution152* when CONFIG_PREEMPT=n153*/154#define ACPI_PREEMPTION_POINT() \155do { \156if (!irqs_disabled()) \157cond_resched(); \158} while (0)159#endif160161/*162* When lockdep is enabled, the spin_lock_init() macro stringifies it's163* argument and uses that as a name for the lock in debugging.164* By executing spin_lock_init() in a macro the key changes from "lock" for165* all locks to the name of the argument of acpi_os_create_lock(), which166* prevents lockdep from reporting false positives for ACPICA locks.167*/168#define acpi_os_create_lock(__handle) \169({ \170spinlock_t *lock = ACPI_ALLOCATE(sizeof(*lock)); \171\172if (lock) { \173*(__handle) = lock; \174spin_lock_init(*(__handle)); \175} \176lock ? AE_OK : AE_NO_MEMORY; \177})178179#endif /* __KERNEL__ */180181#endif /* __ACLINUX_H__ */182183184