diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am
index 10e38ac3c..1c2b625cb 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -30,6 +30,8 @@ odpapiplatinclude_HEADERS = \
 		  include/odp/api/plat/packet_inline_types.h \
 		  include/odp/api/plat/packet_inlines.h \
 		  include/odp/api/plat/packet_inlines_api.h \
+		  include/odp/api/plat/pktio_inlines.h \
+		  include/odp/api/plat/pktio_inlines_api.h \
 		  include/odp/api/plat/pool_inline_types.h \
 		  include/odp/api/plat/std_clib_inlines.h \
 		  include/odp/api/plat/strong_types.h \
@@ -205,6 +207,7 @@ __LIB__libodp_linux_la_SOURCES += \
 			   odp_byteorder.c \
 			   odp_packet_api.c \
 			   odp_packet_flags_api.c \
+			   odp_pktio_api.c \
 			   odp_std_clib.c \
 			   odp_sync.c \
 			   odp_thread_api.c \
diff --git a/platform/linux-generic/include-abi/odp/api/abi/packet_io.h b/platform/linux-generic/include-abi/odp/api/abi/packet_io.h
index a84e858e6..07931b817 100644
--- a/platform/linux-generic/include-abi/odp/api/abi/packet_io.h
+++ b/platform/linux-generic/include-abi/odp/api/abi/packet_io.h
@@ -51,6 +51,10 @@ typedef struct odp_pktout_queue_t {
  * @}
  */
 
+#define _ODP_INLINE static inline
+#include <odp/api/plat/pktio_inlines.h>
+#include <odp/api/plat/pktio_inlines_api.h>
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/platform/linux-generic/include/odp/api/plat/pktio_inlines.h b/platform/linux-generic/include/odp/api/plat/pktio_inlines.h
new file mode 100644
index 000000000..6a2aa72d8
--- /dev/null
+++ b/platform/linux-generic/include/odp/api/plat/pktio_inlines.h
@@ -0,0 +1,27 @@
+/* Copyright (c) 2018, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef ODP_PLAT_PKTIO_INLINES_H_
+#define ODP_PLAT_PKTIO_INLINES_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @cond _ODP_HIDE_FROM_DOXYGEN_ */
+
+static inline int _odp_pktio_index(odp_pktio_t pktio)
+{
+	return (int)(uintptr_t)pktio - 1;
+}
+
+/** @endcond */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/platform/linux-generic/include/odp/api/plat/pktio_inlines_api.h b/platform/linux-generic/include/odp/api/plat/pktio_inlines_api.h
new file mode 100644
index 000000000..5b59a4378
--- /dev/null
+++ b/platform/linux-generic/include/odp/api/plat/pktio_inlines_api.h
@@ -0,0 +1,31 @@
+/* Copyright (c) 2018, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+/**
+ * @file
+ */
+
+#ifndef ODP_PLAT_PKTIO_INLINES_API_H_
+#define ODP_PLAT_PKTIO_INLINES_API_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_ODP_INLINE int odp_pktio_index(odp_pktio_t pktio)
+{
+	return _odp_pktio_index(pktio);
+}
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h
index ad34e964a..1de0cbf90 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -18,6 +18,8 @@
 extern "C" {
 #endif
 
+#include <odp/api/packet_io.h>
+#include <odp/api/plat/pktio_inlines.h>
 #include <odp/api/spinlock.h>
 #include <odp/api/ticketlock.h>
 #include <odp_classification_datamodel.h>
@@ -235,13 +237,10 @@ typedef struct pktio_if_ops {
 
 extern void *pktio_entry_ptr[];
 
-static inline int pktio_to_id(odp_pktio_t pktio)
-{
-	return _odp_typeval(pktio) - 1;
-}
-
 static inline pktio_entry_t *get_pktio_entry(odp_pktio_t pktio)
 {
+	int idx;
+
 	if (odp_unlikely(pktio == ODP_PKTIO_INVALID))
 		return NULL;
 
@@ -251,7 +250,9 @@ static inline pktio_entry_t *get_pktio_entry(odp_pktio_t pktio)
 		return NULL;
 	}
 
-	return pktio_entry_ptr[pktio_to_id(pktio)];
+	idx = _odp_pktio_index(pktio);
+
+	return pktio_entry_ptr[idx];
 }
 
 static inline int pktio_cls_enabled(pktio_entry_t *entry)
diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c
index 488dcbddf..1909bae25 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -13,6 +13,8 @@
 #include <odp/api/hints.h>
 #include <odp/api/byteorder.h>
 #include <odp/api/plat/byteorder_inlines.h>
+#include <odp/api/packet_io.h>
+#include <odp/api/plat/pktio_inlines.h>
 
 #include <protocols/eth.h>
 #include <protocols/ip.h>
@@ -1269,7 +1271,7 @@ void *odp_packet_offset(odp_packet_t pkt, uint32_t offset, uint32_t *len,
 
 int odp_packet_input_index(odp_packet_t pkt)
 {
-	return odp_pktio_index(packet_hdr(pkt)->input);
+	return _odp_pktio_index(packet_hdr(pkt)->input);
 }
 
 void odp_packet_user_ptr_set(odp_packet_t pkt, const void *ctx)
diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c
index 460891d06..4eae4ed1e 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -9,6 +9,7 @@
 #include <odp_posix_extensions.h>
 
 #include <odp/api/packet_io.h>
+#include <odp/api/plat/pktio_inlines.h>
 #include <odp_packet_io_internal.h>
 #include <odp/api/packet.h>
 #include <odp_packet_internal.h>
@@ -481,7 +482,7 @@ int odp_pktio_start(odp_pktio_t hdl)
 			}
 		}
 
-		sched_fn->pktio_start(pktio_to_id(hdl), num, index, odpq);
+		sched_fn->pktio_start(_odp_pktio_index(hdl), num, index, odpq);
 	}
 
 	return res;
@@ -1022,16 +1023,6 @@ int odp_pktio_info(odp_pktio_t hdl, odp_pktio_info_t *info)
 	return 0;
 }
 
-int odp_pktio_index(odp_pktio_t pktio)
-{
-	pktio_entry_t *entry = get_pktio_entry(pktio);
-
-	if (!entry || is_free(entry))
-		return -1;
-
-	return pktio_to_id(pktio);
-}
-
 uint64_t odp_pktin_ts_res(odp_pktio_t hdl)
 {
 	pktio_entry_t *entry;
@@ -1361,7 +1352,7 @@ int odp_pktin_queue_config(odp_pktio_t pktio,
 		    mode == ODP_PKTIN_MODE_SCHED) {
 			odp_queue_param_t queue_param;
 			char name[ODP_QUEUE_NAME_LEN];
-			int pktio_id = pktio_to_id(pktio);
+			int pktio_id = _odp_pktio_index(pktio);
 
 			snprintf(name, sizeof(name), "odp-pktin-%i-%i",
 				 pktio_id, i);
@@ -1496,7 +1487,7 @@ int odp_pktout_queue_config(odp_pktio_t pktio,
 			odp_queue_param_t queue_param;
 			queue_t q_int;
 			char name[ODP_QUEUE_NAME_LEN];
-			int pktio_id = pktio_to_id(pktio);
+			int pktio_id = _odp_pktio_index(pktio);
 
 			snprintf(name, sizeof(name), "odp-pktout-%i-%i",
 				 pktio_id, i);
diff --git a/platform/linux-generic/odp_pktio_api.c b/platform/linux-generic/odp_pktio_api.c
new file mode 100644
index 000000000..f4dc33466
--- /dev/null
+++ b/platform/linux-generic/odp_pktio_api.c
@@ -0,0 +1,14 @@
+/* Copyright (c) 2018, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include "config.h"
+
+#include <odp/api/packet_io.h>
+#include <odp/api/plat/pktio_inlines.h>
+
+/* Include non-inlined versions of API functions */
+#define _ODP_INLINE
+#include <odp/api/plat/pktio_inlines_api.h>
