162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* Copyright 2014 Cisco Systems, Inc. All rights reserved. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef _VNIC_DEV_H_ 562306a36Sopenharmony_ci#define _VNIC_DEV_H_ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include "vnic_resource.h" 862306a36Sopenharmony_ci#include "vnic_devcmd.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef VNIC_PADDR_TARGET 1162306a36Sopenharmony_ci#define VNIC_PADDR_TARGET 0x0000000000000000ULL 1262306a36Sopenharmony_ci#endif 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#ifndef readq 1562306a36Sopenharmony_cistatic inline u64 readq(void __iomem *reg) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci return ((u64)readl(reg + 0x4UL) << 32) | (u64)readl(reg); 1862306a36Sopenharmony_ci} 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistatic inline void writeq(u64 val, void __iomem *reg) 2162306a36Sopenharmony_ci{ 2262306a36Sopenharmony_ci writel(lower_32_bits(val), reg); 2362306a36Sopenharmony_ci writel(upper_32_bits(val), reg + 0x4UL); 2462306a36Sopenharmony_ci} 2562306a36Sopenharmony_ci#endif 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cienum vnic_dev_intr_mode { 2862306a36Sopenharmony_ci VNIC_DEV_INTR_MODE_UNKNOWN, 2962306a36Sopenharmony_ci VNIC_DEV_INTR_MODE_INTX, 3062306a36Sopenharmony_ci VNIC_DEV_INTR_MODE_MSI, 3162306a36Sopenharmony_ci VNIC_DEV_INTR_MODE_MSIX, 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistruct vnic_dev_bar { 3562306a36Sopenharmony_ci void __iomem *vaddr; 3662306a36Sopenharmony_ci dma_addr_t bus_addr; 3762306a36Sopenharmony_ci unsigned long len; 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct vnic_dev_ring { 4162306a36Sopenharmony_ci void *descs; 4262306a36Sopenharmony_ci size_t size; 4362306a36Sopenharmony_ci dma_addr_t base_addr; 4462306a36Sopenharmony_ci size_t base_align; 4562306a36Sopenharmony_ci void *descs_unaligned; 4662306a36Sopenharmony_ci size_t size_unaligned; 4762306a36Sopenharmony_ci dma_addr_t base_addr_unaligned; 4862306a36Sopenharmony_ci unsigned int desc_size; 4962306a36Sopenharmony_ci unsigned int desc_count; 5062306a36Sopenharmony_ci unsigned int desc_avail; 5162306a36Sopenharmony_ci}; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistruct vnic_dev; 5462306a36Sopenharmony_cistruct vnic_stats; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_civoid *svnic_dev_priv(struct vnic_dev *vdev); 5762306a36Sopenharmony_ciunsigned int svnic_dev_get_res_count(struct vnic_dev *vdev, 5862306a36Sopenharmony_ci enum vnic_res_type type); 5962306a36Sopenharmony_civoid __iomem *svnic_dev_get_res(struct vnic_dev *vdev, enum vnic_res_type type, 6062306a36Sopenharmony_ci unsigned int index); 6162306a36Sopenharmony_ciunsigned int svnic_dev_desc_ring_size(struct vnic_dev_ring *ring, 6262306a36Sopenharmony_ci unsigned int desc_count, 6362306a36Sopenharmony_ci unsigned int desc_size); 6462306a36Sopenharmony_civoid svnic_dev_clear_desc_ring(struct vnic_dev_ring *ring); 6562306a36Sopenharmony_ciint svnic_dev_alloc_desc_ring(struct vnic_dev *vdev, struct vnic_dev_ring *ring, 6662306a36Sopenharmony_ci unsigned int desc_count, unsigned int desc_size); 6762306a36Sopenharmony_civoid svnic_dev_free_desc_ring(struct vnic_dev *vdev, 6862306a36Sopenharmony_ci struct vnic_dev_ring *ring); 6962306a36Sopenharmony_ciint svnic_dev_cmd(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd, 7062306a36Sopenharmony_ci u64 *a0, u64 *a1, int wait); 7162306a36Sopenharmony_ciint svnic_dev_fw_info(struct vnic_dev *vdev, 7262306a36Sopenharmony_ci struct vnic_devcmd_fw_info **fw_info); 7362306a36Sopenharmony_ciint svnic_dev_spec(struct vnic_dev *vdev, unsigned int offset, 7462306a36Sopenharmony_ci unsigned int size, void *value); 7562306a36Sopenharmony_ciint svnic_dev_stats_clear(struct vnic_dev *vdev); 7662306a36Sopenharmony_ciint svnic_dev_stats_dump(struct vnic_dev *vdev, struct vnic_stats **stats); 7762306a36Sopenharmony_ciint svnic_dev_notify_set(struct vnic_dev *vdev, u16 intr); 7862306a36Sopenharmony_civoid svnic_dev_notify_unset(struct vnic_dev *vdev); 7962306a36Sopenharmony_ciint svnic_dev_link_status(struct vnic_dev *vdev); 8062306a36Sopenharmony_ciu32 svnic_dev_link_down_cnt(struct vnic_dev *vdev); 8162306a36Sopenharmony_ciint svnic_dev_close(struct vnic_dev *vdev); 8262306a36Sopenharmony_ciint svnic_dev_enable_wait(struct vnic_dev *vdev); 8362306a36Sopenharmony_ciint svnic_dev_disable(struct vnic_dev *vdev); 8462306a36Sopenharmony_ciint svnic_dev_open(struct vnic_dev *vdev, int arg); 8562306a36Sopenharmony_ciint svnic_dev_open_done(struct vnic_dev *vdev, int *done); 8662306a36Sopenharmony_ciint svnic_dev_init(struct vnic_dev *vdev, int arg); 8762306a36Sopenharmony_cistruct vnic_dev *svnic_dev_alloc_discover(struct vnic_dev *vdev, 8862306a36Sopenharmony_ci void *priv, struct pci_dev *pdev, 8962306a36Sopenharmony_ci struct vnic_dev_bar *bar, 9062306a36Sopenharmony_ci unsigned int num_bars); 9162306a36Sopenharmony_civoid svnic_dev_set_intr_mode(struct vnic_dev *vdev, 9262306a36Sopenharmony_ci enum vnic_dev_intr_mode intr_mode); 9362306a36Sopenharmony_cienum vnic_dev_intr_mode svnic_dev_get_intr_mode(struct vnic_dev *vdev); 9462306a36Sopenharmony_civoid svnic_dev_unregister(struct vnic_dev *vdev); 9562306a36Sopenharmony_ciint svnic_dev_cmd_init(struct vnic_dev *vdev, int fallback); 9662306a36Sopenharmony_ci#endif /* _VNIC_DEV_H_ */ 97