1
2
3
4
5
6
7
8
9
10
11
12
13#include "hpi_internal.h"
14#include "hpimsginit.h"
15#include <linux/nospec.h>
16
17
18static u16 msg_size[HPI_OBJ_MAXINDEX + 1] = HPI_MESSAGE_SIZE_BY_OBJECT;
19
20static u16 res_size[HPI_OBJ_MAXINDEX + 1] = HPI_RESPONSE_SIZE_BY_OBJECT;
21
22static u16 gwSSX2_bypass;
23
24
25
26
27static void hpi_init_message(struct hpi_message *phm, u16 object,
28 u16 function)
29{
30 u16 size;
31
32 if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) {
33 object = array_index_nospec(object, HPI_OBJ_MAXINDEX + 1);
34 size = msg_size[object];
35 } else {
36 size = sizeof(*phm);
37 }
38
39 memset(phm, 0, size);
40 phm->size = size;
41
42 if (gwSSX2_bypass)
43 phm->type = HPI_TYPE_SSX2BYPASS_MESSAGE;
44 else
45 phm->type = HPI_TYPE_REQUEST;
46 phm->object = object;
47 phm->function = function;
48 phm->version = 0;
49 phm->adapter_index = HPI_ADAPTER_INDEX_INVALID;
50
51}
52
53
54
55
56void hpi_init_response(struct hpi_response *phr, u16 object, u16 function,
57 u16 error)
58{
59 u16 size;
60
61 if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) {
62 object = array_index_nospec(object, HPI_OBJ_MAXINDEX + 1);
63 size = res_size[object];
64 } else {
65 size = sizeof(*phr);
66 }
67
68 memset(phr, 0, sizeof(*phr));
69 phr->size = size;
70 phr->type = HPI_TYPE_RESPONSE;
71 phr->object = object;
72 phr->function = function;
73 phr->error = error;
74 phr->specific_error = 0;
75 phr->version = 0;
76}
77
78void hpi_init_message_response(struct hpi_message *phm,
79 struct hpi_response *phr, u16 object, u16 function)
80{
81 hpi_init_message(phm, object, function);
82
83
84 hpi_init_response(phr, object, function,
85 HPI_ERROR_PROCESSING_MESSAGE);
86}
87
88static void hpi_init_messageV1(struct hpi_message_header *phm, u16 size,
89 u16 object, u16 function)
90{
91 memset(phm, 0, size);
92 if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) {
93 phm->size = size;
94 phm->type = HPI_TYPE_REQUEST;
95 phm->object = object;
96 phm->function = function;
97 phm->version = 1;
98
99 }
100}
101
102void hpi_init_responseV1(struct hpi_response_header *phr, u16 size,
103 u16 object, u16 function)
104{
105 (void)object;
106 (void)function;
107 memset(phr, 0, size);
108 phr->size = size;
109 phr->version = 1;
110 phr->type = HPI_TYPE_RESPONSE;
111 phr->error = HPI_ERROR_PROCESSING_MESSAGE;
112}
113
114void hpi_init_message_responseV1(struct hpi_message_header *phm, u16 msg_size,
115 struct hpi_response_header *phr, u16 res_size, u16 object,
116 u16 function)
117{
118 hpi_init_messageV1(phm, msg_size, object, function);
119 hpi_init_responseV1(phr, res_size, object, function);
120}
121