1 |
49 |
magro732 |
/*******************************************************************************
|
2 |
|
|
*
|
3 |
|
|
* RapidIO IP Library Core
|
4 |
|
|
*
|
5 |
|
|
* This file is part of the RapidIO IP library project
|
6 |
|
|
* http://www.opencores.org/cores/rio/
|
7 |
|
|
*
|
8 |
|
|
* Description:
|
9 |
|
|
* This file contains the public API for riopacket.
|
10 |
|
|
*
|
11 |
|
|
* To Do:
|
12 |
|
|
* -
|
13 |
|
|
*
|
14 |
|
|
* Author(s):
|
15 |
|
|
* - Magnus Rosenius, magro732@opencores.org
|
16 |
|
|
*
|
17 |
|
|
*******************************************************************************
|
18 |
|
|
*
|
19 |
|
|
* Copyright (C) 2015 Authors and OPENCORES.ORG
|
20 |
|
|
*
|
21 |
|
|
* This source file may be used and distributed without
|
22 |
|
|
* restriction provided that this copyright statement is not
|
23 |
|
|
* removed from the file and that any derivative work contains
|
24 |
|
|
* the original copyright notice and the associated disclaimer.
|
25 |
|
|
*
|
26 |
|
|
* This source file is free software; you can redistribute it
|
27 |
|
|
* and/or modify it under the terms of the GNU Lesser General
|
28 |
|
|
* Public License as published by the Free Software Foundation;
|
29 |
|
|
* either version 2.1 of the License, or (at your option) any
|
30 |
|
|
* later version.
|
31 |
|
|
*
|
32 |
|
|
* This source is distributed in the hope that it will be
|
33 |
|
|
* useful, but WITHOUT ANY WARRANTY; without even the implied
|
34 |
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
35 |
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
36 |
|
|
* details.
|
37 |
|
|
*
|
38 |
|
|
* You should have received a copy of the GNU Lesser General
|
39 |
|
|
* Public License along with this source; if not, download it
|
40 |
|
|
* from http://www.opencores.org/lgpl.shtml
|
41 |
|
|
*
|
42 |
|
|
*******************************************************************************/
|
43 |
|
|
|
44 |
|
|
/**
|
45 |
|
|
* \file riopacket.c
|
46 |
|
|
*/
|
47 |
|
|
|
48 |
|
|
#ifndef __RIOPACKET_H
|
49 |
|
|
#define __RIOPACKET_H
|
50 |
|
|
|
51 |
|
|
/*******************************************************************************
|
52 |
|
|
* Includes
|
53 |
|
|
*******************************************************************************/
|
54 |
|
|
|
55 |
|
|
#include "rioconfig.h"
|
56 |
|
|
|
57 |
|
|
|
58 |
|
|
/*******************************************************************************
|
59 |
|
|
* Global typedefs
|
60 |
|
|
*******************************************************************************/
|
61 |
|
|
|
62 |
|
|
/* The maximum size of a RapidIO packet in words (32-bit). */
|
63 |
|
|
#define RIOPACKET_SIZE_MIN 3u
|
64 |
|
|
#define RIOPACKET_SIZE_MAX 69u
|
65 |
|
|
|
66 |
|
|
/* Configuration space offsets. */
|
67 |
|
|
#define DEVICE_IDENTITY_CAR ((uint32_t)0x00000000ul)
|
68 |
|
|
#define DEVICE_INFORMATION_CAR ((uint32_t)0x00000004ul)
|
69 |
|
|
#define ASSEMBLY_IDENTITY_CAR ((uint32_t)0x00000008ul)
|
70 |
|
|
#define ASSEMBLY_INFORMATION_CAR ((uint32_t)0x0000000cul)
|
71 |
|
|
#define PROCESSING_ELEMENT_FEATURES_CAR ((uint32_t)0x00000010ul)
|
72 |
|
|
#define SWITCH_PORT_INFORMATION_CAR ((uint32_t)0x00000014ul)
|
73 |
|
|
#define SOURCE_OPERATIONS_CAR ((uint32_t)0x00000018ul)
|
74 |
|
|
#define DESTINATION_OPERATIONS_CAR ((uint32_t)0x0000001cul)
|
75 |
|
|
#define SWITCH_ROUTE_TABLE_DESTINATION_ID_LIMIT_CAR ((uint32_t)0x00000034ul)
|
76 |
|
|
#define PROCESSING_ELEMENT_LOGICAL_LAYER_CONTROL_CSR ((uint32_t)0x0000004cul)
|
77 |
|
|
#define BASE_DEVICE_ID_CSR ((uint32_t)0x00000060ul)
|
78 |
|
|
#define HOST_BASE_DEVICE_ID_LOCK_CSR ((uint32_t)0x00000068ul)
|
79 |
|
|
#define COMPONENT_TAG_CSR ((uint32_t)0x0000006cul)
|
80 |
|
|
#define STANDARD_ROUTE_CONFIGURATION_DESTINATION_ID_SELECT_CSR ((uint32_t)0x00000070ul)
|
81 |
|
|
#define STANDARD_ROUTE_CONFIGURATION_PORT_SELECT_CSR ((uint32_t)0x00000074ul)
|
82 |
|
|
#define STANDARD_ROUTE_DEFAULT_PORT_CSR ((uint32_t)0x00000078ul)
|
83 |
|
|
#define EXTENDED_FEATURES_OFFSET ((uint32_t)0x00000100ul)
|
84 |
|
|
#define IMPLEMENTATION_DEFINED_OFFSET ((uint32_t)0x00010000ul)
|
85 |
|
|
#define LP_SERIAL_REGISTER_BLOCK_HEADER(offset) (offset)
|
86 |
|
|
#define PORT_LINK_TIMEOUT_CONTROL_CSR(offset) ((offset) + 0x00000020ul)
|
87 |
|
|
#define PORT_RESPONSE_TIMEOUT_CONTROL_CSR(offset) ((offset) + 0x00000024ul)
|
88 |
|
|
#define PORT_GENERAL_CONTROL_CSR(offset) ((offset) + 0x0000003cul)
|
89 |
|
|
#define PORT_N_LOCAL_ACKID_CSR(offset, n) ((offset) + (0x00000048ul+((n)*0x00000020ul)))
|
90 |
|
|
#define PORT_N_ERROR_AND_STATUS_CSR(offset, n) ((offset) + (0x00000058ul+((n)*0x00000020ul)))
|
91 |
|
|
#define PORT_N_CONTROL_CSR(offset, n) ((offset) + (0x0000005cul+((n)*0x00000020ul)))
|
92 |
|
|
|
93 |
|
|
/* Packet ftype constants. */
|
94 |
|
|
#define RIOPACKET_FTYPE_REQUEST 0x2
|
95 |
|
|
#define RIOPACKET_FTYPE_WRITE 0x5
|
96 |
|
|
#define RIOPACKET_FTYPE_MAINTENANCE 0x8
|
97 |
|
|
#define RIOPACKET_FTYPE_DOORBELL 0xa
|
98 |
|
|
#define RIOPACKET_FTYPE_MESSAGE 0xb
|
99 |
|
|
#define RIOPACKET_FTYPE_RESPONSE 0xd
|
100 |
|
|
|
101 |
|
|
/* Transaction constants. */
|
102 |
|
|
#define RIOPACKET_TRANSACTION_MAINT_READ_REQUEST 0ul
|
103 |
|
|
#define RIOPACKET_TRANSACTION_MAINT_WRITE_REQUEST 1ul
|
104 |
|
|
#define RIOPACKET_TRANSACTION_MAINT_READ_RESPONSE 2ul
|
105 |
|
|
#define RIOPACKET_TRANSACTION_MAINT_WRITE_RESPONSE 3ul
|
106 |
|
|
#define RIOPACKET_TRANSACTION_MAINT_PORT_WRITE_REQUEST 4ul
|
107 |
|
|
#define RIOPACKET_TRANSACTION_WRITE_NWRITE 4ul
|
108 |
|
|
#define RIOPACKET_TRANSACTION_WRITE_NWRITER 5ul
|
109 |
|
|
#define RIOPACKET_TRANSACTION_REQUEST_NREAD 4ul
|
110 |
|
|
#define RIOPACKET_TRANSACTION_RESPONSE_NO_PAYLOAD 0ul
|
111 |
|
|
#define RIOPACKET_TRANSACTION_RESPONSE_MESSAGE_RESPONSE 1ul
|
112 |
|
|
#define RIOPACKET_TRANSACTION_RESPONSE_WITH_PAYLOAD 8ul
|
113 |
|
|
|
114 |
|
|
/* Response status constants. */
|
115 |
|
|
#define RIOPACKET_RESPONSE_STATUS_DONE 0ul
|
116 |
|
|
#define RIOPACKET_RESPONSE_STATUS_RETRY 3ul
|
117 |
|
|
#define RIOPACKET_RESPONSE_STATUS_ERROR 7ul
|
118 |
|
|
|
119 |
|
|
|
120 |
|
|
/* The structure containing a RapidIO packet. */
|
121 |
|
|
typedef struct
|
122 |
|
|
{
|
123 |
|
|
/* Size in words. */
|
124 |
|
|
uint8_t size;
|
125 |
|
|
uint32_t payload[RIOPACKET_SIZE_MAX];
|
126 |
|
|
} RioPacket_t;
|
127 |
|
|
|
128 |
|
|
|
129 |
|
|
|
130 |
|
|
/*******************************************************************************
|
131 |
|
|
* Global function prototypes
|
132 |
|
|
*******************************************************************************/
|
133 |
|
|
|
134 |
|
|
void RIOPACKET_init(RioPacket_t *packet);
|
135 |
|
|
uint8_t RIOPACKET_size(RioPacket_t *packet);
|
136 |
|
|
void RIOPACKET_append(RioPacket_t *packet, uint32_t word);
|
137 |
|
|
|
138 |
|
|
int RIOPACKET_valid(RioPacket_t *packet);
|
139 |
|
|
|
140 |
|
|
int RIOPACKET_serialize(RioPacket_t *packet, const uint16_t size, uint8_t *buffer);
|
141 |
|
|
int RIOPACKET_deserialize(RioPacket_t *packet, const uint16_t size, const uint8_t *buffer);
|
142 |
|
|
|
143 |
|
|
#ifdef ENABLE_TOSTRING
|
144 |
|
|
#include <stdio.h>
|
145 |
|
|
void RIOPACKET_toString(RioPacket_t *packet, char *buffer);
|
146 |
|
|
#endif
|
147 |
|
|
|
148 |
|
|
uint8_t RIOPACKET_getFtype(RioPacket_t *packet);
|
149 |
|
|
uint16_t RIOPACKET_getDestination(RioPacket_t *packet);
|
150 |
|
|
uint16_t RIOPACKET_getSource(RioPacket_t *packet);
|
151 |
|
|
uint8_t RIOPACKET_getTransaction(RioPacket_t *packet);
|
152 |
|
|
uint8_t RIOPACKET_getTid(RioPacket_t *packet);
|
153 |
|
|
|
154 |
|
|
void RIOPACKET_setMaintReadRequest(RioPacket_t *packet,
|
155 |
|
|
uint16_t destId, uint16_t srcId, uint8_t hop,
|
156 |
|
|
uint8_t tid, uint32_t offset);
|
157 |
|
|
void RIOPACKET_getMaintReadRequest(RioPacket_t *packet,
|
158 |
|
|
uint16_t *destId, uint16_t *srcId, uint8_t *hop,
|
159 |
|
|
uint8_t *tid, uint32_t *offset);
|
160 |
|
|
|
161 |
|
|
void RIOPACKET_setMaintReadResponse(RioPacket_t *packet,
|
162 |
|
|
uint16_t destId, uint16_t srcId,
|
163 |
|
|
uint8_t tid, uint32_t data);
|
164 |
|
|
void RIOPACKET_getMaintReadResponse(RioPacket_t *packet,
|
165 |
|
|
uint16_t *destId, uint16_t *srcId,
|
166 |
|
|
uint8_t *tid, uint32_t *data);
|
167 |
|
|
|
168 |
|
|
void RIOPACKET_setMaintWriteRequest(RioPacket_t *packet,
|
169 |
|
|
uint16_t destId, uint16_t srcId, uint8_t hop,
|
170 |
|
|
uint8_t tid, uint32_t offset, uint32_t data);
|
171 |
|
|
void RIOPACKET_getMaintWriteRequest(RioPacket_t *packet,
|
172 |
|
|
uint16_t *destId, uint16_t *srcId, uint8_t *hop,
|
173 |
|
|
uint8_t *tid, uint32_t *offset, uint32_t *data);
|
174 |
|
|
|
175 |
|
|
void RIOPACKET_setMaintWriteResponse(RioPacket_t *packet,
|
176 |
|
|
uint16_t destId, uint16_t srcId,
|
177 |
|
|
uint8_t tid);
|
178 |
|
|
void RIOPACKET_getMaintWriteResponse(RioPacket_t *packet,
|
179 |
|
|
uint16_t *destId, uint16_t *srcId,
|
180 |
|
|
uint8_t *tid);
|
181 |
|
|
|
182 |
|
|
void RIOPACKET_setMaintPortWrite(RioPacket_t *packet,
|
183 |
|
|
uint16_t destId, uint16_t srcId,
|
184 |
|
|
uint32_t componentTag, uint32_t portErrorDetect,
|
185 |
|
|
uint32_t implementationSpecific, uint8_t portId,
|
186 |
|
|
uint32_t logicalTransportErrorDetect);
|
187 |
|
|
void RIOPACKET_getMaintPortWrite(RioPacket_t *packet,
|
188 |
|
|
uint16_t *destId, uint16_t *srcId,
|
189 |
|
|
uint32_t *componentTag, uint32_t *portErrorDetect,
|
190 |
|
|
uint32_t *implementationSpecific, uint8_t *portId,
|
191 |
|
|
uint32_t *logicalTransportErrorDetect);
|
192 |
|
|
|
193 |
|
|
void RIOPACKET_setNwrite(RioPacket_t *packet,
|
194 |
|
|
uint16_t destId, uint16_t srcId,
|
195 |
|
|
uint32_t address, uint16_t payloadSize, uint8_t *payload);
|
196 |
|
|
void RIOPACKET_getNwrite(RioPacket_t *packet,
|
197 |
|
|
uint16_t *destId, uint16_t *srcId,
|
198 |
|
|
uint32_t *address, uint16_t *payloadSize, uint8_t *payload);
|
199 |
|
|
|
200 |
|
|
void RIOPACKET_setNwriteR(RioPacket_t *packet,
|
201 |
|
|
uint16_t destId, uint16_t srcId,
|
202 |
|
|
uint8_t tid,
|
203 |
|
|
uint32_t address, uint16_t payloadSize, uint8_t *payload);
|
204 |
|
|
void RIOPACKET_getNwriteR(RioPacket_t *packet,
|
205 |
|
|
uint16_t *destId, uint16_t *srcId,
|
206 |
|
|
uint8_t *tid,
|
207 |
|
|
uint32_t *address, uint16_t *payloadSize, uint8_t *payload);
|
208 |
|
|
|
209 |
|
|
void RIOPACKET_setNread(RioPacket_t *packet,
|
210 |
|
|
uint16_t destId, uint16_t srcId,
|
211 |
|
|
uint8_t tid,
|
212 |
|
|
uint32_t address, uint16_t payloadSize);
|
213 |
|
|
void RIOPACKET_getNread(RioPacket_t *packet,
|
214 |
|
|
uint16_t *destId, uint16_t *srcId,
|
215 |
|
|
uint8_t *tid,
|
216 |
|
|
uint32_t *address, uint16_t *payloadSize);
|
217 |
|
|
|
218 |
|
|
|
219 |
|
|
void RIOPACKET_setDoorbell(RioPacket_t *packet,
|
220 |
|
|
uint16_t destId, uint16_t srcId,
|
221 |
|
|
uint8_t tid, uint16_t info);
|
222 |
|
|
void RIOPACKET_getDoorbell(RioPacket_t *packet,
|
223 |
|
|
uint16_t *destId, uint16_t *srcId,
|
224 |
|
|
uint8_t *tid, uint16_t *info);
|
225 |
|
|
|
226 |
|
|
void RIOPACKET_setMessage(RioPacket_t *packet,
|
227 |
|
|
uint16_t destId, uint16_t srcId,
|
228 |
|
|
uint8_t mailbox,
|
229 |
|
|
uint16_t size, uint8_t *payload);
|
230 |
|
|
void RIOPACKET_getMessage(RioPacket_t *packet,
|
231 |
|
|
uint16_t *destId, uint16_t *srcId,
|
232 |
|
|
uint8_t *mailbox,
|
233 |
|
|
uint16_t *size, uint8_t *payload);
|
234 |
|
|
|
235 |
|
|
|
236 |
|
|
void RIOPACKET_setResponseNoPayload(RioPacket_t *packet,
|
237 |
|
|
uint16_t destId, uint16_t srcId,
|
238 |
|
|
uint8_t tid, uint8_t status);
|
239 |
|
|
void RIOPACKET_getResponseNoPayload(RioPacket_t *packet,
|
240 |
|
|
uint16_t *destId, uint16_t *srcId,
|
241 |
|
|
uint8_t *tid, uint8_t *status);
|
242 |
|
|
|
243 |
|
|
void RIOPACKET_setResponseWithPayload(RioPacket_t *packet,
|
244 |
|
|
uint16_t destId, uint16_t srcId,
|
245 |
|
|
uint8_t tid, uint8_t offset,
|
246 |
|
|
uint16_t size, uint8_t *payload);
|
247 |
|
|
void RIOPACKET_getResponseWithPayload(RioPacket_t *packet,
|
248 |
|
|
uint16_t *destId, uint16_t *srcId,
|
249 |
|
|
uint8_t *tid, uint8_t offset,
|
250 |
|
|
uint16_t *size, uint8_t *payload);
|
251 |
|
|
|
252 |
|
|
void RIOPACKET_setResponseMessage(RioPacket_t *packet,
|
253 |
|
|
uint16_t destId, uint16_t srcId,
|
254 |
|
|
uint8_t mailbox, uint8_t status);
|
255 |
|
|
void RIOPACKET_getResponseMessage(RioPacket_t *packet,
|
256 |
|
|
uint16_t *destId, uint16_t *srcId,
|
257 |
|
|
uint8_t *mailbox, uint8_t *status);
|
258 |
|
|
|
259 |
|
|
uint16_t RIOPACKET_Crc16( const uint16_t data, const uint16_t crc);
|
260 |
|
|
uint16_t RIOPACKET_Crc32( const uint32_t data, uint16_t crc);
|
261 |
|
|
|
262 |
|
|
uint32_t RIOPACKET_getReadPacketSize(uint32_t address, uint32_t size);
|
263 |
|
|
uint32_t RIOPACKET_getWritePacketSize(uint32_t address, uint32_t size);
|
264 |
|
|
|
265 |
|
|
#endif
|
266 |
|
|
|
267 |
|
|
/*************************** end of file **************************************/
|