1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * AMD Secure Processor Dynamic Boost Control sample library 4 * 5 * Copyright (C) 2023 Advanced Micro Devices, Inc. 6 * 7 * Author: Mario Limonciello <mario.limonciello@amd.com> 8 */ 9 10 #include <assert.h> 11 #include <errno.h> 12 #include <string.h> 13 #include <sys/ioctl.h> 14 15 /* if uapi header isn't installed, this might not yet exist */ 16 #ifndef __packed 17 #define __packed __attribute__((packed)) 18 #endif 19 #include <linux/psp-dbc.h> 20 21 int get_nonce(int fd, void *nonce_out, void *signature) 22 { 23 struct dbc_user_nonce tmp = { 24 .auth_needed = !!signature, 25 }; 26 27 assert(nonce_out); 28 29 if (signature) 30 memcpy(tmp.signature, signature, sizeof(tmp.signature)); 31 32 if (ioctl(fd, DBCIOCNONCE, &tmp)) 33 return errno; 34 memcpy(nonce_out, tmp.nonce, sizeof(tmp.nonce)); 35 36 return 0; 37 } 38 39 int set_uid(int fd, __u8 *uid, __u8 *signature) 40 { 41 struct dbc_user_setuid tmp; 42 43 assert(uid); 44 assert(signature); 45 46 memcpy(tmp.uid, uid, sizeof(tmp.uid)); 47 memcpy(tmp.signature, signature, sizeof(tmp.signature)); 48 49 if (ioctl(fd, DBCIOCUID, &tmp)) 50 return errno; 51 return 0; 52 } 53 54 int process_param(int fd, int msg_index, __u8 *signature, int *data) 55 { 56 struct dbc_user_param tmp = { 57 .msg_index = msg_index, 58 .param = *data, 59 }; 60 int ret; 61 62 assert(signature); 63 assert(data); 64 65 memcpy(tmp.signature, signature, sizeof(tmp.signature)); 66 67 if (ioctl(fd, DBCIOCPARAM, &tmp)) 68 return errno; 69 70 *data = tmp.param; 71 memcpy(signature, tmp.signature, sizeof(tmp.signature)); 72 return 0; 73 } 74