xref: /linux/drivers/accel/rocket/rocket_device.c (revision 58809f614e0e3f4e12b489bddf680bfeb31c0a20)
1ed98261bSTomeu Vizoso // SPDX-License-Identifier: GPL-2.0-only
2ed98261bSTomeu Vizoso /* Copyright 2024-2025 Tomeu Vizoso <tomeu@tomeuvizoso.net> */
3ed98261bSTomeu Vizoso 
4ed98261bSTomeu Vizoso #include <drm/drm_drv.h>
5ed98261bSTomeu Vizoso #include <linux/array_size.h>
6ed98261bSTomeu Vizoso #include <linux/clk.h>
7ed98261bSTomeu Vizoso #include <linux/dma-mapping.h>
8ed98261bSTomeu Vizoso #include <linux/platform_device.h>
9ed98261bSTomeu Vizoso #include <linux/of.h>
10ed98261bSTomeu Vizoso 
11ed98261bSTomeu Vizoso #include "rocket_device.h"
12ed98261bSTomeu Vizoso 
13ed98261bSTomeu Vizoso struct rocket_device *rocket_device_init(struct platform_device *pdev,
14ed98261bSTomeu Vizoso 					 const struct drm_driver *rocket_drm_driver)
15ed98261bSTomeu Vizoso {
16ed98261bSTomeu Vizoso 	struct device *dev = &pdev->dev;
17ed98261bSTomeu Vizoso 	struct device_node *core_node;
18ed98261bSTomeu Vizoso 	struct rocket_device *rdev;
19ed98261bSTomeu Vizoso 	struct drm_device *ddev;
20ed98261bSTomeu Vizoso 	unsigned int num_cores = 0;
21ed98261bSTomeu Vizoso 	int err;
22ed98261bSTomeu Vizoso 
23ed98261bSTomeu Vizoso 	rdev = devm_drm_dev_alloc(dev, rocket_drm_driver, struct rocket_device, ddev);
24ed98261bSTomeu Vizoso 	if (IS_ERR(rdev))
25ed98261bSTomeu Vizoso 		return rdev;
26ed98261bSTomeu Vizoso 
27ed98261bSTomeu Vizoso 	ddev = &rdev->ddev;
28ed98261bSTomeu Vizoso 	dev_set_drvdata(dev, rdev);
29ed98261bSTomeu Vizoso 
30ed98261bSTomeu Vizoso 	for_each_compatible_node(core_node, NULL, "rockchip,rk3588-rknn-core")
31ed98261bSTomeu Vizoso 		if (of_device_is_available(core_node))
32ed98261bSTomeu Vizoso 			num_cores++;
33ed98261bSTomeu Vizoso 
34ed98261bSTomeu Vizoso 	rdev->cores = devm_kcalloc(dev, num_cores, sizeof(*rdev->cores), GFP_KERNEL);
35ed98261bSTomeu Vizoso 	if (!rdev->cores)
36ed98261bSTomeu Vizoso 		return ERR_PTR(-ENOMEM);
37ed98261bSTomeu Vizoso 
38ed98261bSTomeu Vizoso 	dma_set_max_seg_size(dev, UINT_MAX);
39ed98261bSTomeu Vizoso 
40ed98261bSTomeu Vizoso 	err = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(40));
41ed98261bSTomeu Vizoso 	if (err)
42ed98261bSTomeu Vizoso 		return ERR_PTR(err);
43ed98261bSTomeu Vizoso 
44*0810d5adSTomeu Vizoso 	err = devm_mutex_init(dev, &rdev->sched_lock);
45*0810d5adSTomeu Vizoso 	if (err)
46*0810d5adSTomeu Vizoso 		return ERR_PTR(-ENOMEM);
47*0810d5adSTomeu Vizoso 
48ed98261bSTomeu Vizoso 	err = drm_dev_register(ddev, 0);
49ed98261bSTomeu Vizoso 	if (err)
50ed98261bSTomeu Vizoso 		return ERR_PTR(err);
51ed98261bSTomeu Vizoso 
52ed98261bSTomeu Vizoso 	return rdev;
53ed98261bSTomeu Vizoso }
54ed98261bSTomeu Vizoso 
55ed98261bSTomeu Vizoso void rocket_device_fini(struct rocket_device *rdev)
56ed98261bSTomeu Vizoso {
57ed98261bSTomeu Vizoso 	WARN_ON(rdev->num_cores > 0);
58ed98261bSTomeu Vizoso 
59ed98261bSTomeu Vizoso 	drm_dev_unregister(&rdev->ddev);
60ed98261bSTomeu Vizoso }
61