Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(C) 2020 Broadcom. 3 : : * All rights reserved. 4 : : */ 5 : : 6 : : #include <errno.h> 7 : : 8 : : #include "bcmfs_hw_defs.h" 9 : : #include "bcmfs_rm_common.h" 10 : : 11 : : /* Completion descriptor format */ 12 : : #define FS_CMPL_OPAQUE_SHIFT 0 13 : : #define FS_CMPL_OPAQUE_MASK 0xffff 14 : : #define FS_CMPL_ENGINE_STATUS_SHIFT 16 15 : : #define FS_CMPL_ENGINE_STATUS_MASK 0xffff 16 : : #define FS_CMPL_DME_STATUS_SHIFT 32 17 : : #define FS_CMPL_DME_STATUS_MASK 0xffff 18 : : #define FS_CMPL_RM_STATUS_SHIFT 48 19 : : #define FS_CMPL_RM_STATUS_MASK 0xffff 20 : : /* Completion RM status code */ 21 : : #define FS_RM_STATUS_CODE_SHIFT 0 22 : : #define FS_RM_STATUS_CODE_MASK 0x3ff 23 : : #define FS_RM_STATUS_CODE_GOOD 0x0 24 : : #define FS_RM_STATUS_CODE_AE_TIMEOUT 0x3ff 25 : : 26 : : 27 : : /* Completion DME status code */ 28 : : #define FS_DME_STATUS_MEM_COR_ERR BIT(0) 29 : : #define FS_DME_STATUS_MEM_UCOR_ERR BIT(1) 30 : : #define FS_DME_STATUS_FIFO_UNDRFLOW BIT(2) 31 : : #define FS_DME_STATUS_FIFO_OVERFLOW BIT(3) 32 : : #define FS_DME_STATUS_RRESP_ERR BIT(4) 33 : : #define FS_DME_STATUS_BRESP_ERR BIT(5) 34 : : #define FS_DME_STATUS_ERROR_MASK (FS_DME_STATUS_MEM_COR_ERR | \ 35 : : FS_DME_STATUS_MEM_UCOR_ERR | \ 36 : : FS_DME_STATUS_FIFO_UNDRFLOW | \ 37 : : FS_DME_STATUS_FIFO_OVERFLOW | \ 38 : : FS_DME_STATUS_RRESP_ERR | \ 39 : : FS_DME_STATUS_BRESP_ERR) 40 : : 41 : : /* APIs related to ring manager descriptors */ 42 : : uint64_t 43 : 0 : rm_build_desc(uint64_t val, uint32_t shift, 44 : : uint64_t mask) 45 : : { 46 : 0 : return((val & mask) << shift); 47 : : } 48 : : 49 : : uint64_t 50 : 0 : rm_read_desc(void *desc_ptr) 51 : : { 52 : 0 : return le64_to_cpu(*((uint64_t *)desc_ptr)); 53 : : } 54 : : 55 : : void 56 : 0 : rm_write_desc(void *desc_ptr, uint64_t desc) 57 : : { 58 : 0 : *((uint64_t *)desc_ptr) = cpu_to_le64(desc); 59 : 0 : } 60 : : 61 : : uint32_t 62 : 0 : rm_cmpl_desc_to_reqid(uint64_t cmpl_desc) 63 : : { 64 : 0 : return (uint32_t)(cmpl_desc & FS_CMPL_OPAQUE_MASK); 65 : : } 66 : : 67 : : int 68 : 0 : rm_cmpl_desc_to_error(uint64_t cmpl_desc) 69 : : { 70 : : uint32_t status; 71 : : 72 : 0 : status = FS_DESC_DEC(cmpl_desc, FS_CMPL_DME_STATUS_SHIFT, 73 : : FS_CMPL_DME_STATUS_MASK); 74 [ # # ]: 0 : if (status & FS_DME_STATUS_ERROR_MASK) 75 : : return -EIO; 76 : : 77 : 0 : status = FS_DESC_DEC(cmpl_desc, FS_CMPL_RM_STATUS_SHIFT, 78 : : FS_CMPL_RM_STATUS_MASK); 79 : 0 : status &= FS_RM_STATUS_CODE_MASK; 80 [ # # ]: 0 : if (status == FS_RM_STATUS_CODE_AE_TIMEOUT) 81 : 0 : return -ETIMEDOUT; 82 : : 83 : : return 0; 84 : : }