Lines Matching +full:entry +full:- +full:address
1 // SPDX-License-Identifier: GPL-2.0
13 #include <linux/io-64-nonatomic-lo-hi.h>
34 return !!(ivdev->quirks & VSEC_QUIRK_EARLY_HW); in intel_pmt_is_early_client_hw()
45 return -EFAULT; in pmt_memcpy64_fromio()
64 if (cb && cb->read_telem) in pmt_telem_read_mmio()
65 return cb->read_telem(pdev, guid, buf, off, count); in pmt_telem_read_mmio()
70 /* PUNIT on SPR only supports aligned 64-bit read */ in pmt_telem_read_mmio()
87 struct intel_pmt_entry *entry = container_of(attr, in intel_pmt_read() local
92 return -EINVAL; in intel_pmt_read()
94 if (off >= entry->size) in intel_pmt_read()
97 if (count > entry->size - off) in intel_pmt_read()
98 count = entry->size - off; in intel_pmt_read()
100 count = pmt_telem_read_mmio(entry->ep->pcidev, entry->cb, entry->header.guid, buf, in intel_pmt_read()
101 entry->base, off, count); in intel_pmt_read()
110 struct intel_pmt_entry *entry = container_of(attr, in intel_pmt_mmap() local
113 unsigned long vsize = vma->vm_end - vma->vm_start; in intel_pmt_mmap()
115 unsigned long phys = entry->base_addr; in intel_pmt_mmap()
119 if (vma->vm_flags & (VM_WRITE | VM_MAYWRITE)) in intel_pmt_mmap()
120 return -EROFS; in intel_pmt_mmap()
122 psize = (PFN_UP(entry->base_addr + entry->size) - pfn) * PAGE_SIZE; in intel_pmt_mmap()
125 return -EINVAL; in intel_pmt_mmap()
128 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); in intel_pmt_mmap()
129 if (io_remap_pfn_range(vma, vma->vm_start, pfn, in intel_pmt_mmap()
130 vsize, vma->vm_page_prot)) in intel_pmt_mmap()
131 return -EAGAIN; in intel_pmt_mmap()
139 struct intel_pmt_entry *entry = dev_get_drvdata(dev); in guid_show() local
141 return sprintf(buf, "0x%x\n", entry->guid); in guid_show()
148 struct intel_pmt_entry *entry = dev_get_drvdata(dev); in size_show() local
150 return sprintf(buf, "%zu\n", entry->size); in size_show()
157 struct intel_pmt_entry *entry = dev_get_drvdata(dev); in offset_show() local
159 return sprintf(buf, "%lu\n", offset_in_page(entry->base_addr)); in offset_show()
176 static int intel_pmt_populate_entry(struct intel_pmt_entry *entry, in intel_pmt_populate_entry() argument
180 struct pci_dev *pci_dev = ivdev->pcidev; in intel_pmt_populate_entry()
181 struct device *dev = &ivdev->auxdev.dev; in intel_pmt_populate_entry()
182 struct intel_pmt_header *header = &entry->header; in intel_pmt_populate_entry()
188 * For non-local access types the lower 3 bits of base offset in intel_pmt_populate_entry()
189 * contains the index of the base address register where the in intel_pmt_populate_entry()
192 bir = GET_BIR(header->base_offset); in intel_pmt_populate_entry()
195 switch (header->access_type) { in intel_pmt_populate_entry()
200 bir, header->access_type); in intel_pmt_populate_entry()
201 return -EINVAL; in intel_pmt_populate_entry()
204 * For access_type LOCAL, the base address is as follows: in intel_pmt_populate_entry()
205 * base address = end of discovery region + base offset in intel_pmt_populate_entry()
207 entry->base_addr = disc_res->end + 1 + header->base_offset; in intel_pmt_populate_entry()
210 * Some hardware use a different calculation for the base address in intel_pmt_populate_entry()
212 * ACCESS_LOCAL refers to an address in the same BAR as the in intel_pmt_populate_entry()
213 * header but at a fixed offset. But as the header address was in intel_pmt_populate_entry()
215 * So search for the bar whose range includes the header address. in intel_pmt_populate_entry()
220 entry->base_addr = 0; in intel_pmt_populate_entry()
222 if (disc_res->start >= pci_resource_start(pci_dev, i) && in intel_pmt_populate_entry()
223 (disc_res->start <= pci_resource_end(pci_dev, i))) { in intel_pmt_populate_entry()
224 entry->base_addr = pci_resource_start(pci_dev, i) + in intel_pmt_populate_entry()
225 header->base_offset; in intel_pmt_populate_entry()
228 if (!entry->base_addr) in intel_pmt_populate_entry()
229 return -EINVAL; in intel_pmt_populate_entry()
234 /* Use the provided base address if it exists */ in intel_pmt_populate_entry()
235 if (ivdev->base_addr) { in intel_pmt_populate_entry()
236 entry->base_addr = ivdev->base_addr + in intel_pmt_populate_entry()
237 GET_ADDRESS(header->base_offset); in intel_pmt_populate_entry()
244 * address from the parent PCI device and add offset. in intel_pmt_populate_entry()
246 entry->base_addr = pci_resource_start(pci_dev, bir) + in intel_pmt_populate_entry()
247 GET_ADDRESS(header->base_offset); in intel_pmt_populate_entry()
251 header->access_type); in intel_pmt_populate_entry()
252 return -EINVAL; in intel_pmt_populate_entry()
255 entry->guid = header->guid; in intel_pmt_populate_entry()
256 entry->size = header->size; in intel_pmt_populate_entry()
257 entry->cb = ivdev->priv_data; in intel_pmt_populate_entry()
262 static int intel_pmt_dev_register(struct intel_pmt_entry *entry, in intel_pmt_dev_register() argument
271 ret = xa_alloc(ns->xa, &entry->devid, entry, PMT_XA_LIMIT, GFP_KERNEL); in intel_pmt_dev_register()
275 dev = device_create(&intel_pmt_class, parent, MKDEV(0, 0), entry, in intel_pmt_dev_register()
276 "%s%d", ns->name, entry->devid); in intel_pmt_dev_register()
280 ns->name, entry->devid); in intel_pmt_dev_register()
285 entry->kobj = &dev->kobj; in intel_pmt_dev_register()
287 if (ns->attr_grp) { in intel_pmt_dev_register()
288 ret = sysfs_create_group(entry->kobj, ns->attr_grp); in intel_pmt_dev_register()
294 if (!entry->size) in intel_pmt_dev_register()
297 res.start = entry->base_addr; in intel_pmt_dev_register()
298 res.end = res.start + entry->size - 1; in intel_pmt_dev_register()
301 entry->base = devm_ioremap_resource(dev, &res); in intel_pmt_dev_register()
302 if (IS_ERR(entry->base)) { in intel_pmt_dev_register()
303 ret = PTR_ERR(entry->base); in intel_pmt_dev_register()
307 sysfs_bin_attr_init(&entry->pmt_bin_attr); in intel_pmt_dev_register()
308 entry->pmt_bin_attr.attr.name = ns->name; in intel_pmt_dev_register()
309 entry->pmt_bin_attr.attr.mode = 0440; in intel_pmt_dev_register()
310 entry->pmt_bin_attr.mmap = intel_pmt_mmap; in intel_pmt_dev_register()
311 entry->pmt_bin_attr.read_new = intel_pmt_read; in intel_pmt_dev_register()
312 entry->pmt_bin_attr.size = entry->size; in intel_pmt_dev_register()
314 ret = sysfs_create_bin_file(&dev->kobj, &entry->pmt_bin_attr); in intel_pmt_dev_register()
318 if (ns->pmt_add_endpoint) { in intel_pmt_dev_register()
319 ret = ns->pmt_add_endpoint(ivdev, entry); in intel_pmt_dev_register()
327 sysfs_remove_bin_file(entry->kobj, &entry->pmt_bin_attr); in intel_pmt_dev_register()
329 if (ns->attr_grp) in intel_pmt_dev_register()
330 sysfs_remove_group(entry->kobj, ns->attr_grp); in intel_pmt_dev_register()
334 xa_erase(ns->xa, entry->devid); in intel_pmt_dev_register()
339 int intel_pmt_dev_create(struct intel_pmt_entry *entry, struct intel_pmt_namespace *ns, in intel_pmt_dev_create() argument
342 struct device *dev = &intel_vsec_dev->auxdev.dev; in intel_pmt_dev_create()
346 disc_res = &intel_vsec_dev->resource[idx]; in intel_pmt_dev_create()
348 entry->disc_table = devm_ioremap_resource(dev, disc_res); in intel_pmt_dev_create()
349 if (IS_ERR(entry->disc_table)) in intel_pmt_dev_create()
350 return PTR_ERR(entry->disc_table); in intel_pmt_dev_create()
352 ret = ns->pmt_header_decode(entry, dev); in intel_pmt_dev_create()
356 ret = intel_pmt_populate_entry(entry, intel_vsec_dev, disc_res); in intel_pmt_dev_create()
360 return intel_pmt_dev_register(entry, ns, dev); in intel_pmt_dev_create()
364 void intel_pmt_dev_destroy(struct intel_pmt_entry *entry, in intel_pmt_dev_destroy() argument
367 struct device *dev = kobj_to_dev(entry->kobj); in intel_pmt_dev_destroy()
369 if (entry->size) in intel_pmt_dev_destroy()
370 sysfs_remove_bin_file(entry->kobj, &entry->pmt_bin_attr); in intel_pmt_dev_destroy()
372 if (ns->attr_grp) in intel_pmt_dev_destroy()
373 sysfs_remove_group(entry->kobj, ns->attr_grp); in intel_pmt_dev_destroy()
376 xa_erase(ns->xa, entry->devid); in intel_pmt_dev_destroy()