]>
Commit | Line | Data |
---|---|---|
3b97c01e SB |
1 | /* |
2 | * tpm_ppi.c - TPM Physical Presence Interface | |
3 | * | |
4 | * Copyright (C) 2018 IBM Corporation | |
5 | * | |
6 | * Authors: | |
7 | * Stefan Berger <stefanb@us.ibm.com> | |
8 | * | |
9 | * This work is licensed under the terms of the GNU GPL, version 2 or later. | |
10 | * See the COPYING file in the top-level directory. | |
11 | * | |
12 | */ | |
13 | ||
14 | #include "qemu/osdep.h" | |
5df022cf | 15 | #include "qemu/memalign.h" |
3b97c01e | 16 | #include "qapi/error.h" |
3b97c01e SB |
17 | #include "sysemu/memory_mapping.h" |
18 | #include "migration/vmstate.h" | |
b05b6e36 | 19 | #include "hw/qdev-core.h" |
40214766 | 20 | #include "hw/acpi/tpm.h" |
3b97c01e | 21 | #include "tpm_ppi.h" |
ffab1be7 MAL |
22 | #include "trace.h" |
23 | ||
24 | void tpm_ppi_reset(TPMPPI *tpmppi) | |
25 | { | |
773c1f1e | 26 | if (tpmppi->buf[0x15a /* movv, docs/specs/tpm.rst */] & 0x1) { |
ffab1be7 MAL |
27 | GuestPhysBlockList guest_phys_blocks; |
28 | GuestPhysBlock *block; | |
29 | ||
30 | guest_phys_blocks_init(&guest_phys_blocks); | |
31 | guest_phys_blocks_append(&guest_phys_blocks); | |
32 | QTAILQ_FOREACH(block, &guest_phys_blocks.head, next) { | |
45e576c7 DH |
33 | hwaddr mr_offs = block->host_addr - |
34 | (uint8_t *)memory_region_get_ram_ptr(block->mr); | |
35 | ||
ffab1be7 MAL |
36 | trace_tpm_ppi_memset(block->host_addr, |
37 | block->target_end - block->target_start); | |
38 | memset(block->host_addr, 0, | |
39 | block->target_end - block->target_start); | |
45e576c7 | 40 | memory_region_set_dirty(block->mr, mr_offs, |
ffab1be7 MAL |
41 | block->target_end - block->target_start); |
42 | } | |
43 | guest_phys_blocks_free(&guest_phys_blocks); | |
44 | } | |
45 | } | |
3b97c01e | 46 | |
b05b6e36 | 47 | void tpm_ppi_init(TPMPPI *tpmppi, MemoryRegion *m, |
3b97c01e SB |
48 | hwaddr addr, Object *obj) |
49 | { | |
8e3b0cbb | 50 | tpmppi->buf = qemu_memalign(qemu_real_host_page_size(), |
71e415c8 | 51 | HOST_PAGE_ALIGN(TPM_PPI_ADDR_SIZE)); |
3b97c01e SB |
52 | memory_region_init_ram_device_ptr(&tpmppi->ram, obj, "tpm-ppi", |
53 | TPM_PPI_ADDR_SIZE, tpmppi->buf); | |
54 | vmstate_register_ram(&tpmppi->ram, DEVICE(obj)); | |
55 | ||
56 | memory_region_add_subregion(m, addr, &tpmppi->ram); | |
57 | } |