1232809Sjmallett/***********************license start***************
2232809Sjmallett * Copyright (c) 2011  Cavium Inc. (support@cavium.com). All rights
3232809Sjmallett * reserved.
4232809Sjmallett *
5232809Sjmallett *
6232809Sjmallett * Redistribution and use in source and binary forms, with or without
7232809Sjmallett * modification, are permitted provided that the following conditions are
8232809Sjmallett * met:
9232809Sjmallett *
10232809Sjmallett *   * Redistributions of source code must retain the above copyright
11232809Sjmallett *     notice, this list of conditions and the following disclaimer.
12232809Sjmallett *
13232809Sjmallett *   * Redistributions in binary form must reproduce the above
14232809Sjmallett *     copyright notice, this list of conditions and the following
15232809Sjmallett *     disclaimer in the documentation and/or other materials provided
16232809Sjmallett *     with the distribution.
17232809Sjmallett
18232809Sjmallett *   * Neither the name of Cavium Inc. nor the names of
19232809Sjmallett *     its contributors may be used to endorse or promote products
20232809Sjmallett *     derived from this software without specific prior written
21232809Sjmallett *     permission.
22232809Sjmallett
23232809Sjmallett * This Software, including technical data, may be subject to U.S. export  control
24232809Sjmallett * laws, including the U.S. Export Administration Act and its  associated
25232809Sjmallett * regulations, and may be subject to export or import  regulations in other
26232809Sjmallett * countries.
27232809Sjmallett
28232809Sjmallett * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
29232809Sjmallett * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR
30232809Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
31232809Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR
32232809Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM
33232809Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE,
34232809Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF
35232809Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
36232809Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE  RISK ARISING OUT OF USE OR
37232809Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
38232809Sjmallett ***********************license end**************************************/
39232809Sjmallett
40232809Sjmallett
41232809Sjmallett
42232809Sjmallett
43232809Sjmallett
44232809Sjmallett
45232809Sjmallett
46232809Sjmallett/**
47232809Sjmallett * @file
48232809Sjmallett *
49232809Sjmallett * Interface to the CN63XX, CN68XX hardware HFA engine.
50232809Sjmallett *
51232809Sjmallett * <hr>$Revision: 49448 $<hr>
52232809Sjmallett */
53232809Sjmallett
54232809Sjmallett#ifndef __CVMX_HFA_H__
55232809Sjmallett#define __CVMX_HFA_H__
56232809Sjmallett
57232809Sjmallett#ifndef CVMX_BUILD_FOR_LINUX_USER
58232809Sjmallett#include "cvmx-llm.h"
59232809Sjmallett#include "cvmx-wqe.h"
60232809Sjmallett#include "cvmx-fpa.h"
61232809Sjmallett#include "cvmx-bootmem.h"
62232809Sjmallett
63232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
64232809Sjmallett#include <asm/octeon/cvmx.h>
65232809Sjmallett#include <asm/octeon/cvmx-config.h>
66232809Sjmallett
67232809Sjmallett#ifdef CVMX_ENABLE_DFA_FUNCTIONS
68232809Sjmallett/* DFA queue cmd buffers */
69232809Sjmallett
70232809Sjmallett#define CVMX_FPA_DFA_POOL                   (4)             /**< DFA command buffers */
71232809Sjmallett#define CVMX_FPA_DFA_POOL_SIZE              (2 * CVMX_CACHE_LINE_SIZE)
72232809Sjmallett#endif
73232809Sjmallett
74232809Sjmallett#else
75232809Sjmallett#include "executive-config.h"
76232809Sjmallett#ifdef CVMX_ENABLE_DFA_FUNCTIONS
77232809Sjmallett#include "cvmx-config.h"
78232809Sjmallett#endif
79232809Sjmallett#endif
80232809Sjmallett#endif
81232809Sjmallett
82232809Sjmallett#define ENABLE_DEPRECATED   /* Set to enable the old 18/36 bit names */
83232809Sjmallett
84232809Sjmallett#ifdef	__cplusplus
85232809Sjmallettextern "C" {
86232809Sjmallett#endif
87232809Sjmallett
88232809Sjmallett#define	CVMX_DFA_ITYPE_MEMLOAD		0x0
89232809Sjmallett#define	CVMX_DFA_ITYPE_CACHELOAD	0x1
90232809Sjmallett#define	CVMX_DFA_ITYPE_GRAPHFREE	0x3
91232809Sjmallett#define	CVMX_DFA_ITYPE_GRAPHWALK	0x4
92232809Sjmallett
93232809Sjmalletttypedef union {
94232809Sjmallett   uint64_t u64;
95232809Sjmallett   struct {
96232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
97232809Sjmallett      uint64_t size:24;
98232809Sjmallett      uint64_t addr:40;
99232809Sjmallett#else
100232809Sjmallett      uint64_t addr:40;
101232809Sjmallett      uint64_t size:24;
102232809Sjmallett#endif
103232809Sjmallett   } s;
104232809Sjmallett} cvmx_dfa_gather_entry_t;
105232809Sjmallett
106232809Sjmalletttypedef union {
107232809Sjmallett    struct {
108232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
109232809Sjmallett        uint64_t f1:3;
110232809Sjmallett        uint64_t unused1:2;
111232809Sjmallett        uint64_t snode:27;
112232809Sjmallett        uint64_t gather_mode:1;
113232809Sjmallett        uint64_t little_endian:1;
114232809Sjmallett        uint64_t store_full:1;
115232809Sjmallett        uint64_t load_through:1;
116232809Sjmallett        uint64_t small:1;
117232809Sjmallett        uint64_t itype:3;
118232809Sjmallett        uint64_t unused0:2;
119232809Sjmallett        uint64_t mbase:22;
120232809Sjmallett#else
121232809Sjmallett        uint64_t mbase:22;
122232809Sjmallett        uint64_t unused0:2;
123232809Sjmallett        uint64_t itype:3;
124232809Sjmallett        uint64_t small:1;
125232809Sjmallett        uint64_t load_through:1;
126232809Sjmallett        uint64_t store_full:1;
127232809Sjmallett        uint64_t little_endian:1;
128232809Sjmallett        uint64_t gather_mode:1;
129232809Sjmallett        uint64_t snode:27;
130232809Sjmallett        uint64_t unused1:2;
131232809Sjmallett        uint64_t f1:3;
132232809Sjmallett#endif
133232809Sjmallett    } walk;
134232809Sjmallett    struct {
135232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
136232809Sjmallett        uint64_t unused4:7;
137232809Sjmallett        uint64_t dbase:9;
138232809Sjmallett        uint64_t unused3:2;
139232809Sjmallett        uint64_t cbase:14;
140232809Sjmallett        uint64_t gather_mode:1;
141232809Sjmallett        uint64_t little_endian:1;
142232809Sjmallett        uint64_t store_full:1;
143232809Sjmallett        uint64_t load_through:1;
144232809Sjmallett        uint64_t unused2:1;
145232809Sjmallett        uint64_t itype:3;
146232809Sjmallett        uint64_t unused1:6;
147232809Sjmallett        uint64_t dsize:10;
148232809Sjmallett        uint64_t unused0:2;
149232809Sjmallett        uint64_t pgid:6;
150232809Sjmallett#else
151232809Sjmallett        uint64_t pgid:6;
152232809Sjmallett        uint64_t unused0:2;
153232809Sjmallett        uint64_t dsize:10;
154232809Sjmallett        uint64_t unused1:6;
155232809Sjmallett        uint64_t itype:3;
156232809Sjmallett        uint64_t unused2:1;
157232809Sjmallett        uint64_t load_through:1;
158232809Sjmallett        uint64_t store_full:1;
159232809Sjmallett        uint64_t little_endian:1;
160232809Sjmallett        uint64_t gather_mode:1;
161232809Sjmallett        uint64_t cbase:14;
162232809Sjmallett        uint64_t unused3:2;
163232809Sjmallett        uint64_t dbase:9;
164232809Sjmallett        uint64_t unused4:7;
165232809Sjmallett#endif
166232809Sjmallett    } cload;
167232809Sjmallett    struct {
168232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
169232809Sjmallett        uint64_t unused2:32;
170232809Sjmallett        uint64_t gather_mode:1;
171232809Sjmallett        uint64_t little_endian:1;
172232809Sjmallett        uint64_t store_full:1;
173232809Sjmallett        uint64_t load_through:1;
174232809Sjmallett        uint64_t unused1:1;
175232809Sjmallett        uint64_t itype:3;
176232809Sjmallett        uint64_t unused0:2;
177232809Sjmallett        uint64_t mbase:22;
178232809Sjmallett#else
179232809Sjmallett        uint64_t mbase:22;
180232809Sjmallett        uint64_t unused0:2;
181232809Sjmallett        uint64_t itype:3;
182232809Sjmallett        uint64_t unused1:1;
183232809Sjmallett        uint64_t load_through:1;
184232809Sjmallett        uint64_t store_full:1;
185232809Sjmallett        uint64_t little_endian:1;
186232809Sjmallett        uint64_t gather_mode:1;
187232809Sjmallett        uint64_t unused2:32;
188232809Sjmallett#endif
189232809Sjmallett    } mload;
190232809Sjmallett    struct {
191232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
192232809Sjmallett        uint64_t unused2:34;
193232809Sjmallett        uint64_t store_full:1;
194232809Sjmallett        uint64_t unused1:2;
195232809Sjmallett        uint64_t itype:3;
196232809Sjmallett        uint64_t unused0:24;
197232809Sjmallett#else
198232809Sjmallett        uint64_t unused0:24;
199232809Sjmallett        uint64_t itype:3;
200232809Sjmallett        uint64_t unused1:2;
201232809Sjmallett        uint64_t store_full:1;
202232809Sjmallett        uint64_t unused2:34;
203232809Sjmallett#endif
204232809Sjmallett    } free;
205232809Sjmallett} cvmx_dfa_word0_t;
206232809Sjmallett
207232809Sjmalletttypedef union {
208232809Sjmallett    struct {
209232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
210232809Sjmallett        uint64_t rmax:16;
211232809Sjmallett        uint64_t f2:8;
212232809Sjmallett        uint64_t rptr:40;
213232809Sjmallett#else
214232809Sjmallett        uint64_t rptr:40;
215232809Sjmallett        uint64_t f2:8;
216232809Sjmallett        uint64_t rmax:16;
217232809Sjmallett#endif
218232809Sjmallett    } walk;
219232809Sjmallett    struct {
220232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
221232809Sjmallett        uint64_t unused1:13;
222232809Sjmallett        uint64_t rmax:3;
223232809Sjmallett        uint64_t unused0:8;
224232809Sjmallett        uint64_t rptr:40;
225232809Sjmallett#else
226232809Sjmallett        uint64_t rptr:40;
227232809Sjmallett        uint64_t unused0:8;
228232809Sjmallett        uint64_t rmax:3;
229232809Sjmallett        uint64_t unused1:13;
230232809Sjmallett#endif
231232809Sjmallett    } cload;
232232809Sjmallett    struct {
233232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
234232809Sjmallett        uint64_t unused1:4;
235232809Sjmallett        uint64_t rmax:12;
236232809Sjmallett        uint64_t unused0:8;
237232809Sjmallett        uint64_t rptr:40;
238232809Sjmallett#else
239232809Sjmallett        uint64_t rptr:40;
240232809Sjmallett        uint64_t unused0:8;
241232809Sjmallett        uint64_t rmax:12;
242232809Sjmallett        uint64_t unused1:4;
243232809Sjmallett#endif
244232809Sjmallett    } mload;
245232809Sjmallett    struct {
246232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
247232809Sjmallett        uint64_t unused:24;
248232809Sjmallett        uint64_t rptr:40;
249232809Sjmallett#else
250232809Sjmallett        uint64_t rptr:40;
251232809Sjmallett        uint64_t unused:24;
252232809Sjmallett#endif
253232809Sjmallett    } free;
254232809Sjmallett} cvmx_dfa_word1_t;
255232809Sjmallett
256232809Sjmalletttypedef union {
257232809Sjmallett    struct {
258232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
259232809Sjmallett        uint64_t dlen:16;
260232809Sjmallett		uint64_t srepl:2;
261232809Sjmallett        uint64_t unused:2;
262232809Sjmallett        uint64_t clmsk:4;
263232809Sjmallett        uint64_t dptr:40;
264232809Sjmallett#else
265232809Sjmallett        uint64_t dptr:40;
266232809Sjmallett        uint64_t clmsk:4;
267232809Sjmallett        uint64_t unused:2;
268232809Sjmallett		uint64_t srepl:2;
269232809Sjmallett        uint64_t dlen:16;
270232809Sjmallett#endif
271232809Sjmallett    } walk;
272232809Sjmallett    struct {
273232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
274232809Sjmallett        uint64_t dlen:16;
275232809Sjmallett        uint64_t unused:4;
276232809Sjmallett        uint64_t clmsk:4;
277232809Sjmallett        uint64_t dptr:40;
278232809Sjmallett#else
279232809Sjmallett        uint64_t dptr:40;
280232809Sjmallett        uint64_t clmsk:4;
281232809Sjmallett        uint64_t unused:4;
282232809Sjmallett        uint64_t dlen:16;
283232809Sjmallett#endif
284232809Sjmallett    } cload;
285232809Sjmallett    struct {
286232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
287232809Sjmallett        uint64_t dlen:16;
288232809Sjmallett        uint64_t repl:2;
289232809Sjmallett        uint64_t unused:2;
290232809Sjmallett        uint64_t clmsk:4;
291232809Sjmallett        uint64_t dptr:40;
292232809Sjmallett#else
293232809Sjmallett        uint64_t dptr:40;
294232809Sjmallett        uint64_t clmsk:4;
295232809Sjmallett        uint64_t unused:2;
296232809Sjmallett        uint64_t repl:2;
297232809Sjmallett        uint64_t dlen:16;
298232809Sjmallett#endif
299232809Sjmallett    } mload;
300232809Sjmallett    struct {
301232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
302232809Sjmallett        uint64_t unused1:20;
303232809Sjmallett        uint64_t clmsk:4;
304232809Sjmallett        uint64_t unused0:40;
305232809Sjmallett#else
306232809Sjmallett        uint64_t unused0:40;
307232809Sjmallett        uint64_t clmsk:4;
308232809Sjmallett        uint64_t unused1:20;
309232809Sjmallett#endif
310232809Sjmallett    } free;
311232809Sjmallett} cvmx_dfa_word2_t;
312232809Sjmallett
313232809Sjmalletttypedef union {
314232809Sjmallett    struct {
315232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
316232809Sjmallett        uint64_t unused1:2;
317232809Sjmallett        uint64_t vgid:8;
318232809Sjmallett        uint64_t unused0:5;
319232809Sjmallett        uint64_t f3:9;
320232809Sjmallett        uint64_t wqptr:40;
321232809Sjmallett#else
322232809Sjmallett        uint64_t wqptr:40;
323232809Sjmallett        uint64_t f3:9;
324232809Sjmallett        uint64_t unused0:5;
325232809Sjmallett        uint64_t vgid:8;
326232809Sjmallett        uint64_t unused1:2;
327232809Sjmallett#endif
328232809Sjmallett    } walk;
329232809Sjmallett    struct {
330232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
331232809Sjmallett        uint64_t unused1:2;
332232809Sjmallett        uint64_t vgid:8;
333232809Sjmallett        uint64_t unused0:7;
334232809Sjmallett        uint64_t f4:7;
335232809Sjmallett        uint64_t wqptr:40;
336232809Sjmallett#else
337232809Sjmallett        uint64_t wqptr:40;
338232809Sjmallett        uint64_t f4:7;
339232809Sjmallett        uint64_t unused0:7;
340232809Sjmallett        uint64_t vgid:8;
341232809Sjmallett        uint64_t unused1:2;
342232809Sjmallett#endif
343232809Sjmallett    } cload;
344232809Sjmallett    struct {
345232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
346232809Sjmallett        uint64_t unused1:2;
347232809Sjmallett        uint64_t vgid:8;
348232809Sjmallett        uint64_t unused0:7;
349232809Sjmallett        uint64_t f4:7;
350232809Sjmallett        uint64_t wqptr:40;
351232809Sjmallett#else
352232809Sjmallett        uint64_t wqptr:40;
353232809Sjmallett        uint64_t f4:7;
354232809Sjmallett        uint64_t unused0:7;
355232809Sjmallett        uint64_t vgid:8;
356232809Sjmallett        uint64_t unused1:2;
357232809Sjmallett#endif
358232809Sjmallett    } mload;
359232809Sjmallett    struct {
360232809Sjmallett#ifdef __BIG_ENDIAN_BITFIELD
361232809Sjmallett        uint64_t unused1:2;
362232809Sjmallett        uint64_t vgid:8;
363232809Sjmallett        uint64_t unused0:14;
364232809Sjmallett        uint64_t wqptr:40;
365232809Sjmallett#else
366232809Sjmallett        uint64_t wqptr:40;
367232809Sjmallett        uint64_t unused0:14;
368232809Sjmallett        uint64_t vgid:8;
369232809Sjmallett        uint64_t unused1:2;
370232809Sjmallett#endif
371232809Sjmallett    } free;
372232809Sjmallett} cvmx_dfa_word3_t;
373232809Sjmallett
374232809Sjmalletttypedef union {
375232809Sjmallett    uint64_t u64[4];
376232809Sjmallett    struct {
377232809Sjmallett        cvmx_dfa_word0_t word0;
378232809Sjmallett        cvmx_dfa_word1_t word1;
379232809Sjmallett        cvmx_dfa_word2_t word2;
380232809Sjmallett        cvmx_dfa_word3_t word3;
381232809Sjmallett    };
382232809Sjmallett} cvmx_dfa_command_t;
383232809Sjmallett
384232809Sjmallett#ifdef CVMX_ENABLE_DFA_FUNCTIONS
385232809Sjmallett/**
386232809Sjmallett * Initialize the DFA hardware before use
387232809Sjmallett * Returns 0 on success, -1 on failure
388232809Sjmallett */
389232809Sjmallettint cvmx_hfa_initialize(void);
390232809Sjmallett
391232809Sjmallett
392232809Sjmallett/**
393232809Sjmallett * Shutdown and cleanup resources used by the DFA
394232809Sjmallett */
395232809Sjmallettint cvmx_hfa_shutdown(void);
396232809Sjmallett
397232809Sjmallett/**
398232809Sjmallett * Submit a command to the HFA block
399232809Sjmallett *
400232809Sjmallett * @param command HFA command to submit
401232809Sjmallett *
402232809Sjmallett * @return Zero on success, negative on failure
403232809Sjmallett */
404232809Sjmallettint cvmx_hfa_submit(cvmx_dfa_command_t *command);
405232809Sjmallett
406232809Sjmallett/**
407232809Sjmallett * Allocate a block of memory from the free list that was passed
408232809Sjmallett * to the application by the bootloader.
409232809Sjmallett *
410232809Sjmallett * @param size      Size in bytes of block to allocate
411232809Sjmallett * @param alignment Alignment required - must be power of 2
412232809Sjmallett *
413232809Sjmallett *  @return pointer to block of memory, NULL on error
414232809Sjmallett */
415232809Sjmallett
416232809Sjmallettvoid *hfa_bootmem_alloc (uint64_t size, uint64_t alignment);
417232809Sjmallett
418232809Sjmallett/**
419232809Sjmallett * Frees a block to the bootmem allocator list.
420232809Sjmallett *
421232809Sjmallett * @param ptr  	   address of block  (memory pointer (void*))
422232809Sjmallett * @param size     size of block in bytes.
423232809Sjmallett *
424232809Sjmallett * @return 1 on success,
425232809Sjmallett *         0 on failure
426232809Sjmallett *
427232809Sjmallett */
428232809Sjmallett
429232809Sjmallettint  hfa_bootmem_free (void *ptr, uint64_t size);
430232809Sjmallett
431232809Sjmallett#endif
432232809Sjmallett
433232809Sjmallett#ifdef	__cplusplus
434232809Sjmallett}
435232809Sjmallett#endif
436232809Sjmallett
437232809Sjmallett#endif /* __CVMX_HFA_H__ */
438