cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

host.h (17012B)


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