// SPDX-License-Identifier: GPL-2.0 /* Marvell RVU Admin Function driver * * Copyright (C) 2022 Marvell. * */ #include <linux/bitfield.h> #include <linux/module.h> #include <linux/pci.h> #include <linux/firmware.h> #include <linux/stddef.h> #include <linux/debugfs.h> #include "rvu_struct.h" #include "rvu_reg.h" #include "rvu.h" #include "npc.h" #include "cgx.h" #include "rvu_npc_fs.h" #include "rvu_npc_hash.h" static u64 rvu_npc_wide_extract(const u64 input[], size_t start_bit, size_t width_bits) { … } static void rvu_npc_lshift_key(u64 *key, size_t key_bit_len) { … } static u32 rvu_npc_toeplitz_hash(const u64 *data, u64 *key, size_t data_bit_len, size_t key_bit_len) { … } u32 npc_field_hash_calc(u64 *ldata, struct npc_get_field_hash_info_rsp rsp, u8 intf, u8 hash_idx) { … } static u64 npc_update_use_hash(struct rvu *rvu, int blkaddr, u8 intf, int lid, int lt, int ld) { … } static void npc_program_mkex_hash_rx(struct rvu *rvu, int blkaddr, u8 intf) { … } static void npc_program_mkex_hash_tx(struct rvu *rvu, int blkaddr, u8 intf) { … } void npc_config_secret_key(struct rvu *rvu, int blkaddr) { … } void npc_program_mkex_hash(struct rvu *rvu, int blkaddr) { … } void npc_update_field_hash(struct rvu *rvu, u8 intf, struct mcam_entry *entry, int blkaddr, u64 features, struct flow_msg *pkt, struct flow_msg *mask, struct flow_msg *opkt, struct flow_msg *omask) { … } int rvu_mbox_handler_npc_get_field_hash_info(struct rvu *rvu, struct npc_get_field_hash_info_req *req, struct npc_get_field_hash_info_rsp *rsp) { … } /** * rvu_exact_prepare_mdata - Make mdata for mcam entry * @mac: MAC address * @chan: Channel number. * @ctype: Channel Type. * @mask: LDATA mask. * Return: Meta data */ static u64 rvu_exact_prepare_mdata(u8 *mac, u16 chan, u16 ctype, u64 mask) { … } /** * rvu_exact_calculate_hash - calculate hash index to mem table. * @rvu: resource virtualization unit. * @chan: Channel number * @ctype: Channel type. * @mac: MAC address * @mask: HASH mask. * @table_depth: Depth of table. * Return: Hash value */ static u32 rvu_exact_calculate_hash(struct rvu *rvu, u16 chan, u16 ctype, u8 *mac, u64 mask, u32 table_depth) { … } /** * rvu_npc_exact_alloc_mem_table_entry - find free entry in 4 way table. * @rvu: resource virtualization unit. * @way: Indicate way to table. * @index: Hash index to 4 way table. * @hash: Hash value. * * Searches 4 way table using hash index. Returns 0 on success. * Return: 0 upon success. */ static int rvu_npc_exact_alloc_mem_table_entry(struct rvu *rvu, u8 *way, u32 *index, unsigned int hash) { … } /** * rvu_npc_exact_free_id - Free seq id from bitmat. * @rvu: Resource virtualization unit. * @seq_id: Sequence identifier to be freed. */ static void rvu_npc_exact_free_id(struct rvu *rvu, u32 seq_id) { … } /** * rvu_npc_exact_alloc_id - Alloc seq id from bitmap. * @rvu: Resource virtualization unit. * @seq_id: Sequence identifier. * Return: True or false. */ static bool rvu_npc_exact_alloc_id(struct rvu *rvu, u32 *seq_id) { … } /** * rvu_npc_exact_alloc_cam_table_entry - find free slot in fully associative table. * @rvu: resource virtualization unit. * @index: Index to exact CAM table. * Return: 0 upon success; else error number. */ static int rvu_npc_exact_alloc_cam_table_entry(struct rvu *rvu, int *index) { … } /** * rvu_exact_prepare_table_entry - Data for exact match table entry. * @rvu: Resource virtualization unit. * @enable: Enable/Disable entry * @ctype: Software defined channel type. Currently set as 0. * @chan: Channel number. * @mac_addr: Destination mac address. * Return: mdata for exact match table. */ static u64 rvu_exact_prepare_table_entry(struct rvu *rvu, bool enable, u8 ctype, u16 chan, u8 *mac_addr) { … } /** * rvu_exact_config_secret_key - Configure secret key. * @rvu: Resource virtualization unit. */ static void rvu_exact_config_secret_key(struct rvu *rvu) { … } /** * rvu_exact_config_search_key - Configure search key * @rvu: Resource virtualization unit. */ static void rvu_exact_config_search_key(struct rvu *rvu) { … } /** * rvu_exact_config_result_ctrl - Set exact table hash control * @rvu: Resource virtualization unit. * @depth: Depth of Exact match table. * * Sets mask and offset for hash for mem table. */ static void rvu_exact_config_result_ctrl(struct rvu *rvu, uint32_t depth) { … } /** * rvu_exact_config_table_mask - Set exact table mask. * @rvu: Resource virtualization unit. */ static void rvu_exact_config_table_mask(struct rvu *rvu) { … } /** * rvu_npc_exact_get_max_entries - Get total number of entries in table. * @rvu: resource virtualization unit. * Return: Maximum table entries possible. */ u32 rvu_npc_exact_get_max_entries(struct rvu *rvu) { … } /** * rvu_npc_exact_has_match_table - Checks support for exact match. * @rvu: resource virtualization unit. * Return: True if exact match table is supported/enabled. */ bool rvu_npc_exact_has_match_table(struct rvu *rvu) { … } /** * __rvu_npc_exact_find_entry_by_seq_id - find entry by id * @rvu: resource virtualization unit. * @seq_id: Sequence identifier. * * Caller should acquire the lock. * Return: Pointer to table entry. */ static struct npc_exact_table_entry * __rvu_npc_exact_find_entry_by_seq_id(struct rvu *rvu, u32 seq_id) { … } /** * rvu_npc_exact_add_to_list - Add entry to list * @rvu: resource virtualization unit. * @opc_type: OPCODE to select MEM/CAM table. * @ways: MEM table ways. * @index: Index in MEM/CAM table. * @cgx_id: CGX identifier. * @lmac_id: LMAC identifier. * @mac_addr: MAC address. * @chan: Channel number. * @ctype: Channel Type. * @seq_id: Sequence identifier * @cmd: True if function is called by ethtool cmd * @mcam_idx: NPC mcam index of DMAC entry in NPC mcam. * @pcifunc: pci function * Return: 0 upon success. */ static int rvu_npc_exact_add_to_list(struct rvu *rvu, enum npc_exact_opc_type opc_type, u8 ways, u32 index, u8 cgx_id, u8 lmac_id, u8 *mac_addr, u16 chan, u8 ctype, u32 *seq_id, bool cmd, u32 mcam_idx, u16 pcifunc) { … } /** * rvu_npc_exact_mem_table_write - Wrapper for register write * @rvu: resource virtualization unit. * @blkaddr: Block address * @ways: ways for MEM table. * @index: Index in MEM * @mdata: Meta data to be written to register. */ static void rvu_npc_exact_mem_table_write(struct rvu *rvu, int blkaddr, u8 ways, u32 index, u64 mdata) { … } /** * rvu_npc_exact_cam_table_write - Wrapper for register write * @rvu: resource virtualization unit. * @blkaddr: Block address * @index: Index in MEM * @mdata: Meta data to be written to register. */ static void rvu_npc_exact_cam_table_write(struct rvu *rvu, int blkaddr, u32 index, u64 mdata) { … } /** * rvu_npc_exact_dealloc_table_entry - dealloc table entry * @rvu: resource virtualization unit. * @opc_type: OPCODE for selection of table(MEM or CAM) * @ways: ways if opc_type is MEM table. * @index: Index of MEM or CAM table. * Return: 0 upon success. */ static int rvu_npc_exact_dealloc_table_entry(struct rvu *rvu, enum npc_exact_opc_type opc_type, u8 ways, u32 index) { … } /** * rvu_npc_exact_alloc_table_entry - Allociate an entry * @rvu: resource virtualization unit. * @mac: MAC address. * @chan: Channel number. * @ctype: Channel Type. * @index: Index of MEM table or CAM table. * @ways: Ways. Only valid for MEM table. * @opc_type: OPCODE to select table (MEM or CAM) * * Try allocating a slot from MEM table. If all 4 ways * slot are full for a hash index, check availability in * 32-entry CAM table for allocation. * Return: 0 upon success. */ static int rvu_npc_exact_alloc_table_entry(struct rvu *rvu, char *mac, u16 chan, u8 ctype, u32 *index, u8 *ways, enum npc_exact_opc_type *opc_type) { … } /** * rvu_npc_exact_save_drop_rule_chan_and_mask - Save drop rules info in data base. * @rvu: resource virtualization unit. * @drop_mcam_idx: Drop rule index in NPC mcam. * @chan_val: Channel value. * @chan_mask: Channel Mask. * @pcifunc: pcifunc of interface. * Return: True upon success. */ static bool rvu_npc_exact_save_drop_rule_chan_and_mask(struct rvu *rvu, int drop_mcam_idx, u64 chan_val, u64 chan_mask, u16 pcifunc) { … } /** * rvu_npc_exact_calc_drop_rule_chan_and_mask - Calculate Channel number and mask. * @rvu: resource virtualization unit. * @intf_type: Interface type (SDK, LBK or CGX) * @cgx_id: CGX identifier. * @lmac_id: LAMC identifier. * @val: Channel number. * @mask: Channel mask. * Return: True upon success. */ static bool rvu_npc_exact_calc_drop_rule_chan_and_mask(struct rvu *rvu, u8 intf_type, u8 cgx_id, u8 lmac_id, u64 *val, u64 *mask) { … } /** * rvu_npc_exact_drop_rule_to_pcifunc - Retrieve pcifunc * @rvu: resource virtualization unit. * @drop_rule_idx: Drop rule index in NPC mcam. * * Debugfs (exact_drop_cnt) entry displays pcifunc for interface * by retrieving the pcifunc value from data base. * Return: Drop rule index. */ u16 rvu_npc_exact_drop_rule_to_pcifunc(struct rvu *rvu, u32 drop_rule_idx) { … } /** * rvu_npc_exact_get_drop_rule_info - Get drop rule information. * @rvu: resource virtualization unit. * @intf_type: Interface type (CGX, SDP or LBK) * @cgx_id: CGX identifier. * @lmac_id: LMAC identifier. * @drop_mcam_idx: NPC mcam drop rule index. * @val: Channel value. * @mask: Channel mask. * @pcifunc: pcifunc of interface corresponding to the drop rule. * Return: True upon success. */ static bool rvu_npc_exact_get_drop_rule_info(struct rvu *rvu, u8 intf_type, u8 cgx_id, u8 lmac_id, u32 *drop_mcam_idx, u64 *val, u64 *mask, u16 *pcifunc) { … } /** * __rvu_npc_exact_cmd_rules_cnt_update - Update number dmac rules against a drop rule. * @rvu: resource virtualization unit. * @drop_mcam_idx: NPC mcam drop rule index. * @val: +1 or -1. * @enable_or_disable_cam: If no exact match rules against a drop rule, disable it. * * when first exact match entry against a drop rule is added, enable_or_disable_cam * is set to true. When last exact match entry against a drop rule is deleted, * enable_or_disable_cam is set to true. * Return: Number of rules */ static u16 __rvu_npc_exact_cmd_rules_cnt_update(struct rvu *rvu, int drop_mcam_idx, int val, bool *enable_or_disable_cam) { … } /** * rvu_npc_exact_del_table_entry_by_id - Delete and free table entry. * @rvu: resource virtualization unit. * @seq_id: Sequence identifier of the entry. * * Deletes entry from linked lists and free up slot in HW MEM or CAM * table. * Return: 0 upon success. */ static int rvu_npc_exact_del_table_entry_by_id(struct rvu *rvu, u32 seq_id) { … } /** * rvu_npc_exact_add_table_entry - Adds a table entry * @rvu: resource virtualization unit. * @cgx_id: cgx identifier. * @lmac_id: lmac identifier. * @mac: MAC address. * @chan: Channel number. * @ctype: Channel Type. * @seq_id: Sequence number. * @cmd: Whether it is invoked by ethtool cmd. * @mcam_idx: NPC mcam index corresponding to MAC * @pcifunc: PCI func. * * Creates a new exact match table entry in either CAM or * MEM table. * Return: 0 upon success. */ static int rvu_npc_exact_add_table_entry(struct rvu *rvu, u8 cgx_id, u8 lmac_id, u8 *mac, u16 chan, u8 ctype, u32 *seq_id, bool cmd, u32 mcam_idx, u16 pcifunc) { … } /** * rvu_npc_exact_update_table_entry - Update exact match table. * @rvu: resource virtualization unit. * @cgx_id: CGX identifier. * @lmac_id: LMAC identifier. * @old_mac: Existing MAC address entry. * @new_mac: New MAC address entry. * @seq_id: Sequence identifier of the entry. * * Updates MAC address of an entry. If entry is in MEM table, new * hash value may not match with old one. * Return: 0 upon success. */ static int rvu_npc_exact_update_table_entry(struct rvu *rvu, u8 cgx_id, u8 lmac_id, u8 *old_mac, u8 *new_mac, u32 *seq_id) { … } /** * rvu_npc_exact_promisc_disable - Disable promiscuous mode. * @rvu: resource virtualization unit. * @pcifunc: pcifunc * * Drop rule is against each PF. We dont support DMAC filter for * VF. * Return: 0 upon success */ int rvu_npc_exact_promisc_disable(struct rvu *rvu, u16 pcifunc) { … } /** * rvu_npc_exact_promisc_enable - Enable promiscuous mode. * @rvu: resource virtualization unit. * @pcifunc: pcifunc. * Return: 0 upon success */ int rvu_npc_exact_promisc_enable(struct rvu *rvu, u16 pcifunc) { … } /** * rvu_npc_exact_mac_addr_reset - Delete PF mac address. * @rvu: resource virtualization unit. * @req: Reset request * @rsp: Reset response. * Return: 0 upon success */ int rvu_npc_exact_mac_addr_reset(struct rvu *rvu, struct cgx_mac_addr_reset_req *req, struct msg_rsp *rsp) { … } /** * rvu_npc_exact_mac_addr_update - Update mac address field with new value. * @rvu: resource virtualization unit. * @req: Update request. * @rsp: Update response. * Return: 0 upon success */ int rvu_npc_exact_mac_addr_update(struct rvu *rvu, struct cgx_mac_addr_update_req *req, struct cgx_mac_addr_update_rsp *rsp) { … } /** * rvu_npc_exact_mac_addr_add - Adds MAC address to exact match table. * @rvu: resource virtualization unit. * @req: Add request. * @rsp: Add response. * Return: 0 upon success */ int rvu_npc_exact_mac_addr_add(struct rvu *rvu, struct cgx_mac_addr_add_req *req, struct cgx_mac_addr_add_rsp *rsp) { … } /** * rvu_npc_exact_mac_addr_del - Delete DMAC filter * @rvu: resource virtualization unit. * @req: Delete request. * @rsp: Delete response. * Return: 0 upon success */ int rvu_npc_exact_mac_addr_del(struct rvu *rvu, struct cgx_mac_addr_del_req *req, struct msg_rsp *rsp) { … } /** * rvu_npc_exact_mac_addr_set - Add PF mac address to dmac filter. * @rvu: resource virtualization unit. * @req: Set request. * @rsp: Set response. * Return: 0 upon success */ int rvu_npc_exact_mac_addr_set(struct rvu *rvu, struct cgx_mac_addr_set_or_get *req, struct cgx_mac_addr_set_or_get *rsp) { … } /** * rvu_npc_exact_can_disable_feature - Check if feature can be disabled. * @rvu: resource virtualization unit. * Return: True if exact match feature is supported. */ bool rvu_npc_exact_can_disable_feature(struct rvu *rvu) { … } /** * rvu_npc_exact_disable_feature - Disable feature. * @rvu: resource virtualization unit. */ void rvu_npc_exact_disable_feature(struct rvu *rvu) { … } /** * rvu_npc_exact_reset - Delete and free all entry which match pcifunc. * @rvu: resource virtualization unit. * @pcifunc: PCI func to match. */ void rvu_npc_exact_reset(struct rvu *rvu, u16 pcifunc) { … } /** * rvu_npc_exact_init - initialize exact match table * @rvu: resource virtualization unit. * * Initialize HW and SW resources to manage 4way-2K table and fully * associative 32-entry mcam table. * Return: 0 upon success. */ int rvu_npc_exact_init(struct rvu *rvu) { … }