On 25 February 2016 at 22:43, Mike Holmes <mike.hol...@linaro.org> wrote:

> On 25 February 2016 at 08:17, Christophe Milard <
> christophe.mil...@linaro.org> wrote:
>
>> I guess this is stuck untill BKK discussion...?
>>
>
> I hope not.
>
>
>>
>> On 18 February 2016 at 12:37, Christophe Milard <
>> christophe.mil...@linaro.org> wrote:
>>
>>> A complete -partly working- driver prototype was sent as in RFC:
>>> https://lists.linaro.org/pipermail/lng-odp/2016-January/019162.html
>>> This approach of the driver interface "extending" the application
>>> interface was refused and we decided that the driver would have its own
>>> separate definition... in its own directory.
>>> so now the choice are:
>>> 1) Let the driver use both the north application interface and its own
>>> south interface (do we really want that)?
>>> 2) let the driver interface have some common functions (to the
>>> application interface), i.e. redefining these common functions in both
>>> interfaces, and when possible having the common "body" in the com
>>> directory) - this patch
>>>
>>> Christophe.
>>>
>>>
>>>
>>> On 18 February 2016 at 11:44, Maxim Uvarov <maxim.uva...@linaro.org>
>>> wrote:
>>>
>>>> I really don't like what we are doing here. We should try to avoid any
>>>> code duplication.
>>>> Add odpdrv_ prefix to all odp functions and move them to other place is
>>>> not thing we should to do.
>>>>
>>>> And also, in my understanding, we should not implement our own
>>>> programming language for odp drivers.
>>>>
>>>> So my point is:
>>>> 1) odp driver and odp application should operate the same type of
>>>> variables and structs.
>>>> No any drv_magic_atomic, drv_LITTLE_ENDIAN  and etc.
>>>>
>>>
> We have already agreed there will be two interfaces that are independent,
> one for applications and one for drivers, so I do not agree they use the
> same same struct, can you convince us why we would change our position with
> a good example on the problem it will cause.
> We agreed before that the interface independance was worth a little
> complexity, I do not see a reason to change that decision yet.
>

Agreed. Changing a decision that has been taken should require:
1) Identifying a new problem which wasn't known by the time the initial
decision was taken
2) having a better solution at least fixing the problem identified in 1)
I don't see this here.

>
>
>
>>
>>>> 2) What is odp driver? Is it some linux kernel driver adopted to ODP or
>>>> freebsd driver adopted to ODP?
>>>> If it's adopted driver than we need have as less changes related to odp
>>>> there as we can.
>>>>
>>>
> No, it is a driver specifically written for ODP to gain access to a PCIe
> or simple case platform NIC with the highest possible performance from
> userspace. Maybe Christophe can give another talk in the ARCH call to make
> sure we are all solving the same problem when we look at this  proposal.
>

I don't mind trying to explain my view at the next arch call.
 The problem I am trying to address is to enable a set of user space
programs (the drivers), interfacing ODP (through the interface we are now
trying to define, called drv here). These "drivers" (which I think should
be libs eventually) would enable a new packetio type at the application
level, to send/receive packet from the NIC.

The RFC I sent early january was an example of that.
-At init time, each driver would register to ODP. (the RFC contained a
single driver for intel ixgbe). So a single driver registered. When
registering, the driver gave a pointer to its probe() function to ODP.
-The ODP application could create a new packetio (named
"nic:<pci_address>". A wrapper could be created for other kind of interface
specification later, but these board spec will always boil down to a PCI
address at the end, so it was the simplest case to start with)).
-when pktio_open() was called, ODP called the registered driver probe() one
by one. The first driver  answering "I can handle this board" was selected.
-Any packet sent to this packet io was passed to the NIC and sent on the
wire,
-Any pacet received by the board was presented as received packet on the
packet_io


>
>>>> 3) Work flow here should be opposite. Driver should be implemented (or
>>>> ported) first. Then you should
>>>> consider which parts needed to be implemented. Patch should be linked
>>>> to implementation patch which
>>>> shows the actual reason for doing this. But now it looks like double
>>>> defining everything what we have in
>>>> odp api and then we will think what to do with it.
>>>>
>>>
> Another RFC is no bad thing, it does help show how things are to be used.
> But what I have witnessed is a couple of large effort RFCs that flip flop
> on fundamentals and that is a waste of effort. We must  stick to our
> decisions and progress unless a new argument shows we need to change course
> or we will never get far enough to really understand the problem.
>

The RFC sent in january was 31 patches. only patch 1 recieved comments.
Even though the interface specification (which was a .h file then) has
slightly changed, most of the concepts address by this patch set remains
valid.

Christophe

>
>
>
>>
>>>> Maxim.
>>>>
>>>>
>>>>
>>>> On 02/17/16 17:36, Christophe Milard wrote:
>>>>
>>>>> Signed-off-by: Christophe Milard <christophe.mil...@linaro.org>
>>>>> ---
>>>>>   include/odp/drv/spec/byteorder.h | 176
>>>>> +++++++++++++++++++++++++++++++++++++++
>>>>>   1 file changed, 176 insertions(+)
>>>>>   create mode 100644 include/odp/drv/spec/byteorder.h
>>>>>
>>>>> diff --git a/include/odp/drv/spec/byteorder.h
>>>>> b/include/odp/drv/spec/byteorder.h
>>>>> new file mode 100644
>>>>> index 0000000..2543016
>>>>> --- /dev/null
>>>>> +++ b/include/odp/drv/spec/byteorder.h
>>>>> @@ -0,0 +1,176 @@
>>>>> +/* Copyright (c) 2016, Linaro Limited
>>>>> + * All rights reserved.
>>>>> + *
>>>>> + * SPDX-License-Identifier:     BSD-3-Clause
>>>>> + */
>>>>> +
>>>>> +/**
>>>>> + * @file
>>>>> + *
>>>>> + * ODP byteorder
>>>>> + */
>>>>> +
>>>>> +#ifndef ODPDRV_BYTEORDER_H_
>>>>> +#define ODPDRV_BYTEORDER_H_
>>>>> +
>>>>> +#ifdef __cplusplus
>>>>> +extern "C" {
>>>>> +#endif
>>>>> +
>>>>> +/** @addtogroup odpdrv_compiler_optim ODPDRV COMPILER / OPTIMIZATION
>>>>> + *  Macros that check byte order and operations for byte order
>>>>> conversion.
>>>>> + *  @{
>>>>> + */
>>>>> +
>>>>> +/**
>>>>> + * @def ODPDRV_BIG_ENDIAN
>>>>> + * Big endian byte order
>>>>> + *
>>>>> + * @def ODPDRV_LITTLE_ENDIAN
>>>>> + * Little endian byte order
>>>>> + *
>>>>> + * @def ODPDRV_BIG_ENDIAN_BITFIELD
>>>>> + * Big endian bit field
>>>>> + *
>>>>> + * @def ODPDRV_LITTLE_ENDIAN_BITFIELD
>>>>> + * Little endian bit field
>>>>> + *
>>>>> + * @def ODPDRV_BYTE_ORDER
>>>>> + * Selected byte order
>>>>> + */
>>>>> +
>>>>> +/**
>>>>> + * @typedef odpdrv_u16le_t
>>>>> + * unsigned 16bit little endian
>>>>> + *
>>>>> + * @typedef odpdrv_u16be_t
>>>>> + * unsigned 16bit big endian
>>>>> + *
>>>>> + * @typedef odpdrv_u32le_t
>>>>> + * unsigned 32bit little endian
>>>>> + *
>>>>> + * @typedef odpdrv_u32be_t
>>>>> + * unsigned 32bit big endian
>>>>> + *
>>>>> + * @typedef odpdrv_u64le_t
>>>>> + * unsigned 64bit little endian
>>>>> + *
>>>>> + * @typedef odpdrv_u64be_t
>>>>> + * unsigned 64bit big endian
>>>>> + *
>>>>> + * @typedef odpdrv_u16sum_t
>>>>> + * unsigned 16bit bitwise
>>>>> + *
>>>>> + * @typedef odpdrv_u32sum_t
>>>>> + * unsigned 32bit bitwise
>>>>> + */
>>>>> +
>>>>> +/*
>>>>> + * Big Endian -> CPU byte order:
>>>>> + */
>>>>> +
>>>>> +/**
>>>>> + * Convert 16bit big endian to cpu native uint16_t
>>>>> + * @param be16  big endian 16bit
>>>>> + * @return  cpu native uint16_t
>>>>> + */
>>>>> +uint16_t odpdrv_be_to_cpu_16(odpdrv_u16be_t be16);
>>>>> +
>>>>> +/**
>>>>> + * Convert 32bit big endian to cpu native uint32_t
>>>>> + * @param be32  big endian 32bit
>>>>> + * @return  cpu native uint32_t
>>>>> + */
>>>>> +uint32_t odpdrv_be_to_cpu_32(odpdrv_u32be_t be32);
>>>>> +
>>>>> +/**
>>>>> + * Convert 64bit big endian to cpu native uint64_t
>>>>> + * @param be64  big endian 64bit
>>>>> + * @return  cpu native uint64_t
>>>>> + */
>>>>> +uint64_t odpdrv_be_to_cpu_64(odpdrv_u64be_t be64);
>>>>> +
>>>>> +/*
>>>>> + * CPU byte order -> Big Endian:
>>>>> + */
>>>>> +
>>>>> +/**
>>>>> + * Convert cpu native uint16_t to 16bit big endian
>>>>> + * @param cpu16  uint16_t in cpu native format
>>>>> + * @return  big endian 16bit
>>>>> + */
>>>>> +odpdrv_u16be_t odpdrv_cpu_to_be_16(uint16_t cpu16);
>>>>> +
>>>>> +/**
>>>>> + * Convert cpu native uint32_t to 32bit big endian
>>>>> + * @param cpu32  uint32_t in cpu native format
>>>>> + * @return  big endian 32bit
>>>>> + */
>>>>> +odpdrv_u32be_t odpdrv_cpu_to_be_32(uint32_t cpu32);
>>>>> +
>>>>> +/**
>>>>> + * Convert cpu native uint64_t to 64bit big endian
>>>>> + * @param cpu64  uint64_t in cpu native format
>>>>> + * @return  big endian 64bit
>>>>> + */
>>>>> +odpdrv_u64be_t odpdrv_cpu_to_be_64(uint64_t cpu64);
>>>>> +
>>>>> +/*
>>>>> + * Little Endian -> CPU byte order:
>>>>> + */
>>>>> +
>>>>> +/**
>>>>> + * Convert 16bit little endian to cpu native uint16_t
>>>>> + * @param le16  little endian 16bit
>>>>> + * @return  cpu native uint16_t
>>>>> + */
>>>>> +uint16_t odpdrv_le_to_cpu_16(odpdrv_u16le_t le16);
>>>>> +
>>>>> +/**
>>>>> + * Convert 32bit little endian to cpu native uint32_t
>>>>> + * @param le32  little endian 32bit
>>>>> + * @return  cpu native uint32_t
>>>>> + */
>>>>> +uint32_t odpdrv_le_to_cpu_32(odpdrv_u32le_t le32);
>>>>> +
>>>>> +/**
>>>>> + * Convert 64bit little endian to cpu native uint64_t
>>>>> + * @param le64  little endian 64bit
>>>>> + * @return  cpu native uint64_t
>>>>> + */
>>>>> +uint64_t odpdrv_le_to_cpu_64(odpdrv_u64le_t le64);
>>>>> +
>>>>> +/*
>>>>> + * CPU byte order -> Little Endian:
>>>>> + */
>>>>> +
>>>>> +/**
>>>>> + * Convert cpu native uint16_t to 16bit little endian
>>>>> + * @param cpu16  uint16_t in cpu native format
>>>>> + * @return  little endian 16bit
>>>>> + */
>>>>> +odpdrv_u16le_t odpdrv_cpu_to_le_16(uint16_t cpu16);
>>>>> +
>>>>> +/**
>>>>> + * Convert cpu native uint32_t to 32bit little endian
>>>>> + * @param cpu32  uint32_t in cpu native format
>>>>> + * @return  little endian 32bit
>>>>> + */
>>>>> +odpdrv_u32le_t odpdrv_cpu_to_le_32(uint32_t cpu32);
>>>>> +
>>>>> +/**
>>>>> + * Convert cpu native uint64_t to 64bit little endian
>>>>> + * @param cpu64  uint64_t in cpu native format
>>>>> + * @return  little endian 64bit
>>>>> + */
>>>>> +odpdrv_u64le_t odpdrv_cpu_to_le_64(uint64_t cpu64);
>>>>> +
>>>>> +/**
>>>>> + * @}
>>>>> + */
>>>>> +
>>>>> +#ifdef __cplusplus
>>>>> +}
>>>>> +#endif
>>>>> +
>>>>> +#endif
>>>>>
>>>>
>>>> _______________________________________________
>>>> lng-odp mailing list
>>>> lng-odp@lists.linaro.org
>>>> https://lists.linaro.org/mailman/listinfo/lng-odp
>>>>
>>>
>>>
>>
>> _______________________________________________
>> lng-odp mailing list
>> lng-odp@lists.linaro.org
>> https://lists.linaro.org/mailman/listinfo/lng-odp
>>
>>
>
>
> --
> Mike Holmes
> Technical Manager - Linaro Networking Group
> Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs
> "Work should be fun and collborative, the rest follows"
>
>
>
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to