]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform/x86/intel/pmt: allow user offset for PMT callbacks
authorMichael J. Ruhl <michael.j.ruhl@intel.com>
Thu, 14 Nov 2024 13:03:57 +0000 (08:03 -0500)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Thu, 14 Nov 2024 13:16:50 +0000 (15:16 +0200)
Usage of the telem sysfs file allows for partial reads at an offset.
The current callback method returns the buffer starting from offset 0
only.

Include the requested offset in the callback and update the necessary
address calculations with the offset.

Note: offset addition is moved from the caller to the local usage. For
non-callback usage this is unchanged behavior.

Fixes: e92affc74cd8 ("platform/x86/intel/vsec: Add PMT read callbacks")
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Link: https://lore.kernel.org/r/20241114130358.2467787-2-michael.j.ruhl@intel.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/intel/pmt/class.c
drivers/platform/x86/intel/pmt/class.h
drivers/platform/x86/intel/pmt/telemetry.c
include/linux/intel_vsec.h

index 7680474c4f968e22643d935b548817c7dc6c8fb7..375695cc0d60cc382bb5ab023a8348e05707b2c9 100644 (file)
@@ -59,10 +59,12 @@ pmt_memcpy64_fromio(void *to, const u64 __iomem *from, size_t count)
 }
 
 int pmt_telem_read_mmio(struct pci_dev *pdev, struct pmt_callbacks *cb, u32 guid, void *buf,
-                       void __iomem *addr, u32 count)
+                       void __iomem *addr, loff_t off, u32 count)
 {
        if (cb && cb->read_telem)
-               return cb->read_telem(pdev, guid, buf, count);
+               return cb->read_telem(pdev, guid, buf, off, count);
+
+       addr += off;
 
        if (guid == GUID_SPR_PUNIT)
                /* PUNIT on SPR only supports aligned 64-bit read */
@@ -96,7 +98,7 @@ intel_pmt_read(struct file *filp, struct kobject *kobj,
                count = entry->size - off;
 
        count = pmt_telem_read_mmio(entry->ep->pcidev, entry->cb, entry->header.guid, buf,
-                                   entry->base + off, count);
+                                   entry->base, off, count);
 
        return count;
 }
index a267ac964423016baf96d2c39b79873b06009c62..b2006d57779d66b50e29b5249d4a65aaf853a6e2 100644 (file)
@@ -62,7 +62,7 @@ struct intel_pmt_namespace {
 };
 
 int pmt_telem_read_mmio(struct pci_dev *pdev, struct pmt_callbacks *cb, u32 guid, void *buf,
-                       void __iomem *addr, u32 count);
+                       void __iomem *addr, loff_t off, u32 count);
 bool intel_pmt_is_early_client_hw(struct device *dev);
 int intel_pmt_dev_create(struct intel_pmt_entry *entry,
                         struct intel_pmt_namespace *ns,
index c9feac859e574c04c5786b7f0f09530e5496d82b..0cea617c6c2e255fcd543fd92023dad1b94c2664 100644 (file)
@@ -219,7 +219,7 @@ int pmt_telem_read(struct telem_endpoint *ep, u32 id, u64 *data, u32 count)
        if (offset + NUM_BYTES_QWORD(count) > size)
                return -EINVAL;
 
-       pmt_telem_read_mmio(ep->pcidev, ep->cb, ep->header.guid, data, ep->base + offset,
+       pmt_telem_read_mmio(ep->pcidev, ep->cb, ep->header.guid, data, ep->base, offset,
                            NUM_BYTES_QWORD(count));
 
        return ep->present ? 0 : -EPIPE;
index 11ee185566c31c211695419808be1d04cc266d0b..b94beab64610b91fd275b3b4b4946001d049cec8 100644 (file)
@@ -74,10 +74,11 @@ enum intel_vsec_quirks {
  * @pdev:  PCI device reference for the callback's use
  * @guid:  ID of data to acccss
  * @data:  buffer for the data to be copied
+ * @off:   offset into the requested buffer
  * @count: size of buffer
  */
 struct pmt_callbacks {
-       int (*read_telem)(struct pci_dev *pdev, u32 guid, u64 *data, u32 count);
+       int (*read_telem)(struct pci_dev *pdev, u32 guid, u64 *data, loff_t off, u32 count);
 };
 
 /**