blob: f51d535b35766002bb8c292e76a4648ff030b375 [file] [log] [blame]
Carl van Schaik6d7b2ff2018-07-06 22:00:55 +10001/*
2 * drivers/vservices/session.h
3 *
4 * Copyright (c) 2012-2018 General Dynamics
5 * Copyright (c) 2014 Open Kernel Labs, Inc.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 * Definitions related to the vservices session bus and its client and server
12 * session drivers. The interfaces in this file are implementation details of
13 * the vServices framework and should not be used by transport or service
14 * drivers.
15 */
16
17#ifndef _VSERVICES_SESSION_PRIV_H_
18#define _VSERVICES_SESSION_PRIV_H_
19
20/* Maximum number of sessions allowed */
21#define VS_MAX_SESSIONS 64
22
23#include "debug.h"
24
25/* For use by the core server */
26#define VS_SERVICE_AUTO_ALLOCATE_ID 0xffff
27#define VS_SERVICE_ALREADY_RESET 1
28
29/*
30 * The upper bits of the service id are reserved for transport driver specific
31 * use. The reserve bits are always zeroed out above the transport layer.
32 */
33#define VS_SERVICE_ID_TRANSPORT_BITS 4
34#define VS_SERVICE_ID_TRANSPORT_OFFSET 12
35#define VS_SERVICE_ID_TRANSPORT_MASK ((1 << VS_SERVICE_ID_TRANSPORT_BITS) - 1)
36#define VS_SERVICE_ID_MASK \
37 (~(VS_SERVICE_ID_TRANSPORT_MASK << VS_SERVICE_ID_TRANSPORT_OFFSET))
38
39/* Number of bits needed to represent the service id range as a bitmap. */
40#define VS_SERVICE_ID_BITMAP_BITS \
41 (1 << ((sizeof(vs_service_id_t) * 8) - VS_SERVICE_ID_TRANSPORT_BITS))
42
43/* High service ids are reserved for use by the transport drivers */
44#define VS_SERVICE_ID_RESERVED(x) \
45 ((1 << VS_SERVICE_ID_TRANSPORT_OFFSET) - (x))
46
47#define VS_SERVICE_ID_RESERVED_1 VS_SERVICE_ID_RESERVED(1)
48
49/* Name of the session device symlink in service device sysfs directory */
50#define VS_SESSION_SYMLINK_NAME "session"
51
52/* Name of the transport device symlink in session device sysfs directory */
53#define VS_TRANSPORT_SYMLINK_NAME "transport"
54
55static inline unsigned int
56vs_get_service_id_reserved_bits(vs_service_id_t service_id)
57{
58 return (service_id >> VS_SERVICE_ID_TRANSPORT_OFFSET) &
59 VS_SERVICE_ID_TRANSPORT_MASK;
60}
61
62static inline vs_service_id_t vs_get_real_service_id(vs_service_id_t service_id)
63{
64 return service_id & VS_SERVICE_ID_MASK;
65}
66
67static inline void vs_set_service_id_reserved_bits(vs_service_id_t *service_id,
68 unsigned int reserved_bits)
69{
70 *service_id &= ~(VS_SERVICE_ID_TRANSPORT_MASK <<
71 VS_SERVICE_ID_TRANSPORT_OFFSET);
72 *service_id |= (reserved_bits & VS_SERVICE_ID_TRANSPORT_MASK) <<
73 VS_SERVICE_ID_TRANSPORT_OFFSET;
74}
75
76extern struct bus_type vs_session_bus_type;
77extern struct kobject *vservices_root;
78extern struct kobject *vservices_server_root;
79extern struct kobject *vservices_client_root;
80
81/**
82 * struct vs_session_driver - Session driver
83 * @driver: Linux device model driver structure
84 * @service_bus: Pointer to either the server or client bus type
85 * @is_server: True if this driver is for a server session, false if it is for
86 * a client session
87 * @service_added: Called when a non-core service is added.
88 * @service_start: Called when a non-core service is started.
89 * @service_local_reset: Called when an active non-core service driver becomes
90 * inactive.
91 * @service_removed: Called when a non-core service is removed.
92 */
93struct vs_session_driver {
94 struct device_driver driver;
95 struct bus_type *service_bus;
96 bool is_server;
97
98 /* These are all called with the core service state lock held. */
99 int (*service_added)(struct vs_session_device *session,
100 struct vs_service_device *service);
101 int (*service_start)(struct vs_session_device *session,
102 struct vs_service_device *service);
103 int (*service_local_reset)(struct vs_session_device *session,
104 struct vs_service_device *service);
105 int (*service_removed)(struct vs_session_device *session,
106 struct vs_service_device *service);
107};
108
109#define to_vs_session_driver(drv) \
110 container_of(drv, struct vs_session_driver, driver)
111
112/* Service lookup */
113extern struct vs_service_device * vs_session_get_service(
114 struct vs_session_device *session,
115 vs_service_id_t service_id);
116
117/* Service creation & destruction */
118extern struct vs_service_device *
119vs_service_register(struct vs_session_device *session,
120 struct vs_service_device *parent,
121 vs_service_id_t service_id,
122 const char *protocol,
123 const char *name,
124 const void *plat_data);
125
126extern bool vs_service_start(struct vs_service_device *service);
127
128extern int vs_service_delete(struct vs_service_device *service,
129 struct vs_service_device *caller);
130
131extern int vs_service_handle_delete(struct vs_service_device *service);
132
133/* Service reset handling */
134extern int vs_service_handle_reset(struct vs_session_device *session,
135 vs_service_id_t service_id, bool disable);
136extern int vs_service_enable(struct vs_service_device *service);
137
138extern void vs_session_enable_noncore(struct vs_session_device *session);
139extern void vs_session_disable_noncore(struct vs_session_device *session);
140extern void vs_session_delete_noncore(struct vs_session_device *session);
141
142/* Service bus driver management */
143extern int vs_service_bus_probe(struct device *dev);
144extern int vs_service_bus_remove(struct device *dev);
145extern int vs_service_bus_uevent(struct device *dev,
146 struct kobj_uevent_env *env);
147
148#ifdef CONFIG_VSERVICES_CHAR_DEV
149
150extern int vs_devio_init(void);
151extern void vs_devio_exit(void);
152
153extern struct vs_service_device *vs_service_lookup_by_devt(dev_t dev);
154
155extern struct vs_service_driver vs_devio_server_driver;
156extern struct vs_service_driver vs_devio_client_driver;
157
158extern int vservices_cdev_major;
159
160#else /* !CONFIG_VSERVICES_CHAR_DEV */
161
162static inline int vs_devio_init(void)
163{
164 return 0;
165}
166
167static inline void vs_devio_exit(void)
168{
169}
170
171#endif /* !CONFIG_VSERVICES_CHAR_DEV */
172
173#endif /* _VSERVICES_SESSION_PRIV_H_ */