162306a36Sopenharmony_ci/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 262306a36Sopenharmony_ci/****************************************************************************** 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Name: aclinuxex.h - Extra OS specific defines, etc. for Linux 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2000 - 2023, Intel Corp. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci *****************************************************************************/ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef __ACLINUXEX_H__ 1162306a36Sopenharmony_ci#define __ACLINUXEX_H__ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#ifdef __KERNEL__ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#ifndef ACPI_USE_NATIVE_DIVIDE 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#ifndef ACPI_DIV_64_BY_32 1862306a36Sopenharmony_ci#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \ 1962306a36Sopenharmony_ci do { \ 2062306a36Sopenharmony_ci u64 (__n) = ((u64) n_hi) << 32 | (n_lo); \ 2162306a36Sopenharmony_ci (r32) = do_div ((__n), (d32)); \ 2262306a36Sopenharmony_ci (q32) = (u32) (__n); \ 2362306a36Sopenharmony_ci } while (0) 2462306a36Sopenharmony_ci#endif 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#ifndef ACPI_SHIFT_RIGHT_64 2762306a36Sopenharmony_ci#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \ 2862306a36Sopenharmony_ci do { \ 2962306a36Sopenharmony_ci (n_lo) >>= 1; \ 3062306a36Sopenharmony_ci (n_lo) |= (((n_hi) & 1) << 31); \ 3162306a36Sopenharmony_ci (n_hi) >>= 1; \ 3262306a36Sopenharmony_ci } while (0) 3362306a36Sopenharmony_ci#endif 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#endif 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci/* 3862306a36Sopenharmony_ci * Overrides for in-kernel ACPICA 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_ciacpi_status ACPI_INIT_FUNCTION acpi_os_initialize(void); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ciacpi_status acpi_os_terminate(void); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci/* 4562306a36Sopenharmony_ci * The irqs_disabled() check is for resume from RAM. 4662306a36Sopenharmony_ci * Interrupts are off during resume, just like they are for boot. 4762306a36Sopenharmony_ci * However, boot has (system_state != SYSTEM_RUNNING) 4862306a36Sopenharmony_ci * to quiet __might_sleep() in kmalloc() and resume does not. 4962306a36Sopenharmony_ci */ 5062306a36Sopenharmony_cistatic inline void *acpi_os_allocate(acpi_size size) 5162306a36Sopenharmony_ci{ 5262306a36Sopenharmony_ci return kmalloc(size, irqs_disabled()? GFP_ATOMIC : GFP_KERNEL); 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic inline void *acpi_os_allocate_zeroed(acpi_size size) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci return kzalloc(size, irqs_disabled()? GFP_ATOMIC : GFP_KERNEL); 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic inline void acpi_os_free(void *memory) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci kfree(memory); 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic inline void *acpi_os_acquire_object(acpi_cache_t * cache) 6662306a36Sopenharmony_ci{ 6762306a36Sopenharmony_ci return kmem_cache_zalloc(cache, 6862306a36Sopenharmony_ci irqs_disabled()? GFP_ATOMIC : GFP_KERNEL); 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic inline acpi_thread_id acpi_os_get_thread_id(void) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci return (acpi_thread_id) (unsigned long)current; 7462306a36Sopenharmony_ci} 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* 7762306a36Sopenharmony_ci * When lockdep is enabled, the spin_lock_init() macro stringifies it's 7862306a36Sopenharmony_ci * argument and uses that as a name for the lock in debugging. 7962306a36Sopenharmony_ci * By executing spin_lock_init() in a macro the key changes from "lock" for 8062306a36Sopenharmony_ci * all locks to the name of the argument of acpi_os_create_lock(), which 8162306a36Sopenharmony_ci * prevents lockdep from reporting false positives for ACPICA locks. 8262306a36Sopenharmony_ci */ 8362306a36Sopenharmony_ci#define acpi_os_create_lock(__handle) \ 8462306a36Sopenharmony_ci ({ \ 8562306a36Sopenharmony_ci spinlock_t *lock = ACPI_ALLOCATE(sizeof(*lock)); \ 8662306a36Sopenharmony_ci if (lock) { \ 8762306a36Sopenharmony_ci *(__handle) = lock; \ 8862306a36Sopenharmony_ci spin_lock_init(*(__handle)); \ 8962306a36Sopenharmony_ci } \ 9062306a36Sopenharmony_ci lock ? AE_OK : AE_NO_MEMORY; \ 9162306a36Sopenharmony_ci }) 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#define acpi_os_create_raw_lock(__handle) \ 9562306a36Sopenharmony_ci ({ \ 9662306a36Sopenharmony_ci raw_spinlock_t *lock = ACPI_ALLOCATE(sizeof(*lock)); \ 9762306a36Sopenharmony_ci if (lock) { \ 9862306a36Sopenharmony_ci *(__handle) = lock; \ 9962306a36Sopenharmony_ci raw_spin_lock_init(*(__handle)); \ 10062306a36Sopenharmony_ci } \ 10162306a36Sopenharmony_ci lock ? AE_OK : AE_NO_MEMORY; \ 10262306a36Sopenharmony_ci }) 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistatic inline acpi_cpu_flags acpi_os_acquire_raw_lock(acpi_raw_spinlock lockp) 10562306a36Sopenharmony_ci{ 10662306a36Sopenharmony_ci acpi_cpu_flags flags; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci raw_spin_lock_irqsave(lockp, flags); 10962306a36Sopenharmony_ci return flags; 11062306a36Sopenharmony_ci} 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_cistatic inline void acpi_os_release_raw_lock(acpi_raw_spinlock lockp, 11362306a36Sopenharmony_ci acpi_cpu_flags flags) 11462306a36Sopenharmony_ci{ 11562306a36Sopenharmony_ci raw_spin_unlock_irqrestore(lockp, flags); 11662306a36Sopenharmony_ci} 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistatic inline void acpi_os_delete_raw_lock(acpi_raw_spinlock handle) 11962306a36Sopenharmony_ci{ 12062306a36Sopenharmony_ci ACPI_FREE(handle); 12162306a36Sopenharmony_ci} 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_cistatic inline u8 acpi_os_readable(void *pointer, acpi_size length) 12462306a36Sopenharmony_ci{ 12562306a36Sopenharmony_ci return TRUE; 12662306a36Sopenharmony_ci} 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistatic inline acpi_status acpi_os_initialize_debugger(void) 12962306a36Sopenharmony_ci{ 13062306a36Sopenharmony_ci return AE_OK; 13162306a36Sopenharmony_ci} 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistatic inline void acpi_os_terminate_debugger(void) 13462306a36Sopenharmony_ci{ 13562306a36Sopenharmony_ci return; 13662306a36Sopenharmony_ci} 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci/* 13962306a36Sopenharmony_ci * OSL interfaces added by Linux 14062306a36Sopenharmony_ci */ 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci#endif /* __KERNEL__ */ 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci#endif /* __ACLINUXEX_H__ */ 145