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