tools/power turbostat: Extend PMT identification with a sequence number

When platforms expose multiple PMT aggregators with the same GUID, the
only way to identify them and map to specific domain is by reading them
in an order they were exposed via PCIe. Intel PMT kernel driver does
keep the same order and numbers the telemetry directories accordingly.

Use GUID and sequence number (order) to uniquely identify PMT
aggregators.

Signed-off-by: Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>

authored by Patryk Wlazlyn and committed by Len Brown 089134cb 34537ddd

+19 -8
+19 -8
tools/power/x86/turbostat/turbostat.c
··· 1536 1536 #define PMT_COUNTER_MTL_DC6_LSB 0 1537 1537 #define PMT_COUNTER_MTL_DC6_MSB 63 1538 1538 #define PMT_MTL_DC6_GUID 0x1a067102 1539 + #define PMT_MTL_DC6_SEQ 0 1539 1540 1540 1541 #define PMT_COUNTER_NAME_SIZE_BYTES 16 1541 1542 #define PMT_COUNTER_TYPE_NAME_SIZE_BYTES 32 ··· 9084 9083 return ret; 9085 9084 } 9086 9085 9087 - struct pmt_mmio *pmt_add_guid(unsigned int guid) 9086 + struct pmt_mmio *pmt_add_guid(unsigned int guid, unsigned int seq) 9088 9087 { 9089 9088 struct pmt_mmio *ret; 9090 9089 9091 9090 ret = pmt_mmio_find(guid); 9092 9091 if (!ret) 9093 9092 ret = pmt_mmio_open(guid); 9093 + 9094 + while (ret && seq) { 9095 + ret = ret->next; 9096 + --seq; 9097 + } 9094 9098 9095 9099 return ret; 9096 9100 } ··· 9143 9137 pcounter->domains[domain_id].pcounter = pmmio; 9144 9138 } 9145 9139 9146 - int pmt_add_counter(unsigned int guid, const char *name, enum pmt_datatype type, 9140 + int pmt_add_counter(unsigned int guid, unsigned int seq, const char *name, enum pmt_datatype type, 9147 9141 unsigned int lsb, unsigned int msb, unsigned int offset, enum counter_scope scope, 9148 9142 enum counter_format format, unsigned int domain_id, enum pmt_open_mode mode) 9149 9143 { ··· 9163 9157 exit(1); 9164 9158 } 9165 9159 9166 - mmio = pmt_add_guid(guid); 9160 + mmio = pmt_add_guid(guid, seq); 9167 9161 if (!mmio) { 9168 9162 if (mode != PMT_OPEN_TRY) { 9169 - fprintf(stderr, "%s: failed to map PMT MMIO for guid %x\n", __func__, guid); 9163 + fprintf(stderr, "%s: failed to map PMT MMIO for guid %x, seq %u\n", __func__, guid, seq); 9170 9164 exit(1); 9171 9165 } 9172 9166 ··· 9222 9216 void pmt_init(void) 9223 9217 { 9224 9218 if (BIC_IS_ENABLED(BIC_Diec6)) { 9225 - pmt_add_counter(PMT_MTL_DC6_GUID, "Die%c6", PMT_TYPE_XTAL_TIME, PMT_COUNTER_MTL_DC6_LSB, 9226 - PMT_COUNTER_MTL_DC6_MSB, PMT_COUNTER_MTL_DC6_OFFSET, SCOPE_PACKAGE, FORMAT_DELTA, 9227 - 0, PMT_OPEN_TRY); 9219 + pmt_add_counter(PMT_MTL_DC6_GUID, PMT_MTL_DC6_SEQ, "Die%c6", PMT_TYPE_XTAL_TIME, 9220 + PMT_COUNTER_MTL_DC6_LSB, PMT_COUNTER_MTL_DC6_MSB, PMT_COUNTER_MTL_DC6_OFFSET, 9221 + SCOPE_PACKAGE, FORMAT_DELTA, 0, PMT_OPEN_TRY); 9228 9222 } 9229 9223 } 9230 9224 ··· 9705 9699 unsigned int lsb; 9706 9700 unsigned int msb; 9707 9701 unsigned int guid; 9702 + unsigned int seq = 0; /* By default, pick first file in a sequence with a given GUID. */ 9708 9703 unsigned int domain_id; 9709 9704 enum counter_scope scope = 0; 9710 9705 enum pmt_datatype type = PMT_TYPE_RAW; ··· 9782 9775 9783 9776 if (sscanf(add_command, "guid=%x", &guid) == 1) { 9784 9777 has_guid = true; 9778 + goto next; 9779 + } 9780 + 9781 + if (sscanf(add_command, "seq=%x", &seq) == 1) { 9785 9782 goto next; 9786 9783 } 9787 9784 ··· 9875 9864 exit(1); 9876 9865 } 9877 9866 9878 - pmt_add_counter(guid, name, type, lsb, msb, offset, scope, format, domain_id, PMT_OPEN_REQUIRED); 9867 + pmt_add_counter(guid, seq, name, type, lsb, msb, offset, scope, format, domain_id, PMT_OPEN_REQUIRED); 9879 9868 } 9880 9869 9881 9870 void parse_add_command(char *add_command)