rocket_device.c 1.4 KB

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