1210284Sjmallett/***********************license start*************** 2232812Sjmallett * Copyright (c) 2003-2010 Cavium Inc. (support@cavium.com). All rights 3215990Sjmallett * reserved. 4210284Sjmallett * 5210284Sjmallett * 6215990Sjmallett * Redistribution and use in source and binary forms, with or without 7215990Sjmallett * modification, are permitted provided that the following conditions are 8215990Sjmallett * met: 9210284Sjmallett * 10215990Sjmallett * * Redistributions of source code must retain the above copyright 11215990Sjmallett * notice, this list of conditions and the following disclaimer. 12210284Sjmallett * 13215990Sjmallett * * Redistributions in binary form must reproduce the above 14215990Sjmallett * copyright notice, this list of conditions and the following 15215990Sjmallett * disclaimer in the documentation and/or other materials provided 16215990Sjmallett * with the distribution. 17215990Sjmallett 18232812Sjmallett * * Neither the name of Cavium Inc. nor the names of 19215990Sjmallett * its contributors may be used to endorse or promote products 20215990Sjmallett * derived from this software without specific prior written 21215990Sjmallett * permission. 22215990Sjmallett 23215990Sjmallett * This Software, including technical data, may be subject to U.S. export control 24215990Sjmallett * laws, including the U.S. Export Administration Act and its associated 25215990Sjmallett * regulations, and may be subject to export or import regulations in other 26215990Sjmallett * countries. 27215990Sjmallett 28215990Sjmallett * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 29232812Sjmallett * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR 30215990Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO 31215990Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR 32215990Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM 33215990Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, 34215990Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF 35215990Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR 36215990Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR 37215990Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU. 38210284Sjmallett ***********************license end**************************************/ 39210284Sjmallett 40210284Sjmallett 41210284Sjmallett 42210284Sjmallett 43210284Sjmallett 44210284Sjmallett 45215990Sjmallett 46210284Sjmallett/** 47210284Sjmallett * @file 48210284Sjmallett * 49210284Sjmallett * Source file for the zip (deflate) block 50210284Sjmallett * 51232812Sjmallett * <hr>$Revision: 70030 $<hr> 52210284Sjmallett */ 53210284Sjmallett 54210284Sjmallett#include "executive-config.h" 55210284Sjmallett#include "cvmx-config.h" 56210284Sjmallett#include "cvmx.h" 57210284Sjmallett#include "cvmx-cmd-queue.h" 58210284Sjmallett#include "cvmx-zip.h" 59210284Sjmallett 60210284Sjmallett#ifdef CVMX_ENABLE_PKO_FUNCTIONS 61210284Sjmallett 62210284Sjmallett/** 63210284Sjmallett * Initialize the ZIP block 64210284Sjmallett * 65210284Sjmallett * @return Zero on success, negative on failure 66210284Sjmallett */ 67210284Sjmallettint cvmx_zip_initialize(void) 68210284Sjmallett{ 69210284Sjmallett cvmx_zip_cmd_buf_t zip_cmd_buf; 70210284Sjmallett cvmx_cmd_queue_result_t result; 71210284Sjmallett result = cvmx_cmd_queue_initialize(CVMX_CMD_QUEUE_ZIP, 0, 72210284Sjmallett CVMX_FPA_OUTPUT_BUFFER_POOL, 73210284Sjmallett CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE); 74210284Sjmallett if (result != CVMX_CMD_QUEUE_SUCCESS) 75210284Sjmallett return -1; 76210284Sjmallett 77210284Sjmallett zip_cmd_buf.u64 = 0; 78210284Sjmallett zip_cmd_buf.s.dwb = CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE/128; 79210284Sjmallett zip_cmd_buf.s.pool = CVMX_FPA_OUTPUT_BUFFER_POOL; 80210284Sjmallett zip_cmd_buf.s.size = CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE/8; 81210284Sjmallett zip_cmd_buf.s.ptr = cvmx_ptr_to_phys(cvmx_cmd_queue_buffer(CVMX_CMD_QUEUE_ZIP))>>7; 82210284Sjmallett cvmx_write_csr(CVMX_ZIP_CMD_BUF, zip_cmd_buf.u64); 83210284Sjmallett cvmx_write_csr(CVMX_ZIP_ERROR, 1); 84210284Sjmallett cvmx_read_csr(CVMX_ZIP_CMD_BUF); /* Read to make sure setup is complete */ 85210284Sjmallett return 0; 86210284Sjmallett} 87210284Sjmallett 88210284Sjmallett/** 89232812Sjmallett * Initialize the ZIP QUEUE buffer 90232812Sjmallett * 91232812Sjmallett * @param queue : ZIP instruction queue 92232812Sjmallett * @param zcoremask : ZIP coremask to use for this queue 93232812Sjmallett * 94232812Sjmallett * @return Zero on success, negative on failure 95232812Sjmallett */ 96232812Sjmallettint cvmx_zip_queue_initialize(int queue, int zcoremask) 97232812Sjmallett{ 98232812Sjmallett cvmx_zip_quex_buf_t zip_que_buf; 99232812Sjmallett cvmx_cmd_queue_result_t result; 100232812Sjmallett cvmx_zip_quex_map_t que_map; 101232812Sjmallett cvmx_zip_que_ena_t que_ena; 102232812Sjmallett cvmx_zip_int_reg_t int_reg; 103232812Sjmallett 104232812Sjmallett /* Previous Octeon models has only one instruction queue, call 105232812Sjmallett cvmx_zip_inititalize() to initialize the ZIP block */ 106232812Sjmallett 107232812Sjmallett if (!OCTEON_IS_MODEL(OCTEON_CN68XX)) 108232812Sjmallett return -1; 109232812Sjmallett 110232812Sjmallett result = cvmx_cmd_queue_initialize(CVMX_CMD_QUEUE_ZIP_QUE(queue), 0, 111232812Sjmallett CVMX_FPA_OUTPUT_BUFFER_POOL, 112232812Sjmallett CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE); 113232812Sjmallett if (result != CVMX_CMD_QUEUE_SUCCESS) 114232812Sjmallett return -1; 115232812Sjmallett 116232812Sjmallett /* 1. Program ZIP_QUE0/1_BUF to have the correct buffer pointer and 117232812Sjmallett size configured for each instruction queue */ 118232812Sjmallett zip_que_buf.u64 = 0; 119232812Sjmallett zip_que_buf.s.dwb = CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE/128; 120232812Sjmallett zip_que_buf.s.pool = CVMX_FPA_OUTPUT_BUFFER_POOL; 121232812Sjmallett zip_que_buf.s.size = CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE/8; 122232812Sjmallett zip_que_buf.s.ptr = cvmx_ptr_to_phys(cvmx_cmd_queue_buffer(CVMX_CMD_QUEUE_ZIP_QUE(queue)))>>7; 123232812Sjmallett cvmx_write_csr(CVMX_ZIP_QUEX_BUF(queue), zip_que_buf.u64); 124232812Sjmallett 125232812Sjmallett /* 2. Change the queue-to-ZIP core mapping by programming ZIP_QUE0/1_MAP. */ 126232812Sjmallett que_map.u64 = cvmx_read_csr(CVMX_ZIP_QUEX_MAP(queue)); 127232812Sjmallett que_map.s.zce = zcoremask; 128232812Sjmallett cvmx_write_csr(CVMX_ZIP_QUEX_MAP(queue), que_map.u64); 129232812Sjmallett 130232812Sjmallett /* Enable the queue */ 131232812Sjmallett que_ena.u64 = cvmx_read_csr(CVMX_ZIP_QUE_ENA); 132232812Sjmallett que_ena.s.ena |= (1<<queue); 133232812Sjmallett cvmx_write_csr(CVMX_ZIP_QUE_ENA, que_ena.u64); 134232812Sjmallett 135232812Sjmallett /* Use round robin to have equal priority for each instruction queue */ 136232812Sjmallett cvmx_write_csr(CVMX_ZIP_QUE_PRI, 0x3); 137232812Sjmallett 138232812Sjmallett int_reg.u64 = cvmx_read_csr(CVMX_ZIP_INT_REG); 139232812Sjmallett if (queue) 140232812Sjmallett int_reg.s.doorbell1 = 1; 141232812Sjmallett else 142232812Sjmallett int_reg.s.doorbell0 = 1; 143232812Sjmallett 144232812Sjmallett cvmx_write_csr(CVMX_ZIP_INT_REG, int_reg.u64); 145232812Sjmallett /* Read back to make sure the setup is complete */ 146232812Sjmallett cvmx_read_csr(CVMX_ZIP_QUEX_BUF(queue)); 147232812Sjmallett return 0; 148232812Sjmallett} 149232812Sjmallett 150232812Sjmallett/** 151210284Sjmallett * Shutdown the ZIP block. ZIP must be idle when 152210284Sjmallett * this function is called. 153210284Sjmallett * 154210284Sjmallett * @return Zero on success, negative on failure 155210284Sjmallett */ 156210284Sjmallettint cvmx_zip_shutdown(void) 157210284Sjmallett{ 158210284Sjmallett cvmx_zip_cmd_ctl_t zip_cmd_ctl; 159210284Sjmallett 160210284Sjmallett if (cvmx_cmd_queue_length(CVMX_CMD_QUEUE_ZIP)) 161210284Sjmallett { 162210284Sjmallett cvmx_dprintf("ERROR: cvmx_zip_shutdown: ZIP not idle.\n"); 163210284Sjmallett return -1; 164210284Sjmallett } 165210284Sjmallett 166210284Sjmallett zip_cmd_ctl.u64 = cvmx_read_csr(CVMX_ZIP_CMD_CTL); 167210284Sjmallett zip_cmd_ctl.s.reset = 1; 168210284Sjmallett cvmx_write_csr(CVMX_ZIP_CMD_CTL, zip_cmd_ctl.u64); 169210284Sjmallett cvmx_wait(100); 170210284Sjmallett 171210284Sjmallett cvmx_cmd_queue_shutdown(CVMX_CMD_QUEUE_ZIP); 172210284Sjmallett return 0; 173210284Sjmallett} 174210284Sjmallett 175210284Sjmallett/** 176232812Sjmallett * Shutdown the ZIP block for a queue. ZIP must be idle when 177232812Sjmallett * this function is called. 178232812Sjmallett * 179232812Sjmallett * @param queue Zip instruction queue of the command 180232812Sjmallett * 181232812Sjmallett * @return Zero on success, negative on failure 182232812Sjmallett */ 183232812Sjmallettint cvmx_zip_queue_shutdown(int queue) 184232812Sjmallett{ 185232812Sjmallett cvmx_zip_cmd_ctl_t zip_cmd_ctl; 186232812Sjmallett 187232812Sjmallett if (cvmx_cmd_queue_length(CVMX_CMD_QUEUE_ZIP_QUE(queue))) 188232812Sjmallett { 189232812Sjmallett cvmx_dprintf("ERROR: cvmx_zip_shutdown: ZIP not idle.\n"); 190232812Sjmallett return -1; 191232812Sjmallett } 192232812Sjmallett 193232812Sjmallett zip_cmd_ctl.u64 = cvmx_read_csr(CVMX_ZIP_CMD_CTL); 194232812Sjmallett zip_cmd_ctl.s.reset = 1; 195232812Sjmallett cvmx_write_csr(CVMX_ZIP_CMD_CTL, zip_cmd_ctl.u64); 196232812Sjmallett cvmx_wait(100); 197232812Sjmallett 198232812Sjmallett cvmx_cmd_queue_shutdown(CVMX_CMD_QUEUE_ZIP_QUE(queue)); 199232812Sjmallett return 0; 200232812Sjmallett} 201232812Sjmallett 202232812Sjmallett/** 203210284Sjmallett * Submit a command to the ZIP block 204210284Sjmallett * 205210284Sjmallett * @param command Zip command to submit 206210284Sjmallett * 207210284Sjmallett * @return Zero on success, negative on failure 208210284Sjmallett */ 209210284Sjmallettint cvmx_zip_submit(cvmx_zip_command_t *command) 210210284Sjmallett{ 211210284Sjmallett cvmx_cmd_queue_result_t result = cvmx_cmd_queue_write(CVMX_CMD_QUEUE_ZIP, 1, 8, command->u64); 212210284Sjmallett if (result == CVMX_CMD_QUEUE_SUCCESS) 213210284Sjmallett cvmx_write_csr(CVMX_ADDR_DID(CVMX_FULL_DID(7, 0)), 8); 214210284Sjmallett return result; 215210284Sjmallett} 216210284Sjmallett 217232812Sjmallett/** 218232812Sjmallett * Submit a command to the ZIP block 219232812Sjmallett * 220232812Sjmallett * @param command Zip command to submit 221232812Sjmallett * @param queue Zip instruction queue of the command 222232812Sjmallett * 223232812Sjmallett * @return Zero on success, negative on failure 224232812Sjmallett */ 225232812Sjmallettint cvmx_zip_queue_submit(cvmx_zip_command_t *command, int queue) 226232812Sjmallett{ 227232812Sjmallett cvmx_cmd_queue_result_t result = cvmx_cmd_queue_write(CVMX_CMD_QUEUE_ZIP_QUE(queue), 1, 8, command->u64); 228232812Sjmallett if (result == CVMX_CMD_QUEUE_SUCCESS) 229232812Sjmallett cvmx_write_csr((CVMX_ADDR_DID(CVMX_FULL_DID(7, 0)) | queue << 3), 8); 230232812Sjmallett return result; 231232812Sjmallett} 232232812Sjmallett 233210284Sjmallett#endif 234210284Sjmallett 235