struct intel_pmt_entry entry[];
};
-static bool pmt_telem_region_overlaps(struct intel_pmt_entry *entry,
- struct device *dev)
+static bool pmt_telem_region_overlaps(struct device *dev, u32 guid, u32 type)
{
- u32 guid = readl(entry->disc_table + TELEM_GUID_OFFSET);
-
if (intel_pmt_is_early_client_hw(dev)) {
- u32 type = TELEM_TYPE(readl(entry->disc_table));
-
if ((type == TELEM_TYPE_PUNIT_FIXED) ||
(guid == TELEM_CLIENT_FIXED_BLOCK_GUID))
return true;
void __iomem *disc_table = entry->disc_table;
struct intel_pmt_header *header = &entry->header;
- if (pmt_telem_region_overlaps(entry, dev))
- return 1;
-
header->access_type = TELEM_ACCESS(readl(disc_table));
header->guid = readl(disc_table + TELEM_GUID_OFFSET);
header->base_offset = readl(disc_table + TELEM_BASE_OFFSET);
/* Size is measured in DWORDS, but accessor returns bytes */
header->size = TELEM_SIZE(readl(disc_table));
+ header->telem_type = TELEM_TYPE(readl(entry->disc_table));
+
+ return 0;
+}
+
+static int pmt_telem_post_decode(struct intel_vsec_device *ivdev,
+ struct intel_pmt_entry *entry)
+{
+ struct intel_pmt_header *header = &entry->header;
+ struct device *dev = &ivdev->auxdev.dev;
+
+ if (pmt_telem_region_overlaps(dev, header->guid, header->telem_type))
+ return 1;
/*
* Some devices may expose non-functioning entries that are
.name = "telem",
.xa = &telem_array,
.pmt_header_decode = pmt_telem_header_decode,
+ .pmt_post_decode = pmt_telem_post_decode,
.pmt_add_endpoint = pmt_telem_add_endpoint,
};