[v3,3/8] baseband/la12xx: add support for multiple modems
Checks
Commit Message
This patch add support for multiple modems by assigning
a modem id as dev args in vdev creation.
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
drivers/baseband/la12xx/bbdev_la12xx.c | 60 ++++++++++++++++++++--
drivers/baseband/la12xx/bbdev_la12xx.h | 56 ++++++++++++++++++++
drivers/baseband/la12xx/bbdev_la12xx_ipc.h | 20 ++++++++
3 files changed, 131 insertions(+), 5 deletions(-)
create mode 100644 drivers/baseband/la12xx/bbdev_la12xx.h
create mode 100644 drivers/baseband/la12xx/bbdev_la12xx_ipc.h
Comments
> -----Original Message-----
> From: Hemant Agrawal <hemant.agrawal@nxp.com>
> Sent: Monday, April 12, 2021 10:17 PM
>
> This patch add support for multiple modems by assigning a modem id as dev
> args in vdev creation.
>
> Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> ---
> drivers/baseband/la12xx/bbdev_la12xx.c | 60 ++++++++++++++++++++--
> drivers/baseband/la12xx/bbdev_la12xx.h | 56 ++++++++++++++++++++
> drivers/baseband/la12xx/bbdev_la12xx_ipc.h | 20 ++++++++
> 3 files changed, 131 insertions(+), 5 deletions(-) create mode 100644
> drivers/baseband/la12xx/bbdev_la12xx.h
> create mode 100644 drivers/baseband/la12xx/bbdev_la12xx_ipc.h
>
> diff --git a/drivers/baseband/la12xx/bbdev_la12xx.c
> b/drivers/baseband/la12xx/bbdev_la12xx.c
> index 8d3041ce28..7e9be74bb4 100644
> --- a/drivers/baseband/la12xx/bbdev_la12xx.c
> +++ b/drivers/baseband/la12xx/bbdev_la12xx.c
> @@ -14,6 +14,8 @@
> #include <rte_bbdev_pmd.h>
>
> #include <bbdev_la12xx_pmd_logs.h>
> +#include <bbdev_la12xx_ipc.h>
> +#include <bbdev_la12xx.h>
>
> #define DRIVER_NAME baseband_la12xx
>
> @@ -22,18 +24,18 @@ RTE_LOG_REGISTER(bbdev_la12xx_logtype,
> pmd.bb.la12xx, NOTICE);
> /* Initialisation params structure that can be used by LA12xx BBDEV driver
> */ struct bbdev_la12xx_params {
> uint8_t queues_num; /*< LA12xx BBDEV queues number */
> + int8_t modem_id; /*< LA12xx modem instance id */
> };
>
> #define BBDEV_LA12XX_MAX_NB_QUEUES_ARG "max_nb_queues"
> +#define BBDEV_LA12XX_VDEV_MODEM_ID_ARG "modem"
> +#define LA12XX_MAX_MODEM 4
Minor : best to be consistent with prefix used throught the PMD. A bit of a mix and match.
>
> static const char * const bbdev_la12xx_valid_params[] = {
> BBDEV_LA12XX_MAX_NB_QUEUES_ARG,
> + BBDEV_LA12XX_VDEV_MODEM_ID_ARG,
> };
>
> -/* private data structure */
> -struct bbdev_la12xx_private {
> - unsigned int max_nb_queues; /**< Max number of queues */
> -};
> static inline int
> parse_u16_arg(const char *key, const char *value, void *extra_args) { @@ -
> 52,6 +54,28 @@ parse_u16_arg(const char *key, const char *value, void
> *extra_args)
> return 0;
> }
>
> +/* Parse integer from integer argument */ static int
> +parse_integer_arg(const char *key __rte_unused,
> + const char *value, void *extra_args)
> +{
> + int i;
> + char *end;
> +
> + errno = 0;
> +
> + i = strtol(value, &end, 10);
> + if (*end != 0 || errno != 0 || i < 0 || i > LA12XX_MAX_MODEM) {
> + BBDEV_LA12XX_PMD_ERR("Supported Port IDS are 0 to %d",
> + LA12XX_MAX_MODEM - 1);
> + return -EINVAL;
> + }
> +
> + *((uint32_t *)extra_args) = i;
> +
> + return 0;
> +}
> +
> /* Parse parameters used to create device */ static int
> parse_bbdev_la12xx_params(struct bbdev_la12xx_params *params, @@ -
> 73,6 +97,16 @@ parse_bbdev_la12xx_params(struct bbdev_la12xx_params
> *params,
> if (ret < 0)
> goto exit;
>
> + ret = rte_kvargs_process(kvlist,
> + bbdev_la12xx_valid_params[1],
> + &parse_integer_arg,
> + ¶ms->modem_id);
> +
> + if (params->modem_id >= LA12XX_MAX_MODEM) {
> + BBDEV_LA12XX_PMD_ERR("Invalid modem id, must
> be < %u",
> + LA12XX_MAX_MODEM);
> + goto exit;
> + }
> }
>
> exit:
> @@ -88,6 +122,7 @@ la12xx_bbdev_create(struct rte_vdev_device *vdev, {
> struct rte_bbdev *bbdev;
> const char *name = rte_vdev_device_name(vdev);
> + struct bbdev_la12xx_private *priv;
>
> PMD_INIT_FUNC_TRACE();
>
> @@ -103,6 +138,20 @@ la12xx_bbdev_create(struct rte_vdev_device
> *vdev,
> return -ENOMEM;
> }
>
> + priv = bbdev->data->dev_private;
> + priv->modem_id = init_params->modem_id;
> + /* if modem id is not configured */
> + if (priv->modem_id == -1)
> + priv->modem_id = bbdev->data->dev_id;
> +
> + /* Reset Global variables */
> + priv->num_ldpc_enc_queues = 0;
> + priv->num_ldpc_dec_queues = 0;
> + priv->num_valid_queues = 0;
> + priv->max_nb_queues = init_params->queues_num;
> +
> + BBDEV_LA12XX_PMD_INFO("Setting Up %s: DevId=%d,
> ModemId=%d",
> + name, bbdev->data->dev_id, priv-
> >modem_id);
> bbdev->dev_ops = NULL;
> bbdev->device = &vdev->device;
> bbdev->data->socket_id = 0;
> @@ -174,4 +223,5 @@ static struct rte_vdev_driver bbdev_la12xx_pmd_drv
> = {
>
> RTE_PMD_REGISTER_VDEV(DRIVER_NAME, bbdev_la12xx_pmd_drv);
> RTE_PMD_REGISTER_PARAM_STRING(DRIVER_NAME,
> - BBDEV_LA12XX_MAX_NB_QUEUES_ARG"=<int>");
> + BBDEV_LA12XX_MAX_NB_QUEUES_ARG"=<int>"
> + BBDEV_LA12XX_VDEV_MODEM_ID_ARG "=<int> ");
> diff --git a/drivers/baseband/la12xx/bbdev_la12xx.h
> b/drivers/baseband/la12xx/bbdev_la12xx.h
> new file mode 100644
> index 0000000000..5228502331
> --- /dev/null
> +++ b/drivers/baseband/la12xx/bbdev_la12xx.h
> @@ -0,0 +1,56 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright 2020-2021 NXP
> + */
> +
> +#ifndef __BBDEV_LA12XX_H__
> +#define __BBDEV_LA12XX_H__
> +
> +#define BBDEV_IPC_ENC_OP_TYPE 1
> +#define BBDEV_IPC_DEC_OP_TYPE 2
> +
> +#define MAX_LDPC_ENC_FECA_QUEUES 4
> +#define MAX_LDPC_DEC_FECA_QUEUES 4
Minor: What does FECA refers to through the serie? FEC accerator?
For consistency I would rename _ENC_OP_TYPE to _LDPC_ENC_OP_TYPE to distingish with 4G.
Same comment as above from prefix
> +
> +#define MAX_CHANNEL_DEPTH 16
> +/* private data structure */
> +struct bbdev_la12xx_private {
> + void *ipc_priv;
> + uint8_t num_valid_queues;
> + uint8_t max_nb_queues;
> + uint8_t num_ldpc_enc_queues;
> + uint8_t num_ldpc_dec_queues;
> + int8_t modem_id;
> + struct bbdev_la12xx_q_priv *queues_priv[32]; };
> +
> +struct hugepage_info {
> + void *vaddr;
> + phys_addr_t paddr;
> + size_t len;
> +};
This should be in the next commit I believe.
Notably as this hugepage_info usage is a bit odd.
> +
> +struct bbdev_la12xx_q_priv {
> + struct bbdev_la12xx_private *bbdev_priv;
> + uint32_t q_id; /**< Channel ID */
> + uint32_t feca_blk_id; /** FECA block ID for processing */
> + uint32_t feca_blk_id_be32; /**< FECA Block ID for this queue */
> + uint8_t en_napi; /* 0: napi disabled, 1: napi enabled */
> + uint16_t queue_size; /**< Queue depth */
> + int32_t eventfd; /**< Event FD value */
> + enum rte_bbdev_op_type op_type; /**< Operation type */
> + uint32_t la12xx_core_id;
> + /* LA12xx core ID on which this will be scheduled */
> + struct rte_mempool *mp; /**< Pool from where buffers would be
> cut */
> + void *bbdev_op[MAX_CHANNEL_DEPTH];
> + /**< Stores bbdev op for each index */
> + void *msg_ch_vaddr[MAX_CHANNEL_DEPTH];
> + /**< Stores msg channel addr for modem->host */
> + uint32_t host_pi; /**< Producer_Index for HOST->MODEM */
> + uint32_t host_ci; /**< Consumer Index for MODEM->HOST */
> + host_ipc_params_t *host_params; /**< Host parameters */ };
> +
> +#define lower_32_bits(x) ((uint32_t)((uint64_t)x)) #define
> +upper_32_bits(x) ((uint32_t)(((uint64_t)(x) >> 16) >> 16))
> +
> +#endif
> diff --git a/drivers/baseband/la12xx/bbdev_la12xx_ipc.h
> b/drivers/baseband/la12xx/bbdev_la12xx_ipc.h
> new file mode 100644
> index 0000000000..9aa5562981
> --- /dev/null
> +++ b/drivers/baseband/la12xx/bbdev_la12xx_ipc.h
> @@ -0,0 +1,20 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright 2020-2021 NXP
> + */
> +#ifndef __BBDEV_LA12XX_IPC_H__
> +#define __BBDEV_LA12XX_IPC_H__
> +
> +/** No. of max channel per instance */
> +#define IPC_MAX_DEPTH (16)
> +
> +/* This shared memory would be on the host side which have copy of some
> + * of the parameters which are also part of Shared BD ring. Read access
> + * of these parameters from the host side would not be over PCI.
> + */
> +typedef struct host_ipc_params {
> + volatile uint32_t pi;
> + volatile uint32_t ci;
> + volatile uint32_t modem_ptr[IPC_MAX_DEPTH]; } __rte_packed
> +host_ipc_params_t;
> +
> +#endif
> --
> 2.17.1
On 4/14/2021 5:32 AM, Chautru, Nicolas wrote:
>> -----Original Message-----
>> From: Hemant Agrawal <hemant.agrawal@nxp.com>
>> Sent: Monday, April 12, 2021 10:17 PM
>>
>> This patch add support for multiple modems by assigning a modem id as dev
>> args in vdev creation.
>>
>> Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
>> ---
>> drivers/baseband/la12xx/bbdev_la12xx.c | 60 ++++++++++++++++++++--
>> drivers/baseband/la12xx/bbdev_la12xx.h | 56 ++++++++++++++++++++
>> drivers/baseband/la12xx/bbdev_la12xx_ipc.h | 20 ++++++++
>> 3 files changed, 131 insertions(+), 5 deletions(-) create mode 100644
>> drivers/baseband/la12xx/bbdev_la12xx.h
>> create mode 100644 drivers/baseband/la12xx/bbdev_la12xx_ipc.h
>>
>> diff --git a/drivers/baseband/la12xx/bbdev_la12xx.c
>> b/drivers/baseband/la12xx/bbdev_la12xx.c
>> index 8d3041ce28..7e9be74bb4 100644
>> --- a/drivers/baseband/la12xx/bbdev_la12xx.c
>> +++ b/drivers/baseband/la12xx/bbdev_la12xx.c
>> @@ -14,6 +14,8 @@
>> #include <rte_bbdev_pmd.h>
>>
>> #include <bbdev_la12xx_pmd_logs.h>
>> +#include <bbdev_la12xx_ipc.h>
>> +#include <bbdev_la12xx.h>
>>
>> #define DRIVER_NAME baseband_la12xx
>>
>> @@ -22,18 +24,18 @@ RTE_LOG_REGISTER(bbdev_la12xx_logtype,
>> pmd.bb.la12xx, NOTICE);
>> /* Initialisation params structure that can be used by LA12xx BBDEV driver
>> */ struct bbdev_la12xx_params {
>> uint8_t queues_num; /*< LA12xx BBDEV queues number */
>> + int8_t modem_id; /*< LA12xx modem instance id */
>> };
>>
>> #define BBDEV_LA12XX_MAX_NB_QUEUES_ARG "max_nb_queues"
>> +#define BBDEV_LA12XX_VDEV_MODEM_ID_ARG "modem"
>> +#define LA12XX_MAX_MODEM 4
> Minor : best to be consistent with prefix used throught the PMD. A bit of a mix and match.
ok
>
>> static const char * const bbdev_la12xx_valid_params[] = {
>> BBDEV_LA12XX_MAX_NB_QUEUES_ARG,
>> + BBDEV_LA12XX_VDEV_MODEM_ID_ARG,
>> };
>>
>> -/* private data structure */
>> -struct bbdev_la12xx_private {
>> - unsigned int max_nb_queues; /**< Max number of queues */
>> -};
>> static inline int
>> parse_u16_arg(const char *key, const char *value, void *extra_args) { @@ -
>> 52,6 +54,28 @@ parse_u16_arg(const char *key, const char *value, void
>> *extra_args)
>> return 0;
>> }
>>
>> +/* Parse integer from integer argument */ static int
>> +parse_integer_arg(const char *key __rte_unused,
>> + const char *value, void *extra_args)
>> +{
>> + int i;
>> + char *end;
>> +
>> + errno = 0;
>> +
>> + i = strtol(value, &end, 10);
>> + if (*end != 0 || errno != 0 || i < 0 || i > LA12XX_MAX_MODEM) {
>> + BBDEV_LA12XX_PMD_ERR("Supported Port IDS are 0 to %d",
>> + LA12XX_MAX_MODEM - 1);
>> + return -EINVAL;
>> + }
>> +
>> + *((uint32_t *)extra_args) = i;
>> +
>> + return 0;
>> +}
>> +
>> /* Parse parameters used to create device */ static int
>> parse_bbdev_la12xx_params(struct bbdev_la12xx_params *params, @@ -
>> 73,6 +97,16 @@ parse_bbdev_la12xx_params(struct bbdev_la12xx_params
>> *params,
>> if (ret < 0)
>> goto exit;
>>
>> + ret = rte_kvargs_process(kvlist,
>> + bbdev_la12xx_valid_params[1],
>> + &parse_integer_arg,
>> + ¶ms->modem_id);
>> +
>> + if (params->modem_id >= LA12XX_MAX_MODEM) {
>> + BBDEV_LA12XX_PMD_ERR("Invalid modem id, must
>> be < %u",
>> + LA12XX_MAX_MODEM);
>> + goto exit;
>> + }
>> }
>>
>> exit:
>> @@ -88,6 +122,7 @@ la12xx_bbdev_create(struct rte_vdev_device *vdev, {
>> struct rte_bbdev *bbdev;
>> const char *name = rte_vdev_device_name(vdev);
>> + struct bbdev_la12xx_private *priv;
>>
>> PMD_INIT_FUNC_TRACE();
>>
>> @@ -103,6 +138,20 @@ la12xx_bbdev_create(struct rte_vdev_device
>> *vdev,
>> return -ENOMEM;
>> }
>>
>> + priv = bbdev->data->dev_private;
>> + priv->modem_id = init_params->modem_id;
>> + /* if modem id is not configured */
>> + if (priv->modem_id == -1)
>> + priv->modem_id = bbdev->data->dev_id;
>> +
>> + /* Reset Global variables */
>> + priv->num_ldpc_enc_queues = 0;
>> + priv->num_ldpc_dec_queues = 0;
>> + priv->num_valid_queues = 0;
>> + priv->max_nb_queues = init_params->queues_num;
>> +
>> + BBDEV_LA12XX_PMD_INFO("Setting Up %s: DevId=%d,
>> ModemId=%d",
>> + name, bbdev->data->dev_id, priv-
>>> modem_id);
>> bbdev->dev_ops = NULL;
>> bbdev->device = &vdev->device;
>> bbdev->data->socket_id = 0;
>> @@ -174,4 +223,5 @@ static struct rte_vdev_driver bbdev_la12xx_pmd_drv
>> = {
>>
>> RTE_PMD_REGISTER_VDEV(DRIVER_NAME, bbdev_la12xx_pmd_drv);
>> RTE_PMD_REGISTER_PARAM_STRING(DRIVER_NAME,
>> - BBDEV_LA12XX_MAX_NB_QUEUES_ARG"=<int>");
>> + BBDEV_LA12XX_MAX_NB_QUEUES_ARG"=<int>"
>> + BBDEV_LA12XX_VDEV_MODEM_ID_ARG "=<int> ");
>> diff --git a/drivers/baseband/la12xx/bbdev_la12xx.h
>> b/drivers/baseband/la12xx/bbdev_la12xx.h
>> new file mode 100644
>> index 0000000000..5228502331
>> --- /dev/null
>> +++ b/drivers/baseband/la12xx/bbdev_la12xx.h
>> @@ -0,0 +1,56 @@
>> +/* SPDX-License-Identifier: BSD-3-Clause
>> + * Copyright 2020-2021 NXP
>> + */
>> +
>> +#ifndef __BBDEV_LA12XX_H__
>> +#define __BBDEV_LA12XX_H__
>> +
>> +#define BBDEV_IPC_ENC_OP_TYPE 1
>> +#define BBDEV_IPC_DEC_OP_TYPE 2
>> +
>> +#define MAX_LDPC_ENC_FECA_QUEUES 4
>> +#define MAX_LDPC_DEC_FECA_QUEUES 4
> Minor: What does FECA refers to through the serie? FEC accerator?
>
> For consistency I would rename _ENC_OP_TYPE to _LDPC_ENC_OP_TYPE to distingish with 4G.
> Same comment as above from prefix
No, I disagree
IPC has nothing to do with LDPC. It is abstract. It can be used of LDPC,
Polar etc.
We will add prefix as suggested.
>> +
>> +#define MAX_CHANNEL_DEPTH 16
>> +/* private data structure */
>> +struct bbdev_la12xx_private {
>> + void *ipc_priv;
>> + uint8_t num_valid_queues;
>> + uint8_t max_nb_queues;
>> + uint8_t num_ldpc_enc_queues;
>> + uint8_t num_ldpc_dec_queues;
>> + int8_t modem_id;
>> + struct bbdev_la12xx_q_priv *queues_priv[32]; };
>> +
>> +struct hugepage_info {
>> + void *vaddr;
>> + phys_addr_t paddr;
>> + size_t len;
>> +};
> This should be in the next commit I believe.
> Notably as this hugepage_info usage is a bit odd.
Ya, we need to do some manual work w.r.t phy to virt conversions etc. So
this is needed.
>
>> +
>> +struct bbdev_la12xx_q_priv {
>> + struct bbdev_la12xx_private *bbdev_priv;
>> + uint32_t q_id; /**< Channel ID */
>> + uint32_t feca_blk_id; /** FECA block ID for processing */
>> + uint32_t feca_blk_id_be32; /**< FECA Block ID for this queue */
>> + uint8_t en_napi; /* 0: napi disabled, 1: napi enabled */
>> + uint16_t queue_size; /**< Queue depth */
>> + int32_t eventfd; /**< Event FD value */
>> + enum rte_bbdev_op_type op_type; /**< Operation type */
>> + uint32_t la12xx_core_id;
>> + /* LA12xx core ID on which this will be scheduled */
>> + struct rte_mempool *mp; /**< Pool from where buffers would be
>> cut */
>> + void *bbdev_op[MAX_CHANNEL_DEPTH];
>> + /**< Stores bbdev op for each index */
>> + void *msg_ch_vaddr[MAX_CHANNEL_DEPTH];
>> + /**< Stores msg channel addr for modem->host */
>> + uint32_t host_pi; /**< Producer_Index for HOST->MODEM */
>> + uint32_t host_ci; /**< Consumer Index for MODEM->HOST */
>> + host_ipc_params_t *host_params; /**< Host parameters */ };
>> +
>> +#define lower_32_bits(x) ((uint32_t)((uint64_t)x)) #define
>> +upper_32_bits(x) ((uint32_t)(((uint64_t)(x) >> 16) >> 16))
>> +
>> +#endif
>> diff --git a/drivers/baseband/la12xx/bbdev_la12xx_ipc.h
>> b/drivers/baseband/la12xx/bbdev_la12xx_ipc.h
>> new file mode 100644
>> index 0000000000..9aa5562981
>> --- /dev/null
>> +++ b/drivers/baseband/la12xx/bbdev_la12xx_ipc.h
>> @@ -0,0 +1,20 @@
>> +/* SPDX-License-Identifier: BSD-3-Clause
>> + * Copyright 2020-2021 NXP
>> + */
>> +#ifndef __BBDEV_LA12XX_IPC_H__
>> +#define __BBDEV_LA12XX_IPC_H__
>> +
>> +/** No. of max channel per instance */
>> +#define IPC_MAX_DEPTH (16)
>> +
>> +/* This shared memory would be on the host side which have copy of some
>> + * of the parameters which are also part of Shared BD ring. Read access
>> + * of these parameters from the host side would not be over PCI.
>> + */
>> +typedef struct host_ipc_params {
>> + volatile uint32_t pi;
>> + volatile uint32_t ci;
>> + volatile uint32_t modem_ptr[IPC_MAX_DEPTH]; } __rte_packed
>> +host_ipc_params_t;
>> +
>> +#endif
>> --
>> 2.17.1
@@ -14,6 +14,8 @@
#include <rte_bbdev_pmd.h>
#include <bbdev_la12xx_pmd_logs.h>
+#include <bbdev_la12xx_ipc.h>
+#include <bbdev_la12xx.h>
#define DRIVER_NAME baseband_la12xx
@@ -22,18 +24,18 @@ RTE_LOG_REGISTER(bbdev_la12xx_logtype, pmd.bb.la12xx, NOTICE);
/* Initialisation params structure that can be used by LA12xx BBDEV driver */
struct bbdev_la12xx_params {
uint8_t queues_num; /*< LA12xx BBDEV queues number */
+ int8_t modem_id; /*< LA12xx modem instance id */
};
#define BBDEV_LA12XX_MAX_NB_QUEUES_ARG "max_nb_queues"
+#define BBDEV_LA12XX_VDEV_MODEM_ID_ARG "modem"
+#define LA12XX_MAX_MODEM 4
static const char * const bbdev_la12xx_valid_params[] = {
BBDEV_LA12XX_MAX_NB_QUEUES_ARG,
+ BBDEV_LA12XX_VDEV_MODEM_ID_ARG,
};
-/* private data structure */
-struct bbdev_la12xx_private {
- unsigned int max_nb_queues; /**< Max number of queues */
-};
static inline int
parse_u16_arg(const char *key, const char *value, void *extra_args)
{
@@ -52,6 +54,28 @@ parse_u16_arg(const char *key, const char *value, void *extra_args)
return 0;
}
+/* Parse integer from integer argument */
+static int
+parse_integer_arg(const char *key __rte_unused,
+ const char *value, void *extra_args)
+{
+ int i;
+ char *end;
+
+ errno = 0;
+
+ i = strtol(value, &end, 10);
+ if (*end != 0 || errno != 0 || i < 0 || i > LA12XX_MAX_MODEM) {
+ BBDEV_LA12XX_PMD_ERR("Supported Port IDS are 0 to %d",
+ LA12XX_MAX_MODEM - 1);
+ return -EINVAL;
+ }
+
+ *((uint32_t *)extra_args) = i;
+
+ return 0;
+}
+
/* Parse parameters used to create device */
static int
parse_bbdev_la12xx_params(struct bbdev_la12xx_params *params,
@@ -73,6 +97,16 @@ parse_bbdev_la12xx_params(struct bbdev_la12xx_params *params,
if (ret < 0)
goto exit;
+ ret = rte_kvargs_process(kvlist,
+ bbdev_la12xx_valid_params[1],
+ &parse_integer_arg,
+ ¶ms->modem_id);
+
+ if (params->modem_id >= LA12XX_MAX_MODEM) {
+ BBDEV_LA12XX_PMD_ERR("Invalid modem id, must be < %u",
+ LA12XX_MAX_MODEM);
+ goto exit;
+ }
}
exit:
@@ -88,6 +122,7 @@ la12xx_bbdev_create(struct rte_vdev_device *vdev,
{
struct rte_bbdev *bbdev;
const char *name = rte_vdev_device_name(vdev);
+ struct bbdev_la12xx_private *priv;
PMD_INIT_FUNC_TRACE();
@@ -103,6 +138,20 @@ la12xx_bbdev_create(struct rte_vdev_device *vdev,
return -ENOMEM;
}
+ priv = bbdev->data->dev_private;
+ priv->modem_id = init_params->modem_id;
+ /* if modem id is not configured */
+ if (priv->modem_id == -1)
+ priv->modem_id = bbdev->data->dev_id;
+
+ /* Reset Global variables */
+ priv->num_ldpc_enc_queues = 0;
+ priv->num_ldpc_dec_queues = 0;
+ priv->num_valid_queues = 0;
+ priv->max_nb_queues = init_params->queues_num;
+
+ BBDEV_LA12XX_PMD_INFO("Setting Up %s: DevId=%d, ModemId=%d",
+ name, bbdev->data->dev_id, priv->modem_id);
bbdev->dev_ops = NULL;
bbdev->device = &vdev->device;
bbdev->data->socket_id = 0;
@@ -174,4 +223,5 @@ static struct rte_vdev_driver bbdev_la12xx_pmd_drv = {
RTE_PMD_REGISTER_VDEV(DRIVER_NAME, bbdev_la12xx_pmd_drv);
RTE_PMD_REGISTER_PARAM_STRING(DRIVER_NAME,
- BBDEV_LA12XX_MAX_NB_QUEUES_ARG"=<int>");
+ BBDEV_LA12XX_MAX_NB_QUEUES_ARG"=<int>"
+ BBDEV_LA12XX_VDEV_MODEM_ID_ARG "=<int> ");
new file mode 100644
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2020-2021 NXP
+ */
+
+#ifndef __BBDEV_LA12XX_H__
+#define __BBDEV_LA12XX_H__
+
+#define BBDEV_IPC_ENC_OP_TYPE 1
+#define BBDEV_IPC_DEC_OP_TYPE 2
+
+#define MAX_LDPC_ENC_FECA_QUEUES 4
+#define MAX_LDPC_DEC_FECA_QUEUES 4
+
+#define MAX_CHANNEL_DEPTH 16
+/* private data structure */
+struct bbdev_la12xx_private {
+ void *ipc_priv;
+ uint8_t num_valid_queues;
+ uint8_t max_nb_queues;
+ uint8_t num_ldpc_enc_queues;
+ uint8_t num_ldpc_dec_queues;
+ int8_t modem_id;
+ struct bbdev_la12xx_q_priv *queues_priv[32];
+};
+
+struct hugepage_info {
+ void *vaddr;
+ phys_addr_t paddr;
+ size_t len;
+};
+
+struct bbdev_la12xx_q_priv {
+ struct bbdev_la12xx_private *bbdev_priv;
+ uint32_t q_id; /**< Channel ID */
+ uint32_t feca_blk_id; /** FECA block ID for processing */
+ uint32_t feca_blk_id_be32; /**< FECA Block ID for this queue */
+ uint8_t en_napi; /* 0: napi disabled, 1: napi enabled */
+ uint16_t queue_size; /**< Queue depth */
+ int32_t eventfd; /**< Event FD value */
+ enum rte_bbdev_op_type op_type; /**< Operation type */
+ uint32_t la12xx_core_id;
+ /* LA12xx core ID on which this will be scheduled */
+ struct rte_mempool *mp; /**< Pool from where buffers would be cut */
+ void *bbdev_op[MAX_CHANNEL_DEPTH];
+ /**< Stores bbdev op for each index */
+ void *msg_ch_vaddr[MAX_CHANNEL_DEPTH];
+ /**< Stores msg channel addr for modem->host */
+ uint32_t host_pi; /**< Producer_Index for HOST->MODEM */
+ uint32_t host_ci; /**< Consumer Index for MODEM->HOST */
+ host_ipc_params_t *host_params; /**< Host parameters */
+};
+
+#define lower_32_bits(x) ((uint32_t)((uint64_t)x))
+#define upper_32_bits(x) ((uint32_t)(((uint64_t)(x) >> 16) >> 16))
+
+#endif
new file mode 100644
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2020-2021 NXP
+ */
+#ifndef __BBDEV_LA12XX_IPC_H__
+#define __BBDEV_LA12XX_IPC_H__
+
+/** No. of max channel per instance */
+#define IPC_MAX_DEPTH (16)
+
+/* This shared memory would be on the host side which have copy of some
+ * of the parameters which are also part of Shared BD ring. Read access
+ * of these parameters from the host side would not be over PCI.
+ */
+typedef struct host_ipc_params {
+ volatile uint32_t pi;
+ volatile uint32_t ci;
+ volatile uint32_t modem_ptr[IPC_MAX_DEPTH];
+} __rte_packed host_ipc_params_t;
+
+#endif