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