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