- Add Intel ice PMD support on Windows.
- Remove #include sys/ioctl header file as it is not needed.
- Replace x86intrin.h with rte_vect.h to avoid __m_prefetchw conflicting
types.
- Replace POSIX usleep() API with rte API.
- Add a new macro for the access() API as the original function
has been deprecated on Windows.
- Add extra cflags '-fno-asynchronous-unwind-tables'
to avoid MinGW build error:
        Error: invalid register for .seh_savexmm
- Add documentation to support ice PMD on Windows.
Update the release notes and features list for the same.

Signed-off-by: Pallavi Kadam <pallavi.ka...@intel.com>
Reviewed-by: Ranjit Menon <ranjit.me...@intel.com>
---
 doc/guides/nics/features/ice.ini       |  1 +
 doc/guides/nics/ice.rst                | 18 ++++++++++++++++--
 doc/guides/rel_notes/release_21_05.rst |  4 ++++
 drivers/net/ice/base/ice_flow.c        |  2 +-
 drivers/net/ice/base/ice_flow.h        |  2 +-
 drivers/net/ice/base/ice_osdep.h       | 15 +++++++++++++++
 drivers/net/ice/base/ice_switch.c      |  2 +-
 drivers/net/ice/base/ice_vlan_mode.h   |  1 +
 drivers/net/ice/base/meson.build       |  4 ++++
 drivers/net/ice/ice_dcf_ethdev.c       |  1 -
 drivers/net/ice/ice_dcf_parent.c       | 10 +++++-----
 drivers/net/ice/ice_ethdev.c           |  6 +++---
 drivers/net/ice/ice_rxtx_vec_avx2.c    |  2 +-
 drivers/net/ice/ice_rxtx_vec_avx512.c  |  2 +-
 drivers/net/ice/meson.build            | 10 ++++------
 15 files changed, 58 insertions(+), 22 deletions(-)

diff --git a/doc/guides/nics/features/ice.ini b/doc/guides/nics/features/ice.ini
index e30a7d2e5..2b93872b1 100644
--- a/doc/guides/nics/features/ice.ini
+++ b/doc/guides/nics/features/ice.ini
@@ -40,5 +40,6 @@ Module EEPROM dump   = Y
 Multiprocess aware   = Y
 FreeBSD              = Y
 Linux                = Y
+Windows              = Y
 x86-32               = Y
 x86-64               = Y
diff --git a/doc/guides/nics/ice.rst b/doc/guides/nics/ice.rst
index ccda26f82..100086132 100644
--- a/doc/guides/nics/ice.rst
+++ b/doc/guides/nics/ice.rst
@@ -8,8 +8,8 @@ The ice PMD (**librte_net_ice**) provides poll mode driver 
support for
 10/25/50/100 Gbps Intel?? Ethernet 800 Series Network Adapters based on
 the Intel Ethernet Controller E810 and Intel Ethernet Connection E822/E823.
 
-Prerequisites
--------------
+Linux Prerequisites
+-------------------
 
 - Follow the DPDK :ref:`Getting Started Guide for Linux <linux_gsg>` to setup 
the basic DPDK environment.
 
@@ -25,6 +25,20 @@ Prerequisites
 - To understand DDP for COMMs usage with DPDK, please review `Intel?? Ethernet 
800 Series Telecommunication (Comms)
   Dynamic Device Personalization (DDP) Package 
<https://cdrdv2.intel.com/v1/dl/getContent/618651>`_.
 
+Windows Prerequisites
+---------------------
+
+- Follow the DPDK `Getting Started Guide for Windows 
<https://doc.dpdk.org/guides/windows_gsg/index.html>`_ to setup the basic DPDK 
environment.
+
+- Identify the Intel?? Ethernet adapter and get the latest NVM/FW version.
+
+- To access any Intel?? Ethernet hardware, load the NetUIO driver in place of 
existing built-in (inbox) driver.
+
+- To load NetUIO driver, follow the steps mentioned in `dpdk-kmods repository
+  <https://git.dpdk.org/dpdk-kmods/tree/windows/netuio/README.rst>`_.
+
+- Loading of private Dynamic Device Personalization (DDP) package is not 
supported on Windows.
+
 
 Recommended Matching List
 -------------------------
diff --git a/doc/guides/rel_notes/release_21_05.rst 
b/doc/guides/rel_notes/release_21_05.rst
index 23f7f0bff..15b812ac5 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -70,6 +70,10 @@ New Features
   * Added command to display Rx queue used descriptor count.
     ``show port (port_id) rxq (queue_id) desc used count``
 
+* **Updated Intel ice driver.**
+
+  * Added Intel ice support on Windows.
+
 
 Removed Items
 -------------
diff --git a/drivers/net/ice/base/ice_flow.c b/drivers/net/ice/base/ice_flow.c
index a081fbe5a..a4c233d4c 100644
--- a/drivers/net/ice/base/ice_flow.c
+++ b/drivers/net/ice/base/ice_flow.c
@@ -3139,7 +3139,7 @@ enum ice_status ice_flow_rem_entry(struct ice_hw *hw, 
enum ice_block blk,
        if (entry_h == ICE_FLOW_ENTRY_HANDLE_INVAL)
                return ICE_ERR_PARAM;
 
-       entry = ICE_FLOW_ENTRY_PTR((unsigned long)entry_h);
+       entry = ICE_FLOW_ENTRY_PTR((intptr_t)entry_h);
 
        /* Retain the pointer to the flow profile as the entry will be freed */
        prof = entry->prof;
diff --git a/drivers/net/ice/base/ice_flow.h b/drivers/net/ice/base/ice_flow.h
index c3bce1319..af15ecb0f 100644
--- a/drivers/net/ice/base/ice_flow.h
+++ b/drivers/net/ice/base/ice_flow.h
@@ -446,7 +446,7 @@ struct ice_flow_entry {
        u8 acts_cnt;
 };
 
-#define ICE_FLOW_ENTRY_HNDL(e) ((unsigned long)e)
+#define ICE_FLOW_ENTRY_HNDL(e) ((intptr_t)e)
 #define ICE_FLOW_ENTRY_PTR(h)  ((struct ice_flow_entry *)(h))
 
 struct ice_flow_prof {
diff --git a/drivers/net/ice/base/ice_osdep.h b/drivers/net/ice/base/ice_osdep.h
index 46ac86834..f4cc762e9 100644
--- a/drivers/net/ice/base/ice_osdep.h
+++ b/drivers/net/ice/base/ice_osdep.h
@@ -62,9 +62,24 @@ typedef uint64_t        s64;
 #define __be64          uint64_t
 #endif
 
+/* Avoid macro redefinition warning on Windows */
+#ifdef RTE_EXEC_ENV_WINDOWS
+#ifdef min
+#undef min
+#endif
+#ifdef max
+#undef max
+#endif
+#endif
 #define min(a, b) RTE_MIN(a, b)
 #define max(a, b) RTE_MAX(a, b)
 
+#ifdef RTE_EXEC_ENV_WINDOWS
+#define ice_access _access
+#else
+#define ice_access access
+#endif
+
 #define FIELD_SIZEOF(t, f) RTE_SIZEOF_FIELD(t, f)
 #define ARRAY_SIZE(arr) RTE_DIM(arr)
 
diff --git a/drivers/net/ice/base/ice_switch.c 
b/drivers/net/ice/base/ice_switch.c
index 4568242c1..b546e3d4e 100644
--- a/drivers/net/ice/base/ice_switch.c
+++ b/drivers/net/ice/base/ice_switch.c
@@ -6684,7 +6684,7 @@ ice_fill_valid_words(struct ice_adv_lkup_elem *rule,
 
        for (j = 0; j < sizeof(rule->m_u) / sizeof(u16); j++)
                if (((u16 *)&rule->m_u)[j] &&
-                   rule->type < ARRAY_SIZE(ice_prot_ext)) {
+                   (unsigned long long)rule->type < ARRAY_SIZE(ice_prot_ext)) {
                        /* No more space to accommodate */
                        if (word >= ICE_MAX_CHAIN_WORDS)
                                return 0;
diff --git a/drivers/net/ice/base/ice_vlan_mode.h 
b/drivers/net/ice/base/ice_vlan_mode.h
index e9f13e781..bcb6ff713 100644
--- a/drivers/net/ice/base/ice_vlan_mode.h
+++ b/drivers/net/ice/base/ice_vlan_mode.h
@@ -6,6 +6,7 @@
 #define _ICE_VLAN_MODE_H_
 
 #include "ice_osdep.h"
+#include "ice_status.h"
 
 struct ice_hw;
 
diff --git a/drivers/net/ice/base/meson.build b/drivers/net/ice/base/meson.build
index b82d05fe7..01f8f409d 100644
--- a/drivers/net/ice/base/meson.build
+++ b/drivers/net/ice/base/meson.build
@@ -29,6 +29,10 @@ foreach flag: error_cflags
        endif
 endforeach
 
+if is_windows and cc.get_id() != 'clang'
+       cflags += ['-fno-asynchronous-unwind-tables']
+endif
+
 base_lib = static_library('ice_base', sources,
        dependencies: static_rte_eal,
        c_args: c_args)
diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c
index e0772295e..af4731f55 100644
--- a/drivers/net/ice/ice_dcf_ethdev.c
+++ b/drivers/net/ice/ice_dcf_ethdev.c
@@ -5,7 +5,6 @@
 #include <errno.h>
 #include <stdbool.h>
 #include <sys/types.h>
-#include <sys/ioctl.h>
 #include <unistd.h>
 
 #include <rte_interrupts.h>
diff --git a/drivers/net/ice/ice_dcf_parent.c b/drivers/net/ice/ice_dcf_parent.c
index 476fd4906..a8571b35e 100644
--- a/drivers/net/ice/ice_dcf_parent.c
+++ b/drivers/net/ice/ice_dcf_parent.c
@@ -121,7 +121,7 @@ ice_dcf_vsi_update_service_handler(void *param)
        struct ice_dcf_hw *hw = reset_param->dcf_hw;
        struct ice_dcf_adapter *adapter;
 
-       usleep(ICE_DCF_VSI_UPDATE_SERVICE_INTERVAL);
+       rte_delay_us(ICE_DCF_VSI_UPDATE_SERVICE_INTERVAL);
 
        rte_spinlock_lock(&vsi_update_lock);
 
@@ -315,24 +315,24 @@ ice_dcf_request_pkg_name(struct ice_hw *hw, char 
*pkg_name)
        snprintf(pkg_name, ICE_MAX_PKG_FILENAME_SIZE,
                 ICE_PKG_FILE_SEARCH_PATH_UPDATES "ice-%016llx.pkg",
                 (unsigned long long)dsn);
-       if (!access(pkg_name, 0))
+       if (!ice_access(pkg_name, 0))
                return 0;
 
        snprintf(pkg_name, ICE_MAX_PKG_FILENAME_SIZE,
                 ICE_PKG_FILE_SEARCH_PATH_DEFAULT "ice-%016llx.pkg",
                 (unsigned long long)dsn);
-       if (!access(pkg_name, 0))
+       if (!ice_access(pkg_name, 0))
                return 0;
 
 pkg_file_direct:
        snprintf(pkg_name,
                 ICE_MAX_PKG_FILENAME_SIZE, "%s", ICE_PKG_FILE_UPDATES);
-       if (!access(pkg_name, 0))
+       if (!ice_access(pkg_name, 0))
                return 0;
 
        snprintf(pkg_name,
                 ICE_MAX_PKG_FILENAME_SIZE, "%s", ICE_PKG_FILE_DEFAULT);
-       if (!access(pkg_name, 0))
+       if (!ice_access(pkg_name, 0))
                return 0;
 
        return -1;
diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c
index dfd99ace9..d22bc92ff 100644
--- a/drivers/net/ice/ice_ethdev.c
+++ b/drivers/net/ice/ice_ethdev.c
@@ -1674,17 +1674,17 @@ ice_pkg_file_search_path(struct rte_pci_device 
*pci_dev, char *pkg_file)
 
        strncpy(pkg_file, ICE_PKG_FILE_SEARCH_PATH_UPDATES,
                ICE_MAX_PKG_FILENAME_SIZE);
-       if (!access(strcat(pkg_file, opt_ddp_filename), 0))
+       if (!ice_access(strcat(pkg_file, opt_ddp_filename), 0))
                return 0;
 
        strncpy(pkg_file, ICE_PKG_FILE_SEARCH_PATH_DEFAULT,
                ICE_MAX_PKG_FILENAME_SIZE);
-       if (!access(strcat(pkg_file, opt_ddp_filename), 0))
+       if (!ice_access(strcat(pkg_file, opt_ddp_filename), 0))
                return 0;
 
 fail_dsn:
        strncpy(pkg_file, ICE_PKG_FILE_UPDATES, ICE_MAX_PKG_FILENAME_SIZE);
-       if (!access(pkg_file, 0))
+       if (!ice_access(pkg_file, 0))
                return 0;
        strncpy(pkg_file, ICE_PKG_FILE_DEFAULT, ICE_MAX_PKG_FILENAME_SIZE);
        return 0;
diff --git a/drivers/net/ice/ice_rxtx_vec_avx2.c 
b/drivers/net/ice/ice_rxtx_vec_avx2.c
index 1cc54903c..25efd30e6 100644
--- a/drivers/net/ice/ice_rxtx_vec_avx2.c
+++ b/drivers/net/ice/ice_rxtx_vec_avx2.c
@@ -4,7 +4,7 @@
 
 #include "ice_rxtx_vec_common.h"
 
-#include <x86intrin.h>
+#include <rte_vect.h>
 
 #ifndef __INTEL_COMPILER
 #pragma GCC diagnostic ignored "-Wcast-qual"
diff --git a/drivers/net/ice/ice_rxtx_vec_avx512.c 
b/drivers/net/ice/ice_rxtx_vec_avx512.c
index 0e5a676e6..835d0aa70 100644
--- a/drivers/net/ice/ice_rxtx_vec_avx512.c
+++ b/drivers/net/ice/ice_rxtx_vec_avx512.c
@@ -4,7 +4,7 @@
 
 #include "ice_rxtx_vec_common.h"
 
-#include <x86intrin.h>
+#include <rte_vect.h>
 
 #ifndef __INTEL_COMPILER
 #pragma GCC diagnostic ignored "-Wcast-qual"
diff --git a/drivers/net/ice/meson.build b/drivers/net/ice/meson.build
index 9a67c8f7b..44ef64b4c 100644
--- a/drivers/net/ice/meson.build
+++ b/drivers/net/ice/meson.build
@@ -1,12 +1,6 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2018 Intel Corporation
 
-if is_windows
-       build = false
-       reason = 'not supported on Windows'
-       subdir_done()
-endif
-
 subdir('base')
 objs = [base_objs]
 
@@ -26,6 +20,10 @@ includes += include_directories('base', '../../common/iavf')
 if arch_subdir == 'x86'
        sources += files('ice_rxtx_vec_sse.c')
 
+       if is_windows and cc.get_id() != 'clang'
+               cflags += ['-fno-asynchronous-unwind-tables']
+       endif
+
        # compile AVX2 version if either:
        # a. we have AVX supported in minimum instruction set baseline
        # b. it's not minimum instruction set, but supported by compiler
-- 
2.18.0.windows.1

Reply via email to