Commit 51cd4cdb authored by David E. Box's avatar David E. Box Committed by Jia, Yingbao
Browse files

platform/x86/intel/vsec: Add base address field

mainline inclusion
from mainline-v6.8
commit e97ec7f621fbfdce07bf1b98a26883ee19281747
category: bugfix
bugzilla: https://gitee.com/openeuler/intel-kernel/issues/IB6QCG
CVE: NA
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e97ec7f621fbfdce07bf1b98a26883ee19281747



-------------------------------------------------

Intel-SIG: commit e97ec7f621fb platform/x86/intel/vsec: Add base address field.
Backport intel tpmi base driver update for 5.10

Some devices may emulate PCI VSEC capabilities in MMIO. In such cases the
BAR is not readable from a config space. Provide a field for drivers to
indicate the base address to be used.

Signed-off-by: default avatarDavid E. Box <david.e.box@linux.intel.com>
Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://lore.kernel.org/r/20231129222132.2331261-9-david.e.box@linux.intel.com


Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
[ Yingbao Jia: amend commit log ]
Signed-off-by: default avatarYingbao Jia <yingbao.jia@intel.com>
parent 045360f5
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -159,10 +159,11 @@ static struct class intel_pmt_class = {

static int intel_pmt_populate_entry(struct intel_pmt_entry *entry,
				    struct intel_pmt_header *header,
				    struct device *dev,
				    struct intel_vsec_device *ivdev,
				    struct resource *disc_res)
{
	struct pci_dev *pci_dev = to_pci_dev(dev->parent);
	struct pci_dev *pci_dev = ivdev->pcidev;
	struct device *dev = &ivdev->auxdev.dev;
	u8 bir;

	/*
@@ -214,6 +215,13 @@ static int intel_pmt_populate_entry(struct intel_pmt_entry *entry,

		break;
	case ACCESS_BARID:
		/* Use the provided base address if it exists */
		if (ivdev->base_addr) {
			entry->base_addr = ivdev->base_addr +
				   GET_ADDRESS(header->base_offset);
			break;
		}

		/*
		 * If another BAR was specified then the base offset
		 * represents the offset within that BAR. SO retrieve the
@@ -318,7 +326,7 @@ int intel_pmt_dev_create(struct intel_pmt_entry *entry, struct intel_pmt_namespa
	if (ret)
		return ret;

	ret = intel_pmt_populate_entry(entry, &header, dev, disc_res);
	ret = intel_pmt_populate_entry(entry, &header, intel_vsec_dev, disc_res);
	if (ret)
		return ret;

+8 −2
Original line number Diff line number Diff line
@@ -145,6 +145,7 @@ static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he
	struct resource *res, *tmp;
	struct device *parent;
	unsigned long quirks = info->quirks;
	u64 base_addr;
	int i;

	if (info->parent)
@@ -178,14 +179,18 @@ static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he
	if (quirks & VSEC_QUIRK_TABLE_SHIFT)
		header->offset >>= TABLE_OFFSET_SHIFT;

	if (info->base_addr)
		base_addr = info->base_addr;
	else
		base_addr = pdev->resource[header->tbir].start;

	/*
	 * The DVSEC/VSEC contains the starting offset and count for a block of
	 * discovery tables. Create a resource array of these tables to the
	 * auxiliary device driver.
	 */
	for (i = 0, tmp = res; i < header->num_entries; i++, tmp++) {
		tmp->start = pdev->resource[header->tbir].start +
			     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->flags = IORESOURCE_MEM;

@@ -200,6 +205,7 @@ static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he
	intel_vsec_dev->resource = res;
	intel_vsec_dev->num_resources = header->num_entries;
	intel_vsec_dev->quirks = info->quirks;
	intel_vsec_dev->base_addr = info->base_addr;
	intel_vsec_dev->ida = &intel_vsec_ida;

	return intel_vsec_add_aux(pdev, parent, intel_vsec_dev,
+2 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ struct intel_vsec_platform_info {
	struct intel_vsec_header **headers;
	unsigned long caps;
	unsigned long quirks;
	u64 base_addr;
};

struct intel_vsec_device {
@@ -83,6 +84,7 @@ struct intel_vsec_device {
	void *priv_data;
	size_t priv_data_size;
	unsigned long quirks;
	u64 base_addr;
};

int intel_vsec_add_aux(struct pci_dev *pdev, struct device *parent,