Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * MDEV driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *     Author: Neo Jia <cjia@nvidia.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *             Kirti Wankhede <kwankhede@nvidia.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/iommu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/mdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include "mdev_private.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) static int mdev_attach_iommu(struct mdev_device *mdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	struct iommu_group *group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 	group = iommu_group_alloc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	if (IS_ERR(group))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 		return PTR_ERR(group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	ret = iommu_group_add_device(group, &mdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 		dev_info(&mdev->dev, "MDEV: group_id = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 			 iommu_group_id(group));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	iommu_group_put(group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) static void mdev_detach_iommu(struct mdev_device *mdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	iommu_group_remove_device(&mdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	dev_info(&mdev->dev, "MDEV: detaching iommu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) static int mdev_probe(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	struct mdev_driver *drv = to_mdev_driver(dev->driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	struct mdev_device *mdev = to_mdev_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	ret = mdev_attach_iommu(mdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	if (drv && drv->probe) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 		ret = drv->probe(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 			mdev_detach_iommu(mdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) static int mdev_remove(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	struct mdev_driver *drv = to_mdev_driver(dev->driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	struct mdev_device *mdev = to_mdev_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	if (drv && drv->remove)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 		drv->remove(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	mdev_detach_iommu(mdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) struct bus_type mdev_bus_type = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	.name		= "mdev",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	.probe		= mdev_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	.remove		= mdev_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) EXPORT_SYMBOL_GPL(mdev_bus_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80)  * mdev_register_driver - register a new MDEV driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81)  * @drv: the driver to register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82)  * @owner: module owner of driver to be registered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84)  * Returns a negative value on error, otherwise 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85)  **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) int mdev_register_driver(struct mdev_driver *drv, struct module *owner)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	/* initialize common driver fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	drv->driver.name = drv->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	drv->driver.bus = &mdev_bus_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	drv->driver.owner = owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	/* register with core */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	return driver_register(&drv->driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) EXPORT_SYMBOL(mdev_register_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99)  * mdev_unregister_driver - unregister MDEV driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)  * @drv: the driver to unregister
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) void mdev_unregister_driver(struct mdev_driver *drv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	driver_unregister(&drv->driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) EXPORT_SYMBOL(mdev_unregister_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) int mdev_bus_register(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	return bus_register(&mdev_bus_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) void mdev_bus_unregister(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	bus_unregister(&mdev_bus_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) }