diff options
Diffstat (limited to 'firmware/system.c')
-rw-r--r-- | firmware/system.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/firmware/system.c b/firmware/system.c index 7afa3f720e..da15ee1122 100644 --- a/firmware/system.c +++ b/firmware/system.c | |||
@@ -1191,5 +1191,86 @@ int system_memory_guard(int newmode) | |||
1191 | return 0; | 1191 | return 0; |
1192 | } | 1192 | } |
1193 | 1193 | ||
1194 | #elif CONFIG_CPU==PNX0101 | ||
1195 | |||
1196 | interrupt_handler_t interrupt_vector[0x1d] __attribute__ ((section(".idata"))); | ||
1197 | |||
1198 | #define IRQ_REG(reg) (*(volatile unsigned long *)(0x80300000 + (reg))) | ||
1199 | |||
1200 | static inline unsigned long irq_read(int reg) | ||
1201 | { | ||
1202 | unsigned long v, v2; | ||
1203 | do | ||
1204 | { | ||
1205 | v = IRQ_REG(reg); | ||
1206 | v2 = IRQ_REG(reg); | ||
1207 | } while (v != v2); | ||
1208 | return v; | ||
1209 | } | ||
1210 | |||
1211 | #define IRQ_WRITE_WAIT(reg, val, cond) \ | ||
1212 | do { unsigned long v, v2; \ | ||
1213 | do { \ | ||
1214 | IRQ_REG(reg) = (val); \ | ||
1215 | v = IRQ_REG(reg); \ | ||
1216 | v2 = IRQ_REG(reg); \ | ||
1217 | } while ((v != v2) || !(cond)); \ | ||
1218 | } while (0); | ||
1219 | |||
1220 | static void UIE(void) {} | ||
1221 | |||
1222 | void irq(void) | ||
1223 | { | ||
1224 | int n = irq_read(0x100) >> 3; | ||
1225 | (*(interrupt_vector[n]))(); | ||
1226 | } | ||
1227 | |||
1228 | void irq_enable_int(int n) | ||
1229 | { | ||
1230 | IRQ_WRITE_WAIT(0x404 + n * 4, 0x4010000, v & 0x10000); | ||
1231 | } | ||
1232 | |||
1233 | void irq_set_int_handler(int n, interrupt_handler_t handler) | ||
1234 | { | ||
1235 | interrupt_vector[n + 1] = handler; | ||
1236 | } | ||
1237 | |||
1238 | void system_init(void) | ||
1239 | { | ||
1240 | int i; | ||
1241 | |||
1242 | /* turn off watchdog */ | ||
1243 | (*(volatile unsigned long *)0x80002804) = 0; | ||
1244 | |||
1245 | /* | ||
1246 | IRQ_WRITE_WAIT(0x100, 0, v == 0); | ||
1247 | IRQ_WRITE_WAIT(0x104, 0, v == 0); | ||
1248 | IRQ_WRITE_WAIT(0, 0, v == 0); | ||
1249 | IRQ_WRITE_WAIT(4, 0, v == 0); | ||
1250 | */ | ||
1251 | |||
1252 | for (i = 0; i < 0x1c; i++) | ||
1253 | { | ||
1254 | IRQ_WRITE_WAIT(0x404 + i * 4, 0x1e000001, (v & 0x3010f) == 1); | ||
1255 | IRQ_WRITE_WAIT(0x404 + i * 4, 0x4000000, (v & 0x10000) == 0); | ||
1256 | IRQ_WRITE_WAIT(0x404 + i * 4, 0x10000001, (v & 0xf) == 1); | ||
1257 | interrupt_vector[i + 1] = UIE; | ||
1258 | } | ||
1259 | interrupt_vector[0] = UIE; | ||
1260 | } | ||
1261 | |||
1262 | |||
1263 | void system_reboot(void) | ||
1264 | { | ||
1265 | (*(volatile unsigned long *)0x80002804) = 1; | ||
1266 | while (1); | ||
1267 | } | ||
1268 | |||
1269 | int system_memory_guard(int newmode) | ||
1270 | { | ||
1271 | (void)newmode; | ||
1272 | return 0; | ||
1273 | } | ||
1274 | |||
1194 | #endif /* CONFIG_CPU */ | 1275 | #endif /* CONFIG_CPU */ |
1195 | 1276 | ||