Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

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: David E. Box <david.e.box@linux.intel.com>
Reviewed-by: Ilpo 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: Hans de Goede <hdegoede@redhat.com>

authored by

David E. Box and committed by
Hans de Goede
e97ec7f6 4edbd117

+21 -5
+11 -3
drivers/platform/x86/intel/pmt/class.c
··· 160 160 161 161 static int intel_pmt_populate_entry(struct intel_pmt_entry *entry, 162 162 struct intel_pmt_header *header, 163 - struct device *dev, 163 + struct intel_vsec_device *ivdev, 164 164 struct resource *disc_res) 165 165 { 166 - struct pci_dev *pci_dev = to_pci_dev(dev->parent); 166 + struct pci_dev *pci_dev = ivdev->pcidev; 167 + struct device *dev = &ivdev->auxdev.dev; 167 168 u8 bir; 168 169 169 170 /* ··· 216 215 217 216 break; 218 217 case ACCESS_BARID: 218 + /* Use the provided base address if it exists */ 219 + if (ivdev->base_addr) { 220 + entry->base_addr = ivdev->base_addr + 221 + GET_ADDRESS(header->base_offset); 222 + break; 223 + } 224 + 219 225 /* 220 226 * If another BAR was specified then the base offset 221 227 * represents the offset within that BAR. SO retrieve the ··· 327 319 if (ret) 328 320 return ret; 329 321 330 - ret = intel_pmt_populate_entry(entry, &header, dev, disc_res); 322 + ret = intel_pmt_populate_entry(entry, &header, intel_vsec_dev, disc_res); 331 323 if (ret) 332 324 return ret; 333 325
+8 -2
drivers/platform/x86/intel/vsec.c
··· 154 154 struct resource *tmp; 155 155 struct device *parent; 156 156 unsigned long quirks = info->quirks; 157 + u64 base_addr; 157 158 int i; 158 159 159 160 if (info->parent) ··· 186 185 if (quirks & VSEC_QUIRK_TABLE_SHIFT) 187 186 header->offset >>= TABLE_OFFSET_SHIFT; 188 187 188 + if (info->base_addr) 189 + base_addr = info->base_addr; 190 + else 191 + base_addr = pdev->resource[header->tbir].start; 192 + 189 193 /* 190 194 * The DVSEC/VSEC contains the starting offset and count for a block of 191 195 * discovery tables. Create a resource array of these tables to the 192 196 * auxiliary device driver. 193 197 */ 194 198 for (i = 0, tmp = res; i < header->num_entries; i++, tmp++) { 195 - tmp->start = pdev->resource[header->tbir].start + 196 - header->offset + i * (header->entry_size * sizeof(u32)); 199 + tmp->start = base_addr + header->offset + i * (header->entry_size * sizeof(u32)); 197 200 tmp->end = tmp->start + (header->entry_size * sizeof(u32)) - 1; 198 201 tmp->flags = IORESOURCE_MEM; 199 202 ··· 212 207 intel_vsec_dev->resource = no_free_ptr(res); 213 208 intel_vsec_dev->num_resources = header->num_entries; 214 209 intel_vsec_dev->quirks = info->quirks; 210 + intel_vsec_dev->base_addr = info->base_addr; 215 211 216 212 if (header->id == VSEC_ID_SDSI) 217 213 intel_vsec_dev->ida = &intel_vsec_sdsi_ida;
+2
drivers/platform/x86/intel/vsec.h
··· 73 73 struct intel_vsec_header **headers; 74 74 unsigned long caps; 75 75 unsigned long quirks; 76 + u64 base_addr; 76 77 }; 77 78 78 79 struct intel_vsec_device { ··· 86 85 void *priv_data; 87 86 size_t priv_data_size; 88 87 unsigned long quirks; 88 + u64 base_addr; 89 89 }; 90 90 91 91 int intel_vsec_add_aux(struct pci_dev *pdev, struct device *parent,