17c2aad20Sopenharmony_ci/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
27c2aad20Sopenharmony_ci
37c2aad20Sopenharmony_ci#ifndef __LINUX_LIST_H
47c2aad20Sopenharmony_ci#define __LINUX_LIST_H
57c2aad20Sopenharmony_ci
67c2aad20Sopenharmony_ci#define LIST_HEAD_INIT(name) { &(name), &(name) }
77c2aad20Sopenharmony_ci#define LIST_HEAD(name) \
87c2aad20Sopenharmony_ci        struct list_head name = LIST_HEAD_INIT(name)
97c2aad20Sopenharmony_ci
107c2aad20Sopenharmony_ci#define POISON_POINTER_DELTA 0
117c2aad20Sopenharmony_ci#define LIST_POISON1  ((void *) 0x100 + POISON_POINTER_DELTA)
127c2aad20Sopenharmony_ci#define LIST_POISON2  ((void *) 0x200 + POISON_POINTER_DELTA)
137c2aad20Sopenharmony_ci
147c2aad20Sopenharmony_ci
157c2aad20Sopenharmony_cistatic inline void INIT_LIST_HEAD(struct list_head *list)
167c2aad20Sopenharmony_ci{
177c2aad20Sopenharmony_ci        list->next = list;
187c2aad20Sopenharmony_ci        list->prev = list;
197c2aad20Sopenharmony_ci}
207c2aad20Sopenharmony_ci
217c2aad20Sopenharmony_cistatic inline void __list_add(struct list_head *new,
227c2aad20Sopenharmony_ci                              struct list_head *prev,
237c2aad20Sopenharmony_ci                              struct list_head *next)
247c2aad20Sopenharmony_ci{
257c2aad20Sopenharmony_ci        next->prev = new;
267c2aad20Sopenharmony_ci        new->next = next;
277c2aad20Sopenharmony_ci        new->prev = prev;
287c2aad20Sopenharmony_ci        prev->next = new;
297c2aad20Sopenharmony_ci}
307c2aad20Sopenharmony_ci
317c2aad20Sopenharmony_ci/**
327c2aad20Sopenharmony_ci * list_add - add a new entry
337c2aad20Sopenharmony_ci * @new: new entry to be added
347c2aad20Sopenharmony_ci * @head: list head to add it after
357c2aad20Sopenharmony_ci *
367c2aad20Sopenharmony_ci * Insert a new entry after the specified head.
377c2aad20Sopenharmony_ci * This is good for implementing stacks.
387c2aad20Sopenharmony_ci */
397c2aad20Sopenharmony_cistatic inline void list_add(struct list_head *new, struct list_head *head)
407c2aad20Sopenharmony_ci{
417c2aad20Sopenharmony_ci        __list_add(new, head, head->next);
427c2aad20Sopenharmony_ci}
437c2aad20Sopenharmony_ci
447c2aad20Sopenharmony_ci/*
457c2aad20Sopenharmony_ci * Delete a list entry by making the prev/next entries
467c2aad20Sopenharmony_ci * point to each other.
477c2aad20Sopenharmony_ci *
487c2aad20Sopenharmony_ci * This is only for internal list manipulation where we know
497c2aad20Sopenharmony_ci * the prev/next entries already!
507c2aad20Sopenharmony_ci */
517c2aad20Sopenharmony_cistatic inline void __list_del(struct list_head * prev, struct list_head * next)
527c2aad20Sopenharmony_ci{
537c2aad20Sopenharmony_ci        next->prev = prev;
547c2aad20Sopenharmony_ci        prev->next = next;
557c2aad20Sopenharmony_ci}
567c2aad20Sopenharmony_ci
577c2aad20Sopenharmony_ci/**
587c2aad20Sopenharmony_ci * list_del - deletes entry from list.
597c2aad20Sopenharmony_ci * @entry: the element to delete from the list.
607c2aad20Sopenharmony_ci * Note: list_empty() on entry does not return true after this, the entry is
617c2aad20Sopenharmony_ci * in an undefined state.
627c2aad20Sopenharmony_ci */
637c2aad20Sopenharmony_cistatic inline void __list_del_entry(struct list_head *entry)
647c2aad20Sopenharmony_ci{
657c2aad20Sopenharmony_ci        __list_del(entry->prev, entry->next);
667c2aad20Sopenharmony_ci}
677c2aad20Sopenharmony_ci
687c2aad20Sopenharmony_cistatic inline void list_del(struct list_head *entry)
697c2aad20Sopenharmony_ci{
707c2aad20Sopenharmony_ci        __list_del(entry->prev, entry->next);
717c2aad20Sopenharmony_ci        entry->next = LIST_POISON1;
727c2aad20Sopenharmony_ci        entry->prev = LIST_POISON2;
737c2aad20Sopenharmony_ci}
747c2aad20Sopenharmony_ci
757c2aad20Sopenharmony_cistatic inline int list_empty(const struct list_head *head)
767c2aad20Sopenharmony_ci{
777c2aad20Sopenharmony_ci	return head->next == head;
787c2aad20Sopenharmony_ci}
797c2aad20Sopenharmony_ci
807c2aad20Sopenharmony_ci#define list_entry(ptr, type, member) \
817c2aad20Sopenharmony_ci        container_of(ptr, type, member)
827c2aad20Sopenharmony_ci#define list_first_entry(ptr, type, member) \
837c2aad20Sopenharmony_ci        list_entry((ptr)->next, type, member)
847c2aad20Sopenharmony_ci#define list_next_entry(pos, member) \
857c2aad20Sopenharmony_ci        list_entry((pos)->member.next, typeof(*(pos)), member)
867c2aad20Sopenharmony_ci#define list_for_each_entry(pos, head, member) \
877c2aad20Sopenharmony_ci	for (pos = list_first_entry(head, typeof(*pos), member); \
887c2aad20Sopenharmony_ci	     &pos->member != (head); \
897c2aad20Sopenharmony_ci	     pos = list_next_entry(pos, member))
907c2aad20Sopenharmony_ci
917c2aad20Sopenharmony_ci#endif
92