Skip to content

Commit f298ba7

Browse files
Alex Elderdavem330
authored andcommitted
net: ipa: add a parameter to suspend registers
The SUSPEND_INFO, SUSPEND_EN, SUSPEND_CLR registers represent endpoint IDs in a bit mask. When more than 32 endpoints are supported, these registers will be replicated as needed to represent the number of supported endpoints. Update the definitions of these registers to have a stride of 4 bytes, and update the code that operates them to select the proper offset and bit. Signed-off-by: Alex Elder <elder@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 1d8f16d commit f298ba7

File tree

7 files changed

+55
-29
lines changed

7 files changed

+55
-29
lines changed

drivers/net/ipa/ipa_interrupt.c

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -132,19 +132,21 @@ static void ipa_interrupt_suspend_control(struct ipa_interrupt *interrupt,
132132
u32 endpoint_id, bool enable)
133133
{
134134
struct ipa *ipa = interrupt->ipa;
135-
u32 mask = BIT(endpoint_id);
135+
u32 mask = BIT(endpoint_id % 32);
136+
u32 unit = endpoint_id / 32;
136137
const struct ipa_reg *reg;
137138
u32 offset;
138139
u32 val;
139140

141+
/* This works until we actually have more than 32 endpoints */
140142
WARN_ON(!(mask & ipa->available));
141143

142144
/* IPA version 3.0 does not support TX_SUSPEND interrupt control */
143145
if (ipa->version == IPA_VERSION_3_0)
144146
return;
145147

146148
reg = ipa_reg(ipa, IRQ_SUSPEND_EN);
147-
offset = ipa_reg_offset(reg);
149+
offset = ipa_reg_n_offset(reg, unit);
148150
val = ioread32(ipa->reg_virt + offset);
149151
if (enable)
150152
val |= mask;
@@ -171,18 +173,24 @@ ipa_interrupt_suspend_disable(struct ipa_interrupt *interrupt, u32 endpoint_id)
171173
void ipa_interrupt_suspend_clear_all(struct ipa_interrupt *interrupt)
172174
{
173175
struct ipa *ipa = interrupt->ipa;
174-
const struct ipa_reg *reg;
175-
u32 val;
176+
u32 unit_count;
177+
u32 unit;
176178

177-
reg = ipa_reg(ipa, IRQ_SUSPEND_INFO);
178-
val = ioread32(ipa->reg_virt + ipa_reg_offset(reg));
179+
unit_count = roundup(ipa->endpoint_count, 32);
180+
for (unit = 0; unit < unit_count; unit++) {
181+
const struct ipa_reg *reg;
182+
u32 val;
179183

180-
/* SUSPEND interrupt status isn't cleared on IPA version 3.0 */
181-
if (ipa->version == IPA_VERSION_3_0)
182-
return;
184+
reg = ipa_reg(ipa, IRQ_SUSPEND_INFO);
185+
val = ioread32(ipa->reg_virt + ipa_reg_n_offset(reg, unit));
186+
187+
/* SUSPEND interrupt status isn't cleared on IPA version 3.0 */
188+
if (ipa->version == IPA_VERSION_3_0)
189+
continue;
183190

184-
reg = ipa_reg(ipa, IRQ_SUSPEND_CLR);
185-
iowrite32(val, ipa->reg_virt + ipa_reg_offset(reg));
191+
reg = ipa_reg(ipa, IRQ_SUSPEND_CLR);
192+
iowrite32(val, ipa->reg_virt + ipa_reg_n_offset(reg, unit));
193+
}
186194
}
187195

188196
/* Simulate arrival of an IPA TX_SUSPEND interrupt */

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -386,13 +386,16 @@ static const u32 ipa_reg_ipa_irq_uc_fmask[] = {
386386
IPA_REG_FIELDS(IPA_IRQ_UC, ipa_irq_uc, 0x0000301c + 0x1000 * GSI_EE_AP);
387387

388388
/* Valid bits defined by ipa->available */
389-
IPA_REG(IRQ_SUSPEND_INFO, irq_suspend_info, 0x00003030 + 0x1000 * GSI_EE_AP);
389+
IPA_REG_STRIDE(IRQ_SUSPEND_INFO, irq_suspend_info,
390+
0x00003030 + 0x1000 * GSI_EE_AP, 0x0004);
390391

391392
/* Valid bits defined by ipa->available */
392-
IPA_REG(IRQ_SUSPEND_EN, irq_suspend_en, 0x00003034 + 0x1000 * GSI_EE_AP);
393+
IPA_REG_STRIDE(IRQ_SUSPEND_EN, irq_suspend_en,
394+
0x00003034 + 0x1000 * GSI_EE_AP, 0x0004);
393395

394396
/* Valid bits defined by ipa->available */
395-
IPA_REG(IRQ_SUSPEND_CLR, irq_suspend_clr, 0x00003038 + 0x1000 * GSI_EE_AP);
397+
IPA_REG_STRIDE(IRQ_SUSPEND_CLR, irq_suspend_clr,
398+
0x00003038 + 0x1000 * GSI_EE_AP, 0x0004);
396399

397400
static const struct ipa_reg *ipa_reg_array[] = {
398401
[COMP_CFG] = &ipa_reg_comp_cfg,

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -397,13 +397,16 @@ static const u32 ipa_reg_ipa_irq_uc_fmask[] = {
397397
IPA_REG_FIELDS(IPA_IRQ_UC, ipa_irq_uc, 0x0000301c + 0x1000 * GSI_EE_AP);
398398

399399
/* Valid bits defined by ipa->available */
400-
IPA_REG(IRQ_SUSPEND_INFO, irq_suspend_info, 0x00003030 + 0x1000 * GSI_EE_AP);
400+
IPA_REG_STRIDE(IRQ_SUSPEND_INFO, irq_suspend_info,
401+
0x00003030 + 0x1000 * GSI_EE_AP, 0x0004);
401402

402403
/* Valid bits defined by ipa->available */
403-
IPA_REG(IRQ_SUSPEND_EN, irq_suspend_en, 0x00003034 + 0x1000 * GSI_EE_AP);
404+
IPA_REG_STRIDE(IRQ_SUSPEND_EN, irq_suspend_en,
405+
0x00003034 + 0x1000 * GSI_EE_AP, 0x0004);
404406

405407
/* Valid bits defined by ipa->available */
406-
IPA_REG(IRQ_SUSPEND_CLR, irq_suspend_clr, 0x00003038 + 0x1000 * GSI_EE_AP);
408+
IPA_REG_STRIDE(IRQ_SUSPEND_CLR, irq_suspend_clr,
409+
0x00003038 + 0x1000 * GSI_EE_AP, 0x0004);
407410

408411
static const struct ipa_reg *ipa_reg_array[] = {
409412
[COMP_CFG] = &ipa_reg_comp_cfg,

drivers/net/ipa/reg/ipa_reg-v4.11.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -453,13 +453,16 @@ static const u32 ipa_reg_ipa_irq_uc_fmask[] = {
453453
IPA_REG_FIELDS(IPA_IRQ_UC, ipa_irq_uc, 0x0000401c + 0x1000 * GSI_EE_AP);
454454

455455
/* Valid bits defined by ipa->available */
456-
IPA_REG(IRQ_SUSPEND_INFO, irq_suspend_info, 0x00004030 + 0x1000 * GSI_EE_AP);
456+
IPA_REG_STRIDE(IRQ_SUSPEND_INFO, irq_suspend_info,
457+
0x00004030 + 0x1000 * GSI_EE_AP, 0x0004);
457458

458459
/* Valid bits defined by ipa->available */
459-
IPA_REG(IRQ_SUSPEND_EN, irq_suspend_en, 0x00004034 + 0x1000 * GSI_EE_AP);
460+
IPA_REG_STRIDE(IRQ_SUSPEND_EN, irq_suspend_en,
461+
0x00004034 + 0x1000 * GSI_EE_AP, 0x0004);
460462

461463
/* Valid bits defined by ipa->available */
462-
IPA_REG(IRQ_SUSPEND_CLR, irq_suspend_clr, 0x00004038 + 0x1000 * GSI_EE_AP);
464+
IPA_REG_STRIDE(IRQ_SUSPEND_CLR, irq_suspend_clr,
465+
0x00004038 + 0x1000 * GSI_EE_AP, 0x0004);
463466

464467
static const struct ipa_reg *ipa_reg_array[] = {
465468
[COMP_CFG] = &ipa_reg_comp_cfg,

drivers/net/ipa/reg/ipa_reg-v4.2.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -399,13 +399,16 @@ static const u32 ipa_reg_ipa_irq_uc_fmask[] = {
399399
IPA_REG_FIELDS(IPA_IRQ_UC, ipa_irq_uc, 0x0000301c + 0x1000 * GSI_EE_AP);
400400

401401
/* Valid bits defined by ipa->available */
402-
IPA_REG(IRQ_SUSPEND_INFO, irq_suspend_info, 0x00003030 + 0x1000 * GSI_EE_AP);
402+
IPA_REG_STRIDE(IRQ_SUSPEND_INFO, irq_suspend_info,
403+
0x00003030 + 0x1000 * GSI_EE_AP, 0x0004);
403404

404405
/* Valid bits defined by ipa->available */
405-
IPA_REG(IRQ_SUSPEND_EN, irq_suspend_en, 0x00003034 + 0x1000 * GSI_EE_AP);
406+
IPA_REG_STRIDE(IRQ_SUSPEND_EN, irq_suspend_en,
407+
0x00003034 + 0x1000 * GSI_EE_AP, 0x0004);
406408

407409
/* Valid bits defined by ipa->available */
408-
IPA_REG(IRQ_SUSPEND_CLR, irq_suspend_clr, 0x00003038 + 0x1000 * GSI_EE_AP);
410+
IPA_REG_STRIDE(IRQ_SUSPEND_CLR, irq_suspend_clr,
411+
0x00003038 + 0x1000 * GSI_EE_AP, 0x0004);
409412

410413
static const struct ipa_reg *ipa_reg_array[] = {
411414
[COMP_CFG] = &ipa_reg_comp_cfg,

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -472,13 +472,16 @@ static const u32 ipa_reg_ipa_irq_uc_fmask[] = {
472472
IPA_REG_FIELDS(IPA_IRQ_UC, ipa_irq_uc, 0x0000301c + 0x1000 * GSI_EE_AP);
473473

474474
/* Valid bits defined by ipa->available */
475-
IPA_REG(IRQ_SUSPEND_INFO, irq_suspend_info, 0x00003030 + 0x1000 * GSI_EE_AP);
475+
IPA_REG_STRIDE(IRQ_SUSPEND_INFO, irq_suspend_info,
476+
0x00003030 + 0x1000 * GSI_EE_AP, 0x0004);
476477

477478
/* Valid bits defined by ipa->available */
478-
IPA_REG(IRQ_SUSPEND_EN, irq_suspend_en, 0x00003034 + 0x1000 * GSI_EE_AP);
479+
IPA_REG_STRIDE(IRQ_SUSPEND_EN, irq_suspend_en,
480+
0x00003034 + 0x1000 * GSI_EE_AP, 0x0004);
479481

480482
/* Valid bits defined by ipa->available */
481-
IPA_REG(IRQ_SUSPEND_CLR, irq_suspend_clr, 0x00003038 + 0x1000 * GSI_EE_AP);
483+
IPA_REG_STRIDE(IRQ_SUSPEND_CLR, irq_suspend_clr,
484+
0x00003038 + 0x1000 * GSI_EE_AP, 0x0004);
482485

483486
static const struct ipa_reg *ipa_reg_array[] = {
484487
[COMP_CFG] = &ipa_reg_comp_cfg,

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -450,13 +450,16 @@ static const u32 ipa_reg_ipa_irq_uc_fmask[] = {
450450
IPA_REG_FIELDS(IPA_IRQ_UC, ipa_irq_uc, 0x0000401c + 0x1000 * GSI_EE_AP);
451451

452452
/* Valid bits defined by ipa->available */
453-
IPA_REG(IRQ_SUSPEND_INFO, irq_suspend_info, 0x00004030 + 0x1000 * GSI_EE_AP);
453+
IPA_REG_STRIDE(IRQ_SUSPEND_INFO, irq_suspend_info,
454+
0x00004030 + 0x1000 * GSI_EE_AP, 0x0004);
454455

455456
/* Valid bits defined by ipa->available */
456-
IPA_REG(IRQ_SUSPEND_EN, irq_suspend_en, 0x00004034 + 0x1000 * GSI_EE_AP);
457+
IPA_REG_STRIDE(IRQ_SUSPEND_EN, irq_suspend_en,
458+
0x00004034 + 0x1000 * GSI_EE_AP, 0x0004);
457459

458460
/* Valid bits defined by ipa->available */
459-
IPA_REG(IRQ_SUSPEND_CLR, irq_suspend_clr, 0x00004038 + 0x1000 * GSI_EE_AP);
461+
IPA_REG_STRIDE(IRQ_SUSPEND_CLR, irq_suspend_clr,
462+
0x00004038 + 0x1000 * GSI_EE_AP, 0x0004);
460463

461464
static const struct ipa_reg *ipa_reg_array[] = {
462465
[COMP_CFG] = &ipa_reg_comp_cfg,

0 commit comments

Comments
 (0)