18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * PMC-Sierra PM8001/8081/8088/8089 SAS/SATA based host adapters driver 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (c) 2008-2009 USI Co., Ltd. 58c2ecf20Sopenharmony_ci * All rights reserved. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 88c2ecf20Sopenharmony_ci * modification, are permitted provided that the following conditions 98c2ecf20Sopenharmony_ci * are met: 108c2ecf20Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 118c2ecf20Sopenharmony_ci * notice, this list of conditions, and the following disclaimer, 128c2ecf20Sopenharmony_ci * without modification. 138c2ecf20Sopenharmony_ci * 2. Redistributions in binary form must reproduce at minimum a disclaimer 148c2ecf20Sopenharmony_ci * substantially similar to the "NO WARRANTY" disclaimer below 158c2ecf20Sopenharmony_ci * ("Disclaimer") and any redistribution must be conditioned upon 168c2ecf20Sopenharmony_ci * including a substantially similar Disclaimer requirement for further 178c2ecf20Sopenharmony_ci * binary redistribution. 188c2ecf20Sopenharmony_ci * 3. Neither the names of the above-listed copyright holders nor the names 198c2ecf20Sopenharmony_ci * of any contributors may be used to endorse or promote products derived 208c2ecf20Sopenharmony_ci * from this software without specific prior written permission. 218c2ecf20Sopenharmony_ci * 228c2ecf20Sopenharmony_ci * Alternatively, this software may be distributed under the terms of the 238c2ecf20Sopenharmony_ci * GNU General Public License ("GPL") version 2 as published by the Free 248c2ecf20Sopenharmony_ci * Software Foundation. 258c2ecf20Sopenharmony_ci * 268c2ecf20Sopenharmony_ci * NO WARRANTY 278c2ecf20Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 288c2ecf20Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 298c2ecf20Sopenharmony_ci * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 308c2ecf20Sopenharmony_ci * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 318c2ecf20Sopenharmony_ci * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 328c2ecf20Sopenharmony_ci * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 338c2ecf20Sopenharmony_ci * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 348c2ecf20Sopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 358c2ecf20Sopenharmony_ci * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 368c2ecf20Sopenharmony_ci * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 378c2ecf20Sopenharmony_ci * POSSIBILITY OF SUCH DAMAGES. 388c2ecf20Sopenharmony_ci * 398c2ecf20Sopenharmony_ci */ 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci#ifndef _PM8001_SAS_H_ 428c2ecf20Sopenharmony_ci#define _PM8001_SAS_H_ 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci#include <linux/kernel.h> 458c2ecf20Sopenharmony_ci#include <linux/module.h> 468c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 478c2ecf20Sopenharmony_ci#include <linux/delay.h> 488c2ecf20Sopenharmony_ci#include <linux/types.h> 498c2ecf20Sopenharmony_ci#include <linux/ctype.h> 508c2ecf20Sopenharmony_ci#include <linux/dma-mapping.h> 518c2ecf20Sopenharmony_ci#include <linux/pci.h> 528c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 538c2ecf20Sopenharmony_ci#include <linux/workqueue.h> 548c2ecf20Sopenharmony_ci#include <scsi/libsas.h> 558c2ecf20Sopenharmony_ci#include <scsi/scsi_tcq.h> 568c2ecf20Sopenharmony_ci#include <scsi/sas_ata.h> 578c2ecf20Sopenharmony_ci#include <linux/atomic.h> 588c2ecf20Sopenharmony_ci#include "pm8001_defs.h" 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci#define DRV_NAME "pm80xx" 618c2ecf20Sopenharmony_ci#define DRV_VERSION "0.1.40" 628c2ecf20Sopenharmony_ci#define PM8001_FAIL_LOGGING 0x01 /* Error message logging */ 638c2ecf20Sopenharmony_ci#define PM8001_INIT_LOGGING 0x02 /* driver init logging */ 648c2ecf20Sopenharmony_ci#define PM8001_DISC_LOGGING 0x04 /* discovery layer logging */ 658c2ecf20Sopenharmony_ci#define PM8001_IO_LOGGING 0x08 /* I/O path logging */ 668c2ecf20Sopenharmony_ci#define PM8001_EH_LOGGING 0x10 /* libsas EH function logging*/ 678c2ecf20Sopenharmony_ci#define PM8001_IOCTL_LOGGING 0x20 /* IOCTL message logging */ 688c2ecf20Sopenharmony_ci#define PM8001_MSG_LOGGING 0x40 /* misc message logging */ 698c2ecf20Sopenharmony_ci#define PM8001_DEV_LOGGING 0x80 /* development message logging */ 708c2ecf20Sopenharmony_ci#define PM8001_DEVIO_LOGGING 0x100 /* development io message logging */ 718c2ecf20Sopenharmony_ci#define PM8001_IOERR_LOGGING 0x200 /* development io err message logging */ 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci#define pm8001_printk(fmt, ...) \ 748c2ecf20Sopenharmony_ci pr_info("%s:: %s %d:" fmt, \ 758c2ecf20Sopenharmony_ci pm8001_ha->name, __func__, __LINE__, ##__VA_ARGS__) 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci#define pm8001_dbg(HBA, level, fmt, ...) \ 788c2ecf20Sopenharmony_cido { \ 798c2ecf20Sopenharmony_ci if (unlikely((HBA)->logging_level & PM8001_##level##_LOGGING)) \ 808c2ecf20Sopenharmony_ci pm8001_printk(fmt, ##__VA_ARGS__); \ 818c2ecf20Sopenharmony_ci} while (0) 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci#define PM8001_USE_TASKLET 848c2ecf20Sopenharmony_ci#define PM8001_USE_MSIX 858c2ecf20Sopenharmony_ci#define PM8001_READ_VPD 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci#define IS_SPCV_12G(dev) ((dev->device == 0X8074) \ 898c2ecf20Sopenharmony_ci || (dev->device == 0X8076) \ 908c2ecf20Sopenharmony_ci || (dev->device == 0X8077) \ 918c2ecf20Sopenharmony_ci || (dev->device == 0X8070) \ 928c2ecf20Sopenharmony_ci || (dev->device == 0X8072)) 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci#define PM8001_NAME_LENGTH 32/* generic length of strings */ 958c2ecf20Sopenharmony_ciextern struct list_head hba_list; 968c2ecf20Sopenharmony_ciextern const struct pm8001_dispatch pm8001_8001_dispatch; 978c2ecf20Sopenharmony_ciextern const struct pm8001_dispatch pm8001_80xx_dispatch; 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_cistruct pm8001_hba_info; 1008c2ecf20Sopenharmony_cistruct pm8001_ccb_info; 1018c2ecf20Sopenharmony_cistruct pm8001_device; 1028c2ecf20Sopenharmony_ci/* define task management IU */ 1038c2ecf20Sopenharmony_cistruct pm8001_tmf_task { 1048c2ecf20Sopenharmony_ci u8 tmf; 1058c2ecf20Sopenharmony_ci u32 tag_of_task_to_be_managed; 1068c2ecf20Sopenharmony_ci}; 1078c2ecf20Sopenharmony_cistruct pm8001_ioctl_payload { 1088c2ecf20Sopenharmony_ci u32 signature; 1098c2ecf20Sopenharmony_ci u16 major_function; 1108c2ecf20Sopenharmony_ci u16 minor_function; 1118c2ecf20Sopenharmony_ci u16 status; 1128c2ecf20Sopenharmony_ci u16 offset; 1138c2ecf20Sopenharmony_ci u16 id; 1148c2ecf20Sopenharmony_ci u32 wr_length; 1158c2ecf20Sopenharmony_ci u32 rd_length; 1168c2ecf20Sopenharmony_ci u8 *func_specific; 1178c2ecf20Sopenharmony_ci}; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci#define MPI_FATAL_ERROR_TABLE_OFFSET_MASK 0xFFFFFF 1208c2ecf20Sopenharmony_ci#define MPI_FATAL_ERROR_TABLE_SIZE(value) ((0xFF000000 & value) >> SHIFT24) 1218c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_TABLE_LO_OFFSET 0x00 /* HNFBUFL */ 1228c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_TABLE_HI_OFFSET 0x04 /* HNFBUFH */ 1238c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_TABLE_LENGTH 0x08 /* HNFBLEN */ 1248c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_TABLE_HANDSHAKE 0x0C /* FDDHSHK */ 1258c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_TABLE_STATUS 0x10 /* FDDTSTAT */ 1268c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_TABLE_ACCUM_LEN 0x14 /* ACCDDLEN */ 1278c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_TABLE_TOTAL_LEN 0x18 /* TOTALLEN */ 1288c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_TABLE_SIGNATURE 0x1C /* SIGNITURE */ 1298c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_HANDSHAKE_RDY 0x1 1308c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_HANDSHAKE_BUSY 0x0 1318c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_TABLE_STAT_RSVD 0x0 1328c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_TABLE_STAT_DMA_FAILED 0x1 1338c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_TABLE_STAT_NF_SUCCESS_MORE_DATA 0x2 1348c2ecf20Sopenharmony_ci#define MPI_FATAL_EDUMP_TABLE_STAT_NF_SUCCESS_DONE 0x3 1358c2ecf20Sopenharmony_ci#define TYPE_GSM_SPACE 1 1368c2ecf20Sopenharmony_ci#define TYPE_QUEUE 2 1378c2ecf20Sopenharmony_ci#define TYPE_FATAL 3 1388c2ecf20Sopenharmony_ci#define TYPE_NON_FATAL 4 1398c2ecf20Sopenharmony_ci#define TYPE_INBOUND 1 1408c2ecf20Sopenharmony_ci#define TYPE_OUTBOUND 2 1418c2ecf20Sopenharmony_cistruct forensic_data { 1428c2ecf20Sopenharmony_ci u32 data_type; 1438c2ecf20Sopenharmony_ci union { 1448c2ecf20Sopenharmony_ci struct { 1458c2ecf20Sopenharmony_ci u32 direct_len; 1468c2ecf20Sopenharmony_ci u32 direct_offset; 1478c2ecf20Sopenharmony_ci void *direct_data; 1488c2ecf20Sopenharmony_ci } gsm_buf; 1498c2ecf20Sopenharmony_ci struct { 1508c2ecf20Sopenharmony_ci u16 queue_type; 1518c2ecf20Sopenharmony_ci u16 queue_index; 1528c2ecf20Sopenharmony_ci u32 direct_len; 1538c2ecf20Sopenharmony_ci void *direct_data; 1548c2ecf20Sopenharmony_ci } queue_buf; 1558c2ecf20Sopenharmony_ci struct { 1568c2ecf20Sopenharmony_ci u32 direct_len; 1578c2ecf20Sopenharmony_ci u32 direct_offset; 1588c2ecf20Sopenharmony_ci u32 read_len; 1598c2ecf20Sopenharmony_ci void *direct_data; 1608c2ecf20Sopenharmony_ci } data_buf; 1618c2ecf20Sopenharmony_ci }; 1628c2ecf20Sopenharmony_ci}; 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci/* bit31-26 - mask bar */ 1658c2ecf20Sopenharmony_ci#define SCRATCH_PAD0_BAR_MASK 0xFC000000 1668c2ecf20Sopenharmony_ci/* bit25-0 - offset mask */ 1678c2ecf20Sopenharmony_ci#define SCRATCH_PAD0_OFFSET_MASK 0x03FFFFFF 1688c2ecf20Sopenharmony_ci/* if AAP error state */ 1698c2ecf20Sopenharmony_ci#define SCRATCH_PAD0_AAPERR_MASK 0xFFFFFFFF 1708c2ecf20Sopenharmony_ci/* Inbound doorbell bit7 */ 1718c2ecf20Sopenharmony_ci#define SPCv_MSGU_CFG_TABLE_NONFATAL_DUMP 0x80 1728c2ecf20Sopenharmony_ci/* Inbound doorbell bit7 SPCV */ 1738c2ecf20Sopenharmony_ci#define SPCV_MSGU_CFG_TABLE_TRANSFER_DEBUG_INFO 0x80 1748c2ecf20Sopenharmony_ci#define MAIN_MERRDCTO_MERRDCES 0xA0/* DWORD 0x28) */ 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_cistruct pm8001_dispatch { 1778c2ecf20Sopenharmony_ci char *name; 1788c2ecf20Sopenharmony_ci int (*chip_init)(struct pm8001_hba_info *pm8001_ha); 1798c2ecf20Sopenharmony_ci int (*chip_soft_rst)(struct pm8001_hba_info *pm8001_ha); 1808c2ecf20Sopenharmony_ci void (*chip_rst)(struct pm8001_hba_info *pm8001_ha); 1818c2ecf20Sopenharmony_ci int (*chip_ioremap)(struct pm8001_hba_info *pm8001_ha); 1828c2ecf20Sopenharmony_ci void (*chip_iounmap)(struct pm8001_hba_info *pm8001_ha); 1838c2ecf20Sopenharmony_ci irqreturn_t (*isr)(struct pm8001_hba_info *pm8001_ha, u8 vec); 1848c2ecf20Sopenharmony_ci u32 (*is_our_interrupt)(struct pm8001_hba_info *pm8001_ha); 1858c2ecf20Sopenharmony_ci int (*isr_process_oq)(struct pm8001_hba_info *pm8001_ha, u8 vec); 1868c2ecf20Sopenharmony_ci void (*interrupt_enable)(struct pm8001_hba_info *pm8001_ha, u8 vec); 1878c2ecf20Sopenharmony_ci void (*interrupt_disable)(struct pm8001_hba_info *pm8001_ha, u8 vec); 1888c2ecf20Sopenharmony_ci void (*make_prd)(struct scatterlist *scatter, int nr, void *prd); 1898c2ecf20Sopenharmony_ci int (*smp_req)(struct pm8001_hba_info *pm8001_ha, 1908c2ecf20Sopenharmony_ci struct pm8001_ccb_info *ccb); 1918c2ecf20Sopenharmony_ci int (*ssp_io_req)(struct pm8001_hba_info *pm8001_ha, 1928c2ecf20Sopenharmony_ci struct pm8001_ccb_info *ccb); 1938c2ecf20Sopenharmony_ci int (*sata_req)(struct pm8001_hba_info *pm8001_ha, 1948c2ecf20Sopenharmony_ci struct pm8001_ccb_info *ccb); 1958c2ecf20Sopenharmony_ci int (*phy_start_req)(struct pm8001_hba_info *pm8001_ha, u8 phy_id); 1968c2ecf20Sopenharmony_ci int (*phy_stop_req)(struct pm8001_hba_info *pm8001_ha, u8 phy_id); 1978c2ecf20Sopenharmony_ci int (*reg_dev_req)(struct pm8001_hba_info *pm8001_ha, 1988c2ecf20Sopenharmony_ci struct pm8001_device *pm8001_dev, u32 flag); 1998c2ecf20Sopenharmony_ci int (*dereg_dev_req)(struct pm8001_hba_info *pm8001_ha, u32 device_id); 2008c2ecf20Sopenharmony_ci int (*phy_ctl_req)(struct pm8001_hba_info *pm8001_ha, 2018c2ecf20Sopenharmony_ci u32 phy_id, u32 phy_op); 2028c2ecf20Sopenharmony_ci int (*task_abort)(struct pm8001_hba_info *pm8001_ha, 2038c2ecf20Sopenharmony_ci struct pm8001_device *pm8001_dev, u8 flag, u32 task_tag, 2048c2ecf20Sopenharmony_ci u32 cmd_tag); 2058c2ecf20Sopenharmony_ci int (*ssp_tm_req)(struct pm8001_hba_info *pm8001_ha, 2068c2ecf20Sopenharmony_ci struct pm8001_ccb_info *ccb, struct pm8001_tmf_task *tmf); 2078c2ecf20Sopenharmony_ci int (*get_nvmd_req)(struct pm8001_hba_info *pm8001_ha, void *payload); 2088c2ecf20Sopenharmony_ci int (*set_nvmd_req)(struct pm8001_hba_info *pm8001_ha, void *payload); 2098c2ecf20Sopenharmony_ci int (*fw_flash_update_req)(struct pm8001_hba_info *pm8001_ha, 2108c2ecf20Sopenharmony_ci void *payload); 2118c2ecf20Sopenharmony_ci int (*set_dev_state_req)(struct pm8001_hba_info *pm8001_ha, 2128c2ecf20Sopenharmony_ci struct pm8001_device *pm8001_dev, u32 state); 2138c2ecf20Sopenharmony_ci int (*sas_diag_start_end_req)(struct pm8001_hba_info *pm8001_ha, 2148c2ecf20Sopenharmony_ci u32 state); 2158c2ecf20Sopenharmony_ci int (*sas_diag_execute_req)(struct pm8001_hba_info *pm8001_ha, 2168c2ecf20Sopenharmony_ci u32 state); 2178c2ecf20Sopenharmony_ci int (*sas_re_init_req)(struct pm8001_hba_info *pm8001_ha); 2188c2ecf20Sopenharmony_ci}; 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_cistruct pm8001_chip_info { 2218c2ecf20Sopenharmony_ci u32 encrypt; 2228c2ecf20Sopenharmony_ci u32 n_phy; 2238c2ecf20Sopenharmony_ci const struct pm8001_dispatch *dispatch; 2248c2ecf20Sopenharmony_ci}; 2258c2ecf20Sopenharmony_ci#define PM8001_CHIP_DISP (pm8001_ha->chip->dispatch) 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_cistruct pm8001_port { 2288c2ecf20Sopenharmony_ci struct asd_sas_port sas_port; 2298c2ecf20Sopenharmony_ci u8 port_attached; 2308c2ecf20Sopenharmony_ci u16 wide_port_phymap; 2318c2ecf20Sopenharmony_ci u8 port_state; 2328c2ecf20Sopenharmony_ci struct list_head list; 2338c2ecf20Sopenharmony_ci}; 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_cistruct pm8001_phy { 2368c2ecf20Sopenharmony_ci struct pm8001_hba_info *pm8001_ha; 2378c2ecf20Sopenharmony_ci struct pm8001_port *port; 2388c2ecf20Sopenharmony_ci struct asd_sas_phy sas_phy; 2398c2ecf20Sopenharmony_ci struct sas_identify identify; 2408c2ecf20Sopenharmony_ci struct scsi_device *sdev; 2418c2ecf20Sopenharmony_ci u64 dev_sas_addr; 2428c2ecf20Sopenharmony_ci u32 phy_type; 2438c2ecf20Sopenharmony_ci struct completion *enable_completion; 2448c2ecf20Sopenharmony_ci u32 frame_rcvd_size; 2458c2ecf20Sopenharmony_ci u8 frame_rcvd[32]; 2468c2ecf20Sopenharmony_ci u8 phy_attached; 2478c2ecf20Sopenharmony_ci u8 phy_state; 2488c2ecf20Sopenharmony_ci enum sas_linkrate minimum_linkrate; 2498c2ecf20Sopenharmony_ci enum sas_linkrate maximum_linkrate; 2508c2ecf20Sopenharmony_ci struct completion *reset_completion; 2518c2ecf20Sopenharmony_ci bool port_reset_status; 2528c2ecf20Sopenharmony_ci bool reset_success; 2538c2ecf20Sopenharmony_ci}; 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci/* port reset status */ 2568c2ecf20Sopenharmony_ci#define PORT_RESET_SUCCESS 0x00 2578c2ecf20Sopenharmony_ci#define PORT_RESET_TMO 0x01 2588c2ecf20Sopenharmony_ci 2598c2ecf20Sopenharmony_cistruct pm8001_device { 2608c2ecf20Sopenharmony_ci enum sas_device_type dev_type; 2618c2ecf20Sopenharmony_ci struct domain_device *sas_device; 2628c2ecf20Sopenharmony_ci u32 attached_phy; 2638c2ecf20Sopenharmony_ci u32 id; 2648c2ecf20Sopenharmony_ci struct completion *dcompletion; 2658c2ecf20Sopenharmony_ci struct completion *setds_completion; 2668c2ecf20Sopenharmony_ci u32 device_id; 2678c2ecf20Sopenharmony_ci atomic_t running_req; 2688c2ecf20Sopenharmony_ci}; 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_cistruct pm8001_prd_imt { 2718c2ecf20Sopenharmony_ci __le32 len; 2728c2ecf20Sopenharmony_ci __le32 e; 2738c2ecf20Sopenharmony_ci}; 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_cistruct pm8001_prd { 2768c2ecf20Sopenharmony_ci __le64 addr; /* 64-bit buffer address */ 2778c2ecf20Sopenharmony_ci struct pm8001_prd_imt im_len; /* 64-bit length */ 2788c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 2798c2ecf20Sopenharmony_ci/* 2808c2ecf20Sopenharmony_ci * CCB(Command Control Block) 2818c2ecf20Sopenharmony_ci */ 2828c2ecf20Sopenharmony_cistruct pm8001_ccb_info { 2838c2ecf20Sopenharmony_ci struct list_head entry; 2848c2ecf20Sopenharmony_ci struct sas_task *task; 2858c2ecf20Sopenharmony_ci u32 n_elem; 2868c2ecf20Sopenharmony_ci u32 ccb_tag; 2878c2ecf20Sopenharmony_ci dma_addr_t ccb_dma_handle; 2888c2ecf20Sopenharmony_ci struct pm8001_device *device; 2898c2ecf20Sopenharmony_ci struct pm8001_prd *buf_prd; 2908c2ecf20Sopenharmony_ci struct fw_control_ex *fw_control_context; 2918c2ecf20Sopenharmony_ci u8 open_retry; 2928c2ecf20Sopenharmony_ci}; 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_cistruct mpi_mem { 2958c2ecf20Sopenharmony_ci void *virt_ptr; 2968c2ecf20Sopenharmony_ci dma_addr_t phys_addr; 2978c2ecf20Sopenharmony_ci u32 phys_addr_hi; 2988c2ecf20Sopenharmony_ci u32 phys_addr_lo; 2998c2ecf20Sopenharmony_ci u32 total_len; 3008c2ecf20Sopenharmony_ci u32 num_elements; 3018c2ecf20Sopenharmony_ci u32 element_size; 3028c2ecf20Sopenharmony_ci u32 alignment; 3038c2ecf20Sopenharmony_ci}; 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_cistruct mpi_mem_req { 3068c2ecf20Sopenharmony_ci /* The number of element in the mpiMemory array */ 3078c2ecf20Sopenharmony_ci u32 count; 3088c2ecf20Sopenharmony_ci /* The array of structures that define memroy regions*/ 3098c2ecf20Sopenharmony_ci struct mpi_mem region[USI_MAX_MEMCNT]; 3108c2ecf20Sopenharmony_ci}; 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_cistruct encrypt { 3138c2ecf20Sopenharmony_ci u32 cipher_mode; 3148c2ecf20Sopenharmony_ci u32 sec_mode; 3158c2ecf20Sopenharmony_ci u32 status; 3168c2ecf20Sopenharmony_ci u32 flag; 3178c2ecf20Sopenharmony_ci}; 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_cistruct sas_phy_attribute_table { 3208c2ecf20Sopenharmony_ci u32 phystart1_16[16]; 3218c2ecf20Sopenharmony_ci u32 outbound_hw_event_pid1_16[16]; 3228c2ecf20Sopenharmony_ci}; 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_ciunion main_cfg_table { 3258c2ecf20Sopenharmony_ci struct { 3268c2ecf20Sopenharmony_ci u32 signature; 3278c2ecf20Sopenharmony_ci u32 interface_rev; 3288c2ecf20Sopenharmony_ci u32 firmware_rev; 3298c2ecf20Sopenharmony_ci u32 max_out_io; 3308c2ecf20Sopenharmony_ci u32 max_sgl; 3318c2ecf20Sopenharmony_ci u32 ctrl_cap_flag; 3328c2ecf20Sopenharmony_ci u32 gst_offset; 3338c2ecf20Sopenharmony_ci u32 inbound_queue_offset; 3348c2ecf20Sopenharmony_ci u32 outbound_queue_offset; 3358c2ecf20Sopenharmony_ci u32 inbound_q_nppd_hppd; 3368c2ecf20Sopenharmony_ci u32 outbound_hw_event_pid0_3; 3378c2ecf20Sopenharmony_ci u32 outbound_hw_event_pid4_7; 3388c2ecf20Sopenharmony_ci u32 outbound_ncq_event_pid0_3; 3398c2ecf20Sopenharmony_ci u32 outbound_ncq_event_pid4_7; 3408c2ecf20Sopenharmony_ci u32 outbound_tgt_ITNexus_event_pid0_3; 3418c2ecf20Sopenharmony_ci u32 outbound_tgt_ITNexus_event_pid4_7; 3428c2ecf20Sopenharmony_ci u32 outbound_tgt_ssp_event_pid0_3; 3438c2ecf20Sopenharmony_ci u32 outbound_tgt_ssp_event_pid4_7; 3448c2ecf20Sopenharmony_ci u32 outbound_tgt_smp_event_pid0_3; 3458c2ecf20Sopenharmony_ci u32 outbound_tgt_smp_event_pid4_7; 3468c2ecf20Sopenharmony_ci u32 upper_event_log_addr; 3478c2ecf20Sopenharmony_ci u32 lower_event_log_addr; 3488c2ecf20Sopenharmony_ci u32 event_log_size; 3498c2ecf20Sopenharmony_ci u32 event_log_option; 3508c2ecf20Sopenharmony_ci u32 upper_iop_event_log_addr; 3518c2ecf20Sopenharmony_ci u32 lower_iop_event_log_addr; 3528c2ecf20Sopenharmony_ci u32 iop_event_log_size; 3538c2ecf20Sopenharmony_ci u32 iop_event_log_option; 3548c2ecf20Sopenharmony_ci u32 fatal_err_interrupt; 3558c2ecf20Sopenharmony_ci u32 fatal_err_dump_offset0; 3568c2ecf20Sopenharmony_ci u32 fatal_err_dump_length0; 3578c2ecf20Sopenharmony_ci u32 fatal_err_dump_offset1; 3588c2ecf20Sopenharmony_ci u32 fatal_err_dump_length1; 3598c2ecf20Sopenharmony_ci u32 hda_mode_flag; 3608c2ecf20Sopenharmony_ci u32 anolog_setup_table_offset; 3618c2ecf20Sopenharmony_ci u32 rsvd[4]; 3628c2ecf20Sopenharmony_ci } pm8001_tbl; 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_ci struct { 3658c2ecf20Sopenharmony_ci u32 signature; 3668c2ecf20Sopenharmony_ci u32 interface_rev; 3678c2ecf20Sopenharmony_ci u32 firmware_rev; 3688c2ecf20Sopenharmony_ci u32 max_out_io; 3698c2ecf20Sopenharmony_ci u32 max_sgl; 3708c2ecf20Sopenharmony_ci u32 ctrl_cap_flag; 3718c2ecf20Sopenharmony_ci u32 gst_offset; 3728c2ecf20Sopenharmony_ci u32 inbound_queue_offset; 3738c2ecf20Sopenharmony_ci u32 outbound_queue_offset; 3748c2ecf20Sopenharmony_ci u32 inbound_q_nppd_hppd; 3758c2ecf20Sopenharmony_ci u32 rsvd[8]; 3768c2ecf20Sopenharmony_ci u32 crc_core_dump; 3778c2ecf20Sopenharmony_ci u32 rsvd1; 3788c2ecf20Sopenharmony_ci u32 upper_event_log_addr; 3798c2ecf20Sopenharmony_ci u32 lower_event_log_addr; 3808c2ecf20Sopenharmony_ci u32 event_log_size; 3818c2ecf20Sopenharmony_ci u32 event_log_severity; 3828c2ecf20Sopenharmony_ci u32 upper_pcs_event_log_addr; 3838c2ecf20Sopenharmony_ci u32 lower_pcs_event_log_addr; 3848c2ecf20Sopenharmony_ci u32 pcs_event_log_size; 3858c2ecf20Sopenharmony_ci u32 pcs_event_log_severity; 3868c2ecf20Sopenharmony_ci u32 fatal_err_interrupt; 3878c2ecf20Sopenharmony_ci u32 fatal_err_dump_offset0; 3888c2ecf20Sopenharmony_ci u32 fatal_err_dump_length0; 3898c2ecf20Sopenharmony_ci u32 fatal_err_dump_offset1; 3908c2ecf20Sopenharmony_ci u32 fatal_err_dump_length1; 3918c2ecf20Sopenharmony_ci u32 gpio_led_mapping; 3928c2ecf20Sopenharmony_ci u32 analog_setup_table_offset; 3938c2ecf20Sopenharmony_ci u32 int_vec_table_offset; 3948c2ecf20Sopenharmony_ci u32 phy_attr_table_offset; 3958c2ecf20Sopenharmony_ci u32 port_recovery_timer; 3968c2ecf20Sopenharmony_ci u32 interrupt_reassertion_delay; 3978c2ecf20Sopenharmony_ci u32 fatal_n_non_fatal_dump; /* 0x28 */ 3988c2ecf20Sopenharmony_ci u32 ila_version; 3998c2ecf20Sopenharmony_ci u32 inc_fw_version; 4008c2ecf20Sopenharmony_ci } pm80xx_tbl; 4018c2ecf20Sopenharmony_ci}; 4028c2ecf20Sopenharmony_ci 4038c2ecf20Sopenharmony_ciunion general_status_table { 4048c2ecf20Sopenharmony_ci struct { 4058c2ecf20Sopenharmony_ci u32 gst_len_mpistate; 4068c2ecf20Sopenharmony_ci u32 iq_freeze_state0; 4078c2ecf20Sopenharmony_ci u32 iq_freeze_state1; 4088c2ecf20Sopenharmony_ci u32 msgu_tcnt; 4098c2ecf20Sopenharmony_ci u32 iop_tcnt; 4108c2ecf20Sopenharmony_ci u32 rsvd; 4118c2ecf20Sopenharmony_ci u32 phy_state[8]; 4128c2ecf20Sopenharmony_ci u32 gpio_input_val; 4138c2ecf20Sopenharmony_ci u32 rsvd1[2]; 4148c2ecf20Sopenharmony_ci u32 recover_err_info[8]; 4158c2ecf20Sopenharmony_ci } pm8001_tbl; 4168c2ecf20Sopenharmony_ci struct { 4178c2ecf20Sopenharmony_ci u32 gst_len_mpistate; 4188c2ecf20Sopenharmony_ci u32 iq_freeze_state0; 4198c2ecf20Sopenharmony_ci u32 iq_freeze_state1; 4208c2ecf20Sopenharmony_ci u32 msgu_tcnt; 4218c2ecf20Sopenharmony_ci u32 iop_tcnt; 4228c2ecf20Sopenharmony_ci u32 rsvd[9]; 4238c2ecf20Sopenharmony_ci u32 gpio_input_val; 4248c2ecf20Sopenharmony_ci u32 rsvd1[2]; 4258c2ecf20Sopenharmony_ci u32 recover_err_info[8]; 4268c2ecf20Sopenharmony_ci } pm80xx_tbl; 4278c2ecf20Sopenharmony_ci}; 4288c2ecf20Sopenharmony_cistruct inbound_queue_table { 4298c2ecf20Sopenharmony_ci u32 element_pri_size_cnt; 4308c2ecf20Sopenharmony_ci u32 upper_base_addr; 4318c2ecf20Sopenharmony_ci u32 lower_base_addr; 4328c2ecf20Sopenharmony_ci u32 ci_upper_base_addr; 4338c2ecf20Sopenharmony_ci u32 ci_lower_base_addr; 4348c2ecf20Sopenharmony_ci u32 pi_pci_bar; 4358c2ecf20Sopenharmony_ci u32 pi_offset; 4368c2ecf20Sopenharmony_ci u32 total_length; 4378c2ecf20Sopenharmony_ci void *base_virt; 4388c2ecf20Sopenharmony_ci void *ci_virt; 4398c2ecf20Sopenharmony_ci u32 reserved; 4408c2ecf20Sopenharmony_ci __le32 consumer_index; 4418c2ecf20Sopenharmony_ci u32 producer_idx; 4428c2ecf20Sopenharmony_ci spinlock_t iq_lock; 4438c2ecf20Sopenharmony_ci}; 4448c2ecf20Sopenharmony_cistruct outbound_queue_table { 4458c2ecf20Sopenharmony_ci u32 element_size_cnt; 4468c2ecf20Sopenharmony_ci u32 upper_base_addr; 4478c2ecf20Sopenharmony_ci u32 lower_base_addr; 4488c2ecf20Sopenharmony_ci void *base_virt; 4498c2ecf20Sopenharmony_ci u32 pi_upper_base_addr; 4508c2ecf20Sopenharmony_ci u32 pi_lower_base_addr; 4518c2ecf20Sopenharmony_ci u32 ci_pci_bar; 4528c2ecf20Sopenharmony_ci u32 ci_offset; 4538c2ecf20Sopenharmony_ci u32 total_length; 4548c2ecf20Sopenharmony_ci void *pi_virt; 4558c2ecf20Sopenharmony_ci u32 interrup_vec_cnt_delay; 4568c2ecf20Sopenharmony_ci u32 dinterrup_to_pci_offset; 4578c2ecf20Sopenharmony_ci __le32 producer_index; 4588c2ecf20Sopenharmony_ci u32 consumer_idx; 4598c2ecf20Sopenharmony_ci}; 4608c2ecf20Sopenharmony_cistruct pm8001_hba_memspace { 4618c2ecf20Sopenharmony_ci void __iomem *memvirtaddr; 4628c2ecf20Sopenharmony_ci u64 membase; 4638c2ecf20Sopenharmony_ci u32 memsize; 4648c2ecf20Sopenharmony_ci}; 4658c2ecf20Sopenharmony_cistruct isr_param { 4668c2ecf20Sopenharmony_ci struct pm8001_hba_info *drv_inst; 4678c2ecf20Sopenharmony_ci u32 irq_id; 4688c2ecf20Sopenharmony_ci}; 4698c2ecf20Sopenharmony_cistruct pm8001_hba_info { 4708c2ecf20Sopenharmony_ci char name[PM8001_NAME_LENGTH]; 4718c2ecf20Sopenharmony_ci struct list_head list; 4728c2ecf20Sopenharmony_ci unsigned long flags; 4738c2ecf20Sopenharmony_ci spinlock_t lock;/* host-wide lock */ 4748c2ecf20Sopenharmony_ci spinlock_t bitmap_lock; 4758c2ecf20Sopenharmony_ci struct pci_dev *pdev;/* our device */ 4768c2ecf20Sopenharmony_ci struct device *dev; 4778c2ecf20Sopenharmony_ci struct pm8001_hba_memspace io_mem[6]; 4788c2ecf20Sopenharmony_ci struct mpi_mem_req memoryMap; 4798c2ecf20Sopenharmony_ci struct encrypt encrypt_info; /* support encryption */ 4808c2ecf20Sopenharmony_ci struct forensic_data forensic_info; 4818c2ecf20Sopenharmony_ci u32 fatal_bar_loc; 4828c2ecf20Sopenharmony_ci u32 forensic_last_offset; 4838c2ecf20Sopenharmony_ci u32 fatal_forensic_shift_offset; 4848c2ecf20Sopenharmony_ci u32 forensic_fatal_step; 4858c2ecf20Sopenharmony_ci u32 forensic_preserved_accumulated_transfer; 4868c2ecf20Sopenharmony_ci u32 evtlog_ib_offset; 4878c2ecf20Sopenharmony_ci u32 evtlog_ob_offset; 4888c2ecf20Sopenharmony_ci void __iomem *msg_unit_tbl_addr;/*Message Unit Table Addr*/ 4898c2ecf20Sopenharmony_ci void __iomem *main_cfg_tbl_addr;/*Main Config Table Addr*/ 4908c2ecf20Sopenharmony_ci void __iomem *general_stat_tbl_addr;/*General Status Table Addr*/ 4918c2ecf20Sopenharmony_ci void __iomem *inbnd_q_tbl_addr;/*Inbound Queue Config Table Addr*/ 4928c2ecf20Sopenharmony_ci void __iomem *outbnd_q_tbl_addr;/*Outbound Queue Config Table Addr*/ 4938c2ecf20Sopenharmony_ci void __iomem *pspa_q_tbl_addr; 4948c2ecf20Sopenharmony_ci /*MPI SAS PHY attributes Queue Config Table Addr*/ 4958c2ecf20Sopenharmony_ci void __iomem *ivt_tbl_addr; /*MPI IVT Table Addr */ 4968c2ecf20Sopenharmony_ci void __iomem *fatal_tbl_addr; /*MPI IVT Table Addr */ 4978c2ecf20Sopenharmony_ci union main_cfg_table main_cfg_tbl; 4988c2ecf20Sopenharmony_ci union general_status_table gs_tbl; 4998c2ecf20Sopenharmony_ci struct inbound_queue_table inbnd_q_tbl[PM8001_MAX_INB_NUM]; 5008c2ecf20Sopenharmony_ci struct outbound_queue_table outbnd_q_tbl[PM8001_MAX_OUTB_NUM]; 5018c2ecf20Sopenharmony_ci struct sas_phy_attribute_table phy_attr_table; 5028c2ecf20Sopenharmony_ci /* MPI SAS PHY attributes */ 5038c2ecf20Sopenharmony_ci u8 sas_addr[SAS_ADDR_SIZE]; 5048c2ecf20Sopenharmony_ci struct sas_ha_struct *sas;/* SCSI/SAS glue */ 5058c2ecf20Sopenharmony_ci struct Scsi_Host *shost; 5068c2ecf20Sopenharmony_ci u32 chip_id; 5078c2ecf20Sopenharmony_ci const struct pm8001_chip_info *chip; 5088c2ecf20Sopenharmony_ci struct completion *nvmd_completion; 5098c2ecf20Sopenharmony_ci int tags_num; 5108c2ecf20Sopenharmony_ci unsigned long *tags; 5118c2ecf20Sopenharmony_ci struct pm8001_phy phy[PM8001_MAX_PHYS]; 5128c2ecf20Sopenharmony_ci struct pm8001_port port[PM8001_MAX_PHYS]; 5138c2ecf20Sopenharmony_ci u32 id; 5148c2ecf20Sopenharmony_ci u32 irq; 5158c2ecf20Sopenharmony_ci u32 iomb_size; /* SPC and SPCV IOMB size */ 5168c2ecf20Sopenharmony_ci struct pm8001_device *devices; 5178c2ecf20Sopenharmony_ci struct pm8001_ccb_info *ccb_info; 5188c2ecf20Sopenharmony_ci#ifdef PM8001_USE_MSIX 5198c2ecf20Sopenharmony_ci int number_of_intr;/*will be used in remove()*/ 5208c2ecf20Sopenharmony_ci char intr_drvname[PM8001_MAX_MSIX_VEC] 5218c2ecf20Sopenharmony_ci [PM8001_NAME_LENGTH+1+3+1]; 5228c2ecf20Sopenharmony_ci#endif 5238c2ecf20Sopenharmony_ci#ifdef PM8001_USE_TASKLET 5248c2ecf20Sopenharmony_ci struct tasklet_struct tasklet[PM8001_MAX_MSIX_VEC]; 5258c2ecf20Sopenharmony_ci#endif 5268c2ecf20Sopenharmony_ci u32 logging_level; 5278c2ecf20Sopenharmony_ci u32 link_rate; 5288c2ecf20Sopenharmony_ci u32 fw_status; 5298c2ecf20Sopenharmony_ci u32 smp_exp_mode; 5308c2ecf20Sopenharmony_ci bool controller_fatal_error; 5318c2ecf20Sopenharmony_ci const struct firmware *fw_image; 5328c2ecf20Sopenharmony_ci struct isr_param irq_vector[PM8001_MAX_MSIX_VEC]; 5338c2ecf20Sopenharmony_ci u32 reset_in_progress; 5348c2ecf20Sopenharmony_ci u32 non_fatal_count; 5358c2ecf20Sopenharmony_ci u32 non_fatal_read_length; 5368c2ecf20Sopenharmony_ci u32 max_q_num; 5378c2ecf20Sopenharmony_ci u32 ib_offset; 5388c2ecf20Sopenharmony_ci u32 ob_offset; 5398c2ecf20Sopenharmony_ci u32 ci_offset; 5408c2ecf20Sopenharmony_ci u32 pi_offset; 5418c2ecf20Sopenharmony_ci u32 max_memcnt; 5428c2ecf20Sopenharmony_ci}; 5438c2ecf20Sopenharmony_ci 5448c2ecf20Sopenharmony_cistruct pm8001_work { 5458c2ecf20Sopenharmony_ci struct work_struct work; 5468c2ecf20Sopenharmony_ci struct pm8001_hba_info *pm8001_ha; 5478c2ecf20Sopenharmony_ci void *data; 5488c2ecf20Sopenharmony_ci int handler; 5498c2ecf20Sopenharmony_ci}; 5508c2ecf20Sopenharmony_ci 5518c2ecf20Sopenharmony_cistruct pm8001_fw_image_header { 5528c2ecf20Sopenharmony_ci u8 vender_id[8]; 5538c2ecf20Sopenharmony_ci u8 product_id; 5548c2ecf20Sopenharmony_ci u8 hardware_rev; 5558c2ecf20Sopenharmony_ci u8 dest_partition; 5568c2ecf20Sopenharmony_ci u8 reserved; 5578c2ecf20Sopenharmony_ci u8 fw_rev[4]; 5588c2ecf20Sopenharmony_ci __be32 image_length; 5598c2ecf20Sopenharmony_ci __be32 image_crc; 5608c2ecf20Sopenharmony_ci __be32 startup_entry; 5618c2ecf20Sopenharmony_ci} __attribute__((packed, aligned(4))); 5628c2ecf20Sopenharmony_ci 5638c2ecf20Sopenharmony_ci 5648c2ecf20Sopenharmony_ci/** 5658c2ecf20Sopenharmony_ci * FW Flash Update status values 5668c2ecf20Sopenharmony_ci */ 5678c2ecf20Sopenharmony_ci#define FLASH_UPDATE_COMPLETE_PENDING_REBOOT 0x00 5688c2ecf20Sopenharmony_ci#define FLASH_UPDATE_IN_PROGRESS 0x01 5698c2ecf20Sopenharmony_ci#define FLASH_UPDATE_HDR_ERR 0x02 5708c2ecf20Sopenharmony_ci#define FLASH_UPDATE_OFFSET_ERR 0x03 5718c2ecf20Sopenharmony_ci#define FLASH_UPDATE_CRC_ERR 0x04 5728c2ecf20Sopenharmony_ci#define FLASH_UPDATE_LENGTH_ERR 0x05 5738c2ecf20Sopenharmony_ci#define FLASH_UPDATE_HW_ERR 0x06 5748c2ecf20Sopenharmony_ci#define FLASH_UPDATE_DNLD_NOT_SUPPORTED 0x10 5758c2ecf20Sopenharmony_ci#define FLASH_UPDATE_DISABLED 0x11 5768c2ecf20Sopenharmony_ci 5778c2ecf20Sopenharmony_ci#define NCQ_READ_LOG_FLAG 0x80000000 5788c2ecf20Sopenharmony_ci#define NCQ_ABORT_ALL_FLAG 0x40000000 5798c2ecf20Sopenharmony_ci#define NCQ_2ND_RLE_FLAG 0x20000000 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_ci/* Device states */ 5828c2ecf20Sopenharmony_ci#define DS_OPERATIONAL 0x01 5838c2ecf20Sopenharmony_ci#define DS_PORT_IN_RESET 0x02 5848c2ecf20Sopenharmony_ci#define DS_IN_RECOVERY 0x03 5858c2ecf20Sopenharmony_ci#define DS_IN_ERROR 0x04 5868c2ecf20Sopenharmony_ci#define DS_NON_OPERATIONAL 0x07 5878c2ecf20Sopenharmony_ci 5888c2ecf20Sopenharmony_ci/** 5898c2ecf20Sopenharmony_ci * brief param structure for firmware flash update. 5908c2ecf20Sopenharmony_ci */ 5918c2ecf20Sopenharmony_cistruct fw_flash_updata_info { 5928c2ecf20Sopenharmony_ci u32 cur_image_offset; 5938c2ecf20Sopenharmony_ci u32 cur_image_len; 5948c2ecf20Sopenharmony_ci u32 total_image_len; 5958c2ecf20Sopenharmony_ci struct pm8001_prd sgl; 5968c2ecf20Sopenharmony_ci}; 5978c2ecf20Sopenharmony_ci 5988c2ecf20Sopenharmony_cistruct fw_control_info { 5998c2ecf20Sopenharmony_ci u32 retcode;/*ret code (status)*/ 6008c2ecf20Sopenharmony_ci u32 phase;/*ret code phase*/ 6018c2ecf20Sopenharmony_ci u32 phaseCmplt;/*percent complete for the current 6028c2ecf20Sopenharmony_ci update phase */ 6038c2ecf20Sopenharmony_ci u32 version;/*Hex encoded firmware version number*/ 6048c2ecf20Sopenharmony_ci u32 offset;/*Used for downloading firmware */ 6058c2ecf20Sopenharmony_ci u32 len; /*len of buffer*/ 6068c2ecf20Sopenharmony_ci u32 size;/* Used in OS VPD and Trace get size 6078c2ecf20Sopenharmony_ci operations.*/ 6088c2ecf20Sopenharmony_ci u32 reserved;/* padding required for 64 bit 6098c2ecf20Sopenharmony_ci alignment */ 6108c2ecf20Sopenharmony_ci u8 buffer[1];/* Start of buffer */ 6118c2ecf20Sopenharmony_ci}; 6128c2ecf20Sopenharmony_cistruct fw_control_ex { 6138c2ecf20Sopenharmony_ci struct fw_control_info *fw_control; 6148c2ecf20Sopenharmony_ci void *buffer;/* keep buffer pointer to be 6158c2ecf20Sopenharmony_ci freed when the response comes*/ 6168c2ecf20Sopenharmony_ci void *virtAddr;/* keep virtual address of the data */ 6178c2ecf20Sopenharmony_ci void *usrAddr;/* keep virtual address of the 6188c2ecf20Sopenharmony_ci user data */ 6198c2ecf20Sopenharmony_ci dma_addr_t phys_addr; 6208c2ecf20Sopenharmony_ci u32 len; /* len of buffer */ 6218c2ecf20Sopenharmony_ci void *payload; /* pointer to IOCTL Payload */ 6228c2ecf20Sopenharmony_ci u8 inProgress;/*if 1 - the IOCTL request is in 6238c2ecf20Sopenharmony_ci progress */ 6248c2ecf20Sopenharmony_ci void *param1; 6258c2ecf20Sopenharmony_ci void *param2; 6268c2ecf20Sopenharmony_ci void *param3; 6278c2ecf20Sopenharmony_ci}; 6288c2ecf20Sopenharmony_ci 6298c2ecf20Sopenharmony_ci/* pm8001 workqueue */ 6308c2ecf20Sopenharmony_ciextern struct workqueue_struct *pm8001_wq; 6318c2ecf20Sopenharmony_ci 6328c2ecf20Sopenharmony_ci/******************** function prototype *********************/ 6338c2ecf20Sopenharmony_ciint pm8001_tag_alloc(struct pm8001_hba_info *pm8001_ha, u32 *tag_out); 6348c2ecf20Sopenharmony_civoid pm8001_tag_init(struct pm8001_hba_info *pm8001_ha); 6358c2ecf20Sopenharmony_ciu32 pm8001_get_ncq_tag(struct sas_task *task, u32 *tag); 6368c2ecf20Sopenharmony_civoid pm8001_ccb_task_free(struct pm8001_hba_info *pm8001_ha, 6378c2ecf20Sopenharmony_ci struct sas_task *task, struct pm8001_ccb_info *ccb, u32 ccb_idx); 6388c2ecf20Sopenharmony_ciint pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func, 6398c2ecf20Sopenharmony_ci void *funcdata); 6408c2ecf20Sopenharmony_civoid pm8001_scan_start(struct Scsi_Host *shost); 6418c2ecf20Sopenharmony_ciint pm8001_scan_finished(struct Scsi_Host *shost, unsigned long time); 6428c2ecf20Sopenharmony_ciint pm8001_queue_command(struct sas_task *task, gfp_t gfp_flags); 6438c2ecf20Sopenharmony_ciint pm8001_abort_task(struct sas_task *task); 6448c2ecf20Sopenharmony_ciint pm8001_abort_task_set(struct domain_device *dev, u8 *lun); 6458c2ecf20Sopenharmony_ciint pm8001_clear_aca(struct domain_device *dev, u8 *lun); 6468c2ecf20Sopenharmony_ciint pm8001_clear_task_set(struct domain_device *dev, u8 *lun); 6478c2ecf20Sopenharmony_ciint pm8001_dev_found(struct domain_device *dev); 6488c2ecf20Sopenharmony_civoid pm8001_dev_gone(struct domain_device *dev); 6498c2ecf20Sopenharmony_ciint pm8001_lu_reset(struct domain_device *dev, u8 *lun); 6508c2ecf20Sopenharmony_ciint pm8001_I_T_nexus_reset(struct domain_device *dev); 6518c2ecf20Sopenharmony_ciint pm8001_I_T_nexus_event_handler(struct domain_device *dev); 6528c2ecf20Sopenharmony_ciint pm8001_query_task(struct sas_task *task); 6538c2ecf20Sopenharmony_civoid pm8001_open_reject_retry( 6548c2ecf20Sopenharmony_ci struct pm8001_hba_info *pm8001_ha, 6558c2ecf20Sopenharmony_ci struct sas_task *task_to_close, 6568c2ecf20Sopenharmony_ci struct pm8001_device *device_to_close); 6578c2ecf20Sopenharmony_ciint pm8001_mem_alloc(struct pci_dev *pdev, void **virt_addr, 6588c2ecf20Sopenharmony_ci dma_addr_t *pphys_addr, u32 *pphys_addr_hi, u32 *pphys_addr_lo, 6598c2ecf20Sopenharmony_ci u32 mem_size, u32 align); 6608c2ecf20Sopenharmony_ci 6618c2ecf20Sopenharmony_civoid pm8001_chip_iounmap(struct pm8001_hba_info *pm8001_ha); 6628c2ecf20Sopenharmony_ciint pm8001_mpi_build_cmd(struct pm8001_hba_info *pm8001_ha, 6638c2ecf20Sopenharmony_ci struct inbound_queue_table *circularQ, 6648c2ecf20Sopenharmony_ci u32 opCode, void *payload, size_t nb, 6658c2ecf20Sopenharmony_ci u32 responseQueue); 6668c2ecf20Sopenharmony_ciint pm8001_mpi_msg_free_get(struct inbound_queue_table *circularQ, 6678c2ecf20Sopenharmony_ci u16 messageSize, void **messagePtr); 6688c2ecf20Sopenharmony_ciu32 pm8001_mpi_msg_free_set(struct pm8001_hba_info *pm8001_ha, void *pMsg, 6698c2ecf20Sopenharmony_ci struct outbound_queue_table *circularQ, u8 bc); 6708c2ecf20Sopenharmony_ciu32 pm8001_mpi_msg_consume(struct pm8001_hba_info *pm8001_ha, 6718c2ecf20Sopenharmony_ci struct outbound_queue_table *circularQ, 6728c2ecf20Sopenharmony_ci void **messagePtr1, u8 *pBC); 6738c2ecf20Sopenharmony_ciint pm8001_chip_set_dev_state_req(struct pm8001_hba_info *pm8001_ha, 6748c2ecf20Sopenharmony_ci struct pm8001_device *pm8001_dev, u32 state); 6758c2ecf20Sopenharmony_ciint pm8001_chip_fw_flash_update_req(struct pm8001_hba_info *pm8001_ha, 6768c2ecf20Sopenharmony_ci void *payload); 6778c2ecf20Sopenharmony_ciint pm8001_chip_fw_flash_update_build(struct pm8001_hba_info *pm8001_ha, 6788c2ecf20Sopenharmony_ci void *fw_flash_updata_info, u32 tag); 6798c2ecf20Sopenharmony_ciint pm8001_chip_set_nvmd_req(struct pm8001_hba_info *pm8001_ha, void *payload); 6808c2ecf20Sopenharmony_ciint pm8001_chip_get_nvmd_req(struct pm8001_hba_info *pm8001_ha, void *payload); 6818c2ecf20Sopenharmony_ciint pm8001_chip_ssp_tm_req(struct pm8001_hba_info *pm8001_ha, 6828c2ecf20Sopenharmony_ci struct pm8001_ccb_info *ccb, 6838c2ecf20Sopenharmony_ci struct pm8001_tmf_task *tmf); 6848c2ecf20Sopenharmony_ciint pm8001_chip_abort_task(struct pm8001_hba_info *pm8001_ha, 6858c2ecf20Sopenharmony_ci struct pm8001_device *pm8001_dev, 6868c2ecf20Sopenharmony_ci u8 flag, u32 task_tag, u32 cmd_tag); 6878c2ecf20Sopenharmony_ciint pm8001_chip_dereg_dev_req(struct pm8001_hba_info *pm8001_ha, u32 device_id); 6888c2ecf20Sopenharmony_civoid pm8001_chip_make_sg(struct scatterlist *scatter, int nr, void *prd); 6898c2ecf20Sopenharmony_civoid pm8001_work_fn(struct work_struct *work); 6908c2ecf20Sopenharmony_ciint pm8001_handle_event(struct pm8001_hba_info *pm8001_ha, 6918c2ecf20Sopenharmony_ci void *data, int handler); 6928c2ecf20Sopenharmony_civoid pm8001_mpi_set_dev_state_resp(struct pm8001_hba_info *pm8001_ha, 6938c2ecf20Sopenharmony_ci void *piomb); 6948c2ecf20Sopenharmony_civoid pm8001_mpi_set_nvmd_resp(struct pm8001_hba_info *pm8001_ha, 6958c2ecf20Sopenharmony_ci void *piomb); 6968c2ecf20Sopenharmony_civoid pm8001_mpi_get_nvmd_resp(struct pm8001_hba_info *pm8001_ha, 6978c2ecf20Sopenharmony_ci void *piomb); 6988c2ecf20Sopenharmony_ciint pm8001_mpi_local_phy_ctl(struct pm8001_hba_info *pm8001_ha, 6998c2ecf20Sopenharmony_ci void *piomb); 7008c2ecf20Sopenharmony_civoid pm8001_get_lrate_mode(struct pm8001_phy *phy, u8 link_rate); 7018c2ecf20Sopenharmony_civoid pm8001_get_attached_sas_addr(struct pm8001_phy *phy, u8 *sas_addr); 7028c2ecf20Sopenharmony_civoid pm8001_bytes_dmaed(struct pm8001_hba_info *pm8001_ha, int i); 7038c2ecf20Sopenharmony_ciint pm8001_mpi_reg_resp(struct pm8001_hba_info *pm8001_ha, void *piomb); 7048c2ecf20Sopenharmony_ciint pm8001_mpi_dereg_resp(struct pm8001_hba_info *pm8001_ha, void *piomb); 7058c2ecf20Sopenharmony_ciint pm8001_mpi_fw_flash_update_resp(struct pm8001_hba_info *pm8001_ha, 7068c2ecf20Sopenharmony_ci void *piomb); 7078c2ecf20Sopenharmony_ciint pm8001_mpi_general_event(struct pm8001_hba_info *pm8001_ha , void *piomb); 7088c2ecf20Sopenharmony_ciint pm8001_mpi_task_abort_resp(struct pm8001_hba_info *pm8001_ha, void *piomb); 7098c2ecf20Sopenharmony_cistruct sas_task *pm8001_alloc_task(void); 7108c2ecf20Sopenharmony_civoid pm8001_task_done(struct sas_task *task); 7118c2ecf20Sopenharmony_civoid pm8001_free_task(struct sas_task *task); 7128c2ecf20Sopenharmony_civoid pm8001_tag_free(struct pm8001_hba_info *pm8001_ha, u32 tag); 7138c2ecf20Sopenharmony_cistruct pm8001_device *pm8001_find_dev(struct pm8001_hba_info *pm8001_ha, 7148c2ecf20Sopenharmony_ci u32 device_id); 7158c2ecf20Sopenharmony_ciint pm80xx_set_thermal_config(struct pm8001_hba_info *pm8001_ha); 7168c2ecf20Sopenharmony_ci 7178c2ecf20Sopenharmony_ciint pm8001_bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shiftValue); 7188c2ecf20Sopenharmony_civoid pm8001_set_phy_profile(struct pm8001_hba_info *pm8001_ha, 7198c2ecf20Sopenharmony_ci u32 length, u8 *buf); 7208c2ecf20Sopenharmony_civoid pm8001_set_phy_profile_single(struct pm8001_hba_info *pm8001_ha, 7218c2ecf20Sopenharmony_ci u32 phy, u32 length, u32 *buf); 7228c2ecf20Sopenharmony_ciint pm80xx_bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shiftValue); 7238c2ecf20Sopenharmony_cissize_t pm80xx_get_fatal_dump(struct device *cdev, 7248c2ecf20Sopenharmony_ci struct device_attribute *attr, char *buf); 7258c2ecf20Sopenharmony_cissize_t pm80xx_get_non_fatal_dump(struct device *cdev, 7268c2ecf20Sopenharmony_ci struct device_attribute *attr, char *buf); 7278c2ecf20Sopenharmony_cissize_t pm8001_get_gsm_dump(struct device *cdev, u32, char *buf); 7288c2ecf20Sopenharmony_ci/* ctl shared API */ 7298c2ecf20Sopenharmony_ciextern struct device_attribute *pm8001_host_attrs[]; 7308c2ecf20Sopenharmony_ci 7318c2ecf20Sopenharmony_cistatic inline void 7328c2ecf20Sopenharmony_cipm8001_ccb_task_free_done(struct pm8001_hba_info *pm8001_ha, 7338c2ecf20Sopenharmony_ci struct sas_task *task, struct pm8001_ccb_info *ccb, 7348c2ecf20Sopenharmony_ci u32 ccb_idx) 7358c2ecf20Sopenharmony_ci{ 7368c2ecf20Sopenharmony_ci pm8001_ccb_task_free(pm8001_ha, task, ccb, ccb_idx); 7378c2ecf20Sopenharmony_ci smp_mb(); /*in order to force CPU ordering*/ 7388c2ecf20Sopenharmony_ci spin_unlock(&pm8001_ha->lock); 7398c2ecf20Sopenharmony_ci task->task_done(task); 7408c2ecf20Sopenharmony_ci spin_lock(&pm8001_ha->lock); 7418c2ecf20Sopenharmony_ci} 7428c2ecf20Sopenharmony_ci 7438c2ecf20Sopenharmony_ci#endif 7448c2ecf20Sopenharmony_ci 745