[0/7] Add TPMI support

Message ID 20230202010738.2186174-1-srinivas.pandruvada@linux.intel.com
Headers
Series Add TPMI support |

Message

srinivas pandruvada Feb. 2, 2023, 1:07 a.m. UTC
  The TPMI (Topology Aware Register and PM Capsule Interface) provides a
flexible, extendable and PCIe enumerable MMIO interface for PM features.

For example Intel Speed Select Technology (Intel SST) can replace all
mailbox commands with direct MMIO access. This reduces latency for
SST commands and also defines an architectural interface which will
persist for several next generations.

Also Intel RAPL (Running Average Power Limit) provides a MMIO
interface using TPMI. This has advantage over traditional MSR
(Model Specific Register) interface, where a thread needs to be scheduled
on the target CPU to read or write. Also the RAPL features vary between
CPU models, and hence lot of model specific code. Here TPMI provides an
architectural interface by providing hierarchical tables and fields,
which will not need any model specific implementation.

Same value is for Intel Uncore frequency where MSR interface can't
be used because of multiple domains.

The TPMI interface uses a PCI VSEC structure to expose the location of
MMIO region, which is handled by Intel VSEC driver. Intel VSEC driver is
already present in upstream kernel.

This series contains the base driver, which parses TPMI MMIO region
and creates device nodes for supported features. The current set of
PM feature support includes, Intel Speed Select, RAPL, Uncore frequency
scaling.

The first there patches updates Intel VSEC driver to add TPMI VSEC ID
and enhance to reuse the code.
The next three patches adds TPMI base driver support.
The last patch adds MAINTAINERS entry.

The TPMI documentation can be downloaded from:
https://github.com/intel/tpmi_power_management

This series cleanly applies on 6.2-rc1.

Srinivas Pandruvada (7):
  platform/x86/intel/vsec: Add TPMI ID
  platform/x86/intel/vsec: Enhance and Export intel_vsec_add_aux()
  platform/x86/intel/vsec: Support private data
  platform/x86/intel: Intel TPMI enumeration driver
  platform/x86/intel/tpmi: Process CPU package mapping
  platform/x86/intel/tpmi: ADD tpmi external interface for tpmi feature
    drivers
  MAINTAINERS: Add entry for TPMI driver

 MAINTAINERS                         |   6 +
 drivers/platform/x86/intel/Kconfig  |  13 +
 drivers/platform/x86/intel/Makefile |   4 +
 drivers/platform/x86/intel/tpmi.c   | 415 ++++++++++++++++++++++++++++
 drivers/platform/x86/intel/vsec.c   |  21 +-
 drivers/platform/x86/intel/vsec.h   |   6 +
 include/linux/intel_tpmi.h          |  30 ++
 7 files changed, 490 insertions(+), 5 deletions(-)
 create mode 100644 drivers/platform/x86/intel/tpmi.c
 create mode 100644 include/linux/intel_tpmi.h
  

Comments

Hans de Goede Feb. 6, 2023, 12:49 p.m. UTC | #1
Hi,

On 2/2/23 02:07, Srinivas Pandruvada wrote:
> The TPMI (Topology Aware Register and PM Capsule Interface) provides a
> flexible, extendable and PCIe enumerable MMIO interface for PM features.
> 
> For example Intel Speed Select Technology (Intel SST) can replace all
> mailbox commands with direct MMIO access. This reduces latency for
> SST commands and also defines an architectural interface which will
> persist for several next generations.
> 
> Also Intel RAPL (Running Average Power Limit) provides a MMIO
> interface using TPMI. This has advantage over traditional MSR
> (Model Specific Register) interface, where a thread needs to be scheduled
> on the target CPU to read or write. Also the RAPL features vary between
> CPU models, and hence lot of model specific code. Here TPMI provides an
> architectural interface by providing hierarchical tables and fields,
> which will not need any model specific implementation.
> 
> Same value is for Intel Uncore frequency where MSR interface can't
> be used because of multiple domains.
> 
> The TPMI interface uses a PCI VSEC structure to expose the location of
> MMIO region, which is handled by Intel VSEC driver. Intel VSEC driver is
> already present in upstream kernel.
> 
> This series contains the base driver, which parses TPMI MMIO region
> and creates device nodes for supported features. The current set of
> PM feature support includes, Intel Speed Select, RAPL, Uncore frequency
> scaling.
> 
> The first there patches updates Intel VSEC driver to add TPMI VSEC ID
> and enhance to reuse the code.
> The next three patches adds TPMI base driver support.
> The last patch adds MAINTAINERS entry.
> 
> The TPMI documentation can be downloaded from:
> https://github.com/intel/tpmi_power_management
> 
> This series cleanly applies on 6.2-rc1.

Thank you for your patch-series, I've applied the series to my
review-hans branch:
https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans

Note it will show up in my review-hans branch once I've pushed my
local branch there, which might take a while.

Once I've run some tests on this branch the patches there will be
added to the platform-drivers-x86/for-next branch and eventually
will be included in the pdx86 pull-request to Linus for the next
merge-window.

Regards,

Hans




> Srinivas Pandruvada (7):
>   platform/x86/intel/vsec: Add TPMI ID
>   platform/x86/intel/vsec: Enhance and Export intel_vsec_add_aux()
>   platform/x86/intel/vsec: Support private data
>   platform/x86/intel: Intel TPMI enumeration driver
>   platform/x86/intel/tpmi: Process CPU package mapping
>   platform/x86/intel/tpmi: ADD tpmi external interface for tpmi feature
>     drivers
>   MAINTAINERS: Add entry for TPMI driver
> 
>  MAINTAINERS                         |   6 +
>  drivers/platform/x86/intel/Kconfig  |  13 +
>  drivers/platform/x86/intel/Makefile |   4 +
>  drivers/platform/x86/intel/tpmi.c   | 415 ++++++++++++++++++++++++++++
>  drivers/platform/x86/intel/vsec.c   |  21 +-
>  drivers/platform/x86/intel/vsec.h   |   6 +
>  include/linux/intel_tpmi.h          |  30 ++
>  7 files changed, 490 insertions(+), 5 deletions(-)
>  create mode 100644 drivers/platform/x86/intel/tpmi.c
>  create mode 100644 include/linux/intel_tpmi.h
>
  
Hans de Goede Feb. 6, 2023, 12:55 p.m. UTC | #2
Hi,

On 2/6/23 13:49, Hans de Goede wrote:

> Thank you for your patch-series, I've applied the series to my
> review-hans branch:
> https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans
> 
> Note it will show up in my review-hans branch once I've pushed my
> local branch there, which might take a while.
> 
> Once I've run some tests on this branch the patches there will be
> added to the platform-drivers-x86/for-next branch and eventually
> will be included in the pdx86 pull-request to Linus for the next
> merge-window.

One thing which I did notice, which is a pre-existing problem
is that the IDA accesses in drivers/platform/x86/intel/vsec.c
are not protected by any locking.

This is likely ok for now because there is only 1 PCI device
per type of ida and the enumeration of the vsec devices
under the PCI device is done in a single loop, so all
IDA accesses are single threaded atm.

But still IMHO it would be good to protect the IDA accesses
(ida_alloc() / ida_free()) with a mutex to protect against
any future races.

I think that a single global static mutex inside
drivers/platform/x86/intel/vsec.c to protect the
ida calls there should suffice for this.

Regards,

Hans
  
srinivas pandruvada Feb. 6, 2023, 1:29 p.m. UTC | #3
Hi Hans,

On Mon, 2023-02-06 at 13:55 +0100, Hans de Goede wrote:
> Hi,
> 
> On 2/6/23 13:49, Hans de Goede wrote:
> 
> > Thank you for your patch-series, I've applied the series to my
> > review-hans branch:
> > https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans
> > 
> > Note it will show up in my review-hans branch once I've pushed my
> > local branch there, which might take a while.
> > 
> > Once I've run some tests on this branch the patches there will be
> > added to the platform-drivers-x86/for-next branch and eventually
> > will be included in the pdx86 pull-request to Linus for the next
> > merge-window.
> 
> One thing which I did notice, which is a pre-existing problem
> is that the IDA accesses in drivers/platform/x86/intel/vsec.c
> are not protected by any locking.
> 
> This is likely ok for now because there is only 1 PCI device
> per type of ida and the enumeration of the vsec devices
> under the PCI device is done in a single loop, so all
> IDA accesses are single threaded atm.
> 
> But still IMHO it would be good to protect the IDA accesses
> (ida_alloc() / ida_free()) with a mutex to protect against
> any future races.
> 
> I think that a single global static mutex inside
> drivers/platform/x86/intel/vsec.c to protect the
> ida calls there should suffice for this.
Let me look into this and get back.

Thanks,
Srinivas

> 
> Regards,
> 
> Hans
> 
> 
>
  
srinivas pandruvada Feb. 10, 2023, 8:04 a.m. UTC | #4
Hi Hans,

On Mon, 2023-02-06 at 13:49 +0100, Hans de Goede wrote:
> Hi,
> 
> On 2/2/23 02:07, Srinivas Pandruvada wrote:
> 
> 
[...]

> Thank you for your patch-series, I've applied the series to my
> review-hans branch:
> https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans
> 
> 
Thanks for the help here.

> Note it will show up in my review-hans branch once I've pushed my
> local branch there, which might take a while.
> 
> Once I've run some tests on this branch the patches there will be
> added to the platform-drivers-x86/for-next branch and eventually
> will be included in the pdx86 pull-request to Linus for the next
> merge-window.
I guess this will appear in 6.3 merge window.

Can I post next set of patches (targeted for 6.4)?

Thanks,
Srinivas

> 
> Regards,
> 
> Hans
> 
> 
> 
> 
> > Srinivas Pandruvada (7):
> >   platform/x86/intel/vsec: Add TPMI ID
> >   platform/x86/intel/vsec: Enhance and Export intel_vsec_add_aux()
> >   platform/x86/intel/vsec: Support private data
> >   platform/x86/intel: Intel TPMI enumeration driver
> >   platform/x86/intel/tpmi: Process CPU package mapping
> >   platform/x86/intel/tpmi: ADD tpmi external interface for tpmi
> > feature
> >     drivers
> >   MAINTAINERS: Add entry for TPMI driver
> > 
> >  MAINTAINERS                         |   6 +
> >  drivers/platform/x86/intel/Kconfig  |  13 +
> >  drivers/platform/x86/intel/Makefile |   4 +
> >  drivers/platform/x86/intel/tpmi.c   | 415
> > ++++++++++++++++++++++++++++
> >  drivers/platform/x86/intel/vsec.c   |  21 +-
> >  drivers/platform/x86/intel/vsec.h   |   6 +
> >  include/linux/intel_tpmi.h          |  30 ++
> >  7 files changed, 490 insertions(+), 5 deletions(-)
> >  create mode 100644 drivers/platform/x86/intel/tpmi.c
> >  create mode 100644 include/linux/intel_tpmi.h
> > 
>
  
Hans de Goede Feb. 10, 2023, 2:24 p.m. UTC | #5
Hi,

On 2/10/23 09:04, srinivas pandruvada wrote:
> Hi Hans,
> 
> On Mon, 2023-02-06 at 13:49 +0100, Hans de Goede wrote:
>> Hi,
>>
>> On 2/2/23 02:07, Srinivas Pandruvada wrote:
>>
>>
> [...]
> 
>> Thank you for your patch-series, I've applied the series to my
>> review-hans branch:
>> https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans
>>
>>
> Thanks for the help here.

You're welcome.

>> Note it will show up in my review-hans branch once I've pushed my
>> local branch there, which might take a while.
>>
>> Once I've run some tests on this branch the patches there will be
>> added to the platform-drivers-x86/for-next branch and eventually
>> will be included in the pdx86 pull-request to Linus for the next
>> merge-window.
> I guess this will appear in 6.3 merge window.

Yes I plan to push my review-hans branch to for-next shortly.

> Can I post next set of patches (targeted for 6.4)?

Yes please, I'm not sure if I can review them next week,
but that will also give other people a chance to take
a look and comment so getting them out there would be good.

Regards,

Hans




>>> Srinivas Pandruvada (7):
>>>   platform/x86/intel/vsec: Add TPMI ID
>>>   platform/x86/intel/vsec: Enhance and Export intel_vsec_add_aux()
>>>   platform/x86/intel/vsec: Support private data
>>>   platform/x86/intel: Intel TPMI enumeration driver
>>>   platform/x86/intel/tpmi: Process CPU package mapping
>>>   platform/x86/intel/tpmi: ADD tpmi external interface for tpmi
>>> feature
>>>     drivers
>>>   MAINTAINERS: Add entry for TPMI driver
>>>
>>>  MAINTAINERS                         |   6 +
>>>  drivers/platform/x86/intel/Kconfig  |  13 +
>>>  drivers/platform/x86/intel/Makefile |   4 +
>>>  drivers/platform/x86/intel/tpmi.c   | 415
>>> ++++++++++++++++++++++++++++
>>>  drivers/platform/x86/intel/vsec.c   |  21 +-
>>>  drivers/platform/x86/intel/vsec.h   |   6 +
>>>  include/linux/intel_tpmi.h          |  30 ++
>>>  7 files changed, 490 insertions(+), 5 deletions(-)
>>>  create mode 100644 drivers/platform/x86/intel/tpmi.c
>>>  create mode 100644 include/linux/intel_tpmi.h
>>>
>>
>