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