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