aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/ice
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/intel/ice')
-rw-r--r--drivers/net/ethernet/intel/ice/ice.h5
-rw-r--r--drivers/net/ethernet/intel/ice/ice_adminq_cmd.h2
-rw-r--r--drivers/net/ethernet/intel/ice/ice_common.c22
-rw-r--r--drivers/net/ethernet/intel/ice/ice_controlq.c46
-rw-r--r--drivers/net/ethernet/intel/ice/ice_controlq.h2
-rw-r--r--drivers/net/ethernet/intel/ice/ice_hw_autogen.h21
-rw-r--r--drivers/net/ethernet/intel/ice/ice_main.c47
-rw-r--r--drivers/net/ethernet/intel/ice/ice_type.h7
8 files changed, 151 insertions, 1 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
index 0b269c470343..639d45d1da49 100644
--- a/drivers/net/ethernet/intel/ice/ice.h
+++ b/drivers/net/ethernet/intel/ice/ice.h
@@ -46,6 +46,7 @@ extern const char ice_drv_ver[];
46#define ICE_INT_NAME_STR_LEN (IFNAMSIZ + 16) 46#define ICE_INT_NAME_STR_LEN (IFNAMSIZ + 16)
47#define ICE_ETHTOOL_FWVER_LEN 32 47#define ICE_ETHTOOL_FWVER_LEN 32
48#define ICE_AQ_LEN 64 48#define ICE_AQ_LEN 64
49#define ICE_MBXQ_LEN 64
49#define ICE_MIN_MSIX 2 50#define ICE_MIN_MSIX 2
50#define ICE_NO_VSI 0xffff 51#define ICE_NO_VSI 0xffff
51#define ICE_MAX_VSI_ALLOC 130 52#define ICE_MAX_VSI_ALLOC 130
@@ -63,6 +64,7 @@ extern const char ice_drv_ver[];
63#define ICE_RES_MISC_VEC_ID (ICE_RES_VALID_BIT - 1) 64#define ICE_RES_MISC_VEC_ID (ICE_RES_VALID_BIT - 1)
64#define ICE_INVAL_Q_INDEX 0xffff 65#define ICE_INVAL_Q_INDEX 0xffff
65#define ICE_INVAL_VFID 256 66#define ICE_INVAL_VFID 256
67#define ICE_MAX_VF_COUNT 256
66 68
67#define ICE_VSIQF_HKEY_ARRAY_SIZE ((VSIQF_HKEY_MAX_INDEX + 1) * 4) 69#define ICE_VSIQF_HKEY_ARRAY_SIZE ((VSIQF_HKEY_MAX_INDEX + 1) * 4)
68 70
@@ -134,6 +136,7 @@ enum ice_state {
134 __ICE_SUSPENDED, /* set on module remove path */ 136 __ICE_SUSPENDED, /* set on module remove path */
135 __ICE_RESET_FAILED, /* set by reset/rebuild */ 137 __ICE_RESET_FAILED, /* set by reset/rebuild */
136 __ICE_ADMINQ_EVENT_PENDING, 138 __ICE_ADMINQ_EVENT_PENDING,
139 __ICE_MAILBOXQ_EVENT_PENDING,
137 __ICE_MDD_EVENT_PENDING, 140 __ICE_MDD_EVENT_PENDING,
138 __ICE_FLTR_OVERFLOW_PROMISC, 141 __ICE_FLTR_OVERFLOW_PROMISC,
139 __ICE_CFG_BUSY, 142 __ICE_CFG_BUSY,
@@ -240,6 +243,7 @@ enum ice_pf_flags {
240 ICE_FLAG_MSIX_ENA, 243 ICE_FLAG_MSIX_ENA,
241 ICE_FLAG_FLTR_SYNC, 244 ICE_FLAG_FLTR_SYNC,
242 ICE_FLAG_RSS_ENA, 245 ICE_FLAG_RSS_ENA,
246 ICE_FLAG_SRIOV_CAPABLE,
243 ICE_PF_FLAGS_NBITS /* must be last */ 247 ICE_PF_FLAGS_NBITS /* must be last */
244}; 248};
245 249
@@ -255,6 +259,7 @@ struct ice_pf {
255 259
256 struct ice_vsi **vsi; /* VSIs created by the driver */ 260 struct ice_vsi **vsi; /* VSIs created by the driver */
257 struct ice_sw *first_sw; /* first switch created by firmware */ 261 struct ice_sw *first_sw; /* first switch created by firmware */
262 u16 num_vfs_supported; /* num VFs supported for this PF */
258 DECLARE_BITMAP(state, __ICE_STATE_NBITS); 263 DECLARE_BITMAP(state, __ICE_STATE_NBITS);
259 DECLARE_BITMAP(avail_txqs, ICE_MAX_TXQS); 264 DECLARE_BITMAP(avail_txqs, ICE_MAX_TXQS);
260 DECLARE_BITMAP(avail_rxqs, ICE_MAX_RXQS); 265 DECLARE_BITMAP(avail_rxqs, ICE_MAX_RXQS);
diff --git a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
index c100b4bda195..7d793cc96a18 100644
--- a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
+++ b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
@@ -87,6 +87,8 @@ struct ice_aqc_list_caps {
87/* Device/Function buffer entry, repeated per reported capability */ 87/* Device/Function buffer entry, repeated per reported capability */
88struct ice_aqc_list_caps_elem { 88struct ice_aqc_list_caps_elem {
89 __le16 cap; 89 __le16 cap;
90#define ICE_AQC_CAPS_SRIOV 0x0012
91#define ICE_AQC_CAPS_VF 0x0013
90#define ICE_AQC_CAPS_VSI 0x0017 92#define ICE_AQC_CAPS_VSI 0x0017
91#define ICE_AQC_CAPS_RSS 0x0040 93#define ICE_AQC_CAPS_RSS 0x0040
92#define ICE_AQC_CAPS_RXQS 0x0041 94#define ICE_AQC_CAPS_RXQS 0x0041
diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c
index 68fbbb92d504..0fe054e4bfb8 100644
--- a/drivers/net/ethernet/intel/ice/ice_common.c
+++ b/drivers/net/ethernet/intel/ice/ice_common.c
@@ -1406,6 +1406,28 @@ ice_parse_caps(struct ice_hw *hw, void *buf, u32 cap_count,
1406 u16 cap = le16_to_cpu(cap_resp->cap); 1406 u16 cap = le16_to_cpu(cap_resp->cap);
1407 1407
1408 switch (cap) { 1408 switch (cap) {
1409 case ICE_AQC_CAPS_SRIOV:
1410 caps->sr_iov_1_1 = (number == 1);
1411 ice_debug(hw, ICE_DBG_INIT,
1412 "HW caps: SR-IOV = %d\n", caps->sr_iov_1_1);
1413 break;
1414 case ICE_AQC_CAPS_VF:
1415 if (dev_p) {
1416 dev_p->num_vfs_exposed = number;
1417 ice_debug(hw, ICE_DBG_INIT,
1418 "HW caps: VFs exposed = %d\n",
1419 dev_p->num_vfs_exposed);
1420 } else if (func_p) {
1421 func_p->num_allocd_vfs = number;
1422 func_p->vf_base_id = logical_id;
1423 ice_debug(hw, ICE_DBG_INIT,
1424 "HW caps: VFs allocated = %d\n",
1425 func_p->num_allocd_vfs);
1426 ice_debug(hw, ICE_DBG_INIT,
1427 "HW caps: VF base_id = %d\n",
1428 func_p->vf_base_id);
1429 }
1430 break;
1409 case ICE_AQC_CAPS_VSI: 1431 case ICE_AQC_CAPS_VSI:
1410 if (dev_p) { 1432 if (dev_p) {
1411 dev_p->num_vsi_allocd_to_host = number; 1433 dev_p->num_vsi_allocd_to_host = number;
diff --git a/drivers/net/ethernet/intel/ice/ice_controlq.c b/drivers/net/ethernet/intel/ice/ice_controlq.c
index b25ce4f587f5..84c967294eaf 100644
--- a/drivers/net/ethernet/intel/ice/ice_controlq.c
+++ b/drivers/net/ethernet/intel/ice/ice_controlq.c
@@ -33,6 +33,36 @@ static void ice_adminq_init_regs(struct ice_hw *hw)
33} 33}
34 34
35/** 35/**
36 * ice_mailbox_init_regs - Initialize Mailbox registers
37 * @hw: pointer to the hardware structure
38 *
39 * This assumes the alloc_sq and alloc_rq functions have already been called
40 */
41static void ice_mailbox_init_regs(struct ice_hw *hw)
42{
43 struct ice_ctl_q_info *cq = &hw->mailboxq;
44
45 /* set head and tail registers in our local struct */
46 cq->sq.head = PF_MBX_ATQH;
47 cq->sq.tail = PF_MBX_ATQT;
48 cq->sq.len = PF_MBX_ATQLEN;
49 cq->sq.bah = PF_MBX_ATQBAH;
50 cq->sq.bal = PF_MBX_ATQBAL;
51 cq->sq.len_mask = PF_MBX_ATQLEN_ATQLEN_M;
52 cq->sq.len_ena_mask = PF_MBX_ATQLEN_ATQENABLE_M;
53 cq->sq.head_mask = PF_MBX_ATQH_ATQH_M;
54
55 cq->rq.head = PF_MBX_ARQH;
56 cq->rq.tail = PF_MBX_ARQT;
57 cq->rq.len = PF_MBX_ARQLEN;
58 cq->rq.bah = PF_MBX_ARQBAH;
59 cq->rq.bal = PF_MBX_ARQBAL;
60 cq->rq.len_mask = PF_MBX_ARQLEN_ARQLEN_M;
61 cq->rq.len_ena_mask = PF_MBX_ARQLEN_ARQENABLE_M;
62 cq->rq.head_mask = PF_MBX_ARQH_ARQH_M;
63}
64
65/**
36 * ice_check_sq_alive 66 * ice_check_sq_alive
37 * @hw: pointer to the hw struct 67 * @hw: pointer to the hw struct
38 * @cq: pointer to the specific Control queue 68 * @cq: pointer to the specific Control queue
@@ -639,6 +669,10 @@ static enum ice_status ice_init_ctrlq(struct ice_hw *hw, enum ice_ctl_q q_type)
639 ice_adminq_init_regs(hw); 669 ice_adminq_init_regs(hw);
640 cq = &hw->adminq; 670 cq = &hw->adminq;
641 break; 671 break;
672 case ICE_CTL_Q_MAILBOX:
673 ice_mailbox_init_regs(hw);
674 cq = &hw->mailboxq;
675 break;
642 default: 676 default:
643 return ICE_ERR_PARAM; 677 return ICE_ERR_PARAM;
644 } 678 }
@@ -696,7 +730,12 @@ enum ice_status ice_init_all_ctrlq(struct ice_hw *hw)
696 if (ret_code) 730 if (ret_code)
697 return ret_code; 731 return ret_code;
698 732
699 return ice_init_check_adminq(hw); 733 ret_code = ice_init_check_adminq(hw);
734 if (ret_code)
735 return ret_code;
736
737 /* Init Mailbox queue */
738 return ice_init_ctrlq(hw, ICE_CTL_Q_MAILBOX);
700} 739}
701 740
702/** 741/**
@@ -714,6 +753,9 @@ static void ice_shutdown_ctrlq(struct ice_hw *hw, enum ice_ctl_q q_type)
714 if (ice_check_sq_alive(hw, cq)) 753 if (ice_check_sq_alive(hw, cq))
715 ice_aq_q_shutdown(hw, true); 754 ice_aq_q_shutdown(hw, true);
716 break; 755 break;
756 case ICE_CTL_Q_MAILBOX:
757 cq = &hw->mailboxq;
758 break;
717 default: 759 default:
718 return; 760 return;
719 } 761 }
@@ -736,6 +778,8 @@ void ice_shutdown_all_ctrlq(struct ice_hw *hw)
736{ 778{
737 /* Shutdown FW admin queue */ 779 /* Shutdown FW admin queue */
738 ice_shutdown_ctrlq(hw, ICE_CTL_Q_ADMIN); 780 ice_shutdown_ctrlq(hw, ICE_CTL_Q_ADMIN);
781 /* Shutdown PF-VF Mailbox */
782 ice_shutdown_ctrlq(hw, ICE_CTL_Q_MAILBOX);
739} 783}
740 784
741/** 785/**
diff --git a/drivers/net/ethernet/intel/ice/ice_controlq.h b/drivers/net/ethernet/intel/ice/ice_controlq.h
index ea02b89243e2..437f832fd7c4 100644
--- a/drivers/net/ethernet/intel/ice/ice_controlq.h
+++ b/drivers/net/ethernet/intel/ice/ice_controlq.h
@@ -8,6 +8,7 @@
8 8
9/* Maximum buffer lengths for all control queue types */ 9/* Maximum buffer lengths for all control queue types */
10#define ICE_AQ_MAX_BUF_LEN 4096 10#define ICE_AQ_MAX_BUF_LEN 4096
11#define ICE_MBXQ_MAX_BUF_LEN 4096
11 12
12#define ICE_CTL_Q_DESC(R, i) \ 13#define ICE_CTL_Q_DESC(R, i) \
13 (&(((struct ice_aq_desc *)((R).desc_buf.va))[i])) 14 (&(((struct ice_aq_desc *)((R).desc_buf.va))[i]))
@@ -28,6 +29,7 @@
28enum ice_ctl_q { 29enum ice_ctl_q {
29 ICE_CTL_Q_UNKNOWN = 0, 30 ICE_CTL_Q_UNKNOWN = 0,
30 ICE_CTL_Q_ADMIN, 31 ICE_CTL_Q_ADMIN,
32 ICE_CTL_Q_MAILBOX,
31}; 33};
32 34
33/* Control Queue default settings */ 35/* Control Queue default settings */
diff --git a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h
index 9a78d83eaa3e..c2d867b756ef 100644
--- a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h
+++ b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h
@@ -29,6 +29,22 @@
29#define PF_FW_ATQLEN_ATQCRIT_M BIT(30) 29#define PF_FW_ATQLEN_ATQCRIT_M BIT(30)
30#define PF_FW_ATQLEN_ATQENABLE_M BIT(31) 30#define PF_FW_ATQLEN_ATQENABLE_M BIT(31)
31#define PF_FW_ATQT 0x00080400 31#define PF_FW_ATQT 0x00080400
32#define PF_MBX_ARQBAH 0x0022E400
33#define PF_MBX_ARQBAL 0x0022E380
34#define PF_MBX_ARQH 0x0022E500
35#define PF_MBX_ARQH_ARQH_M ICE_M(0x3FF, 0)
36#define PF_MBX_ARQLEN 0x0022E480
37#define PF_MBX_ARQLEN_ARQLEN_M ICE_M(0x3FF, 0)
38#define PF_MBX_ARQLEN_ARQENABLE_M BIT(31)
39#define PF_MBX_ARQT 0x0022E580
40#define PF_MBX_ATQBAH 0x0022E180
41#define PF_MBX_ATQBAL 0x0022E100
42#define PF_MBX_ATQH 0x0022E280
43#define PF_MBX_ATQH_ATQH_M ICE_M(0x3FF, 0)
44#define PF_MBX_ATQLEN 0x0022E200
45#define PF_MBX_ATQLEN_ATQLEN_M ICE_M(0x3FF, 0)
46#define PF_MBX_ATQLEN_ATQENABLE_M BIT(31)
47#define PF_MBX_ATQT 0x0022E300
32#define GLFLXP_RXDID_FLAGS(_i, _j) (0x0045D000 + ((_i) * 4 + (_j) * 256)) 48#define GLFLXP_RXDID_FLAGS(_i, _j) (0x0045D000 + ((_i) * 4 + (_j) * 256))
33#define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_S 0 49#define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_S 0
34#define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_M ICE_M(0x3F, 0) 50#define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_M ICE_M(0x3F, 0)
@@ -95,6 +111,11 @@
95#define PFINT_FW_CTL_ITR_INDX_S 11 111#define PFINT_FW_CTL_ITR_INDX_S 11
96#define PFINT_FW_CTL_ITR_INDX_M ICE_M(0x3, 11) 112#define PFINT_FW_CTL_ITR_INDX_M ICE_M(0x3, 11)
97#define PFINT_FW_CTL_CAUSE_ENA_M BIT(30) 113#define PFINT_FW_CTL_CAUSE_ENA_M BIT(30)
114#define PFINT_MBX_CTL 0x0016B280
115#define PFINT_MBX_CTL_MSIX_INDX_M ICE_M(0x7FF, 0)
116#define PFINT_MBX_CTL_ITR_INDX_S 11
117#define PFINT_MBX_CTL_ITR_INDX_M ICE_M(0x3, 11)
118#define PFINT_MBX_CTL_CAUSE_ENA_M BIT(30)
98#define PFINT_OICR 0x0016CA00 119#define PFINT_OICR 0x0016CA00
99#define PFINT_OICR_ECC_ERR_M BIT(16) 120#define PFINT_OICR_ECC_ERR_M BIT(16)
100#define PFINT_OICR_MAL_DETECT_M BIT(19) 121#define PFINT_OICR_MAL_DETECT_M BIT(19)
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index 46ccf265c218..3fd3bb783707 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -711,6 +711,10 @@ static int __ice_clean_ctrlq(struct ice_pf *pf, enum ice_ctl_q q_type)
711 cq = &hw->adminq; 711 cq = &hw->adminq;
712 qtype = "Admin"; 712 qtype = "Admin";
713 break; 713 break;
714 case ICE_CTL_Q_MAILBOX:
715 cq = &hw->mailboxq;
716 qtype = "Mailbox";
717 break;
714 default: 718 default:
715 dev_warn(&pf->pdev->dev, "Unknown control queue type 0x%x\n", 719 dev_warn(&pf->pdev->dev, "Unknown control queue type 0x%x\n",
716 q_type); 720 q_type);
@@ -851,6 +855,28 @@ static void ice_clean_adminq_subtask(struct ice_pf *pf)
851} 855}
852 856
853/** 857/**
858 * ice_clean_mailboxq_subtask - clean the MailboxQ rings
859 * @pf: board private structure
860 */
861static void ice_clean_mailboxq_subtask(struct ice_pf *pf)
862{
863 struct ice_hw *hw = &pf->hw;
864
865 if (!test_bit(__ICE_MAILBOXQ_EVENT_PENDING, pf->state))
866 return;
867
868 if (__ice_clean_ctrlq(pf, ICE_CTL_Q_MAILBOX))
869 return;
870
871 clear_bit(__ICE_MAILBOXQ_EVENT_PENDING, pf->state);
872
873 if (ice_ctrlq_pending(hw, &hw->mailboxq))
874 __ice_clean_ctrlq(pf, ICE_CTL_Q_MAILBOX);
875
876 ice_flush(hw);
877}
878
879/**
854 * ice_service_task_schedule - schedule the service task to wake up 880 * ice_service_task_schedule - schedule the service task to wake up
855 * @pf: board private structure 881 * @pf: board private structure
856 * 882 *
@@ -1040,6 +1066,7 @@ static void ice_service_task(struct work_struct *work)
1040 ice_handle_mdd_event(pf); 1066 ice_handle_mdd_event(pf);
1041 ice_watchdog_subtask(pf); 1067 ice_watchdog_subtask(pf);
1042 ice_clean_adminq_subtask(pf); 1068 ice_clean_adminq_subtask(pf);
1069 ice_clean_mailboxq_subtask(pf);
1043 1070
1044 /* Clear __ICE_SERVICE_SCHED flag to allow scheduling next event */ 1071 /* Clear __ICE_SERVICE_SCHED flag to allow scheduling next event */
1045 ice_service_task_complete(pf); 1072 ice_service_task_complete(pf);
@@ -1050,6 +1077,7 @@ static void ice_service_task(struct work_struct *work)
1050 */ 1077 */
1051 if (time_after(jiffies, (start_time + pf->serv_tmr_period)) || 1078 if (time_after(jiffies, (start_time + pf->serv_tmr_period)) ||
1052 test_bit(__ICE_MDD_EVENT_PENDING, pf->state) || 1079 test_bit(__ICE_MDD_EVENT_PENDING, pf->state) ||
1080 test_bit(__ICE_MAILBOXQ_EVENT_PENDING, pf->state) ||
1053 test_bit(__ICE_ADMINQ_EVENT_PENDING, pf->state)) 1081 test_bit(__ICE_ADMINQ_EVENT_PENDING, pf->state))
1054 mod_timer(&pf->serv_tmr, jiffies); 1082 mod_timer(&pf->serv_tmr, jiffies);
1055} 1083}
@@ -1064,6 +1092,10 @@ static void ice_set_ctrlq_len(struct ice_hw *hw)
1064 hw->adminq.num_sq_entries = ICE_AQ_LEN; 1092 hw->adminq.num_sq_entries = ICE_AQ_LEN;
1065 hw->adminq.rq_buf_size = ICE_AQ_MAX_BUF_LEN; 1093 hw->adminq.rq_buf_size = ICE_AQ_MAX_BUF_LEN;
1066 hw->adminq.sq_buf_size = ICE_AQ_MAX_BUF_LEN; 1094 hw->adminq.sq_buf_size = ICE_AQ_MAX_BUF_LEN;
1095 hw->mailboxq.num_rq_entries = ICE_MBXQ_LEN;
1096 hw->mailboxq.num_sq_entries = ICE_MBXQ_LEN;
1097 hw->mailboxq.rq_buf_size = ICE_MBXQ_MAX_BUF_LEN;
1098 hw->mailboxq.sq_buf_size = ICE_MBXQ_MAX_BUF_LEN;
1067} 1099}
1068 1100
1069/** 1101/**
@@ -1220,6 +1252,7 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data)
1220 u32 oicr, ena_mask; 1252 u32 oicr, ena_mask;
1221 1253
1222 set_bit(__ICE_ADMINQ_EVENT_PENDING, pf->state); 1254 set_bit(__ICE_ADMINQ_EVENT_PENDING, pf->state);
1255 set_bit(__ICE_MAILBOXQ_EVENT_PENDING, pf->state);
1223 1256
1224 oicr = rd32(hw, PFINT_OICR); 1257 oicr = rd32(hw, PFINT_OICR);
1225 ena_mask = rd32(hw, PFINT_OICR_ENA); 1258 ena_mask = rd32(hw, PFINT_OICR_ENA);
@@ -1406,6 +1439,11 @@ skip_req_irq:
1406 PFINT_FW_CTL_CAUSE_ENA_M); 1439 PFINT_FW_CTL_CAUSE_ENA_M);
1407 wr32(hw, PFINT_FW_CTL, val); 1440 wr32(hw, PFINT_FW_CTL, val);
1408 1441
1442 /* This enables Mailbox queue Interrupt causes */
1443 val = ((pf->hw_oicr_idx & PFINT_MBX_CTL_MSIX_INDX_M) |
1444 PFINT_MBX_CTL_CAUSE_ENA_M);
1445 wr32(hw, PFINT_MBX_CTL, val);
1446
1409 itr_gran = hw->itr_gran; 1447 itr_gran = hw->itr_gran;
1410 1448
1411 wr32(hw, GLINT_ITR(ICE_RX_ITR, pf->hw_oicr_idx), 1449 wr32(hw, GLINT_ITR(ICE_RX_ITR, pf->hw_oicr_idx),
@@ -1775,6 +1813,15 @@ static void ice_init_pf(struct ice_pf *pf)
1775{ 1813{
1776 bitmap_zero(pf->flags, ICE_PF_FLAGS_NBITS); 1814 bitmap_zero(pf->flags, ICE_PF_FLAGS_NBITS);
1777 set_bit(ICE_FLAG_MSIX_ENA, pf->flags); 1815 set_bit(ICE_FLAG_MSIX_ENA, pf->flags);
1816#ifdef CONFIG_PCI_IOV
1817 if (pf->hw.func_caps.common_cap.sr_iov_1_1) {
1818 struct ice_hw *hw = &pf->hw;
1819
1820 set_bit(ICE_FLAG_SRIOV_CAPABLE, pf->flags);
1821 pf->num_vfs_supported = min_t(int, hw->func_caps.num_allocd_vfs,
1822 ICE_MAX_VF_COUNT);
1823 }
1824#endif /* CONFIG_PCI_IOV */
1778 1825
1779 mutex_init(&pf->sw_mutex); 1826 mutex_init(&pf->sw_mutex);
1780 mutex_init(&pf->avail_q_mutex); 1827 mutex_init(&pf->avail_q_mutex);
diff --git a/drivers/net/ethernet/intel/ice/ice_type.h b/drivers/net/ethernet/intel/ice/ice_type.h
index f5c8de0ed0eb..6d053fb5f941 100644
--- a/drivers/net/ethernet/intel/ice/ice_type.h
+++ b/drivers/net/ethernet/intel/ice/ice_type.h
@@ -84,6 +84,7 @@ enum ice_media_type {
84 84
85enum ice_vsi_type { 85enum ice_vsi_type {
86 ICE_VSI_PF = 0, 86 ICE_VSI_PF = 0,
87 ICE_VSI_VF,
87}; 88};
88 89
89struct ice_link_status { 90struct ice_link_status {
@@ -127,6 +128,8 @@ struct ice_hw_common_caps {
127 /* Max MTU for function or device */ 128 /* Max MTU for function or device */
128 u16 max_mtu; 129 u16 max_mtu;
129 130
131 /* Virtualization support */
132 u8 sr_iov_1_1; /* SR-IOV enabled */
130 /* RSS related capabilities */ 133 /* RSS related capabilities */
131 u16 rss_table_size; /* 512 for PFs and 64 for VFs */ 134 u16 rss_table_size; /* 512 for PFs and 64 for VFs */
132 u8 rss_table_entry_width; /* RSS Entry width in bits */ 135 u8 rss_table_entry_width; /* RSS Entry width in bits */
@@ -135,12 +138,15 @@ struct ice_hw_common_caps {
135/* Function specific capabilities */ 138/* Function specific capabilities */
136struct ice_hw_func_caps { 139struct ice_hw_func_caps {
137 struct ice_hw_common_caps common_cap; 140 struct ice_hw_common_caps common_cap;
141 u32 num_allocd_vfs; /* Number of allocated VFs */
142 u32 vf_base_id; /* Logical ID of the first VF */
138 u32 guaranteed_num_vsi; 143 u32 guaranteed_num_vsi;
139}; 144};
140 145
141/* Device wide capabilities */ 146/* Device wide capabilities */
142struct ice_hw_dev_caps { 147struct ice_hw_dev_caps {
143 struct ice_hw_common_caps common_cap; 148 struct ice_hw_common_caps common_cap;
149 u32 num_vfs_exposed; /* Total number of VFs exposed */
144 u32 num_vsi_allocd_to_host; /* Excluding EMP VSI */ 150 u32 num_vsi_allocd_to_host; /* Excluding EMP VSI */
145}; 151};
146 152
@@ -321,6 +327,7 @@ struct ice_hw {
321 327
322 /* Control Queue info */ 328 /* Control Queue info */
323 struct ice_ctl_q_info adminq; 329 struct ice_ctl_q_info adminq;
330 struct ice_ctl_q_info mailboxq;
324 331
325 u8 api_branch; /* API branch version */ 332 u8 api_branch; /* API branch version */
326 u8 api_maj_ver; /* API major version */ 333 u8 api_maj_ver; /* API major version */