master
1/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) */
2/*
3 * Copyright (C) 2022-2024 OpenSynergy GmbH
4 * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
5 */
6
7#ifndef _LINUX_VIRTIO_RTC_H
8#define _LINUX_VIRTIO_RTC_H
9
10#include <linux/types.h>
11
12/* alarm feature */
13#define VIRTIO_RTC_F_ALARM 0
14
15/* read request message types */
16
17#define VIRTIO_RTC_REQ_READ 0x0001
18#define VIRTIO_RTC_REQ_READ_CROSS 0x0002
19
20/* control request message types */
21
22#define VIRTIO_RTC_REQ_CFG 0x1000
23#define VIRTIO_RTC_REQ_CLOCK_CAP 0x1001
24#define VIRTIO_RTC_REQ_CROSS_CAP 0x1002
25#define VIRTIO_RTC_REQ_READ_ALARM 0x1003
26#define VIRTIO_RTC_REQ_SET_ALARM 0x1004
27#define VIRTIO_RTC_REQ_SET_ALARM_ENABLED 0x1005
28
29/* alarmq message types */
30
31#define VIRTIO_RTC_NOTIF_ALARM 0x2000
32
33/* Message headers */
34
35/** common request header */
36struct virtio_rtc_req_head {
37 __le16 msg_type;
38 __u8 reserved[6];
39};
40
41/** common response header */
42struct virtio_rtc_resp_head {
43#define VIRTIO_RTC_S_OK 0
44#define VIRTIO_RTC_S_EOPNOTSUPP 2
45#define VIRTIO_RTC_S_ENODEV 3
46#define VIRTIO_RTC_S_EINVAL 4
47#define VIRTIO_RTC_S_EIO 5
48 __u8 status;
49 __u8 reserved[7];
50};
51
52/** common notification header */
53struct virtio_rtc_notif_head {
54 __le16 msg_type;
55 __u8 reserved[6];
56};
57
58/* read requests */
59
60/* VIRTIO_RTC_REQ_READ message */
61
62struct virtio_rtc_req_read {
63 struct virtio_rtc_req_head head;
64 __le16 clock_id;
65 __u8 reserved[6];
66};
67
68struct virtio_rtc_resp_read {
69 struct virtio_rtc_resp_head head;
70 __le64 clock_reading;
71};
72
73/* VIRTIO_RTC_REQ_READ_CROSS message */
74
75struct virtio_rtc_req_read_cross {
76 struct virtio_rtc_req_head head;
77 __le16 clock_id;
78/* Arm Generic Timer Counter-timer Virtual Count Register (CNTVCT_EL0) */
79#define VIRTIO_RTC_COUNTER_ARM_VCT 0
80/* x86 Time-Stamp Counter */
81#define VIRTIO_RTC_COUNTER_X86_TSC 1
82/* Invalid */
83#define VIRTIO_RTC_COUNTER_INVALID 0xFF
84 __u8 hw_counter;
85 __u8 reserved[5];
86};
87
88struct virtio_rtc_resp_read_cross {
89 struct virtio_rtc_resp_head head;
90 __le64 clock_reading;
91 __le64 counter_cycles;
92};
93
94/* control requests */
95
96/* VIRTIO_RTC_REQ_CFG message */
97
98struct virtio_rtc_req_cfg {
99 struct virtio_rtc_req_head head;
100 /* no request params */
101};
102
103struct virtio_rtc_resp_cfg {
104 struct virtio_rtc_resp_head head;
105 /** # of clocks -> clock ids < num_clocks are valid */
106 __le16 num_clocks;
107 __u8 reserved[6];
108};
109
110/* VIRTIO_RTC_REQ_CLOCK_CAP message */
111
112struct virtio_rtc_req_clock_cap {
113 struct virtio_rtc_req_head head;
114 __le16 clock_id;
115 __u8 reserved[6];
116};
117
118struct virtio_rtc_resp_clock_cap {
119 struct virtio_rtc_resp_head head;
120#define VIRTIO_RTC_CLOCK_UTC 0
121#define VIRTIO_RTC_CLOCK_TAI 1
122#define VIRTIO_RTC_CLOCK_MONOTONIC 2
123#define VIRTIO_RTC_CLOCK_UTC_SMEARED 3
124#define VIRTIO_RTC_CLOCK_UTC_MAYBE_SMEARED 4
125 __u8 type;
126#define VIRTIO_RTC_SMEAR_UNSPECIFIED 0
127#define VIRTIO_RTC_SMEAR_NOON_LINEAR 1
128#define VIRTIO_RTC_SMEAR_UTC_SLS 2
129 __u8 leap_second_smearing;
130#define VIRTIO_RTC_FLAG_ALARM_CAP (1 << 0)
131 __u8 flags;
132 __u8 reserved[5];
133};
134
135/* VIRTIO_RTC_REQ_CROSS_CAP message */
136
137struct virtio_rtc_req_cross_cap {
138 struct virtio_rtc_req_head head;
139 __le16 clock_id;
140 __u8 hw_counter;
141 __u8 reserved[5];
142};
143
144struct virtio_rtc_resp_cross_cap {
145 struct virtio_rtc_resp_head head;
146#define VIRTIO_RTC_FLAG_CROSS_CAP (1 << 0)
147 __u8 flags;
148 __u8 reserved[7];
149};
150
151/* VIRTIO_RTC_REQ_READ_ALARM message */
152
153struct virtio_rtc_req_read_alarm {
154 struct virtio_rtc_req_head head;
155 __le16 clock_id;
156 __u8 reserved[6];
157};
158
159struct virtio_rtc_resp_read_alarm {
160 struct virtio_rtc_resp_head head;
161 __le64 alarm_time;
162#define VIRTIO_RTC_FLAG_ALARM_ENABLED (1 << 0)
163 __u8 flags;
164 __u8 reserved[7];
165};
166
167/* VIRTIO_RTC_REQ_SET_ALARM message */
168
169struct virtio_rtc_req_set_alarm {
170 struct virtio_rtc_req_head head;
171 __le64 alarm_time;
172 __le16 clock_id;
173 /* flag VIRTIO_RTC_FLAG_ALARM_ENABLED */
174 __u8 flags;
175 __u8 reserved[5];
176};
177
178struct virtio_rtc_resp_set_alarm {
179 struct virtio_rtc_resp_head head;
180 /* no response params */
181};
182
183/* VIRTIO_RTC_REQ_SET_ALARM_ENABLED message */
184
185struct virtio_rtc_req_set_alarm_enabled {
186 struct virtio_rtc_req_head head;
187 __le16 clock_id;
188 /* flag VIRTIO_RTC_ALARM_ENABLED */
189 __u8 flags;
190 __u8 reserved[5];
191};
192
193struct virtio_rtc_resp_set_alarm_enabled {
194 struct virtio_rtc_resp_head head;
195 /* no response params */
196};
197
198/** Union of request types for requestq */
199union virtio_rtc_req_requestq {
200 struct virtio_rtc_req_read read;
201 struct virtio_rtc_req_read_cross read_cross;
202 struct virtio_rtc_req_cfg cfg;
203 struct virtio_rtc_req_clock_cap clock_cap;
204 struct virtio_rtc_req_cross_cap cross_cap;
205 struct virtio_rtc_req_read_alarm read_alarm;
206 struct virtio_rtc_req_set_alarm set_alarm;
207 struct virtio_rtc_req_set_alarm_enabled set_alarm_enabled;
208};
209
210/** Union of response types for requestq */
211union virtio_rtc_resp_requestq {
212 struct virtio_rtc_resp_read read;
213 struct virtio_rtc_resp_read_cross read_cross;
214 struct virtio_rtc_resp_cfg cfg;
215 struct virtio_rtc_resp_clock_cap clock_cap;
216 struct virtio_rtc_resp_cross_cap cross_cap;
217 struct virtio_rtc_resp_read_alarm read_alarm;
218 struct virtio_rtc_resp_set_alarm set_alarm;
219 struct virtio_rtc_resp_set_alarm_enabled set_alarm_enabled;
220};
221
222/* alarmq notifications */
223
224/* VIRTIO_RTC_NOTIF_ALARM notification */
225
226struct virtio_rtc_notif_alarm {
227 struct virtio_rtc_notif_head head;
228 __le16 clock_id;
229 __u8 reserved[6];
230};
231
232/** Union of notification types for alarmq */
233union virtio_rtc_notif_alarmq {
234 struct virtio_rtc_notif_alarm alarm;
235};
236
237#endif /* _LINUX_VIRTIO_RTC_H */