Message ID | 20230323030119.2113570-3-ninad@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | Add support for TPM devices over I2C bus | expand |
On 3/23/23 04:01, Ninad Palsule wrote: > Qemu already supports devices attached to ISA and sysbus. This drop adds > support for the I2C bus attached TPM devices. > > This commit includes changes for the common code. > - Added support for the new checksum registers which are required for > the I2C support. The checksum calculation is handled in the qemu > common code. > - Added wrapper function for read and write data so that I2C code can > call it without MMIO interface. > > Signed-off-by: Ninad Palsule <ninad@linux.ibm.com> > --- > V2: > > Incorporated Stephen's comments. > > - Removed checksum enable and checksum get registers. > - Added checksum calculation function which can be called from > i2c layer. > --- > hw/tpm/tpm_tis.h | 3 +++ > hw/tpm/tpm_tis_common.c | 32 ++++++++++++++++++++++++++++++++ > 2 files changed, 35 insertions(+) > > diff --git a/hw/tpm/tpm_tis.h b/hw/tpm/tpm_tis.h > index f6b5872ba6..6f29a508dd 100644 > --- a/hw/tpm/tpm_tis.h > +++ b/hw/tpm/tpm_tis.h > @@ -86,5 +86,8 @@ int tpm_tis_pre_save(TPMState *s); > void tpm_tis_reset(TPMState *s); > enum TPMVersion tpm_tis_get_tpm_version(TPMState *s); > void tpm_tis_request_completed(TPMState *s, int ret); > +uint32_t tpm_tis_read_data(TPMState *s, hwaddr addr, unsigned size); > +void tpm_tis_write_data(TPMState *s, hwaddr addr, uint64_t val, uint32_t size); > +uint16_t tpm_tis_get_checksum(TPMState *s); > > #endif /* TPM_TPM_TIS_H */ > diff --git a/hw/tpm/tpm_tis_common.c b/hw/tpm/tpm_tis_common.c > index 503be2a541..b1acde74cb 100644 > --- a/hw/tpm/tpm_tis_common.c > +++ b/hw/tpm/tpm_tis_common.c > @@ -26,6 +26,8 @@ > #include "hw/irq.h" > #include "hw/isa/isa.h" > #include "qapi/error.h" > +#include "qemu/bswap.h" > +#include "qemu/crc-ccitt.h" > #include "qemu/module.h" > > #include "hw/acpi/tpm.h" > @@ -447,6 +449,27 @@ static uint64_t tpm_tis_mmio_read(void *opaque, hwaddr addr, > return val; > } > > +/* > + * A wrapper read function so that it can be directly called without > + * mmio. > + */ > +uint32_t tpm_tis_read_data(TPMState *s, hwaddr addr, unsigned size) > +{ > + return tpm_tis_mmio_read(s, addr, size); > +} > + > +/* > + * Calculate current data buffer checksum > + */ > +uint16_t tpm_tis_get_checksum(TPMState *s) > +{ > + uint16_t val = 0xffff; > + > + val = cpu_to_be16(crc_ccitt(0, s->buffer, s->rw_offset)); this routine could simply return cpu_to_be16(.... Thanks, C. > + > + return val; > +} > + > /* > * Write a value to a register of the TIS interface > * See specs pages 33-63 for description of the registers > @@ -767,6 +790,15 @@ static void tpm_tis_mmio_write(void *opaque, hwaddr addr, > } > } > > +/* > + * A wrapper write function so that it can be directly called without > + * mmio. > + */ > +void tpm_tis_write_data(TPMState *s, hwaddr addr, uint64_t val, uint32_t size) > +{ > + tpm_tis_mmio_write(s, addr, val, size); > +} > + > const MemoryRegionOps tpm_tis_memory_ops = { > .read = tpm_tis_mmio_read, > .write = tpm_tis_mmio_write,
On 3/23/23 2:44 AM, Cédric Le Goater wrote: > On 3/23/23 04:01, Ninad Palsule wrote: >> Qemu already supports devices attached to ISA and sysbus. This drop adds >> support for the I2C bus attached TPM devices. >> >> This commit includes changes for the common code. >> - Added support for the new checksum registers which are required for >> the I2C support. The checksum calculation is handled in the qemu >> common code. >> - Added wrapper function for read and write data so that I2C code can >> call it without MMIO interface. >> >> Signed-off-by: Ninad Palsule <ninad@linux.ibm.com> >> --- >> V2: >> >> Incorporated Stephen's comments. >> >> - Removed checksum enable and checksum get registers. >> - Added checksum calculation function which can be called from >> i2c layer. >> --- >> hw/tpm/tpm_tis.h | 3 +++ >> hw/tpm/tpm_tis_common.c | 32 ++++++++++++++++++++++++++++++++ >> 2 files changed, 35 insertions(+) >> >> diff --git a/hw/tpm/tpm_tis.h b/hw/tpm/tpm_tis.h >> index f6b5872ba6..6f29a508dd 100644 >> --- a/hw/tpm/tpm_tis.h >> +++ b/hw/tpm/tpm_tis.h >> @@ -86,5 +86,8 @@ int tpm_tis_pre_save(TPMState *s); >> void tpm_tis_reset(TPMState *s); >> enum TPMVersion tpm_tis_get_tpm_version(TPMState *s); >> void tpm_tis_request_completed(TPMState *s, int ret); >> +uint32_t tpm_tis_read_data(TPMState *s, hwaddr addr, unsigned size); >> +void tpm_tis_write_data(TPMState *s, hwaddr addr, uint64_t val, >> uint32_t size); >> +uint16_t tpm_tis_get_checksum(TPMState *s); >> #endif /* TPM_TPM_TIS_H */ >> diff --git a/hw/tpm/tpm_tis_common.c b/hw/tpm/tpm_tis_common.c >> index 503be2a541..b1acde74cb 100644 >> --- a/hw/tpm/tpm_tis_common.c >> +++ b/hw/tpm/tpm_tis_common.c >> @@ -26,6 +26,8 @@ >> #include "hw/irq.h" >> #include "hw/isa/isa.h" >> #include "qapi/error.h" >> +#include "qemu/bswap.h" >> +#include "qemu/crc-ccitt.h" >> #include "qemu/module.h" >> #include "hw/acpi/tpm.h" >> @@ -447,6 +449,27 @@ static uint64_t tpm_tis_mmio_read(void *opaque, >> hwaddr addr, >> return val; >> } >> +/* >> + * A wrapper read function so that it can be directly called without >> + * mmio. >> + */ >> +uint32_t tpm_tis_read_data(TPMState *s, hwaddr addr, unsigned size) >> +{ >> + return tpm_tis_mmio_read(s, addr, size); >> +} >> + >> +/* >> + * Calculate current data buffer checksum >> + */ >> +uint16_t tpm_tis_get_checksum(TPMState *s) >> +{ >> + uint16_t val = 0xffff; >> + >> + val = cpu_to_be16(crc_ccitt(0, s->buffer, s->rw_offset)); > > this routine could simply return cpu_to_be16(.... > Done. Thank you for the review. Ninad > Thanks, > > C. > > >> + >> + return val; >> +} >> + >> /* >> * Write a value to a register of the TIS interface >> * See specs pages 33-63 for description of the registers >> @@ -767,6 +790,15 @@ static void tpm_tis_mmio_write(void *opaque, >> hwaddr addr, >> } >> } >> +/* >> + * A wrapper write function so that it can be directly called without >> + * mmio. >> + */ >> +void tpm_tis_write_data(TPMState *s, hwaddr addr, uint64_t val, >> uint32_t size) >> +{ >> + tpm_tis_mmio_write(s, addr, val, size); >> +} >> + >> const MemoryRegionOps tpm_tis_memory_ops = { >> .read = tpm_tis_mmio_read, >> .write = tpm_tis_mmio_write, >
diff --git a/hw/tpm/tpm_tis.h b/hw/tpm/tpm_tis.h index f6b5872ba6..6f29a508dd 100644 --- a/hw/tpm/tpm_tis.h +++ b/hw/tpm/tpm_tis.h @@ -86,5 +86,8 @@ int tpm_tis_pre_save(TPMState *s); void tpm_tis_reset(TPMState *s); enum TPMVersion tpm_tis_get_tpm_version(TPMState *s); void tpm_tis_request_completed(TPMState *s, int ret); +uint32_t tpm_tis_read_data(TPMState *s, hwaddr addr, unsigned size); +void tpm_tis_write_data(TPMState *s, hwaddr addr, uint64_t val, uint32_t size); +uint16_t tpm_tis_get_checksum(TPMState *s); #endif /* TPM_TPM_TIS_H */ diff --git a/hw/tpm/tpm_tis_common.c b/hw/tpm/tpm_tis_common.c index 503be2a541..b1acde74cb 100644 --- a/hw/tpm/tpm_tis_common.c +++ b/hw/tpm/tpm_tis_common.c @@ -26,6 +26,8 @@ #include "hw/irq.h" #include "hw/isa/isa.h" #include "qapi/error.h" +#include "qemu/bswap.h" +#include "qemu/crc-ccitt.h" #include "qemu/module.h" #include "hw/acpi/tpm.h" @@ -447,6 +449,27 @@ static uint64_t tpm_tis_mmio_read(void *opaque, hwaddr addr, return val; } +/* + * A wrapper read function so that it can be directly called without + * mmio. + */ +uint32_t tpm_tis_read_data(TPMState *s, hwaddr addr, unsigned size) +{ + return tpm_tis_mmio_read(s, addr, size); +} + +/* + * Calculate current data buffer checksum + */ +uint16_t tpm_tis_get_checksum(TPMState *s) +{ + uint16_t val = 0xffff; + + val = cpu_to_be16(crc_ccitt(0, s->buffer, s->rw_offset)); + + return val; +} + /* * Write a value to a register of the TIS interface * See specs pages 33-63 for description of the registers @@ -767,6 +790,15 @@ static void tpm_tis_mmio_write(void *opaque, hwaddr addr, } } +/* + * A wrapper write function so that it can be directly called without + * mmio. + */ +void tpm_tis_write_data(TPMState *s, hwaddr addr, uint64_t val, uint32_t size) +{ + tpm_tis_mmio_write(s, addr, val, size); +} + const MemoryRegionOps tpm_tis_memory_ops = { .read = tpm_tis_mmio_read, .write = tpm_tis_mmio_write,
Qemu already supports devices attached to ISA and sysbus. This drop adds support for the I2C bus attached TPM devices. This commit includes changes for the common code. - Added support for the new checksum registers which are required for the I2C support. The checksum calculation is handled in the qemu common code. - Added wrapper function for read and write data so that I2C code can call it without MMIO interface. Signed-off-by: Ninad Palsule <ninad@linux.ibm.com> --- V2: Incorporated Stephen's comments. - Removed checksum enable and checksum get registers. - Added checksum calculation function which can be called from i2c layer. --- hw/tpm/tpm_tis.h | 3 +++ hw/tpm/tpm_tis_common.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+)