numam-dpdk/drivers/common/cnxk/roc_dev_priv.h
Harman Kalra 02719901d5 common/cnxk: send link status event to VF
Currently link event is only sent to the PF by AF as soon as it comes
up, or in case of any physical change in link. PF will broadcast
these link events to all its VFs as soon as it receives it.
But no event is sent when a new VF comes up, hence it will not have
the link status.
Adding support for sending link status to the VF once it comes up
successfully.

Signed-off-by: Harman Kalra <hkalra@marvell.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
2021-09-16 16:28:51 +02:00

115 lines
2.8 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(C) 2021 Marvell.
*/
#ifndef _ROC_DEV_PRIV_H
#define _ROC_DEV_PRIV_H
#define DEV_HWCAP_F_VF BIT_ULL(0) /* VF device */
#define RVU_PFVF_PF_SHIFT 10
#define RVU_PFVF_PF_MASK 0x3F
#define RVU_PFVF_FUNC_SHIFT 0
#define RVU_PFVF_FUNC_MASK 0x3FF
#define RVU_MAX_VF 64 /* RVU_PF_VFPF_MBOX_INT(0..1) */
#define RVU_MAX_INT_RETRY 3
/* PF/VF message handling timer */
#define VF_PF_MBOX_TIMER_MS (20 * 1000)
typedef struct {
/* 128 devices translate to two 64 bits dwords */
#define MAX_VFPF_DWORD_BITS 2
uint64_t bits[MAX_VFPF_DWORD_BITS];
} dev_intr_t;
/* Link status update callback */
typedef void (*link_info_t)(void *roc_nix,
struct cgx_link_user_info *link);
/* PTP info callback */
typedef int (*ptp_info_t)(void *roc_nix, bool enable);
/* Link status get callback */
typedef void (*link_status_get_t)(void *roc_nix,
struct cgx_link_user_info *link);
struct dev_ops {
link_info_t link_status_update;
ptp_info_t ptp_info_update;
link_status_get_t link_status_get;
};
#define dev_is_vf(dev) ((dev)->hwcap & DEV_HWCAP_F_VF)
static inline int
dev_get_vf(uint16_t pf_func)
{
return (((pf_func >> RVU_PFVF_FUNC_SHIFT) & RVU_PFVF_FUNC_MASK) - 1);
}
static inline int
dev_get_pf(uint16_t pf_func)
{
return (pf_func >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK;
}
static inline int
dev_pf_func(int pf, int vf)
{
return (pf << RVU_PFVF_PF_SHIFT) | ((vf << RVU_PFVF_FUNC_SHIFT) + 1);
}
static inline int
dev_is_afvf(uint16_t pf_func)
{
return !(pf_func & ~RVU_PFVF_FUNC_MASK);
}
struct dev {
uint16_t pf;
int16_t vf;
uint16_t pf_func;
uint8_t mbox_active;
bool drv_inited;
uint64_t active_vfs[MAX_VFPF_DWORD_BITS];
uintptr_t bar2;
uintptr_t bar4;
uintptr_t lmt_base;
struct mbox mbox_local;
struct mbox mbox_up;
struct mbox mbox_vfpf;
struct mbox mbox_vfpf_up;
dev_intr_t intr;
int timer_set; /* ~0 : no alarm handling */
uint64_t hwcap;
struct npa_lf npa;
struct mbox *mbox;
uint16_t maxvf;
struct dev_ops *ops;
void *roc_nix;
void *roc_cpt;
bool disable_shared_lmt; /* false(default): shared lmt mode enabled */
const struct plt_memzone *lmt_mz;
} __plt_cache_aligned;
struct npa {
struct plt_pci_device *pci_dev;
struct dev dev;
} __plt_cache_aligned;
extern uint16_t dev_rclk_freq;
extern uint16_t dev_sclk_freq;
int dev_init(struct dev *dev, struct plt_pci_device *pci_dev);
int dev_fini(struct dev *dev, struct plt_pci_device *pci_dev);
int dev_active_vfs(struct dev *dev);
int dev_irq_register(struct plt_intr_handle *intr_handle,
plt_intr_callback_fn cb, void *data, unsigned int vec);
void dev_irq_unregister(struct plt_intr_handle *intr_handle,
plt_intr_callback_fn cb, void *data, unsigned int vec);
int dev_irqs_disable(struct plt_intr_handle *intr_handle);
#endif /* _ROC_DEV_PRIV_H */