blob: 4e12afdc6b19ecca62f26b043374b2b7201201f1 [file] [log] [blame]
AlexeiFedorov9f0dc012024-09-10 10:22:06 +01001/*
2 * Copyright (c) 2024, Arm Limited or its affiliates. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#ifndef PCIE_DOE_H
9#define PCIE_DOE_H
10
11/* DOE Extended Capability */
12#define DOE_CAP_ID 0x002E
13
14#define DOE_CAP_REG 0x4
15#define DOE_CTRL_REG 0x8
16#define DOE_STATUS_REG 0xC
17#define DOE_WRITE_DATA_MAILBOX_REG 0x10
18#define DOE_READ_DATA_MAILBOX_REG 0x14
19
20#define DOE_CTRL_ABORT_BIT (1 << 0)
21#define DOE_CTRL_GO_BIT (1 << 31)
22
23#define DOE_STATUS_BUSY_BIT (1 << 0)
24#define DOE_STATUS_ERROR_BIT (1 << 2)
25#define DOE_STATUS_READY_BIT (1 << 31)
26
27/* Time intervals in ms */
28#define PCI_DOE_TIMEOUT 1000
29#define PCI_DOE_POLL_TIME 10
30
31#define PCI_DOE_POLL_LOOP (PCI_DOE_TIMEOUT / PCI_DOE_POLL_TIME)
32
33/* DOE Data Object Header 2 Reserved field [31:18] */
34#define PCI_DOE_RESERVED_SHIFT 18
35#define PCI_DOE_RESERVED_MASK 0xFFFC0000
36
37/* Max data object length is 2^18 DW */
38#define PCI_DOE_MAX_LENGTH (1 << PCI_DOE_RESERVED_SHIFT)
39
40/* SPDM GET_VERSION response DW length */
41#define SPDM_GET_VERS_RESP_LEN \
42 ((sizeof(spdm_version_response_t) + \
43 (sizeof(spdm_version_number_t) * SPDM_MAX_VERSION_COUNT) + \
44 (sizeof(uint32_t) - 1)) << 2)
45
46/* PCI-SIG Vendor ID */
47#define PSI_SIG_VENDOR_ID 1
48
49/* Data Object Protocols */
50#define DOE_DISC_PROTOCOL 0
51#define CMA_SPDM_PROTOCOL 1
52#define SEC_CMA_SPDM_PROTOCOL 2
53
54#define DOE_HEADER(_type) ((_type << 16) | PSI_SIG_VENDOR_ID)
55
56#define DOE_HEADER_0 DOE_HEADER(DOE_DISC_PROTOCOL)
57#define DOE_HEADER_1 DOE_HEADER(CMA_SPDM_PROTOCOL)
58#define DOE_HEADER_2 DOE_HEADER(SEC_CMA_SPDM_PROTOCOL)
59#define DOE_HEADER_LENGTH 2
60
61/*
62 * SPDM VERSION structure:
63 * bit[15:12] major_version
64 * bit[11:8] minor_version
65 * bit[7:4] update_version_number
66 * bit[3:0] alpha
67 */
68#define SPDM_VER_MAJOR_SHIFT 12
69#define SPDM_VER_MAJOR_WIDTH 4
70#define SPDM_VER_MINOR_SHIFT 8
71#define SPDM_VER_MINOR_WIDTH 4
72#define SPDM_VER_UPDATE_SHIFT 4
73#define SPDM_VER_UPDATE_WIDTH 4
74#define SPDM_VER_ALPHA_SHIFT 0
75#define SPDM_VER_ALPHA_WIDTH 4
76
77/* DOE Discovery */
78typedef struct {
79 uint8_t index;
80 uint8_t reserved[3];
81} pcie_doe_disc_req_t;
82
83typedef struct {
84 uint16_t vendor_id;
85 uint8_t data_object_type;
86 uint8_t next_index;
87} pcie_doe_disc_resp_t;
88
89void print_doe_disc(pcie_doe_disc_resp_t *data);
90int pcie_doe_send_req(uint32_t header, uint32_t bdf, uint32_t doe_cap_base,
91 uint32_t *req_addr, uint32_t req_len);
92int pcie_doe_recv_resp(uint32_t bdf, uint32_t doe_cap_base,
93 uint32_t *resp_addr, uint32_t *resp_len);
94
95#endif /* PCIE_DOE_H */