Message ID | 1631860384-26608-6-git-send-email-quic_fenglinw@quicinc.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | A bunch of fix and optimization patches in spmi-pmic-arb.c | expand |
Quoting Fenglin Wu (2021-09-16 23:33:00) > From: David Collins <collinsd@codeaurora.org> > > Correct the way that duplicate PPID mappings are handled for PMIC > arbiter v5. The final APID mapped to a given PPID should be the > one which has write owner = APPS EE, if it exists, or if not > that, then the first APID mapped to the PPID, if it exists. > > Signed-off-by: David Collins <collinsd@codeaurora.org> > Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com> > --- Does this need a Fixes tag? > drivers/spmi/spmi-pmic-arb.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c > index 59c445b..f1b72d8 100644 > --- a/drivers/spmi/spmi-pmic-arb.c > +++ b/drivers/spmi/spmi-pmic-arb.c > @@ -918,7 +918,8 @@ static int pmic_arb_read_apid_map_v5(struct spmi_pmic_arb *pmic_arb) > * version 5, there is more than one APID mapped to each PPID. > * The owner field for each of these mappings specifies the EE which is > * allowed to write to the APID. The owner of the last (highest) APID > - * for a given PPID will receive interrupts from the PPID. > + * which has the IRQ owner bit set for a given PPID will receive > + * interrupts from the PPID. > */ > for (i = 0; ; i++, apidd++) { > offset = pmic_arb->ver_ops->apid_map_offset(i); > @@ -941,16 +942,16 @@ static int pmic_arb_read_apid_map_v5(struct spmi_pmic_arb *pmic_arb) > apid = pmic_arb->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID; > prev_apidd = &pmic_arb->apid_data[apid]; > > - if (valid && is_irq_ee && > - prev_apidd->write_ee == pmic_arb->ee) { > + if (!valid || apidd->write_ee == pmic_arb->ee) { > + /* First PPID mapping or one for this EE */ > + pmic_arb->ppid_to_apid[ppid] = i | PMIC_ARB_APID_VALID; > + } else if (valid && is_irq_ee && > + prev_apidd->write_ee == pmic_arb->ee) { This can be one line please. > /* > * Duplicate PPID mapping after the one for this EE; > * override the irq owner > */ > prev_apidd->irq_ee = apidd->irq_ee; > - } else if (!valid || is_irq_ee) { > - /* First PPID mapping or duplicate for another EE */ > - pmic_arb->ppid_to_apid[ppid] = i | PMIC_ARB_APID_VALID; > } > > apidd->ppid = ppid; > -- > 2.7.4 >
On 10/13/2021 1:44 AM, Stephen Boyd wrote: > Quoting Fenglin Wu (2021-09-16 23:33:00) >> From: David Collins <collinsd@codeaurora.org> >> >> Correct the way that duplicate PPID mappings are handled for PMIC >> arbiter v5. The final APID mapped to a given PPID should be the >> one which has write owner = APPS EE, if it exists, or if not >> that, then the first APID mapped to the PPID, if it exists. >> >> Signed-off-by: David Collins <collinsd@codeaurora.org> >> Signed-off-by: Fenglin Wu <quic_fenglinw@quicinc.com> >> --- > Does this need a Fixes tag? ACK, will add a Fixes tag > >> drivers/spmi/spmi-pmic-arb.c | 13 +++++++------ >> 1 file changed, 7 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c >> index 59c445b..f1b72d8 100644 >> --- a/drivers/spmi/spmi-pmic-arb.c >> +++ b/drivers/spmi/spmi-pmic-arb.c >> @@ -918,7 +918,8 @@ static int pmic_arb_read_apid_map_v5(struct spmi_pmic_arb *pmic_arb) >> * version 5, there is more than one APID mapped to each PPID. >> * The owner field for each of these mappings specifies the EE which is >> * allowed to write to the APID. The owner of the last (highest) APID >> - * for a given PPID will receive interrupts from the PPID. >> + * which has the IRQ owner bit set for a given PPID will receive >> + * interrupts from the PPID. >> */ >> for (i = 0; ; i++, apidd++) { >> offset = pmic_arb->ver_ops->apid_map_offset(i); >> @@ -941,16 +942,16 @@ static int pmic_arb_read_apid_map_v5(struct spmi_pmic_arb *pmic_arb) >> apid = pmic_arb->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID; >> prev_apidd = &pmic_arb->apid_data[apid]; >> >> - if (valid && is_irq_ee && >> - prev_apidd->write_ee == pmic_arb->ee) { >> + if (!valid || apidd->write_ee == pmic_arb->ee) { >> + /* First PPID mapping or one for this EE */ >> + pmic_arb->ppid_to_apid[ppid] = i | PMIC_ARB_APID_VALID; >> + } else if (valid && is_irq_ee && >> + prev_apidd->write_ee == pmic_arb->ee) { > This can be one line please. ACK. >> /* >> * Duplicate PPID mapping after the one for this EE; >> * override the irq owner >> */ >> prev_apidd->irq_ee = apidd->irq_ee; >> - } else if (!valid || is_irq_ee) { >> - /* First PPID mapping or duplicate for another EE */ >> - pmic_arb->ppid_to_apid[ppid] = i | PMIC_ARB_APID_VALID; >> } >> >> apidd->ppid = ppid; >> -- >> 2.7.4 >>
diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c index 59c445b..f1b72d8 100644 --- a/drivers/spmi/spmi-pmic-arb.c +++ b/drivers/spmi/spmi-pmic-arb.c @@ -918,7 +918,8 @@ static int pmic_arb_read_apid_map_v5(struct spmi_pmic_arb *pmic_arb) * version 5, there is more than one APID mapped to each PPID. * The owner field for each of these mappings specifies the EE which is * allowed to write to the APID. The owner of the last (highest) APID - * for a given PPID will receive interrupts from the PPID. + * which has the IRQ owner bit set for a given PPID will receive + * interrupts from the PPID. */ for (i = 0; ; i++, apidd++) { offset = pmic_arb->ver_ops->apid_map_offset(i); @@ -941,16 +942,16 @@ static int pmic_arb_read_apid_map_v5(struct spmi_pmic_arb *pmic_arb) apid = pmic_arb->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID; prev_apidd = &pmic_arb->apid_data[apid]; - if (valid && is_irq_ee && - prev_apidd->write_ee == pmic_arb->ee) { + if (!valid || apidd->write_ee == pmic_arb->ee) { + /* First PPID mapping or one for this EE */ + pmic_arb->ppid_to_apid[ppid] = i | PMIC_ARB_APID_VALID; + } else if (valid && is_irq_ee && + prev_apidd->write_ee == pmic_arb->ee) { /* * Duplicate PPID mapping after the one for this EE; * override the irq owner */ prev_apidd->irq_ee = apidd->irq_ee; - } else if (!valid || is_irq_ee) { - /* First PPID mapping or duplicate for another EE */ - pmic_arb->ppid_to_apid[ppid] = i | PMIC_ARB_APID_VALID; } apidd->ppid = ppid;