mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
[S390] cio: Add chsc subchannel driver.
This patch adds a driver for subchannels of type chsc. A device /dev/chsc is created which may be used to issue ioctls to: - obtain information about the machine's I/O configuration - dynamically change the machine's I/O configuration via asynchronous chsc commands Signed-off-by: Cornelia Huck <[email protected]> Signed-off-by: Martin Schwidefsky <[email protected]> Signed-off-by: Heiko Carstens <[email protected]>
This commit is contained in:
parent
683c5418e6
commit
9d92a7e1b0
20 changed files with 1068 additions and 31 deletions
|
|
@ -8,6 +8,9 @@ header-y += ucontext.h
|
|||
header-y += vtoc.h
|
||||
header-y += zcrypt.h
|
||||
header-y += kvm.h
|
||||
header-y += schid.h
|
||||
header-y += chsc.h
|
||||
|
||||
unifdef-y += cmb.h
|
||||
unifdef-y += debug.h
|
||||
unifdef-y += chpid.h
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
|
||||
#include <linux/string.h>
|
||||
#include <asm/types.h>
|
||||
#include <asm/cio.h>
|
||||
|
||||
#define __MAX_CHPID 255
|
||||
|
||||
|
|
@ -41,6 +40,9 @@ static inline void chp_id_next(struct chp_id *chpid)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <asm/cio.h>
|
||||
|
||||
static inline int chp_id_is_valid(struct chp_id *chpid)
|
||||
{
|
||||
return (chpid->cssid <= __MAX_CSSID);
|
||||
|
|
@ -49,5 +51,6 @@ static inline int chp_id_is_valid(struct chp_id *chpid)
|
|||
|
||||
#define chp_id_for_each(c) \
|
||||
for (chp_id_init(c); chp_id_is_valid(c); chp_id_next(c))
|
||||
#endif /* __KERNEL */
|
||||
|
||||
#endif /* _ASM_S390_CHPID_H */
|
||||
|
|
|
|||
127
include/asm-s390/chsc.h
Normal file
127
include/asm-s390/chsc.h
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
* ioctl interface for /dev/chsc
|
||||
*
|
||||
* Copyright 2008 IBM Corp.
|
||||
* Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_CHSC_H
|
||||
#define _ASM_CHSC_H
|
||||
|
||||
#include <asm/chpid.h>
|
||||
#include <asm/schid.h>
|
||||
|
||||
struct chsc_async_header {
|
||||
__u16 length;
|
||||
__u16 code;
|
||||
__u32 cmd_dependend;
|
||||
__u32 key : 4;
|
||||
__u32 : 28;
|
||||
struct subchannel_id sid;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct chsc_async_area {
|
||||
struct chsc_async_header header;
|
||||
__u8 data[PAGE_SIZE - 16 /* size of chsc_async_header */];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
struct chsc_response_struct {
|
||||
__u16 length;
|
||||
__u16 code;
|
||||
__u32 parms;
|
||||
__u8 data[PAGE_SIZE - 8];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct chsc_chp_cd {
|
||||
struct chp_id chpid;
|
||||
int m;
|
||||
int fmt;
|
||||
struct chsc_response_struct cpcb;
|
||||
};
|
||||
|
||||
struct chsc_cu_cd {
|
||||
__u16 cun;
|
||||
__u8 cssid;
|
||||
int m;
|
||||
int fmt;
|
||||
struct chsc_response_struct cucb;
|
||||
};
|
||||
|
||||
struct chsc_sch_cud {
|
||||
struct subchannel_id schid;
|
||||
int fmt;
|
||||
struct chsc_response_struct scub;
|
||||
};
|
||||
|
||||
struct conf_id {
|
||||
int m;
|
||||
__u8 cssid;
|
||||
__u8 ssid;
|
||||
};
|
||||
|
||||
struct chsc_conf_info {
|
||||
struct conf_id id;
|
||||
int fmt;
|
||||
struct chsc_response_struct scid;
|
||||
};
|
||||
|
||||
struct ccl_parm_chpid {
|
||||
int m;
|
||||
struct chp_id chp;
|
||||
};
|
||||
|
||||
struct ccl_parm_cssids {
|
||||
__u8 f_cssid;
|
||||
__u8 l_cssid;
|
||||
};
|
||||
|
||||
struct chsc_comp_list {
|
||||
struct {
|
||||
enum {
|
||||
CCL_CU_ON_CHP = 1,
|
||||
CCL_CHP_TYPE_CAP = 2,
|
||||
CCL_CSS_IMG = 4,
|
||||
CCL_CSS_IMG_CONF_CHAR = 5,
|
||||
CCL_IOP_CHP = 6,
|
||||
} ctype;
|
||||
int fmt;
|
||||
struct ccl_parm_chpid chpid;
|
||||
struct ccl_parm_cssids cssids;
|
||||
} req;
|
||||
struct chsc_response_struct sccl;
|
||||
};
|
||||
|
||||
struct chsc_dcal {
|
||||
struct {
|
||||
enum {
|
||||
DCAL_CSS_IID_PN = 4,
|
||||
} atype;
|
||||
__u32 list_parm[2];
|
||||
int fmt;
|
||||
} req;
|
||||
struct chsc_response_struct sdcal;
|
||||
};
|
||||
|
||||
struct chsc_cpd_info {
|
||||
struct chp_id chpid;
|
||||
int m;
|
||||
int fmt;
|
||||
int rfmt;
|
||||
int c;
|
||||
struct chsc_response_struct chpdb;
|
||||
};
|
||||
|
||||
#define CHSC_IOCTL_MAGIC 'c'
|
||||
|
||||
#define CHSC_START _IOWR(CHSC_IOCTL_MAGIC, 0x81, struct chsc_async_area)
|
||||
#define CHSC_INFO_CHANNEL_PATH _IOWR(CHSC_IOCTL_MAGIC, 0x82, \
|
||||
struct chsc_chp_cd)
|
||||
#define CHSC_INFO_CU _IOWR(CHSC_IOCTL_MAGIC, 0x83, struct chsc_cu_cd)
|
||||
#define CHSC_INFO_SCH_CU _IOWR(CHSC_IOCTL_MAGIC, 0x84, struct chsc_sch_cud)
|
||||
#define CHSC_INFO_CI _IOWR(CHSC_IOCTL_MAGIC, 0x85, struct chsc_conf_info)
|
||||
#define CHSC_INFO_CCL _IOWR(CHSC_IOCTL_MAGIC, 0x86, struct chsc_comp_list)
|
||||
#define CHSC_INFO_CPD _IOWR(CHSC_IOCTL_MAGIC, 0x87, struct chsc_cpd_info)
|
||||
#define CHSC_INFO_DCAL _IOWR(CHSC_IOCTL_MAGIC, 0x88, struct chsc_dcal)
|
||||
|
||||
#endif
|
||||
|
|
@ -14,6 +14,7 @@
|
|||
/* Regular I/O interrupts. */
|
||||
#define IO_SCH_ISC 3 /* regular I/O subchannels */
|
||||
#define CONSOLE_ISC 1 /* console I/O subchannel */
|
||||
#define CHSC_SCH_ISC 7 /* CHSC subchannels */
|
||||
/* Adapter interrupts. */
|
||||
#define QDIO_AIRQ_ISC IO_SCH_ISC /* I/O subchannel in qdio mode */
|
||||
|
||||
|
|
|
|||
28
include/asm-s390/schid.h
Normal file
28
include/asm-s390/schid.h
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
#ifndef ASM_SCHID_H
|
||||
#define ASM_SCHID_H
|
||||
|
||||
struct subchannel_id {
|
||||
__u32 cssid : 8;
|
||||
__u32 : 4;
|
||||
__u32 m : 1;
|
||||
__u32 ssid : 2;
|
||||
__u32 one : 1;
|
||||
__u32 sch_no : 16;
|
||||
} __attribute__ ((packed, aligned(4)));
|
||||
|
||||
|
||||
/* Helper function for sane state of pre-allocated subchannel_id. */
|
||||
static inline void
|
||||
init_subchannel_id(struct subchannel_id *schid)
|
||||
{
|
||||
memset(schid, 0, sizeof(struct subchannel_id));
|
||||
schid->one = 1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
schid_equal(struct subchannel_id *schid1, struct subchannel_id *schid2)
|
||||
{
|
||||
return !memcmp(schid1, schid2, sizeof(struct subchannel_id));
|
||||
}
|
||||
|
||||
#endif /* ASM_SCHID_H */
|
||||
Loading…
Reference in a new issue