linux-loongson/include/linux/net/intel/iidc_rdma_idpf.h
Joshua Hay 6aa53e861c idpf: implement get LAN MMIO memory regions
The RDMA driver needs to map its own MMIO regions for the sake of
performance, meaning the IDPF needs to avoid mapping portions of the BAR
space. However, to be HW agnostic, the IDPF cannot assume where
these are and must avoid mapping hard coded regions as much as possible.

The IDPF maps the bare minimum to load and communicate with the
control plane, i.e., the mailbox registers and the reset state
registers. Because of how and when mailbox register offsets are
initialized, it is easier to adjust the existing defines to be relative
to the mailbox region starting address. Use a specific mailbox register
write function that uses these relative offsets. The reset state
register addresses are calculated the same way as for other registers,
described below.

The IDPF then calls a new virtchnl op to fetch a list of MMIO regions
that it should map. The addresses for the registers in these regions are
calculated by determining what region the register resides in, adjusting
the offset to be relative to that region, and then adding the
register's offset to that region's mapped address.

If the new virtchnl op is not supported, the IDPF will fallback to
mapping the whole bar. However, it will still map them as separate
regions outside the mailbox and reset state registers. This way we can
use the same logic in both cases to access the MMIO space.

Reviewed-by: Madhu Chittim <madhu.chittim@intel.com>
Signed-off-by: Joshua Hay <joshua.a.hay@intel.com>
Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
2025-07-14 10:57:51 -07:00

56 lines
1.5 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (C) 2025 Intel Corporation. */
#ifndef _IIDC_RDMA_IDPF_H_
#define _IIDC_RDMA_IDPF_H_
#include <linux/auxiliary_bus.h>
/* struct to be populated by core LAN PCI driver */
struct iidc_rdma_vport_dev_info {
struct auxiliary_device *adev;
struct auxiliary_device *core_adev;
struct net_device *netdev;
u16 vport_id;
};
struct iidc_rdma_vport_auxiliary_dev {
struct auxiliary_device adev;
struct iidc_rdma_vport_dev_info *vdev_info;
};
struct iidc_rdma_vport_auxiliary_drv {
struct auxiliary_driver adrv;
void (*event_handler)(struct iidc_rdma_vport_dev_info *vdev,
struct iidc_rdma_event *event);
};
/* struct to be populated by core LAN PCI driver */
enum iidc_function_type {
IIDC_FUNCTION_TYPE_PF,
IIDC_FUNCTION_TYPE_VF,
};
struct iidc_rdma_lan_mapped_mem_region {
u8 __iomem *region_addr;
__le64 size;
__le64 start_offset;
};
struct iidc_rdma_priv_dev_info {
struct msix_entry *msix_entries;
u16 msix_count; /* How many vectors are reserved for this device */
enum iidc_function_type ftype;
__le16 num_memory_regions;
struct iidc_rdma_lan_mapped_mem_region *mapped_mem_regions;
};
int idpf_idc_vport_dev_ctrl(struct iidc_rdma_core_dev_info *cdev_info, bool up);
int idpf_idc_request_reset(struct iidc_rdma_core_dev_info *cdev_info,
enum iidc_rdma_reset_type __always_unused reset_type);
int idpf_idc_rdma_vc_send_sync(struct iidc_rdma_core_dev_info *cdev_info,
u8 *send_msg, u16 msg_size,
u8 *recv_msg, u16 *recv_len);
#endif /* _IIDC_RDMA_IDPF_H_ */