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,10 +44,13 @@ typedef struct MiscState { | ||
| 44 | qemu_irq irq; | 44 | qemu_irq irq; |
| 45 | uint8_t config; | 45 | uint8_t config; |
| 46 | uint8_t aux1, aux2; | 46 | uint8_t aux1, aux2; |
| 47 | - uint8_t diag, mctrl, sysctrl; | 47 | + uint8_t diag, mctrl; |
| 48 | + uint32_t sysctrl; | ||
| 48 | } MiscState; | 49 | } MiscState; |
| 49 | 50 | ||
| 50 | #define MISC_SIZE 1 | 51 | #define MISC_SIZE 1 |
| 52 | +#define SYSCTRL_MAXADDR 3 | ||
| 53 | +#define SYSCTRL_SIZE (SYSCTRL_MAXADDR + 1) | ||
| 51 | 54 | ||
| 52 | static void slavio_misc_update_irq(void *opaque) | 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,7 +86,8 @@ void slavio_set_power_fail(void *opaque, int power_failing) | ||
| 83 | slavio_misc_update_irq(s); | 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 | MiscState *s = opaque; | 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,13 +120,6 @@ static void slavio_misc_mem_writeb(void *opaque, target_phys_addr_t addr, uint32 | ||
| 116 | MISC_DPRINTF("Write modem control %2.2x\n", val & 0xff); | 120 | MISC_DPRINTF("Write modem control %2.2x\n", val & 0xff); |
| 117 | s->mctrl = val & 0xff; | 121 | s->mctrl = val & 0xff; |
| 118 | break; | 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 | case 0xa000000: | 123 | case 0xa000000: |
| 127 | MISC_DPRINTF("Write power management %2.2x\n", val & 0xff); | 124 | MISC_DPRINTF("Write power management %2.2x\n", val & 0xff); |
| 128 | cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HALT); | 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,10 +153,6 @@ static uint32_t slavio_misc_mem_readb(void *opaque, target_phys_addr_t addr) | ||
| 156 | ret = s->mctrl; | 153 | ret = s->mctrl; |
| 157 | MISC_DPRINTF("Read modem control %2.2x\n", ret); | 154 | MISC_DPRINTF("Read modem control %2.2x\n", ret); |
| 158 | break; | 155 | break; |
| 159 | - case 0x1f00000: | ||
| 160 | - MISC_DPRINTF("Read system control %2.2x\n", ret); | ||
| 161 | - ret = s->sysctrl; | ||
| 162 | - break; | ||
| 163 | case 0xa000000: | 156 | case 0xa000000: |
| 164 | MISC_DPRINTF("Read power management %2.2x\n", ret); | 157 | MISC_DPRINTF("Read power management %2.2x\n", ret); |
| 165 | break; | 158 | break; |
| @@ -179,10 +172,62 @@ static CPUWriteMemoryFunc *slavio_misc_mem_write[3] = { | @@ -179,10 +172,62 @@ static CPUWriteMemoryFunc *slavio_misc_mem_write[3] = { | ||
| 179 | slavio_misc_mem_writeb, | 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 | static void slavio_misc_save(QEMUFile *f, void *opaque) | 226 | static void slavio_misc_save(QEMUFile *f, void *opaque) |
| 183 | { | 227 | { |
| 184 | MiscState *s = opaque; | 228 | MiscState *s = opaque; |
| 185 | int tmp; | 229 | int tmp; |
| 230 | + uint8_t tmp8; | ||
| 186 | 231 | ||
| 187 | tmp = 0; | 232 | tmp = 0; |
| 188 | qemu_put_be32s(f, &tmp); /* ignored, was IRQ. */ | 233 | qemu_put_be32s(f, &tmp); /* ignored, was IRQ. */ |
| @@ -191,13 +236,15 @@ static void slavio_misc_save(QEMUFile *f, void *opaque) | @@ -191,13 +236,15 @@ static void slavio_misc_save(QEMUFile *f, void *opaque) | ||
| 191 | qemu_put_8s(f, &s->aux2); | 236 | qemu_put_8s(f, &s->aux2); |
| 192 | qemu_put_8s(f, &s->diag); | 237 | qemu_put_8s(f, &s->diag); |
| 193 | qemu_put_8s(f, &s->mctrl); | 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 | static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id) | 243 | static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id) |
| 198 | { | 244 | { |
| 199 | MiscState *s = opaque; | 245 | MiscState *s = opaque; |
| 200 | int tmp; | 246 | int tmp; |
| 247 | + uint8_t tmp8; | ||
| 201 | 248 | ||
| 202 | if (version_id != 1) | 249 | if (version_id != 1) |
| 203 | return -EINVAL; | 250 | return -EINVAL; |
| @@ -208,7 +255,8 @@ static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id) | @@ -208,7 +255,8 @@ static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id) | ||
| 208 | qemu_get_8s(f, &s->aux2); | 255 | qemu_get_8s(f, &s->aux2); |
| 209 | qemu_get_8s(f, &s->diag); | 256 | qemu_get_8s(f, &s->diag); |
| 210 | qemu_get_8s(f, &s->mctrl); | 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 | return 0; | 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,7 +270,9 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, | ||
| 222 | if (!s) | 270 | if (!s) |
| 223 | return NULL; | 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 | // Slavio control | 276 | // Slavio control |
| 227 | cpu_register_physical_memory(base + 0x1800000, MISC_SIZE, | 277 | cpu_register_physical_memory(base + 0x1800000, MISC_SIZE, |
| 228 | slavio_misc_io_memory); | 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,15 +288,21 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, | ||
| 238 | // Modem control | 288 | // Modem control |
| 239 | cpu_register_physical_memory(base + 0x1b00000, MISC_SIZE, | 289 | cpu_register_physical_memory(base + 0x1b00000, MISC_SIZE, |
| 240 | slavio_misc_io_memory); | 290 | slavio_misc_io_memory); |
| 241 | - // System control | ||
| 242 | - cpu_register_physical_memory(base + 0x1f00000, MISC_SIZE, | ||
| 243 | - slavio_misc_io_memory); | ||
| 244 | // Power management | 291 | // Power management |
| 245 | cpu_register_physical_memory(power_base, MISC_SIZE, slavio_misc_io_memory); | 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 | s->irq = irq; | 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 | qemu_register_reset(slavio_misc_reset, s); | 306 | qemu_register_reset(slavio_misc_reset, s); |
| 251 | slavio_misc_reset(s); | 307 | slavio_misc_reset(s); |
| 252 | return s; | 308 | return s; |