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

io-pgtable.c (1809B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Generic page table allocator for IOMMUs.
      4 *
      5 * Copyright (C) 2014 ARM Limited
      6 *
      7 * Author: Will Deacon <will.deacon@arm.com>
      8 */
      9
     10#include <linux/bug.h>
     11#include <linux/io-pgtable.h>
     12#include <linux/kernel.h>
     13#include <linux/types.h>
     14
     15static const struct io_pgtable_init_fns *
     16io_pgtable_init_table[IO_PGTABLE_NUM_FMTS] = {
     17#ifdef CONFIG_IOMMU_IO_PGTABLE_LPAE
     18	[ARM_32_LPAE_S1] = &io_pgtable_arm_32_lpae_s1_init_fns,
     19	[ARM_32_LPAE_S2] = &io_pgtable_arm_32_lpae_s2_init_fns,
     20	[ARM_64_LPAE_S1] = &io_pgtable_arm_64_lpae_s1_init_fns,
     21	[ARM_64_LPAE_S2] = &io_pgtable_arm_64_lpae_s2_init_fns,
     22	[ARM_MALI_LPAE] = &io_pgtable_arm_mali_lpae_init_fns,
     23	[APPLE_DART] = &io_pgtable_apple_dart_init_fns,
     24#endif
     25#ifdef CONFIG_IOMMU_IO_PGTABLE_ARMV7S
     26	[ARM_V7S] = &io_pgtable_arm_v7s_init_fns,
     27#endif
     28#ifdef CONFIG_AMD_IOMMU
     29	[AMD_IOMMU_V1] = &io_pgtable_amd_iommu_v1_init_fns,
     30#endif
     31};
     32
     33struct io_pgtable_ops *alloc_io_pgtable_ops(enum io_pgtable_fmt fmt,
     34					    struct io_pgtable_cfg *cfg,
     35					    void *cookie)
     36{
     37	struct io_pgtable *iop;
     38	const struct io_pgtable_init_fns *fns;
     39
     40	if (fmt >= IO_PGTABLE_NUM_FMTS)
     41		return NULL;
     42
     43	fns = io_pgtable_init_table[fmt];
     44	if (!fns)
     45		return NULL;
     46
     47	iop = fns->alloc(cfg, cookie);
     48	if (!iop)
     49		return NULL;
     50
     51	iop->fmt	= fmt;
     52	iop->cookie	= cookie;
     53	iop->cfg	= *cfg;
     54
     55	return &iop->ops;
     56}
     57EXPORT_SYMBOL_GPL(alloc_io_pgtable_ops);
     58
     59/*
     60 * It is the IOMMU driver's responsibility to ensure that the page table
     61 * is no longer accessible to the walker by this point.
     62 */
     63void free_io_pgtable_ops(struct io_pgtable_ops *ops)
     64{
     65	struct io_pgtable *iop;
     66
     67	if (!ops)
     68		return;
     69
     70	iop = io_pgtable_ops_to_pgtable(ops);
     71	io_pgtable_tlb_flush_all(iop);
     72	io_pgtable_init_table[iop->fmt]->free(iop);
     73}
     74EXPORT_SYMBOL_GPL(free_io_pgtable_ops);