mirror of https://github.com/F-Stack/f-stack.git
115 lines
2.8 KiB
C
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 */
|