2005-04-16 15:20:36 -07:00
# ifndef S390_CIO_H
# define S390_CIO_H
2006-07-12 16:39:50 +02:00
# include <linux/mutex.h>
2007-04-27 16:01:31 +02:00
# include <linux/device.h>
2007-04-27 16:01:35 +02:00
# include <asm/chpid.h>
# include "chsc.h"
# include "schid.h"
2005-04-16 15:20:36 -07:00
/*
* path management control word
*/
struct pmcw {
__u32 intparm ; /* interruption parameter */
__u32 qf : 1 ; /* qdio facility */
__u32 res0 : 1 ; /* reserved zeros */
__u32 isc : 3 ; /* interruption sublass */
__u32 res5 : 3 ; /* reserved zeros */
__u32 ena : 1 ; /* enabled */
__u32 lm : 2 ; /* limit mode */
__u32 mme : 2 ; /* measurement-mode enable */
__u32 mp : 1 ; /* multipath mode */
__u32 tf : 1 ; /* timing facility */
__u32 dnv : 1 ; /* device number valid */
__u32 dev : 16 ; /* device number */
__u8 lpm ; /* logical path mask */
__u8 pnom ; /* path not operational mask */
__u8 lpum ; /* last path used mask */
__u8 pim ; /* path installed mask */
__u16 mbi ; /* measurement-block index */
__u8 pom ; /* path operational mask */
__u8 pam ; /* path available mask */
__u8 chpid [ 8 ] ; /* CHPID 0-7 (if available) */
__u32 unused1 : 8 ; /* reserved zeros */
__u32 st : 3 ; /* subchannel type */
__u32 unused2 : 18 ; /* reserved zeros */
__u32 mbfc : 1 ; /* measurement block format control */
__u32 xmwme : 1 ; /* extended measurement word mode enable */
__u32 csense : 1 ; /* concurrent sense; can be enabled ...*/
/* ... per MSCH, however, if facility */
/* ... is not installed, this results */
/* ... in an operand exception. */
} __attribute__ ( ( packed ) ) ;
/*
* subchannel information block
*/
struct schib {
struct pmcw pmcw ; /* path management control word */
struct scsw scsw ; /* subchannel status word */
__u64 mba ; /* measurement block address */
__u8 mda [ 4 ] ; /* model dependent area */
} __attribute__ ( ( packed , aligned ( 4 ) ) ) ;
/*
* operation request block
*/
struct orb {
__u32 intparm ; /* interruption parameter */
__u32 key : 4 ; /* flags, like key, suspend control, etc. */
__u32 spnd : 1 ; /* suspend control */
__u32 res1 : 1 ; /* reserved */
__u32 mod : 1 ; /* modification control */
__u32 sync : 1 ; /* synchronize control */
__u32 fmt : 1 ; /* format control */
__u32 pfch : 1 ; /* prefetch control */
__u32 isic : 1 ; /* initial-status-interruption control */
__u32 alcc : 1 ; /* address-limit-checking control */
__u32 ssic : 1 ; /* suppress-suspended-interr. control */
__u32 res2 : 1 ; /* reserved */
__u32 c64 : 1 ; /* IDAW/QDIO 64 bit control */
__u32 i2k : 1 ; /* IDAW 2/4kB block size control */
__u32 lpm : 8 ; /* logical path mask */
__u32 ils : 1 ; /* incorrect length */
__u32 zero : 6 ; /* reserved zeros */
__u32 orbx : 1 ; /* ORB extension control */
__u32 cpa ; /* channel program address */
} __attribute__ ( ( packed , aligned ( 4 ) ) ) ;
/* subchannel data structure used by I/O subroutines */
struct subchannel {
2006-01-06 00:19:21 -08:00
struct subchannel_id schid ;
2006-12-08 15:54:26 +01:00
spinlock_t * lock ; /* subchannel lock */
2006-07-12 16:39:50 +02:00
struct mutex reg_mutex ;
2005-04-16 15:20:36 -07:00
enum {
SUBCHANNEL_TYPE_IO = 0 ,
SUBCHANNEL_TYPE_CHSC = 1 ,
SUBCHANNEL_TYPE_MESSAGE = 2 ,
SUBCHANNEL_TYPE_ADM = 3 ,
} st ; /* subchannel type */
struct {
unsigned int suspend : 1 ; /* allow suspend */
unsigned int prefetch : 1 ; /* deny prefetch */
unsigned int inter : 1 ; /* suppress intermediate interrupts */
} __attribute__ ( ( packed ) ) options ;
__u8 vpm ; /* verified path mask */
__u8 lpm ; /* logical path mask */
__u8 opm ; /* operational path mask */
struct schib schib ; /* subchannel information block */
struct orb orb ; /* operation request block */
struct ccw1 sense_ccw ; /* static ccw for sense command */
2007-04-27 16:01:35 +02:00
struct chsc_ssd_info ssd_info ; /* subchannel description */
2005-04-16 15:20:36 -07:00
struct device dev ; /* entry in device tree */
struct css_driver * driver ;
} __attribute__ ( ( aligned ( 8 ) ) ) ;
# define IO_INTERRUPT_TYPE 0 /* I/O interrupt type */
# define to_subchannel(n) container_of(n, struct subchannel, dev)
2006-01-06 00:19:21 -08:00
extern int cio_validate_subchannel ( struct subchannel * , struct subchannel_id ) ;
2005-04-16 15:20:36 -07:00
extern int cio_enable_subchannel ( struct subchannel * , unsigned int ) ;
extern int cio_disable_subchannel ( struct subchannel * ) ;
extern int cio_cancel ( struct subchannel * ) ;
extern int cio_clear ( struct subchannel * ) ;
extern int cio_resume ( struct subchannel * ) ;
extern int cio_halt ( struct subchannel * ) ;
extern int cio_start ( struct subchannel * , struct ccw1 * , __u8 ) ;
extern int cio_start_key ( struct subchannel * , struct ccw1 * , __u8 , __u8 ) ;
extern int cio_cancel ( struct subchannel * ) ;
extern int cio_set_options ( struct subchannel * , int ) ;
extern int cio_get_options ( struct subchannel * ) ;
extern int cio_modify ( struct subchannel * ) ;
2006-01-06 00:19:21 -08:00
2006-12-08 15:54:28 +01:00
int cio_create_sch_lock ( struct subchannel * ) ;
2005-04-16 15:20:36 -07:00
/* Use with care. */
# ifdef CONFIG_CCW_CONSOLE
extern struct subchannel * cio_probe_console ( void ) ;
extern void cio_release_console ( void ) ;
2006-01-06 00:19:21 -08:00
extern int cio_is_console ( struct subchannel_id ) ;
2005-04-16 15:20:36 -07:00
extern struct subchannel * cio_get_console_subchannel ( void ) ;
2006-12-08 15:54:26 +01:00
extern spinlock_t * cio_get_console_lock ( void ) ;
2005-04-16 15:20:36 -07:00
# else
2006-01-06 00:19:21 -08:00
# define cio_is_console(schid) 0
2005-04-16 15:20:36 -07:00
# define cio_get_console_subchannel() NULL
2006-12-08 15:54:26 +01:00
# define cio_get_console_lock() NULL;
2005-04-16 15:20:36 -07:00
# endif
extern int cio_show_msg ;
# endif