Commit 41edd9ef authored by Fengyan Mu's avatar Fengyan Mu Committed by Fengyan
Browse files

UNIC: Support UDMA client management

driver inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I850RQ


CVE: NA

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

Add UDMA client instance to hns3, managing UDMA client in hns3, including
struct and interface functions.

This patch creates new files to host the function interfaces of the UB.

Signed-off-by: default avatarFengyan Mu <mufengyan@hisilicon.com>
Signed-off-by: default avatarJunxin Chen <chenjunxin1@huawei.com>
parent 2922b071
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -21,12 +21,14 @@ hns3-$(CONFIG_HNS3_UBL) += hns3_unic.o
obj-$(CONFIG_HNS3_HCLGEVF) += hclgevf.o

hclgevf-objs = hns3vf/hclgevf_main.o hns3vf/hclgevf_mbx.o  hns3vf/hclgevf_devlink.o hns3vf/hclgevf_regs.o \
		hns3_common/hclge_comm_cmd.o hns3_common/hclge_comm_rss.o hns3_common/hclge_comm_tqp_stats.o
		hns3_common/hclge_comm_cmd.o hns3_common/hclge_comm_rss.o hns3_common/hclge_comm_tqp_stats.o \
		hns3vf/hclgevf_udma.o

obj-$(CONFIG_HNS3_HCLGE) += hclge.o
hclge-objs = hns3pf/hclge_main.o hns3pf/hclge_mdio.o hns3pf/hclge_tm.o hns3pf/hclge_sysfs.o hns3pf/hclge_regs.o \
		hns3pf/hclge_mbx.o hns3pf/hclge_err.o  hns3pf/hclge_debugfs.o hns3pf/hclge_ptp.o hns3pf/hclge_devlink.o \
		hns3_common/hclge_comm_cmd.o hns3_common/hclge_comm_rss.o hns3_common/hclge_comm_tqp_stats.o
		hns3_common/hclge_comm_cmd.o hns3_common/hclge_comm_rss.o hns3_common/hclge_comm_tqp_stats.o \
		hns3pf/hclge_udma.o
hclge-objs += hns3pf/hclge_ext.o

hclge-$(CONFIG_HNS3_DCB) += hns3pf/hclge_dcb.o
+9 −1
Original line number Diff line number Diff line
@@ -41,7 +41,8 @@ static bool hnae3_client_match(enum hnae3_client_type client_type)
{
	if (client_type == HNAE3_CLIENT_KNIC ||
	    client_type == HNAE3_CLIENT_ROCE ||
	    client_type == HNAE3_CLIENT_ROH)
	    client_type == HNAE3_CLIENT_ROH ||
	    client_type == HNAE3_CLIENT_UDMA)
		return true;

	return false;
@@ -64,6 +65,9 @@ void hnae3_set_client_init_flag(struct hnae3_client *client,
	case HNAE3_CLIENT_ROH:
		hnae3_set_bit(ae_dev->flag, HNAE3_ROH_CLIENT_INITED_B, inited);
		break;
	case HNAE3_CLIENT_UDMA:
		hnae3_set_bit(ae_dev->flag, HNAE3_UDMA_CLIENT_INITED_B, inited);
		break;
	default:
		break;
	}
@@ -88,6 +92,10 @@ static int hnae3_get_client_init_flag(struct hnae3_client *client,
		inited = hnae3_get_bit(ae_dev->flag,
				       HNAE3_ROH_CLIENT_INITED_B);
		break;
	case HNAE3_CLIENT_UDMA:
		inited = hnae3_get_bit(ae_dev->flag,
				       HNAE3_UDMA_CLIENT_INITED_B);
		break;
	default:
		break;
	}
+14 −0
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@
#define HNAE3_UNIC_CLIENT_INITED_B		0x4
#define HNAE3_ROCE_CLIENT_INITED_B		0x5
#define HNAE3_ROH_CLIENT_INITED_B		0x6
#define HNAE3_UDMA_CLIENT_INITED_B		0x7
#define HNAE3_DEV_SUPPORT_UDMA_B		0x8
#define HNAE3_DEV_SUPPORT_UBL_B			0x9

@@ -251,6 +252,7 @@ enum hnae3_client_type {
	HNAE3_CLIENT_KNIC,
	HNAE3_CLIENT_ROCE,
	HNAE3_CLIENT_ROH,
	HNAE3_CLIENT_UDMA,
};

enum hnae3_mac_type {
@@ -912,6 +914,17 @@ struct hnae3_roh_private_info {
	unsigned long reset_state;
};

struct hnae3_udma_private_info {
	struct net_device *netdev;
	void __iomem *udma_io_base;
	void __iomem *udma_mem_base;
	int base_vector;
	int num_vectors;
	unsigned long reset_state;
	unsigned long instance_state;
	unsigned long state;
};

#define HNAE3_SUPPORT_APP_LOOPBACK    BIT(0)
#define HNAE3_SUPPORT_PHY_LOOPBACK    BIT(1)
#define HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK	BIT(2)
@@ -946,6 +959,7 @@ struct hnae3_handle {
		struct hnae3_knic_private_info kinfo;
		struct hnae3_roce_private_info rinfo;
		struct hnae3_roh_private_info rohinfo;
		struct hnae3_udma_private_info udmainfo;
	};

	u32 numa_node_mask;	/* for multi-chip support */
+65 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include "hnae3.h"
#include "hclge_devlink.h"
#include "hclge_comm_cmd.h"
#include "hclge_udma.h"

#define HCLGE_NAME			"hclge"

@@ -791,6 +792,7 @@ static int hclge_query_function_status(struct hclge_dev *hdev)

static int hclge_query_pf_resource(struct hclge_dev *hdev)
{
	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
	struct hclge_pf_res_cmd *req;
	struct hclge_desc desc;
	int ret;
@@ -843,6 +845,11 @@ static int hclge_query_pf_resource(struct hclge_dev *hdev)
		 */
		hdev->num_msi = hdev->num_nic_msi + hdev->num_roce_msi +
				hdev->num_roh_msi;
	} else if (hnae3_dev_udma_supported(ae_dev)) {
		hdev->num_udma_msi =
			le16_to_cpu(req->pf_intr_vector_number_roce);

		hdev->num_msi = hdev->num_nic_msi + hdev->num_udma_msi;
	} else {
		hdev->num_msi = hdev->num_nic_msi;
	}
@@ -2938,8 +2945,10 @@ static void hclge_push_link_status(struct hclge_dev *hdev)
static void hclge_update_link_status(struct hclge_dev *hdev)
{
	struct hnae3_handle *rhandle = &hdev->vport[0].roce;
	struct hnae3_handle *uhandle = &hdev->vport[0].udma;
	struct hnae3_handle *handle = &hdev->vport[0].nic;
	struct hnae3_client *rclient = hdev->roce_client;
	struct hnae3_client *uclient = hdev->udma_client;
	struct hnae3_client *client = hdev->nic_client;
	int state;
	int ret;
@@ -2962,6 +2971,8 @@ static void hclge_update_link_status(struct hclge_dev *hdev)
		hclge_config_mac_tnl_int(hdev, state);
		if (rclient && rclient->ops->link_status_change)
			rclient->ops->link_status_change(rhandle, state);
		if (uclient && uclient->ops->link_status_change)
			uclient->ops->link_status_change(uhandle, state);

		hclge_push_link_status(hdev);
	}
@@ -4206,6 +4217,10 @@ static int hclge_reset_prepare(struct hclge_dev *hdev)
	if (ret)
		return ret;

	ret = hclge_notify_udma_client(hdev, HNAE3_DOWN_CLIENT);
	if (ret)
		return ret;

	rtnl_lock();
	ret = hclge_notify_client(hdev, HNAE3_DOWN_CLIENT);
	rtnl_unlock();
@@ -4230,6 +4245,10 @@ static int hclge_reset_rebuild(struct hclge_dev *hdev)
	if (ret)
		return ret;

	ret = hclge_notify_udma_client(hdev, HNAE3_UNINIT_CLIENT);
	if (ret)
		return ret;

	rtnl_lock();
	ret = hclge_reset_stack(hdev);
	rtnl_unlock();
@@ -4254,6 +4273,14 @@ static int hclge_reset_rebuild(struct hclge_dev *hdev)
	    hdev->rst_stats.reset_fail_cnt < HCLGE_RESET_MAX_FAIL_CNT - 1)
		return ret;

	ret = hclge_notify_udma_client(hdev, HNAE3_INIT_CLIENT);
	/* ignore udma notify error if it fails HCLGE_RESET_MAX_FAIL_CNT - 1
	 * times
	 */
	if (ret &&
	    hdev->rst_stats.reset_fail_cnt < HCLGE_RESET_MAX_FAIL_CNT - 1)
		return ret;

	ret = hclge_reset_prepare_up(hdev);
	if (ret)
		return ret;
@@ -4272,6 +4299,10 @@ static int hclge_reset_rebuild(struct hclge_dev *hdev)
	if (ret)
		return ret;

	ret = hclge_notify_udma_client(hdev, HNAE3_UP_CLIENT);
	if (ret)
		return ret;

	hdev->last_reset_time = jiffies;
	hdev->rst_stats.reset_fail_cnt = 0;
	hdev->rst_stats.reset_done_cnt++;
@@ -4781,6 +4812,8 @@ struct hclge_vport *hclge_get_vport(struct hnae3_handle *handle)
		return container_of(handle, struct hclge_vport, roce);
	else if (handle->client->type == HNAE3_CLIENT_ROH)
		return container_of(handle, struct hclge_vport, roh);
	else if (handle->client->type == HNAE3_CLIENT_UDMA)
		return container_of(handle, struct hclge_vport, udma);
	else
		return container_of(handle, struct hclge_vport, nic);
}
@@ -11703,6 +11736,10 @@ static int hclge_init_client_instance(struct hnae3_client *client,
		if (ret)
			goto clear_roce;

		ret = hclge_init_udma_client_instance(ae_dev, vport);
		if (ret)
			goto clear_udma;

		break;
	case HNAE3_CLIENT_ROCE:
		if (hnae3_dev_roce_supported(hdev)) {
@@ -11723,6 +11760,17 @@ static int hclge_init_client_instance(struct hnae3_client *client,
		if (ret)
			goto clear_roh;

		break;
	case HNAE3_CLIENT_UDMA:
		if (hnae3_dev_udma_supported(ae_dev)) {
			hdev->udma_client = client;
			vport->udma.client = client;
		}

		ret = hclge_init_udma_client_instance(ae_dev, vport);
		if (ret)
			goto clear_udma;

		break;
	default:
		return -EINVAL;
@@ -11742,6 +11790,10 @@ static int hclge_init_client_instance(struct hnae3_client *client,
	hdev->roh_client = NULL;
	vport->roh.client = NULL;
	return ret;
clear_udma:
	hdev->udma_client = NULL;
	vport->udma.client = NULL;
	return ret;
}

static void hclge_uninit_client_instance(struct hnae3_client *client,
@@ -11750,6 +11802,19 @@ static void hclge_uninit_client_instance(struct hnae3_client *client,
	struct hclge_dev *hdev = ae_dev->priv;
	struct hclge_vport *vport = &hdev->vport[0];

	if (hdev->udma_client && (client->type == HNAE3_CLIENT_UDMA ||
				  client->type == HNAE3_CLIENT_KNIC)) {
		clear_bit(HCLGE_STATE_UDMA_REGISTERED, &hdev->state);
		while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
			msleep(HCLGE_WAIT_RESET_DONE);

		hdev->udma_client->ops->uninit_instance(&vport->udma, 0);
		hdev->udma_client = NULL;
		vport->udma.client = NULL;
	}
	if (client->type == HNAE3_CLIENT_UDMA)
		return;

	if (hdev->roh_client && (client->type == HNAE3_CLIENT_ROH ||
				 client->type == HNAE3_CLIENT_KNIC)) {
		clear_bit(HCLGE_STATE_ROH_REGISTERED, &hdev->state);
+4 −0
Original line number Diff line number Diff line
@@ -205,6 +205,7 @@ enum HCLGE_DEV_STATE {
	HCLGE_STATE_NIC_REGISTERED,
	HCLGE_STATE_ROCE_REGISTERED,
	HCLGE_STATE_ROH_REGISTERED,
	HCLGE_STATE_UDMA_REGISTERED,
	HCLGE_STATE_SERVICE_INITED,
	HCLGE_STATE_RST_SERVICE_SCHED,
	HCLGE_STATE_RST_HANDLING,
@@ -889,6 +890,7 @@ struct hclge_dev {
	u16 num_nic_msi;	/* Num of nic vectors for this PF */
	u16 num_roce_msi;	/* Num of roce vectors for this PF */
	u16 num_roh_msi;	/* Num of roh vectors for this PF */
	u16 num_udma_msi;	/* Num of udma vectors for this PF */

	unsigned long service_timer_period;
	unsigned long service_timer_previous;
@@ -906,6 +908,7 @@ struct hclge_dev {
	struct hnae3_client *nic_client;
	struct hnae3_client *roce_client;
	struct hnae3_client *roh_client;
	struct hnae3_client *udma_client;

#define HCLGE_FLAG_MAIN			BIT(0)
#define HCLGE_FLAG_DCB_CAPABLE		BIT(1)
@@ -1045,6 +1048,7 @@ struct hclge_vport {
	struct hnae3_handle nic;
	struct hnae3_handle roce;
	struct hnae3_handle roh;
	struct hnae3_handle udma;

	unsigned long state;
	unsigned long need_notify;
Loading