Re: [PATCH V2] platform/x86: intel_pmc_core: Add CNP SLPS0 debug registers

2018-06-01 Thread David E. Box
On Wed, 2018-05-30 at 17:03 +0530, Rajneesh Bhardwaj wrote:
> On Wed, May 30, 2018 at 03:53:12AM -0700, David E. Box wrote:
> 
> Hi Dave,
> 
> > Hi Rajneesh,
> > 
> > On Mon, 2018-05-28 at 12:30 +0530, Rajneesh Bhardwaj wrote:
> > > On Thu, May 24, 2018 at 06:10:56PM -0700, David E. Box wrote:
> > > 
> > > Thanks for sending this, Dave. Few comments below.
> > > 
> > > > Adds debugfs access to registers in the Cannon Point PCH PMC
> > > > that
> > > > are
> > > 
> > > Please use Cannonlake PCH.
> > > 
> > > > useful for debugging #SLP_S0 signal assertion and other low
> > > > power
> > > > related
> > > 
> > > assertion failures and other low power debug.
> > > 
> > > > activities. Device pm states are latched in these registers
> > > > whenever the
> > > > package enters C10 and can be read from slp_s0_debug_status.
> > > > The pm
> > > > states may also be latched by writing 1 to slp_s0_dbg_latch
> > > > which
> > > > will
> > > > immediately capture the current state on the next read of
> > > > slp_s0_debug_status. Also while in intel_pmc_core.h clean up
> > > > spacing.
> > > > 
> > > 
> > > Initially, unless the latch bit is not set the debugfs file does
> > > not
> > > show
> > > any information as expected but once you write Y to latch file,
> > > the
> > > debugfs
> > > file continues to show blockers even though you write N back
> > > there or
> > > unload
> > > - reload the driver. Please fix this.
> > 
> > See comments below
> > 
> > > 
> > > > Signed-off-by: David E. Box 
> > > > ---
> > > > 
> > > > V2:
> > > > Per Andy Shevchenko:
> > > > - Clear latch bit after use
> > > > - Pass pmc_dev as parameter
> > > > - Use DEFINE_SHOW_ATTRIBUTE macro
> > > > 
> > > >  drivers/platform/x86/intel_pmc_core.c | 112
> > > > ++
> > > >  drivers/platform/x86/intel_pmc_core.h |  27 +---
> > > >  2 files changed, 132 insertions(+), 7 deletions(-)
> > > > 
> > > > diff --git a/drivers/platform/x86/intel_pmc_core.c
> > > > b/drivers/platform/x86/intel_pmc_core.c
> > > > index 43bbe74..ed40999 100644
> > > > --- a/drivers/platform/x86/intel_pmc_core.c
> > > > +++ b/drivers/platform/x86/intel_pmc_core.c
> > > > @@ -196,9 +196,64 @@ static const struct pmc_bit_map
> > > > cnp_pfear_map[] = {
> > > > {}
> > > >  };
> > > >  
> > > > +static const struct pmc_bit_map cnp_slps0_dbg0_map[] = {
> > > > +   {"AUDIO_D3",BIT(0)},
> > > > +   {"OTG_D3",  BIT(1)},
> > > > +   {"XHCI_D3", BIT(2)},
> > > > +   {"LPIO_D3", BIT(3)},
> > > > +   {"SDX_D3",  BIT(4)},
> > > > +   {"SATA_D3", BIT(5)},
> > > > +   {"UFS0_D3", BIT(6)},
> > > > +   {"UFS1_D3", BIT(7)},
> > > > +   {"EMMC_D3", BIT(8)},
> > > > +};
> > > > +
> > > > +static const struct pmc_bit_map cnp_slps0_dbg1_map[] = {
> > > > +   {"SDIO_PLL_OFF",BIT(0)},
> > > > +   {"USB2_PLL_OFF",BIT(1)},
> > > > +   {"AUDIO_PLL_OFF",   BIT(2)},
> > > > +   {"OC_PLL_OFF",  BIT(3)},
> > > 
> > > Please rename to ISCLK_OC as it is the preferred nomenclature for
> > > debug.
> > 
> > Okay
> > 
> > > 
> > > > +   {"MAIN_PLL_OFF",BIT(4)},
> > > 
> > > Ditto, please use ISCLK_MAIN.
> > > 
> > > > +   {"XOSC_OFF",BIT(5)},
> > > > +   {"LPC_CLKS_GATED",  BIT(6)},
> > > > +   {"PCIE_CLKREQS_IDLE",   BIT(7)},
> > > > +   {"AUDIO_ROSC_OFF",  BIT(8)},
> > > > +   {"HPET_XOSC_CLK_REQ",   BIT(9)},
> > > > +   {"PMC_ROSC_SLOW_CLK",   BIT(10)},
> > > > +   {"AON2_ROSC_GATED", BIT(11)},
> > > > +   {"CLKACKS_DEASSERTED",  BIT(12)},
> > > > +};
> > > > +
> > > > +static const struct pmc_bit_map cnp_slps0_dbg2_map[] = {
> > > > +   {"MPHY_CORE_GATED", BIT(0)},
> > > > +   {"CSME_GATED",  BIT(1)},
> > > > +   {"USB2_SUS_GATED",  BIT(2)},
> > > > +   {"DYN_FLEX_IO_IDLE",BIT(3)},
> > > > +   {"GBE_NO_LINK", BIT(4)},
> > > > +   {"THERM_SEN_DISABLED",  BIT(5)},
> > > > +   {"PCIE_LOW_POWER",  BIT(6)},
> > > > +   {"ISH_VNNAON_REQ_ACT",  BIT(7)},
> > > > +   {"ISH_VNN_REQ_ACT", BIT(8)},
> > > > +   {"CNV_VNNAON_REQ_ACT",  BIT(9)},
> > > > +   {"CNV_VNN_REQ_ACT", BIT(10)},
> > > > +   {"NPK_VNNON_REQ_ACT",   BIT(11)},
> > > > +   {"PMSYNC_STATE_IDLE",   BIT(12)},
> > > > +   {"ALST_GT_THRES",   BIT(13)},
> > > > +   {"PMC_ARC_PG_READY",BIT(14)},
> > > > +};
> > > > +
> > > > +static const struct slps0_dbg_map cnp_slps0_dbg_maps[] = {
> > > > +   {cnp_slps0_dbg0_map, ARRAY_SIZE(cnp_slps0_dbg0_map)},
> > > > +   {cnp_slps0_dbg1_map, ARRAY_SIZE(cnp_slps0_dbg1_map)},
> > > > +   {cnp_slps0_dbg2_map, ARRAY_SIZE(cnp_slps0_dbg2_map)},
> > > > +};
> > > > +
> > > >  static const struct pmc_reg_map cnp_reg_map = {
> > > > .pfear_sts = cnp_pfear_map,
> > > >  

Re: [PATCH V2] platform/x86: intel_pmc_core: Add CNP SLPS0 debug registers

2018-06-01 Thread Andy Shevchenko
On Fri, Jun 1, 2018 at 2:04 AM, David E. Box
 wrote:
> On Thu, 2018-05-31 at 21:38 +0300, Andy Shevchenko wrote:
>> On Fri, May 25, 2018 at 4:10 AM, David E. Box
>>  wrote:

>> > +struct slps0_dbg_map {
>> > +   const struct pmc_bit_map *slps0_dbg_sts;
>> > +   int size;
>> > +};
>>
>> Didn't pay attention to this earlier. Why do we have a separate size
>> member? What does it define?
>
> It holds the size of the pmc_bit_map array, assigned as shown here:
>
> +static const struct slps0_dbg_map cnp_slps0_dbg_maps[] = {
> + {cnp_slps0_dbg0_map, ARRAY_SIZE(cnp_slps0_dbg0_map)},
> + {cnp_slps0_dbg1_map, ARRAY_SIZE(cnp_slps0_dbg1_map)},
> + {cnp_slps0_dbg2_map, ARRAY_SIZE(cnp_slps0_dbg2_map)},
> +};

I see.
Please drop this and use a terminator instead like it's done for the
rest map tables.

-- 
With Best Regards,
Andy Shevchenko


Re: [PATCH V2] platform/x86: intel_pmc_core: Add CNP SLPS0 debug registers

2018-05-31 Thread David E. Box
On Thu, 2018-05-31 at 21:38 +0300, Andy Shevchenko wrote:
> On Fri, May 25, 2018 at 4:10 AM, David E. Box
>  wrote:
> > Adds debugfs access to registers in the Cannon Point PCH PMC that
> > are
> > useful for debugging #SLP_S0 signal assertion and other low power
> > related
> > activities. Device pm states are latched in these registers
> > whenever the
> > package enters C10 and can be read from slp_s0_debug_status. The pm
> > states may also be latched by writing 1 to slp_s0_dbg_latch which
> > will
> > immediately capture the current state on the next read of
> > slp_s0_debug_status. Also while in intel_pmc_core.h clean up
> > spacing.
> > 
> 
> Thanks for an update. My comments below.
> 
> As far as I understand there is still ongoing discussion about the
> approach when and how to show data. So I'll wait a bit for a
> settlement between you, guys.
> 
> > +static void pmc_core_slps0_dbg_latch(struct pmc_dev *pmcdev, bool
> > reset)
> > +{
> > +   const struct pmc_reg_map *map = pmcdev->map;
> > +   u32 fd;
> > +
> > +   mutex_lock(&pmcdev->lock);
> > +
> > +   if (!reset && !slps0_dbg_latch)
> > +   goto out_unlock;
> > +
> > +   fd = pmc_core_reg_read(pmcdev, map->slps0_dbg_offset);
> > +   reset ? (fd &= ~CNP_PMC_LATCH_SLPS0_EVENTS) :
> > +   (fd |= CNP_PMC_LATCH_SLPS0_EVENTS);
> 
> I would rather use classical pattern here, i.e.
> 
> if (reset)
>  fd ...
> else
>  fd ...
> 
> > +   pmc_core_reg_write(pmcdev, map->slps0_dbg_offset, fd);
> > +
> > +   slps0_dbg_latch = 0;
> > +
> > +out_unlock:
> > +   mutex_unlock(&pmcdev->lock);
> > +}
> > +   struct pmc_dev *pmcdev = s ? s->private : &pmc;
> 
> I'm not sure why do we need such condition.
> 
> Simple
> 
> ... pmcdev = s->private;
> 
> is enough.
> 
> >  /* Cannonlake Power Management Controller register offsets */
> > -#define CNP_PMC_SLP_S0_RES_COUNTER_OFFSET  0x193C
> > -#define CNP_PMC_LTR_IGNORE_OFFSET  0x1B0C
> > -#define CNP_PMC_PM_CFG_OFFSET  0x1818
> > +#define CNP_PMC_SLP_S0_RES_COUNTER_OFFSET  0x193C
> > +#define CNP_PMC_LTR_IGNORE_OFFSET  0x1B0C
> > +#define CNP_PMC_PM_CFG_OFFSET  0x1818
> 
> I have hard time to understand what is the difference here.
> Either do another clean up patch (white spaces vs. tabs?) or leave it
> untouched.
> 
> >  /* Cannonlake: PGD PFET Enable Ack Status Register(s) start */
> > -#define CNP_PMC_HOST_PPFEAR0A  0x1D90
> > +#define CNP_PMC_HOST_PPFEAR0A  0x1D90
> > 
> > -#define CNP_PMC_MMIO_REG_LEN   0x2000
> > -#define CNP_PPFEAR_NUM_ENTRIES 8
> > -#define CNP_PMC_READ_DISABLE_BIT   22
> > +#define CNP_PMC_MMIO_REG_LEN   0x2000
> > +#define CNP_PPFEAR_NUM_ENTRIES 8
> > +#define CNP_PMC_READ_DISABLE_BIT   22
> 
> Ditto.
> 
> > +struct slps0_dbg_map {
> > +   const struct pmc_bit_map *slps0_dbg_sts;
> > +   int size;
> > +};
> 
> Didn't pay attention to this earlier. Why do we have a separate size
> member? What does it define?

It holds the size of the pmc_bit_map array, assigned as shown here:

+static const struct slps0_dbg_map cnp_slps0_dbg_maps[] = {
+ {cnp_slps0_dbg0_map, ARRAY_SIZE(cnp_slps0_dbg0_map)},
+ {cnp_slps0_dbg1_map, ARRAY_SIZE(cnp_slps0_dbg1_map)},
+ {cnp_slps0_dbg2_map, ARRAY_SIZE(cnp_slps0_dbg2_map)},
+};


Okay on all other comments

Dave


Re: [PATCH V2] platform/x86: intel_pmc_core: Add CNP SLPS0 debug registers

2018-05-31 Thread Andy Shevchenko
On Fri, May 25, 2018 at 4:10 AM, David E. Box
 wrote:
> Adds debugfs access to registers in the Cannon Point PCH PMC that are
> useful for debugging #SLP_S0 signal assertion and other low power related
> activities. Device pm states are latched in these registers whenever the
> package enters C10 and can be read from slp_s0_debug_status. The pm
> states may also be latched by writing 1 to slp_s0_dbg_latch which will
> immediately capture the current state on the next read of
> slp_s0_debug_status. Also while in intel_pmc_core.h clean up spacing.
>

Thanks for an update. My comments below.

As far as I understand there is still ongoing discussion about the
approach when and how to show data. So I'll wait a bit for a
settlement between you, guys.

> +static void pmc_core_slps0_dbg_latch(struct pmc_dev *pmcdev, bool reset)
> +{
> +   const struct pmc_reg_map *map = pmcdev->map;
> +   u32 fd;
> +
> +   mutex_lock(&pmcdev->lock);
> +
> +   if (!reset && !slps0_dbg_latch)
> +   goto out_unlock;
> +
> +   fd = pmc_core_reg_read(pmcdev, map->slps0_dbg_offset);

> +   reset ? (fd &= ~CNP_PMC_LATCH_SLPS0_EVENTS) :
> +   (fd |= CNP_PMC_LATCH_SLPS0_EVENTS);

I would rather use classical pattern here, i.e.

if (reset)
 fd ...
else
 fd ...

> +   pmc_core_reg_write(pmcdev, map->slps0_dbg_offset, fd);
> +
> +   slps0_dbg_latch = 0;
> +
> +out_unlock:
> +   mutex_unlock(&pmcdev->lock);
> +}

> +   struct pmc_dev *pmcdev = s ? s->private : &pmc;

I'm not sure why do we need such condition.

Simple

... pmcdev = s->private;

is enough.

>  /* Cannonlake Power Management Controller register offsets */
> -#define CNP_PMC_SLP_S0_RES_COUNTER_OFFSET  0x193C
> -#define CNP_PMC_LTR_IGNORE_OFFSET  0x1B0C
> -#define CNP_PMC_PM_CFG_OFFSET  0x1818
> +#define CNP_PMC_SLP_S0_RES_COUNTER_OFFSET  0x193C
> +#define CNP_PMC_LTR_IGNORE_OFFSET  0x1B0C
> +#define CNP_PMC_PM_CFG_OFFSET  0x1818

I have hard time to understand what is the difference here.
Either do another clean up patch (white spaces vs. tabs?) or leave it untouched.

>  /* Cannonlake: PGD PFET Enable Ack Status Register(s) start */
> -#define CNP_PMC_HOST_PPFEAR0A  0x1D90
> +#define CNP_PMC_HOST_PPFEAR0A  0x1D90
>
> -#define CNP_PMC_MMIO_REG_LEN   0x2000
> -#define CNP_PPFEAR_NUM_ENTRIES 8
> -#define CNP_PMC_READ_DISABLE_BIT   22
> +#define CNP_PMC_MMIO_REG_LEN   0x2000
> +#define CNP_PPFEAR_NUM_ENTRIES 8
> +#define CNP_PMC_READ_DISABLE_BIT   22

Ditto.

> +struct slps0_dbg_map {
> +   const struct pmc_bit_map *slps0_dbg_sts;
> +   int size;
> +};

Didn't pay attention to this earlier. Why do we have a separate size
member? What does it define?

-- 
With Best Regards,
Andy Shevchenko


Re: [PATCH V2] platform/x86: intel_pmc_core: Add CNP SLPS0 debug registers

2018-05-30 Thread Rajneesh Bhardwaj
On Wed, May 30, 2018 at 03:53:12AM -0700, David E. Box wrote:

Hi Dave,

> Hi Rajneesh,
> 
> On Mon, 2018-05-28 at 12:30 +0530, Rajneesh Bhardwaj wrote:
> > On Thu, May 24, 2018 at 06:10:56PM -0700, David E. Box wrote:
> > 
> > Thanks for sending this, Dave. Few comments below.
> > 
> > > Adds debugfs access to registers in the Cannon Point PCH PMC that
> > > are
> > 
> > Please use Cannonlake PCH.
> > 
> > > useful for debugging #SLP_S0 signal assertion and other low power
> > > related
> > 
> > assertion failures and other low power debug.
> > 
> > > activities. Device pm states are latched in these registers
> > > whenever the
> > > package enters C10 and can be read from slp_s0_debug_status. The pm
> > > states may also be latched by writing 1 to slp_s0_dbg_latch which
> > > will
> > > immediately capture the current state on the next read of
> > > slp_s0_debug_status. Also while in intel_pmc_core.h clean up
> > > spacing.
> > > 
> > 
> > Initially, unless the latch bit is not set the debugfs file does not
> > show
> > any information as expected but once you write Y to latch file, the
> > debugfs
> > file continues to show blockers even though you write N back there or
> > unload
> > - reload the driver. Please fix this.
> 
> See comments below
> 
> > 
> > > Signed-off-by: David E. Box 
> > > ---
> > > 
> > > V2:
> > >   Per Andy Shevchenko:
> > >   - Clear latch bit after use
> > >   - Pass pmc_dev as parameter
> > >   - Use DEFINE_SHOW_ATTRIBUTE macro
> > > 
> > >  drivers/platform/x86/intel_pmc_core.c | 112
> > > ++
> > >  drivers/platform/x86/intel_pmc_core.h |  27 +---
> > >  2 files changed, 132 insertions(+), 7 deletions(-)
> > > 
> > > diff --git a/drivers/platform/x86/intel_pmc_core.c
> > > b/drivers/platform/x86/intel_pmc_core.c
> > > index 43bbe74..ed40999 100644
> > > --- a/drivers/platform/x86/intel_pmc_core.c
> > > +++ b/drivers/platform/x86/intel_pmc_core.c
> > > @@ -196,9 +196,64 @@ static const struct pmc_bit_map
> > > cnp_pfear_map[] = {
> > >   {}
> > >  };
> > >  
> > > +static const struct pmc_bit_map cnp_slps0_dbg0_map[] = {
> > > + {"AUDIO_D3",BIT(0)},
> > > + {"OTG_D3",  BIT(1)},
> > > + {"XHCI_D3", BIT(2)},
> > > + {"LPIO_D3", BIT(3)},
> > > + {"SDX_D3",  BIT(4)},
> > > + {"SATA_D3", BIT(5)},
> > > + {"UFS0_D3", BIT(6)},
> > > + {"UFS1_D3", BIT(7)},
> > > + {"EMMC_D3", BIT(8)},
> > > +};
> > > +
> > > +static const struct pmc_bit_map cnp_slps0_dbg1_map[] = {
> > > + {"SDIO_PLL_OFF",BIT(0)},
> > > + {"USB2_PLL_OFF",BIT(1)},
> > > + {"AUDIO_PLL_OFF",   BIT(2)},
> > > + {"OC_PLL_OFF",  BIT(3)},
> > 
> > Please rename to ISCLK_OC as it is the preferred nomenclature for
> > debug.
> 
> Okay
> 
> > 
> > > + {"MAIN_PLL_OFF",BIT(4)},
> > 
> > Ditto, please use ISCLK_MAIN.
> > 
> > > + {"XOSC_OFF",BIT(5)},
> > > + {"LPC_CLKS_GATED",  BIT(6)},
> > > + {"PCIE_CLKREQS_IDLE",   BIT(7)},
> > > + {"AUDIO_ROSC_OFF",  BIT(8)},
> > > + {"HPET_XOSC_CLK_REQ",   BIT(9)},
> > > + {"PMC_ROSC_SLOW_CLK",   BIT(10)},
> > > + {"AON2_ROSC_GATED", BIT(11)},
> > > + {"CLKACKS_DEASSERTED",  BIT(12)},
> > > +};
> > > +
> > > +static const struct pmc_bit_map cnp_slps0_dbg2_map[] = {
> > > + {"MPHY_CORE_GATED", BIT(0)},
> > > + {"CSME_GATED",  BIT(1)},
> > > + {"USB2_SUS_GATED",  BIT(2)},
> > > + {"DYN_FLEX_IO_IDLE",BIT(3)},
> > > + {"GBE_NO_LINK", BIT(4)},
> > > + {"THERM_SEN_DISABLED",  BIT(5)},
> > > + {"PCIE_LOW_POWER",  BIT(6)},
> > > + {"ISH_VNNAON_REQ_ACT",  BIT(7)},
> > > + {"ISH_VNN_REQ_ACT", BIT(8)},
> > > + {"CNV_VNNAON_REQ_ACT",  BIT(9)},
> > > + {"CNV_VNN_REQ_ACT", BIT(10)},
> > > + {"NPK_VNNON_REQ_ACT",   BIT(11)},
> > > + {"PMSYNC_STATE_IDLE",   BIT(12)},
> > > + {"ALST_GT_THRES",   BIT(13)},
> > > + {"PMC_ARC_PG_READY",BIT(14)},
> > > +};
> > > +
> > > +static const struct slps0_dbg_map cnp_slps0_dbg_maps[] = {
> > > + {cnp_slps0_dbg0_map, ARRAY_SIZE(cnp_slps0_dbg0_map)},
> > > + {cnp_slps0_dbg1_map, ARRAY_SIZE(cnp_slps0_dbg1_map)},
> > > + {cnp_slps0_dbg2_map, ARRAY_SIZE(cnp_slps0_dbg2_map)},
> > > +};
> > > +
> > >  static const struct pmc_reg_map cnp_reg_map = {
> > >   .pfear_sts = cnp_pfear_map,
> > >   .slp_s0_offset = CNP_PMC_SLP_S0_RES_COUNTER_OFFSET,
> > > + .slps0_dbg_maps = cnp_slps0_dbg_maps,
> > > + .slps0_dbg_offset = CNP_PMC_SLPS0_DBG_OFFSET,
> > > + .slps0_dbg_num = ARRAY_SIZE(cnp_slps0_dbg_maps),
> > >   .ltr_ignore_offset = CNP_PMC_LTR_IGNORE_OFFSET,
> > >   .regmap_length = CNP_PMC_MMIO_REG_LEN,
> > >   .ppfear0_offset = CNP_PMC_HOST_PPFEAR0A,
> > > @@ -252,6 +307,8 @@ static int pmc_core_check_read_lock_bit(void)
> > >  }
> > >  
> > >  #if IS_ENABLED(CONFIG_DEBUG_FS)
> > > +static bool slps0_dbg_latch;
> > > +
> > >  static void pmc_core_display_map(struct seq_file *s, int index,
> > >u8 pf_reg, con

Re: [PATCH V2] platform/x86: intel_pmc_core: Add CNP SLPS0 debug registers

2018-05-30 Thread David E. Box
Hi Rajneesh,

On Mon, 2018-05-28 at 12:30 +0530, Rajneesh Bhardwaj wrote:
> On Thu, May 24, 2018 at 06:10:56PM -0700, David E. Box wrote:
> 
> Thanks for sending this, Dave. Few comments below.
> 
> > Adds debugfs access to registers in the Cannon Point PCH PMC that
> > are
> 
> Please use Cannonlake PCH.
> 
> > useful for debugging #SLP_S0 signal assertion and other low power
> > related
> 
> assertion failures and other low power debug.
> 
> > activities. Device pm states are latched in these registers
> > whenever the
> > package enters C10 and can be read from slp_s0_debug_status. The pm
> > states may also be latched by writing 1 to slp_s0_dbg_latch which
> > will
> > immediately capture the current state on the next read of
> > slp_s0_debug_status. Also while in intel_pmc_core.h clean up
> > spacing.
> > 
> 
> Initially, unless the latch bit is not set the debugfs file does not
> show
> any information as expected but once you write Y to latch file, the
> debugfs
> file continues to show blockers even though you write N back there or
> unload
> - reload the driver. Please fix this.

See comments below

> 
> > Signed-off-by: David E. Box 
> > ---
> > 
> > V2:
> > Per Andy Shevchenko:
> > - Clear latch bit after use
> > - Pass pmc_dev as parameter
> > - Use DEFINE_SHOW_ATTRIBUTE macro
> > 
> >  drivers/platform/x86/intel_pmc_core.c | 112
> > ++
> >  drivers/platform/x86/intel_pmc_core.h |  27 +---
> >  2 files changed, 132 insertions(+), 7 deletions(-)
> > 
> > diff --git a/drivers/platform/x86/intel_pmc_core.c
> > b/drivers/platform/x86/intel_pmc_core.c
> > index 43bbe74..ed40999 100644
> > --- a/drivers/platform/x86/intel_pmc_core.c
> > +++ b/drivers/platform/x86/intel_pmc_core.c
> > @@ -196,9 +196,64 @@ static const struct pmc_bit_map
> > cnp_pfear_map[] = {
> > {}
> >  };
> >  
> > +static const struct pmc_bit_map cnp_slps0_dbg0_map[] = {
> > +   {"AUDIO_D3",BIT(0)},
> > +   {"OTG_D3",  BIT(1)},
> > +   {"XHCI_D3", BIT(2)},
> > +   {"LPIO_D3", BIT(3)},
> > +   {"SDX_D3",  BIT(4)},
> > +   {"SATA_D3", BIT(5)},
> > +   {"UFS0_D3", BIT(6)},
> > +   {"UFS1_D3", BIT(7)},
> > +   {"EMMC_D3", BIT(8)},
> > +};
> > +
> > +static const struct pmc_bit_map cnp_slps0_dbg1_map[] = {
> > +   {"SDIO_PLL_OFF",BIT(0)},
> > +   {"USB2_PLL_OFF",BIT(1)},
> > +   {"AUDIO_PLL_OFF",   BIT(2)},
> > +   {"OC_PLL_OFF",  BIT(3)},
> 
> Please rename to ISCLK_OC as it is the preferred nomenclature for
> debug.

Okay

> 
> > +   {"MAIN_PLL_OFF",BIT(4)},
> 
> Ditto, please use ISCLK_MAIN.
> 
> > +   {"XOSC_OFF",BIT(5)},
> > +   {"LPC_CLKS_GATED",  BIT(6)},
> > +   {"PCIE_CLKREQS_IDLE",   BIT(7)},
> > +   {"AUDIO_ROSC_OFF",  BIT(8)},
> > +   {"HPET_XOSC_CLK_REQ",   BIT(9)},
> > +   {"PMC_ROSC_SLOW_CLK",   BIT(10)},
> > +   {"AON2_ROSC_GATED", BIT(11)},
> > +   {"CLKACKS_DEASSERTED",  BIT(12)},
> > +};
> > +
> > +static const struct pmc_bit_map cnp_slps0_dbg2_map[] = {
> > +   {"MPHY_CORE_GATED", BIT(0)},
> > +   {"CSME_GATED",  BIT(1)},
> > +   {"USB2_SUS_GATED",  BIT(2)},
> > +   {"DYN_FLEX_IO_IDLE",BIT(3)},
> > +   {"GBE_NO_LINK", BIT(4)},
> > +   {"THERM_SEN_DISABLED",  BIT(5)},
> > +   {"PCIE_LOW_POWER",  BIT(6)},
> > +   {"ISH_VNNAON_REQ_ACT",  BIT(7)},
> > +   {"ISH_VNN_REQ_ACT", BIT(8)},
> > +   {"CNV_VNNAON_REQ_ACT",  BIT(9)},
> > +   {"CNV_VNN_REQ_ACT", BIT(10)},
> > +   {"NPK_VNNON_REQ_ACT",   BIT(11)},
> > +   {"PMSYNC_STATE_IDLE",   BIT(12)},
> > +   {"ALST_GT_THRES",   BIT(13)},
> > +   {"PMC_ARC_PG_READY",BIT(14)},
> > +};
> > +
> > +static const struct slps0_dbg_map cnp_slps0_dbg_maps[] = {
> > +   {cnp_slps0_dbg0_map, ARRAY_SIZE(cnp_slps0_dbg0_map)},
> > +   {cnp_slps0_dbg1_map, ARRAY_SIZE(cnp_slps0_dbg1_map)},
> > +   {cnp_slps0_dbg2_map, ARRAY_SIZE(cnp_slps0_dbg2_map)},
> > +};
> > +
> >  static const struct pmc_reg_map cnp_reg_map = {
> > .pfear_sts = cnp_pfear_map,
> > .slp_s0_offset = CNP_PMC_SLP_S0_RES_COUNTER_OFFSET,
> > +   .slps0_dbg_maps = cnp_slps0_dbg_maps,
> > +   .slps0_dbg_offset = CNP_PMC_SLPS0_DBG_OFFSET,
> > +   .slps0_dbg_num = ARRAY_SIZE(cnp_slps0_dbg_maps),
> > .ltr_ignore_offset = CNP_PMC_LTR_IGNORE_OFFSET,
> > .regmap_length = CNP_PMC_MMIO_REG_LEN,
> > .ppfear0_offset = CNP_PMC_HOST_PPFEAR0A,
> > @@ -252,6 +307,8 @@ static int pmc_core_check_read_lock_bit(void)
> >  }
> >  
> >  #if IS_ENABLED(CONFIG_DEBUG_FS)
> > +static bool slps0_dbg_latch;
> > +
> >  static void pmc_core_display_map(struct seq_file *s, int index,
> >  u8 pf_reg, const struct
> > pmc_bit_map *pf_map)
> >  {
> > @@ -481,6 +538,52 @@ static const struct file_operations
> > pmc_core_ltr_ignore_ops = {
> > .release= single_release,
> >  };
> >  
> > +static void pmc_core_slps0_dbg_latch(struct pmc_dev

Re: [PATCH V2] platform/x86: intel_pmc_core: Add CNP SLPS0 debug registers

2018-05-28 Thread Rajneesh Bhardwaj
On Thu, May 24, 2018 at 06:10:56PM -0700, David E. Box wrote:

Thanks for sending this, Dave. Few comments below.

> Adds debugfs access to registers in the Cannon Point PCH PMC that are

Please use Cannonlake PCH.

> useful for debugging #SLP_S0 signal assertion and other low power related

assertion failures and other low power debug.

> activities. Device pm states are latched in these registers whenever the
> package enters C10 and can be read from slp_s0_debug_status. The pm
> states may also be latched by writing 1 to slp_s0_dbg_latch which will
> immediately capture the current state on the next read of
> slp_s0_debug_status. Also while in intel_pmc_core.h clean up spacing.
> 

Initially, unless the latch bit is not set the debugfs file does not show
any information as expected but once you write Y to latch file, the debugfs
file continues to show blockers even though you write N back there or unload
- reload the driver. Please fix this.

> Signed-off-by: David E. Box 
> ---
> 
> V2:
>   Per Andy Shevchenko:
>   - Clear latch bit after use
>   - Pass pmc_dev as parameter
>   - Use DEFINE_SHOW_ATTRIBUTE macro
> 
>  drivers/platform/x86/intel_pmc_core.c | 112 
> ++
>  drivers/platform/x86/intel_pmc_core.h |  27 +---
>  2 files changed, 132 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/platform/x86/intel_pmc_core.c 
> b/drivers/platform/x86/intel_pmc_core.c
> index 43bbe74..ed40999 100644
> --- a/drivers/platform/x86/intel_pmc_core.c
> +++ b/drivers/platform/x86/intel_pmc_core.c
> @@ -196,9 +196,64 @@ static const struct pmc_bit_map cnp_pfear_map[] = {
>   {}
>  };
>  
> +static const struct pmc_bit_map cnp_slps0_dbg0_map[] = {
> + {"AUDIO_D3",BIT(0)},
> + {"OTG_D3",  BIT(1)},
> + {"XHCI_D3", BIT(2)},
> + {"LPIO_D3", BIT(3)},
> + {"SDX_D3",  BIT(4)},
> + {"SATA_D3", BIT(5)},
> + {"UFS0_D3", BIT(6)},
> + {"UFS1_D3", BIT(7)},
> + {"EMMC_D3", BIT(8)},
> +};
> +
> +static const struct pmc_bit_map cnp_slps0_dbg1_map[] = {
> + {"SDIO_PLL_OFF",BIT(0)},
> + {"USB2_PLL_OFF",BIT(1)},
> + {"AUDIO_PLL_OFF",   BIT(2)},
> + {"OC_PLL_OFF",  BIT(3)},

Please rename to ISCLK_OC as it is the preferred nomenclature for debug.

> + {"MAIN_PLL_OFF",BIT(4)},

Ditto, please use ISCLK_MAIN.

> + {"XOSC_OFF",BIT(5)},
> + {"LPC_CLKS_GATED",  BIT(6)},
> + {"PCIE_CLKREQS_IDLE",   BIT(7)},
> + {"AUDIO_ROSC_OFF",  BIT(8)},
> + {"HPET_XOSC_CLK_REQ",   BIT(9)},
> + {"PMC_ROSC_SLOW_CLK",   BIT(10)},
> + {"AON2_ROSC_GATED", BIT(11)},
> + {"CLKACKS_DEASSERTED",  BIT(12)},
> +};
> +
> +static const struct pmc_bit_map cnp_slps0_dbg2_map[] = {
> + {"MPHY_CORE_GATED", BIT(0)},
> + {"CSME_GATED",  BIT(1)},
> + {"USB2_SUS_GATED",  BIT(2)},
> + {"DYN_FLEX_IO_IDLE",BIT(3)},
> + {"GBE_NO_LINK", BIT(4)},
> + {"THERM_SEN_DISABLED",  BIT(5)},
> + {"PCIE_LOW_POWER",  BIT(6)},
> + {"ISH_VNNAON_REQ_ACT",  BIT(7)},
> + {"ISH_VNN_REQ_ACT", BIT(8)},
> + {"CNV_VNNAON_REQ_ACT",  BIT(9)},
> + {"CNV_VNN_REQ_ACT", BIT(10)},
> + {"NPK_VNNON_REQ_ACT",   BIT(11)},
> + {"PMSYNC_STATE_IDLE",   BIT(12)},
> + {"ALST_GT_THRES",   BIT(13)},
> + {"PMC_ARC_PG_READY",BIT(14)},
> +};
> +
> +static const struct slps0_dbg_map cnp_slps0_dbg_maps[] = {
> + {cnp_slps0_dbg0_map, ARRAY_SIZE(cnp_slps0_dbg0_map)},
> + {cnp_slps0_dbg1_map, ARRAY_SIZE(cnp_slps0_dbg1_map)},
> + {cnp_slps0_dbg2_map, ARRAY_SIZE(cnp_slps0_dbg2_map)},
> +};
> +
>  static const struct pmc_reg_map cnp_reg_map = {
>   .pfear_sts = cnp_pfear_map,
>   .slp_s0_offset = CNP_PMC_SLP_S0_RES_COUNTER_OFFSET,
> + .slps0_dbg_maps = cnp_slps0_dbg_maps,
> + .slps0_dbg_offset = CNP_PMC_SLPS0_DBG_OFFSET,
> + .slps0_dbg_num = ARRAY_SIZE(cnp_slps0_dbg_maps),
>   .ltr_ignore_offset = CNP_PMC_LTR_IGNORE_OFFSET,
>   .regmap_length = CNP_PMC_MMIO_REG_LEN,
>   .ppfear0_offset = CNP_PMC_HOST_PPFEAR0A,
> @@ -252,6 +307,8 @@ static int pmc_core_check_read_lock_bit(void)
>  }
>  
>  #if IS_ENABLED(CONFIG_DEBUG_FS)
> +static bool slps0_dbg_latch;
> +
>  static void pmc_core_display_map(struct seq_file *s, int index,
>u8 pf_reg, const struct pmc_bit_map *pf_map)
>  {
> @@ -481,6 +538,52 @@ static const struct file_operations 
> pmc_core_ltr_ignore_ops = {
>   .release= single_release,
>  };
>  
> +static void pmc_core_slps0_dbg_latch(struct pmc_dev *pmcdev, bool reset)
> +{
> + const struct pmc_reg_map *map = pmcdev->map;
> + u32 fd;
> +
> + mutex_lock(&pmcdev->lock);
> +
> + if (!reset && !slps0_dbg_latch)
> + goto out_unlock;
> +
> + fd = pmc_core_reg_read(pmcdev, map->slps0_dbg_offset);
> +