linux/arch/arm/include/asm/domain.h
<<
>>
Prefs
   1/*
   2 *  arch/arm/include/asm/domain.h
   3 *
   4 *  Copyright (C) 1999 Russell King.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10#ifndef __ASM_PROC_DOMAIN_H
  11#define __ASM_PROC_DOMAIN_H
  12
  13/*
  14 * Domain numbers
  15 *
  16 *  DOMAIN_IO     - domain 2 includes all IO only
  17 *  DOMAIN_USER   - domain 1 includes all user memory only
  18 *  DOMAIN_KERNEL - domain 0 includes all kernel memory only
  19 *
  20 * The domain numbering depends on whether we support 36 physical
  21 * address for I/O or not.  Addresses above the 32 bit boundary can
  22 * only be mapped using supersections and supersections can only
  23 * be set for domain 0.  We could just default to DOMAIN_IO as zero,
  24 * but there may be systems with supersection support and no 36-bit
  25 * addressing.  In such cases, we want to map system memory with
  26 * supersections to reduce TLB misses and footprint.
  27 *
  28 * 36-bit addressing and supersections are only available on
  29 * CPUs based on ARMv6+ or the Intel XSC3 core.
  30 */
  31#ifndef CONFIG_IO_36
  32#define DOMAIN_KERNEL   0
  33#define DOMAIN_TABLE    0
  34#define DOMAIN_USER     1
  35#define DOMAIN_IO       2
  36#else
  37#define DOMAIN_KERNEL   2
  38#define DOMAIN_TABLE    2
  39#define DOMAIN_USER     1
  40#define DOMAIN_IO       0
  41#endif
  42
  43/*
  44 * Domain types
  45 */
  46#define DOMAIN_NOACCESS 0
  47#define DOMAIN_CLIENT   1
  48#ifdef CONFIG_CPU_USE_DOMAINS
  49#define DOMAIN_MANAGER  3
  50#else
  51#define DOMAIN_MANAGER  1
  52#endif
  53
  54#define domain_val(dom,type)    ((type) << (2*(dom)))
  55
  56#ifndef __ASSEMBLY__
  57
  58#ifdef CONFIG_CPU_USE_DOMAINS
  59#define set_domain(x)                                   \
  60        do {                                            \
  61        __asm__ __volatile__(                           \
  62        "mcr    p15, 0, %0, c3, c0      @ set domain"   \
  63          : : "r" (x));                                 \
  64        isb();                                          \
  65        } while (0)
  66
  67#define modify_domain(dom,type)                                 \
  68        do {                                                    \
  69        struct thread_info *thread = current_thread_info();     \
  70        unsigned int domain = thread->cpu_domain;               \
  71        domain &= ~domain_val(dom, DOMAIN_MANAGER);             \
  72        thread->cpu_domain = domain | domain_val(dom, type);    \
  73        set_domain(thread->cpu_domain);                         \
  74        } while (0)
  75
  76#else
  77#define set_domain(x)           do { } while (0)
  78#define modify_domain(dom,type) do { } while (0)
  79#endif
  80
  81/*
  82 * Generate the T (user) versions of the LDR/STR and related
  83 * instructions (inline assembly)
  84 */
  85#ifdef CONFIG_CPU_USE_DOMAINS
  86#define T(instr)        #instr "t"
  87#else
  88#define T(instr)        #instr
  89#endif
  90
  91#else /* __ASSEMBLY__ */
  92
  93/*
  94 * Generate the T (user) versions of the LDR/STR and related
  95 * instructions
  96 */
  97#ifdef CONFIG_CPU_USE_DOMAINS
  98#define T(instr)        instr ## t
  99#else
 100#define T(instr)        instr
 101#endif
 102
 103#endif /* __ASSEMBLY__ */
 104
 105#endif /* !__ASM_PROC_DOMAIN_H */
 106