Commit 7472f4f2 authored by Iordache Florinel-R70177's avatar Iordache Florinel-R70177 Committed by David S. Miller

fsl/fman: enable FMan Keygen

Add support for the FMan Keygen with a hardcoded scheme to spread
incoming traffic on a FQ range based on source and destination IPs
and ports.
Signed-off-by: default avatarIordache Florinel <florinel.iordache@nxp.com>
Signed-off-by: default avatarMadalin Bucur <madalin.bucur@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ca58ce57
...@@ -4,6 +4,6 @@ obj-$(CONFIG_FSL_FMAN) += fsl_fman.o ...@@ -4,6 +4,6 @@ obj-$(CONFIG_FSL_FMAN) += fsl_fman.o
obj-$(CONFIG_FSL_FMAN) += fsl_fman_port.o obj-$(CONFIG_FSL_FMAN) += fsl_fman_port.o
obj-$(CONFIG_FSL_FMAN) += fsl_mac.o obj-$(CONFIG_FSL_FMAN) += fsl_mac.o
fsl_fman-objs := fman_muram.o fman.o fman_sp.o fsl_fman-objs := fman_muram.o fman.o fman_sp.o fman_keygen.o
fsl_fman_port-objs := fman_port.o fsl_fman_port-objs := fman_port.o
fsl_mac-objs:= mac.o fman_dtsec.o fman_memac.o fman_tgec.o fsl_mac-objs:= mac.o fman_dtsec.o fman_memac.o fman_tgec.o
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include "fman.h" #include "fman.h"
#include "fman_muram.h" #include "fman_muram.h"
#include "fman_keygen.h"
/* General defines */ /* General defines */
#define FMAN_LIODN_TBL 64 /* size of LIODN table */ #define FMAN_LIODN_TBL 64 /* size of LIODN table */
...@@ -56,6 +57,7 @@ ...@@ -56,6 +57,7 @@
/* Modules registers offsets */ /* Modules registers offsets */
#define BMI_OFFSET 0x00080000 #define BMI_OFFSET 0x00080000
#define QMI_OFFSET 0x00080400 #define QMI_OFFSET 0x00080400
#define KG_OFFSET 0x000C1000
#define DMA_OFFSET 0x000C2000 #define DMA_OFFSET 0x000C2000
#define FPM_OFFSET 0x000C3000 #define FPM_OFFSET 0x000C3000
#define IMEM_OFFSET 0x000C4000 #define IMEM_OFFSET 0x000C4000
...@@ -1737,6 +1739,7 @@ static int fman_config(struct fman *fman) ...@@ -1737,6 +1739,7 @@ static int fman_config(struct fman *fman)
fman->qmi_regs = base_addr + QMI_OFFSET; fman->qmi_regs = base_addr + QMI_OFFSET;
fman->dma_regs = base_addr + DMA_OFFSET; fman->dma_regs = base_addr + DMA_OFFSET;
fman->hwp_regs = base_addr + HWP_OFFSET; fman->hwp_regs = base_addr + HWP_OFFSET;
fman->kg_regs = base_addr + KG_OFFSET;
fman->base_addr = base_addr; fman->base_addr = base_addr;
spin_lock_init(&fman->spinlock); spin_lock_init(&fman->spinlock);
...@@ -2009,6 +2012,11 @@ static int fman_init(struct fman *fman) ...@@ -2009,6 +2012,11 @@ static int fman_init(struct fman *fman)
/* Init HW Parser */ /* Init HW Parser */
hwp_init(fman->hwp_regs); hwp_init(fman->hwp_regs);
/* Init KeyGen */
fman->keygen = keygen_init(fman->kg_regs);
if (!fman->keygen)
return -EINVAL;
err = enable(fman, cfg); err = enable(fman, cfg);
if (err != 0) if (err != 0)
return err; return err;
......
...@@ -328,6 +328,7 @@ struct fman { ...@@ -328,6 +328,7 @@ struct fman {
struct fman_qmi_regs __iomem *qmi_regs; struct fman_qmi_regs __iomem *qmi_regs;
struct fman_dma_regs __iomem *dma_regs; struct fman_dma_regs __iomem *dma_regs;
struct fman_hwp_regs __iomem *hwp_regs; struct fman_hwp_regs __iomem *hwp_regs;
struct fman_kg_regs __iomem *kg_regs;
fman_exceptions_cb *exception_cb; fman_exceptions_cb *exception_cb;
fman_bus_error_cb *bus_error_cb; fman_bus_error_cb *bus_error_cb;
/* Spinlock for FMan use */ /* Spinlock for FMan use */
...@@ -336,6 +337,7 @@ struct fman { ...@@ -336,6 +337,7 @@ struct fman {
struct fman_cfg *cfg; struct fman_cfg *cfg;
struct muram_info *muram; struct muram_info *muram;
struct fman_keygen *keygen;
/* cam section in muram */ /* cam section in muram */
unsigned long cam_offset; unsigned long cam_offset;
size_t cam_size; size_t cam_size;
......
This diff is collapsed.
/*
* Copyright 2017 NXP
*
* 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.
*
*
* ALTERNATIVELY, this software may be distributed under the terms of the
* GNU General Public License ("GPL") as published by the Free Software
* Foundation, either version 2 of that License or (at your option) any
* later version.
*
* THIS SOFTWARE IS PROVIDED BY NXP ``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 NXP 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 __KEYGEN_H
#define __KEYGEN_H
#include <linux/io.h>
struct fman_keygen;
struct fman_kg_regs;
struct fman_keygen *keygen_init(struct fman_kg_regs __iomem *keygen_regs);
int keygen_port_hashing_init(struct fman_keygen *keygen, u8 hw_port_id,
u32 hash_base_fqid, u32 hash_size);
#endif /* __KEYGEN_H */
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include "fman.h" #include "fman.h"
#include "fman_port.h" #include "fman_port.h"
#include "fman_sp.h" #include "fman_sp.h"
#include "fman_keygen.h"
/* Queue ID */ /* Queue ID */
#define DFLT_FQ_ID 0x00FFFFFF #define DFLT_FQ_ID 0x00FFFFFF
...@@ -184,6 +185,7 @@ ...@@ -184,6 +185,7 @@
#define NIA_ENG_QMI_ENQ 0x00540000 #define NIA_ENG_QMI_ENQ 0x00540000
#define NIA_ENG_QMI_DEQ 0x00580000 #define NIA_ENG_QMI_DEQ 0x00580000
#define NIA_ENG_HWP 0x00440000 #define NIA_ENG_HWP 0x00440000
#define NIA_ENG_HWK 0x00480000
#define NIA_BMI_AC_ENQ_FRAME 0x00000002 #define NIA_BMI_AC_ENQ_FRAME 0x00000002
#define NIA_BMI_AC_TX_RELEASE 0x000002C0 #define NIA_BMI_AC_TX_RELEASE 0x000002C0
#define NIA_BMI_AC_RELEASE 0x000000C0 #define NIA_BMI_AC_RELEASE 0x000000C0
...@@ -394,6 +396,8 @@ struct fman_port_bpools { ...@@ -394,6 +396,8 @@ struct fman_port_bpools {
struct fman_port_cfg { struct fman_port_cfg {
u32 dflt_fqid; u32 dflt_fqid;
u32 err_fqid; u32 err_fqid;
u32 pcd_base_fqid;
u32 pcd_fqs_count;
u8 deq_sp; u8 deq_sp;
bool deq_high_priority; bool deq_high_priority;
enum fman_port_deq_type deq_type; enum fman_port_deq_type deq_type;
...@@ -1271,6 +1275,10 @@ static void set_rx_dflt_cfg(struct fman_port *port, ...@@ -1271,6 +1275,10 @@ static void set_rx_dflt_cfg(struct fman_port *port,
port_params->specific_params.rx_params.err_fqid; port_params->specific_params.rx_params.err_fqid;
port->cfg->dflt_fqid = port->cfg->dflt_fqid =
port_params->specific_params.rx_params.dflt_fqid; port_params->specific_params.rx_params.dflt_fqid;
port->cfg->pcd_base_fqid =
port_params->specific_params.rx_params.pcd_base_fqid;
port->cfg->pcd_fqs_count =
port_params->specific_params.rx_params.pcd_fqs_count;
} }
static void set_tx_dflt_cfg(struct fman_port *port, static void set_tx_dflt_cfg(struct fman_port *port,
...@@ -1397,6 +1405,24 @@ int fman_port_config(struct fman_port *port, struct fman_port_params *params) ...@@ -1397,6 +1405,24 @@ int fman_port_config(struct fman_port *port, struct fman_port_params *params)
} }
EXPORT_SYMBOL(fman_port_config); EXPORT_SYMBOL(fman_port_config);
/**
* fman_port_use_kg_hash
* port: A pointer to a FM Port module.
* Sets the HW KeyGen or the BMI as HW Parser next engine, enabling
* or bypassing the KeyGen hashing of Rx traffic
*/
void fman_port_use_kg_hash(struct fman_port *port, bool enable)
{
if (enable)
/* After the Parser frames go to KeyGen */
iowrite32be(NIA_ENG_HWK, &port->bmi_regs->rx.fmbm_rfpne);
else
/* After the Parser frames go to BMI */
iowrite32be(NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME,
&port->bmi_regs->rx.fmbm_rfpne);
}
EXPORT_SYMBOL(fman_port_use_kg_hash);
/** /**
* fman_port_init * fman_port_init
* port: A pointer to a FM Port module. * port: A pointer to a FM Port module.
...@@ -1407,9 +1433,10 @@ EXPORT_SYMBOL(fman_port_config); ...@@ -1407,9 +1433,10 @@ EXPORT_SYMBOL(fman_port_config);
*/ */
int fman_port_init(struct fman_port *port) int fman_port_init(struct fman_port *port)
{ {
struct fman_port_init_params params;
struct fman_keygen *keygen;
struct fman_port_cfg *cfg; struct fman_port_cfg *cfg;
int err; int err;
struct fman_port_init_params params;
if (is_init_done(port->cfg)) if (is_init_done(port->cfg))
return -EINVAL; return -EINVAL;
...@@ -1472,6 +1499,17 @@ int fman_port_init(struct fman_port *port) ...@@ -1472,6 +1499,17 @@ int fman_port_init(struct fman_port *port)
if (err) if (err)
return err; return err;
if (port->cfg->pcd_fqs_count) {
keygen = port->dts_params.fman->keygen;
err = keygen_port_hashing_init(keygen, port->port_id,
port->cfg->pcd_base_fqid,
port->cfg->pcd_fqs_count);
if (err)
return err;
fman_port_use_kg_hash(port, true);
}
kfree(port->cfg); kfree(port->cfg);
port->cfg = NULL; port->cfg = NULL;
......
...@@ -100,6 +100,9 @@ struct fman_port; ...@@ -100,6 +100,9 @@ struct fman_port;
struct fman_port_rx_params { struct fman_port_rx_params {
u32 err_fqid; /* Error Queue Id. */ u32 err_fqid; /* Error Queue Id. */
u32 dflt_fqid; /* Default Queue Id. */ u32 dflt_fqid; /* Default Queue Id. */
u32 pcd_base_fqid; /* PCD base Queue Id. */
u32 pcd_fqs_count; /* Number of PCD FQs. */
/* Which external buffer pools are used /* Which external buffer pools are used
* (up to FMAN_PORT_MAX_EXT_POOLS_NUM), and their sizes. * (up to FMAN_PORT_MAX_EXT_POOLS_NUM), and their sizes.
*/ */
...@@ -134,6 +137,8 @@ struct fman_port_params { ...@@ -134,6 +137,8 @@ struct fman_port_params {
int fman_port_config(struct fman_port *port, struct fman_port_params *params); int fman_port_config(struct fman_port *port, struct fman_port_params *params);
void fman_port_use_kg_hash(struct fman_port *port, bool enable);
int fman_port_init(struct fman_port *port); int fman_port_init(struct fman_port *port);
int fman_port_cfg_buf_prefix_content(struct fman_port *port, int fman_port_cfg_buf_prefix_content(struct fman_port *port,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment