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

Configure Feed

Select the types of activity you want to include in your feed.

platform/x86/intel/vsec: Add intel_vsec_register

Add and export intel_vsec_register() to allow the registration of Intel
extended capabilities from other drivers. Add check to look for memory
conflicts before registering a new capability. Since the vsec provider
may not be a PCI device, add a parent field to
intel_vsec_platform_info() to allow specifying the parent device for
device managed cleanup.

Signed-off-by: Gayatri Kammela <gayatri.kammela@linux.intel.com>
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-8-david.e.box@linux.intel.com
Signed-off-by: Hans de Goede <hdegoede@redhat.com>

authored by

Gayatri Kammela and committed by
Hans de Goede
4edbd117 6dfc2514

+27 -1
+23 -1
drivers/platform/x86/intel/vsec.c
··· 152 152 struct intel_vsec_device __free(kfree) *intel_vsec_dev = NULL; 153 153 struct resource __free(kfree) *res = NULL; 154 154 struct resource *tmp; 155 + struct device *parent; 155 156 unsigned long quirks = info->quirks; 156 157 int i; 158 + 159 + if (info->parent) 160 + parent = info->parent; 161 + else 162 + parent = &pdev->dev; 157 163 158 164 if (!intel_vsec_supported(header->id, info->caps)) 159 165 return -EINVAL; ··· 195 189 header->offset + i * (header->entry_size * sizeof(u32)); 196 190 tmp->end = tmp->start + (header->entry_size * sizeof(u32)) - 1; 197 191 tmp->flags = IORESOURCE_MEM; 192 + 193 + /* Check resource is not in use */ 194 + if (!request_mem_region(tmp->start, resource_size(tmp), "")) 195 + return -EBUSY; 196 + 197 + release_mem_region(tmp->start, resource_size(tmp)); 198 198 } 199 199 200 200 intel_vsec_dev->pcidev = pdev; ··· 217 205 * Pass the ownership of intel_vsec_dev and resource within it to 218 206 * intel_vsec_add_aux() 219 207 */ 220 - return intel_vsec_add_aux(pdev, &pdev->dev, no_free_ptr(intel_vsec_dev), 208 + return intel_vsec_add_aux(pdev, parent, no_free_ptr(intel_vsec_dev), 221 209 intel_vsec_name(header->id)); 222 210 } 223 211 ··· 334 322 335 323 return have_devices; 336 324 } 325 + 326 + void intel_vsec_register(struct pci_dev *pdev, 327 + struct intel_vsec_platform_info *info) 328 + { 329 + if (!pdev || !info) 330 + return; 331 + 332 + intel_vsec_walk_header(pdev, info); 333 + } 334 + EXPORT_SYMBOL_NS_GPL(intel_vsec_register, INTEL_VSEC); 337 335 338 336 static int intel_vsec_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) 339 337 {
+4
drivers/platform/x86/intel/vsec.h
··· 69 69 70 70 /* Platform specific data */ 71 71 struct intel_vsec_platform_info { 72 + struct device *parent; 72 73 struct intel_vsec_header **headers; 73 74 unsigned long caps; 74 75 unsigned long quirks; ··· 100 99 { 101 100 return container_of(auxdev, struct intel_vsec_device, auxdev); 102 101 } 102 + 103 + void intel_vsec_register(struct pci_dev *pdev, 104 + struct intel_vsec_platform_info *info); 103 105 #endif