1 // SPDX-License-Identifier: GPL-2.0
2 
3 #include <drm/drm_drv.h>
4 #include <drm/drm_managed.h>
5 
6 #include <kunit/resource.h>
7 
8 #include <linux/device.h>
9 
10 #include "drm_kunit_helpers.h"
11 
12 struct kunit_dev {
13 	struct drm_device base;
14 };
15 
16 static const struct drm_mode_config_funcs drm_mode_config_funcs = {
17 };
18 
19 static int dev_init(struct kunit_resource *res, void *ptr)
20 {
21 	char *name = ptr;
22 	struct device *dev;
23 
24 	dev = root_device_register(name);
25 	if (IS_ERR(dev))
26 		return PTR_ERR(dev);
27 
28 	res->data = dev;
29 	return 0;
30 }
31 
32 static void dev_free(struct kunit_resource *res)
33 {
34 	struct device *dev = res->data;
35 
36 	root_device_unregister(dev);
37 }
38 
39 struct drm_device *drm_kunit_device_init(struct kunit *test, u32 features, char *name)
40 {
41 	struct kunit_dev *kdev;
42 	struct drm_device *drm;
43 	struct drm_driver *driver;
44 	struct device *dev;
45 	int ret;
46 
47 	dev = kunit_alloc_resource(test, dev_init, dev_free, GFP_KERNEL, name);
48 	if (!dev)
49 		return ERR_PTR(-ENOMEM);
50 
51 	driver = kunit_kzalloc(test, sizeof(*driver), GFP_KERNEL);
52 	if (!driver)
53 		return ERR_PTR(-ENOMEM);
54 
55 	driver->driver_features = features;
56 	kdev = devm_drm_dev_alloc(dev, driver, struct kunit_dev, base);
57 	if (IS_ERR(kdev))
58 		return ERR_CAST(kdev);
59 
60 	drm = &kdev->base;
61 	drm->mode_config.funcs = &drm_mode_config_funcs;
62 
63 	ret = drmm_mode_config_init(drm);
64 	if (ret)
65 		return ERR_PTR(ret);
66 
67 	return drm;
68 }
69 
70 MODULE_AUTHOR("Maxime Ripard <maxime@cerno.tech>");
71 MODULE_LICENSE("GPL");
72