mbox series

[RFC,0/2] Add basic generic ACPI soc driver

Message ID 1580210059-199540-1-git-send-email-john.garry@huawei.com (mailing list archive)
Headers show
Series Add basic generic ACPI soc driver | expand

Message

John Garry Jan. 28, 2020, 11:14 a.m. UTC
A requirement has come up recently to be able to read system SoC packages
identifiers from userspace [0].

For device tree FW-based systems, this would be quite straightforward, in
that we could add a soc driver for that system and use the DT model
identifier as the soc id - that's how most soc drivers seem to do it.

For ACPI-based systems, the only place I know to get (put) such SoC
information is in the PPTT, specifically the ID Type Structure for a
processor package node. A processor package node describes a physical
boundary of a processor topology.

The ACPI spec does not declare how the fields in this structure must be
used, however it does provide pretty clear examples, which I would expect
most implementers to follow. As such, I try to solve the problem in 2
parts:
- Add ACPI PPTT API to get opaque package structure
- Add basic ACPI generic soc driver, which can interpret the fields
  for known platforms to fill in the ID Type Structure as per example
  in the spec.

So I'm hoping here for some comments on this approach - hence the RFC.
I've cc'ed some folks which may have suggestions.

[0] https://lore.kernel.org/linux-arm-kernel/1579876505-113251-6-git-send-email-john.garry@huawei.com/ ,
    https://lore.kernel.org/linux-arm-kernel/1579876505-113251-1-git-send-email-john.garry@huawei.com/

John Garry (2):
  ACPI/PPTT: Add acpi_pptt_get_package_info() API
  soc: Add a basic ACPI generic driver

 drivers/acpi/pptt.c        |  81 +++++++++++++++++++++++++++++
 drivers/soc/Makefile       |   1 +
 drivers/soc/acpi_generic.c | 102 +++++++++++++++++++++++++++++++++++++
 include/linux/acpi.h       |  13 +++++
 4 files changed, 197 insertions(+)
 create mode 100644 drivers/soc/acpi_generic.c

Comments

Jeremy Linton Jan. 28, 2020, 4:56 p.m. UTC | #1
Hi,

On 1/28/20 5:14 AM, John Garry wrote:
> A requirement has come up recently to be able to read system SoC packages
> identifiers from userspace [0].
> 
> For device tree FW-based systems, this would be quite straightforward, in
> that we could add a soc driver for that system and use the DT model
> identifier as the soc id - that's how most soc drivers seem to do it.
> 
> For ACPI-based systems, the only place I know to get (put) such SoC
> information is in the PPTT, specifically the ID Type Structure for a
> processor package node. A processor package node describes a physical
> boundary of a processor topology.

Well presumably that is one of the use cases for DMI, which has fields 
for the processor/socket as well as the machine vendor.

But, quickly looking at the use case, I can't help but think you don't 
really want any of the above, or the PPTT id. It seems the mapping 
should actually be tied directly to the uncore PMU definition, rather 
than a soc/machine/whatever identifier. Which would imply keying off one 
of the ACPI object identifiers for the PMU itself.


> 
> The ACPI spec does not declare how the fields in this structure must be
> used, however it does provide pretty clear examples, which I would expect
> most implementers to follow. As such, I try to solve the problem in 2
> parts:
> - Add ACPI PPTT API to get opaque package structure
> - Add basic ACPI generic soc driver, which can interpret the fields
>    for known platforms to fill in the ID Type Structure as per example
>    in the spec.
> 
> So I'm hoping here for some comments on this approach - hence the RFC.
> I've cc'ed some folks which may have suggestions.
> 
> [0] https://lore.kernel.org/linux-arm-kernel/1579876505-113251-6-git-send-email-john.garry@huawei.com/ ,
>      https://lore.kernel.org/linux-arm-kernel/1579876505-113251-1-git-send-email-john.garry@huawei.com/
> 
> John Garry (2):
>    ACPI/PPTT: Add acpi_pptt_get_package_info() API
>    soc: Add a basic ACPI generic driver
> 
>   drivers/acpi/pptt.c        |  81 +++++++++++++++++++++++++++++
>   drivers/soc/Makefile       |   1 +
>   drivers/soc/acpi_generic.c | 102 +++++++++++++++++++++++++++++++++++++
>   include/linux/acpi.h       |  13 +++++
>   4 files changed, 197 insertions(+)
>   create mode 100644 drivers/soc/acpi_generic.c
>
John Garry Jan. 28, 2020, 5:28 p.m. UTC | #2
On 28/01/2020 16:56, Jeremy Linton wrote:
> Hi,
> 

Hi Jeremy,

> On 1/28/20 5:14 AM, John Garry wrote:
>> A requirement has come up recently to be able to read system SoC packages
>> identifiers from userspace [0].
>>
>> For device tree FW-based systems, this would be quite straightforward, in
>> that we could add a soc driver for that system and use the DT model
>> identifier as the soc id - that's how most soc drivers seem to do it.
>>
>> For ACPI-based systems, the only place I know to get (put) such SoC
>> information is in the PPTT, specifically the ID Type Structure for a
>> processor package node. A processor package node describes a physical
>> boundary of a processor topology.
> 
> Well presumably that is one of the use cases for DMI, which has fields 
> for the processor/socket as well as the machine vendor.

I did consider DMI, but I want something more generic, i.e. could cover 
embedded/DT systems also.

And I need to double check if DMI really has the info I require. Last 
time I checked, it didn't for my dev board, but I know that some fields 
are simply not filled in.

> 
> But, quickly looking at the use case, I can't help but think you don't 
> really want any of the above, or the PPTT id. It seems the mapping 
> should actually be tied directly to the uncore PMU definition, rather 
> than a soc/machine/whatever identifier. Which would imply keying off one 
> of the ACPI object identifiers for the PMU itself.

So a PMU device (/sys/bus/event_source/devices) does not have a link to 
the ACPI object identifiers or uncore PMU platform device etc.

And even if it did, there is no clear link between that ACPI object and 
the events it supports for that implementation.

Cheers,
John

> 
> 
>>
>> The ACPI spec does not declare how the fields in this structure must be
>> used, however it does provide pretty clear examples, which I would expect
>> most implementers to follow. As such, I try to solve the problem in 2
>> parts:
>> - Add ACPI PPTT API to get opaque package structure
>> - Add basic ACPI generic soc driver, which can interpret the fields
>>    for known platforms to fill in the ID Type Structure as per example
>>    in the spec.
>>
>> So I'm hoping here for some comments on this approach - hence the RFC.
>> I've cc'ed some folks which may have suggestions.
>>
>> [0] 
>> https://lore.kernel.org/linux-arm-kernel/1579876505-113251-6-git-send-email-john.garry@huawei.com/ 
>> ,
>>      
>> https://lore.kernel.org/linux-arm-kernel/1579876505-113251-1-git-send-email-john.garry@huawei.com/ 
>>
>>
>> John Garry (2):
>>    ACPI/PPTT: Add acpi_pptt_get_package_info() API
>>    soc: Add a basic ACPI generic driver
>>
>>   drivers/acpi/pptt.c        |  81 +++++++++++++++++++++++++++++
>>   drivers/soc/Makefile       |   1 +
>>   drivers/soc/acpi_generic.c | 102 +++++++++++++++++++++++++++++++++++++
>>   include/linux/acpi.h       |  13 +++++
>>   4 files changed, 197 insertions(+)
>>   create mode 100644 drivers/soc/acpi_generic.c
>>
> 
> .
Jeremy Linton Jan. 28, 2020, 7:04 p.m. UTC | #3
Hi,

On 1/28/20 11:28 AM, John Garry wrote:
> On 28/01/2020 16:56, Jeremy Linton wrote:
>> Hi,
>>
> 
> Hi Jeremy,
> 
>> On 1/28/20 5:14 AM, John Garry wrote:
>>> A requirement has come up recently to be able to read system SoC 
>>> packages
>>> identifiers from userspace [0].
>>>
>>> For device tree FW-based systems, this would be quite 
>>> straightforward, in
>>> that we could add a soc driver for that system and use the DT model
>>> identifier as the soc id - that's how most soc drivers seem to do it.
>>>
>>> For ACPI-based systems, the only place I know to get (put) such SoC
>>> information is in the PPTT, specifically the ID Type Structure for a
>>> processor package node. A processor package node describes a physical
>>> boundary of a processor topology.
>>
>> Well presumably that is one of the use cases for DMI, which has fields 
>> for the processor/socket as well as the machine vendor.
> 
> I did consider DMI, but I want something more generic, i.e. could cover 
> embedded/DT systems also.
> 
> And I need to double check if DMI really has the info I require. Last 
> time I checked, it didn't for my dev board, but I know that some fields 
> are simply not filled in.

Well the info is probably there, but that doesn't mean it should be used 
programmatically. As your board shows, its not that reliable. And 
looking at the linked patch I see you mention that.


> 
>>
>> But, quickly looking at the use case, I can't help but think you don't 
>> really want any of the above, or the PPTT id. It seems the mapping 
>> should actually be tied directly to the uncore PMU definition, rather 
>> than a soc/machine/whatever identifier. Which would imply keying off 
>> one of the ACPI object identifiers for the PMU itself.
> 
> So a PMU device (/sys/bus/event_source/devices) does not have a link to 
> the ACPI object identifiers or uncore PMU platform device etc.
> 
> And even if it did, there is no clear link between that ACPI object and 
> the events it supports for that implementation.

Having a direct link isn't ideal either. It seems you do mention the pmu 
naming conventions, which can be controlled based on ACPI object 
identifiers. Something like "uncore_dmc_hsi1" where the appended bits 
could for example vary on _CID+_UID or DT name.

Not sure that is a particularly good suggestion either, but I do think 
its a better idea to tie the mapping to the pmu type/man/version concept 
than the SOC it appears in. The sysfs-bus-event_source-devices-* ABI 
docs are noticeably silent on the format of the pmu name (is that 
somewhere else?).
John Garry Jan. 28, 2020, 8:07 p.m. UTC | #4
Hi Jeremy,

>> I did consider DMI, but I want something more generic, i.e. could 
>> cover embedded/DT systems also.
>>
>> And I need to double check if DMI really has the info I require. Last 
>> time I checked, it didn't for my dev board, but I know that some 
>> fields are simply not filled in.
> 
> Well the info is probably there, but that doesn't mean it should be used 
> programmatically. As your board shows, its not that reliable. And 
> looking at the linked patch I see you mention that.

Right, I am trying to stay away from that.

> 
> 
>>
>>>
>>> But, quickly looking at the use case, I can't help but think you 
>>> don't really want any of the above, or the PPTT id. It seems the 
>>> mapping should actually be tied directly to the uncore PMU 
>>> definition, rather than a soc/machine/whatever identifier. Which 
>>> would imply keying off one of the ACPI object identifiers for the PMU 
>>> itself.
>>
>> So a PMU device (/sys/bus/event_source/devices) does not have a link 
>> to the ACPI object identifiers or uncore PMU platform device etc.
>>
>> And even if it did, there is no clear link between that ACPI object 
>> and the events it supports for that implementation.
> 
> Having a direct link isn't ideal either. It seems you do mention the pmu 
> naming conventions, which can be controlled based on ACPI object 
> identifiers.

Not necessarily.

  Something like "uncore_dmc_hsi1" where the appended bits
> could for example vary on _CID+_UID or DT name.

We already do include some naming from ACPI tables in naming (see 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c?h=v5.5#n377), 
but this is not good enough. I'll explain below.

> 
> Not sure that is a particularly good suggestion either, but I do think 
> its a better idea to tie the mapping to the pmu type/man/version concept 
> than the SOC it appears in. The sysfs-bus-event_source-devices-* ABI 
> docs are noticeably silent on the format of the pmu name (is that 
> somewhere else?).

I would say that there is a lack of PMU naming convention, which I did 
note in my referenced patchset.

Apart from that, I think that this problem can be better explained with 
the SMMUv3 PMCG example.

So this PMU has support for a number of IMP DEF events. The SMMUv3 PMCG 
has no method to identify the implementation, so we cannot know which 
IMP DEF events are supported for a specific implementation.

The PMCG PMU naming is fixed, and is in the form smmuv3_pmcg_XXXX - so 
we cannot use some special naming. And the XXXX does not tell us 
anything about the implementation to help know the IMP DEF events.

Now the perf tool has support to know which CPU+uncore events are 
supported for a particular CPU through pmu-events feature - see 
tools/perf/pmu-events/README

The perf tool includes a number of per-CPU event tables.

The matching of per-CPU event table the perf tool uses is based on 
knowing the host CPUID - this is easy to retrieve this via some special 
arch-specific CPU reg, etc. So once it knows the CPUID, "perf list" 
command can show all the events for that CPU.

Now we can extend this idea for the PMCG PMU to support the IMP DEF 
events. For this, we add support for a table of "system" PMU events per 
SoC - similar to the CPU tables - containing the PMCG events. We cannot 
use the CPUID to match the event table for SoC, as a CPUID is not always 
specific to a SoC - that's definite for ARM world and definite for 
SMMUv3 PMCG. So then perf tool needs to know some SoC identifier to 
match the per-SoC events table. That's why I want the SoC id in readable 
form in sysfs.

To add a final note on uncore PMUs, for ARM this is bit of grey area. So 
currently we match uncore PMUs on CPUID. However I figure some SoC 
implementer could take, for example, an A72, and add some uncore PMUs. 
As such, we cannot always match on CPUID, so being able to match on a 
SoC identifier would be better also.

Hope it explains.

Thanks,
John