| 1 |
|
| 2 | #ifndef _CSS_H
|
| 3 | #define _CSS_H
|
| 4 |
|
| 5 | #include <linux/mutex.h>
|
| 6 | #include <linux/wait.h>
|
| 7 | #include <linux/workqueue.h>
|
| 8 | #include <linux/device.h>
|
| 9 | #include <linux/types.h>
|
| 10 |
|
| 11 | #include <asm/cio.h>
|
| 12 | #include <asm/chpid.h>
|
| 13 | #include <asm/schid.h>
|
| 14 |
|
| 15 | #include "cio.h"
|
| 16 |
|
| 17 | |
| 18 | * path grouping stuff
|
| 19 |
|
| 20 | #define SPID_FUNC_SINGLE_PATH 0x00
|
| 21 | #define SPID_FUNC_MULTI_PATH 0x80
|
| 22 | #define SPID_FUNC_ESTABLISH 0x00
|
| 23 | #define SPID_FUNC_RESIGN 0x40
|
| 24 | #define SPID_FUNC_DISBAND 0x20
|
| 25 |
|
| 26 | #define SNID_STATE1_RESET 0
|
| 27 | #define SNID_STATE1_UNGROUPED 2
|
| 28 | #define SNID_STATE1_GROUPED 3
|
| 29 |
|
| 30 | #define SNID_STATE2_NOT_RESVD 0
|
| 31 | #define SNID_STATE2_RESVD_ELSE 2
|
| 32 | #define SNID_STATE2_RESVD_SELF 3
|
| 33 |
|
| 34 | #define SNID_STATE3_MULTI_PATH 1
|
| 35 | #define SNID_STATE3_SINGLE_PATH 0
|
| 36 |
|
| 37 | |
| 38 | * Miscellaneous constants
|
| 39 |
|
| 40 |
|
| 41 | #define CSS_NUM_CUB_PAGES 2
|
| 42 | #define CSS_CUES_PER_PAGE 128
|
| 43 | #define CSS_NUM_ECUB_PAGES 4
|
| 44 | #define CSS_ECUES_PER_PAGE 64
|
| 45 |
|
| 46 | |
| 47 | * Conditions used to specify which subchannels need evaluation
|
| 48 |
|
| 49 | enum css_eval_cond {
|
| 50 | CSS_EVAL_NO_PATH,
|
| 51 | CSS_EVAL_NOT_ONLINE
|
| 52 | };
|
| 53 |
|
| 54 | struct path_state {
|
| 55 | __u8 state1 : 2;
|
| 56 | __u8 state2 : 2;
|
| 57 | __u8 state3 : 1;
|
| 58 | __u8 resvd : 3;
|
| 59 | } __attribute__ ((packed));
|
| 60 |
|
| 61 | struct extended_cssid {
|
| 62 | u8 version;
|
| 63 | u8 cssid;
|
| 64 | } __attribute__ ((packed));
|
| 65 |
|
| 66 | struct pgid {
|
| 67 | union {
|
| 68 | __u8 fc;
|
| 69 | struct path_state ps;
|
| 70 | } __attribute__ ((packed)) inf;
|
| 71 | union {
|
| 72 | __u32 cpu_addr : 16;
|
| 73 | struct extended_cssid ext_cssid;
|
| 74 | } __attribute__ ((packed)) pgid_high;
|
| 75 | __u32 cpu_id : 24;
|
| 76 | __u32 cpu_model : 16;
|
| 77 | __u32 tod_high;
|
| 78 | } __attribute__ ((packed));
|
| 79 |
|
| 80 | struct subchannel;
|
| 81 | struct chp_link;
|
| 82 | |
| 83 | * struct css_driver - device driver for subchannels
|
| 84 | * @subchannel_type: subchannel type supported by this driver
|
| 85 | * @drv: embedded device driver structure
|
| 86 | * @irq: called on interrupts
|
| 87 | * @chp_event: called for events affecting a channel path
|
| 88 | * @sch_event: called for events affecting the subchannel
|
| 89 | * @probe: function called on probe
|
| 90 | * @remove: function called on remove
|
| 91 | * @shutdown: called at device shutdown
|
| 92 | * @settle: wait for asynchronous work to finish
|
| 93 |
|
| 94 | struct css_driver {
|
| 95 | struct css_device_id *subchannel_type;
|
| 96 | struct device_driver drv;
|
| 97 | void (*irq)(struct subchannel *);
|
| 98 | int (*chp_event)(struct subchannel *, struct chp_link *, int);
|
| 99 | int (*sch_event)(struct subchannel *, int);
|
| 100 | int (*probe)(struct subchannel *);
|
| 101 | void (*remove)(struct subchannel *);
|
| 102 | void (*shutdown)(struct subchannel *);
|
| 103 | int (*settle)(void);
|
| 104 | };
|
| 105 |
|
| 106 | #define to_cssdriver(n) container_of_const(n, struct css_driver, drv)
|
| 107 |
|
| 108 | extern int css_driver_register(struct css_driver *);
|
| 109 | extern void css_driver_unregister(struct css_driver *);
|
| 110 |
|
| 111 | extern void css_sch_device_unregister(struct subchannel *);
|
| 112 | extern int css_register_subchannel(struct subchannel *);
|
| 113 | extern struct subchannel *css_alloc_subchannel(struct subchannel_id,
|
| 114 | struct schib *schib);
|
| 115 | extern struct subchannel *get_subchannel_by_schid(struct subchannel_id);
|
| 116 | extern int css_init_done;
|
| 117 | extern int max_ssid;
|
| 118 | int for_each_subchannel_staged(int (*fn_known)(struct subchannel *, void *),
|
| 119 | int (*fn_unknown)(struct subchannel_id,
|
| 120 | void *), void *data);
|
| 121 | extern int for_each_subchannel(int(*fn)(struct subchannel_id, void *), void *);
|
| 122 | void css_update_ssd_info(struct subchannel *sch);
|
| 123 |
|
| 124 | struct channel_subsystem {
|
| 125 | u8 cssid;
|
| 126 | u8 iid;
|
| 127 | bool id_valid;
|
| 128 | struct channel_path *chps[__MAX_CHPID + 1];
|
| 129 | struct device device;
|
| 130 | struct pgid global_pgid;
|
| 131 | struct mutex mutex;
|
| 132 |
|
| 133 | int cm_enabled;
|
| 134 | void *cub[CSS_NUM_CUB_PAGES];
|
| 135 | void *ecub[CSS_NUM_ECUB_PAGES];
|
| 136 |
|
| 137 | struct subchannel *pseudo_subchannel;
|
| 138 | };
|
| 139 | #define to_css(dev) container_of(dev, struct channel_subsystem, device)
|
| 140 |
|
| 141 | extern struct channel_subsystem *channel_subsystems[];
|
| 142 |
|
| 143 |
|
| 144 | static inline struct channel_subsystem *css_by_id(u8 cssid)
|
| 145 | {
|
| 146 | return channel_subsystems[0];
|
| 147 | }
|
| 148 |
|
| 149 |
|
| 150 | #define for_each_css(css) \
|
| 151 | for ((css) = channel_subsystems[0]; (css); (css) = NULL)
|
| 152 |
|
| 153 |
|
| 154 | void css_schedule_eval(struct subchannel_id schid);
|
| 155 | void css_schedule_eval_all(void);
|
| 156 | void css_schedule_eval_cond(enum css_eval_cond, unsigned long delay);
|
| 157 | int css_complete_work(void);
|
| 158 |
|
| 159 | int sch_is_pseudo_sch(struct subchannel *);
|
| 160 | struct schib;
|
| 161 | int css_sch_is_valid(struct schib *);
|
| 162 |
|
| 163 | extern struct workqueue_struct *cio_work_q;
|
| 164 | void css_wait_for_slow_path(void);
|
| 165 | void css_sched_sch_todo(struct subchannel *sch, enum sch_todo todo);
|
| 166 | #endif
|