Subversion Repositories Kolibri OS

Rev

Rev 5056 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3763 Serge 1
/*
2
 * kobject.h - generic kernel object infrastructure.
3
 *
4
 * Copyright (c) 2002-2003 Patrick Mochel
5
 * Copyright (c) 2002-2003 Open Source Development Labs
6
 * Copyright (c) 2006-2008 Greg Kroah-Hartman 
7
 * Copyright (c) 2006-2008 Novell Inc.
8
 *
9
 * This file is released under the GPLv2.
10
 *
11
 * Please read Documentation/kobject.txt before using the kobject
12
 * interface, ESPECIALLY the parts about reference counts and object
13
 * destructors.
14
 */
15
 
16
#ifndef _KOBJECT_H_
17
#define _KOBJECT_H_
18
 
19
#include 
20
#include 
21
//#include 
22
#include 
23
#include 
24
#include 
25
//#include 
26
#include 
27
#include 
5270 serge 28
#include 
29
#include 
3763 Serge 30
 
31
#define UEVENT_HELPER_PATH_LEN		256
32
#define UEVENT_NUM_ENVP			32	/* number of env pointers */
33
#define UEVENT_BUFFER_SIZE		2048	/* buffer for the variables */
34
 
5056 serge 35
#ifdef CONFIG_UEVENT_HELPER
3763 Serge 36
/* path to the userspace helper executed on an event */
37
extern char uevent_helper[];
5056 serge 38
#endif
3763 Serge 39
 
40
/* counter to tag the uevent, read only except for the kobject core */
41
extern u64 uevent_seqnum;
42
 
43
/*
44
 * The actions here must match the index to the string array
45
 * in lib/kobject_uevent.c
46
 *
47
 * Do not add new actions here without checking with the driver-core
48
 * maintainers. Action strings are not meant to express subsystem
49
 * or device specific properties. In most cases you want to send a
50
 * kobject_uevent_env(kobj, KOBJ_CHANGE, env) with additional event
51
 * specific variables added to the event environment.
52
 */
53
enum kobject_action {
54
	KOBJ_ADD,
55
	KOBJ_REMOVE,
56
	KOBJ_CHANGE,
57
	KOBJ_MOVE,
58
	KOBJ_ONLINE,
59
	KOBJ_OFFLINE,
60
	KOBJ_MAX
61
};
62
 
63
struct kobject {
64
    const char          *name;
65
	struct list_head	entry;
66
	struct kobject		*parent;
67
//    struct kset         *kset;
68
	struct kobj_type	*ktype;
69
//   struct sysfs_dirent *sd;
70
	struct kref		kref;
5056 serge 71
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
72
	struct delayed_work	release;
73
#endif
3763 Serge 74
	unsigned int state_initialized:1;
75
	unsigned int state_in_sysfs:1;
76
	unsigned int state_add_uevent_sent:1;
77
	unsigned int state_remove_uevent_sent:1;
78
	unsigned int uevent_suppress:1;
79
};
80
 
81
extern __printf(2, 3)
82
int kobject_set_name(struct kobject *kobj, const char *name, ...);
83
extern int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
84
				  va_list vargs);
85
 
86
static inline const char *kobject_name(const struct kobject *kobj)
87
{
88
	return kobj->name;
89
}
90
 
91
extern void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
92
extern __printf(3, 4) __must_check
93
int kobject_add(struct kobject *kobj, struct kobject *parent,
94
		const char *fmt, ...);
95
extern __printf(4, 5) __must_check
96
int kobject_init_and_add(struct kobject *kobj,
97
			 struct kobj_type *ktype, struct kobject *parent,
98
			 const char *fmt, ...);
99
 
100
extern void kobject_del(struct kobject *kobj);
101
 
102
extern struct kobject * __must_check kobject_create(void);
103
extern struct kobject * __must_check kobject_create_and_add(const char *name,
104
						struct kobject *parent);
105
 
106
extern int __must_check kobject_rename(struct kobject *, const char *new_name);
107
extern int __must_check kobject_move(struct kobject *, struct kobject *);
108
 
109
extern struct kobject *kobject_get(struct kobject *kobj);
110
extern void kobject_put(struct kobject *kobj);
111
 
5056 serge 112
extern const void *kobject_namespace(struct kobject *kobj);
3763 Serge 113
extern char *kobject_get_path(struct kobject *kobj, gfp_t flag);
114
 
115
struct kobj_type {
116
	void (*release)(struct kobject *kobj);
117
//   const struct sysfs_ops *sysfs_ops;
118
//   struct attribute **default_attrs;
119
//   const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
120
//   const void *(*namespace)(struct kobject *kobj);
121
};
122
 
123
struct kobj_uevent_env {
124
	char *envp[UEVENT_NUM_ENVP];
125
	int envp_idx;
126
	char buf[UEVENT_BUFFER_SIZE];
127
	int buflen;
128
};
129
 
130
//struct kset_uevent_ops {
131
//   int (* const filter)(struct kset *kset, struct kobject *kobj);
132
//   const char *(* const name)(struct kset *kset, struct kobject *kobj);
133
//   int (* const uevent)(struct kset *kset, struct kobject *kobj,
134
//             struct kobj_uevent_env *env);
135
//};
136
 
137
struct kobj_attribute {
138
//   struct attribute attr;
139
	ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
140
			char *buf);
141
	ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
142
			 const char *buf, size_t count);
143
};
144
 
145
extern const struct sysfs_ops kobj_sysfs_ops;
146
 
147
struct sock;
148
 
149
/**
150
 * struct kset - a set of kobjects of a specific type, belonging to a specific subsystem.
151
 *
152
 * A kset defines a group of kobjects.  They can be individually
153
 * different "types" but overall these kobjects all want to be grouped
154
 * together and operated on in the same manner.  ksets are used to
155
 * define the attribute callbacks and other common events that happen to
156
 * a kobject.
157
 *
158
 * @list: the list of all kobjects for this kset
159
 * @list_lock: a lock for iterating over the kobjects
160
 * @kobj: the embedded kobject for this kset (recursion, isn't it fun...)
161
 * @uevent_ops: the set of uevent operations for this kset.  These are
162
 * called whenever a kobject has something happen to it so that the kset
163
 * can add new environment variables, or filter out the uevents if so
164
 * desired.
165
 */
166
struct kset {
167
	struct list_head list;
168
	spinlock_t list_lock;
169
	struct kobject kobj;
170
//   const struct kset_uevent_ops *uevent_ops;
171
};
172
 
173
//extern void kset_init(struct kset *kset);
174
//extern int __must_check kset_register(struct kset *kset);
175
//extern void kset_unregister(struct kset *kset);
176
//extern struct kset * __must_check kset_create_and_add(const char *name,
177
//                       const struct kset_uevent_ops *u,
178
//                       struct kobject *parent_kobj);
179
 
180
//static inline struct kset *to_kset(struct kobject *kobj)
181
//{
182
//   return kobj ? container_of(kobj, struct kset, kobj) : NULL;
183
//}
184
 
185
//static inline struct kset *kset_get(struct kset *k)
186
//{
187
//   return k ? to_kset(kobject_get(&k->kobj)) : NULL;
188
//}
189
 
190
//static inline void kset_put(struct kset *k)
191
//{
192
//   kobject_put(&k->kobj);
193
//}
194
 
195
static inline struct kobj_type *get_ktype(struct kobject *kobj)
196
{
197
	return kobj->ktype;
198
}
199
 
200
//extern struct kobject *kset_find_obj(struct kset *, const char *);
201
 
202
/* The global /sys/kernel/ kobject for people to chain off of */
203
extern struct kobject *kernel_kobj;
204
/* The global /sys/kernel/mm/ kobject for people to chain off of */
205
extern struct kobject *mm_kobj;
206
/* The global /sys/hypervisor/ kobject for people to chain off of */
207
extern struct kobject *hypervisor_kobj;
208
/* The global /sys/power/ kobject for people to chain off of */
209
extern struct kobject *power_kobj;
210
/* The global /sys/firmware/ kobject for people to chain off of */
211
extern struct kobject *firmware_kobj;
212
 
213
int kobject_uevent(struct kobject *kobj, enum kobject_action action);
214
int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
215
			char *envp[]);
216
 
217
__printf(2, 3)
218
int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...);
219
 
220
int kobject_action_type(const char *buf, size_t count,
221
			enum kobject_action *type);
222
 
223
#endif /* _KOBJECT_H_ */