cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

grant-dma-iommu.c (1737B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Stub IOMMU driver which does nothing.
      4 * The main purpose of it being present is to reuse generic IOMMU device tree
      5 * bindings by Xen grant DMA-mapping layer.
      6 *
      7 * Copyright (C) 2022 EPAM Systems Inc.
      8 */
      9
     10#include <linux/iommu.h>
     11#include <linux/of.h>
     12#include <linux/platform_device.h>
     13
     14struct grant_dma_iommu_device {
     15	struct device *dev;
     16	struct iommu_device iommu;
     17};
     18
     19/* Nothing is really needed here */
     20static const struct iommu_ops grant_dma_iommu_ops;
     21
     22static const struct of_device_id grant_dma_iommu_of_match[] = {
     23	{ .compatible = "xen,grant-dma" },
     24	{ },
     25};
     26
     27static int grant_dma_iommu_probe(struct platform_device *pdev)
     28{
     29	struct grant_dma_iommu_device *mmu;
     30	int ret;
     31
     32	mmu = devm_kzalloc(&pdev->dev, sizeof(*mmu), GFP_KERNEL);
     33	if (!mmu)
     34		return -ENOMEM;
     35
     36	mmu->dev = &pdev->dev;
     37
     38	ret = iommu_device_register(&mmu->iommu, &grant_dma_iommu_ops, &pdev->dev);
     39	if (ret)
     40		return ret;
     41
     42	platform_set_drvdata(pdev, mmu);
     43
     44	return 0;
     45}
     46
     47static int grant_dma_iommu_remove(struct platform_device *pdev)
     48{
     49	struct grant_dma_iommu_device *mmu = platform_get_drvdata(pdev);
     50
     51	platform_set_drvdata(pdev, NULL);
     52	iommu_device_unregister(&mmu->iommu);
     53
     54	return 0;
     55}
     56
     57static struct platform_driver grant_dma_iommu_driver = {
     58	.driver = {
     59		.name = "grant-dma-iommu",
     60		.of_match_table = grant_dma_iommu_of_match,
     61	},
     62	.probe = grant_dma_iommu_probe,
     63	.remove = grant_dma_iommu_remove,
     64};
     65
     66static int __init grant_dma_iommu_init(void)
     67{
     68	struct device_node *iommu_np;
     69
     70	iommu_np = of_find_matching_node(NULL, grant_dma_iommu_of_match);
     71	if (!iommu_np)
     72		return 0;
     73
     74	of_node_put(iommu_np);
     75
     76	return platform_driver_register(&grant_dma_iommu_driver);
     77}
     78subsys_initcall(grant_dma_iommu_init);