xref: /openbmc/linux/tools/crypto/ccp/dbc.py (revision e2866646)
1f40d42f1SMario Limonciello#!/usr/bin/python3
2f40d42f1SMario Limonciello# SPDX-License-Identifier: GPL-2.0
3f40d42f1SMario Limonciello
4f40d42f1SMario Limoncielloimport ctypes
5f40d42f1SMario Limoncielloimport os
6f40d42f1SMario Limonciello
7f40d42f1SMario LimoncielloDBC_UID_SIZE = 16
8f40d42f1SMario LimoncielloDBC_NONCE_SIZE = 16
9f40d42f1SMario LimoncielloDBC_SIG_SIZE = 32
10f40d42f1SMario Limonciello
11f40d42f1SMario LimoncielloPARAM_GET_FMAX_CAP = (0x3,)
12f40d42f1SMario LimoncielloPARAM_SET_FMAX_CAP = (0x4,)
13f40d42f1SMario LimoncielloPARAM_GET_PWR_CAP = (0x5,)
14f40d42f1SMario LimoncielloPARAM_SET_PWR_CAP = (0x6,)
15f40d42f1SMario LimoncielloPARAM_GET_GFX_MODE = (0x7,)
16f40d42f1SMario LimoncielloPARAM_SET_GFX_MODE = (0x8,)
17f40d42f1SMario LimoncielloPARAM_GET_CURR_TEMP = (0x9,)
18f40d42f1SMario LimoncielloPARAM_GET_FMAX_MAX = (0xA,)
19f40d42f1SMario LimoncielloPARAM_GET_FMAX_MIN = (0xB,)
20f40d42f1SMario LimoncielloPARAM_GET_SOC_PWR_MAX = (0xC,)
21f40d42f1SMario LimoncielloPARAM_GET_SOC_PWR_MIN = (0xD,)
22f40d42f1SMario LimoncielloPARAM_GET_SOC_PWR_CUR = (0xE,)
23f40d42f1SMario Limonciello
24f40d42f1SMario LimoncielloDEVICE_NODE = "/dev/dbc"
25f40d42f1SMario Limonciello
26f40d42f1SMario Limonciellolib = ctypes.CDLL("./dbc_library.so", mode=ctypes.RTLD_GLOBAL)
27f40d42f1SMario Limonciello
28f40d42f1SMario Limonciello
29f40d42f1SMario Limonciellodef handle_error(code):
303b1ea906SMario Limonciello    raise OSError(code, os.strerror(code))
31f40d42f1SMario Limonciello
32f40d42f1SMario Limonciello
33f40d42f1SMario Limonciellodef get_nonce(device, signature):
34f40d42f1SMario Limonciello    if not device:
35f40d42f1SMario Limonciello        raise ValueError("Device required")
36f40d42f1SMario Limonciello    buf = ctypes.create_string_buffer(DBC_NONCE_SIZE)
37f40d42f1SMario Limonciello    ret = lib.get_nonce(device.fileno(), ctypes.byref(buf), signature)
38f40d42f1SMario Limonciello    if ret:
39f40d42f1SMario Limonciello        handle_error(ret)
40f40d42f1SMario Limonciello    return buf.value
41f40d42f1SMario Limonciello
42f40d42f1SMario Limonciello
43f40d42f1SMario Limonciellodef set_uid(device, new_uid, signature):
44f40d42f1SMario Limonciello    if not signature:
45f40d42f1SMario Limonciello        raise ValueError("Signature required")
46f40d42f1SMario Limonciello    if not new_uid:
47f40d42f1SMario Limonciello        raise ValueError("UID required")
48f40d42f1SMario Limonciello    ret = lib.set_uid(device.fileno(), new_uid, signature)
49f40d42f1SMario Limonciello    if ret:
50f40d42f1SMario Limonciello        handle_error(ret)
51f40d42f1SMario Limonciello    return True
52f40d42f1SMario Limonciello
53f40d42f1SMario Limonciello
54f40d42f1SMario Limonciellodef process_param(device, message, signature, data=None):
55f40d42f1SMario Limonciello    if not signature:
56f40d42f1SMario Limonciello        raise ValueError("Signature required")
57f40d42f1SMario Limonciello    if type(message) != tuple:
58f40d42f1SMario Limonciello        raise ValueError("Expected message tuple")
59f40d42f1SMario Limonciello    arg = ctypes.c_int(data if data else 0)
60*e2866646SMario Limonciello    sig = ctypes.create_string_buffer(signature, len(signature))
61*e2866646SMario Limonciello    ret = lib.process_param(device.fileno(), message[0], ctypes.pointer(sig), ctypes.pointer(arg))
62f40d42f1SMario Limonciello    if ret:
63f40d42f1SMario Limonciello        handle_error(ret)
64*e2866646SMario Limonciello    return arg.value, sig.value
65