* Re: [PATCH V3 06/16] platform/x86/intel/pmt: Unify header fetch and add ACPI source
[not found] ` <20260501231054.3890305-7-david.e.box@linux.intel.com>
@ 2026-05-11 17:12 ` Ilpo Järvinen
0 siblings, 0 replies; 2+ messages in thread
From: Ilpo Järvinen @ 2026-05-11 17:12 UTC (permalink / raw)
To: David E. Box
Cc: irenic.rajneesh, ilpo.jarvinen, srinivas.pandruvada, xi.pardee,
hansg, linux-kernel, platform-driver-x86
On Fri, 1 May 2026, David E. Box wrote:
> Allow the PMT class to read discovery headers from either PCI MMIO or
> ACPI-provided entries, depending on the discovery source. The new
> source-aware fetch helper retrieves the first two QWORDs for both paths
> while keeping the mapped discovery table available for users such as
> crashlog.
>
> Split intel_pmt_populate_entry() into source-specific resolvers:
> - pmt_resolve_access_pci(): handles both ACCESS_LOCAL and ACCESS_BARID
> for PCI-backed devices and sets entry->pcidev. Same existing
> functionality.
> - pmt_resolve_access_acpi(): handles only ACCESS_BARID for ACPI-backed
> devices, rejecting ACCESS_LOCAL which has no valid semantics without
> a physical discovery resource.
>
> This maintains existing PCI behavior and makes no functional changes
> for PCI devices.
>
> Signed-off-by: David E. Box <david.e.box@linux.intel.com>
> ---
> V3 changes:
> - Folded the header fetch rework back into intel_pmt_dev_create() after
> dropping the previous common header decode helper patch
> - Replaced repeated literal header count values with
> PMT_DISC_HEADER_QWORDS for discovery-header handling
> - Updated discovery-header buffer declarations and copy size
> calculations to use PMT_DISC_HEADER_QWORDS * sizeof(*headers)
> for clarity in function-parameter context
> - Cleaned up line wrapping/indentation
>
> V2 changes:
> - In pmt_resolve_access_acpi(), moved dev_err() call to single line
> instead of split across two lines
> - Restructured error handling in intel_pmt_populate_entry(), moving error
> returns from after switch/case into each case statement for better
> readability
> - Addressed Ilpo's feedback on error message formatting and error
> handling patterns
>
> drivers/platform/x86/intel/pmt/class.c | 130 ++++++++++++++++++++++---
> 1 file changed, 118 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/platform/x86/intel/pmt/class.c b/drivers/platform/x86/intel/pmt/class.c
> index 61834cbe3764..a162df5939e0 100644
> --- a/drivers/platform/x86/intel/pmt/class.c
> +++ b/drivers/platform/x86/intel/pmt/class.c
> @@ -204,9 +204,9 @@ struct class intel_pmt_class = {
> };
> EXPORT_SYMBOL_GPL(intel_pmt_class);
>
> -static int intel_pmt_populate_entry(struct intel_pmt_entry *entry,
> - struct intel_vsec_device *ivdev,
> - int idx)
> +static int pmt_resolve_access_pci(struct intel_pmt_entry *entry,
> + struct intel_vsec_device *ivdev,
> + int idx)
> {
> struct pci_dev *pci_dev = to_pci_dev(ivdev->dev);
> struct device *dev = &ivdev->auxdev.dev;
> @@ -286,6 +286,81 @@ static int intel_pmt_populate_entry(struct intel_pmt_entry *entry,
> }
>
> entry->pcidev = pci_dev;
> +
> + return 0;
> +}
> +
> +static int pmt_resolve_access_acpi(struct intel_pmt_entry *entry,
> + struct intel_vsec_device *ivdev)
> +{
> + struct pci_dev *pci_dev = NULL;
> + struct device *dev = &ivdev->auxdev.dev;
> + struct intel_pmt_header *header = &entry->header;
> + u8 bir;
> +
> + if (dev_is_pci(ivdev->dev))
> + pci_dev = to_pci_dev(ivdev->dev);
> +
> + /*
> + * The base offset should always be 8 byte aligned.
> + *
> + * For non-local access types the lower 3 bits of base offset
> + * contains the index of the base address register where the
> + * telemetry can be found.
> + */
> + bir = GET_BIR(header->base_offset);
> +
> + switch (header->access_type) {
> + case ACCESS_BARID:
> + /* ACPI platform drivers use base_addr */
> + if (ivdev->base_addr) {
> + entry->base_addr = ivdev->base_addr +
> + GET_ADDRESS(header->base_offset);
> + break;
> + }
> +
> + /* If base_addr is not provided, then this is an ACPI companion device */
> + if (!pci_dev) {
> + dev_err(dev, "ACCESS_BARID requires PCI BAR resources or base_addr\n");
> + return -EINVAL;
> + }
> +
> + entry->base_addr = pci_resource_start(pci_dev, bir) +
> + GET_ADDRESS(header->base_offset);
> + break;
> + default:
> + dev_err(dev, "Unsupported access type %d for ACPI based PMT\n",
> + header->access_type);
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> +static int intel_pmt_populate_entry(struct intel_pmt_entry *entry,
> + struct intel_vsec_device *ivdev,
> + int idx)
> +{
> + struct intel_pmt_header *header = &entry->header;
> + struct device *dev = &ivdev->auxdev.dev;
> + int ret;
> +
> + switch (ivdev->src) {
> + case INTEL_VSEC_DISC_PCI:
> + ret = pmt_resolve_access_pci(entry, ivdev, idx);
> + if (ret)
> + return ret;
> + break;
> + case INTEL_VSEC_DISC_ACPI:
> + ret = pmt_resolve_access_acpi(entry, ivdev);
> + if (ret)
> + return ret;
> + break;
> + default:
> + dev_err(dev, "Unknown discovery source: %d\n", ivdev->src);
> + return -EINVAL;
> + }
> +
> entry->guid = header->guid;
> entry->size = header->size;
> entry->cb = ivdev->priv_data;
> @@ -370,21 +445,52 @@ static int intel_pmt_dev_register(struct intel_pmt_entry *entry,
> return ret;
> }
>
> +static int pmt_get_headers(struct intel_vsec_device *ivdev, int idx,
> + struct intel_pmt_entry *entry, u64 headers[2])
> +{
> + struct device *dev = &ivdev->auxdev.dev;
> +
> + switch (ivdev->src) {
> + case INTEL_VSEC_DISC_PCI: {
> + void __iomem *disc_table;
> +
> + disc_table = devm_ioremap_resource(dev, &ivdev->resource[idx]);
> + if (IS_ERR(disc_table))
> + return PTR_ERR(disc_table);
> +
> + memcpy_fromio(headers, disc_table, 2 * sizeof(u64));
> + memcpy(entry->disc_header, headers, sizeof(entry->disc_header));
> +
> + /* Used by crashlog driver */
> + entry->disc_table = disc_table;
> +
> + return 0;
> + }
> + case INTEL_VSEC_DISC_ACPI: {
> + memcpy(headers, &ivdev->acpi_disc[idx][0], 2 * sizeof(u64));
> + memcpy(entry->disc_header, headers, sizeof(entry->disc_header));
This risks copying from stack if one of the magic literals (that is not
bound to each other) is ever changed, so static_assert()ing it cannot
occur wouldn't hurt. It took me a while to figure out how you can safely
copy 4 entries from 2 before realizing there's also type downsizing going
on here.
TBH, I don't very much like how this is currently architected. It would be
much nicer if the magic numbers would be properly bound to each other
with defines so we wouldn't need to bind them using static_assert()s.
Is there some reason why one of these copy/array sizes cannot be
determined from the other?
> + entry->disc_table = NULL;
> +
> + return 0;
> + }
> + default:
> + dev_err(dev, "Unknown discovery source type: %d\n", ivdev->src);
> + break;
> + }
> +
> + return -EINVAL;
> +}
> +
> int intel_pmt_dev_create(struct intel_pmt_entry *entry, struct intel_pmt_namespace *ns,
> struct intel_vsec_device *intel_vsec_dev, int idx)
> {
> struct device *dev = &intel_vsec_dev->auxdev.dev;
> - struct resource *disc_res;
> + u64 headers[2];
> int ret;
>
> - disc_res = &intel_vsec_dev->resource[idx];
> -
> - entry->disc_table = devm_ioremap_resource(dev, disc_res);
> - if (IS_ERR(entry->disc_table))
> - return PTR_ERR(entry->disc_table);
> -
> - memcpy_fromio(entry->disc_header, entry->disc_table,
> - sizeof(entry->disc_header));
> + ret = pmt_get_headers(intel_vsec_dev, idx, entry, headers);
> + if (ret)
> + return ret;
>
> if (ns->pmt_pre_decode) {
> ret = ns->pmt_pre_decode(intel_vsec_dev, entry);
>
--
i.
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH V3 08/16] platform/x86/intel/pmc: Add ACPI PWRM telemetry driver for Nova Lake S
[not found] ` <20260501231054.3890305-9-david.e.box@linux.intel.com>
@ 2026-05-11 17:16 ` Ilpo Järvinen
0 siblings, 0 replies; 2+ messages in thread
From: Ilpo Järvinen @ 2026-05-11 17:16 UTC (permalink / raw)
To: David E. Box
Cc: irenic.rajneesh, srinivas.pandruvada, xi.pardee, Hans de Goede,
LKML, platform-driver-x86
On Fri, 1 May 2026, David E. Box wrote:
> Add an ACPI-based PMC PWRM telemetry driver for Nova Lake S. The driver
> locates PMT discovery data in _DSD under the Intel VSEC UUID, parses it,
> and registers telemetry regions with the PMT/VSEC framework so PMC
> telemetry is exposed via existing PMT interfaces.
>
> Export pmc_parse_telem_dsd() and pmc_find_telem_guid() to support ACPI
> discovery in other PMC drivers (e.g., ssram_telemetry) without duplicating
> ACPI parsing logic. Also export acpi_disc_t typedef from core.h for callers
> to properly declare discovery table arrays.
>
> Selected by INTEL_PMC_CORE. Existing PCI functionality is preserved.
>
> Signed-off-by: David E. Box <david.e.box@linux.intel.com>
> ---
> V3 changes:
> - Updated pmc_parse_telem_dsd() in pwrm_telemetry.c to use acpi_disc_t
> in the function return type for consistency with the exported typedef
> - Moved acpi_disc_t allocation to the allocation site with cleanup
> annotation (__free(kfree)), as now specified by cleanup.h
I wonder if you posted an old version of this patch as I don't see these
in the patch?
> - Style, readability and cleanup-path refinement based on review
> feedback
>
> V2 changes:
> - Added explicit <linux/uuid.h> include for guid_t type availability in
> core.h
> - Added explicit <linux/bits.h> include in pwrm_telemetry.c for GENMASK()
> - Added <linux/cleanup.h> and converted goto based cleanup to __free()
> attributes per Ilpo's feedback
> - Combined u64 hdr0 and u64 hdr1 into single declaration
> - Converted pmc_parse_telem_dsd() to return acpi_disc directly with
> ERR_PTR() for failures
> - Added braces around _DSD evaluation failure path
>
> drivers/platform/x86/intel/pmc/Kconfig | 14 ++
> drivers/platform/x86/intel/pmc/Makefile | 2 +
> drivers/platform/x86/intel/pmc/core.h | 15 ++
> .../platform/x86/intel/pmc/pwrm_telemetry.c | 214 ++++++++++++++++++
> 4 files changed, 245 insertions(+)
> create mode 100644 drivers/platform/x86/intel/pmc/pwrm_telemetry.c
>
> diff --git a/drivers/platform/x86/intel/pmc/Kconfig b/drivers/platform/x86/intel/pmc/Kconfig
> index 0f19dc7edcf9..937186b0b5dd 100644
> --- a/drivers/platform/x86/intel/pmc/Kconfig
> +++ b/drivers/platform/x86/intel/pmc/Kconfig
> @@ -9,6 +9,7 @@ config INTEL_PMC_CORE
> depends on ACPI
> depends on INTEL_PMT_TELEMETRY
> select INTEL_PMC_SSRAM_TELEMETRY
> + select INTEL_PMC_PWRM_TELEMETRY
> help
> The Intel Platform Controller Hub for Intel Core SoCs provides access
> to Power Management Controller registers via various interfaces. This
> @@ -39,3 +40,16 @@ config INTEL_PMC_SSRAM_TELEMETRY
> (including sysfs).
>
> This option is selected by INTEL_PMC_CORE.
> +
> +config INTEL_PMC_PWRM_TELEMETRY
> + tristate
> + help
> + This driver discovers PMC PWRM telemetry regions described in ACPI
> + _DSD and registers them with the Intel VSEC framework as Intel PMT
> + telemetry devices.
> +
> + It validates the ACPI discovery data and publishes the discovered
> + regions so they can be accessed through the Intel PMT telemetry
> + interfaces (including sysfs).
> +
> + This option is selected by INTEL_PMC_CORE.
> diff --git a/drivers/platform/x86/intel/pmc/Makefile b/drivers/platform/x86/intel/pmc/Makefile
> index bb960c8721d7..fdbb768f7b09 100644
> --- a/drivers/platform/x86/intel/pmc/Makefile
> +++ b/drivers/platform/x86/intel/pmc/Makefile
> @@ -12,3 +12,5 @@ obj-$(CONFIG_INTEL_PMC_CORE) += intel_pmc_core_pltdrv.o
> # Intel PMC SSRAM driver
> intel_pmc_ssram_telemetry-y += ssram_telemetry.o
> obj-$(CONFIG_INTEL_PMC_SSRAM_TELEMETRY) += intel_pmc_ssram_telemetry.o
> +intel_pmc_pwrm_telemetry-y += pwrm_telemetry.o
> +obj-$(CONFIG_INTEL_PMC_PWRM_TELEMETRY) += intel_pmc_pwrm_telemetry.o
> diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h
> index 118c8740ad3a..24406534c7fc 100644
> --- a/drivers/platform/x86/intel/pmc/core.h
> +++ b/drivers/platform/x86/intel/pmc/core.h
> @@ -14,10 +14,14 @@
>
> #include <linux/acpi.h>
> #include <linux/bits.h>
> +#include <linux/cleanup.h>
> #include <linux/platform_device.h>
> +#include <linux/uuid.h>
>
> struct telem_endpoint;
>
> +DEFINE_FREE(pmc_acpi_free, void *, if (_T) ACPI_FREE(_T))
> +
> #define SLP_S0_RES_COUNTER_MASK GENMASK(31, 0)
>
> #define PMC_BASE_ADDR_DEFAULT 0xFE000000
> @@ -562,6 +566,8 @@ int pmc_core_pmt_get_blk_sub_req(struct pmc_dev *pmcdev, struct pmc *pmc,
> extern const struct file_operations pmc_core_substate_req_regs_fops;
> extern const struct file_operations pmc_core_substate_blk_req_fops;
>
> +extern const guid_t intel_vsec_guid;
> +
> #define pmc_for_each_mode(mode, pmc) \
> for (unsigned int __i = 0, __cond; \
> __cond = __i < (pmc)->num_lpm_modes, \
> @@ -583,4 +589,13 @@ static const struct file_operations __name ## _fops = { \
> .release = single_release, \
> }
>
> +struct intel_vsec_header;
> +union acpi_object;
> +
> +/* Avoid checkpatch warning */
> +typedef u32 (*acpi_disc_t)[4];
> +
> +acpi_disc_t pmc_parse_telem_dsd(union acpi_object *obj,
> + struct intel_vsec_header *header);
> +union acpi_object *pmc_find_telem_guid(union acpi_object *dsd);
> #endif /* PMC_CORE_H */
> diff --git a/drivers/platform/x86/intel/pmc/pwrm_telemetry.c b/drivers/platform/x86/intel/pmc/pwrm_telemetry.c
> new file mode 100644
> index 000000000000..e852ee2d6d9f
> --- /dev/null
> +++ b/drivers/platform/x86/intel/pmc/pwrm_telemetry.c
> @@ -0,0 +1,214 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Intel PMC PWRM ACPI driver
> + *
> + * Copyright (C) 2025, Intel Corporation
> + */
> +
> +#include <linux/acpi.h>
> +#include <linux/bits.h>
> +#include <linux/bitfield.h>
> +#include <linux/cleanup.h>
> +#include <linux/device.h>
> +#include <linux/err.h>
> +#include <linux/errno.h>
> +#include <linux/intel_vsec.h>
> +#include <linux/mod_devicetable.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/resource.h>
> +#include <linux/slab.h>
> +#include <linux/types.h>
> +#include <linux/uuid.h>
> +
> +#include "core.h"
> +
> +#define ENTRY_LEN 5
> +
> +/* DWORD2 */
> +#define DVSEC_ID_MASK GENMASK(15, 0)
> +#define NUM_ENTRIES_MASK GENMASK(23, 16)
> +#define ENTRY_SIZE_MASK GENMASK(31, 24)
> +
> +/* DWORD3 */
> +#define TBIR_MASK GENMASK(2, 0)
> +#define DISC_TBL_OFF_MASK GENMASK(31, 3)
> +
> +const guid_t intel_vsec_guid =
> + GUID_INIT(0x294903fb, 0x634d, 0x4fc7, 0xaf, 0x1f, 0x0f, 0xb9,
> + 0x56, 0xb0, 0x4f, 0xc1);
> +
> +static bool is_valid_entry(union acpi_object *pkg)
> +{
> + int i;
> +
> + if (!pkg || pkg->type != ACPI_TYPE_PACKAGE || pkg->package.count != ENTRY_LEN)
> + return false;
> +
> + if (pkg->package.elements[0].type != ACPI_TYPE_STRING)
> + return false;
> +
> + for (i = 1; i < ENTRY_LEN; i++)
> + if (pkg->package.elements[i].type != ACPI_TYPE_INTEGER)
> + return false;
> +
> + return true;
> +}
> +
> +u32 (*pmc_parse_telem_dsd(union acpi_object *obj,
> + struct intel_vsec_header *header))[4]
> +{
> + acpi_disc_t disc __free(kfree) = NULL;
> + union acpi_object *vsec_pkg;
> + union acpi_object *disc_pkg;
> + u64 hdr0, hdr1;
> + int num_regions;
> + int i;
> +
> + if (!header)
> + return ERR_PTR(-EINVAL);
> +
> + if (!obj || obj->type != ACPI_TYPE_PACKAGE || obj->package.count != 2)
> + return ERR_PTR(-EINVAL);
> +
> + /* First Package is DVSEC info */
> + vsec_pkg = &obj->package.elements[0];
> + if (!is_valid_entry(vsec_pkg))
> + return ERR_PTR(-EINVAL);
> +
> + hdr0 = vsec_pkg->package.elements[3].integer.value;
> + hdr1 = vsec_pkg->package.elements[4].integer.value;
> +
> + header->id = FIELD_GET(DVSEC_ID_MASK, hdr0);
> + header->num_entries = FIELD_GET(NUM_ENTRIES_MASK, hdr0);
> + header->entry_size = FIELD_GET(ENTRY_SIZE_MASK, hdr0);
> + header->tbir = FIELD_GET(TBIR_MASK, hdr1);
> + header->offset = FIELD_GET(DISC_TBL_OFF_MASK, hdr1);
> +
> + /* Second Package contains the discovery tables */
> + disc_pkg = &obj->package.elements[1];
> + if (disc_pkg->type != ACPI_TYPE_PACKAGE || disc_pkg->package.count < 1)
> + return ERR_PTR(-EINVAL);
> +
> + num_regions = disc_pkg->package.count;
> + if (header->num_entries != num_regions)
> + return ERR_PTR(-EINVAL);
> +
> + disc = kmalloc_array(num_regions, sizeof(*disc), GFP_KERNEL);
> + if (!disc)
> + return ERR_PTR(-ENOMEM);
> +
> + for (i = 0; i < num_regions; i++) {
> + union acpi_object *pkg;
> + u64 value;
> + int j;
> +
> + pkg = &disc_pkg->package.elements[i];
> + if (!is_valid_entry(pkg))
> + return ERR_PTR(-EINVAL);
> +
> + /* Element 0 is a descriptive string; DWORD values start at index 1. */
> + for (j = 1; j < ENTRY_LEN; j++) {
> + value = pkg->package.elements[j].integer.value;
> + if (value > U32_MAX)
> + return ERR_PTR(-ERANGE);
> +
> + disc[i][j - 1] = value;
> + }
> + }
> +
> + return no_free_ptr(disc);
> +}
> +EXPORT_SYMBOL_NS_GPL(pmc_parse_telem_dsd, "INTEL_PMC_CORE");
> +
> +union acpi_object *pmc_find_telem_guid(union acpi_object *dsd)
> +{
> + int i;
> +
> + if (!dsd || dsd->type != ACPI_TYPE_PACKAGE)
> + return NULL;
> +
> + for (i = 0; i + 1 < dsd->package.count; i += 2) {
> + union acpi_object *uuid_obj, *data_obj;
> + guid_t uuid;
> +
> + uuid_obj = &dsd->package.elements[i];
> + data_obj = &dsd->package.elements[i + 1];
> +
> + if (uuid_obj->type != ACPI_TYPE_BUFFER ||
> + uuid_obj->buffer.length != 16)
> + continue;
> +
> + memcpy(&uuid, uuid_obj->buffer.pointer, 16);
> + if (guid_equal(&uuid, &intel_vsec_guid))
> + return data_obj;
> + }
> +
> + return NULL;
> +}
> +EXPORT_SYMBOL_NS_GPL(pmc_find_telem_guid, "INTEL_PMC_CORE");
> +
> +static int pmc_pwrm_acpi_probe(struct platform_device *pdev)
> +{
> + struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL };
> + acpi_handle handle = ACPI_HANDLE(&pdev->dev);
> + struct intel_vsec_header header;
> + struct intel_vsec_header *headers[2] = { &header, NULL };
> + struct intel_vsec_platform_info info = { };
> + struct device *dev = &pdev->dev;
> + struct resource *res;
> + union acpi_object *dsd;
> + acpi_status status;
> +
> + if (!handle)
> + return -ENODEV;
> +
> + status = acpi_evaluate_object(handle, "_DSD", NULL, &buf);
> + if (ACPI_FAILURE(status)) {
> + return dev_err_probe(dev, -ENODEV, "Could not evaluate _DSD: %s\n",
> + acpi_format_exception(status));
> + }
> +
> + void *dsd_buf __free(pmc_acpi_free) = buf.pointer;
> +
> + dsd = pmc_find_telem_guid(dsd_buf);
> + if (!dsd)
> + return -ENODEV;
> +
> + acpi_disc_t acpi_disc __free(kfree) = pmc_parse_telem_dsd(dsd, &header);
> + if (IS_ERR(acpi_disc))
> + return PTR_ERR(acpi_disc);
> +
> + res = platform_get_resource(pdev, IORESOURCE_MEM, header.tbir);
> + if (!res)
> + return -EINVAL;
> +
> + info.headers = headers;
> + info.caps = VSEC_CAP_TELEMETRY;
> + info.acpi_disc = acpi_disc;
> + info.src = INTEL_VSEC_DISC_ACPI;
> + info.base_addr = res->start;
> +
> + return intel_vsec_register(&pdev->dev, &info);
> +}
> +
> +static const struct acpi_device_id pmc_pwrm_acpi_ids[] = {
> + { "INTC1122", 0 }, /* Nova Lake */
> + { "INTC1129", 0 }, /* Nova Lake */
> + { }
> +};
> +MODULE_DEVICE_TABLE(acpi, pmc_pwrm_acpi_ids);
> +
> +static struct platform_driver pmc_pwrm_acpi_driver = {
> + .probe = pmc_pwrm_acpi_probe,
> + .driver = {
> + .name = "intel_pmc_pwrm_acpi",
> + .acpi_match_table = ACPI_PTR(pmc_pwrm_acpi_ids),
> + },
> +};
> +module_platform_driver(pmc_pwrm_acpi_driver);
> +
> +MODULE_AUTHOR("David E. Box <david.e.box@linux.intel.com>");
> +MODULE_DESCRIPTION("Intel PMC PWRM ACPI driver");
> +MODULE_LICENSE("GPL");
> +MODULE_IMPORT_NS("INTEL_VSEC");
>
--
i.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-05-11 17:16 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20260501231054.3890305-1-david.e.box@linux.intel.com>
[not found] ` <20260501231054.3890305-7-david.e.box@linux.intel.com>
2026-05-11 17:12 ` [PATCH V3 06/16] platform/x86/intel/pmt: Unify header fetch and add ACPI source Ilpo Järvinen
[not found] ` <20260501231054.3890305-9-david.e.box@linux.intel.com>
2026-05-11 17:16 ` [PATCH V3 08/16] platform/x86/intel/pmc: Add ACPI PWRM telemetry driver for Nova Lake S Ilpo Järvinen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox