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