Lines Matching +full:1 +full:- +full:d
31 /*#define I6300ESB_DEBUG 1*/
52 #define ESB_WDT_ENABLE (0x01 << 1) /* Enable WDT */
64 #define ESB_UNLOCK1 0x80 /* Step 1 to unlock reset registers */
73 * performed depends on the -watchdog-action
78 #define CLOCK_SCALE_1MHZ 1
81 #define INT_TYPE_IRQ 0 /* APIC 1, INT 10 */
93 int stage; /* Stage (1 or 2). */
97 * states 0 -> 1 -> 2 when this happens.
110 * (hence it starts counting down) or has been keep-alived. in OBJECT_DECLARE_SIMPLE_TYPE()
112 static void i6300esb_restart_timer(I6300State *d, int stage) in OBJECT_DECLARE_SIMPLE_TYPE()
116 if (!d->enabled) in OBJECT_DECLARE_SIMPLE_TYPE()
119 d->stage = stage; in OBJECT_DECLARE_SIMPLE_TYPE()
121 if (d->stage <= 1) in OBJECT_DECLARE_SIMPLE_TYPE()
122 timeout = d->timer1_preload; in OBJECT_DECLARE_SIMPLE_TYPE()
124 timeout = d->timer2_preload; in OBJECT_DECLARE_SIMPLE_TYPE()
126 if (d->clock_scale == CLOCK_SCALE_1KHZ) in OBJECT_DECLARE_SIMPLE_TYPE()
133 timeout = timeout * 30; /* on a PCI bus, 1 tick is 30 ns*/ in OBJECT_DECLARE_SIMPLE_TYPE()
135 i6300esb_debug("stage %d, timeout %" PRIi64 "\n", d->stage, timeout); in OBJECT_DECLARE_SIMPLE_TYPE()
137 timer_mod(d->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + timeout); in OBJECT_DECLARE_SIMPLE_TYPE()
141 static void i6300esb_disable_timer(I6300State *d) in i6300esb_disable_timer() argument
145 timer_del(d->timer); in i6300esb_disable_timer()
151 I6300State *d = WATCHDOG_I6300ESB_DEVICE(pdev); in i6300esb_reset() local
153 i6300esb_debug("I6300State = %p\n", d); in i6300esb_reset()
155 i6300esb_disable_timer(d); in i6300esb_reset()
157 /* NB: Don't change d->previous_reboot_flag in this function. */ in i6300esb_reset()
159 d->reboot_enabled = 1; in i6300esb_reset()
160 d->clock_scale = CLOCK_SCALE_1KHZ; in i6300esb_reset()
161 d->int_type = INT_TYPE_IRQ; in i6300esb_reset()
162 d->free_run = 0; in i6300esb_reset()
163 d->locked = 0; in i6300esb_reset()
164 d->enabled = 0; in i6300esb_reset()
165 d->timer1_preload = 0xfffff; in i6300esb_reset()
166 d->timer2_preload = 0xfffff; in i6300esb_reset()
167 d->stage = 1; in i6300esb_reset()
168 d->unlock_state = 0; in i6300esb_reset()
173 * If d->stage == 1 then we perform the first stage action (usually,
180 I6300State *d = vp; in i6300esb_timer_expired() local
182 i6300esb_debug("stage %d\n", d->stage); in i6300esb_timer_expired()
184 if (d->stage == 1) { in i6300esb_timer_expired()
185 /* What to do at the end of stage 1? */ in i6300esb_timer_expired()
186 switch (d->int_type) { in i6300esb_timer_expired()
188 … fprintf(stderr, "i6300esb_timer_expired: I would send APIC 1 INT 10 here if I knew how (XXX)\n"); in i6300esb_timer_expired()
196 i6300esb_restart_timer(d, 2); in i6300esb_timer_expired()
199 if (d->reboot_enabled) { in i6300esb_timer_expired()
200 d->previous_reboot_flag = 1; in i6300esb_timer_expired()
202 i6300esb_reset(DEVICE(d)); in i6300esb_timer_expired()
205 /* In "free running mode" we start stage 1 again. */ in i6300esb_timer_expired()
206 if (d->free_run) in i6300esb_timer_expired()
207 i6300esb_restart_timer(d, 1); in i6300esb_timer_expired()
214 I6300State *d = WATCHDOG_I6300ESB_DEVICE(dev); in i6300esb_config_write() local
217 i6300esb_debug("addr = %x, data = %x, len = %d\n", addr, data, len); in i6300esb_config_write()
220 d->reboot_enabled = (data & ESB_WDT_REBOOT) == 0; in i6300esb_config_write()
221 d->clock_scale = in i6300esb_config_write()
223 d->int_type = (data & ESB_WDT_INTTYPE); in i6300esb_config_write()
224 } else if (addr == ESB_LOCK_REG && len == 1) { in i6300esb_config_write()
225 if (!d->locked) { in i6300esb_config_write()
226 d->locked = (data & ESB_WDT_LOCK) != 0; in i6300esb_config_write()
227 d->free_run = (data & ESB_WDT_FUNC) != 0; in i6300esb_config_write()
228 old = d->enabled; in i6300esb_config_write()
229 d->enabled = (data & ESB_WDT_ENABLE) != 0; in i6300esb_config_write()
230 if (!old && d->enabled) /* Enabled transitioned from 0 -> 1 */ in i6300esb_config_write()
231 i6300esb_restart_timer(d, 1); in i6300esb_config_write()
232 else if (!d->enabled) in i6300esb_config_write()
233 i6300esb_disable_timer(d); in i6300esb_config_write()
242 I6300State *d = WATCHDOG_I6300ESB_DEVICE(dev); in i6300esb_config_read() local
245 i6300esb_debug ("addr = %x, len = %d\n", addr, len); in i6300esb_config_read()
249 (d->reboot_enabled ? 0 : ESB_WDT_REBOOT) | in i6300esb_config_read()
250 (d->clock_scale == CLOCK_SCALE_1MHZ ? ESB_WDT_FREQ : 0) | in i6300esb_config_read()
251 d->int_type; in i6300esb_config_read()
253 } else if (addr == ESB_LOCK_REG && len == 1) { in i6300esb_config_read()
255 (d->free_run ? ESB_WDT_FUNC : 0) | in i6300esb_config_read()
256 (d->locked ? ESB_WDT_LOCK : 0) | in i6300esb_config_read()
257 (d->enabled ? ESB_WDT_ENABLE : 0); in i6300esb_config_read()
274 I6300State *d = vp; in i6300esb_mem_readw() local
283 data = d->previous_reboot_flag ? 0x1200 : 0; in i6300esb_mem_readw()
298 I6300State *d = vp; in i6300esb_mem_writeb() local
303 d->unlock_state = 1; in i6300esb_mem_writeb()
304 else if (addr == 0xc && val == 0x86 && d->unlock_state == 1) in i6300esb_mem_writeb()
305 d->unlock_state = 2; in i6300esb_mem_writeb()
310 I6300State *d = vp; in i6300esb_mem_writew() local
315 d->unlock_state = 1; in i6300esb_mem_writew()
316 else if (addr == 0xc && val == 0x86 && d->unlock_state == 1) in i6300esb_mem_writew()
317 d->unlock_state = 2; in i6300esb_mem_writew()
319 if (d->unlock_state == 2) { in i6300esb_mem_writew()
325 i6300esb_restart_timer(d, 1); in i6300esb_mem_writew()
332 d->previous_reboot_flag = 0; in i6300esb_mem_writew()
336 d->unlock_state = 0; in i6300esb_mem_writew()
343 I6300State *d = vp; in i6300esb_mem_writel() local
348 d->unlock_state = 1; in i6300esb_mem_writel()
349 else if (addr == 0xc && val == 0x86 && d->unlock_state == 1) in i6300esb_mem_writel()
350 d->unlock_state = 2; in i6300esb_mem_writel()
352 if (d->unlock_state == 2) { in i6300esb_mem_writel()
354 d->timer1_preload = val & 0xfffff; in i6300esb_mem_writel()
356 d->timer2_preload = val & 0xfffff; in i6300esb_mem_writel()
358 d->unlock_state = 0; in i6300esb_mem_writel()
366 case 1: in i6300esb_mem_readfn()
381 case 1: in i6300esb_mem_writefn()
398 .valid.min_access_size = 1,
410 * To correct this without breaking old->new migration for older
413 * build environments, and have reset minimum_version_id to 1,
420 .minimum_version_id = 1,
441 I6300State *d = WATCHDOG_I6300ESB_DEVICE(dev); in i6300esb_realize() local
443 i6300esb_debug("I6300State = %p\n", d); in i6300esb_realize()
445 d->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, i6300esb_timer_expired, d); in i6300esb_realize()
446 d->previous_reboot_flag = 0; in i6300esb_realize()
448 memory_region_init_io(&d->io_mem, OBJECT(d), &i6300esb_ops, d, in i6300esb_realize()
450 pci_register_bar(&d->dev, 0, 0, &d->io_mem); in i6300esb_realize()
455 I6300State *d = WATCHDOG_I6300ESB_DEVICE(dev); in i6300esb_exit() local
457 timer_free(d->timer); in i6300esb_exit()
465 k->config_read = i6300esb_config_read; in i6300esb_class_init()
466 k->config_write = i6300esb_config_write; in i6300esb_class_init()
467 k->realize = i6300esb_realize; in i6300esb_class_init()
468 k->exit = i6300esb_exit; in i6300esb_class_init()
469 k->vendor_id = PCI_VENDOR_ID_INTEL; in i6300esb_class_init()
470 k->device_id = PCI_DEVICE_ID_INTEL_ESB_9; in i6300esb_class_init()
471 k->class_id = PCI_CLASS_SYSTEM_OTHER; in i6300esb_class_init()
473 dc->vmsd = &vmstate_i6300esb; in i6300esb_class_init()
474 set_bit(DEVICE_CATEGORY_WATCHDOG, dc->categories); in i6300esb_class_init()
475 dc->desc = "Intel 6300ESB"; in i6300esb_class_init()