blob: bac0dbf9f5851836dd6efebaff579b83ae2301a1 [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
Soby Mathew5929bfe2024-11-28 12:28:00 +000011#include <stdbool.h>
12#include <stddef.h>
13#include <pcie.h>
14#include <test_helpers.h>
15
AlexeiFedorov9f0dc012024-09-10 10:22:06 +010016/* DOE Extended Capability */
17#define DOE_CAP_ID 0x002E
18
19#define DOE_CAP_REG 0x4
20#define DOE_CTRL_REG 0x8
21#define DOE_STATUS_REG 0xC
22#define DOE_WRITE_DATA_MAILBOX_REG 0x10
23#define DOE_READ_DATA_MAILBOX_REG 0x14
24
25#define DOE_CTRL_ABORT_BIT (1 << 0)
26#define DOE_CTRL_GO_BIT (1 << 31)
27
28#define DOE_STATUS_BUSY_BIT (1 << 0)
29#define DOE_STATUS_ERROR_BIT (1 << 2)
30#define DOE_STATUS_READY_BIT (1 << 31)
31
32/* Time intervals in ms */
33#define PCI_DOE_TIMEOUT 1000
34#define PCI_DOE_POLL_TIME 10
35
36#define PCI_DOE_POLL_LOOP (PCI_DOE_TIMEOUT / PCI_DOE_POLL_TIME)
37
38/* DOE Data Object Header 2 Reserved field [31:18] */
39#define PCI_DOE_RESERVED_SHIFT 18
40#define PCI_DOE_RESERVED_MASK 0xFFFC0000
41
42/* Max data object length is 2^18 DW */
43#define PCI_DOE_MAX_LENGTH (1 << PCI_DOE_RESERVED_SHIFT)
44
45/* SPDM GET_VERSION response DW length */
46#define SPDM_GET_VERS_RESP_LEN \
47 ((sizeof(spdm_version_response_t) + \
48 (sizeof(spdm_version_number_t) * SPDM_MAX_VERSION_COUNT) + \
49 (sizeof(uint32_t) - 1)) << 2)
50
51/* PCI-SIG Vendor ID */
52#define PSI_SIG_VENDOR_ID 1
53
54/* Data Object Protocols */
55#define DOE_DISC_PROTOCOL 0
56#define CMA_SPDM_PROTOCOL 1
57#define SEC_CMA_SPDM_PROTOCOL 2
58
59#define DOE_HEADER(_type) ((_type << 16) | PSI_SIG_VENDOR_ID)
60
61#define DOE_HEADER_0 DOE_HEADER(DOE_DISC_PROTOCOL)
62#define DOE_HEADER_1 DOE_HEADER(CMA_SPDM_PROTOCOL)
63#define DOE_HEADER_2 DOE_HEADER(SEC_CMA_SPDM_PROTOCOL)
64#define DOE_HEADER_LENGTH 2
65
66/*
67 * SPDM VERSION structure:
68 * bit[15:12] major_version
69 * bit[11:8] minor_version
70 * bit[7:4] update_version_number
71 * bit[3:0] alpha
72 */
73#define SPDM_VER_MAJOR_SHIFT 12
74#define SPDM_VER_MAJOR_WIDTH 4
75#define SPDM_VER_MINOR_SHIFT 8
76#define SPDM_VER_MINOR_WIDTH 4
77#define SPDM_VER_UPDATE_SHIFT 4
78#define SPDM_VER_UPDATE_WIDTH 4
79#define SPDM_VER_ALPHA_SHIFT 0
80#define SPDM_VER_ALPHA_WIDTH 4
81
82/* DOE Discovery */
83typedef struct {
84 uint8_t index;
85 uint8_t reserved[3];
86} pcie_doe_disc_req_t;
87
88typedef struct {
89 uint16_t vendor_id;
90 uint8_t data_object_type;
91 uint8_t next_index;
92} pcie_doe_disc_resp_t;
93
Soby Mathew5929bfe2024-11-28 12:28:00 +000094/* Skip test if DA is not supported in RMI features */
95#define CHECK_DA_SUPPORT_IN_RMI(_reg0) \
96 do { \
97 SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP(); \
98 /* Get feature register0 */ \
99 if (host_rmi_features(0UL, &_reg0) != REALM_SUCCESS) { \
100 ERROR("Failed to get RMI feat_reg0\n"); \
101 return TEST_RESULT_FAIL; \
102 } \
103 \
104 /* DA not supported in RMI features? */ \
105 if ((_reg0 & RMI_FEATURE_REGISTER_0_DA_EN) == 0UL) { \
106 WARN("DA not in RMI features, skipping\n"); \
107 return TEST_RESULT_SKIPPED; \
108 } \
109 } while (false)
110
111#define SKIP_TEST_IF_DOE_NOT_SUPPORTED(_bdf, _doe_cap_base) \
112 do { \
113 /* Test PCIe DOE only for RME */ \
114 if (!get_armv9_2_feat_rme_support()) { \
115 tftf_testcase_printf("FEAT_RME not supported\n"); \
116 return TEST_RESULT_SKIPPED; \
117 } \
118 \
119 pcie_init(); \
120 if (pcie_find_doe_device(&(_bdf), &(_doe_cap_base)) != 0) { \
121 tftf_testcase_printf("PCIe DOE not supported\n"); \
122 return TEST_RESULT_SKIPPED; \
123 } \
124 } while (false)
125
AlexeiFedorov9f0dc012024-09-10 10:22:06 +0100126void print_doe_disc(pcie_doe_disc_resp_t *data);
127int pcie_doe_send_req(uint32_t header, uint32_t bdf, uint32_t doe_cap_base,
128 uint32_t *req_addr, uint32_t req_len);
129int pcie_doe_recv_resp(uint32_t bdf, uint32_t doe_cap_base,
130 uint32_t *resp_addr, uint32_t *resp_len);
Soby Mathew5929bfe2024-11-28 12:28:00 +0000131int pcie_doe_communicate(uint32_t header, uint32_t bdf, uint32_t doe_cap_base, void *req_buf,
132 size_t req_sz, void *rsp_buf, size_t *rsp_sz);
133int pcie_find_doe_device(uint32_t *bdf_ptr, uint32_t *cap_base_ptr);
AlexeiFedorov9f0dc012024-09-10 10:22:06 +0100134
135#endif /* PCIE_DOE_H */