mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
platform/x86/intel/vsec: Plumb ACPI PMT discovery tables through vsec
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 <david.e.box@linux.intel.com>
Link: https://patch.msgid.link/20260313015202.3660072-7-david.e.box@linux.intel.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
This commit is contained in:
parent
a6ce8bf3c9
commit
22fa2ebc11
|
|
@ -24,7 +24,9 @@
|
||||||
#include <linux/intel_vsec.h>
|
#include <linux/intel_vsec.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/overflow.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
#include <linux/string.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
#define PMT_XA_START 0
|
#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);
|
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->resource);
|
||||||
kfree(intel_vsec_dev);
|
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.
|
* auxiliary device driver.
|
||||||
*/
|
*/
|
||||||
for (i = 0, tmp = res; i < header->num_entries; i++, tmp++) {
|
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->start = base_addr + header->offset + i * (header->entry_size * sizeof(u32));
|
||||||
tmp->end = tmp->start + (header->entry_size * sizeof(u32)) - 1;
|
tmp->end = tmp->start + (header->entry_size * sizeof(u32)) - 1;
|
||||||
tmp->flags = IORESOURCE_MEM;
|
tmp->flags = IORESOURCE_MEM;
|
||||||
|
|
@ -338,6 +348,19 @@ 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->base_addr = info->base_addr;
|
||||||
intel_vsec_dev->priv_data = info->priv_data;
|
intel_vsec_dev->priv_data = info->priv_data;
|
||||||
intel_vsec_dev->cap_id = cap_id;
|
intel_vsec_dev->cap_id = cap_id;
|
||||||
|
intel_vsec_dev->src = info->src;
|
||||||
|
|
||||||
|
if (info->src == INTEL_VSEC_DISC_ACPI) {
|
||||||
|
size_t bytes;
|
||||||
|
|
||||||
|
if (check_mul_overflow(intel_vsec_dev->num_resources,
|
||||||
|
sizeof(*info->acpi_disc), &bytes))
|
||||||
|
return -EOVERFLOW;
|
||||||
|
|
||||||
|
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)
|
if (header->id == VSEC_ID_SDSI)
|
||||||
intel_vsec_dev->ida = &intel_vsec_sdsi_ida;
|
intel_vsec_dev->ida = &intel_vsec_sdsi_ida;
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,11 @@ struct device;
|
||||||
struct pci_dev;
|
struct pci_dev;
|
||||||
struct resource;
|
struct resource;
|
||||||
|
|
||||||
|
enum intel_vsec_disc_source {
|
||||||
|
INTEL_VSEC_DISC_PCI, /* PCI, default */
|
||||||
|
INTEL_VSEC_DISC_ACPI, /* ACPI */
|
||||||
|
};
|
||||||
|
|
||||||
enum intel_vsec_id {
|
enum intel_vsec_id {
|
||||||
VSEC_ID_TELEMETRY = 2,
|
VSEC_ID_TELEMETRY = 2,
|
||||||
VSEC_ID_WATCHER = 3,
|
VSEC_ID_WATCHER = 3,
|
||||||
|
|
@ -103,6 +108,10 @@ struct vsec_feature_dependency {
|
||||||
* @parent: parent device in the auxbus chain
|
* @parent: parent device in the auxbus chain
|
||||||
* @headers: list of headers to define the PMT client devices to create
|
* @headers: list of headers to define the PMT client devices to create
|
||||||
* @deps: array of feature dependencies
|
* @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
|
* @priv_data: private data, usable by parent devices, currently a callback
|
||||||
* @caps: bitmask of PMT capabilities for the given headers
|
* @caps: bitmask of PMT capabilities for the given headers
|
||||||
* @quirks: bitmask of VSEC device quirks
|
* @quirks: bitmask of VSEC device quirks
|
||||||
|
|
@ -113,6 +122,8 @@ struct intel_vsec_platform_info {
|
||||||
struct device *parent;
|
struct device *parent;
|
||||||
struct intel_vsec_header **headers;
|
struct intel_vsec_header **headers;
|
||||||
const struct vsec_feature_dependency *deps;
|
const struct vsec_feature_dependency *deps;
|
||||||
|
u32 (*acpi_disc)[4];
|
||||||
|
enum intel_vsec_disc_source src;
|
||||||
void *priv_data;
|
void *priv_data;
|
||||||
unsigned long caps;
|
unsigned long caps;
|
||||||
unsigned long quirks;
|
unsigned long quirks;
|
||||||
|
|
@ -124,7 +135,12 @@ struct intel_vsec_platform_info {
|
||||||
* struct intel_vsec_device - Auxbus specific device information
|
* struct intel_vsec_device - Auxbus specific device information
|
||||||
* @auxdev: auxbus device struct for auxbus access
|
* @auxdev: auxbus device struct for auxbus access
|
||||||
* @dev: struct device associated with the device
|
* @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
|
* @ida: id reference
|
||||||
* @num_resources: number of resources
|
* @num_resources: number of resources
|
||||||
* @id: xarray id
|
* @id: xarray id
|
||||||
|
|
@ -138,6 +154,8 @@ struct intel_vsec_device {
|
||||||
struct auxiliary_device auxdev;
|
struct auxiliary_device auxdev;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct resource *resource;
|
struct resource *resource;
|
||||||
|
u32 (*acpi_disc)[4];
|
||||||
|
enum intel_vsec_disc_source src;
|
||||||
struct ida *ida;
|
struct ida *ida;
|
||||||
int num_resources;
|
int num_resources;
|
||||||
int id; /* xa */
|
int id; /* xa */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user