Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  io-pgtable.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Generic page table allocator for IOMMUs.
 *
 * Copyright (C) 2014 ARM Limited
 *
 * Author: Will Deacon <will.deacon@arm.com>
 */


#include <linux/bug.h>
#include <linux/io-pgtable.h>
#include <linux/kernel.h>
#include <linux/types.h>

static const struct io_pgtable_init_fns *
io_pgtable_init_table[IO_PGTABLE_NUM_FMTS] = {
#ifdef CONFIG_IOMMU_IO_PGTABLE_LPAE
 [ARM_32_LPAE_S1] = &io_pgtable_arm_32_lpae_s1_init_fns,
 [ARM_32_LPAE_S2] = &io_pgtable_arm_32_lpae_s2_init_fns,
 [ARM_64_LPAE_S1] = &io_pgtable_arm_64_lpae_s1_init_fns,
 [ARM_64_LPAE_S2] = &io_pgtable_arm_64_lpae_s2_init_fns,
 [ARM_MALI_LPAE] = &io_pgtable_arm_mali_lpae_init_fns,
#endif
#ifdef CONFIG_IOMMU_IO_PGTABLE_DART
 [APPLE_DART] = &io_pgtable_apple_dart_init_fns,
 [APPLE_DART2] = &io_pgtable_apple_dart_init_fns,
#endif
#ifdef CONFIG_IOMMU_IO_PGTABLE_ARMV7S
 [ARM_V7S] = &io_pgtable_arm_v7s_init_fns,
#endif
#ifdef CONFIG_AMD_IOMMU
 [AMD_IOMMU_V1] = &io_pgtable_amd_iommu_v1_init_fns,
 [AMD_IOMMU_V2] = &io_pgtable_amd_iommu_v2_init_fns,
#endif
};

static int check_custom_allocator(enum io_pgtable_fmt fmt,
      struct io_pgtable_cfg *cfg)
{
 /* No custom allocator, no need to check the format. */
 if (!cfg->alloc && !cfg->free)
  return 0;

 /* When passing a custom allocator, both the alloc and free
 * functions should be provided.
 */

 if (!cfg->alloc || !cfg->free)
  return -EINVAL;

 /* Make sure the format supports custom allocators. */
 if (io_pgtable_init_table[fmt]->caps & IO_PGTABLE_CAP_CUSTOM_ALLOCATOR)
  return 0;

 return -EINVAL;
}

struct io_pgtable_ops *alloc_io_pgtable_ops(enum io_pgtable_fmt fmt,
         struct io_pgtable_cfg *cfg,
         void *cookie)
{
 struct io_pgtable *iop;
 const struct io_pgtable_init_fns *fns;

 if (fmt >= IO_PGTABLE_NUM_FMTS)
  return NULL;

 if (check_custom_allocator(fmt, cfg))
  return NULL;

 fns = io_pgtable_init_table[fmt];
 if (!fns)
  return NULL;

 iop = fns->alloc(cfg, cookie);
 if (!iop)
  return NULL;

 iop->fmt = fmt;
 iop->cookie = cookie;
 iop->cfg = *cfg;

 return &iop->ops;
}
EXPORT_SYMBOL_GPL(alloc_io_pgtable_ops);

/*
 * It is the IOMMU driver's responsibility to ensure that the page table
 * is no longer accessible to the walker by this point.
 */

void free_io_pgtable_ops(struct io_pgtable_ops *ops)
{
 struct io_pgtable *iop;

 if (!ops)
  return;

 iop = io_pgtable_ops_to_pgtable(ops);
 io_pgtable_tlb_flush_all(iop);
 io_pgtable_init_table[iop->fmt]->free(iop);
}
EXPORT_SYMBOL_GPL(free_io_pgtable_ops);

Messung V0.5
C=96 H=92 G=93

¤ Dauer der Verarbeitung: 0.3 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge