bus/dpaa: add compatibility and helper macros
Linked list, bit operations and compatibility macros. Signed-off-by: Geoff Thorpe <geoff.thorpe@nxp.com> Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
This commit is contained in:
parent
919eeaccb2
commit
39f373cf01
385
drivers/bus/dpaa/include/compat.h
Normal file
385
drivers/bus/dpaa/include/compat.h
Normal file
@ -0,0 +1,385 @@
|
||||
/*-
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright 2011 Freescale Semiconductor, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the above-listed copyright holders nor the
|
||||
* names of any contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* ALTERNATIVELY, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") as published by the Free Software
|
||||
* Foundation, either version 2 of that License or (at your option) any
|
||||
* later version.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __COMPAT_H
|
||||
#define __COMPAT_H
|
||||
|
||||
#include <sched.h>
|
||||
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE
|
||||
#endif
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
#include <linux/types.h>
|
||||
#include <stdbool.h>
|
||||
#include <ctype.h>
|
||||
#include <malloc.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <limits.h>
|
||||
#include <assert.h>
|
||||
#include <dirent.h>
|
||||
#include <inttypes.h>
|
||||
#include <error.h>
|
||||
#include <rte_byteorder.h>
|
||||
#include <rte_atomic.h>
|
||||
#include <rte_spinlock.h>
|
||||
#include <rte_common.h>
|
||||
#include <rte_debug.h>
|
||||
|
||||
/* The following definitions are primarily to allow the single-source driver
|
||||
* interfaces to be included by arbitrary program code. Ie. for interfaces that
|
||||
* are also available in kernel-space, these definitions provide compatibility
|
||||
* with certain attributes and types used in those interfaces.
|
||||
*/
|
||||
|
||||
/* Required compiler attributes */
|
||||
#define __maybe_unused __rte_unused
|
||||
#define __always_unused __rte_unused
|
||||
#define __packed __rte_packed
|
||||
#define noinline __attribute__((noinline))
|
||||
|
||||
#define L1_CACHE_BYTES 64
|
||||
#define ____cacheline_aligned __attribute__((aligned(L1_CACHE_BYTES)))
|
||||
#define __stringify_1(x) #x
|
||||
#define __stringify(x) __stringify_1(x)
|
||||
|
||||
#ifdef ARRAY_SIZE
|
||||
#undef ARRAY_SIZE
|
||||
#endif
|
||||
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
||||
|
||||
/* Debugging */
|
||||
#define prflush(fmt, args...) \
|
||||
do { \
|
||||
printf(fmt, ##args); \
|
||||
fflush(stdout); \
|
||||
} while (0)
|
||||
|
||||
#define pr_crit(fmt, args...) prflush("CRIT:" fmt, ##args)
|
||||
#define pr_err(fmt, args...) prflush("ERR:" fmt, ##args)
|
||||
#define pr_warn(fmt, args...) prflush("WARN:" fmt, ##args)
|
||||
#define pr_info(fmt, args...) prflush(fmt, ##args)
|
||||
|
||||
#ifdef RTE_LIBRTE_DPAA_DEBUG_BUS
|
||||
#ifdef pr_debug
|
||||
#undef pr_debug
|
||||
#endif
|
||||
#define pr_debug(fmt, args...) printf(fmt, ##args)
|
||||
#else
|
||||
#define pr_debug(fmt, args...) {}
|
||||
#endif
|
||||
|
||||
#define DPAA_BUG_ON(x) RTE_ASSERT(x)
|
||||
|
||||
/* Required types */
|
||||
typedef uint8_t u8;
|
||||
typedef uint16_t u16;
|
||||
typedef uint32_t u32;
|
||||
typedef uint64_t u64;
|
||||
typedef uint64_t dma_addr_t;
|
||||
typedef cpu_set_t cpumask_t;
|
||||
typedef uint32_t phandle;
|
||||
typedef uint32_t gfp_t;
|
||||
typedef uint32_t irqreturn_t;
|
||||
|
||||
#define IRQ_HANDLED 0
|
||||
#define request_irq qbman_request_irq
|
||||
#define free_irq qbman_free_irq
|
||||
|
||||
#define __iomem
|
||||
#define GFP_KERNEL 0
|
||||
#define __raw_readb(p) (*(const volatile unsigned char *)(p))
|
||||
#define __raw_readl(p) (*(const volatile unsigned int *)(p))
|
||||
#define __raw_writel(v, p) {*(volatile unsigned int *)(p) = (v); }
|
||||
|
||||
/* to be used as an upper-limit only */
|
||||
#define NR_CPUS 64
|
||||
|
||||
/* Waitqueue stuff */
|
||||
typedef struct { } wait_queue_head_t;
|
||||
#define DECLARE_WAIT_QUEUE_HEAD(x) int dummy_##x __always_unused
|
||||
#define wake_up(x) do { } while (0)
|
||||
|
||||
/* I/O operations */
|
||||
static inline u32 in_be32(volatile void *__p)
|
||||
{
|
||||
volatile u32 *p = __p;
|
||||
return rte_be_to_cpu_32(*p);
|
||||
}
|
||||
|
||||
static inline void out_be32(volatile void *__p, u32 val)
|
||||
{
|
||||
volatile u32 *p = __p;
|
||||
*p = rte_cpu_to_be_32(val);
|
||||
}
|
||||
|
||||
#define dcbt_ro(p) __builtin_prefetch(p, 0)
|
||||
#define dcbt_rw(p) __builtin_prefetch(p, 1)
|
||||
|
||||
#define dcbz(p) { asm volatile("dc zva, %0" : : "r" (p) : "memory"); }
|
||||
#define dcbz_64(p) dcbz(p)
|
||||
#define hwsync() rte_rmb()
|
||||
#define lwsync() rte_wmb()
|
||||
#define dcbf(p) { asm volatile("dc cvac, %0" : : "r"(p) : "memory"); }
|
||||
#define dcbf_64(p) dcbf(p)
|
||||
#define dccivac(p) { asm volatile("dc civac, %0" : : "r"(p) : "memory"); }
|
||||
|
||||
#define dcbit_ro(p) \
|
||||
do { \
|
||||
dccivac(p); \
|
||||
asm volatile("prfm pldl1keep, [%0, #64]" : : "r" (p)); \
|
||||
} while (0)
|
||||
|
||||
#define barrier() { asm volatile ("" : : : "memory"); }
|
||||
#define cpu_relax barrier
|
||||
|
||||
static inline uint64_t mfatb(void)
|
||||
{
|
||||
uint64_t ret, ret_new, timeout = 200;
|
||||
|
||||
asm volatile ("mrs %0, cntvct_el0" : "=r" (ret));
|
||||
asm volatile ("mrs %0, cntvct_el0" : "=r" (ret_new));
|
||||
while (ret != ret_new && timeout--) {
|
||||
ret = ret_new;
|
||||
asm volatile ("mrs %0, cntvct_el0" : "=r" (ret_new));
|
||||
}
|
||||
DPAA_BUG_ON(!timeout && (ret != ret_new));
|
||||
return ret * 64;
|
||||
}
|
||||
|
||||
/* Spin for a few cycles without bothering the bus */
|
||||
static inline void cpu_spin(int cycles)
|
||||
{
|
||||
uint64_t now = mfatb();
|
||||
|
||||
while (mfatb() < (now + cycles))
|
||||
;
|
||||
}
|
||||
|
||||
/* Qman/Bman API inlines and macros; */
|
||||
#ifdef lower_32_bits
|
||||
#undef lower_32_bits
|
||||
#endif
|
||||
#define lower_32_bits(x) ((u32)(x))
|
||||
|
||||
#ifdef upper_32_bits
|
||||
#undef upper_32_bits
|
||||
#endif
|
||||
#define upper_32_bits(x) ((u32)(((x) >> 16) >> 16))
|
||||
|
||||
/*
|
||||
* Swap bytes of a 48-bit value.
|
||||
*/
|
||||
static inline uint64_t
|
||||
__bswap_48(uint64_t x)
|
||||
{
|
||||
return ((x & 0x0000000000ffULL) << 40) |
|
||||
((x & 0x00000000ff00ULL) << 24) |
|
||||
((x & 0x000000ff0000ULL) << 8) |
|
||||
((x & 0x0000ff000000ULL) >> 8) |
|
||||
((x & 0x00ff00000000ULL) >> 24) |
|
||||
((x & 0xff0000000000ULL) >> 40);
|
||||
}
|
||||
|
||||
/*
|
||||
* Swap bytes of a 40-bit value.
|
||||
*/
|
||||
static inline uint64_t
|
||||
__bswap_40(uint64_t x)
|
||||
{
|
||||
return ((x & 0x00000000ffULL) << 32) |
|
||||
((x & 0x000000ff00ULL) << 16) |
|
||||
((x & 0x0000ff0000ULL)) |
|
||||
((x & 0x00ff000000ULL) >> 16) |
|
||||
((x & 0xff00000000ULL) >> 32);
|
||||
}
|
||||
|
||||
/*
|
||||
* Swap bytes of a 24-bit value.
|
||||
*/
|
||||
static inline uint32_t
|
||||
__bswap_24(uint32_t x)
|
||||
{
|
||||
return ((x & 0x0000ffULL) << 16) |
|
||||
((x & 0x00ff00ULL)) |
|
||||
((x & 0xff0000ULL) >> 16);
|
||||
}
|
||||
|
||||
#define be64_to_cpu(x) rte_be_to_cpu_64(x)
|
||||
#define be32_to_cpu(x) rte_be_to_cpu_32(x)
|
||||
#define be16_to_cpu(x) rte_be_to_cpu_16(x)
|
||||
|
||||
#define cpu_to_be64(x) rte_cpu_to_be_64(x)
|
||||
#define cpu_to_be32(x) rte_cpu_to_be_32(x)
|
||||
#define cpu_to_be16(x) rte_cpu_to_be_16(x)
|
||||
|
||||
#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
|
||||
|
||||
#define cpu_to_be48(x) __bswap_48(x)
|
||||
#define be48_to_cpu(x) __bswap_48(x)
|
||||
|
||||
#define cpu_to_be40(x) __bswap_40(x)
|
||||
#define be40_to_cpu(x) __bswap_40(x)
|
||||
|
||||
#define cpu_to_be24(x) __bswap_24(x)
|
||||
#define be24_to_cpu(x) __bswap_24(x)
|
||||
|
||||
#else /* RTE_BIG_ENDIAN */
|
||||
|
||||
#define cpu_to_be48(x) (x)
|
||||
#define be48_to_cpu(x) (x)
|
||||
|
||||
#define cpu_to_be40(x) (x)
|
||||
#define be40_to_cpu(x) (x)
|
||||
|
||||
#define cpu_to_be24(x) (x)
|
||||
#define be24_to_cpu(x) (x)
|
||||
|
||||
#endif /* RTE_BIG_ENDIAN */
|
||||
|
||||
/* When copying aligned words or shorts, try to avoid memcpy() */
|
||||
/* memcpy() stuff - when you know alignments in advance */
|
||||
#define CONFIG_TRY_BETTER_MEMCPY
|
||||
|
||||
#ifdef CONFIG_TRY_BETTER_MEMCPY
|
||||
static inline void copy_words(void *dest, const void *src, size_t sz)
|
||||
{
|
||||
u32 *__dest = dest;
|
||||
const u32 *__src = src;
|
||||
size_t __sz = sz >> 2;
|
||||
|
||||
DPAA_BUG_ON((unsigned long)dest & 0x3);
|
||||
DPAA_BUG_ON((unsigned long)src & 0x3);
|
||||
DPAA_BUG_ON(sz & 0x3);
|
||||
while (__sz--)
|
||||
*(__dest++) = *(__src++);
|
||||
}
|
||||
|
||||
static inline void copy_shorts(void *dest, const void *src, size_t sz)
|
||||
{
|
||||
u16 *__dest = dest;
|
||||
const u16 *__src = src;
|
||||
size_t __sz = sz >> 1;
|
||||
|
||||
DPAA_BUG_ON((unsigned long)dest & 0x1);
|
||||
DPAA_BUG_ON((unsigned long)src & 0x1);
|
||||
DPAA_BUG_ON(sz & 0x1);
|
||||
while (__sz--)
|
||||
*(__dest++) = *(__src++);
|
||||
}
|
||||
|
||||
static inline void copy_bytes(void *dest, const void *src, size_t sz)
|
||||
{
|
||||
u8 *__dest = dest;
|
||||
const u8 *__src = src;
|
||||
|
||||
while (sz--)
|
||||
*(__dest++) = *(__src++);
|
||||
}
|
||||
#else
|
||||
#define copy_words memcpy
|
||||
#define copy_shorts memcpy
|
||||
#define copy_bytes memcpy
|
||||
#endif
|
||||
|
||||
/* Allocator stuff */
|
||||
#define kmalloc(sz, t) malloc(sz)
|
||||
#define vmalloc(sz) malloc(sz)
|
||||
#define kfree(p) { if (p) free(p); }
|
||||
static inline void *kzalloc(size_t sz, gfp_t __foo __rte_unused)
|
||||
{
|
||||
void *ptr = malloc(sz);
|
||||
|
||||
if (ptr)
|
||||
memset(ptr, 0, sz);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static inline unsigned long get_zeroed_page(gfp_t __foo __rte_unused)
|
||||
{
|
||||
void *p;
|
||||
|
||||
if (posix_memalign(&p, 4096, 4096))
|
||||
return 0;
|
||||
memset(p, 0, 4096);
|
||||
return (unsigned long)p;
|
||||
}
|
||||
|
||||
/* Spinlock stuff */
|
||||
#define spinlock_t rte_spinlock_t
|
||||
#define __SPIN_LOCK_UNLOCKED(x) RTE_SPINLOCK_INITIALIZER
|
||||
#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
|
||||
#define spin_lock_init(x) rte_spinlock_init(x)
|
||||
#define spin_lock_destroy(x)
|
||||
#define spin_lock(x) rte_spinlock_lock(x)
|
||||
#define spin_unlock(x) rte_spinlock_unlock(x)
|
||||
#define spin_lock_irq(x) spin_lock(x)
|
||||
#define spin_unlock_irq(x) spin_unlock(x)
|
||||
#define spin_lock_irqsave(x, f) spin_lock_irq(x)
|
||||
#define spin_unlock_irqrestore(x, f) spin_unlock_irq(x)
|
||||
|
||||
#define atomic_t rte_atomic32_t
|
||||
#define atomic_read(v) rte_atomic32_read(v)
|
||||
#define atomic_set(v, i) rte_atomic32_set(v, i)
|
||||
|
||||
#define atomic_inc(v) rte_atomic32_add(v, 1)
|
||||
#define atomic_dec(v) rte_atomic32_sub(v, 1)
|
||||
|
||||
#define atomic_inc_and_test(v) rte_atomic32_inc_and_test(v)
|
||||
#define atomic_dec_and_test(v) rte_atomic32_dec_and_test(v)
|
||||
|
||||
#define atomic_inc_return(v) rte_atomic32_add_return(v, 1)
|
||||
#define atomic_dec_return(v) rte_atomic32_sub_return(v, 1)
|
||||
#define atomic_sub_and_test(i, v) (rte_atomic32_sub_return(v, i) == 0)
|
||||
|
||||
#include <dpaa_list.h>
|
||||
#include <dpaa_bits.h>
|
||||
|
||||
#endif /* __COMPAT_H */
|
65
drivers/bus/dpaa/include/dpaa_bits.h
Normal file
65
drivers/bus/dpaa/include/dpaa_bits.h
Normal file
@ -0,0 +1,65 @@
|
||||
/*-
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright 2017 NXP.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of NXP nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __DPAA_BITS_H
|
||||
#define __DPAA_BITS_H
|
||||
|
||||
/* Bitfield stuff. */
|
||||
#define BITS_PER_ULONG (sizeof(unsigned long) << 3)
|
||||
#define SHIFT_PER_ULONG (((1 << 5) == BITS_PER_ULONG) ? 5 : 6)
|
||||
#define BITS_MASK(idx) (1UL << ((idx) & (BITS_PER_ULONG - 1)))
|
||||
#define BITS_IDX(idx) ((idx) >> SHIFT_PER_ULONG)
|
||||
|
||||
static inline void dpaa_set_bits(unsigned long mask,
|
||||
volatile unsigned long *p)
|
||||
{
|
||||
*p |= mask;
|
||||
}
|
||||
|
||||
static inline void dpaa_set_bit(int idx, volatile unsigned long *bits)
|
||||
{
|
||||
dpaa_set_bits(BITS_MASK(idx), bits + BITS_IDX(idx));
|
||||
}
|
||||
|
||||
static inline void dpaa_clear_bits(unsigned long mask,
|
||||
volatile unsigned long *p)
|
||||
{
|
||||
*p &= ~mask;
|
||||
}
|
||||
|
||||
static inline void dpaa_clear_bit(int idx,
|
||||
volatile unsigned long *bits)
|
||||
{
|
||||
dpaa_clear_bits(BITS_MASK(idx), bits + BITS_IDX(idx));
|
||||
}
|
||||
|
||||
#endif /* __DPAA_BITS_H */
|
101
drivers/bus/dpaa/include/dpaa_list.h
Normal file
101
drivers/bus/dpaa/include/dpaa_list.h
Normal file
@ -0,0 +1,101 @@
|
||||
/*-
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright 2017 NXP.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of NXP nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __DPAA_LIST_H
|
||||
#define __DPAA_LIST_H
|
||||
|
||||
/****************/
|
||||
/* Linked-lists */
|
||||
/****************/
|
||||
|
||||
struct list_head {
|
||||
struct list_head *prev;
|
||||
struct list_head *next;
|
||||
};
|
||||
|
||||
#define COMPAT_LIST_HEAD(n) \
|
||||
struct list_head n = { \
|
||||
.prev = &n, \
|
||||
.next = &n \
|
||||
}
|
||||
|
||||
#define INIT_LIST_HEAD(p) \
|
||||
do { \
|
||||
struct list_head *__p298 = (p); \
|
||||
__p298->next = __p298; \
|
||||
__p298->prev = __p298->next; \
|
||||
} while (0)
|
||||
#define list_entry(node, type, member) \
|
||||
(type *)((void *)node - offsetof(type, member))
|
||||
#define list_empty(p) \
|
||||
({ \
|
||||
const struct list_head *__p298 = (p); \
|
||||
((__p298->next == __p298) && (__p298->prev == __p298)); \
|
||||
})
|
||||
#define list_add(p, l) \
|
||||
do { \
|
||||
struct list_head *__p298 = (p); \
|
||||
struct list_head *__l298 = (l); \
|
||||
__p298->next = __l298->next; \
|
||||
__p298->prev = __l298; \
|
||||
__l298->next->prev = __p298; \
|
||||
__l298->next = __p298; \
|
||||
} while (0)
|
||||
#define list_add_tail(p, l) \
|
||||
do { \
|
||||
struct list_head *__p298 = (p); \
|
||||
struct list_head *__l298 = (l); \
|
||||
__p298->prev = __l298->prev; \
|
||||
__p298->next = __l298; \
|
||||
__l298->prev->next = __p298; \
|
||||
__l298->prev = __p298; \
|
||||
} while (0)
|
||||
#define list_for_each(i, l) \
|
||||
for (i = (l)->next; i != (l); i = i->next)
|
||||
#define list_for_each_safe(i, j, l) \
|
||||
for (i = (l)->next, j = i->next; i != (l); \
|
||||
i = j, j = i->next)
|
||||
#define list_for_each_entry(i, l, name) \
|
||||
for (i = list_entry((l)->next, typeof(*i), name); &i->name != (l); \
|
||||
i = list_entry(i->name.next, typeof(*i), name))
|
||||
#define list_for_each_entry_safe(i, j, l, name) \
|
||||
for (i = list_entry((l)->next, typeof(*i), name), \
|
||||
j = list_entry(i->name.next, typeof(*j), name); \
|
||||
&i->name != (l); \
|
||||
i = j, j = list_entry(j->name.next, typeof(*j), name))
|
||||
#define list_del(i) \
|
||||
do { \
|
||||
(i)->next->prev = (i)->prev; \
|
||||
(i)->prev->next = (i)->next; \
|
||||
} while (0)
|
||||
|
||||
#endif /* __DPAA_LIST_H */
|
Loading…
x
Reference in New Issue
Block a user