xref: /dpdk/drivers/net/bnxt/tf_core/stack.h (revision e6e8f03e5459f25153f1e4cd3e9ac30d3e473a61)
169c410b8SPete Spreadborough /* SPDX-License-Identifier: BSD-3-Clause
2*e6e8f03eSRandy Schacher  * Copyright(c) 2019-2023 Broadcom
369c410b8SPete Spreadborough  * All rights reserved.
469c410b8SPete Spreadborough  */
569c410b8SPete Spreadborough #ifndef _STACK_H_
669c410b8SPete Spreadborough #define _STACK_H_
769c410b8SPete Spreadborough 
869c410b8SPete Spreadborough #include <stdio.h>
969c410b8SPete Spreadborough #include <stdlib.h>
1069c410b8SPete Spreadborough #include <stdbool.h>
1169c410b8SPete Spreadborough #include <stdint.h>
1269c410b8SPete Spreadborough 
1369c410b8SPete Spreadborough /** Stack data structure
1469c410b8SPete Spreadborough  */
1569c410b8SPete Spreadborough struct stack {
1669c410b8SPete Spreadborough 	int max;         /**< Maximum number of entries */
1769c410b8SPete Spreadborough 	int top;         /**< maximum value in stack */
1869c410b8SPete Spreadborough 	uint32_t *items; /**< items in the stack */
1969c410b8SPete Spreadborough };
2069c410b8SPete Spreadborough 
2169c410b8SPete Spreadborough /** Initialize stack of uint32_t elements
2269c410b8SPete Spreadborough  *
2369c410b8SPete Spreadborough  *  [in] num_entries
2469c410b8SPete Spreadborough  *    maximum number of elements in the stack
2569c410b8SPete Spreadborough  *
2669c410b8SPete Spreadborough  *  [in] items
2769c410b8SPete Spreadborough  *    pointer to items (must be sized to (uint32_t * num_entries)
2869c410b8SPete Spreadborough  *
2969c410b8SPete Spreadborough  *  s[in] st
3069c410b8SPete Spreadborough  *    pointer to the stack structure
3169c410b8SPete Spreadborough  *
3269c410b8SPete Spreadborough  *  return
3369c410b8SPete Spreadborough  *    0 for success
3469c410b8SPete Spreadborough  */
3569c410b8SPete Spreadborough int stack_init(int num_entries,
3669c410b8SPete Spreadborough 	       uint32_t *items,
3769c410b8SPete Spreadborough 	       struct stack *st);
3869c410b8SPete Spreadborough 
39ae2ebb98SPeter Spreadborough /** Return the address of the stack contents
40ae2ebb98SPeter Spreadborough  *
41ae2ebb98SPeter Spreadborough  *  [in] st
42ae2ebb98SPeter Spreadborough  *    pointer to the stack
43ae2ebb98SPeter Spreadborough  *
44ae2ebb98SPeter Spreadborough  *  return
45ae2ebb98SPeter Spreadborough  *    pointer to the stack contents
46ae2ebb98SPeter Spreadborough  */
47ae2ebb98SPeter Spreadborough uint32_t *stack_items(struct stack *st);
48ae2ebb98SPeter Spreadborough 
4969c410b8SPete Spreadborough /** Return the size of the stack
5069c410b8SPete Spreadborough  *
5169c410b8SPete Spreadborough  *  [in] st
5269c410b8SPete Spreadborough  *    pointer to the stack
5369c410b8SPete Spreadborough  *
5469c410b8SPete Spreadborough  *  return
5569c410b8SPete Spreadborough  *    number of elements
5669c410b8SPete Spreadborough  */
5769c410b8SPete Spreadborough int32_t stack_size(struct stack *st);
5869c410b8SPete Spreadborough 
5969c410b8SPete Spreadborough /** Check if the stack is empty
6069c410b8SPete Spreadborough  *
6169c410b8SPete Spreadborough  * [in] st
6269c410b8SPete Spreadborough  *   pointer to the stack
6369c410b8SPete Spreadborough  *
6469c410b8SPete Spreadborough  * return
6569c410b8SPete Spreadborough  *   true or false
6669c410b8SPete Spreadborough  */
6769c410b8SPete Spreadborough bool stack_is_empty(struct stack *st);
6869c410b8SPete Spreadborough 
6969c410b8SPete Spreadborough /** Check if the stack is full
7069c410b8SPete Spreadborough  *
7169c410b8SPete Spreadborough  * [in] st
7269c410b8SPete Spreadborough  *   pointer to the stack
7369c410b8SPete Spreadborough  *
7469c410b8SPete Spreadborough  * return
7569c410b8SPete Spreadborough  *   true or false
7669c410b8SPete Spreadborough  */
7769c410b8SPete Spreadborough bool stack_is_full(struct stack *st);
7869c410b8SPete Spreadborough 
7969c410b8SPete Spreadborough /** Add  element x to  the stack
8069c410b8SPete Spreadborough  *
8169c410b8SPete Spreadborough  * [in] st
8269c410b8SPete Spreadborough  *   pointer to the stack
8369c410b8SPete Spreadborough  *
8469c410b8SPete Spreadborough  * [in] x
8569c410b8SPete Spreadborough  *   value to push on the stack
8669c410b8SPete Spreadborough  * return
8769c410b8SPete Spreadborough  *  0 for success
8869c410b8SPete Spreadborough  */
8969c410b8SPete Spreadborough int stack_push(struct stack *st, uint32_t x);
9069c410b8SPete Spreadborough 
9169c410b8SPete Spreadborough /** Pop top element x from the stack and return
9269c410b8SPete Spreadborough  * in user provided location.
9369c410b8SPete Spreadborough  *
9469c410b8SPete Spreadborough  * [in] st
9569c410b8SPete Spreadborough  *   pointer to the stack
9669c410b8SPete Spreadborough  *
9769c410b8SPete Spreadborough  * [in, out] x
9869c410b8SPete Spreadborough  *  pointer to where the value popped will be written
9969c410b8SPete Spreadborough  *
10069c410b8SPete Spreadborough  * return
10169c410b8SPete Spreadborough  *  0 for success
10269c410b8SPete Spreadborough  */
10369c410b8SPete Spreadborough int stack_pop(struct stack *st, uint32_t *x);
10469c410b8SPete Spreadborough 
10569c410b8SPete Spreadborough /** Dump stack information
10669c410b8SPete Spreadborough  *
10769c410b8SPete Spreadborough  * Warning: Don't use for large stacks due to prints
10869c410b8SPete Spreadborough  *
10969c410b8SPete Spreadborough  * [in] st
11069c410b8SPete Spreadborough  *   pointer to the stack
11169c410b8SPete Spreadborough  *
11269c410b8SPete Spreadborough  * return
11369c410b8SPete Spreadborough  *    none
11469c410b8SPete Spreadborough  */
11569c410b8SPete Spreadborough void stack_dump(struct stack *st);
11669c410b8SPete Spreadborough #endif /* _STACK_H_ */
117