| 99 | } |
| 100 | |
| 101 | static void |
| 102 | k6_mrinit(struct mem_range_softc *sc) |
| 103 | { |
| 104 | u_int64_t reg; |
| 105 | u_int32_t addr, mask, wc, uc; |
| 106 | int d; |
| 107 | |
| 108 | sc->mr_cap = 0; |
| 109 | sc->mr_ndesc = 2; /* XXX (BFF) For now, we only have one msr for this */ |
| 110 | sc->mr_desc = malloc(sc->mr_ndesc * sizeof(struct mem_range_desc), |
| 111 | M_MEMDESC, M_NOWAIT | M_ZERO); |
| 112 | if (sc->mr_desc == NULL) |
| 113 | panic("k6_mrinit: malloc returns NULL"); |
| 114 | |
| 115 | reg = rdmsr(UWCCR); |
| 116 | for (d = 0; d < sc->mr_ndesc; d++) { |
| 117 | u_int32_t one = (reg & (0xffffffff << (32 * d))) >> (32 * d); |
| 118 | |
| 119 | K6_REG_GET(one, addr, mask, wc, uc); |
| 120 | sc->mr_desc[d].mr_base = addr; |
| 121 | sc->mr_desc[d].mr_len = ffs(mask) << 17; |
| 122 | if (wc) |
| 123 | sc->mr_desc[d].mr_flags |= MDF_WRITECOMBINE; |
| 124 | if (uc) |
| 125 | sc->mr_desc[d].mr_flags |= MDF_UNCACHEABLE; |
| 126 | } |
| 127 | |
| 128 | printf("K6-family MTRR support enabled (%d registers)\n", sc->mr_ndesc); |
| 129 | } |
| 130 | |
| 131 | static int |
| 132 | k6_mrset(struct mem_range_softc *sc, struct mem_range_desc *desc, int *arg) |