1aa2be509SMichael Wildt /* SPDX-License-Identifier: BSD-3-Clause
2*e6e8f03eSRandy Schacher * Copyright(c) 2019-2023 Broadcom
3aa2be509SMichael Wildt * All rights reserved.
4aa2be509SMichael Wildt */
5aa2be509SMichael Wildt
6aa2be509SMichael Wildt /* Linked List Header File */
7aa2be509SMichael Wildt
8aa2be509SMichael Wildt #ifndef _LL_H_
9aa2be509SMichael Wildt #define _LL_H_
10aa2be509SMichael Wildt
1137ff91c1SFarah Smith #include <stdint.h>
1237ff91c1SFarah Smith
13aa2be509SMichael Wildt /* linked list entry */
14aa2be509SMichael Wildt struct ll_entry {
15aa2be509SMichael Wildt struct ll_entry *prev;
16aa2be509SMichael Wildt struct ll_entry *next;
17aa2be509SMichael Wildt };
18aa2be509SMichael Wildt
19aa2be509SMichael Wildt /* linked list */
20aa2be509SMichael Wildt struct ll {
21aa2be509SMichael Wildt struct ll_entry *head;
22aa2be509SMichael Wildt struct ll_entry *tail;
2337ff91c1SFarah Smith uint32_t cnt;
24aa2be509SMichael Wildt };
25aa2be509SMichael Wildt
26aa2be509SMichael Wildt /**
27aa2be509SMichael Wildt * Linked list initialization.
28aa2be509SMichael Wildt *
29aa2be509SMichael Wildt * [in] ll, linked list to be initialized
30aa2be509SMichael Wildt */
31aa2be509SMichael Wildt void ll_init(struct ll *ll);
32aa2be509SMichael Wildt
33aa2be509SMichael Wildt /**
3437ff91c1SFarah Smith * Linked list insert head
35aa2be509SMichael Wildt *
36aa2be509SMichael Wildt * [in] ll, linked list where element is inserted
37aa2be509SMichael Wildt * [in] entry, entry to be added
38aa2be509SMichael Wildt */
39aa2be509SMichael Wildt void ll_insert(struct ll *ll, struct ll_entry *entry);
40aa2be509SMichael Wildt
41aa2be509SMichael Wildt /**
42aa2be509SMichael Wildt * Linked list delete
43aa2be509SMichael Wildt *
44aa2be509SMichael Wildt * [in] ll, linked list where element is removed
45aa2be509SMichael Wildt * [in] entry, entry to be deleted
46aa2be509SMichael Wildt */
47aa2be509SMichael Wildt void ll_delete(struct ll *ll, struct ll_entry *entry);
48aa2be509SMichael Wildt
4937ff91c1SFarah Smith /**
5037ff91c1SFarah Smith * Linked list return next entry without deleting it
5137ff91c1SFarah Smith *
5237ff91c1SFarah Smith * Useful in performing search
5337ff91c1SFarah Smith *
5437ff91c1SFarah Smith * [in] Entry in the list
5537ff91c1SFarah Smith */
ll_next(struct ll_entry * entry)5637ff91c1SFarah Smith static inline struct ll_entry *ll_next(struct ll_entry *entry)
5737ff91c1SFarah Smith {
5837ff91c1SFarah Smith return entry->next;
5937ff91c1SFarah Smith }
6037ff91c1SFarah Smith
6137ff91c1SFarah Smith /**
6237ff91c1SFarah Smith * Linked list return the head of the list without removing it
6337ff91c1SFarah Smith *
6437ff91c1SFarah Smith * Useful in performing search
6537ff91c1SFarah Smith *
6637ff91c1SFarah Smith * [in] ll, linked list
6737ff91c1SFarah Smith */
ll_head(struct ll * ll)6837ff91c1SFarah Smith static inline struct ll_entry *ll_head(struct ll *ll)
6937ff91c1SFarah Smith {
7037ff91c1SFarah Smith return ll->head;
7137ff91c1SFarah Smith }
7237ff91c1SFarah Smith
7337ff91c1SFarah Smith /**
7437ff91c1SFarah Smith * Linked list return the tail of the list without removing it
7537ff91c1SFarah Smith *
7637ff91c1SFarah Smith * Useful in performing search
7737ff91c1SFarah Smith *
7837ff91c1SFarah Smith * [in] ll, linked list
7937ff91c1SFarah Smith */
ll_tail(struct ll * ll)8037ff91c1SFarah Smith static inline struct ll_entry *ll_tail(struct ll *ll)
8137ff91c1SFarah Smith {
8237ff91c1SFarah Smith return ll->tail;
8337ff91c1SFarah Smith }
8437ff91c1SFarah Smith
8537ff91c1SFarah Smith /**
8637ff91c1SFarah Smith * Linked list return the number of entries in the list
8737ff91c1SFarah Smith *
8837ff91c1SFarah Smith * [in] ll, linked list
8937ff91c1SFarah Smith */
ll_cnt(struct ll * ll)9037ff91c1SFarah Smith static inline uint32_t ll_cnt(struct ll *ll)
9137ff91c1SFarah Smith {
9237ff91c1SFarah Smith return ll->cnt;
9337ff91c1SFarah Smith }
94aa2be509SMichael Wildt #endif /* _LL_H_ */
95