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,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;