Skip to content

Commit 330ce9d

Browse files
Alex Elderkuba-moo
authored andcommitted
net: ipa: define more fields for GSI registers
Beyond the CH_C_QOS register, two other registers whose offset is related to channel number have fields within them. Define the fields within the CH_C_CNTXT_0 GSI register, using an enumerated type to identify the register's fields, and define an array of field masks to use for that register's reg structure. For the CH_C_CNTXT_1 GSI register, ch_c_cntxt_1_length_encode() previously hid the difference in bit width in the channel ring length field. Instead, define a new field CH_R_LENGTH and encode the ring size with reg_encode(). Signed-off-by: Alex Elder <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent f50ca7c commit 330ce9d

File tree

7 files changed

+130
-40
lines changed

7 files changed

+130
-40
lines changed

drivers/net/ipa/gsi.c

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,6 @@ static void gsi_validate_build(void)
164164
*/
165165
BUILD_BUG_ON(!is_power_of_2(GSI_RING_ELEMENT_SIZE));
166166

167-
/* The channel element size must fit in this field */
168-
BUILD_BUG_ON(GSI_RING_ELEMENT_SIZE > field_max(ELEMENT_SIZE_FMASK));
169-
170167
/* The event ring element size must fit in this field */
171168
BUILD_BUG_ON(GSI_RING_ELEMENT_SIZE > field_max(EV_ELEMENT_SIZE_FMASK));
172169
}
@@ -185,26 +182,18 @@ static bool gsi_channel_initialized(struct gsi_channel *channel)
185182

186183
/* Encode the channel protocol for the CH_C_CNTXT_0 register */
187184
static u32 ch_c_cntxt_0_type_encode(enum ipa_version version,
185+
const struct reg *reg,
188186
enum gsi_channel_type type)
189187
{
190188
u32 val;
191189

192-
val = u32_encode_bits(type, CHTYPE_PROTOCOL_FMASK);
190+
val = reg_encode(reg, CHTYPE_PROTOCOL, type);
193191
if (version < IPA_VERSION_4_5)
194192
return val;
195193

196-
type >>= hweight32(CHTYPE_PROTOCOL_FMASK);
197-
198-
return val | u32_encode_bits(type, CHTYPE_PROTOCOL_MSB_FMASK);
199-
}
200-
201-
/* Encode a channel ring buffer length for the CH_C_CNTXT_1 register */
202-
static u32 ch_c_cntxt_1_length_encode(enum ipa_version version, u32 length)
203-
{
204-
if (version < IPA_VERSION_4_9)
205-
return u32_encode_bits(length, GENMASK(15, 0));
194+
type >>= hweight32(reg_fmask(reg, CHTYPE_PROTOCOL));
206195

207-
return u32_encode_bits(length, GENMASK(19, 0));
196+
return val | reg_encode(reg, CHTYPE_PROTOCOL_MSB, type);
208197
}
209198

210199
/* Encode the length of the event channel ring buffer for the
@@ -544,7 +533,7 @@ static enum gsi_channel_state gsi_channel_state(struct gsi_channel *channel)
544533
reg = gsi_reg(gsi, CH_C_CNTXT_0);
545534
val = ioread32(virt + reg_n_offset(reg, channel_id));
546535

547-
return u32_get_bits(val, CHSTATE_FMASK);
536+
return reg_decode(reg, CHSTATE, val);
548537
}
549538

550539
/* Issue a channel command and wait for it to complete */
@@ -862,15 +851,15 @@ static void gsi_channel_program(struct gsi_channel *channel, bool doorbell)
862851
reg = gsi_reg(gsi, CH_C_CNTXT_0);
863852

864853
/* We program all channels as GPI type/protocol */
865-
val = ch_c_cntxt_0_type_encode(gsi->version, GSI_CHANNEL_TYPE_GPI);
854+
val = ch_c_cntxt_0_type_encode(gsi->version, reg, GSI_CHANNEL_TYPE_GPI);
866855
if (channel->toward_ipa)
867-
val |= CHTYPE_DIR_FMASK;
868-
val |= u32_encode_bits(channel->evt_ring_id, ERINDEX_FMASK);
869-
val |= u32_encode_bits(GSI_RING_ELEMENT_SIZE, ELEMENT_SIZE_FMASK);
856+
val |= reg_bit(reg, CHTYPE_DIR);
857+
val |= reg_encode(reg, ERINDEX, channel->evt_ring_id);
858+
val |= reg_encode(reg, ELEMENT_SIZE, GSI_RING_ELEMENT_SIZE);
870859
iowrite32(val, gsi->virt + reg_n_offset(reg, channel_id));
871860

872861
reg = gsi_reg(gsi, CH_C_CNTXT_1);
873-
val = ch_c_cntxt_1_length_encode(gsi->version, size);
862+
val = reg_encode(reg, CH_R_LENGTH, size);
874863
iowrite32(val, gsi->virt + reg_n_offset(reg, channel_id));
875864

876865
/* The context 2 and 3 registers store the low-order and

drivers/net/ipa/gsi_reg.h

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,16 @@ enum gsi_reg_id {
9696
};
9797

9898
/* CH_C_CNTXT_0 register */
99-
#define CHTYPE_PROTOCOL_FMASK GENMASK(2, 0)
100-
#define CHTYPE_DIR_FMASK GENMASK(3, 3)
101-
#define EE_FMASK GENMASK(7, 4)
102-
#define CHID_FMASK GENMASK(12, 8)
103-
/* The next field is present for IPA v4.5 and above */
104-
#define CHTYPE_PROTOCOL_MSB_FMASK GENMASK(13, 13)
105-
#define ERINDEX_FMASK GENMASK(18, 14)
106-
#define CHSTATE_FMASK GENMASK(23, 20)
107-
#define ELEMENT_SIZE_FMASK GENMASK(31, 24)
99+
enum gsi_reg_ch_c_cntxt_0_field_id {
100+
CHTYPE_PROTOCOL,
101+
CHTYPE_DIR,
102+
CH_EE,
103+
CHID,
104+
CHTYPE_PROTOCOL_MSB, /* IPA v4.9+ */
105+
ERINDEX,
106+
CHSTATE,
107+
ELEMENT_SIZE,
108+
};
108109

109110
/** enum gsi_channel_type - CHTYPE_PROTOCOL field values in CH_C_CNTXT_0 */
110111
enum gsi_channel_type {
@@ -120,6 +121,11 @@ enum gsi_channel_type {
120121
GSI_CHANNEL_TYPE_11AD = 0x9,
121122
};
122123

124+
/* CH_C_CNTXT_1 register */
125+
enum gsi_reg_ch_c_cntxt_1_field_id {
126+
CH_R_LENGTH,
127+
};
128+
123129
/* CH_C_QOS register */
124130
enum gsi_reg_ch_c_qos_field_id {
125131
WRR_WEIGHT,

drivers/net/ipa/reg/gsi_reg-v3.1.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,28 @@ REG(INTER_EE_SRC_EV_CH_IRQ_MSK, inter_ee_src_ev_ch_irq_msk,
1818

1919
/* All other register offsets are relative to gsi->virt */
2020

21-
REG_STRIDE(CH_C_CNTXT_0, ch_c_cntxt_0, 0x0001c000 + 0x4000 * GSI_EE_AP, 0x80);
21+
static const u32 reg_ch_c_cntxt_0_fmask[] = {
22+
[CHTYPE_PROTOCOL] = GENMASK(2, 0),
23+
[CHTYPE_DIR] = BIT(3),
24+
[CH_EE] = GENMASK(7, 4),
25+
[CHID] = GENMASK(12, 8),
26+
/* Bit 13 reserved */
27+
[ERINDEX] = GENMASK(18, 14),
28+
/* Bit 19 reserved */
29+
[CHSTATE] = GENMASK(23, 20),
30+
[ELEMENT_SIZE] = GENMASK(31, 24),
31+
};
32+
33+
REG_STRIDE_FIELDS(CH_C_CNTXT_0, ch_c_cntxt_0,
34+
0x0001c000 + 0x4000 * GSI_EE_AP, 0x80);
35+
36+
static const u32 reg_ch_c_cntxt_1_fmask[] = {
37+
[CH_R_LENGTH] = GENMASK(15, 0),
38+
/* Bits 16-31 reserved */
39+
};
2240

23-
REG_STRIDE(CH_C_CNTXT_1, ch_c_cntxt_1, 0x0001c004 + 0x4000 * GSI_EE_AP, 0x80);
41+
REG_STRIDE_FIELDS(CH_C_CNTXT_1, ch_c_cntxt_1,
42+
0x0001c004 + 0x4000 * GSI_EE_AP, 0x80);
2443

2544
REG_STRIDE(CH_C_CNTXT_2, ch_c_cntxt_2, 0x0001c008 + 0x4000 * GSI_EE_AP, 0x80);
2645

drivers/net/ipa/reg/gsi_reg-v3.5.1.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,28 @@ REG(INTER_EE_SRC_EV_CH_IRQ_MSK, inter_ee_src_ev_ch_irq_msk,
1818

1919
/* All other register offsets are relative to gsi->virt */
2020

21-
REG_STRIDE(CH_C_CNTXT_0, ch_c_cntxt_0, 0x0001c000 + 0x4000 * GSI_EE_AP, 0x80);
21+
static const u32 reg_ch_c_cntxt_0_fmask[] = {
22+
[CHTYPE_PROTOCOL] = GENMASK(2, 0),
23+
[CHTYPE_DIR] = BIT(3),
24+
[CH_EE] = GENMASK(7, 4),
25+
[CHID] = GENMASK(12, 8),
26+
/* Bit 13 reserved */
27+
[ERINDEX] = GENMASK(18, 14),
28+
/* Bit 19 reserved */
29+
[CHSTATE] = GENMASK(23, 20),
30+
[ELEMENT_SIZE] = GENMASK(31, 24),
31+
};
32+
33+
REG_STRIDE_FIELDS(CH_C_CNTXT_0, ch_c_cntxt_0,
34+
0x0001c000 + 0x4000 * GSI_EE_AP, 0x80);
35+
36+
static const u32 reg_ch_c_cntxt_1_fmask[] = {
37+
[CH_R_LENGTH] = GENMASK(15, 0),
38+
/* Bits 16-31 reserved */
39+
};
2240

23-
REG_STRIDE(CH_C_CNTXT_1, ch_c_cntxt_1, 0x0001c004 + 0x4000 * GSI_EE_AP, 0x80);
41+
REG_STRIDE_FIELDS(CH_C_CNTXT_1, ch_c_cntxt_1,
42+
0x0001c004 + 0x4000 * GSI_EE_AP, 0x80);
2443

2544
REG_STRIDE(CH_C_CNTXT_2, ch_c_cntxt_2, 0x0001c008 + 0x4000 * GSI_EE_AP, 0x80);
2645

drivers/net/ipa/reg/gsi_reg-v4.0.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,28 @@ REG(INTER_EE_SRC_EV_CH_IRQ_MSK, inter_ee_src_ev_ch_irq_msk,
1818

1919
/* All other register offsets are relative to gsi->virt */
2020

21-
REG_STRIDE(CH_C_CNTXT_0, ch_c_cntxt_0, 0x0001c000 + 0x4000 * GSI_EE_AP, 0x80);
21+
static const u32 reg_ch_c_cntxt_0_fmask[] = {
22+
[CHTYPE_PROTOCOL] = GENMASK(2, 0),
23+
[CHTYPE_DIR] = BIT(3),
24+
[CH_EE] = GENMASK(7, 4),
25+
[CHID] = GENMASK(12, 8),
26+
/* Bit 13 reserved */
27+
[ERINDEX] = GENMASK(18, 14),
28+
/* Bit 19 reserved */
29+
[CHSTATE] = GENMASK(23, 20),
30+
[ELEMENT_SIZE] = GENMASK(31, 24),
31+
};
32+
33+
REG_STRIDE_FIELDS(CH_C_CNTXT_0, ch_c_cntxt_0,
34+
0x0001c000 + 0x4000 * GSI_EE_AP, 0x80);
35+
36+
static const u32 reg_ch_c_cntxt_1_fmask[] = {
37+
[CH_R_LENGTH] = GENMASK(15, 0),
38+
/* Bits 16-31 reserved */
39+
};
2240

23-
REG_STRIDE(CH_C_CNTXT_1, ch_c_cntxt_1, 0x0001c004 + 0x4000 * GSI_EE_AP, 0x80);
41+
REG_STRIDE_FIELDS(CH_C_CNTXT_1, ch_c_cntxt_1,
42+
0x0001c004 + 0x4000 * GSI_EE_AP, 0x80);
2443

2544
REG_STRIDE(CH_C_CNTXT_2, ch_c_cntxt_2, 0x0001c008 + 0x4000 * GSI_EE_AP, 0x80);
2645

drivers/net/ipa/reg/gsi_reg-v4.5.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,28 @@ REG(INTER_EE_SRC_EV_CH_IRQ_MSK, inter_ee_src_ev_ch_irq_msk,
1818

1919
/* All other register offsets are relative to gsi->virt */
2020

21-
REG_STRIDE(CH_C_CNTXT_0, ch_c_cntxt_0, 0x0001c000 + 0x4000 * GSI_EE_AP, 0x80);
21+
static const u32 reg_ch_c_cntxt_0_fmask[] = {
22+
[CHTYPE_PROTOCOL] = GENMASK(2, 0),
23+
[CHTYPE_DIR] = BIT(3),
24+
[CH_EE] = GENMASK(7, 4),
25+
[CHID] = GENMASK(12, 8),
26+
[CHTYPE_PROTOCOL_MSB] = BIT(13),
27+
[ERINDEX] = GENMASK(18, 14),
28+
/* Bit 19 reserved */
29+
[CHSTATE] = GENMASK(23, 20),
30+
[ELEMENT_SIZE] = GENMASK(31, 24),
31+
};
32+
33+
REG_STRIDE_FIELDS(CH_C_CNTXT_0, ch_c_cntxt_0,
34+
0x0001c000 + 0x4000 * GSI_EE_AP, 0x80);
35+
36+
static const u32 reg_ch_c_cntxt_1_fmask[] = {
37+
[CH_R_LENGTH] = GENMASK(15, 0),
38+
/* Bits 16-31 reserved */
39+
};
2240

23-
REG_STRIDE(CH_C_CNTXT_1, ch_c_cntxt_1, 0x0001c004 + 0x4000 * GSI_EE_AP, 0x80);
41+
REG_STRIDE_FIELDS(CH_C_CNTXT_1, ch_c_cntxt_1,
42+
0x0001c004 + 0x4000 * GSI_EE_AP, 0x80);
2443

2544
REG_STRIDE(CH_C_CNTXT_2, ch_c_cntxt_2, 0x0001c008 + 0x4000 * GSI_EE_AP, 0x80);
2645

drivers/net/ipa/reg/gsi_reg-v4.9.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,28 @@ REG(INTER_EE_SRC_EV_CH_IRQ_MSK, inter_ee_src_ev_ch_irq_msk,
1818

1919
/* All other register offsets are relative to gsi->virt */
2020

21-
REG_STRIDE(CH_C_CNTXT_0, ch_c_cntxt_0, 0x0001c000 + 0x4000 * GSI_EE_AP, 0x80);
21+
static const u32 reg_ch_c_cntxt_0_fmask[] = {
22+
[CHTYPE_PROTOCOL] = GENMASK(2, 0),
23+
[CHTYPE_DIR] = BIT(3),
24+
[CH_EE] = GENMASK(7, 4),
25+
[CHID] = GENMASK(12, 8),
26+
[CHTYPE_PROTOCOL_MSB] = BIT(13),
27+
[ERINDEX] = GENMASK(18, 14),
28+
/* Bit 19 reserved */
29+
[CHSTATE] = GENMASK(23, 20),
30+
[ELEMENT_SIZE] = GENMASK(31, 24),
31+
};
32+
33+
REG_STRIDE_FIELDS(CH_C_CNTXT_0, ch_c_cntxt_0,
34+
0x0001c000 + 0x4000 * GSI_EE_AP, 0x80);
35+
36+
static const u32 reg_ch_c_cntxt_1_fmask[] = {
37+
[CH_R_LENGTH] = GENMASK(19, 0),
38+
/* Bits 20-31 reserved */
39+
};
2240

23-
REG_STRIDE(CH_C_CNTXT_1, ch_c_cntxt_1, 0x0001c004 + 0x4000 * GSI_EE_AP, 0x80);
41+
REG_STRIDE_FIELDS(CH_C_CNTXT_1, ch_c_cntxt_1,
42+
0x0001c004 + 0x4000 * GSI_EE_AP, 0x80);
2443

2544
REG_STRIDE(CH_C_CNTXT_2, ch_c_cntxt_2, 0x0001c008 + 0x4000 * GSI_EE_AP, 0x80);
2645

0 commit comments

Comments
 (0)