162306a36Sopenharmony_ci/**********************************************************************
262306a36Sopenharmony_ci * Author: Cavium, Inc.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Contact: support@cavium.com
562306a36Sopenharmony_ci *          Please include "LiquidIO" in the subject.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (c) 2003-2016 Cavium, Inc.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * This file is free software; you can redistribute it and/or modify
1062306a36Sopenharmony_ci * it under the terms of the GNU General Public License, Version 2, as
1162306a36Sopenharmony_ci * published by the Free Software Foundation.
1262306a36Sopenharmony_ci *
1362306a36Sopenharmony_ci * This file is distributed in the hope that it will be useful, but
1462306a36Sopenharmony_ci * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
1562306a36Sopenharmony_ci * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
1662306a36Sopenharmony_ci * NONINFRINGEMENT.  See the GNU General Public License for more details.
1762306a36Sopenharmony_ci ***********************************************************************/
1862306a36Sopenharmony_ci#ifndef __MAILBOX_H__
1962306a36Sopenharmony_ci#define __MAILBOX_H__
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* Macros for Mail Box Communication */
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define OCTEON_MBOX_DATA_MAX		32
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#define OCTEON_VF_ACTIVE		0x1
2662306a36Sopenharmony_ci#define OCTEON_VF_FLR_REQUEST		0x2
2762306a36Sopenharmony_ci#define OCTEON_PF_CHANGED_VF_MACADDR	0x4
2862306a36Sopenharmony_ci#define OCTEON_GET_VF_STATS		0x8
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/*Macro for Read acknowldgement*/
3162306a36Sopenharmony_ci#define OCTEON_PFVFACK			0xffffffffffffffffULL
3262306a36Sopenharmony_ci#define OCTEON_PFVFSIG			0x1122334455667788ULL
3362306a36Sopenharmony_ci#define OCTEON_PFVFERR			0xDEADDEADDEADDEADULL
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define LIO_MBOX_WRITE_WAIT_CNT         1000
3662306a36Sopenharmony_ci#define LIO_MBOX_WRITE_WAIT_TIME        msecs_to_jiffies(1)
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cienum octeon_mbox_cmd_status {
3962306a36Sopenharmony_ci	OCTEON_MBOX_STATUS_SUCCESS = 0,
4062306a36Sopenharmony_ci	OCTEON_MBOX_STATUS_FAILED = 1,
4162306a36Sopenharmony_ci	OCTEON_MBOX_STATUS_BUSY = 2
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cienum octeon_mbox_message_type {
4562306a36Sopenharmony_ci	OCTEON_MBOX_REQUEST = 0,
4662306a36Sopenharmony_ci	OCTEON_MBOX_RESPONSE = 1
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciunion octeon_mbox_message {
5062306a36Sopenharmony_ci	u64 u64;
5162306a36Sopenharmony_ci	struct {
5262306a36Sopenharmony_ci		u16 type : 1;
5362306a36Sopenharmony_ci		u16 resp_needed : 1;
5462306a36Sopenharmony_ci		u16 cmd : 6;
5562306a36Sopenharmony_ci		u16 len : 8;
5662306a36Sopenharmony_ci		u8 params[6];
5762306a36Sopenharmony_ci	} s;
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_citypedef void (*octeon_mbox_callback_t)(void *, void *, void *);
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistruct octeon_mbox_cmd {
6362306a36Sopenharmony_ci	union octeon_mbox_message msg;
6462306a36Sopenharmony_ci	u64 data[OCTEON_MBOX_DATA_MAX];
6562306a36Sopenharmony_ci	u32 q_no;
6662306a36Sopenharmony_ci	u32 recv_len;
6762306a36Sopenharmony_ci	u32 recv_status;
6862306a36Sopenharmony_ci	octeon_mbox_callback_t fn;
6962306a36Sopenharmony_ci	void *fn_arg;
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cienum octeon_mbox_state {
7362306a36Sopenharmony_ci	OCTEON_MBOX_STATE_IDLE = 1,
7462306a36Sopenharmony_ci	OCTEON_MBOX_STATE_REQUEST_RECEIVING = 2,
7562306a36Sopenharmony_ci	OCTEON_MBOX_STATE_REQUEST_RECEIVED = 4,
7662306a36Sopenharmony_ci	OCTEON_MBOX_STATE_RESPONSE_PENDING = 8,
7762306a36Sopenharmony_ci	OCTEON_MBOX_STATE_RESPONSE_RECEIVING = 16,
7862306a36Sopenharmony_ci	OCTEON_MBOX_STATE_RESPONSE_RECEIVED = 32,
7962306a36Sopenharmony_ci	OCTEON_MBOX_STATE_ERROR = 64
8062306a36Sopenharmony_ci};
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cistruct octeon_mbox {
8362306a36Sopenharmony_ci	/** A spinlock to protect access to this q_mbox. */
8462306a36Sopenharmony_ci	spinlock_t lock;
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	struct octeon_device *oct_dev;
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	u32 q_no;
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	enum octeon_mbox_state state;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	struct cavium_wk mbox_poll_wk;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	/** SLI_MAC_PF_MBOX_INT for PF, SLI_PKT_MBOX_INT for VF. */
9562306a36Sopenharmony_ci	void *mbox_int_reg;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	/** SLI_PKT_PF_VF_MBOX_SIG(0) for PF, SLI_PKT_PF_VF_MBOX_SIG(1) for VF.
9862306a36Sopenharmony_ci	 */
9962306a36Sopenharmony_ci	void *mbox_write_reg;
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci	/** SLI_PKT_PF_VF_MBOX_SIG(1) for PF, SLI_PKT_PF_VF_MBOX_SIG(0) for VF.
10262306a36Sopenharmony_ci	 */
10362306a36Sopenharmony_ci	void *mbox_read_reg;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	struct octeon_mbox_cmd mbox_req;
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	struct octeon_mbox_cmd mbox_resp;
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cistruct oct_vf_stats_ctx {
11262306a36Sopenharmony_ci	atomic_t status;
11362306a36Sopenharmony_ci	struct oct_vf_stats *stats;
11462306a36Sopenharmony_ci};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ciint octeon_mbox_read(struct octeon_mbox *mbox);
11762306a36Sopenharmony_ciint octeon_mbox_write(struct octeon_device *oct,
11862306a36Sopenharmony_ci		      struct octeon_mbox_cmd *mbox_cmd);
11962306a36Sopenharmony_ciint octeon_mbox_process_message(struct octeon_mbox *mbox);
12062306a36Sopenharmony_ciint octeon_mbox_cancel(struct octeon_device *oct, int q_no);
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci#endif
123