mtrr.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:33k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*  x86-64 MTRR (Memory Type Range Register) driver.
  2. Based largely upon arch/i386/kernel/mtrr.c
  3. Copyright (C) 1997-2000  Richard Gooch
  4. Copyright (C) 2002 Dave Jones.
  5. This library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Library General Public
  7. License as published by the Free Software Foundation; either
  8. version 2 of the License, or (at your option) any later version.
  9. This library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. Library General Public License for more details.
  13. You should have received a copy of the GNU Library General Public
  14. License along with this library; if not, write to the Free
  15. Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. (For earlier history, see arch/i386/kernel/mtrr.c)
  17. v2.00 September 2001 Dave Jones <davej@suse.de>
  18.   Initial rewrite for x86-64.
  19.   Removal of non-Intel style MTRR code.
  20. v2.01  June 2002  Dave Jones <davej@suse.de>
  21.   Removal of redundant abstraction layer.
  22.   64-bit fixes.
  23. v2.02  July 2002  Dave Jones <davej@suse.de>
  24.   Fix gentry inconsistencies between kernel/userspace.
  25.   More casts to clean up warnings.
  26. */
  27. #include <linux/types.h>
  28. #include <linux/errno.h>
  29. #include <linux/sched.h>
  30. #include <linux/tty.h>
  31. #include <linux/timer.h>
  32. #include <linux/config.h>
  33. #include <linux/kernel.h>
  34. #include <linux/wait.h>
  35. #include <linux/string.h>
  36. #include <linux/slab.h>
  37. #include <linux/ioport.h>
  38. #include <linux/delay.h>
  39. #include <linux/fs.h>
  40. #include <linux/ctype.h>
  41. #include <linux/proc_fs.h>
  42. #include <linux/devfs_fs_kernel.h>
  43. #include <linux/mm.h>
  44. #include <linux/module.h>
  45. #define MTRR_NEED_STRINGS
  46. #include <asm/mtrr.h>
  47. #include <linux/init.h>
  48. #include <linux/smp.h>
  49. #include <linux/smp_lock.h>
  50. #include <linux/agp_backend.h>
  51. #include <asm/uaccess.h>
  52. #include <asm/io.h>
  53. #include <asm/processor.h>
  54. #include <asm/system.h>
  55. #include <asm/pgtable.h>
  56. #include <asm/segment.h>
  57. #include <asm/bitops.h>
  58. #include <asm/atomic.h>
  59. #include <asm/msr.h>
  60. #include <asm/hardirq.h>
  61. #include <linux/irq.h>
  62. #define MTRR_VERSION "2.02 (20020716)"
  63. #undef Dprintk
  64. #define Dprintk(...) 
  65. #define TRUE  1
  66. #define FALSE 0
  67. #define MSR_MTRRphysBase(reg) (0x200 + 2 * (reg))
  68. #define MSR_MTRRphysMask(reg) (0x200 + 2 * (reg) + 1)
  69. #define NUM_FIXED_RANGES 88
  70. #define MTRR_CHANGE_MASK_FIXED 0x01
  71. #define MTRR_CHANGE_MASK_VARIABLE 0x02
  72. #define MTRR_CHANGE_MASK_DEFTYPE 0x04
  73. typedef u8 mtrr_type;
  74. #define LINE_SIZE 80
  75. #ifdef CONFIG_SMP
  76. #define set_mtrr(reg,base,size,type) set_mtrr_smp (reg, base, size, type)
  77. #else
  78. #define set_mtrr(reg,base,size,type) set_mtrr_up (reg, base, size, type, TRUE)
  79. #endif
  80. #if defined(CONFIG_PROC_FS) || defined(CONFIG_DEVFS_FS)
  81. #define USERSPACE_INTERFACE
  82. #endif
  83. #ifdef USERSPACE_INTERFACE
  84. static char *ascii_buffer;
  85. static unsigned int ascii_buf_bytes;
  86. static void compute_ascii (void);
  87. #else
  88. #define compute_ascii() while (0)
  89. #endif
  90. static unsigned int *usage_table;
  91. static DECLARE_MUTEX (mtrr_lock);
  92. struct set_mtrr_context {
  93. u32 deftype_lo;
  94. u32 deftype_hi;
  95. unsigned long flags;
  96. u64 cr4val;
  97. };
  98. /*  Put the processor into a state where MTRRs can be safely set  */
  99. static void set_mtrr_prepare (struct set_mtrr_context *ctxt)
  100. {
  101. u64 cr0;
  102. /* Disable interrupts locally */
  103. __save_flags(ctxt->flags);
  104. __cli();
  105. /* Save value of CR4 and clear Page Global Enable (bit 7) */
  106. if (test_bit(X86_FEATURE_PGE, boot_cpu_data.x86_capability)) {
  107. ctxt->cr4val = read_cr4();
  108. write_cr4(ctxt->cr4val & ~(1UL << 7));
  109. }
  110. /* Disable and flush caches. Note that wbinvd flushes the TLBs as
  111.    a side-effect */
  112. cr0 = read_cr0() | 0x40000000;
  113. wbinvd();
  114. write_cr0(cr0);
  115. wbinvd();
  116. /* Disable MTRRs, and set the default type to uncached */
  117. rdmsr(MSR_MTRRdefType, ctxt->deftype_lo, ctxt->deftype_hi);
  118. wrmsr(MSR_MTRRdefType, ctxt->deftype_lo & 0xf300UL, ctxt->deftype_hi);
  119. }
  120. /* Restore the processor after a set_mtrr_prepare */
  121. static void set_mtrr_done (struct set_mtrr_context *ctxt)
  122. {
  123. /* Flush caches and TLBs */
  124. wbinvd();
  125. /* Restore MTRRdefType */
  126. wrmsr(MSR_MTRRdefType, ctxt->deftype_lo, ctxt->deftype_hi);
  127. /* Enable caches */
  128. write_cr0(read_cr0() & 0xbfffffff);
  129. /* Restore value of CR4 */
  130. if (test_bit(X86_FEATURE_PGE, boot_cpu_data.x86_capability))
  131. write_cr4 (ctxt->cr4val);
  132. /* Re-enable interrupts locally (if enabled previously) */
  133. __restore_flags(ctxt->flags);
  134. }
  135. /*  This function returns the number of variable MTRRs  */
  136. static unsigned int get_num_var_ranges (void)
  137. {
  138. u32 config, dummy;
  139. rdmsr (MSR_MTRRcap, config, dummy);
  140. return (config & 0xff);
  141. }
  142. /*  Returns non-zero if we have the write-combining memory type  */
  143. static int have_wrcomb (void)
  144. {
  145. u32 config, dummy;
  146. rdmsr (MSR_MTRRcap, config, dummy);
  147. return (config & (1 << 10));
  148. }
  149. static u64 size_or_mask, size_and_mask;
  150. static void get_mtrr (unsigned int reg, u64 *base, u32 *size, mtrr_type * type)
  151. {
  152. u32 mask_lo, mask_hi, base_lo, base_hi;
  153. u64 newsize;
  154. rdmsr (MSR_MTRRphysMask(reg), mask_lo, mask_hi);
  155. if ((mask_lo & 0x800) == 0) {
  156. /*  Invalid (i.e. free) range  */
  157. *base = 0;
  158. *size = 0;
  159. *type = 0;
  160. return;
  161. }
  162. rdmsr (MSR_MTRRphysBase(reg), base_lo, base_hi);
  163. /* Work out the shifted address mask. */
  164. newsize = (u64) mask_hi << 32 | (mask_lo & ~0x800);
  165. newsize = ~newsize+1;
  166. *size = (u32) newsize >> PAGE_SHIFT;
  167. *base = base_hi << (32 - PAGE_SHIFT) | base_lo >> PAGE_SHIFT;
  168. *type = base_lo & 0xff;
  169. }
  170. /*
  171.  * Set variable MTRR register on the local CPU.
  172.  *  <reg> The register to set.
  173.  *  <base> The base address of the region.
  174.  *  <size> The size of the region. If this is 0 the region is disabled.
  175.  *  <type> The type of the region.
  176.  *  <do_safe> If TRUE, do the change safely. If FALSE, safety measures should
  177.  *  be done externally.
  178.  */
  179. static void set_mtrr_up (unsigned int reg, u64 base,
  180.    u32 size, mtrr_type type, int do_safe)
  181. {
  182. struct set_mtrr_context ctxt;
  183. u64 base64;
  184. u64 size64;
  185. if (do_safe)
  186. set_mtrr_prepare (&ctxt);
  187. if (size == 0) {
  188. /* The invalid bit is kept in the mask, so we simply clear the
  189.    relevant mask register to disable a range. */
  190. wrmsr (MSR_MTRRphysMask(reg), 0, 0);
  191. } else {
  192. base64 = (base << PAGE_SHIFT) & size_and_mask;
  193. wrmsr (MSR_MTRRphysBase(reg), base64 | type, base64 >> 32);
  194. size64 = ~((size << PAGE_SHIFT) - 1);
  195. size64 = size64 & size_and_mask;
  196. wrmsr (MSR_MTRRphysMask(reg), (u32) (size64 | 0x800), (u32) (size64 >> 32));
  197. }
  198. if (do_safe)
  199. set_mtrr_done (&ctxt);
  200. }
  201. #ifdef CONFIG_SMP
  202. struct mtrr_var_range {
  203. u32 base_lo;
  204. u32 base_hi;
  205. u32 mask_lo;
  206. u32 mask_hi;
  207. };
  208. /*  Get the MSR pair relating to a var range  */
  209. static void __init get_mtrr_var_range (unsigned int index,
  210. struct mtrr_var_range *vr)
  211. {
  212. rdmsr (MSR_MTRRphysBase(index), vr->base_lo, vr->base_hi);
  213. rdmsr (MSR_MTRRphysMask(index), vr->mask_lo, vr->mask_hi);
  214. }
  215. /*  Set the MSR pair relating to a var range. Returns TRUE if
  216.     changes are made  */
  217. static int __init set_mtrr_var_range_testing (unsigned int index,
  218. struct mtrr_var_range *vr)
  219. {
  220. u32 lo, hi;
  221. int changed = FALSE;
  222. rdmsr (MSR_MTRRphysBase(index), lo, hi);
  223. if ((vr->base_lo & 0xfffff0ff) != (lo & 0xfffff0ff) ||
  224. (vr->base_hi & 0x000fffff) != (hi & 0x000fffff)) {
  225. wrmsr (MSR_MTRRphysBase(index), vr->base_lo, vr->base_hi);
  226. changed = TRUE;
  227. }
  228. rdmsr (MSR_MTRRphysMask(index), lo, hi);
  229. if ((vr->mask_lo & 0xfffff800) != (lo & 0xfffff800) ||
  230. (vr->mask_hi & 0x000fffff) != (hi & 0x000fffff)) {
  231. wrmsr (MSR_MTRRphysMask(index), vr->mask_lo, vr->mask_hi);
  232. changed = TRUE;
  233. }
  234. return changed;
  235. }
  236. static void __init get_fixed_ranges (mtrr_type * frs)
  237. {
  238. u32 *p = (u32 *) frs;
  239. int i;
  240. rdmsr (MSR_MTRRfix64K_00000, p[0], p[1]);
  241. for (i = 0; i < 2; i++)
  242. rdmsr (MSR_MTRRfix16K_80000 + i, p[2 + i * 2], p[3 + i * 2]);
  243. for (i = 0; i < 8; i++)
  244. rdmsr (MSR_MTRRfix4K_C0000 + i, p[6 + i * 2], p[7 + i * 2]);
  245. }
  246. static int __init set_fixed_ranges_testing (mtrr_type * frs)
  247. {
  248. u32 *p = (u32 *) frs;
  249. int changed = FALSE;
  250. int i;
  251. u32 lo, hi;
  252. Dprintk (KERN_INFO "mtrr: rdmsr 64K_00000n");
  253. rdmsr (MSR_MTRRfix64K_00000, lo, hi);
  254. if (p[0] != lo || p[1] != hi) {
  255. Dprintk (KERN_INFO "mtrr: Writing %x:%x to 64K MSR. lohi were %x:%xn", p[0], p[1], lo, hi);
  256. wrmsr (MSR_MTRRfix64K_00000, p[0], p[1]);
  257. changed = TRUE;
  258. }
  259. Dprintk (KERN_INFO "mtrr: rdmsr 16K_80000n");
  260. for (i = 0; i < 2; i++) {
  261. rdmsr (MSR_MTRRfix16K_80000 + i, lo, hi);
  262. if (p[2 + i * 2] != lo || p[3 + i * 2] != hi) {
  263. Dprintk (KERN_INFO "mtrr: Writing %x:%x to 16K MSR%d. lohi were %x:%xn", p[2 + i * 2], p[3 + i * 2], i, lo, hi );
  264. wrmsr (MSR_MTRRfix16K_80000 + i, p[2 + i * 2], p[3 + i * 2]);
  265. changed = TRUE;
  266. }
  267. }
  268. Dprintk (KERN_INFO "mtrr: rdmsr 4K_C0000n");
  269. for (i = 0; i < 8; i++) {
  270. rdmsr (MSR_MTRRfix4K_C0000 + i, lo, hi);
  271. Dprintk (KERN_INFO "mtrr: MTRRfix4K_C0000+%d = %x:%xn", i, lo, hi);
  272. if (p[6 + i * 2] != lo || p[7 + i * 2] != hi) {
  273. Dprintk (KERN_INFO "mtrr: Writing %x:%x to 4K MSR%d. lohi were %x:%xn", p[6 + i * 2], p[7 + i * 2], i, lo, hi);
  274. wrmsr (MSR_MTRRfix4K_C0000 + i, p[6 + i * 2], p[7 + i * 2]);
  275. changed = TRUE;
  276. }
  277. }
  278. return changed;
  279. }
  280. struct mtrr_state {
  281. unsigned int num_var_ranges;
  282. struct mtrr_var_range *var_ranges;
  283. mtrr_type fixed_ranges[NUM_FIXED_RANGES];
  284. mtrr_type def_type;
  285. unsigned char enabled;
  286. };
  287. /*  Grab all of the MTRR state for this CPU into *state  */
  288. static void __init get_mtrr_state (struct mtrr_state *state)
  289. {
  290. unsigned int nvrs, i;
  291. struct mtrr_var_range *vrs;
  292. u32 lo, dummy;
  293. nvrs = state->num_var_ranges = get_num_var_ranges();
  294. vrs = state->var_ranges
  295.     = kmalloc (nvrs * sizeof (struct mtrr_var_range), GFP_KERNEL);
  296. if (vrs == NULL)
  297. nvrs = state->num_var_ranges = 0;
  298. for (i = 0; i < nvrs; i++)
  299. get_mtrr_var_range (i, &vrs[i]);
  300. get_fixed_ranges (state->fixed_ranges);
  301. rdmsr (MSR_MTRRdefType, lo, dummy);
  302. state->def_type = (lo & 0xff);
  303. state->enabled = (lo & 0xc00) >> 10;
  304. }
  305. /*  Free resources associated with a struct mtrr_state  */
  306. static void __init finalize_mtrr_state (struct mtrr_state *state)
  307. {
  308. if (state->var_ranges)
  309. kfree (state->var_ranges);
  310. }
  311. /*
  312.  * Set the MTRR state for this CPU.
  313.  *  <state> The MTRR state information to read.
  314.  *  <ctxt> Some relevant CPU context.
  315.  *  [NOTE] The CPU must already be in a safe state for MTRR changes.
  316.  *  [RETURNS] 0 if no changes made, else a mask indication what was changed.
  317.  */
  318. static u64 __init set_mtrr_state (struct mtrr_state *state,
  319. struct set_mtrr_context *ctxt)
  320. {
  321. unsigned int i;
  322. u64 change_mask = 0;
  323. for (i = 0; i < state->num_var_ranges; i++)
  324. if (set_mtrr_var_range_testing (i, &state->var_ranges[i]))
  325. change_mask |= MTRR_CHANGE_MASK_VARIABLE;
  326. if (set_fixed_ranges_testing (state->fixed_ranges))
  327. change_mask |= MTRR_CHANGE_MASK_FIXED;
  328. /* Set_mtrr_restore restores the old value of MTRRdefType,
  329.    so to set it we fiddle with the saved value  */
  330. if ((ctxt->deftype_lo & 0xff) != state->def_type
  331.     || ((ctxt->deftype_lo & 0xc00) >> 10) != state->enabled) {
  332. ctxt->deftype_lo |= (state->def_type | state->enabled << 10);
  333. change_mask |= MTRR_CHANGE_MASK_DEFTYPE;
  334. }
  335. return change_mask;
  336. }
  337. static atomic_t undone_count;
  338. static volatile int wait_barrier_execute = FALSE;
  339. static volatile int wait_barrier_cache_enable = FALSE;
  340. struct set_mtrr_data {
  341. u64 smp_base;
  342. u32 smp_size;
  343. unsigned int smp_reg;
  344. mtrr_type smp_type;
  345. };
  346. /*
  347.  * Synchronisation handler. Executed by "other" CPUs.
  348.  */
  349. static void ipi_handler (void *info)
  350. {
  351. struct set_mtrr_data *data = info;
  352. struct set_mtrr_context ctxt;
  353. set_mtrr_prepare (&ctxt);
  354. /* Notify master that I've flushed and disabled my cache  */
  355. atomic_dec (&undone_count);
  356. while (wait_barrier_execute)
  357. barrier ();
  358. /* The master has cleared me to execute  */
  359. set_mtrr_up (data->smp_reg, data->smp_base, data->smp_size,
  360. data->smp_type, FALSE);
  361. /* Notify master CPU that I've executed the function  */
  362. atomic_dec (&undone_count);
  363. /* Wait for master to clear me to enable cache and return  */
  364. while (wait_barrier_cache_enable)
  365. barrier ();
  366. set_mtrr_done (&ctxt);
  367. }
  368. static void set_mtrr_smp (unsigned int reg, u64 base, u32 size, mtrr_type type)
  369. {
  370. struct set_mtrr_data data;
  371. struct set_mtrr_context ctxt;
  372. data.smp_reg = reg;
  373. data.smp_base = base;
  374. data.smp_size = size;
  375. data.smp_type = type;
  376. wait_barrier_execute = TRUE;
  377. wait_barrier_cache_enable = TRUE;
  378. atomic_set (&undone_count, smp_num_cpus - 1);
  379. /*  Start the ball rolling on other CPUs  */
  380. if (smp_call_function (ipi_handler, &data, 1, 0) != 0)
  381. panic ("mtrr: timed out waiting for other CPUsn");
  382. /* Flush and disable the local CPU's cache */
  383. set_mtrr_prepare (&ctxt);
  384. /*  Wait for all other CPUs to flush and disable their caches  */
  385. while (atomic_read (&undone_count) > 0)
  386. barrier ();
  387. /* Set up for completion wait and then release other CPUs to change MTRRs */
  388. atomic_set (&undone_count, smp_num_cpus - 1);
  389. wait_barrier_execute = FALSE;
  390. set_mtrr_up (reg, base, size, type, FALSE);
  391. /*  Now wait for other CPUs to complete the function  */
  392. while (atomic_read (&undone_count) > 0)
  393. barrier ();
  394. /*  Now all CPUs should have finished the function. Release the barrier to
  395.    allow them to re-enable their caches and return from their interrupt,
  396.    then enable the local cache and return  */
  397. wait_barrier_cache_enable = FALSE;
  398. set_mtrr_done (&ctxt);
  399. }
  400. /*  Some BIOS's are fucked and don't set all MTRRs the same!  */
  401. static void __init mtrr_state_warn (u32 mask)
  402. {
  403. if (!mask)
  404. return;
  405. if (mask & MTRR_CHANGE_MASK_FIXED)
  406. printk (KERN_INFO "mtrr: your CPUs had inconsistent fixed MTRR settingsn");
  407. if (mask & MTRR_CHANGE_MASK_VARIABLE)
  408. printk (KERN_INFO "mtrr: your CPUs had inconsistent variable MTRR settingsn");
  409. if (mask & MTRR_CHANGE_MASK_DEFTYPE)
  410. printk (KERN_INFO "mtrr: your CPUs had inconsistent MTRRdefType settingsn");
  411. printk (KERN_INFO "mtrr: probably your BIOS does not setup all CPUsn");
  412. }
  413. #endif /*  CONFIG_SMP  */
  414. static inline char * attrib_to_str (int x)
  415. {
  416. return (x <= 6) ? mtrr_strings[x] : "?";
  417. }
  418. static void __init init_table (void)
  419. {
  420. int i, max;
  421. max = get_num_var_ranges ();
  422. if ((usage_table = kmalloc (max * sizeof *usage_table, GFP_KERNEL))==NULL) {
  423. printk ("mtrr: could not allocaten");
  424. return;
  425. }
  426. for (i = 0; i < max; i++)
  427. usage_table[i] = 1;
  428. #ifdef USERSPACE_INTERFACE
  429. if ((ascii_buffer = kmalloc (max * LINE_SIZE, GFP_KERNEL)) == NULL) {
  430. printk ("mtrr: could not allocaten");
  431. return;
  432. }
  433. ascii_buf_bytes = 0;
  434. compute_ascii ();
  435. #endif
  436. }
  437. /*
  438.  * Get a free MTRR.
  439.  * returns the index of the region on success, else -1 on error.
  440. */
  441. static int get_free_region(void)
  442. {
  443. int i, max;
  444. mtrr_type ltype;
  445. u64 lbase;
  446. u32 lsize;
  447. max = get_num_var_ranges ();
  448. for (i = 0; i < max; ++i) {
  449. get_mtrr (i, &lbase, &lsize, &ltype);
  450. if (lsize == 0)
  451. return i;
  452. }
  453. return -ENOSPC;
  454. }
  455. /**
  456.  * mtrr_add_page - Add a memory type region
  457.  * @base: Physical base address of region in pages (4 KB)
  458.  * @size: Physical size of region in pages (4 KB)
  459.  * @type: Type of MTRR desired
  460.  * @increment: If this is true do usage counting on the region
  461.  * Returns The MTRR register on success, else a negative number
  462.  * indicating the error code.
  463.  *
  464.  * Memory type region registers control the caching on newer
  465.  * processors. This function allows drivers to request an MTRR is added.
  466.  * The caller should expect to need to provide a power of two size on
  467.  * an equivalent power of two boundary.
  468.  *
  469.  * If the region cannot be added either because all regions are in use
  470.  * or the CPU cannot support it a negative value is returned. On success
  471.  * the register number for this entry is returned, but should be treated
  472.  * as a cookie only.
  473.  *
  474.  * On a multiprocessor machine the changes are made to all processors.
  475.  *
  476.  * The available types are
  477.  *
  478.  * %MTRR_TYPE_UNCACHABLE - No caching
  479.  * %MTRR_TYPE_WRBACK - Write data back in bursts whenever
  480.  * %MTRR_TYPE_WRCOMB - Write data back soon but allow bursts
  481.  * %MTRR_TYPE_WRTHROUGH - Cache reads but not writes
  482.  *
  483.  * BUGS: Needs a quiet flag for the cases where drivers do not mind
  484.  * failures and do not wish system log messages to be sent.
  485.  */
  486. int mtrr_add_page (u64 base, u32 size, unsigned int type, char increment)
  487. {
  488. int i, max;
  489. mtrr_type ltype;
  490. u64 lbase, last;
  491. u32 lsize;
  492. if (base + size < 0x100) {
  493. printk (KERN_WARNING
  494. "mtrr: cannot set region below 1 MiB (0x%Lx000,0x%x000)n",
  495. base, size);
  496. return -EINVAL;
  497. }
  498. #if 0 && defined(__x86_64__) && defined(CONFIG_AGP) 
  499. {
  500. agp_kern_info info; 
  501. if (type != MTRR_TYPE_UNCACHABLE && agp_copy_info(&info) >= 0 && 
  502.     base<<PAGE_SHIFT >= info.aper_base && 
  503.             (base<<PAGE_SHIFT)+(size<<PAGE_SHIFT) >= 
  504. info.aper_base+info.aper_size*1024*1024)
  505. printk(KERN_INFO "%s[%d] setting conflicting mtrr into agp aperturen",current->comm,current->pid); 
  506. }
  507. #endif
  508. /*  Check upper bits of base and last are equal and lower bits are 0
  509.    for base and 1 for last  */
  510. last = base + size - 1;
  511. for (lbase = base; !(lbase & 1) && (last & 1);
  512.      lbase = lbase >> 1, last = last >> 1) ;
  513. if (lbase != last) {
  514. printk (KERN_WARNING
  515. "mtrr: base(0x%Lx000) is not aligned on a size(0x%x000) boundaryn",
  516. base, size);
  517. return -EINVAL;
  518. }
  519. if (type >= MTRR_NUM_TYPES) {
  520. printk ("mtrr: type: %u illegaln", type);
  521. return -EINVAL;
  522. }
  523. /*  If the type is WC, check that this processor supports it  */
  524. if ((type == MTRR_TYPE_WRCOMB) && !have_wrcomb()) {
  525. printk (KERN_WARNING
  526. "mtrr: your processor doesn't support write-combiningn");
  527. return -ENOSYS;
  528. }
  529. if (base & (size_or_mask>>PAGE_SHIFT)) {
  530. printk (KERN_WARNING "mtrr: base(%Lx) exceeds the MTRR width(%Lx)n",
  531. base, (size_or_mask>>PAGE_SHIFT));
  532. return -EINVAL;
  533. }
  534. if (size & (size_or_mask>>PAGE_SHIFT)) {
  535. printk (KERN_WARNING "mtrr: size exceeds the MTRR widthn");
  536. return -EINVAL;
  537. }
  538. increment = increment ? 1 : 0;
  539. max = get_num_var_ranges ();
  540. /*  Search for existing MTRR  */
  541. down (&mtrr_lock);
  542. for (i = 0; i < max; ++i) {
  543. get_mtrr (i, &lbase, &lsize, &ltype);
  544. if (base >= lbase + lsize)
  545. continue;
  546. if ((base < lbase) && (base + size <= lbase))
  547. continue;
  548. /*  At this point we know there is some kind of overlap/enclosure  */
  549. if ((base < lbase) || (base + size > lbase + lsize)) {
  550. up (&mtrr_lock);
  551. printk (KERN_WARNING
  552. "mtrr: 0x%Lx000,0x%x000 overlaps existing"
  553. " 0x%Lx000,0x%x000n", base, size, lbase, lsize);
  554. return -EINVAL;
  555. }
  556. /*  New region is enclosed by an existing region  */
  557. if (ltype != type) {
  558. if (type == MTRR_TYPE_UNCACHABLE)
  559. continue;
  560. up (&mtrr_lock);
  561. printk
  562.     ("mtrr: type mismatch for %Lx000,%x000 old: %s new: %sn",
  563.      base, size,
  564.  attrib_to_str (ltype),
  565.      attrib_to_str (type));
  566. return -EINVAL;
  567. }
  568. if (increment)
  569. ++usage_table[i];
  570. compute_ascii ();
  571. up (&mtrr_lock);
  572. return i;
  573. }
  574. /*  Search for an empty MTRR  */
  575. i = get_free_region();
  576. if (i < 0) {
  577. up (&mtrr_lock);
  578. printk ("mtrr: no more MTRRs availablen");
  579. return i;
  580. }
  581. set_mtrr (i, base, size, type);
  582. usage_table[i] = 1;
  583. compute_ascii ();
  584. up (&mtrr_lock);
  585. return i;
  586. }
  587. /**
  588.  * mtrr_add - Add a memory type region
  589.  * @base: Physical base address of region
  590.  * @size: Physical size of region
  591.  * @type: Type of MTRR desired
  592.  * @increment: If this is true do usage counting on the region
  593.  * Return the MTRR register on success, else a negative numbe
  594.  * indicating the error code.
  595.  *
  596.  * Memory type region registers control the caching on newer processors.
  597.  * This function allows drivers to request an MTRR is added.
  598.  * The caller should expect to need to provide a power of two size on
  599.  * an equivalent power of two boundary.
  600.  *
  601.  * If the region cannot be added either because all regions are in use
  602.  * or the CPU cannot support it a negative value is returned. On success
  603.  * the register number for this entry is returned, but should be treated
  604.  * as a cookie only.
  605.  *
  606.  * On a multiprocessor machine the changes are made to all processors.
  607.  * This is required on x86 by the Intel processors.
  608.  *
  609.  * The available types are
  610.  *
  611.  * %MTRR_TYPE_UNCACHABLE - No caching
  612.  * %MTRR_TYPE_WRBACK - Write data back in bursts whenever
  613.  * %MTRR_TYPE_WRCOMB - Write data back soon but allow bursts
  614.  * %MTRR_TYPE_WRTHROUGH - Cache reads but not writes
  615.  *
  616.  * BUGS: Needs a quiet flag for the cases where drivers do not mind
  617.  * failures and do not wish system log messages to be sent.
  618.  */
  619. int mtrr_add (u64 base, u32 size, unsigned int type, char increment)
  620. {
  621. if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) {
  622. printk ("mtrr: size and base must be multiples of 4 kiBn");
  623. printk ("mtrr: size: 0x%x  base: 0x%Lxn", size, base);
  624. return -EINVAL;
  625. }
  626. return mtrr_add_page (base >> PAGE_SHIFT, size >> PAGE_SHIFT, type,
  627.       increment);
  628. }
  629. /**
  630.  * mtrr_del_page - delete a memory type region
  631.  * @reg: Register returned by mtrr_add
  632.  * @base: Physical base address
  633.  * @size: Size of region
  634.  *
  635.  * If register is supplied then base and size are ignored. This is
  636.  * how drivers should call it.
  637.  *
  638.  * Releases an MTRR region. If the usage count drops to zero the 
  639.  * register is freed and the region returns to default state.
  640.  * On success the register is returned, on failure a negative error
  641.  * code.
  642.  */
  643. int mtrr_del_page (int reg, u64 base, u32 size)
  644. {
  645. int i, max;
  646. mtrr_type ltype;
  647. u64 lbase;
  648. u32 lsize;
  649. max = get_num_var_ranges ();
  650. down (&mtrr_lock);
  651. if (reg < 0) {
  652. /*  Search for existing MTRR  */
  653. for (i = 0; i < max; ++i) {
  654. get_mtrr (i, &lbase, &lsize, &ltype);
  655. if (lbase == base && lsize == size) {
  656. reg = i;
  657. break;
  658. }
  659. }
  660. if (reg < 0) {
  661. up (&mtrr_lock);
  662. printk ("mtrr: no MTRR for %Lx000,%x000 foundn", base, size);
  663. return -EINVAL;
  664. }
  665. }
  666. if (reg >= max) {
  667. up (&mtrr_lock);
  668. printk ("mtrr: register: %d too bign", reg);
  669. return -EINVAL;
  670. }
  671. get_mtrr (reg, &lbase, &lsize, &ltype);
  672. if (lsize < 1) {
  673. up (&mtrr_lock);
  674. printk ("mtrr: MTRR %d not usedn", reg);
  675. return -EINVAL;
  676. }
  677. if (usage_table[reg] < 1) {
  678. up (&mtrr_lock);
  679. printk ("mtrr: reg: %d has count=0n", reg);
  680. return -EINVAL;
  681. }
  682. if (--usage_table[reg] < 1)
  683. set_mtrr (reg, 0, 0, 0);
  684. compute_ascii ();
  685. up (&mtrr_lock);
  686. return reg;
  687. }
  688. /**
  689.  * mtrr_del - delete a memory type region
  690.  * @reg: Register returned by mtrr_add
  691.  * @base: Physical base address
  692.  * @size: Size of region
  693.  *
  694.  * If register is supplied then base and size are ignored. This is
  695.  * how drivers should call it.
  696.  *
  697.  * Releases an MTRR region. If the usage count drops to zero the 
  698.  * register is freed and the region returns to default state.
  699.  * On success the register is returned, on failure a negative error
  700.  * code.
  701.  */
  702. int mtrr_del (int reg, u64 base, u32 size)
  703. {
  704. if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) {
  705. printk ("mtrr: size and base must be multiples of 4 kiBn");
  706. printk ("mtrr: size: 0x%x  base: 0x%Lxn", size, base);
  707. return -EINVAL;
  708. }
  709. return mtrr_del_page (reg, base >> PAGE_SHIFT, size >> PAGE_SHIFT);
  710. }
  711. #ifdef USERSPACE_INTERFACE
  712. static int mtrr_file_add (u64 base, u32 size, unsigned int type,
  713. struct file *file, int page)
  714. {
  715. int reg, max;
  716. unsigned int *fcount = file->private_data;
  717. max = get_num_var_ranges ();
  718. if (fcount == NULL) {
  719. if ((fcount =
  720.      kmalloc (max * sizeof *fcount, GFP_KERNEL)) == NULL) {
  721. printk ("mtrr: could not allocaten");
  722. return -ENOMEM;
  723. }
  724. memset (fcount, 0, max * sizeof *fcount);
  725. file->private_data = fcount;
  726. }
  727. if (!page) {
  728. if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) {
  729. printk
  730.     (KERN_INFO "mtrr: size and base must be multiples of 4 kiBn");
  731. printk (KERN_INFO "mtrr: size: 0x%x  base: 0x%Lxn", size, base);
  732. return -EINVAL;
  733. }
  734. base >>= PAGE_SHIFT;
  735. size >>= PAGE_SHIFT;
  736. }
  737. reg = mtrr_add_page (base, size, type, 1);
  738. if (reg >= 0)
  739. ++fcount[reg];
  740. return reg;
  741. }
  742. static int mtrr_file_del (u64 base, u32 size,
  743. struct file *file, int page)
  744. {
  745. int reg;
  746. unsigned int *fcount = file->private_data;
  747. if (!page) {
  748. if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) {
  749. printk
  750.     (KERN_INFO "mtrr: size and base must be multiples of 4 kiBn");
  751. printk (KERN_INFO "mtrr: size: 0x%x  base: 0x%Lxn", size, base);
  752. return -EINVAL;
  753. }
  754. base >>= PAGE_SHIFT;
  755. size >>= PAGE_SHIFT;
  756. }
  757. reg = mtrr_del_page (-1, base, size);
  758. if (reg < 0)
  759. return reg;
  760. if (fcount == NULL)
  761. return reg;
  762. if (fcount[reg] < 1)
  763. return -EINVAL;
  764. --fcount[reg];
  765. return reg;
  766. }
  767. static ssize_t mtrr_read (struct file *file, char *buf, size_t len,
  768. loff_t * ppos)
  769. {
  770. if (*ppos >= ascii_buf_bytes)
  771. return 0;
  772. if (*ppos + len > ascii_buf_bytes)
  773. len = ascii_buf_bytes - *ppos;
  774. if (copy_to_user (buf, ascii_buffer + *ppos, len))
  775. return -EFAULT;
  776. *ppos += len;
  777. return len;
  778. }
  779. static ssize_t mtrr_write (struct file *file, const char *buf,
  780. size_t len, loff_t * ppos)
  781. /*  Format of control line:
  782.     "base=%Lx size=%Lx type=%s"     OR:
  783.     "disable=%d"
  784. */
  785. {
  786. int i, err, reg;
  787. u64 base;
  788. u32 size;
  789. char *ptr;
  790. char line[LINE_SIZE];
  791. if (!capable(CAP_SYS_ADMIN))
  792. return -EPERM;
  793. /*  Can't seek (pwrite) on this device  */
  794. if (ppos != &file->f_pos)
  795. return -ESPIPE;
  796. memset (line, 0, LINE_SIZE);
  797. if (len > LINE_SIZE)
  798. len = LINE_SIZE;
  799. if (copy_from_user (line, buf, len - 1))
  800. return -EFAULT;
  801. ptr = line + strlen (line) - 1;
  802. if (*ptr == 'n')
  803. *ptr = '';
  804. if (!strncmp (line, "disable=", 8)) {
  805. reg = simple_strtoul (line + 8, &ptr, 0);
  806. err = mtrr_del_page (reg, 0, 0);
  807. if (err < 0)
  808. return err;
  809. return len;
  810. }
  811. if (strncmp (line, "base=", 5)) {
  812. printk (KERN_INFO "mtrr: no "base=" in line: "%s"n", line);
  813. return -EINVAL;
  814. }
  815. base = simple_strtoull (line + 5, &ptr, 0);
  816. for (; isspace (*ptr); ++ptr) ;
  817. if (strncmp (ptr, "size=", 5)) {
  818. printk (KERN_INFO "mtrr: no "size=" in line: "%s"n", line);
  819. return -EINVAL;
  820. }
  821. size = simple_strtoull (ptr + 5, &ptr, 0);
  822. if ((base & 0xfff) || (size & 0xfff)) {
  823. printk (KERN_INFO "mtrr: size and base must be multiples of 4 kiBn");
  824. printk (KERN_INFO "mtrr: size: 0x%x  base: 0x%Lxn", size, base);
  825. return -EINVAL;
  826. }
  827. for (; isspace (*ptr); ++ptr) ;
  828. if (strncmp (ptr, "type=", 5)) {
  829. printk (KERN_INFO "mtrr: no "type=" in line: "%s"n", line);
  830. return -EINVAL;
  831. }
  832. ptr += 5;
  833. for (; isspace (*ptr); ++ptr) ;
  834. for (i = 0; i < MTRR_NUM_TYPES; ++i) {
  835. if (strcmp (ptr, mtrr_strings[i]))
  836. continue;
  837. base >>= PAGE_SHIFT;
  838. size >>= PAGE_SHIFT;
  839. err = mtrr_add_page ((u64) base, size, i, 1);
  840. if (err < 0)
  841. return err;
  842. return len;
  843. }
  844. printk (KERN_INFO "mtrr: illegal type: "%s"n", ptr);
  845. return -EINVAL;
  846. }
  847. static int mtrr_ioctl (struct inode *inode, struct file *file,
  848. unsigned int cmd, unsigned long arg)
  849. {
  850. int err;
  851. mtrr_type type;
  852. struct mtrr_sentry sentry;
  853. struct mtrr_gentry gentry;
  854. switch (cmd) {
  855. default:
  856. return -ENOIOCTLCMD;
  857. case MTRRIOC_ADD_ENTRY:
  858. if (!capable(CAP_SYS_ADMIN))
  859. return -EPERM;
  860. if (copy_from_user (&sentry, (void *) arg, sizeof sentry))
  861. return -EFAULT;
  862. err = mtrr_file_add (sentry.base, sentry.size, sentry.type,
  863.    file, 0);
  864. if (err < 0)
  865. return err;
  866. break;
  867. case MTRRIOC_SET_ENTRY:
  868. if (!capable(CAP_SYS_ADMIN))
  869. return -EPERM;
  870. if (copy_from_user (&sentry, (void *) arg, sizeof sentry))
  871. return -EFAULT;
  872. err = mtrr_add (sentry.base, sentry.size, sentry.type, 0);
  873. if (err < 0)
  874. return err;
  875. break;
  876. case MTRRIOC_DEL_ENTRY:
  877. if (!capable(CAP_SYS_ADMIN))
  878. return -EPERM;
  879. if (copy_from_user (&sentry, (void *) arg, sizeof sentry))
  880. return -EFAULT;
  881. err = mtrr_file_del (sentry.base, sentry.size, file, 0);
  882. if (err < 0)
  883. return err;
  884. break;
  885. case MTRRIOC_KILL_ENTRY:
  886. if (!capable(CAP_SYS_ADMIN))
  887. return -EPERM;
  888. if (copy_from_user (&sentry, (void *) arg, sizeof sentry))
  889. return -EFAULT;
  890. err = mtrr_del (-1, sentry.base, sentry.size);
  891. if (err < 0)
  892. return err;
  893. break;
  894. case MTRRIOC_GET_ENTRY:
  895. if (copy_from_user (&gentry, (void *) arg, sizeof gentry))
  896. return -EFAULT;
  897. if (gentry.regnum >= get_num_var_ranges ())
  898. return -EINVAL;
  899. get_mtrr (gentry.regnum, (u64*) &gentry.base, &gentry.size, &type);
  900. /* Hide entries that go above 4GB */
  901. if (gentry.base + gentry.size > 0x100000
  902.     || gentry.size == 0x100000)
  903. gentry.base = gentry.size = gentry.type = 0;
  904. else {
  905. gentry.base <<= PAGE_SHIFT;
  906. gentry.size <<= PAGE_SHIFT;
  907. gentry.type = type;
  908. }
  909. if (copy_to_user ((void *) arg, &gentry, sizeof gentry))
  910. return -EFAULT;
  911. break;
  912. case MTRRIOC_ADD_PAGE_ENTRY:
  913. if (!capable(CAP_SYS_ADMIN))
  914. return -EPERM;
  915. if (copy_from_user (&sentry, (void *) arg, sizeof sentry))
  916. return -EFAULT;
  917. err = mtrr_file_add (sentry.base, sentry.size, sentry.type, file, 1);
  918. if (err < 0)
  919. return err;
  920. break;
  921. case MTRRIOC_SET_PAGE_ENTRY:
  922. if (!capable(CAP_SYS_ADMIN))
  923. return -EPERM;
  924. if (copy_from_user (&sentry, (void *) arg, sizeof sentry))
  925. return -EFAULT;
  926. err = mtrr_add_page (sentry.base, sentry.size, sentry.type, 0);
  927. if (err < 0)
  928. return err;
  929. break;
  930. case MTRRIOC_DEL_PAGE_ENTRY:
  931. if (!capable(CAP_SYS_ADMIN))
  932. return -EPERM;
  933. if (copy_from_user (&sentry, (void *) arg, sizeof sentry))
  934. return -EFAULT;
  935. err = mtrr_file_del (sentry.base, sentry.size, file, 1);
  936. if (err < 0)
  937. return err;
  938. break;
  939. case MTRRIOC_KILL_PAGE_ENTRY:
  940. if (!capable(CAP_SYS_ADMIN))
  941. return -EPERM;
  942. if (copy_from_user (&sentry, (void *) arg, sizeof sentry))
  943. return -EFAULT;
  944. err = mtrr_del_page (-1, sentry.base, sentry.size);
  945. if (err < 0)
  946. return err;
  947. break;
  948. case MTRRIOC_GET_PAGE_ENTRY:
  949. if (copy_from_user (&gentry, (void *) arg, sizeof gentry))
  950. return -EFAULT;
  951. if (gentry.regnum >= get_num_var_ranges ())
  952. return -EINVAL;
  953. get_mtrr (gentry.regnum, (u64*) &gentry.base, &gentry.size, &type);
  954. gentry.type = type;
  955. if (copy_to_user ((void *) arg, &gentry, sizeof gentry))
  956. return -EFAULT;
  957. break;
  958. }
  959. return 0;
  960. }
  961. static int mtrr_close (struct inode *ino, struct file *file)
  962. {
  963. int i, max;
  964. unsigned int *fcount = file->private_data;
  965. if (fcount == NULL)
  966. return 0;
  967. lock_kernel ();
  968. max = get_num_var_ranges ();
  969. for (i = 0; i < max; ++i) {
  970. while (fcount[i] > 0) {
  971. if (mtrr_del (i, 0, 0) < 0)
  972. printk ("mtrr: reg %d not usedn", i);
  973. --fcount[i];
  974. }
  975. }
  976. unlock_kernel ();
  977. kfree (fcount);
  978. file->private_data = NULL;
  979. return 0;
  980. }
  981. static struct file_operations mtrr_fops = {
  982. owner: THIS_MODULE,
  983. read: mtrr_read,
  984. write: mtrr_write,
  985. ioctl: mtrr_ioctl,
  986. release:mtrr_close,
  987. };
  988. #ifdef CONFIG_PROC_FS
  989. static struct proc_dir_entry *proc_root_mtrr;
  990. #endif
  991. static devfs_handle_t devfs_handle;
  992. static void compute_ascii (void)
  993. {
  994. char factor;
  995. int i, max;
  996. mtrr_type type;
  997. u64 base;
  998. u32 size;
  999. ascii_buf_bytes = 0;
  1000. max = get_num_var_ranges ();
  1001. for (i = 0; i < max; i++) {
  1002. get_mtrr (i, &base, &size, &type);
  1003. if (size == 0)
  1004. usage_table[i] = 0;
  1005. else {
  1006. if (size < (0x100000 >> PAGE_SHIFT)) {
  1007. /* less than 1MB */
  1008. factor = 'K';
  1009. size <<= PAGE_SHIFT - 10;
  1010. } else {
  1011. factor = 'M';
  1012. size >>= 20 - PAGE_SHIFT;
  1013. }
  1014. sprintf (ascii_buffer + ascii_buf_bytes,
  1015. "reg%02i: base=0x%05Lx000 (%4iMB), size=%4i%cB: %s, count=%dn",
  1016. i, base, (u32) base >> (20 - PAGE_SHIFT), size, factor,
  1017. attrib_to_str (type), usage_table[i]);
  1018. ascii_buf_bytes += strlen (ascii_buffer + ascii_buf_bytes);
  1019. }
  1020. }
  1021. devfs_set_file_size (devfs_handle, ascii_buf_bytes);
  1022. #ifdef CONFIG_PROC_FS
  1023. if (proc_root_mtrr)
  1024. proc_root_mtrr->size = ascii_buf_bytes;
  1025. #endif
  1026. }
  1027. #endif /*  USERSPACE_INTERFACE  */
  1028. EXPORT_SYMBOL (mtrr_add);
  1029. EXPORT_SYMBOL (mtrr_del);
  1030. static void __init mtrr_setup (void)
  1031. {
  1032. printk ("mtrr: v%s)n", MTRR_VERSION);
  1033. if (test_bit (X86_FEATURE_MTRR, boot_cpu_data.x86_capability)) {
  1034. /* Query the width (in bits) of the physical
  1035.    addressable memory on the Hammer family. */
  1036. if ((cpuid_eax (0x80000000) >= 0x80000008)) {
  1037. u32 phys_addr;
  1038. phys_addr = cpuid_eax (0x80000008) & 0xff;
  1039. size_or_mask = ~((1L << phys_addr) - 1);
  1040. /*
  1041.  * top bits MBZ as its beyond the addressable range.
  1042.  * bottom bits MBZ as we don't care about lower 12 bits of addr.
  1043.  */
  1044. size_and_mask = (~size_or_mask) & 0x000ffffffffff000L;
  1045. }
  1046. }
  1047. }
  1048. #ifdef CONFIG_SMP
  1049. static volatile u32 smp_changes_mask __initdata = 0;
  1050. static struct mtrr_state smp_mtrr_state __initdata = { 0, 0 };
  1051. void __init mtrr_init_boot_cpu (void)
  1052. {
  1053. mtrr_setup();
  1054. get_mtrr_state (&smp_mtrr_state);
  1055. }
  1056. void __init mtrr_init_secondary_cpu (void)
  1057. {
  1058. u64 mask;
  1059. int count;
  1060. struct set_mtrr_context ctxt;
  1061. /* Note that this is not ideal, since the cache is only flushed/disabled
  1062.    for this CPU while the MTRRs are changed, but changing this requires
  1063.    more invasive changes to the way the kernel boots  */
  1064. set_mtrr_prepare (&ctxt);
  1065. mask = set_mtrr_state (&smp_mtrr_state, &ctxt);
  1066. set_mtrr_done (&ctxt);
  1067. /*  Use the atomic bitops to update the global mask  */
  1068. for (count = 0; count < sizeof mask * 8; ++count) {
  1069. if (mask & 0x01)
  1070. set_bit (count, &smp_changes_mask);
  1071. mask >>= 1;
  1072. }
  1073. }
  1074. #endif /*  CONFIG_SMP  */
  1075. int __init mtrr_init (void)
  1076. {
  1077. #ifdef CONFIG_SMP
  1078. /* mtrr_setup() should already have been called from mtrr_init_boot_cpu() */
  1079. finalize_mtrr_state (&smp_mtrr_state);
  1080. mtrr_state_warn (smp_changes_mask);
  1081. #else
  1082. mtrr_setup();
  1083. #endif
  1084. #ifdef CONFIG_PROC_FS
  1085. proc_root_mtrr = create_proc_entry ("mtrr", S_IWUSR | S_IRUGO, &proc_root);
  1086. if (proc_root_mtrr) {
  1087. proc_root_mtrr->owner = THIS_MODULE;
  1088. proc_root_mtrr->proc_fops = &mtrr_fops;
  1089. }
  1090. #endif
  1091. #ifdef CONFIG_DEVFS_FS
  1092. devfs_handle = devfs_register (NULL, "cpu/mtrr", DEVFS_FL_DEFAULT, 0, 0,
  1093. S_IFREG | S_IRUGO | S_IWUSR,
  1094. &mtrr_fops, NULL);
  1095. #endif
  1096. init_table ();
  1097. return 0;
  1098. }