Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2)  * This file is provided under a dual BSD/GPLv2 license.  When using or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * redistributing this file, you may do so under either license.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * GPL LICENSE SUMMARY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  * it under the terms of version 2 of the GNU General Public License as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  * published by the Free Software Foundation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  * This program is distributed in the hope that it will be useful, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  * WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  * General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  * You should have received a copy of the GNU General Public License
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  * along with this program; if not, write to the Free Software
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  * The full GNU General Public License is included in this distribution
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  * in the file called LICENSE.GPL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  * BSD LICENSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  * All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  * Redistribution and use in source and binary forms, with or without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  * modification, are permitted provided that the following conditions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  * are met:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  *   * Redistributions of source code must retain the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  *     notice, this list of conditions and the following disclaimer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  *   * Redistributions in binary form must reproduce the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  *     notice, this list of conditions and the following disclaimer in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  *     the documentation and/or other materials provided with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  *     distribution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  *   * Neither the name of Intel Corporation nor the names of its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40)  *     contributors may be used to endorse or promote products derived
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)  *     from this software without specific prior written permission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43)  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44)  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45)  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46)  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47)  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48)  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49)  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50)  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51)  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52)  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53)  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) #ifndef _SCI_HOST_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) #define _SCI_HOST_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) #include <scsi/sas_ata.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) #include "remote_device.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) #include "phy.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) #include "isci.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) #include "remote_node_table.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) #include "registers.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) #include "unsolicited_frame_control.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) #include "probe_roms.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) struct isci_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) struct scu_task_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72)  * struct sci_power_control -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74)  * This structure defines the fields for managing power control for direct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75)  * attached disk devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) struct sci_power_control {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	 * This field is set when the power control timer is running and cleared when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	 * it is not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	bool timer_started;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	 * Timer to control when the directed attached disks can consume power.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	struct sci_timer timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	 * This field is used to keep track of how many phys are put into the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	 * requesters field.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	u8 phys_waiting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	 * This field is used to keep track of how many phys have been granted to consume power
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	u8 phys_granted_power;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	 * This field is an array of phys that we are waiting on. The phys are direct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	 * mapped into requesters via struct sci_phy.phy_index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	struct isci_phy *requesters[SCI_MAX_PHYS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct sci_port_configuration_agent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) typedef void (*port_config_fn)(struct isci_host *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 			       struct sci_port_configuration_agent *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 			       struct isci_port *, struct isci_phy *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) bool is_port_config_apc(struct isci_host *ihost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) bool is_controller_start_complete(struct isci_host *ihost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) struct sci_port_configuration_agent {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	u16 phy_configured_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	u16 phy_ready_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 		u8 min_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 		u8 max_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	} phy_valid_port_range[SCI_MAX_PHYS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	bool timer_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	port_config_fn link_up_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	port_config_fn link_down_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	struct sci_timer	timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)  * isci_host - primary host/controller object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)  * @timer: timeout start/stop operations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)  * @device_table: rni (hw remote node index) to remote device lookup table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)  * @available_remote_nodes: rni allocator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)  * @power_control: manage device spin up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)  * @io_request_sequence: generation number for tci's (task contexts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)  * @task_context_table: hw task context table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)  * @remote_node_context_table: hw remote node context table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)  * @completion_queue: hw-producer driver-consumer communication ring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)  * @completion_queue_get: tracks the driver 'head' of the ring to notify hw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)  * @logical_port_entries: min({driver|silicon}-supported-port-count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)  * @remote_node_entries: min({driver|silicon}-supported-node-count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)  * @task_context_entries: min({driver|silicon}-supported-task-count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)  * @phy_timer: phy startup timer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)  * @invalid_phy_mask: if an invalid_link_up notification is reported a bit for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)  * 		      the phy index is set so further notifications are not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)  * 		      made.  Once the phy reports link up and is made part of a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)  * 		      port then this bit is cleared.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) struct isci_host {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	struct sci_base_state_machine sm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	/* XXX can we time this externally */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	struct sci_timer timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	/* XXX drop reference module params directly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	struct sci_user_parameters user_parameters;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	/* XXX no need to be a union */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	struct sci_oem_params oem_parameters;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	struct sci_port_configuration_agent port_agent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	struct isci_remote_device *device_table[SCI_MAX_REMOTE_DEVICES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	struct sci_remote_node_table available_remote_nodes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	struct sci_power_control power_control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	u8 io_request_sequence[SCI_MAX_IO_REQUESTS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	struct scu_task_context *task_context_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	dma_addr_t tc_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	union scu_remote_node_context *remote_node_context_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	dma_addr_t rnc_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	u32 *completion_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	dma_addr_t cq_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	u32 completion_queue_get;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	u32 logical_port_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	u32 remote_node_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	u32 task_context_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	void *ufi_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	dma_addr_t ufi_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	struct sci_unsolicited_frame_control uf_control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	/* phy startup */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	struct sci_timer phy_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	/* XXX kill */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	bool phy_startup_timer_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	u32 next_phy_to_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	/* XXX convert to unsigned long and use bitops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	u8 invalid_phy_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	/* TODO attempt dynamic interrupt coalescing scheme */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	u16 interrupt_coalesce_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	u32 interrupt_coalesce_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	struct smu_registers __iomem *smu_registers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	struct scu_registers __iomem *scu_registers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	u16 tci_head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	u16 tci_tail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	u16 tci_pool[SCI_MAX_IO_REQUESTS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	int id; /* unique within a given pci device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	struct isci_phy phys[SCI_MAX_PHYS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	struct isci_port ports[SCI_MAX_PORTS + 1]; /* includes dummy port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	struct asd_sas_port sas_ports[SCI_MAX_PORTS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	struct sas_ha_struct sas_ha;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	struct pci_dev *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	#define IHOST_START_PENDING 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	#define IHOST_STOP_PENDING 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	#define IHOST_IRQ_ENABLED 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	wait_queue_head_t eventq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	struct tasklet_struct completion_tasklet;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	spinlock_t scic_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	struct isci_request *reqs[SCI_MAX_IO_REQUESTS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	struct isci_remote_device devices[SCI_MAX_REMOTE_DEVICES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)  * enum sci_controller_states - This enumeration depicts all the states
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)  *    for the common controller state machine.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) enum sci_controller_states {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	 * Simply the initial state for the base controller state machine.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	SCIC_INITIAL = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	 * This state indicates that the controller is reset.  The memory for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	 * the controller is in it's initial state, but the controller requires
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	 * initialization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	 * This state is entered from the INITIAL state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	 * This state is entered from the RESETTING state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	SCIC_RESET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	 * This state is typically an action state that indicates the controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	 * is in the process of initialization.  In this state no new IO operations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	 * are permitted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	 * This state is entered from the RESET state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	SCIC_INITIALIZING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	 * This state indicates that the controller has been successfully
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	 * initialized.  In this state no new IO operations are permitted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	 * This state is entered from the INITIALIZING state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	SCIC_INITIALIZED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	 * This state indicates the the controller is in the process of becoming
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	 * ready (i.e. starting).  In this state no new IO operations are permitted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	 * This state is entered from the INITIALIZED state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	SCIC_STARTING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	 * This state indicates the controller is now ready.  Thus, the user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	 * is able to perform IO operations on the controller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	 * This state is entered from the STARTING state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	SCIC_READY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	 * This state is typically an action state that indicates the controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	 * is in the process of resetting.  Thus, the user is unable to perform
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	 * IO operations on the controller.  A reset is considered destructive in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	 * most cases.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	 * This state is entered from the READY state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	 * This state is entered from the FAILED state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	 * This state is entered from the STOPPED state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	SCIC_RESETTING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	 * This state indicates that the controller is in the process of stopping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	 * In this state no new IO operations are permitted, but existing IO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 	 * operations are allowed to complete.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 	 * This state is entered from the READY state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	SCIC_STOPPING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	/**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	 * This state indicates that the controller could not successfully be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	 * initialized.  In this state no new IO operations are permitted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	 * This state is entered from the INITIALIZING state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	 * This state is entered from the STARTING state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	 * This state is entered from the STOPPING state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	 * This state is entered from the RESETTING state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	SCIC_FAILED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)  * struct isci_pci_info - This class represents the pci function containing the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)  *    controllers. Depending on PCI SKU, there could be up to 2 controllers in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)  *    the PCI function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) #define SCI_MAX_MSIX_INT (SCI_NUM_MSI_X_INT*SCI_MAX_CONTROLLERS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) struct isci_pci_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	struct isci_host *hosts[SCI_MAX_CONTROLLERS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 	struct isci_orom *orom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) static inline struct isci_pci_info *to_pci_info(struct pci_dev *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	return pci_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) static inline struct Scsi_Host *to_shost(struct isci_host *ihost)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	return ihost->sas_ha.core.shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) #define for_each_isci_host(id, ihost, pdev) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	for (id = 0; id < SCI_MAX_CONTROLLERS && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	     (ihost = to_pci_info(pdev)->hosts[id]); id++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) static inline void wait_for_start(struct isci_host *ihost)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	wait_event(ihost->eventq, !test_bit(IHOST_START_PENDING, &ihost->flags));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) static inline void wait_for_stop(struct isci_host *ihost)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	wait_event(ihost->eventq, !test_bit(IHOST_STOP_PENDING, &ihost->flags));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) static inline void wait_for_device_start(struct isci_host *ihost, struct isci_remote_device *idev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	wait_event(ihost->eventq, !test_bit(IDEV_START_PENDING, &idev->flags));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) static inline void wait_for_device_stop(struct isci_host *ihost, struct isci_remote_device *idev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	wait_event(ihost->eventq, !test_bit(IDEV_STOP_PENDING, &idev->flags));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) static inline struct isci_host *dev_to_ihost(struct domain_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 	return dev->port->ha->lldd_ha;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) static inline struct isci_host *idev_to_ihost(struct isci_remote_device *idev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	return dev_to_ihost(idev->domain_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) /* we always use protocol engine group zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) #define ISCI_PEG 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) /* see sci_controller_io_tag_allocate|free for how seq and tci are built */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) #define ISCI_TAG(seq, tci) (((u16) (seq)) << 12 | tci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) /* these are returned by the hardware, so sanitize them */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #define ISCI_TAG_SEQ(tag) (((tag) >> 12) & (SCI_MAX_SEQ-1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #define ISCI_TAG_TCI(tag) ((tag) & (SCI_MAX_IO_REQUESTS-1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) /* interrupt coalescing baseline: 9 == 3 to 5us interrupt delay per command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) #define ISCI_COALESCE_BASE 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) /* expander attached sata devices require 3 rnc slots */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) static inline int sci_remote_device_node_count(struct isci_remote_device *idev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 	struct domain_device *dev = idev->domain_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	if (dev_is_sata(dev) && dev->parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 		return SCU_STP_REMOTE_NODE_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	return SCU_SSP_REMOTE_NODE_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)  * sci_controller_clear_invalid_phy() -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)  * This macro will clear the bit in the invalid phy mask for this controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)  * object.  This is used to control messages reported for invalid link up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)  * notifications.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) #define sci_controller_clear_invalid_phy(controller, phy) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 	((controller)->invalid_phy_mask &= ~(1 << (phy)->phy_index))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) static inline struct device *scirdev_to_dev(struct isci_remote_device *idev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	if (!idev || !idev->isci_port || !idev->isci_port->isci_host)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 	return &idev->isci_port->isci_host->pdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) static inline bool is_a2(struct pci_dev *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 	if (pdev->revision < 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) static inline bool is_b0(struct pci_dev *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 	if (pdev->revision == 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) static inline bool is_c0(struct pci_dev *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 	if (pdev->revision == 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) static inline bool is_c1(struct pci_dev *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 	if (pdev->revision >= 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) enum cable_selections {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 	short_cable     = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 	long_cable      = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 	medium_cable    = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 	undefined_cable = 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) #define CABLE_OVERRIDE_DISABLED (0x10000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) static inline int is_cable_select_overridden(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 	return cable_selection_override < CABLE_OVERRIDE_DISABLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) enum cable_selections decode_cable_selection(struct isci_host *ihost, int phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) void validate_cable_selections(struct isci_host *ihost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) char *lookup_cable_names(enum cable_selections);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) /* set hw control for 'activity', even though active enclosures seem to drive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)  * the activity led on their own.  Skip setting FSENG control on 'status' due
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)  * to unexpected operation and 'error' due to not being a supported automatic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)  * FSENG output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) #define SGPIO_HW_CONTROL 0x00000443
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) static inline int isci_gpio_count(struct isci_host *ihost)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 	return ARRAY_SIZE(ihost->scu_registers->peg0.sgpio.output_data_select);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) void sci_controller_post_request(struct isci_host *ihost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 				      u32 request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) void sci_controller_release_frame(struct isci_host *ihost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 				       u32 frame_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) void sci_controller_copy_sata_response(void *response_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 					    void *frame_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 					    void *frame_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) enum sci_status sci_controller_allocate_remote_node_context(struct isci_host *ihost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 								 struct isci_remote_device *idev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 								 u16 *node_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) void sci_controller_free_remote_node_context(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 	struct isci_host *ihost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	struct isci_remote_device *idev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	u16 node_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) struct isci_request *sci_request_by_tag(struct isci_host *ihost, u16 io_tag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) void sci_controller_power_control_queue_insert(struct isci_host *ihost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 					       struct isci_phy *iphy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) void sci_controller_power_control_queue_remove(struct isci_host *ihost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 					       struct isci_phy *iphy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) void sci_controller_link_up(struct isci_host *ihost, struct isci_port *iport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 			    struct isci_phy *iphy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) void sci_controller_link_down(struct isci_host *ihost, struct isci_port *iport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 			      struct isci_phy *iphy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) void sci_controller_remote_device_stopped(struct isci_host *ihost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 					  struct isci_remote_device *idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) enum sci_status sci_controller_continue_io(struct isci_request *ireq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) int isci_host_scan_finished(struct Scsi_Host *, unsigned long);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) void isci_host_start(struct Scsi_Host *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) u16 isci_alloc_tag(struct isci_host *ihost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) enum sci_status isci_free_tag(struct isci_host *ihost, u16 io_tag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) void isci_tci_free(struct isci_host *ihost, u16 tci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) void ireq_done(struct isci_host *ihost, struct isci_request *ireq, struct sas_task *task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) int isci_host_init(struct isci_host *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) void isci_host_completion_routine(unsigned long data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) void isci_host_deinit(struct isci_host *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) void sci_controller_disable_interrupts(struct isci_host *ihost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) bool sci_controller_has_remote_devices_stopping(struct isci_host *ihost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) void sci_controller_transition_to_ready(struct isci_host *ihost, enum sci_status status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) enum sci_status sci_controller_start_io(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 	struct isci_host *ihost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 	struct isci_remote_device *idev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 	struct isci_request *ireq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) enum sci_status sci_controller_start_task(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 	struct isci_host *ihost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 	struct isci_remote_device *idev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 	struct isci_request *ireq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) enum sci_status sci_controller_terminate_request(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 	struct isci_host *ihost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 	struct isci_remote_device *idev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 	struct isci_request *ireq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) enum sci_status sci_controller_complete_io(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 	struct isci_host *ihost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 	struct isci_remote_device *idev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 	struct isci_request *ireq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) void sci_port_configuration_agent_construct(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 	struct sci_port_configuration_agent *port_agent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) enum sci_status sci_port_configuration_agent_initialize(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 	struct isci_host *ihost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 	struct sci_port_configuration_agent *port_agent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) int isci_gpio_write(struct sas_ha_struct *, u8 reg_type, u8 reg_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 		    u8 reg_count, u8 *write_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) #endif