Hi Andi, > On 6 Sep 2023, at 01.08, Andi Shyti <andi.shyti@xxxxxxxxxx> wrote: > > Hi Sean, > > On Mon, Sep 04, 2023 at 07:29:59AM +0200, Sean Nyekjaer wrote: >> Hi Andy, >> >>> On 3 Sep 2023, at 14.46, Andi Shyti <andi.shyti@xxxxxxxxxx> wrote: >>> >>> Hi Pierre-Yves, Alain, >>> >>> mind taking a look here? >>> >>> [...] >>> >>>> @@ -357,6 +357,7 @@ struct stm32f7_i2c_dev { >>>> u32 dnf_dt; >>>> u32 dnf; >>>> struct stm32f7_i2c_alert *alert; >>>> + bool atomic; >>> >>> this smells a bit racy here, this works only if the xfer's are >>> always sequential. >>> >>> What happens when we receive at the same time two xfer's, one >>> atomic and one non atomic? >> >> From the include/i2c.h: >> * @master_xfer_atomic: same as @master_xfer. Yet, only using atomic context >> * so e.g. PMICs can be accessed very late before shutdown. Optional. >> >> So it’s only used very late in the shutdown. >> >> It’s implemented the same way as in: >> drivers/i2c/busses/i2c-imx.c >> drivers/i2c/busses/i2c-meson.c >> drivers/i2c/busses/i2c-mv64xxx.c >> drivers/i2c/busses/i2c-tegra.c >> … etc… >> >> >> In drivers/i2c/i2c-core.h it’s determined whether it’s atomic transfer or not: >> >> /* >> * We only allow atomic transfers for very late communication, e.g. to access a >> * PMIC when powering down. Atomic transfers are a corner case and not for >> * generic use! >> */ >> static inline bool i2c_in_atomic_xfer_mode(void) >> { >> return system_state > SYSTEM_RUNNING && irqs_disabled(); >> } >> >> So you would not have an atomic transfer and later an non atomic. > > What about the opposite? I.e. a non atomic and later an atomic, > for very late tardive communications :) Sure it’s the opposite? Normal scenario is “non atomic” transfers going on and under shutdown it switches to “atomic”. >From i2c_in_atomic_xfer_mode() it can’t go from “atomic” -> “non atomic”. extern enum system_states { SYSTEM_BOOTING, SYSTEM_SCHEDULING, SYSTEM_FREEING_INITMEM, SYSTEM_RUNNING, SYSTEM_HALT, SYSTEM_POWER_OFF, SYSTEM_RESTART, SYSTEM_SUSPEND, } system_state; If you are asking what happens if a “non atomic” transfer is ongoing and irq’s is disabled, IDK. Let’s get Wolfram in the loop (Sorry I forgot to add you) :) /Sean