141 lines · c
1/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */2/******************************************************************************3 *4 * Name: aclinuxex.h - Extra OS specific defines, etc. for Linux5 *6 * Copyright (C) 2000 - 2023, Intel Corp.7 *8 *****************************************************************************/9 10#ifndef __ACLINUXEX_H__11#define __ACLINUXEX_H__12 13#ifdef __KERNEL__14 15#ifndef ACPI_USE_NATIVE_DIVIDE16 17#ifndef ACPI_DIV_64_BY_3218#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \19 do { \20 u64 (__n) = ((u64) n_hi) << 32 | (n_lo); \21 (r32) = do_div ((__n), (d32)); \22 (q32) = (u32) (__n); \23 } while (0)24#endif25 26#ifndef ACPI_SHIFT_RIGHT_6427#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \28 do { \29 (n_lo) >>= 1; \30 (n_lo) |= (((n_hi) & 1) << 31); \31 (n_hi) >>= 1; \32 } while (0)33#endif34 35#endif36 37/*38 * Overrides for in-kernel ACPICA39 */40acpi_status ACPI_INIT_FUNCTION acpi_os_initialize(void);41 42acpi_status acpi_os_terminate(void);43 44/*45 * The irqs_disabled() check is for resume from RAM.46 * Interrupts are off during resume, just like they are for boot.47 * However, boot has (system_state != SYSTEM_RUNNING)48 * to quiet __might_sleep() in kmalloc() and resume does not.49 *50 * These specialized allocators have to be macros for their allocations to be51 * accounted separately (to have separate alloc_tag).52 */53#define acpi_os_allocate(_size) \54 kmalloc(_size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL)55 56#define acpi_os_allocate_zeroed(_size) \57 kzalloc(_size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL)58 59#define acpi_os_acquire_object(_cache) \60 kmem_cache_zalloc(_cache, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL)61 62static inline void acpi_os_free(void *memory)63{64 kfree(memory);65}66 67static inline acpi_thread_id acpi_os_get_thread_id(void)68{69 return (acpi_thread_id) (unsigned long)current;70}71 72/*73 * When lockdep is enabled, the spin_lock_init() macro stringifies it's74 * argument and uses that as a name for the lock in debugging.75 * By executing spin_lock_init() in a macro the key changes from "lock" for76 * all locks to the name of the argument of acpi_os_create_lock(), which77 * prevents lockdep from reporting false positives for ACPICA locks.78 */79#define acpi_os_create_lock(__handle) \80 ({ \81 spinlock_t *lock = ACPI_ALLOCATE(sizeof(*lock)); \82 if (lock) { \83 *(__handle) = lock; \84 spin_lock_init(*(__handle)); \85 } \86 lock ? AE_OK : AE_NO_MEMORY; \87 })88 89 90#define acpi_os_create_raw_lock(__handle) \91 ({ \92 raw_spinlock_t *lock = ACPI_ALLOCATE(sizeof(*lock)); \93 if (lock) { \94 *(__handle) = lock; \95 raw_spin_lock_init(*(__handle)); \96 } \97 lock ? AE_OK : AE_NO_MEMORY; \98 })99 100static inline acpi_cpu_flags acpi_os_acquire_raw_lock(acpi_raw_spinlock lockp)101{102 acpi_cpu_flags flags;103 104 raw_spin_lock_irqsave(lockp, flags);105 return flags;106}107 108static inline void acpi_os_release_raw_lock(acpi_raw_spinlock lockp,109 acpi_cpu_flags flags)110{111 raw_spin_unlock_irqrestore(lockp, flags);112}113 114static inline void acpi_os_delete_raw_lock(acpi_raw_spinlock handle)115{116 ACPI_FREE(handle);117}118 119static inline u8 acpi_os_readable(void *pointer, acpi_size length)120{121 return TRUE;122}123 124static inline acpi_status acpi_os_initialize_debugger(void)125{126 return AE_OK;127}128 129static inline void acpi_os_terminate_debugger(void)130{131 return;132}133 134/*135 * OSL interfaces added by Linux136 */137 138#endif /* __KERNEL__ */139 140#endif /* __ACLINUXEX_H__ */141