162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Applied Micro X-Gene SoC Ethernet v2 Driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2017, Applied Micro Circuits Corporation
662306a36Sopenharmony_ci * Author(s): Iyappan Subramanian <isubramanian@apm.com>
762306a36Sopenharmony_ci *	      Keyur Chudgar <kchudgar@apm.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef __XGENE_ENET_V2_RING_H__
1162306a36Sopenharmony_ci#define __XGENE_ENET_V2_RING_H__
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#define XGENE_ENET_DESC_SIZE	64
1462306a36Sopenharmony_ci#define XGENE_ENET_NUM_DESC	256
1562306a36Sopenharmony_ci#define NUM_BUFS		8
1662306a36Sopenharmony_ci#define SLOT_EMPTY		0xfff
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define DMATXCTRL		0xa180
1962306a36Sopenharmony_ci#define DMATXDESCL		0xa184
2062306a36Sopenharmony_ci#define DMATXDESCH		0xa1a0
2162306a36Sopenharmony_ci#define DMATXSTATUS		0xa188
2262306a36Sopenharmony_ci#define DMARXCTRL		0xa18c
2362306a36Sopenharmony_ci#define DMARXDESCL		0xa190
2462306a36Sopenharmony_ci#define DMARXDESCH		0xa1a4
2562306a36Sopenharmony_ci#define DMARXSTATUS		0xa194
2662306a36Sopenharmony_ci#define DMAINTRMASK		0xa198
2762306a36Sopenharmony_ci#define DMAINTERRUPT		0xa19c
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define D_POS			62
3062306a36Sopenharmony_ci#define D_LEN			2
3162306a36Sopenharmony_ci#define E_POS			63
3262306a36Sopenharmony_ci#define E_LEN			1
3362306a36Sopenharmony_ci#define PKT_ADDRL_POS		0
3462306a36Sopenharmony_ci#define PKT_ADDRL_LEN		32
3562306a36Sopenharmony_ci#define PKT_ADDRH_POS		32
3662306a36Sopenharmony_ci#define PKT_ADDRH_LEN		10
3762306a36Sopenharmony_ci#define PKT_SIZE_POS		32
3862306a36Sopenharmony_ci#define PKT_SIZE_LEN		12
3962306a36Sopenharmony_ci#define NEXT_DESC_ADDRL_POS	0
4062306a36Sopenharmony_ci#define NEXT_DESC_ADDRL_LEN	32
4162306a36Sopenharmony_ci#define NEXT_DESC_ADDRH_POS	48
4262306a36Sopenharmony_ci#define NEXT_DESC_ADDRH_LEN	10
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define TXPKTCOUNT_POS		16
4562306a36Sopenharmony_ci#define TXPKTCOUNT_LEN		8
4662306a36Sopenharmony_ci#define RXPKTCOUNT_POS		16
4762306a36Sopenharmony_ci#define RXPKTCOUNT_LEN		8
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci#define TX_PKT_SENT		BIT(0)
5062306a36Sopenharmony_ci#define TX_BUS_ERROR		BIT(3)
5162306a36Sopenharmony_ci#define RX_PKT_RCVD		BIT(4)
5262306a36Sopenharmony_ci#define RX_BUS_ERROR		BIT(7)
5362306a36Sopenharmony_ci#define RXSTATUS_RXPKTRCVD	BIT(0)
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistruct xge_raw_desc {
5662306a36Sopenharmony_ci	__le64 m0;
5762306a36Sopenharmony_ci	__le64 m1;
5862306a36Sopenharmony_ci	__le64 m2;
5962306a36Sopenharmony_ci	__le64 m3;
6062306a36Sopenharmony_ci	__le64 m4;
6162306a36Sopenharmony_ci	__le64 m5;
6262306a36Sopenharmony_ci	__le64 m6;
6362306a36Sopenharmony_ci	__le64 m7;
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistruct pkt_info {
6762306a36Sopenharmony_ci	struct sk_buff *skb;
6862306a36Sopenharmony_ci	dma_addr_t dma_addr;
6962306a36Sopenharmony_ci	void *pkt_buf;
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci/* software context of a descriptor ring */
7362306a36Sopenharmony_cistruct xge_desc_ring {
7462306a36Sopenharmony_ci	struct net_device *ndev;
7562306a36Sopenharmony_ci	dma_addr_t dma_addr;
7662306a36Sopenharmony_ci	u8 head;
7762306a36Sopenharmony_ci	u8 tail;
7862306a36Sopenharmony_ci	union {
7962306a36Sopenharmony_ci		void *desc_addr;
8062306a36Sopenharmony_ci		struct xge_raw_desc *raw_desc;
8162306a36Sopenharmony_ci	};
8262306a36Sopenharmony_ci	struct pkt_info (*pkt_info);
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistatic inline u64 xge_set_desc_bits(int pos, int len, u64 val)
8662306a36Sopenharmony_ci{
8762306a36Sopenharmony_ci	return (val & ((1ULL << len) - 1)) << pos;
8862306a36Sopenharmony_ci}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistatic inline u64 xge_get_desc_bits(int pos, int len, u64 src)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	return (src >> pos) & ((1ULL << len) - 1);
9362306a36Sopenharmony_ci}
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci#define SET_BITS(field, val) \
9662306a36Sopenharmony_ci		xge_set_desc_bits(field ## _POS, field ## _LEN, val)
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci#define GET_BITS(field, src) \
9962306a36Sopenharmony_ci		xge_get_desc_bits(field ## _POS, field ## _LEN, src)
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_civoid xge_setup_desc(struct xge_desc_ring *ring);
10262306a36Sopenharmony_civoid xge_update_tx_desc_addr(struct xge_pdata *pdata);
10362306a36Sopenharmony_civoid xge_update_rx_desc_addr(struct xge_pdata *pdata);
10462306a36Sopenharmony_civoid xge_intr_enable(struct xge_pdata *pdata);
10562306a36Sopenharmony_civoid xge_intr_disable(struct xge_pdata *pdata);
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci#endif  /* __XGENE_ENET_V2_RING_H__ */
108