函数源码 |
Source File:arch\x86\kernel\cpu\mtrr\cyrix.c |
Create Date:2022-07-27 09:07:09 |
首页 | Copyright©Brick |
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | /* * cyrix_get_free_region - get a free ARR. * * @base: the starting (base) address of the region. * @size: the size (in bytes) of the region. * * Returns: the index of the region on success, else -1 on error. */ static int cyrix_get_free_region(unsigned long base, unsigned long size, int replace_reg) { unsigned long lbase, lsize; mtrr_type ltype; int i; switch (replace_reg) { case 7: if (size < 0x40) break ; /* Else, fall through */ case 6: case 5: case 4: return replace_reg; case 3: case 2: case 1: case 0: return replace_reg; } /* If we are to set up a region >32M then look at ARR7 immediately */ if (size > 0x2000) { cyrix_get_arr(7, &lbase, &lsize, <ype); if (lsize == 0) return 7; /* Else try ARR0-ARR6 first */ } else { for (i = 0; i < 7; i++) { cyrix_get_arr(i, &lbase, &lsize, <ype); if (lsize == 0) return i; } /* * ARR0-ARR6 isn't free * try ARR7 but its size must be at least 256K */ cyrix_get_arr(i, &lbase, &lsize, <ype); if ((lsize == 0) && (size >= 0x40)) return i; } return -ENOSPC; } |