| 1163 | } |
| 1164 | |
| 1165 | int |
| 1166 | decode_win_cpu_set(int target, int attr, vm_paddr_t base, uint32_t size, |
| 1167 | vm_paddr_t remap) |
| 1168 | { |
| 1169 | uint32_t br, cr; |
| 1170 | int win, i; |
| 1171 | |
| 1172 | if (remap == ~0) { |
| 1173 | win = soc_decode_win_spec->mv_win_cpu_max - 1; |
| 1174 | i = -1; |
| 1175 | } else { |
| 1176 | win = 0; |
| 1177 | i = 1; |
| 1178 | } |
| 1179 | |
| 1180 | while ((win >= 0) && (win < soc_decode_win_spec->mv_win_cpu_max)) { |
| 1181 | cr = win_cpu_cr_read(win); |
| 1182 | if ((cr & MV_WIN_CPU_ENABLE_BIT) == 0) |
| 1183 | break; |
| 1184 | if ((cr & ((0xff << MV_WIN_CPU_ATTR_SHIFT) | |
| 1185 | (0x1f << MV_WIN_CPU_TARGET_SHIFT))) == |
| 1186 | ((attr << MV_WIN_CPU_ATTR_SHIFT) | |
| 1187 | (target << MV_WIN_CPU_TARGET_SHIFT))) |
| 1188 | break; |
| 1189 | win += i; |
| 1190 | } |
| 1191 | if ((win < 0) || (win >= soc_decode_win_spec->mv_win_cpu_max) || |
| 1192 | ((remap != ~0) && (win_cpu_can_remap(win) == 0))) |
| 1193 | return (-1); |
| 1194 | |
| 1195 | br = base & 0xffff0000; |
| 1196 | win_cpu_br_write(win, br); |
| 1197 | |
| 1198 | if (win_cpu_can_remap(win)) { |
| 1199 | if (remap != ~0) { |
| 1200 | win_cpu_remap_l_write(win, remap & 0xffff0000); |
| 1201 | win_cpu_remap_h_write(win, 0); |
| 1202 | } else { |
| 1203 | /* |
| 1204 | * Remap function is not used for a given window |
| 1205 | * (capable of remapping) - set remap field with the |
| 1206 | * same value as base. |
| 1207 | */ |
| 1208 | win_cpu_remap_l_write(win, base & 0xffff0000); |
| 1209 | win_cpu_remap_h_write(win, 0); |
| 1210 | } |
| 1211 | } |
| 1212 | |
| 1213 | cr = ((size - 1) & 0xffff0000) | (attr << MV_WIN_CPU_ATTR_SHIFT) | |
| 1214 | (target << MV_WIN_CPU_TARGET_SHIFT) | MV_WIN_CPU_ENABLE_BIT; |
| 1215 | win_cpu_cr_write(win, cr); |
| 1216 | |
| 1217 | return (0); |
| 1218 | } |
| 1219 | |
| 1220 | static void |
| 1221 | decode_win_cpu_setup(void) |
no test coverage detected