xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/cavium/liquidio/octeon_mailbox.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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