Skip to content

Commit 59b12b1

Browse files
Alex ElderPaolo Abeni
authored andcommitted
net: ipa: kill gsi->virt_raw
Starting at IPA v4.5, almost all GSI registers had their offsets changed by a fixed amount (shifted downward by 0xd000). Rather than defining offsets for all those registers dependent on version, an adjustment was applied for most register accesses. This was implemented in commit cdeee49 ("net: ipa: adjust GSI register addresses"). It was later modified to be a bit more obvious about the adjusment, in commit 571b1e7 ("net: ipa: use a separate pointer for adjusted GSI memory"). We now are able to define every GSI register with its own offset, so there's no need to implement this special adjustment. So get rid of the "virt_raw" pointer, and just maintain "virt" as the (non-adjusted) base address of I/O mapped GSI register memory. Redefine the offsets of all GSI registers (other than the INTER_EE ones, which were not subject to the adjustment) for IPA v4.5+, subtracting 0xd000 from their defined offsets instead. Move the ERROR_LOG and ERROR_LOG_CLR definitions further down in the register definition files so all registers are defined in order of their offset. Signed-off-by: Alex Elder <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent ecfa80c commit 59b12b1

File tree

10 files changed

+141
-181
lines changed

10 files changed

+141
-181
lines changed

drivers/net/ipa/gsi.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1999,12 +1999,11 @@ static int gsi_irq_setup(struct gsi *gsi)
19991999

20002000
/* The inter-EE interrupts are not supported for IPA v3.0-v3.1 */
20012001
if (gsi->version > IPA_VERSION_3_1) {
2002-
/* These registers are in the non-adjusted address range */
20032002
reg = gsi_reg(gsi, INTER_EE_SRC_CH_IRQ_MSK);
2004-
iowrite32(0, gsi->virt_raw + reg_offset(reg));
2003+
iowrite32(0, gsi->virt + reg_offset(reg));
20052004

20062005
reg = gsi_reg(gsi, INTER_EE_SRC_EV_CH_IRQ_MSK);
2007-
iowrite32(0, gsi->virt_raw + reg_offset(reg));
2006+
iowrite32(0, gsi->virt + reg_offset(reg));
20082007
}
20092008

20102009
reg = gsi_reg(gsi, CNTXT_GSI_IRQ_EN);

drivers/net/ipa/gsi.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,7 @@ struct gsi_evt_ring {
140140
struct gsi {
141141
struct device *dev; /* Same as IPA device */
142142
enum ipa_version version;
143-
void __iomem *virt_raw; /* I/O mapped address range */
144-
void __iomem *virt; /* Adjusted for most registers */
143+
void __iomem *virt; /* I/O mapped registers */
145144
const struct regs *regs;
146145

147146
u32 irq;

drivers/net/ipa/gsi_reg.c

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,6 @@
99
#include "reg.h"
1010
#include "gsi_reg.h"
1111

12-
/* GSI EE registers as a group are shifted downward by a fixed constant amount
13-
* for IPA versions 4.5 and beyond. This applies to all GSI registers we use
14-
* *except* the ones that disable inter-EE interrupts for channels and event
15-
* channels.
16-
*
17-
* The "raw" (not adjusted) GSI register range is mapped, and a pointer to
18-
* the mapped range is held in gsi->virt_raw. The inter-EE interrupt
19-
* registers are accessed using that pointer.
20-
*
21-
* Most registers are accessed using gsi->virt, which is a copy of the "raw"
22-
* pointer, adjusted downward by the fixed amount.
23-
*/
24-
#define GSI_EE_REG_ADJUST 0x0000d000 /* IPA v4.5+ */
25-
2612
/* Is this register ID valid for the current GSI version? */
2713
static bool gsi_reg_id_valid(struct gsi *gsi, enum gsi_reg_id reg_id)
2814
{
@@ -121,13 +107,12 @@ static const struct regs *gsi_regs(struct gsi *gsi)
121107
}
122108
}
123109

124-
/* Sets gsi->virt_raw and gsi->virt, and I/O maps the "gsi" memory range */
110+
/* Sets gsi->virt and I/O maps the "gsi" memory range for registers */
125111
int gsi_reg_init(struct gsi *gsi, struct platform_device *pdev)
126112
{
127113
struct device *dev = &pdev->dev;
128114
struct resource *res;
129115
resource_size_t size;
130-
u32 adjust;
131116

132117
/* Get GSI memory range and map it */
133118
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "gsi");
@@ -142,35 +127,25 @@ int gsi_reg_init(struct gsi *gsi, struct platform_device *pdev)
142127
return -EINVAL;
143128
}
144129

145-
/* Make sure we can make our pointer adjustment if necessary */
146-
adjust = gsi->version < IPA_VERSION_4_5 ? 0 : GSI_EE_REG_ADJUST;
147-
if (res->start < adjust) {
148-
dev_err(dev, "DT memory resource \"gsi\" too low (< %u)\n",
149-
adjust);
150-
return -EINVAL;
151-
}
152-
153130
gsi->regs = gsi_regs(gsi);
154131
if (!gsi->regs) {
155132
dev_err(dev, "unsupported IPA version %u (?)\n", gsi->version);
156133
return -EINVAL;
157134
}
158135

159-
gsi->virt_raw = ioremap(res->start, size);
160-
if (!gsi->virt_raw) {
136+
gsi->virt = ioremap(res->start, size);
137+
if (!gsi->virt) {
161138
dev_err(dev, "unable to remap \"gsi\" memory\n");
162139
return -ENOMEM;
163140
}
164-
/* Most registers are accessed using an adjusted register range */
165-
gsi->virt = gsi->virt_raw - adjust;
166141

167142
return 0;
168143
}
169144

170145
/* Inverse of gsi_reg_init() */
171146
void gsi_reg_exit(struct gsi *gsi)
172147
{
148+
iounmap(gsi->virt);
173149
gsi->virt = NULL;
174-
iounmap(gsi->virt_raw);
175-
gsi->virt_raw = NULL;
150+
gsi->regs = NULL;
176151
}

drivers/net/ipa/gsi_reg.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,7 @@ const struct reg *gsi_reg(struct gsi *gsi, enum gsi_reg_id reg_id);
351351
* @pdev: GSI (IPA) platform device
352352
*
353353
* Initialize GSI registers, including looking up and I/O mapping
354-
* the "gsi" memory space. This function sets gsi->virt_raw and
355-
* gsi->virt.
354+
* the "gsi" memory space.
356355
*/
357356
int gsi_reg_init(struct gsi *gsi, struct platform_device *pdev);
358357

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,12 @@
88
#include "../reg.h"
99
#include "../gsi_reg.h"
1010

11-
/* The inter-EE IRQ registers are relative to gsi->virt_raw (IPA v3.5+) */
12-
1311
REG(INTER_EE_SRC_CH_IRQ_MSK, inter_ee_src_ch_irq_msk,
1412
0x0000c020 + 0x1000 * GSI_EE_AP);
1513

1614
REG(INTER_EE_SRC_EV_CH_IRQ_MSK, inter_ee_src_ev_ch_irq_msk,
1715
0x0000c024 + 0x1000 * GSI_EE_AP);
1816

19-
/* All other register offsets are relative to gsi->virt */
20-
2117
static const u32 reg_ch_c_cntxt_0_fmask[] = {
2218
[CHTYPE_PROTOCOL] = GENMASK(2, 0),
2319
[CHTYPE_DIR] = BIT(3),
@@ -66,10 +62,6 @@ static const u32 reg_error_log_fmask[] = {
6662
[ERR_EE] = GENMASK(31, 28),
6763
};
6864

69-
REG_FIELDS(ERROR_LOG, error_log, 0x0001f200 + 0x4000 * GSI_EE_AP);
70-
71-
REG(ERROR_LOG_CLR, error_log_clr, 0x0001f210 + 0x4000 * GSI_EE_AP);
72-
7365
REG_STRIDE(CH_C_SCRATCH_0, ch_c_scratch_0,
7466
0x0001c060 + 0x4000 * GSI_EE_AP, 0x80);
7567

@@ -152,13 +144,15 @@ REG_FIELDS(GSI_STATUS, gsi_status, 0x0001f000 + 0x4000 * GSI_EE_AP);
152144

153145
static const u32 reg_ch_cmd_fmask[] = {
154146
[CH_CHID] = GENMASK(7, 0),
147+
/* Bits 8-23 reserved */
155148
[CH_OPCODE] = GENMASK(31, 24),
156149
};
157150

158151
REG_FIELDS(CH_CMD, ch_cmd, 0x0001f008 + 0x4000 * GSI_EE_AP);
159152

160153
static const u32 reg_ev_ch_cmd_fmask[] = {
161154
[EV_CHID] = GENMASK(7, 0),
155+
/* Bits 8-23 reserved */
162156
[EV_OPCODE] = GENMASK(31, 24),
163157
};
164158

@@ -220,6 +214,10 @@ static const u32 reg_cntxt_intset_fmask[] = {
220214

221215
REG_FIELDS(CNTXT_INTSET, cntxt_intset, 0x0001f180 + 0x4000 * GSI_EE_AP);
222216

217+
REG_FIELDS(ERROR_LOG, error_log, 0x0001f200 + 0x4000 * GSI_EE_AP);
218+
219+
REG(ERROR_LOG_CLR, error_log_clr, 0x0001f210 + 0x4000 * GSI_EE_AP);
220+
223221
static const u32 reg_cntxt_scratch_0_fmask[] = {
224222
[INTER_EE_RESULT] = GENMASK(2, 0),
225223
/* Bits 3-4 reserved */

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,12 @@
88
#include "../reg.h"
99
#include "../gsi_reg.h"
1010

11-
/* The inter-EE IRQ registers are relative to gsi->virt_raw (IPA v3.5+) */
12-
1311
REG(INTER_EE_SRC_CH_IRQ_MSK, inter_ee_src_ch_irq_msk,
1412
0x0000c020 + 0x1000 * GSI_EE_AP);
1513

1614
REG(INTER_EE_SRC_EV_CH_IRQ_MSK, inter_ee_src_ev_ch_irq_msk,
1715
0x0000c024 + 0x1000 * GSI_EE_AP);
1816

19-
/* All other register offsets are relative to gsi->virt */
20-
2117
static const u32 reg_ch_c_cntxt_0_fmask[] = {
2218
[CHTYPE_PROTOCOL] = GENMASK(2, 0),
2319
[CHTYPE_DIR] = BIT(3),
@@ -66,10 +62,6 @@ static const u32 reg_error_log_fmask[] = {
6662
[ERR_EE] = GENMASK(31, 28),
6763
};
6864

69-
REG_FIELDS(ERROR_LOG, error_log, 0x0001f200 + 0x4000 * GSI_EE_AP);
70-
71-
REG(ERROR_LOG_CLR, error_log_clr, 0x0001f210 + 0x4000 * GSI_EE_AP);
72-
7365
REG_STRIDE(CH_C_SCRATCH_0, ch_c_scratch_0,
7466
0x0001c060 + 0x4000 * GSI_EE_AP, 0x80);
7567

@@ -152,13 +144,15 @@ REG_FIELDS(GSI_STATUS, gsi_status, 0x0001f000 + 0x4000 * GSI_EE_AP);
152144

153145
static const u32 reg_ch_cmd_fmask[] = {
154146
[CH_CHID] = GENMASK(7, 0),
147+
/* Bits 8-23 reserved */
155148
[CH_OPCODE] = GENMASK(31, 24),
156149
};
157150

158151
REG_FIELDS(CH_CMD, ch_cmd, 0x0001f008 + 0x4000 * GSI_EE_AP);
159152

160153
static const u32 reg_ev_ch_cmd_fmask[] = {
161154
[EV_CHID] = GENMASK(7, 0),
155+
/* Bits 8-23 reserved */
162156
[EV_OPCODE] = GENMASK(31, 24),
163157
};
164158

@@ -231,6 +225,10 @@ static const u32 reg_cntxt_intset_fmask[] = {
231225

232226
REG_FIELDS(CNTXT_INTSET, cntxt_intset, 0x0001f180 + 0x4000 * GSI_EE_AP);
233227

228+
REG_FIELDS(ERROR_LOG, error_log, 0x0001f200 + 0x4000 * GSI_EE_AP);
229+
230+
REG(ERROR_LOG_CLR, error_log_clr, 0x0001f210 + 0x4000 * GSI_EE_AP);
231+
234232
static const u32 reg_cntxt_scratch_0_fmask[] = {
235233
[INTER_EE_RESULT] = GENMASK(2, 0),
236234
/* Bits 3-4 reserved */

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,12 @@
88
#include "../reg.h"
99
#include "../gsi_reg.h"
1010

11-
/* The inter-EE IRQ registers are relative to gsi->virt_raw (IPA v3.5+) */
12-
1311
REG(INTER_EE_SRC_CH_IRQ_MSK, inter_ee_src_ch_irq_msk,
1412
0x0000c020 + 0x1000 * GSI_EE_AP);
1513

1614
REG(INTER_EE_SRC_EV_CH_IRQ_MSK, inter_ee_src_ev_ch_irq_msk,
1715
0x0000c024 + 0x1000 * GSI_EE_AP);
1816

19-
/* All other register offsets are relative to gsi->virt */
20-
2117
static const u32 reg_ch_c_cntxt_0_fmask[] = {
2218
[CHTYPE_PROTOCOL] = GENMASK(2, 0),
2319
[CHTYPE_DIR] = BIT(3),
@@ -67,10 +63,6 @@ static const u32 reg_error_log_fmask[] = {
6763
[ERR_EE] = GENMASK(31, 28),
6864
};
6965

70-
REG_FIELDS(ERROR_LOG, error_log, 0x0001f200 + 0x4000 * GSI_EE_AP);
71-
72-
REG(ERROR_LOG_CLR, error_log_clr, 0x0001f210 + 0x4000 * GSI_EE_AP);
73-
7466
REG_STRIDE(CH_C_SCRATCH_0, ch_c_scratch_0,
7567
0x0001c060 + 0x4000 * GSI_EE_AP, 0x80);
7668

@@ -153,13 +145,15 @@ REG_FIELDS(GSI_STATUS, gsi_status, 0x0001f000 + 0x4000 * GSI_EE_AP);
153145

154146
static const u32 reg_ch_cmd_fmask[] = {
155147
[CH_CHID] = GENMASK(7, 0),
148+
/* Bits 8-23 reserved */
156149
[CH_OPCODE] = GENMASK(31, 24),
157150
};
158151

159152
REG_FIELDS(CH_CMD, ch_cmd, 0x0001f008 + 0x4000 * GSI_EE_AP);
160153

161154
static const u32 reg_ev_ch_cmd_fmask[] = {
162155
[EV_CHID] = GENMASK(7, 0),
156+
/* Bits 8-23 reserved */
163157
[EV_OPCODE] = GENMASK(31, 24),
164158
};
165159

@@ -236,6 +230,10 @@ static const u32 reg_cntxt_intset_fmask[] = {
236230

237231
REG_FIELDS(CNTXT_INTSET, cntxt_intset, 0x0001f180 + 0x4000 * GSI_EE_AP);
238232

233+
REG_FIELDS(ERROR_LOG, error_log, 0x0001f200 + 0x4000 * GSI_EE_AP);
234+
235+
REG(ERROR_LOG_CLR, error_log_clr, 0x0001f210 + 0x4000 * GSI_EE_AP);
236+
239237
static const u32 reg_cntxt_scratch_0_fmask[] = {
240238
[INTER_EE_RESULT] = GENMASK(2, 0),
241239
/* Bits 3-4 reserved */

0 commit comments

Comments
 (0)