Re: lpss_iosf_enter_d3_state breaks PWM on Baytrail

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2017-06-27 at 16:15 +0200, Hans de Goede wrote:
> Hi,
> 
> On 06/27/2017 03:41 PM, Andy Shevchenko wrote:
> > +Cc: Jarkko and Ulf (they are discussing patch series regarding to
> > I2C
> > and ACPI LPSS as well)
> 
> Hmm, do you have a link to this patch series?

https://www.spinics.net/lists/linux-i2c/msg29078.html

In the thread Ulf mentioned his WIP branch.

> 
> > +Cc: Mika, he might have a sight on this as well.
> 
> I've added everyone in me reply to your first reply, but Jarkko's
> email address seems to not work.

Oops, wrong Jarkko. Now is proper one. (That's why entire message is
kept here)

> 
> Regards,
> 
> Hans
> 
> 
> > 
> > On Tue, 2017-06-27 at 16:29 +0300, Andy Shevchenko wrote:
> > > On Mon, 2017-06-26 at 11:31 +0200, Hans de Goede wrote:
> > > > Hi Andy, et al.,
> > > > 
> > > > I've spend quite some time this weekend debugging an issue
> > > > an a Bay Trail laptop with a Crystal Cove PMIC which uses
> > > > the LPSS PWM for backlight control rather then the PMIC's
> > > > PWM.
> > > > 
> > > > The problem is lpss_iosf_enter_d3_state. Specifically when
> > > > called when the PWM runtime-suspends during i915 driver load,
> > > > during which the i915 driver disables then re-enables the PWM.
> > > > 
> > > > This is the only time (including normal suspend(to-idle)
> > > > and resume) when this check:
> > > > 
> > > >           pmc_status = (~(d3_sts_0 | func_dis)) & pmc_mask;
> > > >           if (pmc_status)
> > > >                   goto exit;
> > > > 
> > > > Does not hit the goto exit path
> > > 
> > > ...meaning all LPSS devices (except maybe DMA) are in D3hot.
> > > 
> > > >   and lpss_iosf_enter_d3_state
> > > > actually executes these 3 statements:
> > > > 
> > > >           iosf_mbi_modify(LPSS_IOSF_UNIT_LPIO1, MBI_CFG_WRITE,
> > > >                           LPSS_IOSF_PMCSR, value2, mask2);
> > > > 
> > > >           iosf_mbi_modify(LPSS_IOSF_UNIT_LPIO2, MBI_CFG_WRITE,
> > > >                           LPSS_IOSF_PMCSR, value2, mask2);
> > > > 
> > > >           iosf_mbi_modify(LPSS_IOSF_UNIT_LPIOEP, MBI_CR_WRITE,
> > > >                           LPSS_IOSF_GPIODEF0, value1, mask1);
> > > > 
> > > > If I comment out these 3 statements then everything works fine,
> > > > with these 3 statements in place though, then the PWM controller
> > > > gets stuck when the i915 driver tries to re-enable it (and it
> > > > runtime-resumes). After these 3 statements have been run once
> > > > then any subsequent reads from the PWM's control register
> > > > always return 0x00010000 and writes seem to be ignored.
> > > 
> > > Sounds like powered off LPSS power island.
> > > 
> > > > Given the past troubles with the LPSS DMA controller suspend,
> > > > see all the links in this commit message (which introduces
> > > > the current fix) :
> > > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.g
> > > > it/c
> > > > om
> > > > mit/?id=eebb3e8d8aaf2
> > > > 
> > > > I'm tempted to just rip out lpss_iosf_enter_d3_state,
> > > > especially since it does not seem to do anything other
> > > > then during early boot when not all drivers are loaded yet.
> > > 
> > > Interesting...
> > > 
> > > You are telling that there is guaranteed that at least one LPSS
> > > device
> > > (except DMA) will be on at any time?
> > > 
> > > > Note that on Bay Trail devices with an AXP288 PMIC (most new
> > > > Bay Trail devices) and on any Cherry Trail device the LPSS I2C
> > > > controller connected to the PMIC will never suspend because
> > > > some DSTDs make ACPI OpRegion calls during late suspend /
> > > > early resume and as such we need to keep the I2C bus alive
> > > > the whole time. This means that the check in
> > > > lpss_iosf_enter_d3_state will always hit the goto exit path
> > > > on these devices,
> > > 
> > > Looks like an answer to the previous question.
> > > 
> > > >   leaving just (older) Bay Trail + non AXP288
> > > > PMIC devices as potentially hitting the code path where
> > > > lpss_iosf_enter_d3_state actually does something and these are
> > > > exactly the devices with which people are having a lot of
> > > > problems with freezes / hangs.
> > > > 
> > > > So I believe that the best approach would be to simply remove
> > > > lpss_iosf_enter_d3_state. Which leaves me wondering what it
> > > > actually does. It would be nice for the future if undocumented
> > > > (not publicly documented) registers are used that some comments
> > > > are added describing what each register write actually does.
> > > 
> > > Do the commit messages describe this enough along with several
> > > comments
> > > inside acpi_lpss.c?
> > > 
> > > > These seem to simply put the DMA controller into D3:
> > > > 
> > > >           u32 value2 = LPSS_PMCSR_D3hot;
> > > >           u32 mask2 = LPSS_PMCSR_Dx_MASK;
> > > > 
> > > >           iosf_mbi_modify(LPSS_IOSF_UNIT_LPIO1, MBI_CFG_WRITE,
> > > >                           LPSS_IOSF_PMCSR, value2, mask2);
> > > > 
> > > >           iosf_mbi_modify(LPSS_IOSF_UNIT_LPIO2, MBI_CFG_WRITE,
> > > >                           LPSS_IOSF_PMCSR, value2, mask2);
> > > 
> > > It overrides the lines which propagate clock and reset signals to
> > > the
> > > entire LPSS islands.
> > > 
> > > DMA just happened to be a function 0 (in terms of PCI), so, if it
> > > is
> > > off
> > > the rest of the functions can not be on.
> > > 
> > > > But what does this one do?   :
> > > > 
> > > >           u32 value1 = 0;
> > > >           u32 mask1 = LPSS_GPIODEF0_DMA_D3_MASK |
> > > > LPSS_GPIODEF0_DMA_LLP;
> > > 
> > > (this one is a chicken bit to enable hardware linked list
> > > transfers on
> > > DMA)
> > > 
> > > > 
> > > >           iosf_mbi_modify(LPSS_IOSF_UNIT_LPIOEP, MBI_CR_WRITE,
> > > >                           LPSS_IOSF_GPIODEF0, value1, mask1);
> > > > 
> > > > I guess this turns on(?) the automatically down powering of the
> > > > DMA controllers ? If so then why not just do only that ?
> > > 
> > > No, automatic power gating is a *hardware* (PMC firmware? I do not
> > > remember details now) feature which is overridden by the code
> > > above.
> > > 
> > > It's something like logical gates where one of the input is what
> > > we
> > > supply through these chicken bits.
> > > 
> > > > And if this turns it on
> > > >   then lpss_iosf_exit_d3_state turns the
> > > > automagic off, if that is true,
> > > 
> > > The proper wording here I suppose *it allows or forbids the
> > > automatic
> > > power gating*. It's one layer up I would say. It means it might be
> > > a
> > > latency between writing these bits and actual hardware response on
> > > them.
> > > 
> > > >   then there is an ordering issue.
> > > > lpss_iosf_exit_d3_state gets only run on (runtime)resume, not
> > > > on the initial probe of LPSS devices, so that would mean that
> > > > between
> > > > the initial probe and the first resume we have the undesirable
> > > > auto-off feature active ?
> > > 
> > > Looks like ACPI PM for LPSS should take care of this at probe.
> > > When I
> > > wrote the code I was assuming that ACPI enumerated devices are
> > > runtime
> > > powered on during ->probe(). For such I did explicit calls in DMA
> > > driver: bb32baf76e56 ("dmaengine: dw: enable runtime PM").
> > > 

-- 
Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
Intel Finland Oy
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux