Skip to content

Commit

Permalink
net/dpaa2: support soft parser in MC
Browse files Browse the repository at this point in the history
Signed-off-by: Sunil Kumar Kori <sunil.kori@nxp.com>
Reviewed-by: Sachin Saxena <sachin.saxena@nxp.com>
  • Loading branch information
Sunil Kumar Kori authored and Ferruh Yigit committed Oct 8, 2019
1 parent 81c42c8 commit a712067
Show file tree
Hide file tree
Showing 3 changed files with 292 additions and 1 deletion.
117 changes: 117 additions & 0 deletions drivers/net/dpaa2/mc/dpni.c
Original file line number Diff line number Diff line change
Expand Up @@ -2484,3 +2484,120 @@ int dpni_get_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,

return err;
}

int dpni_load_sw_sequence(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
struct dpni_load_ss_cfg *cfg)
{
struct dpni_load_sw_sequence *cmd_params;
struct mc_command cmd = { 0 };

/* prepare command */
cmd.header = mc_encode_cmd_header(DPNI_CMDID_LOAD_SW_SEQUENCE,
cmd_flags,
token);
cmd_params = (struct dpni_load_sw_sequence *)cmd.params;
cmd_params->dest = cfg->dest;
cmd_params->ss_offset = cpu_to_le16(cfg->ss_offset);
cmd_params->ss_size = cpu_to_le16(cfg->ss_size);
cmd_params->ss_iova = cpu_to_le64(cfg->ss_iova);

/* send command to mc*/
return mc_send_command(mc_io, &cmd);
}

int dpni_enable_sw_sequence(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
struct dpni_enable_ss_cfg *cfg)
{
struct dpni_enable_sw_sequence *cmd_params;
struct mc_command cmd = { 0 };

/* prepare command */
cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_SW_SEQUENCE,
cmd_flags,
token);
cmd_params = (struct dpni_enable_sw_sequence *)cmd.params;
cmd_params->dest = cfg->dest;
cmd_params->set_start = cfg->set_start;
cmd_params->hxs = cpu_to_le16(cfg->hxs);
cmd_params->ss_offset = cpu_to_le16(cfg->ss_offset);
cmd_params->param_offset = cfg->param_offset;
cmd_params->param_size = cfg->param_size;
cmd_params->param_iova = cpu_to_le64(cfg->param_iova);

/* send command to mc*/
return mc_send_command(mc_io, &cmd);
}

/**
* dpni_get_sw_sequence_layout() - Get the soft sequence layout
* @mc_io: Pointer to MC portal's I/O object
* @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
* @token: Token of DPNI object
* @src: Source of the layout (WRIOP Rx or Tx)
* @ss_layout_iova: I/O virtual address of 264 bytes DMA-able memory
*
* warning: After calling this function, call dpni_extract_sw_sequence_layout()
* to get the layout.
*
* Return: '0' on Success; error code otherwise.
*/
int dpni_get_sw_sequence_layout(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
enum dpni_soft_sequence_dest src,
uint64_t ss_layout_iova)
{
struct dpni_get_sw_sequence_layout *cmd_params;
struct mc_command cmd = { 0 };

/* prepare command */
cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SW_SEQUENCE_LAYOUT,
cmd_flags,
token);

cmd_params = (struct dpni_get_sw_sequence_layout *)cmd.params;
cmd_params->src = src;
cmd_params->layout_iova = cpu_to_le64(ss_layout_iova);

/* send command to mc*/
return mc_send_command(mc_io, &cmd);
}

/**
* dpni_extract_sw_sequence_layout() - extract the software sequence layout
* @layout: software sequence layout
* @sw_sequence_layout_buf: Zeroed 264 bytes of memory before mapping it
* to DMA
*
* This function has to be called after dpni_get_sw_sequence_layout
*
*/
void dpni_extract_sw_sequence_layout(struct dpni_sw_sequence_layout *layout,
const uint8_t *sw_sequence_layout_buf)
{
const struct dpni_sw_sequence_layout_entry *ext_params;
int i;
uint16_t ss_size, ss_offset;

ext_params = (const struct dpni_sw_sequence_layout_entry *)
sw_sequence_layout_buf;

for (i = 0; i < DPNI_SW_SEQUENCE_LAYOUT_SIZE; i++) {
ss_offset = le16_to_cpu(ext_params[i].ss_offset);
ss_size = le16_to_cpu(ext_params[i].ss_size);

if (ss_offset == 0 && ss_size == 0) {
layout->num_ss = i;
return;
}

layout->ss[i].ss_offset = ss_offset;
layout->ss[i].ss_size = ss_size;
layout->ss[i].param_offset = ext_params[i].param_offset;
layout->ss[i].param_size = ext_params[i].param_size;
}
}
133 changes: 133 additions & 0 deletions drivers/net/dpaa2/mc/fsl_dpni.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,12 @@ struct fsl_mc_io;
*/
#define DPNI_OPT_CUSTOM_CG 0x000200


/**
* Software sequence maximum layout size
*/
#define DPNI_SW_SEQUENCE_LAYOUT_SIZE 33

int dpni_open(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
int dpni_id,
Expand Down Expand Up @@ -1424,4 +1430,131 @@ struct dpni_custom_tpid_cfg {
int dpni_get_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
uint16_t token, struct dpni_custom_tpid_cfg *tpid);

/**
* enum dpni_soft_sequence_dest - Enumeration of WRIOP software sequence
* destinations
* @DPNI_SS_INGRESS: Ingress parser
* @DPNI_SS_EGRESS: Egress parser
*/
enum dpni_soft_sequence_dest {
DPNI_SS_INGRESS = 0,
DPNI_SS_EGRESS = 1,
};

/**
* struct dpni_load_ss_cfg - Structure for Software Sequence load configuration
* @dest: Destination of the Software Sequence: ingress or egress parser
* @ss_size: Size of the Software Sequence
* @ss_offset: The offset where to load the Software Sequence (0x20-0x7FD)
* @ss_iova: I/O virtual address of the Software Sequence
*/
struct dpni_load_ss_cfg {
enum dpni_soft_sequence_dest dest;
uint16_t ss_size;
uint16_t ss_offset;
uint64_t ss_iova;
};

/**
* struct dpni_enable_ss_cfg - Structure for software sequence enable
* configuration
* @dest: Destination of the Software Sequence: ingress or egress parser
* @hxs: HXS to attach the software sequence to
* @set_start: If the Software Sequence or HDR it is attached to is set as
* parser start
* If hxs=DUMMY_LAST_HXS the ss_offset is set directly as parser
* start else the hdr index code is set as parser start
* @ss_offset: The offset of the Software Sequence to enable or set as parse
* start
* @param_size: Size of the software sequence parameters
* @param_offset: Offset in the parameter zone for the software sequence
* parameters
* @param_iova: I/O virtual address of the parameters
*/
struct dpni_enable_ss_cfg {
enum dpni_soft_sequence_dest dest;
uint16_t hxs;
uint8_t set_start;
uint16_t ss_offset;
uint8_t param_size;
uint8_t param_offset;
uint64_t param_iova;
};

/**
* dpni_load_sw_sequence() - Loads a software sequence in parser memory.
* @mc_io: Pointer to MC portal's I/O object
* @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
* @token: Token of DPNI object
* @cfg: Software sequence load configuration
* Return: '0' on Success; Error code otherwise.
*/
int dpni_load_sw_sequence(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
struct dpni_load_ss_cfg *cfg);

/**
* dpni_eanble_sw_sequence() - Enables a software sequence in the parser
* profile
* corresponding to the ingress or egress of the DPNI.
* @mc_io: Pointer to MC portal's I/O object
* @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
* @token: Token of DPNI object
* @cfg: Software sequence enable configuration
* Return: '0' on Success; Error code otherwise.
*/
int dpni_enable_sw_sequence(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
struct dpni_enable_ss_cfg *cfg);

/**
* struct dpni_sw_sequence_layout - Structure for software sequence enable
* configuration
* @num_ss: Number of software sequences returned
* @ss: Array of software sequence entries. The number of valid entries
* must match 'num_ss' value
*/
struct dpni_sw_sequence_layout {
uint8_t num_ss;
struct {
uint16_t ss_offset;
uint16_t ss_size;
uint8_t param_offset;
uint8_t param_size;
} ss[DPNI_SW_SEQUENCE_LAYOUT_SIZE];
};

/**
* dpni_get_sw_sequence_layout() - Get the soft sequence layout
* @mc_io: Pointer to MC portal's I/O object
* @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
* @token: Token of DPNI object
* @src: Source of the layout (WRIOP Rx or Tx)
* @ss_layout_iova: I/O virtual address of 264 bytes DMA-able memory
*
* warning: After calling this function, call dpni_extract_sw_sequence_layout()
* to get the layout
*
* Return: '0' on Success; error code otherwise.
*/
int dpni_get_sw_sequence_layout(struct fsl_mc_io *mc_io,
uint32_t cmd_flags,
uint16_t token,
enum dpni_soft_sequence_dest src,
uint64_t ss_layout_iova);

/**
* dpni_extract_sw_sequence_layout() - extract the software sequence layout
* @layout: software sequence layout
* @sw_sequence_layout_buf: Zeroed 264 bytes of memory before mapping it
* to DMA
*
* This function has to be called after dpni_get_sw_sequence_layout
*
*/
void dpni_extract_sw_sequence_layout(struct dpni_sw_sequence_layout *layout,
const uint8_t *sw_sequence_layout_buf);

#endif /* __FSL_DPNI_H */
43 changes: 42 additions & 1 deletion drivers/net/dpaa2/mc/fsl_dpni_cmd.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
*
* Copyright 2013-2016 Freescale Semiconductor Inc.
* Copyright 2016-2017 NXP
* Copyright 2016-2019 NXP
*
*/
#ifndef _FSL_DPNI_CMD_H
Expand Down Expand Up @@ -97,6 +97,9 @@
#define DPNI_CMDID_SET_OFFLOAD DPNI_CMD(0x26C)
#define DPNI_CMDID_SET_TX_CONFIRMATION_MODE DPNI_CMD(0x266)
#define DPNI_CMDID_GET_TX_CONFIRMATION_MODE DPNI_CMD(0x26D)
#define DPNI_CMDID_LOAD_SW_SEQUENCE DPNI_CMD(0x270)
#define DPNI_CMDID_ENABLE_SW_SEQUENCE DPNI_CMD(0x271)
#define DPNI_CMDID_GET_SW_SEQUENCE_LAYOUT DPNI_CMD(0x272)
#define DPNI_CMDID_SET_OPR DPNI_CMD(0x26e)
#define DPNI_CMDID_GET_OPR DPNI_CMD(0x26f)
#define DPNI_CMDID_SET_RX_FS_DIST DPNI_CMD(0x273)
Expand Down Expand Up @@ -798,5 +801,43 @@ struct dpni_cmd_set_rx_hash_dist {
uint64_t key_cfg_iova;
};

struct dpni_load_sw_sequence {
uint8_t dest;
uint8_t pad0[7];
uint16_t ss_offset;
uint16_t pad1;
uint16_t ss_size;
uint16_t pad2;
uint64_t ss_iova;
};

struct dpni_enable_sw_sequence {
uint8_t dest;
uint8_t pad0[7];
uint16_t ss_offset;
uint16_t hxs;
uint8_t set_start;
uint8_t pad1[3];
uint8_t param_offset;
uint8_t pad2[3];
uint8_t param_size;
uint8_t pad3[3];
uint64_t param_iova;
};

struct dpni_get_sw_sequence_layout {
uint8_t src;
uint8_t pad0[7];
uint64_t layout_iova;
};

struct dpni_sw_sequence_layout_entry {
uint16_t ss_offset;
uint16_t ss_size;
uint8_t param_offset;
uint8_t param_size;
uint16_t pad;
};

#pragma pack(pop)
#endif /* _FSL_DPNI_CMD_H */

0 comments on commit a712067

Please sign in to comment.