Commit 0229f417 authored by Yanling Song's avatar Yanling Song Committed by Zheng Zengkai
Browse files

net:spnic:Support to configure DMA atrribute thru firmware.

Ramaxel inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I4J0GH


CVE: NA

-----------------------------------------------

Support to configure DMA attribute thru firmware

Signed-off-by: default avatarYanling Song <songyl@ramaxel.com>
Reviewed-by: default avatarXu <Yun&lt;xuyun@ramaxel.com>
Acked-by: default avatarXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent f312cd00
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -135,7 +135,7 @@ struct comm_cmd_msix_config {
	u8 rsvd2[5];
};

struct comm_cmd_dma_attr {
struct comm_cmd_dma_attr_config {
	struct mgmt_msg_head head;

	u16 func_id;
+27 −0
Original line number Diff line number Diff line
@@ -403,6 +403,33 @@ int sphw_set_ceq_ctrl_reg(struct sphw_hwdev *hwdev, u16 q_id, u32 ctrl0, u32 ctr
	return 0;
}

int sphw_set_dma_attr_tbl(struct sphw_hwdev *hwdev, u8 entry_idx, u8 st, u8 at, u8 ph,
			  u8 no_snooping, u8 tph_en)
{
	struct comm_cmd_dma_attr_config dma_attr;
	u16 out_size = sizeof(dma_attr);
	int err;

	memset(&dma_attr, 0, sizeof(dma_attr));
	dma_attr.func_id = sphw_global_func_id(hwdev);
	dma_attr.entry_idx = entry_idx;
	dma_attr.st = st;
	dma_attr.at = at;
	dma_attr.ph = ph;
	dma_attr.no_snooping = no_snooping;
	dma_attr.tph_en = tph_en;

	err = comm_msg_to_mgmt_sync(hwdev, COMM_MGMT_CMD_SET_DMA_ATTR, &dma_attr, sizeof(dma_attr),
				    &dma_attr, &out_size);
	if (err || !out_size || dma_attr.head.status) {
		sdk_err(hwdev->dev_hdl, "Failed to set dma_attr, err: %d, status: 0x%x, out_size: 0x%x\n",
			err, dma_attr.head.status, out_size);
		return -EIO;
	}

	return 0;
}

int sphw_set_bdf_ctxt(void *hwdev, u8 bus, u8 device, u8 function)
{
	struct comm_cmd_bdf_info bdf_info;
+3 −0
Original line number Diff line number Diff line
@@ -34,6 +34,9 @@ int sphw_ppf_ext_db_deinit(void *dev);

int sphw_set_ceq_ctrl_reg(struct sphw_hwdev *hwdev, u16 q_id, u32 ctrl0, u32 ctrl1);

int sphw_set_dma_attr_tbl(struct sphw_hwdev *hwdevm, u8 entry_idx, u8 st, u8 at, u8 ph,
			  u8 no_snooping, u8 tph_en);

int sphw_get_comm_features(void *hwdev, u64 *s_feature, u16 size);
int sphw_set_comm_features(void *hwdev, u64 *s_feature, u16 size);

+15 −67
Original line number Diff line number Diff line
@@ -366,89 +366,37 @@ void sphw_detect_hw_present(void *hwdev)
}

/**
 * set_pf_dma_attr_entry - set the dma attributes for entry
 * @hwif: the hardware interface of a pci function device
 * @entry_idx: the entry index in the dma table
 * @st: PCIE TLP steering tag
 * @at:	PCIE TLP AT field
 * @ph: PCIE TLP Processing Hint field
 * @no_snooping: PCIE TLP No snooping
 * @tph_en: PCIE TLP Processing Hint Enable
 * dma_attr_table_init - initialize the default dma attributes
 * @hwdev: the pointer to hw device
 **/
static void set_pf_dma_attr_entry(struct sphw_hwdev *hwdev, u32 entry_idx,
				  u8 st, u8 at, u8 ph,
				  enum sphw_pcie_nosnoop no_snooping,
				  enum sphw_pcie_tph tph_en)
static int dma_attr_table_init(struct sphw_hwdev *hwdev)
{
	u32 addr, val, dma_attr_entry;
	u32 addr, val, dst_attr;

	/* Use indirect access should set entry_idx first*/
	addr = SPHW_CSR_DMA_ATTR_INDIR_IDX_ADDR;
	val = sphw_hwif_read_reg(hwdev->hwif, addr);
	val = SPHW_DMA_ATTR_INDIR_IDX_CLEAR(val, IDX);

	entry_idx = SPHW_DMA_ATTR_INDIR_IDX_SET(entry_idx, IDX);

	val |= entry_idx;
	val |= SPHW_DMA_ATTR_INDIR_IDX_SET(PCIE_MSIX_ATTR_ENTRY, IDX);

	sphw_hwif_write_reg(hwdev->hwif, addr, val);

	wmb(); /* write index before config */

	addr = SPHW_CSR_DMA_ATTR_TBL_ADDR;

	val = sphw_hwif_read_reg(hwdev->hwif, addr);
	val = SPHW_DMA_ATTR_ENTRY_CLEAR(val, ST)	&
		SPHW_DMA_ATTR_ENTRY_CLEAR(val, AT)	&
		SPHW_DMA_ATTR_ENTRY_CLEAR(val, PH)	&
		SPHW_DMA_ATTR_ENTRY_CLEAR(val, NO_SNOOPING)	&
		SPHW_DMA_ATTR_ENTRY_CLEAR(val, TPH_EN);

	dma_attr_entry = SPHW_DMA_ATTR_ENTRY_SET(st, ST)	|
			 SPHW_DMA_ATTR_ENTRY_SET(at, AT)	|
			 SPHW_DMA_ATTR_ENTRY_SET(ph, PH)	|
			 SPHW_DMA_ATTR_ENTRY_SET(no_snooping, NO_SNOOPING) |
			 SPHW_DMA_ATTR_ENTRY_SET(tph_en, TPH_EN);

	val |= dma_attr_entry;
	sphw_hwif_write_reg(hwdev->hwif, addr, val);
}

static int set_vf_dma_attr_entry(struct sphw_hwdev *hwdev, u8 entry_idx,
				 u8 st, u8 at, u8 ph,
				enum sphw_pcie_nosnoop no_snooping,
				enum sphw_pcie_tph tph_en)
{
	/* SPHW_MGMT_CMD_DMA_ATTR_SET */
	/*to do vf set dma attr by mpu*/
	dst_attr = SPHW_DMA_ATTR_ENTRY_SET(SPHW_PCIE_ST_DISABLE, ST)	|
		SPHW_DMA_ATTR_ENTRY_SET(SPHW_PCIE_AT_DISABLE, AT)	|
		SPHW_DMA_ATTR_ENTRY_SET(SPHW_PCIE_PH_DISABLE, PH)	|
		SPHW_DMA_ATTR_ENTRY_SET(SPHW_PCIE_SNOOP, NO_SNOOPING)	|
		SPHW_DMA_ATTR_ENTRY_SET(SPHW_PCIE_TPH_DISABLE, TPH_EN);
	if (dst_attr == val)
		return 0;
}

/**
 * dma_attr_table_init - initialize the default dma attributes
 * @hwif: the hardware interface of a pci function device
 **/
static int dma_attr_table_init(struct sphw_hwdev *hwdev)
{
	int err = 0;

	/* TODO: check if set pf dma attr through uP, the same as vf */
	if (SPHW_IS_VF(hwdev))
		err = set_vf_dma_attr_entry(hwdev, PCIE_MSIX_ATTR_ENTRY,
					    SPHW_PCIE_ST_DISABLE,
					    SPHW_PCIE_AT_DISABLE,
					    SPHW_PCIE_PH_DISABLE,
					    SPHW_PCIE_SNOOP,
					    SPHW_PCIE_TPH_DISABLE);
	else
		set_pf_dma_attr_entry(hwdev, PCIE_MSIX_ATTR_ENTRY,
				      SPHW_PCIE_ST_DISABLE,
				      SPHW_PCIE_AT_DISABLE,
				      SPHW_PCIE_PH_DISABLE,
				      SPHW_PCIE_SNOOP,
				      SPHW_PCIE_TPH_DISABLE);

	return err;
	return sphw_set_dma_attr_tbl(hwdev, PCIE_MSIX_ATTR_ENTRY, SPHW_PCIE_ST_DISABLE,
				     SPHW_PCIE_AT_DISABLE, SPHW_PCIE_PH_DISABLE,
				     SPHW_PCIE_SNOOP, SPHW_PCIE_TPH_DISABLE);
}

static int init_aeqs_msix_attr(struct sphw_hwdev *hwdev)