函数源码

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

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;
}