diff mbox

[1/2] ACPICA: provide abstraction for raw_spinlock_t

Message ID 20180425142827.22202-1-bigeasy@linutronix.de (mailing list archive)
State Accepted, archived
Delegated to: Rafael Wysocki
Headers show

Commit Message

Sebastian Andrzej Siewior April 25, 2018, 2:28 p.m. UTC
Provide a new lock type acpi_raw_spinlock which is implemented as
raw_spinlock_t on Linux. This type should be used in code which covers
small areas of code and disables interrupts only for short time even on
a realtime OS.
There is a fallback to spinlock_t if an OS does not provide an
implementation for acpi_raw_spinlock.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
 include/acpi/acpiosxf.h           | 21 +++++++++++++++++++++
 include/acpi/actypes.h            |  4 ++++
 include/acpi/platform/aclinux.h   |  5 +++++
 include/acpi/platform/aclinuxex.h | 30 ++++++++++++++++++++++++++++++
 4 files changed, 60 insertions(+)

Comments

Rafael J. Wysocki April 26, 2018, 6:44 a.m. UTC | #1
On Wed, Apr 25, 2018 at 4:28 PM, Sebastian Andrzej Siewior
<bigeasy@linutronix.de> wrote:
> Provide a new lock type acpi_raw_spinlock which is implemented as
> raw_spinlock_t on Linux. This type should be used in code which covers
> small areas of code and disables interrupts only for short time even on
> a realtime OS.
> There is a fallback to spinlock_t if an OS does not provide an
> implementation for acpi_raw_spinlock.
>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

Thanks for the update!

I think I can apply this series, but first I need to discuss sorting
it out upstream with Bob and Erik.

> ---
>  include/acpi/acpiosxf.h           | 21 +++++++++++++++++++++
>  include/acpi/actypes.h            |  4 ++++
>  include/acpi/platform/aclinux.h   |  5 +++++
>  include/acpi/platform/aclinuxex.h | 30 ++++++++++++++++++++++++++++++
>  4 files changed, 60 insertions(+)
>
> diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h
> index 540d35f06ad6..eb1f21af7556 100644
> --- a/include/acpi/acpiosxf.h
> +++ b/include/acpi/acpiosxf.h
> @@ -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);
>  #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
>   */
> diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
> index 1c530f95dc34..2b1bafa197c0 100644
> --- a/include/acpi/actypes.h
> +++ b/include/acpi/actypes.h
> @@ -245,6 +245,10 @@ typedef u64 acpi_physical_address;
>  #define acpi_spinlock                   void *
>  #endif
>
> +#ifndef acpi_raw_spinlock
> +#define acpi_raw_spinlock              acpi_spinlock
> +#endif
> +
>  #ifndef acpi_semaphore
>  #define acpi_semaphore                  void *
>  #endif
> diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h
> index a0b232703302..7451b3bca83a 100644
> --- a/include/acpi/platform/aclinux.h
> +++ b/include/acpi/platform/aclinux.h
> @@ -102,6 +102,7 @@
>
>  #define acpi_cache_t                        struct kmem_cache
>  #define acpi_spinlock                       spinlock_t *
> +#define acpi_raw_spinlock                   raw_spinlock_t *
>  #define acpi_cpu_flags                      unsigned long
>
>  /* Use native linux version of acpi_os_allocate_zeroed */
> @@ -119,6 +120,10 @@
>  #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_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
> diff --git a/include/acpi/platform/aclinuxex.h b/include/acpi/platform/aclinuxex.h
> index 7e81475fe034..d754a1b12721 100644
> --- a/include/acpi/platform/aclinuxex.h
> +++ b/include/acpi/platform/aclinuxex.h
> @@ -90,6 +90,36 @@ static inline acpi_thread_id acpi_os_get_thread_id(void)
>                 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)
>  {
>         return TRUE;
> --
> 2.17.0
>
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h
index 540d35f06ad6..eb1f21af7556 100644
--- a/include/acpi/acpiosxf.h
+++ b/include/acpi/acpiosxf.h
@@ -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);
 #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
  */
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
index 1c530f95dc34..2b1bafa197c0 100644
--- a/include/acpi/actypes.h
+++ b/include/acpi/actypes.h
@@ -245,6 +245,10 @@  typedef u64 acpi_physical_address;
 #define acpi_spinlock                   void *
 #endif
 
+#ifndef acpi_raw_spinlock
+#define acpi_raw_spinlock		acpi_spinlock
+#endif
+
 #ifndef acpi_semaphore
 #define acpi_semaphore                  void *
 #endif
diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h
index a0b232703302..7451b3bca83a 100644
--- a/include/acpi/platform/aclinux.h
+++ b/include/acpi/platform/aclinux.h
@@ -102,6 +102,7 @@ 
 
 #define acpi_cache_t                        struct kmem_cache
 #define acpi_spinlock                       spinlock_t *
+#define acpi_raw_spinlock                   raw_spinlock_t *
 #define acpi_cpu_flags                      unsigned long
 
 /* Use native linux version of acpi_os_allocate_zeroed */
@@ -119,6 +120,10 @@ 
 #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_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
diff --git a/include/acpi/platform/aclinuxex.h b/include/acpi/platform/aclinuxex.h
index 7e81475fe034..d754a1b12721 100644
--- a/include/acpi/platform/aclinuxex.h
+++ b/include/acpi/platform/aclinuxex.h
@@ -90,6 +90,36 @@  static inline acpi_thread_id acpi_os_get_thread_id(void)
 		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)
 {
 	return TRUE;