xref: /freebsd-src/sys/compat/linuxkpi/common/include/linux/kobject.h (revision 1bce29bcf121c1e16205fabb100f798d88f757c1)
18d59ecb2SHans Petter Selasky /*-
28d59ecb2SHans Petter Selasky  * Copyright (c) 2010 Isilon Systems, Inc.
38d59ecb2SHans Petter Selasky  * Copyright (c) 2010 iX Systems, Inc.
48d59ecb2SHans Petter Selasky  * Copyright (c) 2010 Panasas, Inc.
58d59ecb2SHans Petter Selasky  * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
68d59ecb2SHans Petter Selasky  * All rights reserved.
78d59ecb2SHans Petter Selasky  *
88d59ecb2SHans Petter Selasky  * Redistribution and use in source and binary forms, with or without
98d59ecb2SHans Petter Selasky  * modification, are permitted provided that the following conditions
108d59ecb2SHans Petter Selasky  * are met:
118d59ecb2SHans Petter Selasky  * 1. Redistributions of source code must retain the above copyright
128d59ecb2SHans Petter Selasky  *    notice unmodified, this list of conditions, and the following
138d59ecb2SHans Petter Selasky  *    disclaimer.
148d59ecb2SHans Petter Selasky  * 2. Redistributions in binary form must reproduce the above copyright
158d59ecb2SHans Petter Selasky  *    notice, this list of conditions and the following disclaimer in the
168d59ecb2SHans Petter Selasky  *    documentation and/or other materials provided with the distribution.
178d59ecb2SHans Petter Selasky  *
188d59ecb2SHans Petter Selasky  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
198d59ecb2SHans Petter Selasky  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
208d59ecb2SHans Petter Selasky  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
218d59ecb2SHans Petter Selasky  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
228d59ecb2SHans Petter Selasky  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
238d59ecb2SHans Petter Selasky  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
248d59ecb2SHans Petter Selasky  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
258d59ecb2SHans Petter Selasky  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
268d59ecb2SHans Petter Selasky  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
278d59ecb2SHans Petter Selasky  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
288d59ecb2SHans Petter Selasky  */
29307f78f3SVladimir Kondratyev #ifndef	_LINUXKPI_LINUX_KOBJECT_H_
30307f78f3SVladimir Kondratyev #define	_LINUXKPI_LINUX_KOBJECT_H_
318d59ecb2SHans Petter Selasky 
328d59ecb2SHans Petter Selasky #include <machine/stdarg.h>
338d59ecb2SHans Petter Selasky 
348d59ecb2SHans Petter Selasky #include <linux/kernel.h>
358d59ecb2SHans Petter Selasky #include <linux/kref.h>
364eb18346SMark Johnston #include <linux/list.h>
378d59ecb2SHans Petter Selasky #include <linux/slab.h>
38fe842818SJean-Sébastien Pédron #include <linux/spinlock.h>
39*1bce29bcSVladimir Kondratyev #include <linux/wait.h>
40*1bce29bcSVladimir Kondratyev #include <linux/workqueue.h>
418d59ecb2SHans Petter Selasky 
428d59ecb2SHans Petter Selasky struct kobject;
43fe842818SJean-Sébastien Pédron struct kset;
448d59ecb2SHans Petter Selasky struct sysctl_oid;
458d59ecb2SHans Petter Selasky 
464abbf816SBjoern A. Zeeb #define	KOBJ_CHANGE		0x01
474abbf816SBjoern A. Zeeb 
488d59ecb2SHans Petter Selasky struct kobj_type {
498d59ecb2SHans Petter Selasky 	void (*release)(struct kobject *kobj);
508d59ecb2SHans Petter Selasky 	const struct sysfs_ops *sysfs_ops;
518d59ecb2SHans Petter Selasky 	struct attribute **default_attrs;
5219a35543SJean-Sébastien Pédron 	const struct attribute_group **default_groups;
538d59ecb2SHans Petter Selasky };
548d59ecb2SHans Petter Selasky 
5506204f8eSHans Petter Selasky extern const struct kobj_type linux_kfree_type;
568d59ecb2SHans Petter Selasky 
578d59ecb2SHans Petter Selasky struct kobject {
588d59ecb2SHans Petter Selasky 	struct kobject		*parent;
598d59ecb2SHans Petter Selasky 	char			*name;
608d59ecb2SHans Petter Selasky 	struct kref		kref;
6106204f8eSHans Petter Selasky 	const struct kobj_type	*ktype;
628d59ecb2SHans Petter Selasky 	struct list_head	entry;
638d59ecb2SHans Petter Selasky 	struct sysctl_oid	*oidp;
64fe842818SJean-Sébastien Pédron 	struct kset		*kset;
658d59ecb2SHans Petter Selasky };
668d59ecb2SHans Petter Selasky 
678d59ecb2SHans Petter Selasky extern struct kobject *mm_kobj;
688d59ecb2SHans Petter Selasky 
698e7baabcSHans Petter Selasky struct attribute {
708e7baabcSHans Petter Selasky 	const char	*name;
718e7baabcSHans Petter Selasky 	struct module	*owner;
728e7baabcSHans Petter Selasky 	mode_t		mode;
738e7baabcSHans Petter Selasky };
748e7baabcSHans Petter Selasky 
7504d42cb4SVladimir Kondratyev extern const struct sysfs_ops kobj_sysfs_ops;
7604d42cb4SVladimir Kondratyev 
778e7baabcSHans Petter Selasky struct kobj_attribute {
788e7baabcSHans Petter Selasky 	struct attribute attr;
798e7baabcSHans Petter Selasky 	ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
808e7baabcSHans Petter Selasky 	    char *buf);
818e7baabcSHans Petter Selasky 	ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
828e7baabcSHans Petter Selasky 	    const char *buf, size_t count);
838e7baabcSHans Petter Selasky };
848e7baabcSHans Petter Selasky 
85fe842818SJean-Sébastien Pédron struct kset_uevent_ops {
86fe842818SJean-Sébastien Pédron 	/* TODO */
87fe842818SJean-Sébastien Pédron };
88fe842818SJean-Sébastien Pédron 
89fe842818SJean-Sébastien Pédron struct kset {
90fe842818SJean-Sébastien Pédron 	struct list_head	list;
91fe842818SJean-Sébastien Pédron 	spinlock_t		list_lock;
92fe842818SJean-Sébastien Pédron 	struct kobject		kobj;
93fe842818SJean-Sébastien Pédron 	const struct kset_uevent_ops *uevent_ops;
94fe842818SJean-Sébastien Pédron };
95fe842818SJean-Sébastien Pédron 
968d59ecb2SHans Petter Selasky static inline void
kobject_init(struct kobject * kobj,const struct kobj_type * ktype)9706204f8eSHans Petter Selasky kobject_init(struct kobject *kobj, const struct kobj_type *ktype)
988d59ecb2SHans Petter Selasky {
998d59ecb2SHans Petter Selasky 
1008d59ecb2SHans Petter Selasky 	kref_init(&kobj->kref);
1018d59ecb2SHans Petter Selasky 	INIT_LIST_HEAD(&kobj->entry);
1028d59ecb2SHans Petter Selasky 	kobj->ktype = ktype;
1038d59ecb2SHans Petter Selasky 	kobj->oidp = NULL;
1048d59ecb2SHans Petter Selasky }
1058d59ecb2SHans Petter Selasky 
10606204f8eSHans Petter Selasky void linux_kobject_release(struct kref *kref);
1078d59ecb2SHans Petter Selasky 
1088d59ecb2SHans Petter Selasky static inline void
kobject_put(struct kobject * kobj)1098d59ecb2SHans Petter Selasky kobject_put(struct kobject *kobj)
1108d59ecb2SHans Petter Selasky {
1118d59ecb2SHans Petter Selasky 
1128d59ecb2SHans Petter Selasky 	if (kobj)
11306204f8eSHans Petter Selasky 		kref_put(&kobj->kref, linux_kobject_release);
1148d59ecb2SHans Petter Selasky }
1158d59ecb2SHans Petter Selasky 
1168d59ecb2SHans Petter Selasky static inline struct kobject *
kobject_get(struct kobject * kobj)1178d59ecb2SHans Petter Selasky kobject_get(struct kobject *kobj)
1188d59ecb2SHans Petter Selasky {
1198d59ecb2SHans Petter Selasky 
1208d59ecb2SHans Petter Selasky 	if (kobj)
1218d59ecb2SHans Petter Selasky 		kref_get(&kobj->kref);
1228d59ecb2SHans Petter Selasky 	return kobj;
1238d59ecb2SHans Petter Selasky }
1248d59ecb2SHans Petter Selasky 
12536929b55SWarner Losh struct kobject *kobject_create(void);
12626019405SHans Petter Selasky int	kobject_set_name_vargs(struct kobject *kobj, const char *fmt, va_list);
1278d59ecb2SHans Petter Selasky int	kobject_add(struct kobject *kobj, struct kobject *parent,
1288d59ecb2SHans Petter Selasky 	    const char *fmt, ...);
1298d59ecb2SHans Petter Selasky 
1308d59ecb2SHans Petter Selasky static inline struct kobject *
kobject_create_and_add(const char * name,struct kobject * parent)1318d59ecb2SHans Petter Selasky kobject_create_and_add(const char *name, struct kobject *parent)
1328d59ecb2SHans Petter Selasky {
1338d59ecb2SHans Petter Selasky 	struct kobject *kobj;
1348d59ecb2SHans Petter Selasky 
1358d59ecb2SHans Petter Selasky 	kobj = kobject_create();
1368d59ecb2SHans Petter Selasky 	if (kobj == NULL)
1378d59ecb2SHans Petter Selasky 		return (NULL);
1388d59ecb2SHans Petter Selasky 	if (kobject_add(kobj, parent, "%s", name) == 0)
1398d59ecb2SHans Petter Selasky 		return (kobj);
1408d59ecb2SHans Petter Selasky 	kobject_put(kobj);
1418d59ecb2SHans Petter Selasky 
1428d59ecb2SHans Petter Selasky 	return (NULL);
1438d59ecb2SHans Petter Selasky }
1448d59ecb2SHans Petter Selasky 
1457e1a02baSMark Johnston static inline void
kobject_del(struct kobject * kobj __unused)1467e1a02baSMark Johnston kobject_del(struct kobject *kobj __unused)
1477e1a02baSMark Johnston {
1487e1a02baSMark Johnston }
1497e1a02baSMark Johnston 
1508d59ecb2SHans Petter Selasky static inline char *
kobject_name(const struct kobject * kobj)1518d59ecb2SHans Petter Selasky kobject_name(const struct kobject *kobj)
1528d59ecb2SHans Petter Selasky {
1538d59ecb2SHans Petter Selasky 
1548d59ecb2SHans Petter Selasky 	return kobj->name;
1558d59ecb2SHans Petter Selasky }
1568d59ecb2SHans Petter Selasky 
1578d59ecb2SHans Petter Selasky int	kobject_set_name(struct kobject *kobj, const char *fmt, ...);
15806204f8eSHans Petter Selasky int	kobject_init_and_add(struct kobject *kobj, const struct kobj_type *ktype,
1598d59ecb2SHans Petter Selasky 	    struct kobject *parent, const char *fmt, ...);
1608d59ecb2SHans Petter Selasky 
1614abbf816SBjoern A. Zeeb static __inline void
kobject_uevent_env(struct kobject * kobj,int action,char * envp[])1624abbf816SBjoern A. Zeeb kobject_uevent_env(struct kobject *kobj, int action, char *envp[])
1634abbf816SBjoern A. Zeeb {
1644abbf816SBjoern A. Zeeb 
1654abbf816SBjoern A. Zeeb 	/*
1664abbf816SBjoern A. Zeeb 	 * iwlwifi(4) sends an INACCESSIBLE event when it detects that the card
1674abbf816SBjoern A. Zeeb 	 * (pice endpoint) is gone and it attempts a removal cleanup.
1684abbf816SBjoern A. Zeeb 	 * Not sure if we do anything related to udev/sysfs at the moment or
1694abbf816SBjoern A. Zeeb 	 * need a shortcut or simply ignore it (for now).
1704abbf816SBjoern A. Zeeb 	 */
1714abbf816SBjoern A. Zeeb }
1724abbf816SBjoern A. Zeeb 
173fe842818SJean-Sébastien Pédron void	kset_init(struct kset *kset);
174fe842818SJean-Sébastien Pédron int	kset_register(struct kset *kset);
175fe842818SJean-Sébastien Pédron void	kset_unregister(struct kset *kset);
176fe842818SJean-Sébastien Pédron struct kset * kset_create_and_add(const char *name,
177fe842818SJean-Sébastien Pédron     const struct kset_uevent_ops *u, struct kobject *parent_kobj);
178fe842818SJean-Sébastien Pédron 
179fe842818SJean-Sébastien Pédron static inline struct kset *
to_kset(struct kobject * kobj)180fe842818SJean-Sébastien Pédron to_kset(struct kobject *kobj)
181fe842818SJean-Sébastien Pédron {
182fe842818SJean-Sébastien Pédron 	if (kobj != NULL)
183fe842818SJean-Sébastien Pédron 		return container_of(kobj, struct kset, kobj);
184fe842818SJean-Sébastien Pédron 	else
185fe842818SJean-Sébastien Pédron 		return NULL;
186fe842818SJean-Sébastien Pédron }
187fe842818SJean-Sébastien Pédron 
188fe842818SJean-Sébastien Pédron static inline struct kset *
kset_get(struct kset * kset)189fe842818SJean-Sébastien Pédron kset_get(struct kset *kset)
190fe842818SJean-Sébastien Pédron {
191fe842818SJean-Sébastien Pédron 	if (kset != NULL) {
192fe842818SJean-Sébastien Pédron 		struct kobject *kobj;
193fe842818SJean-Sébastien Pédron 
194fe842818SJean-Sébastien Pédron 		kobj = kobject_get(&kset->kobj);
195fe842818SJean-Sébastien Pédron 		return to_kset(kobj);
196fe842818SJean-Sébastien Pédron 	} else {
197fe842818SJean-Sébastien Pédron 		return NULL;
198fe842818SJean-Sébastien Pédron 	}
199fe842818SJean-Sébastien Pédron }
200fe842818SJean-Sébastien Pédron 
201fe842818SJean-Sébastien Pédron static inline void
kset_put(struct kset * kset)202fe842818SJean-Sébastien Pédron kset_put(struct kset *kset)
203fe842818SJean-Sébastien Pédron {
204fe842818SJean-Sébastien Pédron 	if (kset != NULL)
205fe842818SJean-Sébastien Pédron 		kobject_put(&kset->kobj);
206fe842818SJean-Sébastien Pédron }
207fe842818SJean-Sébastien Pédron 
20880446fc7SJean-Sébastien Pédron void linux_kobject_kfree_name(struct kobject *kobj);
20980446fc7SJean-Sébastien Pédron 
210307f78f3SVladimir Kondratyev #endif /* _LINUXKPI_LINUX_KOBJECT_H_ */
211