1a588e458SMichael Chan /* Broadcom NetXtreme-C/E network driver. 2a588e458SMichael Chan * 3ec86f14eSMichael Chan * Copyright (c) 2016-2018 Broadcom Limited 4a588e458SMichael Chan * 5a588e458SMichael Chan * This program is free software; you can redistribute it and/or modify 6a588e458SMichael Chan * it under the terms of the GNU General Public License as published by 7a588e458SMichael Chan * the Free Software Foundation. 8a588e458SMichael Chan */ 9a588e458SMichael Chan 10a588e458SMichael Chan #ifndef BNXT_ULP_H 11a588e458SMichael Chan #define BNXT_ULP_H 12a588e458SMichael Chan 13a588e458SMichael Chan #define BNXT_ROCE_ULP 0 14*d2692877SLeon Romanovsky #define BNXT_MAX_ULP 1 15a588e458SMichael Chan 16a588e458SMichael Chan #define BNXT_MIN_ROCE_CP_RINGS 2 17a588e458SMichael Chan #define BNXT_MIN_ROCE_STAT_CTXS 1 18a588e458SMichael Chan 19a588e458SMichael Chan struct hwrm_async_event_cmpl; 20a588e458SMichael Chan struct bnxt; 21a588e458SMichael Chan 22ec86f14eSMichael Chan struct bnxt_msix_entry { 23ec86f14eSMichael Chan u32 vector; 24ec86f14eSMichael Chan u32 ring_idx; 25ec86f14eSMichael Chan u32 db_offset; 26ec86f14eSMichael Chan }; 27ec86f14eSMichael Chan 28a588e458SMichael Chan struct bnxt_ulp_ops { 29a588e458SMichael Chan /* async_notifier() cannot sleep (in BH context) */ 30a588e458SMichael Chan void (*ulp_async_notifier)(void *, struct hwrm_async_event_cmpl *); 31a588e458SMichael Chan void (*ulp_stop)(void *); 32a588e458SMichael Chan void (*ulp_start)(void *); 33a588e458SMichael Chan void (*ulp_sriov_config)(void *, int); 340efd2fc6SMichael Chan void (*ulp_shutdown)(void *); 35ec86f14eSMichael Chan void (*ulp_irq_stop)(void *); 36ec86f14eSMichael Chan void (*ulp_irq_restart)(void *, struct bnxt_msix_entry *); 37a588e458SMichael Chan }; 38a588e458SMichael Chan 39a588e458SMichael Chan struct bnxt_fw_msg { 40a588e458SMichael Chan void *msg; 41a588e458SMichael Chan int msg_len; 42a588e458SMichael Chan void *resp; 43a588e458SMichael Chan int resp_max_len; 44a588e458SMichael Chan int timeout; 45a588e458SMichael Chan }; 46a588e458SMichael Chan 47a588e458SMichael Chan struct bnxt_ulp { 48a588e458SMichael Chan void *handle; 49a588e458SMichael Chan struct bnxt_ulp_ops __rcu *ulp_ops; 50a588e458SMichael Chan unsigned long *async_events_bmap; 51a588e458SMichael Chan u16 max_async_event_id; 52a588e458SMichael Chan u16 msix_requested; 5308654eb2SMichael Chan u16 msix_base; 54a588e458SMichael Chan atomic_t ref_count; 55a588e458SMichael Chan }; 56a588e458SMichael Chan 57a588e458SMichael Chan struct bnxt_en_dev { 58a588e458SMichael Chan struct net_device *net; 59a588e458SMichael Chan struct pci_dev *pdev; 60a588e458SMichael Chan u32 flags; 61a588e458SMichael Chan #define BNXT_EN_FLAG_ROCEV1_CAP 0x1 62a588e458SMichael Chan #define BNXT_EN_FLAG_ROCEV2_CAP 0x2 63a588e458SMichael Chan #define BNXT_EN_FLAG_ROCE_CAP (BNXT_EN_FLAG_ROCEV1_CAP | \ 64a588e458SMichael Chan BNXT_EN_FLAG_ROCEV2_CAP) 65ec86f14eSMichael Chan #define BNXT_EN_FLAG_MSIX_REQUESTED 0x4 66aa46dfffSVasundhara Volam #define BNXT_EN_FLAG_ULP_STOPPED 0x8 67a588e458SMichael Chan const struct bnxt_en_ops *en_ops; 68a588e458SMichael Chan struct bnxt_ulp ulp_tbl[BNXT_MAX_ULP]; 69098286ffSMichael Chan int l2_db_size; /* Doorbell BAR size in 70098286ffSMichael Chan * bytes mapped by L2 71098286ffSMichael Chan * driver. 72098286ffSMichael Chan */ 73098286ffSMichael Chan int l2_db_size_nc; /* Doorbell BAR size in 74098286ffSMichael Chan * bytes mapped as non- 75098286ffSMichael Chan * cacheable. 76098286ffSMichael Chan */ 77a588e458SMichael Chan }; 78a588e458SMichael Chan 79a588e458SMichael Chan struct bnxt_en_ops { 80a588e458SMichael Chan int (*bnxt_register_device)(struct bnxt_en_dev *, int, 81a588e458SMichael Chan struct bnxt_ulp_ops *, void *); 82a588e458SMichael Chan int (*bnxt_unregister_device)(struct bnxt_en_dev *, int); 83a588e458SMichael Chan int (*bnxt_request_msix)(struct bnxt_en_dev *, int, 84a588e458SMichael Chan struct bnxt_msix_entry *, int); 85a588e458SMichael Chan int (*bnxt_free_msix)(struct bnxt_en_dev *, int); 86a588e458SMichael Chan int (*bnxt_send_fw_msg)(struct bnxt_en_dev *, int, 87a588e458SMichael Chan struct bnxt_fw_msg *); 88a588e458SMichael Chan int (*bnxt_register_fw_async_events)(struct bnxt_en_dev *, int, 89a588e458SMichael Chan unsigned long *, u16); 90a588e458SMichael Chan }; 91a588e458SMichael Chan 92a588e458SMichael Chan static inline bool bnxt_ulp_registered(struct bnxt_en_dev *edev, int ulp_id) 93a588e458SMichael Chan { 94a588e458SMichael Chan if (edev && rcu_access_pointer(edev->ulp_tbl[ulp_id].ulp_ops)) 95a588e458SMichael Chan return true; 96a588e458SMichael Chan return false; 97a588e458SMichael Chan } 98a588e458SMichael Chan 9908654eb2SMichael Chan int bnxt_get_ulp_msix_num(struct bnxt *bp); 10008654eb2SMichael Chan int bnxt_get_ulp_msix_base(struct bnxt *bp); 101c027c6b4SVasundhara Volam int bnxt_get_ulp_stat_ctxs(struct bnxt *bp); 102a588e458SMichael Chan void bnxt_ulp_stop(struct bnxt *bp); 103aa46dfffSVasundhara Volam void bnxt_ulp_start(struct bnxt *bp, int err); 104a588e458SMichael Chan void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs); 1050efd2fc6SMichael Chan void bnxt_ulp_shutdown(struct bnxt *bp); 106ec86f14eSMichael Chan void bnxt_ulp_irq_stop(struct bnxt *bp); 107ec86f14eSMichael Chan void bnxt_ulp_irq_restart(struct bnxt *bp, int err); 108a588e458SMichael Chan void bnxt_ulp_async_events(struct bnxt *bp, struct hwrm_async_event_cmpl *cmpl); 109a588e458SMichael Chan struct bnxt_en_dev *bnxt_ulp_probe(struct net_device *dev); 110a588e458SMichael Chan 111a588e458SMichael Chan #endif 112