Revision 23910d3f hw/acpi.c
b/hw/acpi.c | ||
---|---|---|
328 | 328 |
qemu_irq_lower(pm1_cnt->cmos_s3); |
329 | 329 |
} |
330 | 330 |
} |
331 |
|
|
332 |
/* ACPI GPE */ |
|
333 |
void acpi_gpe_init(ACPIGPE *gpe, uint8_t len) |
|
334 |
{ |
|
335 |
gpe->len = len; |
|
336 |
gpe->sts = qemu_mallocz(len / 2); |
|
337 |
gpe->en = qemu_mallocz(len / 2); |
|
338 |
} |
|
339 |
|
|
340 |
void acpi_gpe_blk(ACPIGPE *gpe, uint32_t blk) |
|
341 |
{ |
|
342 |
gpe->blk = blk; |
|
343 |
} |
|
344 |
|
|
345 |
void acpi_gpe_reset(ACPIGPE *gpe) |
|
346 |
{ |
|
347 |
memset(gpe->sts, 0, gpe->len / 2); |
|
348 |
memset(gpe->en, 0, gpe->len / 2); |
|
349 |
} |
|
350 |
|
|
351 |
static uint8_t *acpi_gpe_ioport_get_ptr(ACPIGPE *gpe, uint32_t addr) |
|
352 |
{ |
|
353 |
uint8_t *cur = NULL; |
|
354 |
|
|
355 |
if (addr < gpe->len / 2) { |
|
356 |
cur = gpe->sts + addr; |
|
357 |
} else if (addr < gpe->len) { |
|
358 |
cur = gpe->en + addr; |
|
359 |
} else { |
|
360 |
abort(); |
|
361 |
} |
|
362 |
|
|
363 |
return cur; |
|
364 |
} |
|
365 |
|
|
366 |
void acpi_gpe_ioport_writeb(ACPIGPE *gpe, uint32_t addr, uint32_t val) |
|
367 |
{ |
|
368 |
uint8_t *cur; |
|
369 |
|
|
370 |
addr -= gpe->blk; |
|
371 |
cur = acpi_gpe_ioport_get_ptr(gpe, addr); |
|
372 |
if (addr < gpe->len / 2) { |
|
373 |
/* GPE_STS */ |
|
374 |
*cur = (*cur) & ~val; |
|
375 |
} else if (addr < gpe->len) { |
|
376 |
/* GPE_EN */ |
|
377 |
*cur = val; |
|
378 |
} else { |
|
379 |
abort(); |
|
380 |
} |
|
381 |
} |
|
382 |
|
|
383 |
uint32_t acpi_gpe_ioport_readb(ACPIGPE *gpe, uint32_t addr) |
|
384 |
{ |
|
385 |
uint8_t *cur; |
|
386 |
uint32_t val; |
|
387 |
|
|
388 |
addr -= gpe->blk; |
|
389 |
cur = acpi_gpe_ioport_get_ptr(gpe, addr); |
|
390 |
val = 0; |
|
391 |
if (cur != NULL) { |
|
392 |
val = *cur; |
|
393 |
} |
|
394 |
|
|
395 |
return val; |
|
396 |
} |
Also available in: Unified diff