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