2026-01-29 22:25:33 +08:00

124 lines
2.9 KiB
C

/* SPDX-License-Identifier: GPL-2.0*/
/* Huawei HiNIC PCI Express Linux driver
* Copyright(c) 2017 Huawei Technologies Co., Ltd
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
*/
#ifndef HINIC_HWIF_H
#define HINIC_HWIF_H
#include "hinic_hwdev.h"
#define HINIC_WAIT_DOORBELL_AND_OUTBOUND_TIMEOUT 60000
struct hinic_free_db_area {
u32 db_idx[HINIC_DB_MAX_AREAS];
u32 num_free;
u32 alloc_pos;
u32 return_pos;
/* spinlock for allocating doorbell area */
spinlock_t idx_lock;
};
struct hinic_func_attr {
u16 func_global_idx;
u8 port_to_port_idx;
u8 pci_intf_idx;
u8 vf_in_pf;
enum func_type func_type;
u8 mpf_idx;
u8 ppf_idx;
u16 num_irqs; /* max: 2 ^ 15 */
u8 num_aeqs; /* max: 2 ^ 3 */
u8 num_ceqs; /* max: 2 ^ 7 */
u8 num_dma_attr; /* max: 2 ^ 6 */
u16 global_vf_id_of_pf;
};
struct hinic_hwif {
u8 __iomem *cfg_regs_base;
u8 __iomem *intr_regs_base;
u64 db_base_phy;
u8 __iomem *db_base;
#if defined(__aarch64__)
void __iomem *dwqe_mapping;
#else
struct io_mapping *dwqe_mapping;
#endif
struct hinic_free_db_area free_db_area;
struct hinic_func_attr attr;
void *pdev;
enum hinic_chip_mode chip_mode;
u32 db_size;
};
struct hinic_dma_addr_align {
u32 real_size;
void *ori_vaddr;
dma_addr_t ori_paddr;
void *align_vaddr;
dma_addr_t align_paddr;
};
u32 hinic_hwif_read_reg(struct hinic_hwif *hwif, u32 reg);
void hinic_hwif_write_reg(struct hinic_hwif *hwif, u32 reg, u32 val);
void hinic_set_pf_status(struct hinic_hwif *hwif, enum hinic_pf_status status);
enum hinic_pf_status hinic_get_pf_status(struct hinic_hwif *hwif);
enum hinic_doorbell_ctrl
hinic_get_doorbell_ctrl_status(struct hinic_hwif *hwif);
enum hinic_outbound_ctrl
hinic_get_outbound_ctrl_status(struct hinic_hwif *hwif);
void hinic_enable_doorbell(struct hinic_hwif *hwif);
void hinic_disable_doorbell(struct hinic_hwif *hwif);
void hinic_enable_outbound(struct hinic_hwif *hwif);
void hinic_disable_outbound(struct hinic_hwif *hwif);
int hinic_init_hwif(struct hinic_hwdev *hwdev, void *cfg_reg_base,
void *intr_reg_base, u64 db_base_phy,
void *db_base, void *dwqe_mapping);
void hinic_free_hwif(struct hinic_hwdev *hwdev);
int wait_until_doorbell_flush_states(struct hinic_hwif *hwif,
enum hinic_doorbell_ctrl states);
int hinic_dma_alloc_coherent_align(void *dev_hdl, u64 size, u64 align,
unsigned int flag,
struct hinic_dma_addr_align *mem_align);
void hinic_dma_free_coherent_align(void *dev_hdl,
struct hinic_dma_addr_align *mem_align);
#endif