Commit bfa30a38968c204725a007e6cf845178231d3645

Authored by blueswir1
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;
... ...