linux/arch/csky/mm/context.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
   3
   4#include <linux/bitops.h>
   5#include <linux/sched.h>
   6#include <linux/slab.h>
   7#include <linux/mm.h>
   8
   9#include <asm/asid.h>
  10#include <asm/mmu_context.h>
  11#include <asm/smp.h>
  12#include <asm/tlbflush.h>
  13
  14static DEFINE_PER_CPU(atomic64_t, active_asids);
  15static DEFINE_PER_CPU(u64, reserved_asids);
  16
  17struct asid_info asid_info;
  18
  19void check_and_switch_context(struct mm_struct *mm, unsigned int cpu)
  20{
  21        asid_check_context(&asid_info, &mm->context.asid, cpu, mm);
  22}
  23
  24static void asid_flush_cpu_ctxt(void)
  25{
  26        local_tlb_invalid_all();
  27}
  28
  29static int asids_init(void)
  30{
  31        BUG_ON(((1 << CONFIG_CPU_ASID_BITS) - 1) <= num_possible_cpus());
  32
  33        if (asid_allocator_init(&asid_info, CONFIG_CPU_ASID_BITS, 1,
  34                                asid_flush_cpu_ctxt))
  35                panic("Unable to initialize ASID allocator for %lu ASIDs\n",
  36                      NUM_ASIDS(&asid_info));
  37
  38        asid_info.active = &active_asids;
  39        asid_info.reserved = &reserved_asids;
  40
  41        pr_info("ASID allocator initialised with %lu entries\n",
  42                NUM_CTXT_ASIDS(&asid_info));
  43
  44        return 0;
  45}
  46early_initcall(asids_init);
  47