On Wed, 21 Jan 2026, David E. Box wrote: > Some platforms expose PMT discovery via ACPI instead of PCI BARs. Add a > generic discovery source flag and carry ACPI discovery entries alongside > the existing PCI resource path so PMT clients can consume either. > > Changes: > - Add enum intel_vsec_disc_source { _PCI, _ACPI }. > - Extend intel_vsec_platform_info and intel_vsec_device with source enum > and ACPI discovery table pointer/ > - When src==ACPI, skip BAR resource setup and copy the ACPI discovery > entries into the aux device. > > No user-visible behavior change yet; this only wires ACPI data through vsec > in preparation for ACPI-enumerated PMT clients. > > Signed-off-by: David E. Box > --- > > v3: > - Re-send with all changes intended for v2 which was sent without them > being applied. > > v2: > - Improve comment to clarify BAR resource setup doesn't apply to ACPI > discovery > - Add missing #include for kmemdup() > - Use array_size() for overflow protection > (review comments by Ilpo Järvinen) > > > drivers/platform/x86/intel/vsec.c | 24 ++++++++++++++++++++++++ > include/linux/intel_vsec.h | 20 +++++++++++++++++++- > 2 files changed, 43 insertions(+), 1 deletion(-) > > diff --git a/drivers/platform/x86/intel/vsec.c b/drivers/platform/x86/intel/vsec.c > index 4aeb0728b435..b1465e67feef 100644 > --- a/drivers/platform/x86/intel/vsec.c > +++ b/drivers/platform/x86/intel/vsec.c > @@ -24,7 +24,9 @@ > #include > #include > #include > +#include > #include > +#include > #include > > #define PMT_XA_START 0 > @@ -109,6 +111,7 @@ static void intel_vsec_dev_release(struct device *dev) > > ida_free(intel_vsec_dev->ida, intel_vsec_dev->auxdev.id); > > + kfree(intel_vsec_dev->acpi_disc); > kfree(intel_vsec_dev->resource); > kfree(intel_vsec_dev); > } > @@ -320,6 +323,13 @@ static int intel_vsec_add_dev(struct device *dev, struct intel_vsec_header *head > * auxiliary device driver. > */ > for (i = 0, tmp = res; i < header->num_entries; i++, tmp++) { > + /* > + * Skip resource mapping check for ACPI-based discovery > + * since those tables are read from _DSD, not MMIO. > + */ > + if (info->src == INTEL_VSEC_DISC_ACPI) > + break; > + > tmp->start = base_addr + header->offset + i * (header->entry_size * sizeof(u32)); > tmp->end = tmp->start + (header->entry_size * sizeof(u32)) - 1; > tmp->flags = IORESOURCE_MEM; > @@ -338,6 +348,20 @@ static int intel_vsec_add_dev(struct device *dev, struct intel_vsec_header *head > intel_vsec_dev->base_addr = info->base_addr; > intel_vsec_dev->priv_data = info->priv_data; > intel_vsec_dev->cap_id = cap_id; > + intel_vsec_dev->src = info->src; > + > + if (info->src == INTEL_VSEC_DISC_ACPI) { > + size_t bytes; > + > + bytes = array_size(intel_vsec_dev->num_resources, > + sizeof(info->acpi_disc[0])); > + if (!bytes) > + return -EOVERFLOW; Is this correct as array_size() is documented to return SIZE_MAX on overflow? Other than that, this series looked very straightforward now. -- i. > + > + intel_vsec_dev->acpi_disc = kmemdup(info->acpi_disc, bytes, GFP_KERNEL); > + if (!intel_vsec_dev->acpi_disc) > + return -ENOMEM; > + } > > if (header->id == VSEC_ID_SDSI) > intel_vsec_dev->ida = &intel_vsec_sdsi_ida; > diff --git a/include/linux/intel_vsec.h b/include/linux/intel_vsec.h > index 4eecb2a6bac4..1fe5665a9d02 100644 > --- a/include/linux/intel_vsec.h > +++ b/include/linux/intel_vsec.h > @@ -33,6 +33,11 @@ struct device; > struct pci_dev; > struct resource; > > +enum intel_vsec_disc_source { > + INTEL_VSEC_DISC_PCI, /* PCI, default */ > + INTEL_VSEC_DISC_ACPI, /* ACPI */ > +}; > + > enum intel_vsec_id { > VSEC_ID_TELEMETRY = 2, > VSEC_ID_WATCHER = 3, > @@ -103,6 +108,10 @@ struct vsec_feature_dependency { > * @parent: parent device in the auxbus chain > * @headers: list of headers to define the PMT client devices to create > * @deps: array of feature dependencies > + * @acpi_disc: ACPI discovery tables, each entry is two QWORDs > + * in little-endian format as defined by the PMT ACPI spec. > + * Valid only when @provider == INTEL_VSEC_DISC_ACPI. > + * @src: source of discovery table data > * @priv_data: private data, usable by parent devices, currently a callback > * @caps: bitmask of PMT capabilities for the given headers > * @quirks: bitmask of VSEC device quirks > @@ -113,6 +122,8 @@ struct intel_vsec_platform_info { > struct device *parent; > struct intel_vsec_header **headers; > const struct vsec_feature_dependency *deps; > + u32 (*acpi_disc)[4]; > + enum intel_vsec_disc_source src; > void *priv_data; > unsigned long caps; > unsigned long quirks; > @@ -124,7 +135,12 @@ struct intel_vsec_platform_info { > * struct intel_vsec_device - Auxbus specific device information > * @auxdev: auxbus device struct for auxbus access > * @dev: struct device associated with the device > - * @resource: any resources shared by the parent > + * @resource: PCI discovery resources (BAR windows), one per discovery > + * instance. Valid only when @src == INTEL_VSEC_DISC_PCI > + * @acpi_disc: ACPI discovery tables, each entry is two QWORDs > + * in little-endian format as defined by the PMT ACPI spec. > + * Valid only when @src == INTEL_VSEC_DISC_ACPI. > + * @src: source of discovery table data > * @ida: id reference > * @num_resources: number of resources > * @id: xarray id > @@ -138,6 +154,8 @@ struct intel_vsec_device { > struct auxiliary_device auxdev; > struct device *dev; > struct resource *resource; > + u32 (*acpi_disc)[4]; > + enum intel_vsec_disc_source src; > struct ida *ida; > int num_resources; > int id; /* xa */ >