/* SPR */
 #define SPR_RAW_EVENT_MASK_EXT                 0xffffff
+#define SPR_UBOX_DID                           0x3250
 
 /* SPR CHA */
 #define SPR_CHA_PMON_CTL_TID_EN                        (1 << 16)
        .name                   = "m2m",
 };
 
+static struct attribute_group spr_upi_mapping_group = {
+       .is_visible     = skx_upi_mapping_visible,
+};
+
+static const struct attribute_group *spr_upi_attr_update[] = {
+       &uncore_alias_group,
+       &spr_upi_mapping_group,
+       NULL
+};
+
+#define SPR_UPI_REGS_ADDR_DEVICE_LINK0 0x01
+
+static int spr_upi_set_mapping(struct intel_uncore_type *type)
+{
+       return pmu_upi_set_mapping(type, &spr_upi_mapping_group);
+}
+
+static void spr_upi_cleanup_mapping(struct intel_uncore_type *type)
+{
+       pmu_cleanup_mapping(type, &spr_upi_mapping_group);
+}
+
+static int spr_upi_get_topology(struct intel_uncore_type *type)
+{
+       return discover_upi_topology(type, SPR_UBOX_DID, SPR_UPI_REGS_ADDR_DEVICE_LINK0);
+}
+
 static struct intel_uncore_type spr_uncore_upi = {
-       SPR_UNCORE_PCI_COMMON_FORMAT(),
+       .event_mask             = SNBEP_PMON_RAW_EVENT_MASK,
+       .event_mask_ext         = SPR_RAW_EVENT_MASK_EXT,
+       .format_group           = &spr_uncore_raw_format_group,
+       .ops                    = &spr_uncore_pci_ops,
        .name                   = "upi",
+       .attr_update            = spr_upi_attr_update,
+       .get_topology           = spr_upi_get_topology,
+       .set_mapping            = spr_upi_set_mapping,
+       .cleanup_mapping        = spr_upi_cleanup_mapping,
 };
 
 static struct intel_uncore_type spr_uncore_m3upi = {
                to_type->format_group = from_type->format_group;
        if (from_type->attr_update)
                to_type->attr_update = from_type->attr_update;
+       if (from_type->set_mapping)
+               to_type->set_mapping = from_type->set_mapping;
+       if (from_type->get_topology)
+               to_type->get_topology = from_type->get_topology;
+       if (from_type->cleanup_mapping)
+               to_type->cleanup_mapping = from_type->cleanup_mapping;
 }
 
 static struct intel_uncore_type **