OpenCloudOS-Kernel/drivers/thirdparty/hinic/hinic_sm_lt.h

230 lines
5.7 KiB
C
Raw Normal View History

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Huawei HiNIC PCI Express Linux driver
* Copyright(c) 2017 Huawei Technologies Co., Ltd
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
*/
#ifndef __CHIPIF_SM_LT_H__
#define __CHIPIF_SM_LT_H__
#define SM_LT_LOAD (0x12)
#define SM_LT_STORE (0x14)
#define SM_LT_NUM_OFFSET 13
#define SM_LT_ABUF_FLG_OFFSET 12
#define SM_LT_BC_OFFSET 11
#define SM_LT_ENTRY_16B 16
#define SM_LT_ENTRY_32B 32
#define SM_LT_ENTRY_48B 48
#define SM_LT_ENTRY_64B 64
#define TBL_LT_OFFSET_DEFAULT 0
#define SM_CACHE_LINE_SHFT 4 /* log2(16) */
#define SM_CACHE_LINE_SIZE 16 /* the size of cache line */
#define MAX_SM_LT_READ_LINE_NUM 4
#define MAX_SM_LT_WRITE_LINE_NUM 3
#define SM_LT_FULL_BYTEENB 0xFFFF
#define TBL_GET_ENB3_MASK(bitmask) (u16)(((bitmask) >> 32) & 0xFFFF)
#define TBL_GET_ENB2_MASK(bitmask) (u16)(((bitmask) >> 16) & 0xFFFF)
#define TBL_GET_ENB1_MASK(bitmask) (u16)((bitmask) & 0xFFFF)
enum {
SM_LT_NUM_0 = 0, /* lt num = 0, load/store 16B */
SM_LT_NUM_1, /* lt num = 1, load/store 32B */
SM_LT_NUM_2, /* lt num = 2, load/store 48B */
SM_LT_NUM_3 /* lt num = 3, load 64B */
};
/* lt load request */
typedef union {
struct {
u32 offset:8;
u32 pad:3;
u32 bc:1;
u32 abuf_flg:1;
u32 num:2;
u32 ack:1;
u32 op_id:5;
u32 instance:6;
u32 src:5;
} bs;
u32 value;
} sml_lt_req_head_u;
typedef struct {
u32 extra;
sml_lt_req_head_u head;
u32 index;
u32 pad0;
u32 pad1;
} sml_lt_load_req_s;
typedef struct {
u32 extra;
sml_lt_req_head_u head;
u32 index;
u32 byte_enb[2];
u8 write_data[48];
} sml_lt_store_req_s;
enum {
SM_LT_OFFSET_1 = 1,
SM_LT_OFFSET_2,
SM_LT_OFFSET_3,
SM_LT_OFFSET_4,
SM_LT_OFFSET_5,
SM_LT_OFFSET_6,
SM_LT_OFFSET_7,
SM_LT_OFFSET_8,
SM_LT_OFFSET_9,
SM_LT_OFFSET_10,
SM_LT_OFFSET_11,
SM_LT_OFFSET_12,
SM_LT_OFFSET_13,
SM_LT_OFFSET_14,
SM_LT_OFFSET_15
};
static inline void sml_lt_store_memcpy(u32 *dst, u32 *src, u8 num)
{
switch (num) {
case SM_LT_NUM_2:
*(dst + SM_LT_OFFSET_11) = *(src + SM_LT_OFFSET_11);
*(dst + SM_LT_OFFSET_10) = *(src + SM_LT_OFFSET_10);
*(dst + SM_LT_OFFSET_9) = *(src + SM_LT_OFFSET_9);
*(dst + SM_LT_OFFSET_8) = *(src + SM_LT_OFFSET_8);
/* FALLTHROUGH */
case SM_LT_NUM_1:
*(dst + SM_LT_OFFSET_7) = *(src + SM_LT_OFFSET_7);
*(dst + SM_LT_OFFSET_6) = *(src + SM_LT_OFFSET_6);
*(dst + SM_LT_OFFSET_5) = *(src + SM_LT_OFFSET_5);
*(dst + SM_LT_OFFSET_4) = *(src + SM_LT_OFFSET_4);
/* FALLTHROUGH */
case SM_LT_NUM_0:
*(dst + SM_LT_OFFSET_3) = *(src + SM_LT_OFFSET_3);
*(dst + SM_LT_OFFSET_2) = *(src + SM_LT_OFFSET_2);
*(dst + SM_LT_OFFSET_1) = *(src + SM_LT_OFFSET_1);
*dst = *src;
break;
default:
break;
}
}
static inline void sml_lt_load_memcpy(u32 *dst, u32 *src, u8 num)
{
switch (num) {
case SM_LT_NUM_3:
*(dst + SM_LT_OFFSET_15) = *(src + SM_LT_OFFSET_15);
*(dst + SM_LT_OFFSET_14) = *(src + SM_LT_OFFSET_14);
*(dst + SM_LT_OFFSET_13) = *(src + SM_LT_OFFSET_13);
*(dst + SM_LT_OFFSET_12) = *(src + SM_LT_OFFSET_12);
/* FALLTHROUGH */
case SM_LT_NUM_2:
*(dst + SM_LT_OFFSET_11) = *(src + SM_LT_OFFSET_11);
*(dst + SM_LT_OFFSET_10) = *(src + SM_LT_OFFSET_10);
*(dst + SM_LT_OFFSET_9) = *(src + SM_LT_OFFSET_9);
*(dst + SM_LT_OFFSET_8) = *(src + SM_LT_OFFSET_8);
/* FALLTHROUGH */
case SM_LT_NUM_1:
*(dst + SM_LT_OFFSET_7) = *(src + SM_LT_OFFSET_7);
*(dst + SM_LT_OFFSET_6) = *(src + SM_LT_OFFSET_6);
*(dst + SM_LT_OFFSET_5) = *(src + SM_LT_OFFSET_5);
*(dst + SM_LT_OFFSET_4) = *(src + SM_LT_OFFSET_4);
/* FALLTHROUGH */
case SM_LT_NUM_0:
*(dst + SM_LT_OFFSET_3) = *(src + SM_LT_OFFSET_3);
*(dst + SM_LT_OFFSET_2) = *(src + SM_LT_OFFSET_2);
*(dst + SM_LT_OFFSET_1) = *(src + SM_LT_OFFSET_1);
*dst = *src;
break;
default:
break;
}
}
enum HINIC_CSR_API_DATA_OPERATION_ID {
HINIC_CSR_OPERATION_WRITE_CSR = 0x1E,
HINIC_CSR_OPERATION_READ_CSR = 0x1F
};
enum HINIC_CSR_API_DATA_NEED_RESPONSE_DATA {
HINIC_CSR_NO_RESP_DATA = 0,
HINIC_CSR_NEED_RESP_DATA = 1
};
enum HINIC_CSR_API_DATA_DATA_SIZE {
HINIC_CSR_DATA_SZ_32 = 0,
HINIC_CSR_DATA_SZ_64 = 1
};
struct hinic_csr_request_api_data {
u32 dw0;
union {
struct {
u32 reserved1:13;
/* this field indicates the write/read data size:
* 2'b00: 32 bits
* 2'b01: 64 bits
* 2'b10~2'b11:reserved
*/
u32 data_size:2;
/* this field indicates that requestor expect receive a
* response data or not.
* 1'b0: expect not to receive a response data.
* 1'b1: expect to receive a response data.
*/
u32 need_response:1;
/* this field indicates the operation that the requestor
* expected.
* 5'b1_1110: write value to csr space.
* 5'b1_1111: read register from csr space.
*/
u32 operation_id:5;
u32 reserved2:6;
/* this field specifies the Src node ID for this API
* request message.
*/
u32 src_node_id:5;
} bits;
u32 val32;
} dw1;
union {
struct {
/* it specifies the CSR address. */
u32 csr_addr:26;
u32 reserved3:6;
} bits;
u32 val32;
} dw2;
/* if data_size=2'b01, it is high 32 bits of write data. else, it is
* 32'hFFFF_FFFF.
*/
u32 csr_write_data_h;
/* the low 32 bits of write data. */
u32 csr_write_data_l;
};
#endif