mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-17 16:16:10 +07:00
fsl/fman: detect FMan erratum A050385
Detect the presence of the A050385 erratum. Signed-off-by: Madalin Bucur <madalin.bucur@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b54d390086
commit
b281f7b93b
@ -8,3 +8,31 @@ config FSL_FMAN
|
|||||||
help
|
help
|
||||||
Freescale Data-Path Acceleration Architecture Frame Manager
|
Freescale Data-Path Acceleration Architecture Frame Manager
|
||||||
(FMan) support
|
(FMan) support
|
||||||
|
|
||||||
|
config DPAA_ERRATUM_A050385
|
||||||
|
bool
|
||||||
|
depends on ARM64 && FSL_DPAA
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
DPAA FMan erratum A050385 software workaround implementation:
|
||||||
|
align buffers, data start, SG fragment length to avoid FMan DMA
|
||||||
|
splits.
|
||||||
|
FMAN DMA read or writes under heavy traffic load may cause FMAN
|
||||||
|
internal resource leak thus stopping further packet processing.
|
||||||
|
The FMAN internal queue can overflow when FMAN splits single
|
||||||
|
read or write transactions into multiple smaller transactions
|
||||||
|
such that more than 17 AXI transactions are in flight from FMAN
|
||||||
|
to interconnect. When the FMAN internal queue overflows, it can
|
||||||
|
stall further packet processing. The issue can occur with any
|
||||||
|
one of the following three conditions:
|
||||||
|
1. FMAN AXI transaction crosses 4K address boundary (Errata
|
||||||
|
A010022)
|
||||||
|
2. FMAN DMA address for an AXI transaction is not 16 byte
|
||||||
|
aligned, i.e. the last 4 bits of an address are non-zero
|
||||||
|
3. Scatter Gather (SG) frames have more than one SG buffer in
|
||||||
|
the SG list and any one of the buffers, except the last
|
||||||
|
buffer in the SG list has data size that is not a multiple
|
||||||
|
of 16 bytes, i.e., other than 16, 32, 48, 64, etc.
|
||||||
|
With any one of the above three conditions present, there is
|
||||||
|
likelihood of stalled FMAN packet processing, especially under
|
||||||
|
stress with multiple ports injecting line-rate traffic.
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2008-2015 Freescale Semiconductor Inc.
|
* Copyright 2008-2015 Freescale Semiconductor Inc.
|
||||||
|
* Copyright 2020 NXP
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -566,6 +567,10 @@ struct fman_cfg {
|
|||||||
u32 qmi_def_tnums_thresh;
|
u32 qmi_def_tnums_thresh;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_DPAA_ERRATUM_A050385
|
||||||
|
static bool fman_has_err_a050385;
|
||||||
|
#endif
|
||||||
|
|
||||||
static irqreturn_t fman_exceptions(struct fman *fman,
|
static irqreturn_t fman_exceptions(struct fman *fman,
|
||||||
enum fman_exceptions exception)
|
enum fman_exceptions exception)
|
||||||
{
|
{
|
||||||
@ -2518,6 +2523,14 @@ struct fman *fman_bind(struct device *fm_dev)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(fman_bind);
|
EXPORT_SYMBOL(fman_bind);
|
||||||
|
|
||||||
|
#ifdef CONFIG_DPAA_ERRATUM_A050385
|
||||||
|
bool fman_has_errata_a050385(void)
|
||||||
|
{
|
||||||
|
return fman_has_err_a050385;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(fman_has_errata_a050385);
|
||||||
|
#endif
|
||||||
|
|
||||||
static irqreturn_t fman_err_irq(int irq, void *handle)
|
static irqreturn_t fman_err_irq(int irq, void *handle)
|
||||||
{
|
{
|
||||||
struct fman *fman = (struct fman *)handle;
|
struct fman *fman = (struct fman *)handle;
|
||||||
@ -2845,6 +2858,11 @@ static struct fman *read_dts_node(struct platform_device *of_dev)
|
|||||||
goto fman_free;
|
goto fman_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_DPAA_ERRATUM_A050385
|
||||||
|
fman_has_err_a050385 =
|
||||||
|
of_property_read_bool(fm_node, "fsl,erratum-a050385");
|
||||||
|
#endif
|
||||||
|
|
||||||
return fman;
|
return fman;
|
||||||
|
|
||||||
fman_node_put:
|
fman_node_put:
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2008-2015 Freescale Semiconductor Inc.
|
* Copyright 2008-2015 Freescale Semiconductor Inc.
|
||||||
|
* Copyright 2020 NXP
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -398,6 +399,10 @@ u16 fman_get_max_frm(void);
|
|||||||
|
|
||||||
int fman_get_rx_extra_headroom(void);
|
int fman_get_rx_extra_headroom(void);
|
||||||
|
|
||||||
|
#ifdef CONFIG_DPAA_ERRATUM_A050385
|
||||||
|
bool fman_has_errata_a050385(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
struct fman *fman_bind(struct device *dev);
|
struct fman *fman_bind(struct device *dev);
|
||||||
|
|
||||||
#endif /* __FM_H */
|
#endif /* __FM_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user