1306ec721SAlexander Lobakin /* SPDX-License-Identifier: GPL-2.0-only */ 2306ec721SAlexander Lobakin /* Copyright (C) 2024 Intel Corporation */ 3306ec721SAlexander Lobakin 4306ec721SAlexander Lobakin #ifndef __LIBIE_RX_H 5306ec721SAlexander Lobakin #define __LIBIE_RX_H 6306ec721SAlexander Lobakin 7306ec721SAlexander Lobakin #include <net/libeth/rx.h> 8306ec721SAlexander Lobakin 9*5fa4caffSAlexander Lobakin /* Rx buffer management */ 10*5fa4caffSAlexander Lobakin 11*5fa4caffSAlexander Lobakin /* The largest size for a single descriptor as per HW */ 12*5fa4caffSAlexander Lobakin #define LIBIE_MAX_RX_BUF_LEN 9728U 13*5fa4caffSAlexander Lobakin /* "True" HW-writeable space: minimum from SW and HW values */ 14*5fa4caffSAlexander Lobakin #define LIBIE_RX_BUF_LEN(hr) min_t(u32, LIBETH_RX_PAGE_LEN(hr), \ 15*5fa4caffSAlexander Lobakin LIBIE_MAX_RX_BUF_LEN) 16*5fa4caffSAlexander Lobakin 17*5fa4caffSAlexander Lobakin /* The maximum frame size as per HW (S/G) */ 18*5fa4caffSAlexander Lobakin #define __LIBIE_MAX_RX_FRM_LEN 16382U 19*5fa4caffSAlexander Lobakin /* ATST, HW can chain up to 5 Rx descriptors */ 20*5fa4caffSAlexander Lobakin #define LIBIE_MAX_RX_FRM_LEN(hr) \ 21*5fa4caffSAlexander Lobakin min_t(u32, __LIBIE_MAX_RX_FRM_LEN, LIBIE_RX_BUF_LEN(hr) * 5) 22*5fa4caffSAlexander Lobakin /* Maximum frame size minus LL overhead */ 23*5fa4caffSAlexander Lobakin #define LIBIE_MAX_MTU \ 24*5fa4caffSAlexander Lobakin (LIBIE_MAX_RX_FRM_LEN(LIBETH_MAX_HEADROOM) - LIBETH_RX_LL_LEN) 25*5fa4caffSAlexander Lobakin 26306ec721SAlexander Lobakin /* O(1) converting i40e/ice/iavf's 8/10-bit hardware packet type to a parsed 27306ec721SAlexander Lobakin * bitfield struct. 28306ec721SAlexander Lobakin */ 29306ec721SAlexander Lobakin 30306ec721SAlexander Lobakin #define LIBIE_RX_PT_NUM 154 31306ec721SAlexander Lobakin 32306ec721SAlexander Lobakin extern const struct libeth_rx_pt libie_rx_pt_lut[LIBIE_RX_PT_NUM]; 33306ec721SAlexander Lobakin 34306ec721SAlexander Lobakin /** 35306ec721SAlexander Lobakin * libie_rx_pt_parse - convert HW packet type to software bitfield structure 36306ec721SAlexander Lobakin * @pt: 10-bit hardware packet type value from the descriptor 37306ec721SAlexander Lobakin * 38306ec721SAlexander Lobakin * ```libie_rx_pt_lut``` must be accessed only using this wrapper. 39306ec721SAlexander Lobakin * 40306ec721SAlexander Lobakin * Return: parsed bitfield struct corresponding to the provided ptype. 41306ec721SAlexander Lobakin */ libie_rx_pt_parse(u32 pt)42306ec721SAlexander Lobakinstatic inline struct libeth_rx_pt libie_rx_pt_parse(u32 pt) 43306ec721SAlexander Lobakin { 44306ec721SAlexander Lobakin if (unlikely(pt >= LIBIE_RX_PT_NUM)) 45306ec721SAlexander Lobakin pt = 0; 46306ec721SAlexander Lobakin 47306ec721SAlexander Lobakin return libie_rx_pt_lut[pt]; 48306ec721SAlexander Lobakin } 49306ec721SAlexander Lobakin 50306ec721SAlexander Lobakin #endif /* __LIBIE_RX_H */ 51