1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (c) 2013 The Chromium OS Authors.
4 * Coypright (c) 2013 Guntermann & Drunck GmbH
7 #define LOG_CATEGORY UCLASS_TPM
11 #include <asm/unaligned.h>
12 #include <tpm-common.h>
13 #include "tpm-utils.h"
15 int pack_byte_string(u8 *str, size_t size, const char *format, ...)
18 size_t offset = 0, length = 0;
22 va_start(args, format);
23 for (; *format; format++) {
26 offset = va_arg(args, size_t);
27 value = va_arg(args, int);
31 offset = va_arg(args, size_t);
32 value = va_arg(args, int);
36 offset = va_arg(args, size_t);
37 value = va_arg(args, u32);
41 offset = va_arg(args, size_t);
42 data = va_arg(args, u8 *);
43 length = va_arg(args, u32);
46 debug("Couldn't recognize format string\n");
51 if (offset + length > size) {
61 put_unaligned_be16(value, str + offset);
64 put_unaligned_be32(value, str + offset);
67 memcpy(str + offset, data, length);
76 int unpack_byte_string(const u8 *str, size_t size, const char *format, ...)
79 size_t offset = 0, length = 0;
84 va_start(args, format);
85 for (; *format; format++) {
88 offset = va_arg(args, size_t);
89 ptr8 = va_arg(args, u8 *);
93 offset = va_arg(args, size_t);
94 ptr16 = va_arg(args, u16 *);
98 offset = va_arg(args, size_t);
99 ptr32 = va_arg(args, u32 *);
103 offset = va_arg(args, size_t);
104 ptr8 = va_arg(args, u8 *);
105 length = va_arg(args, u32);
109 debug("Couldn't recognize format string\n");
113 if (offset + length > size) {
115 log_err("Failed to read: size=%d, offset=%x, len=%x\n",
116 size, offset, length);
125 *ptr16 = get_unaligned_be16(str + offset);
128 *ptr32 = get_unaligned_be32(str + offset);
131 memcpy(ptr8, str + offset, length);
140 u32 tpm_command_size(const void *command)
142 const size_t command_size_offset = 2;
144 return get_unaligned_be32(command + command_size_offset);
147 u32 tpm_return_code(const void *response)
149 const size_t return_code_offset = 6;
151 return get_unaligned_be32(response + return_code_offset);
154 u32 tpm_sendrecv_command(struct udevice *dev, const void *command,
155 void *response, size_t *size_ptr)
158 u8 response_buffer[COMMAND_BUFFER_SIZE];
159 size_t response_length;
163 response_length = *size_ptr;
165 response = response_buffer;
166 response_length = sizeof(response_buffer);
169 err = tpm_xfer(dev, command, tpm_command_size(command),
170 response, &response_length);
176 *size_ptr = response_length;
178 ret = tpm_return_code(response);
180 log_debug("TPM response [ret:%d]: ", ret);
181 for (i = 0; i < response_length; i++)
182 log_debug("%02x ", ((u8 *)response)[i]);
188 int tpm_init(struct udevice *dev)
190 return tpm_open(dev);