drm/linux: Implement more kobject parts
authorFrançois Tigeot <ftigeot@wolfpond.org>
Wed, 19 Sep 2018 17:52:15 +0000 (19:52 +0200)
committerFrançois Tigeot <ftigeot@wolfpond.org>
Wed, 19 Sep 2018 17:52:15 +0000 (19:52 +0200)
12 files changed:
sys/conf/files
sys/dev/drm/drm/Makefile
sys/dev/drm/include/linux/cpufreq.h
sys/dev/drm/include/linux/device.h
sys/dev/drm/include/linux/fs.h
sys/dev/drm/include/linux/kobject.h
sys/dev/drm/include/linux/module.h
sys/dev/drm/include/linux/stat.h [copied from sys/dev/drm/include/linux/cpufreq.h with 81% similarity]
sys/dev/drm/include/linux/sysfs.h [copied from sys/dev/drm/include/linux/fs.h with 76% similarity]
sys/dev/drm/include/linux/types.h
sys/dev/drm/include/linux/wait.h
sys/dev/drm/linux_kobject.c [copied from sys/dev/drm/include/linux/cpufreq.h with 68% similarity]

index 20e8c9c..6464cfc 100644 (file)
@@ -2290,6 +2290,7 @@ dev/drm/linux_hrtimer.c                   optional drm compile-with "${NORMAL_C} -include $S/dev
 dev/drm/linux_i2c.c                    optional drm compile-with "${NORMAL_C} -include $S/dev/drm/kconfig.h"
 dev/drm/linux_iomapping.c              optional drm compile-with "${NORMAL_C} -include $S/dev/drm/kconfig.h"
 dev/drm/linux_irq.c                    optional drm compile-with "${NORMAL_C} -include $S/dev/drm/kconfig.h"
+dev/drm/linux_kobject.c                        optional drm compile-with "${NORMAL_C} -include $S/dev/drm/kconfig.h"
 dev/drm/linux_list_sort.c              optional drm compile-with "${NORMAL_C} -include $S/dev/drm/kconfig.h"
 dev/drm/linux_scatterlist.c            optional drm compile-with "${NORMAL_C} -include $S/dev/drm/kconfig.h"
 dev/drm/linux_shmem.c                  optional drm compile-with "${NORMAL_C} -include $S/dev/drm/kconfig.h"
index b25df3d..504f16b 100644 (file)
@@ -54,6 +54,7 @@ SRCS  = \
        linux_hrtimer.c \
        linux_iomapping.c \
        linux_irq.c \
+       linux_kobject.c \
        linux_list_sort.c \
        linux_scatterlist.c \
        linux_shmem.c \
index d5cfa15..70c75e4 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/cpumask.h>
 #include <linux/completion.h>
 #include <linux/kobject.h>
+#include <linux/sysfs.h>
 #include <linux/notifier.h>
 #include <linux/spinlock.h>
 
index 501ed0f..c0775f4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2017 François Tigeot
+ * Copyright (c) 2014-2018 François Tigeot <ftigeot@wolfpond.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -69,4 +69,10 @@ dev_get_drvdata(const struct device *dev)
        return device_get_softc(dev->bsddev);
 }
 
+static inline int
+dev_set_name(struct device *dev, const char *name, ...)
+{
+       return 0;
+}
+
 #endif /* _LINUX_DEVICE_H_ */
index 62a1dc6..9f90111 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <linux/wait.h>
 #include <linux/cache.h>
+#include <linux/stat.h>
 #include <linux/list.h>
 #include <linux/rbtree.h>
 #include <linux/init.h>
index 59f5061..c42c7db 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2017 François Tigeot <ftigeot@wolfpond.org>
+ * Copyright (c) 2016-2018 François Tigeot <ftigeot@wolfpond.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -29,6 +29,7 @@
 
 #include <linux/types.h>
 #include <linux/list.h>
+#include <linux/sysfs.h>
 #include <linux/compiler.h>
 #include <linux/spinlock.h>
 #include <linux/kref.h>
@@ -48,6 +49,14 @@ enum kobject_action {
 
 struct kobject {
        const char *name;
+       struct kref kref;
+       struct kobj_type *ktype;
+};
+
+struct kobj_type {
+       void (*release)(struct kobject *kobj);
+       const struct sysfs_ops *sysfs_ops;
+       struct attribute **default_attrs;
 };
 
 static inline int
@@ -56,4 +65,28 @@ kobject_uevent_env(struct kobject *kobj, enum kobject_action action, char *envp[
        return 0;
 }
 
+extern __printf(4, 5) __must_check
+int kobject_init_and_add(struct kobject *kobj,
+                        struct kobj_type *ktype, struct kobject *parent,
+                        const char *fmt, ...);
+
+extern void kobject_release(struct kref *kref);
+
+static inline void
+kobject_put(struct kobject *kobj)
+{
+       if (kobj != NULL)
+               kref_put(&kobj->kref, kobject_release);
+}
+
+static inline void
+kobject_del(struct kobject *kobj)
+{
+       /*
+          This function is supposed to unlink the object from a hierarchy.
+          There is no such hierarchy in the DragonFly implementation, doing
+          nothing is fine.
+       */
+}
+
 #endif /* _LINUX_KOBJECT_H_ */
index d0301f7..f222b14 100644 (file)
@@ -3,7 +3,7 @@
  * Copyright (c) 2010 iX Systems, Inc.
  * Copyright (c) 2010 Panasas, Inc.
  * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
- * Copyright (c) 2016-2017 François Tigeot <ftigeot@wolfpond.org>
+ * Copyright (c) 2016-2018 François Tigeot <ftigeot@wolfpond.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,6 +31,7 @@
 #define        _LINUX_MODULE_H_
 
 #include <linux/list.h>
+#include <linux/stat.h>
 #include <linux/compiler.h>
 #include <linux/cache.h>
 #include <linux/kmod.h>
@@ -52,5 +53,7 @@
 
 #define module_init(fname)     \
        SYSINIT(fname, SI_SUB_DRIVERS, SI_ORDER_FIRST, fname, NULL);
+#define module_exit(fname)     \
+       SYSUNINIT(fname, SI_SUB_DRIVERS, SI_ORDER_SECOND, fname, NULL);
 
 #endif /* _LINUX_MODULE_H_ */
similarity index 81%
copy from sys/dev/drm/include/linux/cpufreq.h
copy to sys/dev/drm/include/linux/stat.h
index d5cfa15..b8a9e6b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2018 François Tigeot <ftigeot@wolfpond.org>
+ * Copyright (c) 2018 François Tigeot <ftigeot@wolfpond.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef _LINUX_CPUFREQ_H_
-#define _LINUX_CPUFREQ_H_
+#ifndef _LINUX_STAT_H_
+#define _LINUX_STAT_H_
 
-#include <linux/cpumask.h>
-#include <linux/completion.h>
-#include <linux/kobject.h>
-#include <linux/notifier.h>
-#include <linux/spinlock.h>
+#define S_IRUGO                (S_IRUSR|S_IRGRP|S_IROTH)
 
-#endif /* _LINUX_CPUFREQ_H_ */
+#include <linux/types.h>
+#include <linux/time.h>
+
+#endif /* _LINUX_STAT_H_ */
similarity index 76%
copy from sys/dev/drm/include/linux/fs.h
copy to sys/dev/drm/include/linux/sysfs.h
index 62a1dc6..f3e05aa 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2018 François Tigeot <ftigeot@wolfpond.org>
+ * Copyright (c) 2018 François Tigeot <ftigeot@wolfpond.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef _LINUX_FS_H_
-#define _LINUX_FS_H_
+#ifndef _LINUX_SYSFS_H_
+#define _LINUX_SYSFS_H_
 
-#include <linux/wait.h>
-#include <linux/cache.h>
+#include <linux/compiler.h>
+#include <linux/errno.h>
 #include <linux/list.h>
-#include <linux/rbtree.h>
-#include <linux/init.h>
-#include <linux/pid.h>
-#include <linux/bug.h>
-#include <linux/mutex.h>
-#include <linux/capability.h>
-#include <linux/atomic.h>
 #include <linux/lockdep.h>
+#include <linux/atomic.h>
+
+struct kobject;
+
+struct attribute {
+       const char *name;
+       umode_t mode;
+};
 
-#include <sys/file.h>  /* for struct file */
+struct sysfs_ops {
+       ssize_t (*show)(struct kobject *, struct attribute *,char *);
+       ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);
+};
 
-#endif /* _LINUX_FS_H_ */
+#endif /* _LINUX_SYSFS_H_ */
index 83ce971..b3abfb0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2017 François Tigeot
+ * Copyright (c) 2015-2018 François Tigeot <ftigeot@wolfpond.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -43,4 +43,6 @@ typedef uint64_t loff_t;
 typedef _Bool  bool;
 #endif
 
+typedef unsigned short umode_t;
+
 #endif /* _LINUX_TYPES_H_ */
index 09cb5bc..8b766ff 100644 (file)
@@ -151,4 +151,9 @@ add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait)
 {
 }
 
+#define DECLARE_WAIT_QUEUE_HEAD(name)                                  \
+       wait_queue_head_t name = {                                      \
+               .lock = LOCK_INITIALIZER("name", 0, LK_CANRECURSE)      \
+       }
+
 #endif /* _LINUX_WAIT_H_ */
similarity index 68%
copy from sys/dev/drm/include/linux/cpufreq.h
copy to sys/dev/drm/linux_kobject.c
index d5cfa15..591e5ad 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2018 François Tigeot <ftigeot@wolfpond.org>
+ * Copyright (c) 2018 François Tigeot <ftigeot@wolfpond.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef _LINUX_CPUFREQ_H_
-#define _LINUX_CPUFREQ_H_
-
-#include <linux/cpumask.h>
-#include <linux/completion.h>
 #include <linux/kobject.h>
-#include <linux/notifier.h>
-#include <linux/spinlock.h>
 
-#endif /* _LINUX_CPUFREQ_H_ */
+extern char *drm_vasprintf(int flags, const char *format, __va_list ap);
+
+int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,
+                        struct kobject *parent, const char *fmt, ...)
+{
+       va_list ap;
+
+       kobj->ktype = ktype;
+       kref_init(&kobj->kref);
+
+       __va_start(ap, fmt);
+       kobj->name = drm_vasprintf(M_WAITOK, fmt, ap);
+       __va_end(ap);
+
+       return 0;
+}
+
+void kobject_release(struct kref *kref)
+{
+       struct kobject *kobj = container_of(kref, struct kobject, kref);
+
+       if (kobj->ktype && kobj->ktype->release)
+               kobj->ktype->release(kobj);
+}