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 * Support library for the CN63XX, CN68XX hardware HFA engine.
50232809Sjmallett *
51232809Sjmallett */
52232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
53232809Sjmallett#include <asm/octeon/cvmx.h>
54232809Sjmallett#include <asm/octeon/cvmx-config.h>
55232809Sjmallett#include <asm/octeon/cvmx-pko.h>
56232809Sjmallett#include <asm/octeon/cvmx-helper.h>
57232809Sjmallett#include <asm/octeon/cvmx-clock.h>
58232809Sjmallett#include <asm/octeon/cvmx-dfa-defs.h>
59232809Sjmallett#include <asm/octeon/cvmx-hfa.h>
60232809Sjmallett#else
61232809Sjmallett#include "executive-config.h"
62232809Sjmallett#ifdef CVMX_ENABLE_DFA_FUNCTIONS
63232809Sjmallett
64232809Sjmallett#include "cvmx-config.h"
65232809Sjmallett#include "cvmx.h"
66232809Sjmallett#include "cvmx-fau.h"
67232809Sjmallett#include "cvmx-cmd-queue.h"
68232809Sjmallett#include "cvmx-hfa.h"
69232809Sjmallett#endif
70232809Sjmallett#endif
71232809Sjmallett
72232809Sjmallett#ifdef CVMX_ENABLE_DFA_FUNCTIONS
73232809Sjmallett
74232809Sjmallett/**
75232809Sjmallett * Initialize the DFA block
76232809Sjmallett *
77232809Sjmallett * @return Zero on success, negative on failure
78232809Sjmallett */
79232809Sjmallettint cvmx_hfa_initialize(void)
80232809Sjmallett{
81232809Sjmallett    cvmx_dfa_difctl_t control;
82232809Sjmallett    cvmx_cmd_queue_result_t result;
83232809Sjmallett    void *initial_base_address;
84232809Sjmallett    int cmdsize;
85232809Sjmallett
86232809Sjmallett    cmdsize = ((CVMX_FPA_DFA_POOL_SIZE - 8) / sizeof (cvmx_dfa_command_t)) *
87232809Sjmallett        sizeof (cvmx_dfa_command_t);
88232809Sjmallett    result = cvmx_cmd_queue_initialize(CVMX_CMD_QUEUE_DFA, 0,
89232809Sjmallett                                       CVMX_FPA_DFA_POOL, cmdsize + 8);
90232809Sjmallett    if (result != CVMX_CMD_QUEUE_SUCCESS)
91232809Sjmallett        return -1;
92232809Sjmallett
93232809Sjmallett    control.u64 = 0;
94232809Sjmallett    control.s.dwbcnt = CVMX_FPA_DFA_POOL_SIZE / 128;
95232809Sjmallett    control.s.pool = CVMX_FPA_DFA_POOL;
96232809Sjmallett    control.s.size = cmdsize / sizeof(cvmx_dfa_command_t);
97232809Sjmallett    CVMX_SYNCWS;
98232809Sjmallett    cvmx_write_csr(CVMX_DFA_DIFCTL, control.u64);
99232809Sjmallett    initial_base_address = cvmx_cmd_queue_buffer(CVMX_CMD_QUEUE_DFA);
100232809Sjmallett    CVMX_SYNCWS;
101232809Sjmallett    cvmx_write_csr(CVMX_DFA_DIFRDPTR, cvmx_ptr_to_phys(initial_base_address));
102232809Sjmallett    cvmx_read_csr(CVMX_DFA_DIFRDPTR); /* Read to make sure setup is complete */
103232809Sjmallett    return 0;
104232809Sjmallett}
105232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
106232809SjmallettEXPORT_SYMBOL(cvmx_hfa_initialize);
107232809Sjmallett#endif
108232809Sjmallett
109232809Sjmallett/**
110232809Sjmallett * Shutdown the DFA block. DFA must be idle when
111232809Sjmallett * this function is called.
112232809Sjmallett *
113232809Sjmallett * @return Zero on success, negative on failure
114232809Sjmallett */
115232809Sjmallettint cvmx_hfa_shutdown(void)
116232809Sjmallett{
117232809Sjmallett    if (cvmx_cmd_queue_length(CVMX_CMD_QUEUE_DFA))
118232809Sjmallett    {
119232809Sjmallett        cvmx_dprintf("ERROR: cvmx_hfa_shutdown: DFA not idle.\n");
120232809Sjmallett        return -1;
121232809Sjmallett    }
122232809Sjmallett    cvmx_cmd_queue_shutdown(CVMX_CMD_QUEUE_DFA);
123232809Sjmallett    return 0;
124232809Sjmallett}
125232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
126232809SjmallettEXPORT_SYMBOL(cvmx_hfa_shutdown);
127232809Sjmallett#endif
128232809Sjmallett
129232809Sjmallett/**
130232809Sjmallett * Submit a command to the DFA block
131232809Sjmallett *
132232809Sjmallett * @param command DFA command to submit
133232809Sjmallett *
134232809Sjmallett * @return Zero on success, negative on failure
135232809Sjmallett */
136232809Sjmallettint cvmx_hfa_submit(cvmx_dfa_command_t *command)
137232809Sjmallett{
138232809Sjmallett    cvmx_cmd_queue_result_t result = cvmx_cmd_queue_write(CVMX_CMD_QUEUE_DFA, 1, 4, command->u64);
139232809Sjmallett    if (result == CVMX_CMD_QUEUE_SUCCESS)
140232809Sjmallett        cvmx_write_csr(CVMX_DFA_DBELL, 1);
141232809Sjmallett    return result;
142232809Sjmallett}
143232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
144232809SjmallettEXPORT_SYMBOL(cvmx_hfa_submit);
145232809Sjmallett#endif
146232809Sjmallett
147232809Sjmallettvoid *hfa_bootmem_alloc (uint64_t size, uint64_t alignment)
148232809Sjmallett{
149232809Sjmallett    int64_t address;
150232809Sjmallett
151232809Sjmallett    address = cvmx_bootmem_phy_alloc(size, 0, 0, alignment, 0);
152232809Sjmallett
153232809Sjmallett    if (address > 0)
154232809Sjmallett        return cvmx_phys_to_ptr(address);
155232809Sjmallett    else
156232809Sjmallett        return NULL;
157232809Sjmallett}
158232809Sjmallett
159232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
160232809SjmallettEXPORT_SYMBOL(hfa_bootmem_alloc);
161232809Sjmallett#endif
162232809Sjmallett
163232809Sjmallettint  hfa_bootmem_free (void *ptr, uint64_t size)
164232809Sjmallett{
165232809Sjmallett	uint64_t address;
166232809Sjmallett	address = cvmx_ptr_to_phys (ptr);
167232809Sjmallett	return __cvmx_bootmem_phy_free (address, size, 0);
168232809Sjmallett}
169232809Sjmallett
170232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
171232809SjmallettEXPORT_SYMBOL(hfa_bootmem_free);
172232809Sjmallett#endif
173232809Sjmallett
174232809Sjmallett#endif
175