Commit 2d152760 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'net-ipa-constrain-gsi-interrupts'

Alex Elder says:

====================
net: ipa: constrain GSI interrupts

The goal of this series is to more tightly control when GSI
interrupts are enabled.  This is a long-ish series, so I'll
describe it in parts.

The first patch is actually unrelated...  I forgot to include
it in my previous series (which exposed the GSI layer to the
IPA version).  It is a trivial comments-only update patch.

The second patch defers registering the GSI interrupt handler
until *after* all of the resources that handler touches have
been initialized.  In practice, we don't see this interrupt
that early, but this precludes an obvious problem.

The next two patches are simple changes.  The first just
trivially renames a field.  The second switches from using
constant mask values to using an enumerated type of bit
positions to represent each GSI interrupt type.

The rest implement the "real work."  First, all interrupts
are disabled at initialization time.  Next, we keep track of
a bitmask of enabled GSI interrupt types, updating it each
time we enable or disable one of them.  From there we have
a set of patches that one-by-one enable each interrupt type
only during the period it is required.  This includes allowing
a channel to generate IEOB interrupts only when it has been
enabled.  And finally, the last patch simplifies some code
now that all GSI interrupt types are handled uniformly.
====================

Link: https://lore.kernel.org/r/20201105181407.8006-1-elder@linaro.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents f8ae7bbe 8194be79
This diff is collapsed.
...@@ -156,9 +156,10 @@ struct gsi { ...@@ -156,9 +156,10 @@ struct gsi {
u32 evt_ring_count; u32 evt_ring_count;
struct gsi_channel channel[GSI_CHANNEL_COUNT_MAX]; struct gsi_channel channel[GSI_CHANNEL_COUNT_MAX];
struct gsi_evt_ring evt_ring[GSI_EVT_RING_COUNT_MAX]; struct gsi_evt_ring evt_ring[GSI_EVT_RING_COUNT_MAX];
u32 event_bitmap; u32 event_bitmap; /* allocated event rings */
u32 event_enable_bitmap; u32 modem_channel_bitmap; /* modem channels to allocate */
u32 modem_channel_bitmap; u32 type_enabled_bitmap; /* GSI IRQ types enabled */
u32 ieob_enabled_bitmap; /* IEOB IRQ enabled (event rings) */
struct completion completion; /* for global EE commands */ struct completion completion; /* for global EE commands */
struct mutex mutex; /* protects commands, programming */ struct mutex mutex; /* protects commands, programming */
}; };
......
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
#define CHTYPE_DIR_FMASK GENMASK(3, 3) #define CHTYPE_DIR_FMASK GENMASK(3, 3)
#define EE_FMASK GENMASK(7, 4) #define EE_FMASK GENMASK(7, 4)
#define CHID_FMASK GENMASK(12, 8) #define CHID_FMASK GENMASK(12, 8)
/* The next field is present for GSI v2.0 and above */ /* The next field is present for IPA v4.5 and above */
#define CHTYPE_PROTOCOL_MSB_FMASK GENMASK(13, 13) #define CHTYPE_PROTOCOL_MSB_FMASK GENMASK(13, 13)
#define ERINDEX_FMASK GENMASK(18, 14) #define ERINDEX_FMASK GENMASK(18, 14)
#define CHSTATE_FMASK GENMASK(23, 20) #define CHSTATE_FMASK GENMASK(23, 20)
...@@ -95,7 +95,7 @@ ...@@ -95,7 +95,7 @@
#define WRR_WEIGHT_FMASK GENMASK(3, 0) #define WRR_WEIGHT_FMASK GENMASK(3, 0)
#define MAX_PREFETCH_FMASK GENMASK(8, 8) #define MAX_PREFETCH_FMASK GENMASK(8, 8)
#define USE_DB_ENG_FMASK GENMASK(9, 9) #define USE_DB_ENG_FMASK GENMASK(9, 9)
/* The next field is present for GSI v2.0 and above */ /* The next field is only present for IPA v4.0, v4.1, and v4.2 */
#define USE_ESCAPE_BUF_ONLY_FMASK GENMASK(10, 10) #define USE_ESCAPE_BUF_ONLY_FMASK GENMASK(10, 10)
#define GSI_CH_C_SCRATCH_0_OFFSET(ch) \ #define GSI_CH_C_SCRATCH_0_OFFSET(ch) \
...@@ -238,19 +238,19 @@ ...@@ -238,19 +238,19 @@
#define IRAM_SIZE_FMASK GENMASK(2, 0) #define IRAM_SIZE_FMASK GENMASK(2, 0)
#define IRAM_SIZE_ONE_KB_FVAL 0 #define IRAM_SIZE_ONE_KB_FVAL 0
#define IRAM_SIZE_TWO_KB_FVAL 1 #define IRAM_SIZE_TWO_KB_FVAL 1
/* The next two values are available for GSI v2.0 and above */ /* The next two values are available for IPA v4.0 and above */
#define IRAM_SIZE_TWO_N_HALF_KB_FVAL 2 #define IRAM_SIZE_TWO_N_HALF_KB_FVAL 2
#define IRAM_SIZE_THREE_KB_FVAL 3 #define IRAM_SIZE_THREE_KB_FVAL 3
#define NUM_CH_PER_EE_FMASK GENMASK(7, 3) #define NUM_CH_PER_EE_FMASK GENMASK(7, 3)
#define NUM_EV_PER_EE_FMASK GENMASK(12, 8) #define NUM_EV_PER_EE_FMASK GENMASK(12, 8)
#define GSI_CH_PEND_TRANSLATE_FMASK GENMASK(13, 13) #define GSI_CH_PEND_TRANSLATE_FMASK GENMASK(13, 13)
#define GSI_CH_FULL_LOGIC_FMASK GENMASK(14, 14) #define GSI_CH_FULL_LOGIC_FMASK GENMASK(14, 14)
/* Fields below are present for GSI v2.0 and above */ /* Fields below are present for IPA v4.0 and above */
#define GSI_USE_SDMA_FMASK GENMASK(15, 15) #define GSI_USE_SDMA_FMASK GENMASK(15, 15)
#define GSI_SDMA_N_INT_FMASK GENMASK(18, 16) #define GSI_SDMA_N_INT_FMASK GENMASK(18, 16)
#define GSI_SDMA_MAX_BURST_FMASK GENMASK(26, 19) #define GSI_SDMA_MAX_BURST_FMASK GENMASK(26, 19)
#define GSI_SDMA_N_IOVEC_FMASK GENMASK(29, 27) #define GSI_SDMA_N_IOVEC_FMASK GENMASK(29, 27)
/* Fields below are present for GSI v2.2 and above */ /* Fields below are present for IPA v4.2 and above */
#define GSI_USE_RD_WR_ENG_FMASK GENMASK(30, 30) #define GSI_USE_RD_WR_ENG_FMASK GENMASK(30, 30)
#define GSI_USE_INTER_EE_FMASK GENMASK(31, 31) #define GSI_USE_INTER_EE_FMASK GENMASK(31, 31)
...@@ -262,15 +262,16 @@ ...@@ -262,15 +262,16 @@
GSI_EE_N_CNTXT_TYPE_IRQ_MSK_OFFSET(GSI_EE_AP) GSI_EE_N_CNTXT_TYPE_IRQ_MSK_OFFSET(GSI_EE_AP)
#define GSI_EE_N_CNTXT_TYPE_IRQ_MSK_OFFSET(ee) \ #define GSI_EE_N_CNTXT_TYPE_IRQ_MSK_OFFSET(ee) \
(0x0001f088 + 0x4000 * (ee)) (0x0001f088 + 0x4000 * (ee))
/* The masks below are used for the TYPE_IRQ and TYPE_IRQ_MASK registers */ /* Values here are bit positions in the TYPE_IRQ and TYPE_IRQ_MSK registers */
#define CH_CTRL_FMASK GENMASK(0, 0) enum gsi_irq_type_id {
#define EV_CTRL_FMASK GENMASK(1, 1) GSI_CH_CTRL = 0, /* channel allocation, etc. */
#define GLOB_EE_FMASK GENMASK(2, 2) GSI_EV_CTRL = 1, /* event ring allocation, etc. */
#define IEOB_FMASK GENMASK(3, 3) GSI_GLOB_EE = 2, /* global/general event */
#define INTER_EE_CH_CTRL_FMASK GENMASK(4, 4) GSI_IEOB = 3, /* TRE completion */
#define INTER_EE_EV_CTRL_FMASK GENMASK(5, 5) GSI_INTER_EE_CH_CTRL = 4, /* remote-issued stop/reset (unused) */
#define GENERAL_FMASK GENMASK(6, 6) GSI_INTER_EE_EV_CTRL = 5, /* remote-issued event reset (unused) */
#define GSI_CNTXT_TYPE_IRQ_MSK_ALL GENMASK(6, 0) GSI_GENERAL = 6, /* general-purpose event */
};
#define GSI_CNTXT_SRC_CH_IRQ_OFFSET \ #define GSI_CNTXT_SRC_CH_IRQ_OFFSET \
GSI_EE_N_CNTXT_SRC_CH_IRQ_OFFSET(GSI_EE_AP) GSI_EE_N_CNTXT_SRC_CH_IRQ_OFFSET(GSI_EE_AP)
...@@ -334,7 +335,6 @@ ...@@ -334,7 +335,6 @@
#define GP_INT1_FMASK GENMASK(1, 1) #define GP_INT1_FMASK GENMASK(1, 1)
#define GP_INT2_FMASK GENMASK(2, 2) #define GP_INT2_FMASK GENMASK(2, 2)
#define GP_INT3_FMASK GENMASK(3, 3) #define GP_INT3_FMASK GENMASK(3, 3)
#define GSI_CNTXT_GLOB_IRQ_ALL GENMASK(3, 0)
#define GSI_CNTXT_GSI_IRQ_STTS_OFFSET \ #define GSI_CNTXT_GSI_IRQ_STTS_OFFSET \
GSI_EE_N_CNTXT_GSI_IRQ_STTS_OFFSET(GSI_EE_AP) GSI_EE_N_CNTXT_GSI_IRQ_STTS_OFFSET(GSI_EE_AP)
...@@ -353,7 +353,6 @@ ...@@ -353,7 +353,6 @@
#define BUS_ERROR_FMASK GENMASK(1, 1) #define BUS_ERROR_FMASK GENMASK(1, 1)
#define CMD_FIFO_OVRFLOW_FMASK GENMASK(2, 2) #define CMD_FIFO_OVRFLOW_FMASK GENMASK(2, 2)
#define MCS_STACK_OVRFLOW_FMASK GENMASK(3, 3) #define MCS_STACK_OVRFLOW_FMASK GENMASK(3, 3)
#define GSI_CNTXT_GSI_IRQ_ALL GENMASK(3, 0)
#define GSI_CNTXT_INTSET_OFFSET \ #define GSI_CNTXT_INTSET_OFFSET \
GSI_EE_N_CNTXT_INTSET_OFFSET(GSI_EE_AP) GSI_EE_N_CNTXT_INTSET_OFFSET(GSI_EE_AP)
......
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