[dpdk-dev,PATCHv6,16/33] drivers/pool/dpaa2: adding hw offloaded mempool

Message ID 1485172803-17288-17-git-send-email-hemant.agrawal@nxp.com (mailing list archive)
State Changes Requested, archived
Delegated to: Ferruh Yigit
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel compilation success Compilation OK

Commit Message

Hemant Agrawal Jan. 23, 2017, 11:59 a.m. UTC
  Adding NXP DPAA2 architecture specific mempool support
Each mempool instance is represented by a DPBP object
from the FSL-MC bus.

This patch also registers a dpaa2 type MEMPOOL OPS

Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 MAINTAINERS                                   |   1 +
 config/common_base                            |   5 +
 config/defconfig_arm64-dpaa2-linuxapp-gcc     |   8 +
 drivers/Makefile                              |   1 +
 drivers/bus/fslmc/Makefile                    |   2 +
 drivers/bus/fslmc/fslmc_vfio.c                |   9 +-
 drivers/bus/fslmc/fslmc_vfio.h                |   2 +
 drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c      | 137 +++++++++++
 drivers/bus/fslmc/portal/dpaa2_hw_pvt.h       |  20 ++
 drivers/bus/fslmc/rte_bus_fslmc_version.map   |   2 +
 drivers/common/Makefile                       |   6 +-
 drivers/common/dpaa2/Makefile                 |   4 +
 drivers/common/dpaa2/qbman/Makefile           |   4 +
 drivers/pool/Makefile                         |  40 +++
 drivers/pool/dpaa2/Makefile                   |  71 ++++++
 drivers/pool/dpaa2/dpaa2_hw_mempool.c         | 339 ++++++++++++++++++++++++++
 drivers/pool/dpaa2/dpaa2_hw_mempool.h         |  95 ++++++++
 drivers/pool/dpaa2/rte_pool_dpaa2_version.map |   8 +
 mk/rte.app.mk                                 |   1 +
 19 files changed, 753 insertions(+), 2 deletions(-)
 create mode 100644 drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
 create mode 100644 drivers/pool/Makefile
 create mode 100644 drivers/pool/dpaa2/Makefile
 create mode 100644 drivers/pool/dpaa2/dpaa2_hw_mempool.c
 create mode 100644 drivers/pool/dpaa2/dpaa2_hw_mempool.h
 create mode 100644 drivers/pool/dpaa2/rte_pool_dpaa2_version.map
  

Comments

Ferruh Yigit Jan. 23, 2017, 5:34 p.m. UTC | #1
On 1/23/2017 11:59 AM, Hemant Agrawal wrote:
> Adding NXP DPAA2 architecture specific mempool support
> Each mempool instance is represented by a DPBP object
> from the FSL-MC bus.
> 
> This patch also registers a dpaa2 type MEMPOOL OPS
> 
> Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> ---
<...>

> diff --git a/drivers/common/Makefile b/drivers/common/Makefile
> index b52931c..0bb75b5 100644
> --- a/drivers/common/Makefile
> +++ b/drivers/common/Makefile
> @@ -35,7 +35,11 @@ ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_PMD),y)
>  CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_PMD)
>  endif
>  
> -ifeq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
> +ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_POOL),y)
> +CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_POOL)
> +endif
> +
> +ifneq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)

I guess this is a typo, but this prevents DPAA2_COMMON to be compiled !!

>  CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_FSLMC_BUS)
>  endif
>  

<...>
> +# library dependencies
> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_mempool
> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_common_dpaa2_qbman

This dependeny doesn not looks correct, there is no folder like that.

> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_bus_fslmc
> +
> +include $(RTE_SDK)/mk/rte.lib.mk

<...>
  
Shreyansh Jain Jan. 24, 2017, 9:12 a.m. UTC | #2
On Monday 23 January 2017 11:04 PM, Ferruh Yigit wrote:
> On 1/23/2017 11:59 AM, Hemant Agrawal wrote:
>> Adding NXP DPAA2 architecture specific mempool support
>> Each mempool instance is represented by a DPBP object
>> from the FSL-MC bus.
>>
>> This patch also registers a dpaa2 type MEMPOOL OPS
>>
>> Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
>> ---
> <...>
>
>> diff --git a/drivers/common/Makefile b/drivers/common/Makefile
>> index b52931c..0bb75b5 100644
>> --- a/drivers/common/Makefile
>> +++ b/drivers/common/Makefile
>> @@ -35,7 +35,11 @@ ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_PMD),y)
>>  CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_PMD)
>>  endif
>>
>> -ifeq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
>> +ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_POOL),y)
>> +CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_POOL)
>> +endif
>> +
>> +ifneq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
>
> I guess this is a typo, but this prevents DPAA2_COMMON to be compiled !!

It should be 'ifeq' rather than 'ifneq'. And it will prevent COMMON
compilation only if CONFIG_RTE_LIBRTE_FSLMC_BUS=n which is not the case
right now.

We will fix it.

>
>>  CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_FSLMC_BUS)
>>  endif
>>
>
> <...>
>> +# library dependencies
>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_mempool
>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_common_dpaa2_qbman
>
> This dependeny doesn not looks correct, there is no folder like that.

This is something even I need to understand. From the DEPDIRS what I
understood was that though it refers to a directory, it essentially
links libraries in build/lib/*.

Further, somehow the development is deploying drivers/bus,
drivers/common and drivers/pool in lib/* under the name specified as
LIB in Makefile. My understanding was that it is expected behavior and
not special because of drivers folder.

Thus, above line only links lib/librte_common_dpaa2_qbman generated by
drivers/common/dpaa2/qbman code.

In fact, I think, this might also one of the issues why a parallel 
shared build fails for DPAA2 PMD (added in Cover letter).
The dependency graph cannot create a graph for drivers/common
as dependency for drivers/net or drivers/bus and hence parallel build
fails because of missing libraries which are being parallely compiled.

>
>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_bus_fslmc
>> +
>> +include $(RTE_SDK)/mk/rte.lib.mk
>
> <...>
>
  
Ferruh Yigit Jan. 24, 2017, 10:49 a.m. UTC | #3
On 1/24/2017 9:12 AM, Shreyansh Jain wrote:
> On Monday 23 January 2017 11:04 PM, Ferruh Yigit wrote:
>> On 1/23/2017 11:59 AM, Hemant Agrawal wrote:
>>> Adding NXP DPAA2 architecture specific mempool support
>>> Each mempool instance is represented by a DPBP object
>>> from the FSL-MC bus.
>>>
>>> This patch also registers a dpaa2 type MEMPOOL OPS
>>>
>>> Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
>>> ---
>> <...>
>>
>>> diff --git a/drivers/common/Makefile b/drivers/common/Makefile
>>> index b52931c..0bb75b5 100644
>>> --- a/drivers/common/Makefile
>>> +++ b/drivers/common/Makefile
>>> @@ -35,7 +35,11 @@ ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_PMD),y)
>>>  CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_PMD)
>>>  endif
>>>
>>> -ifeq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
>>> +ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_POOL),y)
>>> +CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_POOL)
>>> +endif
>>> +
>>> +ifneq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
>>
>> I guess this is a typo, but this prevents DPAA2_COMMON to be compiled !!
> 
> It should be 'ifeq' rather than 'ifneq'. 

> And it will prevent COMMON
> compilation only if CONFIG_RTE_LIBRTE_FSLMC_BUS=n which is not the case
> right now.

It was the case for me for x86 config, but you are right it is not the
default case for arm.

> 
> We will fix it.
> 
>>
>>>  CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_FSLMC_BUS)
>>>  endif
>>>
>>
>> <...>
>>> +# library dependencies
>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_mempool
>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_common_dpaa2_qbman
>>
>> This dependeny doesn not looks correct, there is no folder like that.
> 
> This is something even I need to understand. From the DEPDIRS what I
> understood was that though it refers to a directory, it essentially
> links libraries in build/lib/*.
> 
> Further, somehow the development is deploying drivers/bus,
> drivers/common and drivers/pool in lib/* under the name specified as
> LIB in Makefile. My understanding was that it is expected behavior and
> not special because of drivers folder.
> 
> Thus, above line only links lib/librte_common_dpaa2_qbman generated by
> drivers/common/dpaa2/qbman code.
> 
> In fact, I think, this might also one of the issues why a parallel 
> shared build fails for DPAA2 PMD (added in Cover letter).
> The dependency graph cannot create a graph for drivers/common
> as dependency for drivers/net or drivers/bus and hence parallel build
> fails because of missing libraries which are being parallely compiled.

DEPDIRS-y is mainly to resolve dependencies for compilation order, and
should point to the folder,

Following line will cause "librte_eal" to be compiled before driver:
DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal

So "lib/librte_common_dpaa2_qbman" does not makes more sense, since
there is no folder like that.


Somewhere in the history, with following commit, DEPDIRS-y gained a side
effect, it has been used to set dynamic linking dependencies, to fix
underlinking issue:
 bf5a46fa5972 ("mk: generate internal library dependencies")

I guess you are having that line to benefit from this side effect, but
this can be done with following more properly:
LDLIBS += lib/librte_common_dpaa2_qbman


To resolve the drivers/net to drivers/common dependency, following line
in this Makefile should work:
DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += drivers/common/dpaa2

This adds following, which will cause "drivers/common" compiled before
any "drivers/net":
LOCAL_DEPDIRS-drivers/net += drivers/common

> 
>>
>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_bus_fslmc
>>> +
>>> +include $(RTE_SDK)/mk/rte.lib.mk
>>
>> <...>
>>
>
  
Hemant Agrawal Jan. 24, 2017, 2:37 p.m. UTC | #4
On 1/24/2017 4:19 PM, Ferruh Yigit wrote:
> On 1/24/2017 9:12 AM, Shreyansh Jain wrote:
>> On Monday 23 January 2017 11:04 PM, Ferruh Yigit wrote:
>>> On 1/23/2017 11:59 AM, Hemant Agrawal wrote:
>>>> Adding NXP DPAA2 architecture specific mempool support
>>>> Each mempool instance is represented by a DPBP object
>>>> from the FSL-MC bus.
>>>>
>>>> This patch also registers a dpaa2 type MEMPOOL OPS
>>>>
>>>> Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
>>>> ---
>>> <...>
>>>
>>>> diff --git a/drivers/common/Makefile b/drivers/common/Makefile
>>>> index b52931c..0bb75b5 100644
>>>> --- a/drivers/common/Makefile
>>>> +++ b/drivers/common/Makefile
>>>> @@ -35,7 +35,11 @@ ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_PMD),y)
>>>>  CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_PMD)
>>>>  endif
>>>>
>>>> -ifeq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
>>>> +ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_POOL),y)
>>>> +CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_POOL)
>>>> +endif
>>>> +
>>>> +ifneq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
>>>
>>> I guess this is a typo, but this prevents DPAA2_COMMON to be compiled !!
>>
>> It should be 'ifeq' rather than 'ifneq'.
>
>> And it will prevent COMMON
>> compilation only if CONFIG_RTE_LIBRTE_FSLMC_BUS=n which is not the case
>> right now.
>
> It was the case for me for x86 config, but you are right it is not the
> default case for arm.
>
>>
>> We will fix it.
>>
>>>
>>>>  CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_FSLMC_BUS)
>>>>  endif
>>>>
>>>
>>> <...>
>>>> +# library dependencies
>>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
>>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_mempool
>>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_common_dpaa2_qbman
>>>
>>> This dependeny doesn not looks correct, there is no folder like that.
>>
>> This is something even I need to understand. From the DEPDIRS what I
>> understood was that though it refers to a directory, it essentially
>> links libraries in build/lib/*.
>>
>> Further, somehow the development is deploying drivers/bus,
>> drivers/common and drivers/pool in lib/* under the name specified as
>> LIB in Makefile. My understanding was that it is expected behavior and
>> not special because of drivers folder.
>>
>> Thus, above line only links lib/librte_common_dpaa2_qbman generated by
>> drivers/common/dpaa2/qbman code.
>>
>> In fact, I think, this might also one of the issues why a parallel
>> shared build fails for DPAA2 PMD (added in Cover letter).
>> The dependency graph cannot create a graph for drivers/common
>> as dependency for drivers/net or drivers/bus and hence parallel build
>> fails because of missing libraries which are being parallely compiled.
>
> DEPDIRS-y is mainly to resolve dependencies for compilation order, and
> should point to the folder,
>
> Following line will cause "librte_eal" to be compiled before driver:
> DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
>
> So "lib/librte_common_dpaa2_qbman" does not makes more sense, since
> there is no folder like that.
>
>
> Somewhere in the history, with following commit, DEPDIRS-y gained a side
> effect, it has been used to set dynamic linking dependencies, to fix
> underlinking issue:
>  bf5a46fa5972 ("mk: generate internal library dependencies")
>
> I guess you are having that line to benefit from this side effect, but
> this can be done with following more properly:
> LDLIBS += lib/librte_common_dpaa2_qbman
>
>
> To resolve the drivers/net to drivers/common dependency, following line
> in this Makefile should work:
> DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += drivers/common/dpaa2
>
> This adds following, which will cause "drivers/common" compiled before
> any "drivers/net":
> LOCAL_DEPDIRS-drivers/net += drivers/common

Thanks for your suggestion. This is one thing, I am not yet able to fix.

Based on your suggestions:
e.g.
LDLIBS += -lrte_common_dpaa2_qbman
DEPDIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += drivers/common/dpaa2

It does add entry in the ".depdirs"
./arm64-dpaa2-linuxapp-gcc/.depdirs:168:LOCAL_DEPDIRS-drivers/bus += 
drivers/common
./arm64-dpaa2-linuxapp-gcc/.depdirs:170:LOCAL_DEPDIRS-drivers += lib
./arm64-dpaa2-linuxapp-gcc/.depdirs:172:LOCAL_DEPDIRS-drivers += lib
./arm64-dpaa2-linuxapp-gcc/.depdirs:174:LOCAL_DEPDIRS-drivers/pool += 
drivers/common

However,  we keep on getting:
LD librte_bus_fslmc.so.1.1
aarch64-linux-gnu-gcc: error: drivers/common/dpaa2: No such file or 
directory
make[6]: *** [librte_bus_fslmc.so.1.1] Error 1

>>
>>>
>>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_bus_fslmc
>>>> +
>>>> +include $(RTE_SDK)/mk/rte.lib.mk
>>>
>>> <...>
>>>
>>
>
>
  
Ferruh Yigit Jan. 24, 2017, 4:35 p.m. UTC | #5
On 1/24/2017 2:37 PM, Hemant Agrawal wrote:
> On 1/24/2017 4:19 PM, Ferruh Yigit wrote:
>> On 1/24/2017 9:12 AM, Shreyansh Jain wrote:
>>> On Monday 23 January 2017 11:04 PM, Ferruh Yigit wrote:
>>>> On 1/23/2017 11:59 AM, Hemant Agrawal wrote:
>>>>> Adding NXP DPAA2 architecture specific mempool support
>>>>> Each mempool instance is represented by a DPBP object
>>>>> from the FSL-MC bus.
>>>>>
>>>>> This patch also registers a dpaa2 type MEMPOOL OPS
>>>>>
>>>>> Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
>>>>> ---
>>>> <...>
>>>>
>>>>> diff --git a/drivers/common/Makefile b/drivers/common/Makefile
>>>>> index b52931c..0bb75b5 100644
>>>>> --- a/drivers/common/Makefile
>>>>> +++ b/drivers/common/Makefile
>>>>> @@ -35,7 +35,11 @@ ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_PMD),y)
>>>>>  CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_PMD)
>>>>>  endif
>>>>>
>>>>> -ifeq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
>>>>> +ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_POOL),y)
>>>>> +CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_POOL)
>>>>> +endif
>>>>> +
>>>>> +ifneq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
>>>>
>>>> I guess this is a typo, but this prevents DPAA2_COMMON to be compiled !!
>>>
>>> It should be 'ifeq' rather than 'ifneq'.
>>
>>> And it will prevent COMMON
>>> compilation only if CONFIG_RTE_LIBRTE_FSLMC_BUS=n which is not the case
>>> right now.
>>
>> It was the case for me for x86 config, but you are right it is not the
>> default case for arm.
>>
>>>
>>> We will fix it.
>>>
>>>>
>>>>>  CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_FSLMC_BUS)
>>>>>  endif
>>>>>
>>>>
>>>> <...>
>>>>> +# library dependencies
>>>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
>>>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_mempool
>>>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_common_dpaa2_qbman
>>>>
>>>> This dependeny doesn not looks correct, there is no folder like that.
>>>
>>> This is something even I need to understand. From the DEPDIRS what I
>>> understood was that though it refers to a directory, it essentially
>>> links libraries in build/lib/*.
>>>
>>> Further, somehow the development is deploying drivers/bus,
>>> drivers/common and drivers/pool in lib/* under the name specified as
>>> LIB in Makefile. My understanding was that it is expected behavior and
>>> not special because of drivers folder.
>>>
>>> Thus, above line only links lib/librte_common_dpaa2_qbman generated by
>>> drivers/common/dpaa2/qbman code.
>>>
>>> In fact, I think, this might also one of the issues why a parallel
>>> shared build fails for DPAA2 PMD (added in Cover letter).
>>> The dependency graph cannot create a graph for drivers/common
>>> as dependency for drivers/net or drivers/bus and hence parallel build
>>> fails because of missing libraries which are being parallely compiled.
>>
>> DEPDIRS-y is mainly to resolve dependencies for compilation order, and
>> should point to the folder,
>>
>> Following line will cause "librte_eal" to be compiled before driver:
>> DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
>>
>> So "lib/librte_common_dpaa2_qbman" does not makes more sense, since
>> there is no folder like that.
>>
>>
>> Somewhere in the history, with following commit, DEPDIRS-y gained a side
>> effect, it has been used to set dynamic linking dependencies, to fix
>> underlinking issue:
>>  bf5a46fa5972 ("mk: generate internal library dependencies")
>>
>> I guess you are having that line to benefit from this side effect, but
>> this can be done with following more properly:
>> LDLIBS += lib/librte_common_dpaa2_qbman
>>
>>
>> To resolve the drivers/net to drivers/common dependency, following line
>> in this Makefile should work:
>> DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += drivers/common/dpaa2
>>
>> This adds following, which will cause "drivers/common" compiled before
>> any "drivers/net":
>> LOCAL_DEPDIRS-drivers/net += drivers/common
> 
> Thanks for your suggestion. This is one thing, I am not yet able to fix.
> 
> Based on your suggestions:
> e.g.
> LDLIBS += -lrte_common_dpaa2_qbman
> DEPDIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += drivers/common/dpaa2
> 
> It does add entry in the ".depdirs"
> ./arm64-dpaa2-linuxapp-gcc/.depdirs:168:LOCAL_DEPDIRS-drivers/bus += 
> drivers/common
> ./arm64-dpaa2-linuxapp-gcc/.depdirs:170:LOCAL_DEPDIRS-drivers += lib
> ./arm64-dpaa2-linuxapp-gcc/.depdirs:172:LOCAL_DEPDIRS-drivers += lib
> ./arm64-dpaa2-linuxapp-gcc/.depdirs:174:LOCAL_DEPDIRS-drivers/pool += 
> drivers/common
> 
> However,  we keep on getting:
> LD librte_bus_fslmc.so.1.1
> aarch64-linux-gnu-gcc: error: drivers/common/dpaa2: No such file or 
> directory
> make[6]: *** [librte_bus_fslmc.so.1.1] Error 1

Can you please share the log with V=1, it may say more.

> 
>>>
>>>>
>>>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_bus_fslmc
>>>>> +
>>>>> +include $(RTE_SDK)/mk/rte.lib.mk
>>>>
>>>> <...>
>>>>
>>>
>>
>>
> 
>
  
Thomas Monjalon Jan. 24, 2017, 5:28 p.m. UTC | #6
2017-01-24 20:07, Hemant Agrawal:
> On 1/24/2017 4:19 PM, Ferruh Yigit wrote:
> > On 1/24/2017 9:12 AM, Shreyansh Jain wrote:
> >> On Monday 23 January 2017 11:04 PM, Ferruh Yigit wrote:
> >>> On 1/23/2017 11:59 AM, Hemant Agrawal wrote:
> >>>> +# library dependencies
> >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_mempool
> >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_common_dpaa2_qbman
> >>>
> >>> This dependeny doesn not looks correct, there is no folder like that.
> >>
> >> This is something even I need to understand. From the DEPDIRS what I
> >> understood was that though it refers to a directory, it essentially
> >> links libraries in build/lib/*.
> >>
> >> Further, somehow the development is deploying drivers/bus,
> >> drivers/common and drivers/pool in lib/* under the name specified as
> >> LIB in Makefile. My understanding was that it is expected behavior and
> >> not special because of drivers folder.
> >>
> >> Thus, above line only links lib/librte_common_dpaa2_qbman generated by
> >> drivers/common/dpaa2/qbman code.
> >>
> >> In fact, I think, this might also one of the issues why a parallel
> >> shared build fails for DPAA2 PMD (added in Cover letter).
> >> The dependency graph cannot create a graph for drivers/common
> >> as dependency for drivers/net or drivers/bus and hence parallel build
> >> fails because of missing libraries which are being parallely compiled.
> >
> > DEPDIRS-y is mainly to resolve dependencies for compilation order, and
> > should point to the folder,
> >
> > Following line will cause "librte_eal" to be compiled before driver:
> > DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> >
> > So "lib/librte_common_dpaa2_qbman" does not makes more sense, since
> > there is no folder like that.
> >
> >
> > Somewhere in the history, with following commit, DEPDIRS-y gained a side
> > effect, it has been used to set dynamic linking dependencies, to fix
> > underlinking issue:
> >  bf5a46fa5972 ("mk: generate internal library dependencies")
> >
> > I guess you are having that line to benefit from this side effect, but
> > this can be done with following more properly:
> > LDLIBS += lib/librte_common_dpaa2_qbman
> >
> >
> > To resolve the drivers/net to drivers/common dependency, following line
> > in this Makefile should work:
> > DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += drivers/common/dpaa2
> >
> > This adds following, which will cause "drivers/common" compiled before
> > any "drivers/net":
> > LOCAL_DEPDIRS-drivers/net += drivers/common
> 
> Thanks for your suggestion. This is one thing, I am not yet able to fix.
> 
> Based on your suggestions:
> e.g.
> LDLIBS += -lrte_common_dpaa2_qbman
> DEPDIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += drivers/common/dpaa2
> 
> It does add entry in the ".depdirs"
> ./arm64-dpaa2-linuxapp-gcc/.depdirs:168:LOCAL_DEPDIRS-drivers/bus += 
> drivers/common
> ./arm64-dpaa2-linuxapp-gcc/.depdirs:170:LOCAL_DEPDIRS-drivers += lib
> ./arm64-dpaa2-linuxapp-gcc/.depdirs:172:LOCAL_DEPDIRS-drivers += lib
> ./arm64-dpaa2-linuxapp-gcc/.depdirs:174:LOCAL_DEPDIRS-drivers/pool += 
> drivers/common
> 
> However,  we keep on getting:
> LD librte_bus_fslmc.so.1.1
> aarch64-linux-gnu-gcc: error: drivers/common/dpaa2: No such file or 
> directory
> make[6]: *** [librte_bus_fslmc.so.1.1] Error 1

Probably because of:

# Translate DEPDIRS-y into LDLIBS
# Ignore (sub)directory dependencies which do not provide an actual library
_IGNORE_DIRS = lib/librte_eal/% lib/librte_compat
_DEPDIRS = $(filter-out $(_IGNORE_DIRS),$(DEPDIRS-y))
_LDDIRS = $(subst librte_ether,librte_ethdev,$(_DEPDIRS))
LDLIBS += $(subst lib/lib,-l,$(_LDDIRS))

It shows one important thing: qbman is not a driver, it is a lib.
So drivers/common/dpaa2 should be handled differently.

Solution 1: tweak mk/rte.lib.mk for directories in drivers/common/
Solution 2: host your bus libs outside of DPDK
  
Neil Horman Jan. 25, 2017, 12:23 p.m. UTC | #7
On Tue, Jan 24, 2017 at 06:28:59PM +0100, Thomas Monjalon wrote:
> 2017-01-24 20:07, Hemant Agrawal:
> > On 1/24/2017 4:19 PM, Ferruh Yigit wrote:
> > > On 1/24/2017 9:12 AM, Shreyansh Jain wrote:
> > >> On Monday 23 January 2017 11:04 PM, Ferruh Yigit wrote:
> > >>> On 1/23/2017 11:59 AM, Hemant Agrawal wrote:
> > >>>> +# library dependencies
> > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_mempool
> > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_common_dpaa2_qbman
> > >>>
> > >>> This dependeny doesn not looks correct, there is no folder like that.
> > >>
> > >> This is something even I need to understand. From the DEPDIRS what I
> > >> understood was that though it refers to a directory, it essentially
> > >> links libraries in build/lib/*.
> > >>
> > >> Further, somehow the development is deploying drivers/bus,
> > >> drivers/common and drivers/pool in lib/* under the name specified as
> > >> LIB in Makefile. My understanding was that it is expected behavior and
> > >> not special because of drivers folder.
> > >>
> > >> Thus, above line only links lib/librte_common_dpaa2_qbman generated by
> > >> drivers/common/dpaa2/qbman code.
> > >>
> > >> In fact, I think, this might also one of the issues why a parallel
> > >> shared build fails for DPAA2 PMD (added in Cover letter).
> > >> The dependency graph cannot create a graph for drivers/common
> > >> as dependency for drivers/net or drivers/bus and hence parallel build
> > >> fails because of missing libraries which are being parallely compiled.
> > >
> > > DEPDIRS-y is mainly to resolve dependencies for compilation order, and
> > > should point to the folder,
> > >
> > > Following line will cause "librte_eal" to be compiled before driver:
> > > DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> > >
> > > So "lib/librte_common_dpaa2_qbman" does not makes more sense, since
> > > there is no folder like that.
> > >
> > >
> > > Somewhere in the history, with following commit, DEPDIRS-y gained a side
> > > effect, it has been used to set dynamic linking dependencies, to fix
> > > underlinking issue:
> > >  bf5a46fa5972 ("mk: generate internal library dependencies")
> > >
> > > I guess you are having that line to benefit from this side effect, but
> > > this can be done with following more properly:
> > > LDLIBS += lib/librte_common_dpaa2_qbman
> > >
> > >
> > > To resolve the drivers/net to drivers/common dependency, following line
> > > in this Makefile should work:
> > > DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += drivers/common/dpaa2
> > >
> > > This adds following, which will cause "drivers/common" compiled before
> > > any "drivers/net":
> > > LOCAL_DEPDIRS-drivers/net += drivers/common
> > 
> > Thanks for your suggestion. This is one thing, I am not yet able to fix.
> > 
> > Based on your suggestions:
> > e.g.
> > LDLIBS += -lrte_common_dpaa2_qbman
> > DEPDIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += drivers/common/dpaa2
> > 
> > It does add entry in the ".depdirs"
> > ./arm64-dpaa2-linuxapp-gcc/.depdirs:168:LOCAL_DEPDIRS-drivers/bus += 
> > drivers/common
> > ./arm64-dpaa2-linuxapp-gcc/.depdirs:170:LOCAL_DEPDIRS-drivers += lib
> > ./arm64-dpaa2-linuxapp-gcc/.depdirs:172:LOCAL_DEPDIRS-drivers += lib
> > ./arm64-dpaa2-linuxapp-gcc/.depdirs:174:LOCAL_DEPDIRS-drivers/pool += 
> > drivers/common
> > 
> > However,  we keep on getting:
> > LD librte_bus_fslmc.so.1.1
> > aarch64-linux-gnu-gcc: error: drivers/common/dpaa2: No such file or 
> > directory
> > make[6]: *** [librte_bus_fslmc.so.1.1] Error 1
> 
> Probably because of:
> 
> # Translate DEPDIRS-y into LDLIBS
> # Ignore (sub)directory dependencies which do not provide an actual library
> _IGNORE_DIRS = lib/librte_eal/% lib/librte_compat
> _DEPDIRS = $(filter-out $(_IGNORE_DIRS),$(DEPDIRS-y))
> _LDDIRS = $(subst librte_ether,librte_ethdev,$(_DEPDIRS))
> LDLIBS += $(subst lib/lib,-l,$(_LDDIRS))
> 
> It shows one important thing: qbman is not a driver, it is a lib.
> So drivers/common/dpaa2 should be handled differently.
> 
> Solution 1: tweak mk/rte.lib.mk for directories in drivers/common/
> Solution 2: host your bus libs outside of DPDK
Please do not go with suggestion two, the more libraries get hosted outside of
the project, the less likely any sort of test/build/ongoing maintenence from the
community can be expected.  If you're going to go with solution (2), then you
may as well host the entire PMD outside of the DPDK project, and thats more
undesireable.

Neil

>
  
Shreyansh Jain Jan. 25, 2017, 1:34 p.m. UTC | #8
> -----Original Message-----
> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Wednesday, January 25, 2017 5:53 PM
> To: Thomas Monjalon <thomas.monjalon@6wind.com>
> Cc: Hemant Agrawal <hemant.agrawal@nxp.com>; Ferruh Yigit
> <ferruh.yigit@intel.com>; Shreyansh Jain <shreyansh.jain@nxp.com>;
> dev@dpdk.org; bruce.richardson@intel.com; john.mcnamara@intel.com;
> jerin.jacob@caviumnetworks.com
> Subject: Re: [dpdk-dev] [PATCHv6 16/33] drivers/pool/dpaa2: adding hw
> offloaded mempool
> 
> On Tue, Jan 24, 2017 at 06:28:59PM +0100, Thomas Monjalon wrote:
> > 2017-01-24 20:07, Hemant Agrawal:
> > > On 1/24/2017 4:19 PM, Ferruh Yigit wrote:
> > > > On 1/24/2017 9:12 AM, Shreyansh Jain wrote:
> > > >> On Monday 23 January 2017 11:04 PM, Ferruh Yigit wrote:
> > > >>> On 1/23/2017 11:59 AM, Hemant Agrawal wrote:
> > > >>>> +# library dependencies
> > > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> > > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_mempool
> > > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) +=
> lib/librte_common_dpaa2_qbman
> > > >>>
> > > >>> This dependeny doesn not looks correct, there is no folder like that.
> > > >>
> > > >> This is something even I need to understand. From the DEPDIRS what I
> > > >> understood was that though it refers to a directory, it essentially
> > > >> links libraries in build/lib/*.
> > > >>
> > > >> Further, somehow the development is deploying drivers/bus,
> > > >> drivers/common and drivers/pool in lib/* under the name specified as
> > > >> LIB in Makefile. My understanding was that it is expected behavior and
> > > >> not special because of drivers folder.
> > > >>
> > > >> Thus, above line only links lib/librte_common_dpaa2_qbman generated by
> > > >> drivers/common/dpaa2/qbman code.
> > > >>
> > > >> In fact, I think, this might also one of the issues why a parallel
> > > >> shared build fails for DPAA2 PMD (added in Cover letter).
> > > >> The dependency graph cannot create a graph for drivers/common
> > > >> as dependency for drivers/net or drivers/bus and hence parallel build
> > > >> fails because of missing libraries which are being parallely compiled.
> > > >
> > > > DEPDIRS-y is mainly to resolve dependencies for compilation order, and
> > > > should point to the folder,
> > > >
> > > > Following line will cause "librte_eal" to be compiled before driver:
> > > > DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> > > >
> > > > So "lib/librte_common_dpaa2_qbman" does not makes more sense, since
> > > > there is no folder like that.
> > > >
> > > >
> > > > Somewhere in the history, with following commit, DEPDIRS-y gained a
> side
> > > > effect, it has been used to set dynamic linking dependencies, to fix
> > > > underlinking issue:
> > > >  bf5a46fa5972 ("mk: generate internal library dependencies")
> > > >
> > > > I guess you are having that line to benefit from this side effect, but
> > > > this can be done with following more properly:
> > > > LDLIBS += lib/librte_common_dpaa2_qbman
> > > >
> > > >
> > > > To resolve the drivers/net to drivers/common dependency, following line
> > > > in this Makefile should work:
> > > > DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += drivers/common/dpaa2
> > > >
> > > > This adds following, which will cause "drivers/common" compiled before
> > > > any "drivers/net":
> > > > LOCAL_DEPDIRS-drivers/net += drivers/common
> > >
> > > Thanks for your suggestion. This is one thing, I am not yet able to fix.
> > >
> > > Based on your suggestions:
> > > e.g.
> > > LDLIBS += -lrte_common_dpaa2_qbman
> > > DEPDIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += drivers/common/dpaa2
> > >
> > > It does add entry in the ".depdirs"
> > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:168:LOCAL_DEPDIRS-drivers/bus +=
> > > drivers/common
> > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:170:LOCAL_DEPDIRS-drivers += lib
> > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:172:LOCAL_DEPDIRS-drivers += lib
> > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:174:LOCAL_DEPDIRS-drivers/pool +=
> > > drivers/common
> > >
> > > However,  we keep on getting:
> > > LD librte_bus_fslmc.so.1.1
> > > aarch64-linux-gnu-gcc: error: drivers/common/dpaa2: No such file or
> > > directory
> > > make[6]: *** [librte_bus_fslmc.so.1.1] Error 1
> >
> > Probably because of:
> >
> > # Translate DEPDIRS-y into LDLIBS
> > # Ignore (sub)directory dependencies which do not provide an actual library
> > _IGNORE_DIRS = lib/librte_eal/% lib/librte_compat
> > _DEPDIRS = $(filter-out $(_IGNORE_DIRS),$(DEPDIRS-y))
> > _LDDIRS = $(subst librte_ether,librte_ethdev,$(_DEPDIRS))
> > LDLIBS += $(subst lib/lib,-l,$(_LDDIRS))
> >
> > It shows one important thing: qbman is not a driver, it is a lib.
> > So drivers/common/dpaa2 should be handled differently.
> >
> > Solution 1: tweak mk/rte.lib.mk for directories in drivers/common/
> > Solution 2: host your bus libs outside of DPDK
> Please do not go with suggestion two, the more libraries get hosted outside
> of
> the project, the less likely any sort of test/build/ongoing maintenence from
> the
> community can be expected.  If you're going to go with solution (2), then you
> may as well host the entire PMD outside of the DPDK project, and thats more
> undesireable.
 
Agree with you. Hosting a part of PMD (or PMD itself) outside of DPDK is not
a preferred way for me as well. Besides being non-user-friendly, this has
obvious disadvantage of a fragmented software which will quickly become
difficult to manage/maintain.

But, renaming so many variables also is not an easy choice (assuming
that the suggestion from you for MAP_STATIC_SYMBOL is not in place - still
investigating on that).
Merging everything together has already been ruled out in initial RFC
Discussions.

> 
> Neil
> 
> >
  
Jerin Jacob Jan. 25, 2017, 1:47 p.m. UTC | #9
On Wed, Jan 25, 2017 at 01:34:47PM +0000, Shreyansh Jain wrote:
> 
> 
> > -----Original Message-----
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Wednesday, January 25, 2017 5:53 PM
> > To: Thomas Monjalon <thomas.monjalon@6wind.com>
> > Cc: Hemant Agrawal <hemant.agrawal@nxp.com>; Ferruh Yigit
> > <ferruh.yigit@intel.com>; Shreyansh Jain <shreyansh.jain@nxp.com>;
> > dev@dpdk.org; bruce.richardson@intel.com; john.mcnamara@intel.com;
> > jerin.jacob@caviumnetworks.com
> > Subject: Re: [dpdk-dev] [PATCHv6 16/33] drivers/pool/dpaa2: adding hw
> > offloaded mempool
> > 
> > On Tue, Jan 24, 2017 at 06:28:59PM +0100, Thomas Monjalon wrote:
> > > 2017-01-24 20:07, Hemant Agrawal:
> > > > On 1/24/2017 4:19 PM, Ferruh Yigit wrote:
> > > > > On 1/24/2017 9:12 AM, Shreyansh Jain wrote:
> > > > >> On Monday 23 January 2017 11:04 PM, Ferruh Yigit wrote:
> > > > >>> On 1/23/2017 11:59 AM, Hemant Agrawal wrote:
> > > > >>>> +# library dependencies
> > > > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> > > > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_mempool
> > > > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) +=
> > lib/librte_common_dpaa2_qbman
> > > > >>>
> > > > >>> This dependeny doesn not looks correct, there is no folder like that.
> > > > >>
> > > > >> This is something even I need to understand. From the DEPDIRS what I
> > > > >> understood was that though it refers to a directory, it essentially
> > > > >> links libraries in build/lib/*.
> > > > >>
> > > > >> Further, somehow the development is deploying drivers/bus,
> > > > >> drivers/common and drivers/pool in lib/* under the name specified as
> > > > >> LIB in Makefile. My understanding was that it is expected behavior and
> > > > >> not special because of drivers folder.
> > > > >>
> > > > >> Thus, above line only links lib/librte_common_dpaa2_qbman generated by
> > > > >> drivers/common/dpaa2/qbman code.
> > > > >>
> > > > >> In fact, I think, this might also one of the issues why a parallel
> > > > >> shared build fails for DPAA2 PMD (added in Cover letter).
> > > > >> The dependency graph cannot create a graph for drivers/common
> > > > >> as dependency for drivers/net or drivers/bus and hence parallel build
> > > > >> fails because of missing libraries which are being parallely compiled.
> > > > >
> > > > > DEPDIRS-y is mainly to resolve dependencies for compilation order, and
> > > > > should point to the folder,
> > > > >
> > > > > Following line will cause "librte_eal" to be compiled before driver:
> > > > > DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> > > > >
> > > > > So "lib/librte_common_dpaa2_qbman" does not makes more sense, since
> > > > > there is no folder like that.
> > > > >
> > > > >
> > > > > Somewhere in the history, with following commit, DEPDIRS-y gained a
> > side
> > > > > effect, it has been used to set dynamic linking dependencies, to fix
> > > > > underlinking issue:
> > > > >  bf5a46fa5972 ("mk: generate internal library dependencies")
> > > > >
> > > > > I guess you are having that line to benefit from this side effect, but
> > > > > this can be done with following more properly:
> > > > > LDLIBS += lib/librte_common_dpaa2_qbman
> > > > >
> > > > >
> > > > > To resolve the drivers/net to drivers/common dependency, following line
> > > > > in this Makefile should work:
> > > > > DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += drivers/common/dpaa2
> > > > >
> > > > > This adds following, which will cause "drivers/common" compiled before
> > > > > any "drivers/net":
> > > > > LOCAL_DEPDIRS-drivers/net += drivers/common
> > > >
> > > > Thanks for your suggestion. This is one thing, I am not yet able to fix.
> > > >
> > > > Based on your suggestions:
> > > > e.g.
> > > > LDLIBS += -lrte_common_dpaa2_qbman
> > > > DEPDIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += drivers/common/dpaa2
> > > >
> > > > It does add entry in the ".depdirs"
> > > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:168:LOCAL_DEPDIRS-drivers/bus +=
> > > > drivers/common
> > > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:170:LOCAL_DEPDIRS-drivers += lib
> > > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:172:LOCAL_DEPDIRS-drivers += lib
> > > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:174:LOCAL_DEPDIRS-drivers/pool +=
> > > > drivers/common
> > > >
> > > > However,  we keep on getting:
> > > > LD librte_bus_fslmc.so.1.1
> > > > aarch64-linux-gnu-gcc: error: drivers/common/dpaa2: No such file or
> > > > directory
> > > > make[6]: *** [librte_bus_fslmc.so.1.1] Error 1
> > >
> > > Probably because of:
> > >
> > > # Translate DEPDIRS-y into LDLIBS
> > > # Ignore (sub)directory dependencies which do not provide an actual library
> > > _IGNORE_DIRS = lib/librte_eal/% lib/librte_compat
> > > _DEPDIRS = $(filter-out $(_IGNORE_DIRS),$(DEPDIRS-y))
> > > _LDDIRS = $(subst librte_ether,librte_ethdev,$(_DEPDIRS))
> > > LDLIBS += $(subst lib/lib,-l,$(_LDDIRS))
> > >
> > > It shows one important thing: qbman is not a driver, it is a lib.
> > > So drivers/common/dpaa2 should be handled differently.
> > >
> > > Solution 1: tweak mk/rte.lib.mk for directories in drivers/common/
> > > Solution 2: host your bus libs outside of DPDK
> > Please do not go with suggestion two, the more libraries get hosted outside
> > of
> > the project, the less likely any sort of test/build/ongoing maintenence from
> > the
> > community can be expected.  If you're going to go with solution (2), then you
> > may as well host the entire PMD outside of the DPDK project, and thats more
> > undesireable.
>  
> Agree with you. Hosting a part of PMD (or PMD itself) outside of DPDK is not
> a preferred way for me as well. Besides being non-user-friendly, this has
> obvious disadvantage of a fragmented software which will quickly become
> difficult to manage/maintain.

+1

If NXP drivers are only the consumers for the common code. Then I think,
there is no harm in exposing them as non rte_ namespace.

> 
> But, renaming so many variables also is not an easy choice (assuming
> that the suggestion from you for MAP_STATIC_SYMBOL is not in place - still
> investigating on that).
> Merging everything together has already been ruled out in initial RFC
> Discussions.
> 
> > 
> > Neil
> > 
> > >
  
Neil Horman Jan. 25, 2017, 3:07 p.m. UTC | #10
On Wed, Jan 25, 2017 at 01:34:47PM +0000, Shreyansh Jain wrote:
> 
> 
> > -----Original Message-----
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Wednesday, January 25, 2017 5:53 PM
> > To: Thomas Monjalon <thomas.monjalon@6wind.com>
> > Cc: Hemant Agrawal <hemant.agrawal@nxp.com>; Ferruh Yigit
> > <ferruh.yigit@intel.com>; Shreyansh Jain <shreyansh.jain@nxp.com>;
> > dev@dpdk.org; bruce.richardson@intel.com; john.mcnamara@intel.com;
> > jerin.jacob@caviumnetworks.com
> > Subject: Re: [dpdk-dev] [PATCHv6 16/33] drivers/pool/dpaa2: adding hw
> > offloaded mempool
> > 
> > On Tue, Jan 24, 2017 at 06:28:59PM +0100, Thomas Monjalon wrote:
> > > 2017-01-24 20:07, Hemant Agrawal:
> > > > On 1/24/2017 4:19 PM, Ferruh Yigit wrote:
> > > > > On 1/24/2017 9:12 AM, Shreyansh Jain wrote:
> > > > >> On Monday 23 January 2017 11:04 PM, Ferruh Yigit wrote:
> > > > >>> On 1/23/2017 11:59 AM, Hemant Agrawal wrote:
> > > > >>>> +# library dependencies
> > > > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> > > > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_mempool
> > > > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) +=
> > lib/librte_common_dpaa2_qbman
> > > > >>>
> > > > >>> This dependeny doesn not looks correct, there is no folder like that.
> > > > >>
> > > > >> This is something even I need to understand. From the DEPDIRS what I
> > > > >> understood was that though it refers to a directory, it essentially
> > > > >> links libraries in build/lib/*.
> > > > >>
> > > > >> Further, somehow the development is deploying drivers/bus,
> > > > >> drivers/common and drivers/pool in lib/* under the name specified as
> > > > >> LIB in Makefile. My understanding was that it is expected behavior and
> > > > >> not special because of drivers folder.
> > > > >>
> > > > >> Thus, above line only links lib/librte_common_dpaa2_qbman generated by
> > > > >> drivers/common/dpaa2/qbman code.
> > > > >>
> > > > >> In fact, I think, this might also one of the issues why a parallel
> > > > >> shared build fails for DPAA2 PMD (added in Cover letter).
> > > > >> The dependency graph cannot create a graph for drivers/common
> > > > >> as dependency for drivers/net or drivers/bus and hence parallel build
> > > > >> fails because of missing libraries which are being parallely compiled.
> > > > >
> > > > > DEPDIRS-y is mainly to resolve dependencies for compilation order, and
> > > > > should point to the folder,
> > > > >
> > > > > Following line will cause "librte_eal" to be compiled before driver:
> > > > > DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> > > > >
> > > > > So "lib/librte_common_dpaa2_qbman" does not makes more sense, since
> > > > > there is no folder like that.
> > > > >
> > > > >
> > > > > Somewhere in the history, with following commit, DEPDIRS-y gained a
> > side
> > > > > effect, it has been used to set dynamic linking dependencies, to fix
> > > > > underlinking issue:
> > > > >  bf5a46fa5972 ("mk: generate internal library dependencies")
> > > > >
> > > > > I guess you are having that line to benefit from this side effect, but
> > > > > this can be done with following more properly:
> > > > > LDLIBS += lib/librte_common_dpaa2_qbman
> > > > >
> > > > >
> > > > > To resolve the drivers/net to drivers/common dependency, following line
> > > > > in this Makefile should work:
> > > > > DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += drivers/common/dpaa2
> > > > >
> > > > > This adds following, which will cause "drivers/common" compiled before
> > > > > any "drivers/net":
> > > > > LOCAL_DEPDIRS-drivers/net += drivers/common
> > > >
> > > > Thanks for your suggestion. This is one thing, I am not yet able to fix.
> > > >
> > > > Based on your suggestions:
> > > > e.g.
> > > > LDLIBS += -lrte_common_dpaa2_qbman
> > > > DEPDIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += drivers/common/dpaa2
> > > >
> > > > It does add entry in the ".depdirs"
> > > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:168:LOCAL_DEPDIRS-drivers/bus +=
> > > > drivers/common
> > > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:170:LOCAL_DEPDIRS-drivers += lib
> > > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:172:LOCAL_DEPDIRS-drivers += lib
> > > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:174:LOCAL_DEPDIRS-drivers/pool +=
> > > > drivers/common
> > > >
> > > > However,  we keep on getting:
> > > > LD librte_bus_fslmc.so.1.1
> > > > aarch64-linux-gnu-gcc: error: drivers/common/dpaa2: No such file or
> > > > directory
> > > > make[6]: *** [librte_bus_fslmc.so.1.1] Error 1
> > >
> > > Probably because of:
> > >
> > > # Translate DEPDIRS-y into LDLIBS
> > > # Ignore (sub)directory dependencies which do not provide an actual library
> > > _IGNORE_DIRS = lib/librte_eal/% lib/librte_compat
> > > _DEPDIRS = $(filter-out $(_IGNORE_DIRS),$(DEPDIRS-y))
> > > _LDDIRS = $(subst librte_ether,librte_ethdev,$(_DEPDIRS))
> > > LDLIBS += $(subst lib/lib,-l,$(_LDDIRS))
> > >
> > > It shows one important thing: qbman is not a driver, it is a lib.
> > > So drivers/common/dpaa2 should be handled differently.
> > >
> > > Solution 1: tweak mk/rte.lib.mk for directories in drivers/common/
> > > Solution 2: host your bus libs outside of DPDK
> > Please do not go with suggestion two, the more libraries get hosted outside
> > of
> > the project, the less likely any sort of test/build/ongoing maintenence from
> > the
> > community can be expected.  If you're going to go with solution (2), then you
> > may as well host the entire PMD outside of the DPDK project, and thats more
> > undesireable.
>  
> Agree with you. Hosting a part of PMD (or PMD itself) outside of DPDK is not
> a preferred way for me as well. Besides being non-user-friendly, this has
> obvious disadvantage of a fragmented software which will quickly become
> difficult to manage/maintain.
> 
> But, renaming so many variables also is not an easy choice (assuming
> that the suggestion from you for MAP_STATIC_SYMBOL is not in place - still
> investigating on that).
I'm not sure what you mean by this, MAP_STATIC_SYMBOL is an available macro in
dpdk already, and you can ifndef...define...endif it to a no-op so that you can
keep the usage outside of dpdk.

Neil

> Merging everything together has already been ruled out in initial RFC
> Discussions.
> 
> > 
> > Neil
> > 
> > >
>
  
Shreyansh Jain Jan. 26, 2017, 12:05 p.m. UTC | #11
Hello Neil,

> -----Original Message-----
> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Wednesday, January 25, 2017 8:37 PM
> To: Shreyansh Jain <shreyansh.jain@nxp.com>
> Cc: Thomas Monjalon <thomas.monjalon@6wind.com>; Hemant Agrawal
> <hemant.agrawal@nxp.com>; Ferruh Yigit <ferruh.yigit@intel.com>;
> dev@dpdk.org; bruce.richardson@intel.com; john.mcnamara@intel.com;
> jerin.jacob@caviumnetworks.com
> Subject: Re: [dpdk-dev] [PATCHv6 16/33] drivers/pool/dpaa2: adding hw
> offloaded mempool
> 
> On Wed, Jan 25, 2017 at 01:34:47PM +0000, Shreyansh Jain wrote:
> >
> >
> > > -----Original Message-----
> > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > Sent: Wednesday, January 25, 2017 5:53 PM
> > > To: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > Cc: Hemant Agrawal <hemant.agrawal@nxp.com>; Ferruh Yigit
> > > <ferruh.yigit@intel.com>; Shreyansh Jain <shreyansh.jain@nxp.com>;
> > > dev@dpdk.org; bruce.richardson@intel.com; john.mcnamara@intel.com;
> > > jerin.jacob@caviumnetworks.com
> > > Subject: Re: [dpdk-dev] [PATCHv6 16/33] drivers/pool/dpaa2: adding hw
> > > offloaded mempool
> > >
> > > On Tue, Jan 24, 2017 at 06:28:59PM +0100, Thomas Monjalon wrote:
> > > > 2017-01-24 20:07, Hemant Agrawal:
> > > > > On 1/24/2017 4:19 PM, Ferruh Yigit wrote:
> > > > > > On 1/24/2017 9:12 AM, Shreyansh Jain wrote:
> > > > > >> On Monday 23 January 2017 11:04 PM, Ferruh Yigit wrote:
> > > > > >>> On 1/23/2017 11:59 AM, Hemant Agrawal wrote:
> > > > > >>>> +# library dependencies
> > > > > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> > > > > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_mempool
> > > > > >>>> +DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) +=
> > > lib/librte_common_dpaa2_qbman
> > > > > >>>
> > > > > >>> This dependeny doesn not looks correct, there is no folder like
> that.
> > > > > >>
> > > > > >> This is something even I need to understand. From the DEPDIRS what
> I
> > > > > >> understood was that though it refers to a directory, it
> essentially
> > > > > >> links libraries in build/lib/*.
> > > > > >>
> > > > > >> Further, somehow the development is deploying drivers/bus,
> > > > > >> drivers/common and drivers/pool in lib/* under the name specified
> as
> > > > > >> LIB in Makefile. My understanding was that it is expected behavior
> and
> > > > > >> not special because of drivers folder.
> > > > > >>
> > > > > >> Thus, above line only links lib/librte_common_dpaa2_qbman
> generated by
> > > > > >> drivers/common/dpaa2/qbman code.
> > > > > >>
> > > > > >> In fact, I think, this might also one of the issues why a parallel
> > > > > >> shared build fails for DPAA2 PMD (added in Cover letter).
> > > > > >> The dependency graph cannot create a graph for drivers/common
> > > > > >> as dependency for drivers/net or drivers/bus and hence parallel
> build
> > > > > >> fails because of missing libraries which are being parallely
> compiled.
> > > > > >
> > > > > > DEPDIRS-y is mainly to resolve dependencies for compilation order,
> and
> > > > > > should point to the folder,
> > > > > >
> > > > > > Following line will cause "librte_eal" to be compiled before
> driver:
> > > > > > DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
> > > > > >
> > > > > > So "lib/librte_common_dpaa2_qbman" does not makes more sense, since
> > > > > > there is no folder like that.
> > > > > >
> > > > > >
> > > > > > Somewhere in the history, with following commit, DEPDIRS-y gained a
> > > side
> > > > > > effect, it has been used to set dynamic linking dependencies, to
> fix
> > > > > > underlinking issue:
> > > > > >  bf5a46fa5972 ("mk: generate internal library dependencies")
> > > > > >
> > > > > > I guess you are having that line to benefit from this side effect,
> but
> > > > > > this can be done with following more properly:
> > > > > > LDLIBS += lib/librte_common_dpaa2_qbman
> > > > > >
> > > > > >
> > > > > > To resolve the drivers/net to drivers/common dependency, following
> line
> > > > > > in this Makefile should work:
> > > > > > DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += drivers/common/dpaa2
> > > > > >
> > > > > > This adds following, which will cause "drivers/common" compiled
> before
> > > > > > any "drivers/net":
> > > > > > LOCAL_DEPDIRS-drivers/net += drivers/common
> > > > >
> > > > > Thanks for your suggestion. This is one thing, I am not yet able to
> fix.
> > > > >
> > > > > Based on your suggestions:
> > > > > e.g.
> > > > > LDLIBS += -lrte_common_dpaa2_qbman
> > > > > DEPDIRS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += drivers/common/dpaa2
> > > > >
> > > > > It does add entry in the ".depdirs"
> > > > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:168:LOCAL_DEPDIRS-drivers/bus +=
> > > > > drivers/common
> > > > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:170:LOCAL_DEPDIRS-drivers += lib
> > > > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:172:LOCAL_DEPDIRS-drivers += lib
> > > > > ./arm64-dpaa2-linuxapp-gcc/.depdirs:174:LOCAL_DEPDIRS-drivers/pool +=
> > > > > drivers/common
> > > > >
> > > > > However,  we keep on getting:
> > > > > LD librte_bus_fslmc.so.1.1
> > > > > aarch64-linux-gnu-gcc: error: drivers/common/dpaa2: No such file or
> > > > > directory
> > > > > make[6]: *** [librte_bus_fslmc.so.1.1] Error 1
> > > >
> > > > Probably because of:
> > > >
> > > > # Translate DEPDIRS-y into LDLIBS
> > > > # Ignore (sub)directory dependencies which do not provide an actual
> library
> > > > _IGNORE_DIRS = lib/librte_eal/% lib/librte_compat
> > > > _DEPDIRS = $(filter-out $(_IGNORE_DIRS),$(DEPDIRS-y))
> > > > _LDDIRS = $(subst librte_ether,librte_ethdev,$(_DEPDIRS))
> > > > LDLIBS += $(subst lib/lib,-l,$(_LDDIRS))
> > > >
> > > > It shows one important thing: qbman is not a driver, it is a lib.
> > > > So drivers/common/dpaa2 should be handled differently.
> > > >
> > > > Solution 1: tweak mk/rte.lib.mk for directories in drivers/common/
> > > > Solution 2: host your bus libs outside of DPDK
> > > Please do not go with suggestion two, the more libraries get hosted
> outside
> > > of
> > > the project, the less likely any sort of test/build/ongoing maintenence
> from
> > > the
> > > community can be expected.  If you're going to go with solution (2), then
> you
> > > may as well host the entire PMD outside of the DPDK project, and thats
> more
> > > undesireable.
> >
> > Agree with you. Hosting a part of PMD (or PMD itself) outside of DPDK is
> not
> > a preferred way for me as well. Besides being non-user-friendly, this has
> > obvious disadvantage of a fragmented software which will quickly become
> > difficult to manage/maintain.
> >
> > But, renaming so many variables also is not an easy choice (assuming
> > that the suggestion from you for MAP_STATIC_SYMBOL is not in place - still
> > investigating on that).
> I'm not sure what you mean by this, MAP_STATIC_SYMBOL is an available macro
> in
> dpdk already, and you can ifndef...define...endif it to a no-op so that you
> can
> keep the usage outside of dpdk.
 
I only meant that as of writing the last mail I haven't had yet investigated/
tried that way. That is all.
I am not doubting this method (at least not until I try and reach some
roadblock).

> 
> Neil
> 
> > Merging everything together has already been ruled out in initial RFC
> > Discussions.
> >
> > >
> > > Neil
> > >
> > > >
> >
  

Patch

diff --git a/MAINTAINERS b/MAINTAINERS
index fb85351..a3ebcd5 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -359,6 +359,7 @@  M: Hemant Agrawal <hemant.agrawal@nxp.com>
 F: drivers/bus/fslmc/
 F: drivers/common/dpaa2/
 F: drivers/net/dpaa2/
+F: drivers/pool/dpaa2/
 F: doc/guides/nics/dpaa2.rst
 
 QLogic bnx2x
diff --git a/config/common_base b/config/common_base
index d1bf7a0..dd3de11 100644
--- a/config/common_base
+++ b/config/common_base
@@ -288,6 +288,11 @@  CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_DRIVER=n
 CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_MBOX=n
 
 #
+# Compile Support Libraries for NXP DPAA2
+#
+CONFIG_RTE_LIBRTE_DPAA2_POOL=n
+
+#
 # Compile NXP DPAA2 FSL-MC Bus
 #
 CONFIG_RTE_LIBRTE_FSLMC_BUS=n
diff --git a/config/defconfig_arm64-dpaa2-linuxapp-gcc b/config/defconfig_arm64-dpaa2-linuxapp-gcc
index eb12511..3cdb31b 100644
--- a/config/defconfig_arm64-dpaa2-linuxapp-gcc
+++ b/config/defconfig_arm64-dpaa2-linuxapp-gcc
@@ -42,6 +42,14 @@  CONFIG_RTE_ARCH_ARM_TUNE="cortex-a57+fp+simd"
 CONFIG_RTE_MAX_LCORE=8
 CONFIG_RTE_MAX_NUMA_NODES=1
 
+CONFIG_RTE_PKTMBUF_HEADROOM=256
+
+#
+# Compile Support Libraries for DPAA2
+#
+CONFIG_RTE_LIBRTE_DPAA2_POOL=n
+CONFIG_RTE_MBUF_DEFAULT_MEMPOOL_OPS="dpaa2"
+
 #
 # Compile NXP DPAA2 FSL-MC Bus
 #
diff --git a/drivers/Makefile b/drivers/Makefile
index bdae63b..9fd268e 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -33,6 +33,7 @@  include $(RTE_SDK)/mk/rte.vars.mk
 
 DIRS-y += common
 DIRS-y += bus
+DIRS-y += pool
 DIRS-y += net
 DIRS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += crypto
 
diff --git a/drivers/bus/fslmc/Makefile b/drivers/bus/fslmc/Makefile
index 311e0e9..263c4fd 100644
--- a/drivers/bus/fslmc/Makefile
+++ b/drivers/bus/fslmc/Makefile
@@ -51,6 +51,7 @@  CFLAGS += "-Wno-strict-aliasing"
 CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc
 CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/mc
 CFLAGS += -I$(RTE_SDK)/drivers/common/dpaa2/qbman/include
+CFLAGS += -I$(RTE_SDK)/drivers/pool/dpaa2
 CFLAGS += -I$(RTE_SDK)/lib/librte_eal/linuxapp/eal
 
 # versioning export map
@@ -67,6 +68,7 @@  SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += \
         mc/mc_sys.c
 
 SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += portal/dpaa2_hw_dpio.c
+SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += portal/dpaa2_hw_dpbp.c
 SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += fslmc_vfio.c
 SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += fslmc_bus.c
 
diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
index 2d7bcd9..fc017fc 100644
--- a/drivers/bus/fslmc/fslmc_vfio.c
+++ b/drivers/bus/fslmc/fslmc_vfio.c
@@ -270,7 +270,7 @@  int fslmc_vfio_process_group(void)
 	char path[PATH_MAX];
 	int64_t v_addr;
 	int ndev_count;
-	int dpio_count = 0;
+	int dpio_count = 0, dpbp_count = 0;
 	struct fslmc_vfio_group *group = &vfio_groups[0];
 	static int process_once;
 
@@ -420,6 +420,11 @@  int fslmc_vfio_process_group(void)
 			if (!ret)
 				dpio_count++;
 		}
+		if (!strcmp(object_type, "dpbp")) {
+			ret = dpaa2_create_dpbp_device(object_id);
+			if (!ret)
+				dpbp_count++;
+		}
 	}
 	closedir(d);
 
@@ -427,6 +432,8 @@  int fslmc_vfio_process_group(void)
 	if (ret)
 		FSLMC_VFIO_LOG(DEBUG, "Error in affining qbman swp %d", ret);
 
+	FSLMC_VFIO_LOG(DEBUG, "DPAA2: Added dpbp_count = %d dpio_count=%d\n",
+		      dpbp_count, dpio_count);
 	return 0;
 
 FAILURE:
diff --git a/drivers/bus/fslmc/fslmc_vfio.h b/drivers/bus/fslmc/fslmc_vfio.h
index 39994dd..80c6869 100644
--- a/drivers/bus/fslmc/fslmc_vfio.h
+++ b/drivers/bus/fslmc/fslmc_vfio.h
@@ -76,4 +76,6 @@  int dpaa2_create_dpio_device(struct fslmc_vfio_device *vdev,
 			     struct vfio_device_info *obj_info,
 			     int object_id);
 
+int dpaa2_create_dpbp_device(int dpbp_id);
+
 #endif /* _FSLMC_VFIO_H_ */
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
new file mode 100644
index 0000000..894f632
--- /dev/null
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
@@ -0,0 +1,137 @@ 
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.
+ *   Copyright (c) 2016 NXP. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Freescale Semiconductor, Inc nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include <rte_malloc.h>
+#include <rte_memcpy.h>
+#include <rte_string_fns.h>
+#include <rte_cycles.h>
+#include <rte_kvargs.h>
+#include <rte_dev.h>
+#include <rte_ethdev.h>
+
+#include <fslmc_logs.h>
+#include <fslmc_vfio.h>
+#include <mc/fsl_dpbp.h>
+#include "portal/dpaa2_hw_pvt.h"
+#include "portal/dpaa2_hw_dpio.h"
+
+TAILQ_HEAD(dpbp_device_list, dpaa2_dpbp_dev);
+static struct dpbp_device_list *dpbp_dev_list; /*!< DPBP device list */
+
+int
+dpaa2_create_dpbp_device(
+		int dpbp_id)
+{
+	struct dpaa2_dpbp_dev *dpbp_node;
+	int ret;
+
+	if (!dpbp_dev_list) {
+		dpbp_dev_list = malloc(sizeof(struct dpbp_device_list));
+		if (!dpbp_dev_list) {
+			PMD_INIT_LOG(ERR, "Memory alloc failed in DPBP list\n");
+			return -1;
+		}
+		/* Initialize the DPBP List */
+		TAILQ_INIT(dpbp_dev_list);
+	}
+
+	/* Allocate DPAA2 dpbp handle */
+	dpbp_node = (struct dpaa2_dpbp_dev *)
+			malloc(sizeof(struct dpaa2_dpbp_dev));
+	if (!dpbp_node) {
+		PMD_INIT_LOG(ERR, "Memory allocation failed for DPBP Device");
+		return -1;
+	}
+
+	/* Open the dpbp object */
+	dpbp_node->dpbp.regs = rte_mcp_ptr_list[MC_PORTAL_INDEX];
+	ret = dpbp_open(&dpbp_node->dpbp,
+			CMD_PRI_LOW, dpbp_id, &dpbp_node->token);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Resource alloc failure with err code: %d",
+			     ret);
+		free(dpbp_node);
+		return -1;
+	}
+
+	/* Clean the device first */
+	ret = dpbp_reset(&dpbp_node->dpbp, CMD_PRI_LOW, dpbp_node->token);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Failure cleaning dpbp device with"
+					" error code %d\n", ret);
+		return -1;
+	}
+
+	dpbp_node->dpbp_id = dpbp_id;
+	rte_atomic16_init(&dpbp_node->in_use);
+
+	TAILQ_INSERT_HEAD(dpbp_dev_list, dpbp_node, next);
+
+	PMD_INIT_LOG(DEBUG, "Buffer pool resource initialized %d", dpbp_id);
+
+	return 0;
+}
+
+struct dpaa2_dpbp_dev *dpaa2_alloc_dpbp_dev(void)
+{
+	struct dpaa2_dpbp_dev *dpbp_dev = NULL;
+
+	/* Get DPBP dev handle from list using index */
+	TAILQ_FOREACH(dpbp_dev, dpbp_dev_list, next) {
+		if (dpbp_dev && rte_atomic16_test_and_set(&dpbp_dev->in_use))
+			break;
+	}
+
+	return dpbp_dev;
+}
+
+void dpaa2_free_dpbp_dev(struct dpaa2_dpbp_dev *dpbp)
+{
+	struct dpaa2_dpbp_dev *dpbp_dev = NULL;
+
+	/* Match DPBP handle and mark it free */
+	TAILQ_FOREACH(dpbp_dev, dpbp_dev_list, next) {
+		if (dpbp_dev == dpbp) {
+			rte_atomic16_dec(&dpbp_dev->in_use);
+			return;
+		}
+	}
+}
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h
index 6b44314..ad2847f 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h
@@ -41,6 +41,13 @@ 
 #define MC_PORTAL_INDEX		0
 #define NUM_DPIO_REGIONS	2
 
+#define MEMPOOL_F_HW_PKT_POOL 0x8000 /**< mpool flag to check offloaded pool */
+
+/* Maximum release/acquire from QBMAN */
+#define DPAA2_MBUF_MAX_ACQ_REL	7
+
+#define MAX_BPID 256
+
 struct dpaa2_dpio_dev {
 	TAILQ_ENTRY(dpaa2_dpio_dev) next;
 		/**< Pointer to Next device instance */
@@ -63,6 +70,19 @@  struct dpaa2_dpio_dev {
 	int32_t hw_id; /**< An unique ID of this DPIO device instance */
 };
 
+struct dpaa2_dpbp_dev {
+	TAILQ_ENTRY(dpaa2_dpbp_dev) next;
+		/**< Pointer to Next device instance */
+	struct fsl_mc_io dpbp;  /** handle to DPBP portal object */
+	uint16_t token;
+	rte_atomic16_t in_use;
+	uint32_t dpbp_id; /*HW ID for DPBP object */
+};
+
 /*! Global MCP list */
 extern void *(*rte_mcp_ptr_list);
+
+struct dpaa2_dpbp_dev *dpaa2_alloc_dpbp_dev(void);
+void dpaa2_free_dpbp_dev(struct dpaa2_dpbp_dev *dpbp);
+
 #endif
diff --git a/drivers/bus/fslmc/rte_bus_fslmc_version.map b/drivers/bus/fslmc/rte_bus_fslmc_version.map
index 48d776e..028f55e 100644
--- a/drivers/bus/fslmc/rte_bus_fslmc_version.map
+++ b/drivers/bus/fslmc/rte_bus_fslmc_version.map
@@ -2,6 +2,8 @@  DPDK_17.02 {
 	global:
 
         dpaa2_affine_qbman_swp;
+        dpaa2_alloc_dpbp_dev;
+        dpaa2_free_dpbp_dev;
         dpbp_disable;
         dpbp_enable;
         dpbp_get_attributes;
diff --git a/drivers/common/Makefile b/drivers/common/Makefile
index b52931c..0bb75b5 100644
--- a/drivers/common/Makefile
+++ b/drivers/common/Makefile
@@ -35,7 +35,11 @@  ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_PMD),y)
 CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_PMD)
 endif
 
-ifeq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
+ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_POOL),y)
+CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_POOL)
+endif
+
+ifneq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
 CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_FSLMC_BUS)
 endif
 
diff --git a/drivers/common/dpaa2/Makefile b/drivers/common/dpaa2/Makefile
index 87f08bb..35e9405 100644
--- a/drivers/common/dpaa2/Makefile
+++ b/drivers/common/dpaa2/Makefile
@@ -35,6 +35,10 @@  ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_PMD),y)
 CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_PMD)
 endif
 
+ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_POOL),y)
+CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_POOL)
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
 CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_FSLMC_BUS)
 endif
diff --git a/drivers/common/dpaa2/qbman/Makefile b/drivers/common/dpaa2/qbman/Makefile
index 771bdc6..ee53ad7 100644
--- a/drivers/common/dpaa2/qbman/Makefile
+++ b/drivers/common/dpaa2/qbman/Makefile
@@ -40,6 +40,10 @@  ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_PMD),y)
 CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_PMD)
 endif
 
+ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_POOL),y)
+CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_DPAA2_POOL)
+endif
+
 ifeq ($(CONFIG_RTE_LIBRTE_FSLMC_BUS),y)
 CONFIG_RTE_LIBRTE_DPAA2_COMMON = $(CONFIG_RTE_LIBRTE_FSLMC_BUS)
 endif
diff --git a/drivers/pool/Makefile b/drivers/pool/Makefile
new file mode 100644
index 0000000..3efc336
--- /dev/null
+++ b/drivers/pool/Makefile
@@ -0,0 +1,40 @@ 
+#   BSD LICENSE
+#
+#   Copyright(c) 2016 NXP. All rights reserved.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of NXP nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_PMD),y)
+CONFIG_RTE_LIBRTE_DPAA2_POOL = $(CONFIG_RTE_LIBRTE_DPAA2_PMD)
+endif
+
+DIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += dpaa2
+
+include $(RTE_SDK)/mk/rte.subdir.mk
diff --git a/drivers/pool/dpaa2/Makefile b/drivers/pool/dpaa2/Makefile
new file mode 100644
index 0000000..69e1bb4
--- /dev/null
+++ b/drivers/pool/dpaa2/Makefile
@@ -0,0 +1,71 @@ 
+#   BSD LICENSE
+#
+#   Copyright(c) 2016 NXP. All rights reserved.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of NXP nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+#
+# library name
+#
+LIB = librte_pool_dpaa2.a
+
+ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_PMD),y)
+CONFIG_RTE_LIBRTE_DPAA2_POOL = $(CONFIG_RTE_LIBRTE_DPAA2_PMD)
+endif
+
+ifeq ($(CONFIG_RTE_LIBRTE_DPAA2_DEBUG_INIT),y)
+CFLAGS += -O0 -g
+CFLAGS += "-Wno-error"
+else
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+endif
+
+CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc
+CFLAGS += -I$(RTE_SDK)/drivers/common/dpaa2/qbman/include
+CFLAGS += -I$(RTE_SDK)/lib/librte_eal/linuxapp/eal
+
+# versioning export map
+EXPORT_MAP := rte_pool_dpaa2_version.map
+
+# Lbrary version
+LIBABIVER := 1
+
+# all source are stored in SRCS-y
+#
+SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += dpaa2_hw_mempool.c
+
+# library dependencies
+DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_eal
+DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_mempool
+DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_common_dpaa2_qbman
+DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_POOL) += lib/librte_bus_fslmc
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/pool/dpaa2/dpaa2_hw_mempool.c b/drivers/pool/dpaa2/dpaa2_hw_mempool.c
new file mode 100644
index 0000000..0c8de51
--- /dev/null
+++ b/drivers/pool/dpaa2/dpaa2_hw_mempool.c
@@ -0,0 +1,339 @@ 
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.
+ *   Copyright (c) 2016 NXP. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Freescale Semiconductor, Inc nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include <rte_mbuf.h>
+#include <rte_ethdev.h>
+#include <rte_malloc.h>
+#include <rte_memcpy.h>
+#include <rte_string_fns.h>
+#include <rte_cycles.h>
+#include <rte_kvargs.h>
+#include <rte_dev.h>
+#include <rte_ethdev.h>
+
+#include <fslmc_logs.h>
+#include <mc/fsl_dpbp.h>
+#include <portal/dpaa2_hw_pvt.h>
+#include <portal/dpaa2_hw_dpio.h>
+#include "dpaa2_hw_mempool.h"
+
+struct dpaa2_bp_info rte_dpaa2_bpid_info[MAX_BPID];
+static struct dpaa2_bp_list *h_bp_list;
+
+static int
+hw_mbuf_create_pool(struct rte_mempool *mp)
+{
+	struct dpaa2_bp_list *bp_list;
+	struct dpaa2_dpbp_dev *avail_dpbp;
+	struct dpbp_attr dpbp_attr;
+	uint32_t bpid;
+	int ret;
+
+	avail_dpbp = dpaa2_alloc_dpbp_dev();
+
+	if (!avail_dpbp) {
+		PMD_DRV_LOG(ERR, "DPAA2 resources not available");
+		return -1;
+	}
+
+	if (unlikely(!DPAA2_PER_LCORE_DPIO)) {
+		ret = dpaa2_affine_qbman_swp();
+		if (ret) {
+			RTE_LOG(ERR, PMD, "Failure in affining portal\n");
+			return 0;
+		}
+	}
+
+	ret = dpbp_enable(&avail_dpbp->dpbp, CMD_PRI_LOW, avail_dpbp->token);
+	if (ret != 0) {
+		PMD_INIT_LOG(ERR, "Resource enable failure with"
+			" err code: %d\n", ret);
+		return -1;
+	}
+
+	ret = dpbp_get_attributes(&avail_dpbp->dpbp, CMD_PRI_LOW,
+				  avail_dpbp->token, &dpbp_attr);
+	if (ret != 0) {
+		PMD_INIT_LOG(ERR, "Resource read failure with"
+			     " err code: %d\n", ret);
+		ret = dpbp_disable(&avail_dpbp->dpbp, CMD_PRI_LOW,
+				   avail_dpbp->token);
+		return -1;
+	}
+
+	/* Allocate the bp_list which will be added into global_bp_list */
+	bp_list = (struct dpaa2_bp_list *)malloc(sizeof(struct dpaa2_bp_list));
+	if (!bp_list) {
+		PMD_INIT_LOG(ERR, "No heap memory available");
+		return -1;
+	}
+
+	/* Set parameters of buffer pool list */
+	bp_list->buf_pool.num_bufs = mp->size;
+	bp_list->buf_pool.size = mp->elt_size
+			- sizeof(struct rte_mbuf) - rte_pktmbuf_priv_size(mp);
+	bp_list->buf_pool.bpid = dpbp_attr.bpid;
+	bp_list->buf_pool.h_bpool_mem = NULL;
+	bp_list->buf_pool.mp = mp;
+	bp_list->buf_pool.dpbp_node = avail_dpbp;
+	bp_list->next = h_bp_list;
+
+	bpid = dpbp_attr.bpid;
+
+
+	rte_dpaa2_bpid_info[bpid].meta_data_size = sizeof(struct rte_mbuf)
+				+ rte_pktmbuf_priv_size(mp);
+	rte_dpaa2_bpid_info[bpid].bp_list = bp_list;
+	rte_dpaa2_bpid_info[bpid].bpid = bpid;
+
+	mp->pool_data = (void *)&rte_dpaa2_bpid_info[bpid];
+
+	PMD_INIT_LOG(DEBUG, "BP List created for bpid =%d", dpbp_attr.bpid);
+
+	h_bp_list = bp_list;
+	/* Identification for our offloaded pool_data structure
+	 */
+	mp->flags |= MEMPOOL_F_HW_PKT_POOL;
+	return 0;
+}
+
+static void
+hw_mbuf_free_pool(struct rte_mempool *mp)
+{
+	struct dpaa2_bp_info *bpinfo;
+	struct dpaa2_bp_list *bp;
+	struct dpaa2_dpbp_dev *dpbp_node;
+
+	if (!mp->pool_data) {
+		PMD_DRV_LOG(ERR, "Not a valid dpaa22 pool");
+		return;
+	}
+
+	bpinfo = (struct dpaa2_bp_info *)mp->pool_data;
+	bp = bpinfo->bp_list;
+	dpbp_node = bp->buf_pool.dpbp_node;
+
+	dpbp_disable(&(dpbp_node->dpbp), CMD_PRI_LOW, dpbp_node->token);
+
+	if (h_bp_list == bp) {
+		h_bp_list = h_bp_list->next;
+	} else { /* if it is not the first node */
+		struct dpaa2_bp_list *prev = h_bp_list, *temp;
+		temp = h_bp_list->next;
+		while (temp) {
+			if (temp == bp) {
+				prev->next = temp->next;
+				free(bp);
+				break;
+			}
+			prev = temp;
+			temp = temp->next;
+		}
+	}
+
+	dpaa2_free_dpbp_dev(dpbp_node);
+}
+
+static
+void rte_dpaa2_mbuf_release(struct rte_mempool *pool __rte_unused,
+			void * const *obj_table,
+			uint32_t bpid,
+			uint32_t meta_data_size,
+			int count)
+{
+	struct qbman_release_desc releasedesc;
+	struct qbman_swp *swp;
+	int ret;
+	int i, n;
+	uint64_t bufs[DPAA2_MBUF_MAX_ACQ_REL];
+
+	if (unlikely(!DPAA2_PER_LCORE_DPIO)) {
+		ret = dpaa2_affine_qbman_swp();
+		if (ret != 0) {
+			RTE_LOG(ERR, PMD, "Failed to allocate IO portal");
+			return;
+		}
+	}
+	swp = DPAA2_PER_LCORE_PORTAL;
+
+	/* Create a release descriptor required for releasing
+	 * buffers into QBMAN
+	 */
+	qbman_release_desc_clear(&releasedesc);
+	qbman_release_desc_set_bpid(&releasedesc, bpid);
+
+	n = count % DPAA2_MBUF_MAX_ACQ_REL;
+
+	/* convert mbuf to buffers  for the remainder*/
+	for (i = 0; i < n ; i++)
+		bufs[i] = (uint64_t)obj_table[i] + meta_data_size;
+
+	/* feed them to bman*/
+	do {
+		ret = qbman_swp_release(swp, &releasedesc, bufs, n);
+	} while (ret == -EBUSY);
+
+	/* if there are more buffers to free */
+	while (n < count) {
+		/* convert mbuf to buffers */
+		for (i = 0; i < DPAA2_MBUF_MAX_ACQ_REL; i++)
+			bufs[i] = (uint64_t)obj_table[n + i] + meta_data_size;
+
+		do {
+			ret = qbman_swp_release(swp, &releasedesc, bufs,
+						DPAA2_MBUF_MAX_ACQ_REL);
+			} while (ret == -EBUSY);
+		n += DPAA2_MBUF_MAX_ACQ_REL;
+	}
+}
+
+int rte_dpaa2_mbuf_alloc_bulk(struct rte_mempool *pool,
+		       void **obj_table, unsigned int count)
+{
+#ifdef RTE_LIBRTE_DPAA2_DEBUG_DRIVER
+	static int alloc;
+#endif
+	struct qbman_swp *swp;
+	uint32_t mbuf_size;
+	uint16_t bpid;
+	uint64_t bufs[DPAA2_MBUF_MAX_ACQ_REL];
+	int i, ret;
+	unsigned int n = 0;
+	struct dpaa2_bp_info *bp_info;
+
+	bp_info = mempool_to_bpinfo(pool);
+
+	if (!(bp_info->bp_list)) {
+		RTE_LOG(ERR, PMD, "DPAA2 buffer pool not configured\n");
+		return -2;
+	}
+
+	bpid = bp_info->bpid;
+
+	if (unlikely(!DPAA2_PER_LCORE_DPIO)) {
+		ret = dpaa2_affine_qbman_swp();
+		if (ret != 0) {
+			RTE_LOG(ERR, PMD, "Failed to allocate IO portal");
+			return -1;
+		}
+	}
+	swp = DPAA2_PER_LCORE_PORTAL;
+
+	mbuf_size = sizeof(struct rte_mbuf) + rte_pktmbuf_priv_size(pool);
+
+	while (n < count) {
+		/* Acquire is all-or-nothing, so we drain in 7s,
+		 * then the remainder.
+		 */
+		if ((count - n) > DPAA2_MBUF_MAX_ACQ_REL) {
+			ret = qbman_swp_acquire(swp, bpid, bufs,
+						DPAA2_MBUF_MAX_ACQ_REL);
+		} else {
+			ret = qbman_swp_acquire(swp, bpid, bufs,
+						count - n);
+		}
+		/* In case of less than requested number of buffers available
+		 * in pool, qbman_swp_acquire returns 0
+		 */
+		if (ret <= 0) {
+			PMD_TX_LOG(ERR, "Buffer acquire failed with"
+				   " err code: %d", ret);
+			/* The API expect the exact number of requested bufs */
+			/* Releasing all buffers allocated */
+			rte_dpaa2_mbuf_release(pool, obj_table, bpid,
+					   bp_info->meta_data_size, n);
+			return -1;
+		}
+		/* assigning mbuf from the acquired objects */
+		for (i = 0; (i < ret) && bufs[i]; i++) {
+			/* TODO-errata - observed that bufs may be null
+			 * i.e. first buffer is valid,
+			 * remaining 6 buffers may be null
+			 */
+			obj_table[n] = (struct rte_mbuf *)(bufs[i] - mbuf_size);
+			rte_mbuf_refcnt_set((struct rte_mbuf *)obj_table[n], 0);
+			PMD_TX_LOG(DEBUG, "Acquired %p address %p from BMAN",
+				   (void *)bufs[i], (void *)obj_table[n]);
+			n++;
+		}
+	}
+
+#ifdef RTE_LIBRTE_DPAA2_DEBUG_DRIVER
+	alloc += n;
+	PMD_TX_LOG(DEBUG, "Total = %d , req = %d done = %d",
+		   alloc, count, n);
+#endif
+	return 0;
+}
+
+static int
+hw_mbuf_free_bulk(struct rte_mempool *pool,
+		  void * const *obj_table, unsigned int n)
+{
+	struct dpaa2_bp_info *bp_info;
+
+	bp_info = mempool_to_bpinfo(pool);
+	if (!(bp_info->bp_list)) {
+		RTE_LOG(ERR, PMD, "DPAA2 buffer pool not configured");
+		return -1;
+	}
+	rte_dpaa2_mbuf_release(pool, obj_table, bp_info->bpid,
+			   bp_info->meta_data_size, n);
+
+	return 0;
+}
+
+static unsigned
+hw_mbuf_get_count(const struct rte_mempool *mp __rte_unused)
+{
+	return 0;
+}
+
+struct rte_mempool_ops dpaa2_mpool_ops = {
+	.name = "dpaa2",
+	.alloc = hw_mbuf_create_pool,
+	.free = hw_mbuf_free_pool,
+	.enqueue = hw_mbuf_free_bulk,
+	.dequeue = rte_dpaa2_mbuf_alloc_bulk,
+	.get_count = hw_mbuf_get_count,
+};
+
+MEMPOOL_REGISTER_OPS(dpaa2_mpool_ops);
diff --git a/drivers/pool/dpaa2/dpaa2_hw_mempool.h b/drivers/pool/dpaa2/dpaa2_hw_mempool.h
new file mode 100644
index 0000000..c0e2411
--- /dev/null
+++ b/drivers/pool/dpaa2/dpaa2_hw_mempool.h
@@ -0,0 +1,95 @@ 
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.
+ *   Copyright (c) 2016 NXP. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Freescale Semiconductor, Inc nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _DPAA2_HW_DPBP_H_
+#define _DPAA2_HW_DPBP_H_
+
+#define DPAA2_MAX_BUF_POOLS	8
+
+struct buf_pool_cfg {
+	void *addr; /*!< The address from where DPAA2 will carve out the
+		     * buffers. 'addr' should be 'NULL' if user wants
+		     * to create buffers from the memory which user
+		     * asked DPAA2 to reserve during 'nadk init'
+		     */
+	phys_addr_t    phys_addr;  /*!< corresponding physical address
+				    * of the memory provided in addr
+				    */
+	uint32_t num; /*!< number of buffers */
+	uint32_t size; /*!< size of each buffer. 'size' should include
+			* any headroom to be reserved and alignment
+			*/
+	uint16_t align; /*!< Buffer alignment (in bytes) */
+	uint16_t bpid; /*!< The buffer pool id. This will be filled
+			*in by DPAA2 for each buffer pool
+			*/
+};
+
+struct buf_pool {
+	uint32_t size;
+	uint32_t num_bufs;
+	uint16_t bpid;
+	uint8_t *h_bpool_mem;
+	struct rte_mempool *mp;
+	struct dpaa2_dpbp_dev *dpbp_node;
+};
+
+/*!
+ * Buffer pool list configuration structure. User need to give DPAA2 the
+ * valid number of 'num_buf_pools'.
+ */
+struct dpaa2_bp_list_cfg {
+	struct buf_pool_cfg buf_pool; /* Configuration of each buffer pool*/
+};
+
+struct dpaa2_bp_list {
+	struct dpaa2_bp_list *next;
+	struct rte_mempool *mp;
+	struct buf_pool buf_pool;
+};
+
+struct dpaa2_bp_info {
+	uint32_t meta_data_size;
+	uint32_t bpid;
+	struct dpaa2_bp_list *bp_list;
+};
+
+#define mempool_to_bpinfo(mp) ((struct dpaa2_bp_info *)(mp)->pool_data)
+#define mempool_to_bpid(mp) ((mempool_to_bpinfo(mp))->bpid)
+
+extern struct dpaa2_bp_info rte_dpaa2_bpid_info[MAX_BPID];
+
+int rte_dpaa2_mbuf_alloc_bulk(struct rte_mempool *pool,
+		       void **obj_table, unsigned int count);
+
+#endif /* _DPAA2_HW_DPBP_H_ */
diff --git a/drivers/pool/dpaa2/rte_pool_dpaa2_version.map b/drivers/pool/dpaa2/rte_pool_dpaa2_version.map
new file mode 100644
index 0000000..187f092
--- /dev/null
+++ b/drivers/pool/dpaa2/rte_pool_dpaa2_version.map
@@ -0,0 +1,8 @@ 
+DPDK_17.02 {
+	global:
+
+	rte_dpaa2_bpid_info;
+	rte_dpaa2_mbuf_alloc_bulk;
+
+	local: *;
+};
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index c8a6c11..ea6ac49 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -112,6 +112,7 @@  _LDLIBS-$(CONFIG_RTE_LIBRTE_BNXT_PMD)       += -lrte_pmd_bnxt
 _LDLIBS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD)      += -lrte_pmd_cxgbe
 _LDLIBS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD)      += -lrte_pmd_dpaa2
 _LDLIBS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD)      += -lrte_common_dpaa2_qbman
+_LDLIBS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD)      += -lrte_pool_dpaa2
 _LDLIBS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD)      += -lrte_bus_fslmc
 _LDLIBS-$(CONFIG_RTE_LIBRTE_E1000_PMD)      += -lrte_pmd_e1000
 _LDLIBS-$(CONFIG_RTE_LIBRTE_ENA_PMD)        += -lrte_pmd_ena