1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Parallel SCSI (SPI) transport specific attributes exported to sysfs. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2003 Silicon Graphics, Inc. All rights reserved. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun #ifndef SCSI_TRANSPORT_SPI_H 8*4882a593Smuzhiyun #define SCSI_TRANSPORT_SPI_H 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <linux/transport_class.h> 11*4882a593Smuzhiyun #include <linux/mutex.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun struct scsi_transport_template; 14*4882a593Smuzhiyun struct scsi_target; 15*4882a593Smuzhiyun struct scsi_device; 16*4882a593Smuzhiyun struct Scsi_Host; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun struct spi_transport_attrs { 19*4882a593Smuzhiyun int period; /* value in the PPR/SDTR command */ 20*4882a593Smuzhiyun int min_period; 21*4882a593Smuzhiyun int offset; 22*4882a593Smuzhiyun int max_offset; 23*4882a593Smuzhiyun unsigned int width:1; /* 0 - narrow, 1 - wide */ 24*4882a593Smuzhiyun unsigned int max_width:1; 25*4882a593Smuzhiyun unsigned int iu:1; /* Information Units enabled */ 26*4882a593Smuzhiyun unsigned int max_iu:1; 27*4882a593Smuzhiyun unsigned int dt:1; /* DT clocking enabled */ 28*4882a593Smuzhiyun unsigned int qas:1; /* Quick Arbitration and Selection enabled */ 29*4882a593Smuzhiyun unsigned int max_qas:1; 30*4882a593Smuzhiyun unsigned int wr_flow:1; /* Write Flow control enabled */ 31*4882a593Smuzhiyun unsigned int rd_strm:1; /* Read streaming enabled */ 32*4882a593Smuzhiyun unsigned int rti:1; /* Retain Training Information */ 33*4882a593Smuzhiyun unsigned int pcomp_en:1;/* Precompensation enabled */ 34*4882a593Smuzhiyun unsigned int hold_mcs:1;/* Hold Margin Control Settings */ 35*4882a593Smuzhiyun unsigned int initial_dv:1; /* DV done to this target yet */ 36*4882a593Smuzhiyun unsigned long flags; /* flags field for drivers to use */ 37*4882a593Smuzhiyun /* Device Properties fields */ 38*4882a593Smuzhiyun unsigned int support_sync:1; /* synchronous support */ 39*4882a593Smuzhiyun unsigned int support_wide:1; /* wide support */ 40*4882a593Smuzhiyun unsigned int support_dt:1; /* allows DT phases */ 41*4882a593Smuzhiyun unsigned int support_dt_only; /* disallows ST phases */ 42*4882a593Smuzhiyun unsigned int support_ius; /* support Information Units */ 43*4882a593Smuzhiyun unsigned int support_qas; /* supports quick arbitration and selection */ 44*4882a593Smuzhiyun /* Private Fields */ 45*4882a593Smuzhiyun unsigned int dv_pending:1; /* Internal flag: DV Requested */ 46*4882a593Smuzhiyun unsigned int dv_in_progress:1; /* Internal: DV started */ 47*4882a593Smuzhiyun struct mutex dv_mutex; /* semaphore to serialise dv */ 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun enum spi_signal_type { 51*4882a593Smuzhiyun SPI_SIGNAL_UNKNOWN = 1, 52*4882a593Smuzhiyun SPI_SIGNAL_SE, 53*4882a593Smuzhiyun SPI_SIGNAL_LVD, 54*4882a593Smuzhiyun SPI_SIGNAL_HVD, 55*4882a593Smuzhiyun }; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun struct spi_host_attrs { 58*4882a593Smuzhiyun enum spi_signal_type signalling; 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* accessor functions */ 62*4882a593Smuzhiyun #define spi_period(x) (((struct spi_transport_attrs *)&(x)->starget_data)->period) 63*4882a593Smuzhiyun #define spi_min_period(x) (((struct spi_transport_attrs *)&(x)->starget_data)->min_period) 64*4882a593Smuzhiyun #define spi_offset(x) (((struct spi_transport_attrs *)&(x)->starget_data)->offset) 65*4882a593Smuzhiyun #define spi_max_offset(x) (((struct spi_transport_attrs *)&(x)->starget_data)->max_offset) 66*4882a593Smuzhiyun #define spi_width(x) (((struct spi_transport_attrs *)&(x)->starget_data)->width) 67*4882a593Smuzhiyun #define spi_max_width(x) (((struct spi_transport_attrs *)&(x)->starget_data)->max_width) 68*4882a593Smuzhiyun #define spi_iu(x) (((struct spi_transport_attrs *)&(x)->starget_data)->iu) 69*4882a593Smuzhiyun #define spi_max_iu(x) (((struct spi_transport_attrs *)&(x)->starget_data)->max_iu) 70*4882a593Smuzhiyun #define spi_dt(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dt) 71*4882a593Smuzhiyun #define spi_qas(x) (((struct spi_transport_attrs *)&(x)->starget_data)->qas) 72*4882a593Smuzhiyun #define spi_max_qas(x) (((struct spi_transport_attrs *)&(x)->starget_data)->max_qas) 73*4882a593Smuzhiyun #define spi_wr_flow(x) (((struct spi_transport_attrs *)&(x)->starget_data)->wr_flow) 74*4882a593Smuzhiyun #define spi_rd_strm(x) (((struct spi_transport_attrs *)&(x)->starget_data)->rd_strm) 75*4882a593Smuzhiyun #define spi_rti(x) (((struct spi_transport_attrs *)&(x)->starget_data)->rti) 76*4882a593Smuzhiyun #define spi_pcomp_en(x) (((struct spi_transport_attrs *)&(x)->starget_data)->pcomp_en) 77*4882a593Smuzhiyun #define spi_hold_mcs(x) (((struct spi_transport_attrs *)&(x)->starget_data)->hold_mcs) 78*4882a593Smuzhiyun #define spi_initial_dv(x) (((struct spi_transport_attrs *)&(x)->starget_data)->initial_dv) 79*4882a593Smuzhiyun #define spi_dv_pending(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_pending) 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define spi_support_sync(x) (((struct spi_transport_attrs *)&(x)->starget_data)->support_sync) 82*4882a593Smuzhiyun #define spi_support_wide(x) (((struct spi_transport_attrs *)&(x)->starget_data)->support_wide) 83*4882a593Smuzhiyun #define spi_support_dt(x) (((struct spi_transport_attrs *)&(x)->starget_data)->support_dt) 84*4882a593Smuzhiyun #define spi_support_dt_only(x) (((struct spi_transport_attrs *)&(x)->starget_data)->support_dt_only) 85*4882a593Smuzhiyun #define spi_support_ius(x) (((struct spi_transport_attrs *)&(x)->starget_data)->support_ius) 86*4882a593Smuzhiyun #define spi_support_qas(x) (((struct spi_transport_attrs *)&(x)->starget_data)->support_qas) 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define spi_flags(x) (((struct spi_transport_attrs *)&(x)->starget_data)->flags) 89*4882a593Smuzhiyun #define spi_signalling(h) (((struct spi_host_attrs *)(h)->shost_data)->signalling) 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* The functions by which the transport class and the driver communicate */ 94*4882a593Smuzhiyun struct spi_function_template { 95*4882a593Smuzhiyun void (*get_period)(struct scsi_target *); 96*4882a593Smuzhiyun void (*set_period)(struct scsi_target *, int); 97*4882a593Smuzhiyun void (*get_offset)(struct scsi_target *); 98*4882a593Smuzhiyun void (*set_offset)(struct scsi_target *, int); 99*4882a593Smuzhiyun void (*get_width)(struct scsi_target *); 100*4882a593Smuzhiyun void (*set_width)(struct scsi_target *, int); 101*4882a593Smuzhiyun void (*get_iu)(struct scsi_target *); 102*4882a593Smuzhiyun void (*set_iu)(struct scsi_target *, int); 103*4882a593Smuzhiyun void (*get_dt)(struct scsi_target *); 104*4882a593Smuzhiyun void (*set_dt)(struct scsi_target *, int); 105*4882a593Smuzhiyun void (*get_qas)(struct scsi_target *); 106*4882a593Smuzhiyun void (*set_qas)(struct scsi_target *, int); 107*4882a593Smuzhiyun void (*get_wr_flow)(struct scsi_target *); 108*4882a593Smuzhiyun void (*set_wr_flow)(struct scsi_target *, int); 109*4882a593Smuzhiyun void (*get_rd_strm)(struct scsi_target *); 110*4882a593Smuzhiyun void (*set_rd_strm)(struct scsi_target *, int); 111*4882a593Smuzhiyun void (*get_rti)(struct scsi_target *); 112*4882a593Smuzhiyun void (*set_rti)(struct scsi_target *, int); 113*4882a593Smuzhiyun void (*get_pcomp_en)(struct scsi_target *); 114*4882a593Smuzhiyun void (*set_pcomp_en)(struct scsi_target *, int); 115*4882a593Smuzhiyun void (*get_hold_mcs)(struct scsi_target *); 116*4882a593Smuzhiyun void (*set_hold_mcs)(struct scsi_target *, int); 117*4882a593Smuzhiyun void (*get_signalling)(struct Scsi_Host *); 118*4882a593Smuzhiyun void (*set_signalling)(struct Scsi_Host *, enum spi_signal_type); 119*4882a593Smuzhiyun int (*deny_binding)(struct scsi_target *); 120*4882a593Smuzhiyun /* The driver sets these to tell the transport class it 121*4882a593Smuzhiyun * wants the attributes displayed in sysfs. If the show_ flag 122*4882a593Smuzhiyun * is not set, the attribute will be private to the transport 123*4882a593Smuzhiyun * class */ 124*4882a593Smuzhiyun unsigned long show_period:1; 125*4882a593Smuzhiyun unsigned long show_offset:1; 126*4882a593Smuzhiyun unsigned long show_width:1; 127*4882a593Smuzhiyun unsigned long show_iu:1; 128*4882a593Smuzhiyun unsigned long show_dt:1; 129*4882a593Smuzhiyun unsigned long show_qas:1; 130*4882a593Smuzhiyun unsigned long show_wr_flow:1; 131*4882a593Smuzhiyun unsigned long show_rd_strm:1; 132*4882a593Smuzhiyun unsigned long show_rti:1; 133*4882a593Smuzhiyun unsigned long show_pcomp_en:1; 134*4882a593Smuzhiyun unsigned long show_hold_mcs:1; 135*4882a593Smuzhiyun }; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun struct scsi_transport_template *spi_attach_transport(struct spi_function_template *); 138*4882a593Smuzhiyun void spi_release_transport(struct scsi_transport_template *); 139*4882a593Smuzhiyun void spi_schedule_dv_device(struct scsi_device *); 140*4882a593Smuzhiyun void spi_dv_device(struct scsi_device *); 141*4882a593Smuzhiyun void spi_display_xfer_agreement(struct scsi_target *); 142*4882a593Smuzhiyun int spi_print_msg(const unsigned char *); 143*4882a593Smuzhiyun int spi_populate_width_msg(unsigned char *msg, int width); 144*4882a593Smuzhiyun int spi_populate_sync_msg(unsigned char *msg, int period, int offset); 145*4882a593Smuzhiyun int spi_populate_ppr_msg(unsigned char *msg, int period, int offset, int width, 146*4882a593Smuzhiyun int options); 147*4882a593Smuzhiyun int spi_populate_tag_msg(unsigned char *msg, struct scsi_cmnd *cmd); 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun #endif /* SCSI_TRANSPORT_SPI_H */ 150