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