Commit bfa30a38968c204725a007e6cf845178231d3645
1 parent
d6c1a327
Change sysctrl register to 32 bits (original patch by Robert Reif)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3533 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
76 additions
and
20 deletions
hw/slavio_misc.c
| ... | ... | @@ -44,10 +44,13 @@ typedef struct MiscState { |
| 44 | 44 | qemu_irq irq; |
| 45 | 45 | uint8_t config; |
| 46 | 46 | uint8_t aux1, aux2; |
| 47 | - uint8_t diag, mctrl, sysctrl; | |
| 47 | + uint8_t diag, mctrl; | |
| 48 | + uint32_t sysctrl; | |
| 48 | 49 | } MiscState; |
| 49 | 50 | |
| 50 | 51 | #define MISC_SIZE 1 |
| 52 | +#define SYSCTRL_MAXADDR 3 | |
| 53 | +#define SYSCTRL_SIZE (SYSCTRL_MAXADDR + 1) | |
| 51 | 54 | |
| 52 | 55 | static void slavio_misc_update_irq(void *opaque) |
| 53 | 56 | { |
| ... | ... | @@ -83,7 +86,8 @@ void slavio_set_power_fail(void *opaque, int power_failing) |
| 83 | 86 | slavio_misc_update_irq(s); |
| 84 | 87 | } |
| 85 | 88 | |
| 86 | -static void slavio_misc_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) | |
| 89 | +static void slavio_misc_mem_writeb(void *opaque, target_phys_addr_t addr, | |
| 90 | + uint32_t val) | |
| 87 | 91 | { |
| 88 | 92 | MiscState *s = opaque; |
| 89 | 93 | |
| ... | ... | @@ -116,13 +120,6 @@ static void slavio_misc_mem_writeb(void *opaque, target_phys_addr_t addr, uint32 |
| 116 | 120 | MISC_DPRINTF("Write modem control %2.2x\n", val & 0xff); |
| 117 | 121 | s->mctrl = val & 0xff; |
| 118 | 122 | break; |
| 119 | - case 0x1f00000: | |
| 120 | - MISC_DPRINTF("Write system control %2.2x\n", val & 0xff); | |
| 121 | - if (val & 1) { | |
| 122 | - s->sysctrl = 0x2; | |
| 123 | - qemu_system_reset_request(); | |
| 124 | - } | |
| 125 | - break; | |
| 126 | 123 | case 0xa000000: |
| 127 | 124 | MISC_DPRINTF("Write power management %2.2x\n", val & 0xff); |
| 128 | 125 | cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HALT); |
| ... | ... | @@ -156,10 +153,6 @@ static uint32_t slavio_misc_mem_readb(void *opaque, target_phys_addr_t addr) |
| 156 | 153 | ret = s->mctrl; |
| 157 | 154 | MISC_DPRINTF("Read modem control %2.2x\n", ret); |
| 158 | 155 | break; |
| 159 | - case 0x1f00000: | |
| 160 | - MISC_DPRINTF("Read system control %2.2x\n", ret); | |
| 161 | - ret = s->sysctrl; | |
| 162 | - break; | |
| 163 | 156 | case 0xa000000: |
| 164 | 157 | MISC_DPRINTF("Read power management %2.2x\n", ret); |
| 165 | 158 | break; |
| ... | ... | @@ -179,10 +172,62 @@ static CPUWriteMemoryFunc *slavio_misc_mem_write[3] = { |
| 179 | 172 | slavio_misc_mem_writeb, |
| 180 | 173 | }; |
| 181 | 174 | |
| 175 | +static uint32_t slavio_sysctrl_mem_readl(void *opaque, target_phys_addr_t addr) | |
| 176 | +{ | |
| 177 | + MiscState *s = opaque; | |
| 178 | + uint32_t ret = 0, saddr; | |
| 179 | + | |
| 180 | + saddr = addr & SYSCTRL_MAXADDR; | |
| 181 | + switch (saddr) { | |
| 182 | + case 0: | |
| 183 | + ret = s->sysctrl; | |
| 184 | + break; | |
| 185 | + default: | |
| 186 | + break; | |
| 187 | + } | |
| 188 | + MISC_DPRINTF("Read system control reg 0x" TARGET_FMT_plx " = %x\n", addr, | |
| 189 | + ret); | |
| 190 | + return ret; | |
| 191 | +} | |
| 192 | + | |
| 193 | +static void slavio_sysctrl_mem_writel(void *opaque, target_phys_addr_t addr, | |
| 194 | + uint32_t val) | |
| 195 | +{ | |
| 196 | + MiscState *s = opaque; | |
| 197 | + uint32_t saddr; | |
| 198 | + | |
| 199 | + saddr = addr & SYSCTRL_MAXADDR; | |
| 200 | + MISC_DPRINTF("Write system control reg 0x" TARGET_FMT_plx " = %x\n", addr, | |
| 201 | + val); | |
| 202 | + switch (saddr) { | |
| 203 | + case 0: | |
| 204 | + if (val & 1) { | |
| 205 | + s->sysctrl = 0x2; | |
| 206 | + qemu_system_reset_request(); | |
| 207 | + } | |
| 208 | + break; | |
| 209 | + default: | |
| 210 | + break; | |
| 211 | + } | |
| 212 | +} | |
| 213 | + | |
| 214 | +static CPUReadMemoryFunc *slavio_sysctrl_mem_read[3] = { | |
| 215 | + slavio_sysctrl_mem_readl, | |
| 216 | + slavio_sysctrl_mem_readl, | |
| 217 | + slavio_sysctrl_mem_readl, | |
| 218 | +}; | |
| 219 | + | |
| 220 | +static CPUWriteMemoryFunc *slavio_sysctrl_mem_write[3] = { | |
| 221 | + slavio_sysctrl_mem_writel, | |
| 222 | + slavio_sysctrl_mem_writel, | |
| 223 | + slavio_sysctrl_mem_writel, | |
| 224 | +}; | |
| 225 | + | |
| 182 | 226 | static void slavio_misc_save(QEMUFile *f, void *opaque) |
| 183 | 227 | { |
| 184 | 228 | MiscState *s = opaque; |
| 185 | 229 | int tmp; |
| 230 | + uint8_t tmp8; | |
| 186 | 231 | |
| 187 | 232 | tmp = 0; |
| 188 | 233 | qemu_put_be32s(f, &tmp); /* ignored, was IRQ. */ |
| ... | ... | @@ -191,13 +236,15 @@ static void slavio_misc_save(QEMUFile *f, void *opaque) |
| 191 | 236 | qemu_put_8s(f, &s->aux2); |
| 192 | 237 | qemu_put_8s(f, &s->diag); |
| 193 | 238 | qemu_put_8s(f, &s->mctrl); |
| 194 | - qemu_put_8s(f, &s->sysctrl); | |
| 239 | + tmp8 = s->sysctrl & 0xff; | |
| 240 | + qemu_put_8s(f, &tmp8); | |
| 195 | 241 | } |
| 196 | 242 | |
| 197 | 243 | static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id) |
| 198 | 244 | { |
| 199 | 245 | MiscState *s = opaque; |
| 200 | 246 | int tmp; |
| 247 | + uint8_t tmp8; | |
| 201 | 248 | |
| 202 | 249 | if (version_id != 1) |
| 203 | 250 | return -EINVAL; |
| ... | ... | @@ -208,7 +255,8 @@ static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id) |
| 208 | 255 | qemu_get_8s(f, &s->aux2); |
| 209 | 256 | qemu_get_8s(f, &s->diag); |
| 210 | 257 | qemu_get_8s(f, &s->mctrl); |
| 211 | - qemu_get_8s(f, &s->sysctrl); | |
| 258 | + qemu_get_8s(f, &tmp8); | |
| 259 | + s->sysctrl = (uint32_t)tmp8; | |
| 212 | 260 | return 0; |
| 213 | 261 | } |
| 214 | 262 | |
| ... | ... | @@ -222,7 +270,9 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, |
| 222 | 270 | if (!s) |
| 223 | 271 | return NULL; |
| 224 | 272 | |
| 225 | - slavio_misc_io_memory = cpu_register_io_memory(0, slavio_misc_mem_read, slavio_misc_mem_write, s); | |
| 273 | + /* 8 bit registers */ | |
| 274 | + slavio_misc_io_memory = cpu_register_io_memory(0, slavio_misc_mem_read, | |
| 275 | + slavio_misc_mem_write, s); | |
| 226 | 276 | // Slavio control |
| 227 | 277 | cpu_register_physical_memory(base + 0x1800000, MISC_SIZE, |
| 228 | 278 | slavio_misc_io_memory); |
| ... | ... | @@ -238,15 +288,21 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, |
| 238 | 288 | // Modem control |
| 239 | 289 | cpu_register_physical_memory(base + 0x1b00000, MISC_SIZE, |
| 240 | 290 | slavio_misc_io_memory); |
| 241 | - // System control | |
| 242 | - cpu_register_physical_memory(base + 0x1f00000, MISC_SIZE, | |
| 243 | - slavio_misc_io_memory); | |
| 244 | 291 | // Power management |
| 245 | 292 | cpu_register_physical_memory(power_base, MISC_SIZE, slavio_misc_io_memory); |
| 246 | 293 | |
| 294 | + /* 32 bit registers */ | |
| 295 | + slavio_misc_io_memory = cpu_register_io_memory(0, slavio_sysctrl_mem_read, | |
| 296 | + slavio_sysctrl_mem_write, | |
| 297 | + s); | |
| 298 | + // System control | |
| 299 | + cpu_register_physical_memory(base + 0x1f00000, SYSCTRL_SIZE, | |
| 300 | + slavio_misc_io_memory); | |
| 301 | + | |
| 247 | 302 | s->irq = irq; |
| 248 | 303 | |
| 249 | - register_savevm("slavio_misc", base, 1, slavio_misc_save, slavio_misc_load, s); | |
| 304 | + register_savevm("slavio_misc", base, 1, slavio_misc_save, slavio_misc_load, | |
| 305 | + s); | |
| 250 | 306 | qemu_register_reset(slavio_misc_reset, s); |
| 251 | 307 | slavio_misc_reset(s); |
| 252 | 308 | return s; | ... | ... |