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