1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _TELEMETRY_H
3 #define _TELEMETRY_H
4 
5 /* Telemetry types */
6 #define PMT_TELEM_TELEMETRY	0
7 #define PMT_TELEM_CRASHLOG	1
8 
9 struct telem_endpoint;
10 struct pci_dev;
11 
12 struct telem_header {
13 	u8	access_type;
14 	u16	size;
15 	u32	guid;
16 	u32	base_offset;
17 };
18 
19 struct telem_endpoint_info {
20 	struct pci_dev		*pdev;
21 	struct telem_header	header;
22 };
23 
24 /**
25  * pmt_telem_get_next_endpoint() - Get next device id for a telemetry endpoint
26  * @start:  starting devid to look from
27  *
28  * This functions can be used in a while loop predicate to retrieve the devid
29  * of all available telemetry endpoints. Functions pmt_telem_get_next_endpoint()
30  * and pmt_telem_register_endpoint() can be used inside of the loop to examine
31  * endpoint info and register to receive a pointer to the endpoint. The pointer
32  * is then usable in the telemetry read calls to access the telemetry data.
33  *
34  * Return:
35  * * devid       - devid of the next present endpoint from start
36  * * 0           - when no more endpoints are present after start
37  */
38 unsigned long pmt_telem_get_next_endpoint(unsigned long start);
39 
40 /**
41  * pmt_telem_register_endpoint() - Register a telemetry endpoint
42  * @devid: device id/handle of the telemetry endpoint
43  *
44  * Increments the kref usage counter for the endpoint.
45  *
46  * Return:
47  * * endpoint    - On success returns pointer to the telemetry endpoint
48  * * -ENXIO      - telemetry endpoint not found
49  */
50 struct telem_endpoint *pmt_telem_register_endpoint(int devid);
51 
52 /**
53  * pmt_telem_unregister_endpoint() - Unregister a telemetry endpoint
54  * @ep:   ep structure to populate.
55  *
56  * Decrements the kref usage counter for the endpoint.
57  */
58 void pmt_telem_unregister_endpoint(struct telem_endpoint *ep);
59 
60 /**
61  * pmt_telem_get_endpoint_info() - Get info for an endpoint from its devid
62  * @devid:  device id/handle of the telemetry endpoint
63  * @info:   Endpoint info structure to be populated
64  *
65  * Return:
66  * * 0           - Success
67  * * -ENXIO      - telemetry endpoint not found for the devid
68  * * -EINVAL     - @info is NULL
69  */
70 int pmt_telem_get_endpoint_info(int devid, struct telem_endpoint_info *info);
71 
72 /**
73  * pmt_telem_find_and_register_endpoint() - Get a telemetry endpoint from
74  * pci_dev device, guid and pos
75  * @pdev:   PCI device inside the Intel vsec
76  * @guid:   GUID of the telemetry space
77  * @pos:    Instance of the guid
78  *
79  * Return:
80  * * endpoint    - On success returns pointer to the telemetry endpoint
81  * * -ENXIO      - telemetry endpoint not found
82  */
83 struct telem_endpoint *pmt_telem_find_and_register_endpoint(struct pci_dev *pcidev,
84 				u32 guid, u16 pos);
85 
86 /**
87  * pmt_telem_read() - Read qwords from counter sram using sample id
88  * @ep:     Telemetry endpoint to be read
89  * @id:     The beginning sample id of the metric(s) to be read
90  * @data:   Allocated qword buffer
91  * @count:  Number of qwords requested
92  *
93  * Callers must ensure reads are aligned. When the call returns -ENODEV,
94  * the device has been removed and callers should unregister the telemetry
95  * endpoint.
96  *
97  * Return:
98  * * 0           - Success
99  * * -ENODEV     - The device is not present.
100  * * -EINVAL     - The offset is out bounds
101  * * -EPIPE      - The device was removed during the read. Data written
102  *                 but should be considered invalid.
103  */
104 int pmt_telem_read(struct telem_endpoint *ep, u32 id, u64 *data, u32 count);
105 
106 /**
107  * pmt_telem_read32() - Read qwords from counter sram using sample id
108  * @ep:     Telemetry endpoint to be read
109  * @id:     The beginning sample id of the metric(s) to be read
110  * @data:   Allocated dword buffer
111  * @count:  Number of dwords requested
112  *
113  * Callers must ensure reads are aligned. When the call returns -ENODEV,
114  * the device has been removed and callers should unregister the telemetry
115  * endpoint.
116  *
117  * Return:
118  * * 0           - Success
119  * * -ENODEV     - The device is not present.
120  * * -EINVAL     - The offset is out bounds
121  * * -EPIPE      - The device was removed during the read. Data written
122  *                 but should be considered invalid.
123  */
124 int pmt_telem_read32(struct telem_endpoint *ep, u32 id, u32 *data, u32 count);
125 
126 #endif
127