^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright IBM Corp. 2007, 2010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #ifndef S390_CHP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define S390_CHP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/chpid.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "chsc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "css.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define CHP_STATUS_STANDBY 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define CHP_STATUS_CONFIGURED 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define CHP_STATUS_RESERVED 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define CHP_STATUS_NOT_RECOGNIZED 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define CHP_ONLINE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define CHP_OFFLINE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define CHP_VARY_ON 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define CHP_VARY_OFF 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) struct chp_link {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) struct chp_id chpid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) u32 fla_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) u16 fla;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) static inline int chp_test_bit(u8 *bitmap, int num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) int byte = num >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) int mask = 128 >> (num & 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) return (bitmap[byte] & mask) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct channel_path {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct device dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct chp_id chpid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct mutex lock; /* Serialize access to below members. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) int state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct channel_path_desc_fmt0 desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct channel_path_desc_fmt1 desc_fmt1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct channel_path_desc_fmt3 desc_fmt3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) /* Channel-measurement related stuff: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) int cmg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) int shared;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct cmg_chars cmg_chars;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) /* Return channel_path struct for given chpid. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) static inline struct channel_path *chpid_to_chp(struct chp_id chpid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) return css_by_id(chpid.cssid)->chps[chpid.id];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) int chp_get_status(struct chp_id chpid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) u8 chp_get_sch_opm(struct subchannel *sch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) int chp_is_registered(struct chp_id chpid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct channel_path_desc_fmt0 *chp_get_chp_desc(struct chp_id chpid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) void chp_remove_cmg_attr(struct channel_path *chp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) int chp_add_cmg_attr(struct channel_path *chp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) int chp_update_desc(struct channel_path *chp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) int chp_new(struct chp_id chpid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) void chp_cfg_schedule(struct chp_id chpid, int configure);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) void chp_cfg_cancel_deconfigure(struct chp_id chpid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) int chp_info_get_status(struct chp_id chpid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) int chp_ssd_get_mask(struct chsc_ssd_info *, struct chp_link *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #endif /* S390_CHP_H */