1*4882a593Smuzhiyun /********************************************************************** 2*4882a593Smuzhiyun * Author: Cavium, Inc. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Contact: support@cavium.com 5*4882a593Smuzhiyun * Please include "LiquidIO" in the subject. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright (c) 2003-2016 Cavium, Inc. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This file is free software; you can redistribute it and/or modify 10*4882a593Smuzhiyun * it under the terms of the GNU General Public License, Version 2, as 11*4882a593Smuzhiyun * published by the Free Software Foundation. 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * This file is distributed in the hope that it will be useful, but 14*4882a593Smuzhiyun * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty 15*4882a593Smuzhiyun * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 16*4882a593Smuzhiyun * NONINFRINGEMENT. See the GNU General Public License for more details. 17*4882a593Smuzhiyun ***********************************************************************/ 18*4882a593Smuzhiyun #ifndef __MAILBOX_H__ 19*4882a593Smuzhiyun #define __MAILBOX_H__ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /* Macros for Mail Box Communication */ 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define OCTEON_MBOX_DATA_MAX 32 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define OCTEON_VF_ACTIVE 0x1 26*4882a593Smuzhiyun #define OCTEON_VF_FLR_REQUEST 0x2 27*4882a593Smuzhiyun #define OCTEON_PF_CHANGED_VF_MACADDR 0x4 28*4882a593Smuzhiyun #define OCTEON_GET_VF_STATS 0x8 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /*Macro for Read acknowldgement*/ 31*4882a593Smuzhiyun #define OCTEON_PFVFACK 0xffffffffffffffffULL 32*4882a593Smuzhiyun #define OCTEON_PFVFSIG 0x1122334455667788ULL 33*4882a593Smuzhiyun #define OCTEON_PFVFERR 0xDEADDEADDEADDEADULL 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define LIO_MBOX_WRITE_WAIT_CNT 1000 36*4882a593Smuzhiyun #define LIO_MBOX_WRITE_WAIT_TIME msecs_to_jiffies(1) 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun enum octeon_mbox_cmd_status { 39*4882a593Smuzhiyun OCTEON_MBOX_STATUS_SUCCESS = 0, 40*4882a593Smuzhiyun OCTEON_MBOX_STATUS_FAILED = 1, 41*4882a593Smuzhiyun OCTEON_MBOX_STATUS_BUSY = 2 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun enum octeon_mbox_message_type { 45*4882a593Smuzhiyun OCTEON_MBOX_REQUEST = 0, 46*4882a593Smuzhiyun OCTEON_MBOX_RESPONSE = 1 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun union octeon_mbox_message { 50*4882a593Smuzhiyun u64 u64; 51*4882a593Smuzhiyun struct { 52*4882a593Smuzhiyun u16 type : 1; 53*4882a593Smuzhiyun u16 resp_needed : 1; 54*4882a593Smuzhiyun u16 cmd : 6; 55*4882a593Smuzhiyun u16 len : 8; 56*4882a593Smuzhiyun u8 params[6]; 57*4882a593Smuzhiyun } s; 58*4882a593Smuzhiyun }; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun typedef void (*octeon_mbox_callback_t)(void *, void *, void *); 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun struct octeon_mbox_cmd { 63*4882a593Smuzhiyun union octeon_mbox_message msg; 64*4882a593Smuzhiyun u64 data[OCTEON_MBOX_DATA_MAX]; 65*4882a593Smuzhiyun u32 q_no; 66*4882a593Smuzhiyun u32 recv_len; 67*4882a593Smuzhiyun u32 recv_status; 68*4882a593Smuzhiyun octeon_mbox_callback_t fn; 69*4882a593Smuzhiyun void *fn_arg; 70*4882a593Smuzhiyun }; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun enum octeon_mbox_state { 73*4882a593Smuzhiyun OCTEON_MBOX_STATE_IDLE = 1, 74*4882a593Smuzhiyun OCTEON_MBOX_STATE_REQUEST_RECEIVING = 2, 75*4882a593Smuzhiyun OCTEON_MBOX_STATE_REQUEST_RECEIVED = 4, 76*4882a593Smuzhiyun OCTEON_MBOX_STATE_RESPONSE_PENDING = 8, 77*4882a593Smuzhiyun OCTEON_MBOX_STATE_RESPONSE_RECEIVING = 16, 78*4882a593Smuzhiyun OCTEON_MBOX_STATE_RESPONSE_RECEIVED = 32, 79*4882a593Smuzhiyun OCTEON_MBOX_STATE_ERROR = 64 80*4882a593Smuzhiyun }; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun struct octeon_mbox { 83*4882a593Smuzhiyun /** A spinlock to protect access to this q_mbox. */ 84*4882a593Smuzhiyun spinlock_t lock; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun struct octeon_device *oct_dev; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun u32 q_no; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun enum octeon_mbox_state state; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun struct cavium_wk mbox_poll_wk; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /** SLI_MAC_PF_MBOX_INT for PF, SLI_PKT_MBOX_INT for VF. */ 95*4882a593Smuzhiyun void *mbox_int_reg; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /** SLI_PKT_PF_VF_MBOX_SIG(0) for PF, SLI_PKT_PF_VF_MBOX_SIG(1) for VF. 98*4882a593Smuzhiyun */ 99*4882a593Smuzhiyun void *mbox_write_reg; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /** SLI_PKT_PF_VF_MBOX_SIG(1) for PF, SLI_PKT_PF_VF_MBOX_SIG(0) for VF. 102*4882a593Smuzhiyun */ 103*4882a593Smuzhiyun void *mbox_read_reg; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun struct octeon_mbox_cmd mbox_req; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun struct octeon_mbox_cmd mbox_resp; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun }; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun struct oct_vf_stats_ctx { 112*4882a593Smuzhiyun atomic_t status; 113*4882a593Smuzhiyun struct oct_vf_stats *stats; 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun int octeon_mbox_read(struct octeon_mbox *mbox); 117*4882a593Smuzhiyun int octeon_mbox_write(struct octeon_device *oct, 118*4882a593Smuzhiyun struct octeon_mbox_cmd *mbox_cmd); 119*4882a593Smuzhiyun int octeon_mbox_process_message(struct octeon_mbox *mbox); 120*4882a593Smuzhiyun int octeon_mbox_cancel(struct octeon_device *oct, int q_no); 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun #endif 123