162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2008-2010 Cisco Systems, Inc. All rights reserved. 462306a36Sopenharmony_ci * Copyright 2007 Nuova Systems, Inc. All rights reserved. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef _ENIC_RES_H_ 862306a36Sopenharmony_ci#define _ENIC_RES_H_ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "wq_enet_desc.h" 1162306a36Sopenharmony_ci#include "rq_enet_desc.h" 1262306a36Sopenharmony_ci#include "vnic_wq.h" 1362306a36Sopenharmony_ci#include "vnic_rq.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define ENIC_MIN_WQ_DESCS 64 1662306a36Sopenharmony_ci#define ENIC_MAX_WQ_DESCS 4096 1762306a36Sopenharmony_ci#define ENIC_MIN_RQ_DESCS 64 1862306a36Sopenharmony_ci#define ENIC_MAX_RQ_DESCS 4096 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define ENIC_MIN_MTU ETH_MIN_MTU 2162306a36Sopenharmony_ci#define ENIC_MAX_MTU 9000 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define ENIC_MULTICAST_PERFECT_FILTERS 32 2462306a36Sopenharmony_ci#define ENIC_UNICAST_PERFECT_FILTERS 32 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define ENIC_NON_TSO_MAX_DESC 16 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define ENIC_SETTING(enic, f) ((enic->config.flags & VENETF_##f) ? 1 : 0) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic inline void enic_queue_wq_desc_ex(struct vnic_wq *wq, 3162306a36Sopenharmony_ci void *os_buf, dma_addr_t dma_addr, unsigned int len, 3262306a36Sopenharmony_ci unsigned int mss_or_csum_offset, unsigned int hdr_len, 3362306a36Sopenharmony_ci int vlan_tag_insert, unsigned int vlan_tag, 3462306a36Sopenharmony_ci int offload_mode, int cq_entry, int sop, int eop, int loopback) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci struct wq_enet_desc *desc = vnic_wq_next_desc(wq); 3762306a36Sopenharmony_ci u8 desc_skip_cnt = 1; 3862306a36Sopenharmony_ci u8 compressed_send = 0; 3962306a36Sopenharmony_ci u64 wrid = 0; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci wq_enet_desc_enc(desc, 4262306a36Sopenharmony_ci (u64)dma_addr | VNIC_PADDR_TARGET, 4362306a36Sopenharmony_ci (u16)len, 4462306a36Sopenharmony_ci (u16)mss_or_csum_offset, 4562306a36Sopenharmony_ci (u16)hdr_len, (u8)offload_mode, 4662306a36Sopenharmony_ci (u8)eop, (u8)cq_entry, 4762306a36Sopenharmony_ci 0, /* fcoe_encap */ 4862306a36Sopenharmony_ci (u8)vlan_tag_insert, 4962306a36Sopenharmony_ci (u16)vlan_tag, 5062306a36Sopenharmony_ci (u8)loopback); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci vnic_wq_post(wq, os_buf, dma_addr, len, sop, eop, desc_skip_cnt, 5362306a36Sopenharmony_ci (u8)cq_entry, compressed_send, wrid); 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic inline void enic_queue_wq_desc_cont(struct vnic_wq *wq, 5762306a36Sopenharmony_ci void *os_buf, dma_addr_t dma_addr, unsigned int len, 5862306a36Sopenharmony_ci int eop, int loopback) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci enic_queue_wq_desc_ex(wq, os_buf, dma_addr, len, 6162306a36Sopenharmony_ci 0, 0, 0, 0, 0, 6262306a36Sopenharmony_ci eop, 0 /* !SOP */, eop, loopback); 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic inline void enic_queue_wq_desc(struct vnic_wq *wq, void *os_buf, 6662306a36Sopenharmony_ci dma_addr_t dma_addr, unsigned int len, int vlan_tag_insert, 6762306a36Sopenharmony_ci unsigned int vlan_tag, int eop, int loopback) 6862306a36Sopenharmony_ci{ 6962306a36Sopenharmony_ci enic_queue_wq_desc_ex(wq, os_buf, dma_addr, len, 7062306a36Sopenharmony_ci 0, 0, vlan_tag_insert, vlan_tag, 7162306a36Sopenharmony_ci WQ_ENET_OFFLOAD_MODE_CSUM, 7262306a36Sopenharmony_ci eop, 1 /* SOP */, eop, loopback); 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistatic inline void enic_queue_wq_desc_csum(struct vnic_wq *wq, 7662306a36Sopenharmony_ci void *os_buf, dma_addr_t dma_addr, unsigned int len, 7762306a36Sopenharmony_ci int ip_csum, int tcpudp_csum, int vlan_tag_insert, 7862306a36Sopenharmony_ci unsigned int vlan_tag, int eop, int loopback) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci enic_queue_wq_desc_ex(wq, os_buf, dma_addr, len, 8162306a36Sopenharmony_ci (ip_csum ? 1 : 0) + (tcpudp_csum ? 2 : 0), 8262306a36Sopenharmony_ci 0, vlan_tag_insert, vlan_tag, 8362306a36Sopenharmony_ci WQ_ENET_OFFLOAD_MODE_CSUM, 8462306a36Sopenharmony_ci eop, 1 /* SOP */, eop, loopback); 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistatic inline void enic_queue_wq_desc_csum_l4(struct vnic_wq *wq, 8862306a36Sopenharmony_ci void *os_buf, dma_addr_t dma_addr, unsigned int len, 8962306a36Sopenharmony_ci unsigned int csum_offset, unsigned int hdr_len, 9062306a36Sopenharmony_ci int vlan_tag_insert, unsigned int vlan_tag, int eop, int loopback) 9162306a36Sopenharmony_ci{ 9262306a36Sopenharmony_ci enic_queue_wq_desc_ex(wq, os_buf, dma_addr, len, 9362306a36Sopenharmony_ci csum_offset, hdr_len, vlan_tag_insert, vlan_tag, 9462306a36Sopenharmony_ci WQ_ENET_OFFLOAD_MODE_CSUM_L4, 9562306a36Sopenharmony_ci eop, 1 /* SOP */, eop, loopback); 9662306a36Sopenharmony_ci} 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistatic inline void enic_queue_wq_desc_tso(struct vnic_wq *wq, 9962306a36Sopenharmony_ci void *os_buf, dma_addr_t dma_addr, unsigned int len, 10062306a36Sopenharmony_ci unsigned int mss, unsigned int hdr_len, int vlan_tag_insert, 10162306a36Sopenharmony_ci unsigned int vlan_tag, int eop, int loopback) 10262306a36Sopenharmony_ci{ 10362306a36Sopenharmony_ci enic_queue_wq_desc_ex(wq, os_buf, dma_addr, len, 10462306a36Sopenharmony_ci mss, hdr_len, vlan_tag_insert, vlan_tag, 10562306a36Sopenharmony_ci WQ_ENET_OFFLOAD_MODE_TSO, 10662306a36Sopenharmony_ci eop, 1 /* SOP */, eop, loopback); 10762306a36Sopenharmony_ci} 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cistatic inline void enic_queue_rq_desc(struct vnic_rq *rq, 11062306a36Sopenharmony_ci void *os_buf, unsigned int os_buf_index, 11162306a36Sopenharmony_ci dma_addr_t dma_addr, unsigned int len) 11262306a36Sopenharmony_ci{ 11362306a36Sopenharmony_ci struct rq_enet_desc *desc = vnic_rq_next_desc(rq); 11462306a36Sopenharmony_ci u64 wrid = 0; 11562306a36Sopenharmony_ci u8 type = os_buf_index ? 11662306a36Sopenharmony_ci RQ_ENET_TYPE_NOT_SOP : RQ_ENET_TYPE_ONLY_SOP; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci rq_enet_desc_enc(desc, 11962306a36Sopenharmony_ci (u64)dma_addr | VNIC_PADDR_TARGET, 12062306a36Sopenharmony_ci type, (u16)len); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci vnic_rq_post(rq, os_buf, os_buf_index, dma_addr, len, wrid); 12362306a36Sopenharmony_ci} 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_cistruct enic; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ciint enic_get_vnic_config(struct enic *); 12862306a36Sopenharmony_ciint enic_add_vlan(struct enic *enic, u16 vlanid); 12962306a36Sopenharmony_ciint enic_del_vlan(struct enic *enic, u16 vlanid); 13062306a36Sopenharmony_ciint enic_set_nic_cfg(struct enic *enic, u8 rss_default_cpu, u8 rss_hash_type, 13162306a36Sopenharmony_ci u8 rss_hash_bits, u8 rss_base_cpu, u8 rss_enable, u8 tso_ipid_split_en, 13262306a36Sopenharmony_ci u8 ig_vlan_strip_en); 13362306a36Sopenharmony_ciint enic_set_rss_key(struct enic *enic, dma_addr_t key_pa, u64 len); 13462306a36Sopenharmony_ciint enic_set_rss_cpu(struct enic *enic, dma_addr_t cpu_pa, u64 len); 13562306a36Sopenharmony_civoid enic_get_res_counts(struct enic *enic); 13662306a36Sopenharmony_civoid enic_init_vnic_resources(struct enic *enic); 13762306a36Sopenharmony_ciint enic_alloc_vnic_resources(struct enic *); 13862306a36Sopenharmony_civoid enic_free_vnic_resources(struct enic *); 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci#endif /* _ENIC_RES_H_ */ 141