Commit e637d326 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge back earlier ACPICA material for v4.18.

parents 7b34c0fb c57c0ad4
...@@ -82,7 +82,7 @@ ACPI_GLOBAL(u8, acpi_gbl_global_lock_pending); ...@@ -82,7 +82,7 @@ ACPI_GLOBAL(u8, acpi_gbl_global_lock_pending);
* interrupt level * interrupt level
*/ */
ACPI_GLOBAL(acpi_spinlock, acpi_gbl_gpe_lock); /* For GPE data structs and registers */ ACPI_GLOBAL(acpi_spinlock, acpi_gbl_gpe_lock); /* For GPE data structs and registers */
ACPI_GLOBAL(acpi_spinlock, acpi_gbl_hardware_lock); /* For ACPI H/W except GPE registers */ ACPI_GLOBAL(acpi_raw_spinlock, acpi_gbl_hardware_lock); /* For ACPI H/W except GPE registers */
ACPI_GLOBAL(acpi_spinlock, acpi_gbl_reference_count_lock); ACPI_GLOBAL(acpi_spinlock, acpi_gbl_reference_count_lock);
/* Mutex for _OSI support */ /* Mutex for _OSI support */
......
...@@ -390,14 +390,14 @@ acpi_status acpi_hw_clear_acpi_status(void) ...@@ -390,14 +390,14 @@ acpi_status acpi_hw_clear_acpi_status(void)
ACPI_BITMASK_ALL_FIXED_STATUS, ACPI_BITMASK_ALL_FIXED_STATUS,
ACPI_FORMAT_UINT64(acpi_gbl_xpm1a_status.address))); ACPI_FORMAT_UINT64(acpi_gbl_xpm1a_status.address)));
lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock); lock_flags = acpi_os_acquire_raw_lock(acpi_gbl_hardware_lock);
/* Clear the fixed events in PM1 A/B */ /* Clear the fixed events in PM1 A/B */
status = acpi_hw_register_write(ACPI_REGISTER_PM1_STATUS, status = acpi_hw_register_write(ACPI_REGISTER_PM1_STATUS,
ACPI_BITMASK_ALL_FIXED_STATUS); ACPI_BITMASK_ALL_FIXED_STATUS);
acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags); acpi_os_release_raw_lock(acpi_gbl_hardware_lock, lock_flags);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto exit; goto exit;
......
...@@ -227,7 +227,7 @@ acpi_status acpi_write_bit_register(u32 register_id, u32 value) ...@@ -227,7 +227,7 @@ acpi_status acpi_write_bit_register(u32 register_id, u32 value)
return_ACPI_STATUS(AE_BAD_PARAMETER); return_ACPI_STATUS(AE_BAD_PARAMETER);
} }
lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock); lock_flags = acpi_os_acquire_raw_lock(acpi_gbl_hardware_lock);
/* /*
* At this point, we know that the parent register is one of the * At this point, we know that the parent register is one of the
...@@ -288,7 +288,7 @@ acpi_status acpi_write_bit_register(u32 register_id, u32 value) ...@@ -288,7 +288,7 @@ acpi_status acpi_write_bit_register(u32 register_id, u32 value)
unlock_and_exit: unlock_and_exit:
acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags); acpi_os_release_raw_lock(acpi_gbl_hardware_lock, lock_flags);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
......
...@@ -52,7 +52,7 @@ acpi_status acpi_ut_mutex_initialize(void) ...@@ -52,7 +52,7 @@ acpi_status acpi_ut_mutex_initialize(void)
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
} }
status = acpi_os_create_lock (&acpi_gbl_hardware_lock); status = acpi_os_create_raw_lock(&acpi_gbl_hardware_lock);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
} }
...@@ -109,7 +109,7 @@ void acpi_ut_mutex_terminate(void) ...@@ -109,7 +109,7 @@ void acpi_ut_mutex_terminate(void)
/* Delete the spinlocks */ /* Delete the spinlocks */
acpi_os_delete_lock(acpi_gbl_gpe_lock); acpi_os_delete_lock(acpi_gbl_gpe_lock);
acpi_os_delete_lock(acpi_gbl_hardware_lock); acpi_os_delete_raw_lock(acpi_gbl_hardware_lock);
acpi_os_delete_lock(acpi_gbl_reference_count_lock); acpi_os_delete_lock(acpi_gbl_reference_count_lock);
/* Delete the reader/writer lock */ /* Delete the reader/writer lock */
......
...@@ -97,6 +97,27 @@ acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock handle); ...@@ -97,6 +97,27 @@ acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock handle);
void acpi_os_release_lock(acpi_spinlock handle, acpi_cpu_flags flags); void acpi_os_release_lock(acpi_spinlock handle, acpi_cpu_flags flags);
#endif #endif
/*
* RAW spinlock primitives. If the OS does not provide them, fallback to
* spinlock primitives
*/
#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_create_raw_lock
# define acpi_os_create_raw_lock(out_handle) acpi_os_create_lock(out_handle)
#endif
#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_delete_raw_lock
# define acpi_os_delete_raw_lock(handle) acpi_os_delete_lock(handle)
#endif
#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_acquire_raw_lock
# define acpi_os_acquire_raw_lock(handle) acpi_os_acquire_lock(handle)
#endif
#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_release_raw_lock
# define acpi_os_release_raw_lock(handle, flags) \
acpi_os_release_lock(handle, flags)
#endif
/* /*
* Semaphore primitives * Semaphore primitives
*/ */
......
...@@ -245,6 +245,10 @@ typedef u64 acpi_physical_address; ...@@ -245,6 +245,10 @@ typedef u64 acpi_physical_address;
#define acpi_spinlock void * #define acpi_spinlock void *
#endif #endif
#ifndef acpi_raw_spinlock
#define acpi_raw_spinlock acpi_spinlock
#endif
#ifndef acpi_semaphore #ifndef acpi_semaphore
#define acpi_semaphore void * #define acpi_semaphore void *
#endif #endif
......
...@@ -102,6 +102,7 @@ ...@@ -102,6 +102,7 @@
#define acpi_cache_t struct kmem_cache #define acpi_cache_t struct kmem_cache
#define acpi_spinlock spinlock_t * #define acpi_spinlock spinlock_t *
#define acpi_raw_spinlock raw_spinlock_t *
#define acpi_cpu_flags unsigned long #define acpi_cpu_flags unsigned long
/* Use native linux version of acpi_os_allocate_zeroed */ /* Use native linux version of acpi_os_allocate_zeroed */
...@@ -119,6 +120,10 @@ ...@@ -119,6 +120,10 @@
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_acquire_object #define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_acquire_object
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_thread_id #define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_thread_id
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_create_lock #define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_create_lock
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_create_raw_lock
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_delete_raw_lock
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_acquire_raw_lock
#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_release_raw_lock
/* /*
* OSL interfaces used by debugger/disassembler * OSL interfaces used by debugger/disassembler
......
...@@ -90,6 +90,36 @@ static inline acpi_thread_id acpi_os_get_thread_id(void) ...@@ -90,6 +90,36 @@ static inline acpi_thread_id acpi_os_get_thread_id(void)
lock ? AE_OK : AE_NO_MEMORY; \ lock ? AE_OK : AE_NO_MEMORY; \
}) })
#define acpi_os_create_raw_lock(__handle) \
({ \
raw_spinlock_t *lock = ACPI_ALLOCATE(sizeof(*lock)); \
if (lock) { \
*(__handle) = lock; \
raw_spin_lock_init(*(__handle)); \
} \
lock ? AE_OK : AE_NO_MEMORY; \
})
static inline acpi_cpu_flags acpi_os_acquire_raw_lock(acpi_raw_spinlock lockp)
{
acpi_cpu_flags flags;
raw_spin_lock_irqsave(lockp, flags);
return flags;
}
static inline void acpi_os_release_raw_lock(acpi_raw_spinlock lockp,
acpi_cpu_flags flags)
{
raw_spin_unlock_irqrestore(lockp, flags);
}
static inline void acpi_os_delete_raw_lock(acpi_raw_spinlock handle)
{
ACPI_FREE(handle);
}
static inline u8 acpi_os_readable(void *pointer, acpi_size length) static inline u8 acpi_os_readable(void *pointer, acpi_size length)
{ {
return TRUE; return TRUE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment