^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) #ifndef _SPARC64_VIO_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _SPARC64_VIO_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/mod_devicetable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/timer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/completion.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/log2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <asm/ldc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <asm/mdesc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) struct vio_msg_tag {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) u8 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define VIO_TYPE_CTRL 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define VIO_TYPE_DATA 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define VIO_TYPE_ERR 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) u8 stype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define VIO_SUBTYPE_INFO 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define VIO_SUBTYPE_ACK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define VIO_SUBTYPE_NACK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) u16 stype_env;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define VIO_VER_INFO 0x0001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define VIO_ATTR_INFO 0x0002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define VIO_DRING_REG 0x0003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define VIO_DRING_UNREG 0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define VIO_RDX 0x0005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define VIO_PKT_DATA 0x0040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define VIO_DESC_DATA 0x0041
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define VIO_DRING_DATA 0x0042
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define VNET_MCAST_INFO 0x0101
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) u32 sid;
^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 vio_rdx {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct vio_msg_tag tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) u64 resv[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct vio_ver_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct vio_msg_tag tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) u16 major;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) u16 minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) u8 dev_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define VDEV_NETWORK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define VDEV_NETWORK_SWITCH 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define VDEV_DISK 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define VDEV_DISK_SERVER 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define VDEV_CONSOLE_CON 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) u8 resv1[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) u64 resv2[5];
^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) struct vio_dring_register {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct vio_msg_tag tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) u64 dring_ident;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) u32 num_descr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) u32 descr_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) u16 options;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define VIO_TX_DRING 0x0001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define VIO_RX_DRING 0x0002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define VIO_RX_DRING_DATA 0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) u16 resv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) u32 num_cookies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) struct ldc_trans_cookie cookies[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct vio_dring_unregister {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct vio_msg_tag tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) u64 dring_ident;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u64 resv[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /* Data transfer modes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define VIO_PKT_MODE 0x01 /* Packet based transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define VIO_DESC_MODE 0x02 /* In-band descriptors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define VIO_DRING_MODE 0x03 /* Descriptor rings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) /* in vers >= 1.2, VIO_DRING_MODE is 0x04 and transfer mode is a bitmask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define VIO_NEW_DRING_MODE 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) struct vio_dring_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) struct vio_msg_tag tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) u64 seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) u64 dring_ident;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) u32 start_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) u32 end_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) u8 state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define VIO_DRING_ACTIVE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define VIO_DRING_STOPPED 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) u8 __pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) u16 __pad2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) u32 __pad3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) u64 __par4[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct vio_dring_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) u8 state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define VIO_DESC_FREE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define VIO_DESC_READY 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define VIO_DESC_ACCEPTED 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define VIO_DESC_DONE 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) u8 ack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define VIO_ACK_ENABLE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define VIO_ACK_DISABLE 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) u16 __pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) u32 __pad2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /* VIO disk specific structures and defines */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) struct vio_disk_attr_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct vio_msg_tag tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) u8 xfer_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) u8 vdisk_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define VD_DISK_TYPE_SLICE 0x01 /* Slice in block device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define VD_DISK_TYPE_DISK 0x02 /* Entire block device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) u8 vdisk_mtype; /* v1.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define VD_MEDIA_TYPE_FIXED 0x01 /* Fixed device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define VD_MEDIA_TYPE_CD 0x02 /* CD Device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define VD_MEDIA_TYPE_DVD 0x03 /* DVD Device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) u8 resv1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) u32 vdisk_block_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) u64 operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) u64 vdisk_size; /* v1.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) u64 max_xfer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) u32 phys_block_size; /* v1.2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) u32 resv2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) u64 resv3[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) struct vio_disk_desc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) struct vio_dring_hdr hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) u64 req_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) u8 operation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define VD_OP_BREAD 0x01 /* Block read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define VD_OP_BWRITE 0x02 /* Block write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define VD_OP_FLUSH 0x03 /* Flush disk contents */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define VD_OP_GET_WCE 0x04 /* Get write-cache status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define VD_OP_SET_WCE 0x05 /* Enable/disable write-cache */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define VD_OP_GET_VTOC 0x06 /* Get VTOC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define VD_OP_SET_VTOC 0x07 /* Set VTOC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define VD_OP_GET_DISKGEOM 0x08 /* Get disk geometry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define VD_OP_SET_DISKGEOM 0x09 /* Set disk geometry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define VD_OP_SCSICMD 0x0a /* SCSI control command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define VD_OP_GET_DEVID 0x0b /* Get device ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define VD_OP_GET_EFI 0x0c /* Get EFI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define VD_OP_SET_EFI 0x0d /* Set EFI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) u8 slice;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) u16 resv1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) u32 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) u64 offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) u64 size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) u32 ncookies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) u32 resv2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) struct ldc_trans_cookie cookies[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define VIO_DISK_VNAME_LEN 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define VIO_DISK_ALABEL_LEN 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define VIO_DISK_NUM_PART 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) struct vio_disk_vtoc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) u8 volume_name[VIO_DISK_VNAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) u16 sector_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) u16 num_partitions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) u8 ascii_label[VIO_DISK_ALABEL_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) u16 id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) u16 perm_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) u32 resv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) u64 start_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) u64 num_blocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) } partitions[VIO_DISK_NUM_PART];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) struct vio_disk_geom {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) u16 num_cyl; /* Num data cylinders */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) u16 alt_cyl; /* Num alternate cylinders */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) u16 beg_cyl; /* Cyl off of fixed head area */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) u16 num_hd; /* Num heads */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) u16 num_sec; /* Num sectors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) u16 ifact; /* Interleave factor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) u16 apc; /* Alts per cylinder (SCSI) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) u16 rpm; /* Revolutions per minute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) u16 phy_cyl; /* Num physical cylinders */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) u16 wr_skip; /* Num sects to skip, writes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) u16 rd_skip; /* Num sects to skip, writes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) struct vio_disk_devid {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) u16 resv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) u16 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) u32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) char id[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) struct vio_disk_efi {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) u64 lba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) u64 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) char data[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /* VIO net specific structures and defines */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) struct vio_net_attr_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) struct vio_msg_tag tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) u8 xfer_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) u8 addr_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define VNET_ADDR_ETHERMAC 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) u16 ack_freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) u8 plnk_updt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) #define PHYSLINK_UPDATE_NONE 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) #define PHYSLINK_UPDATE_STATE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) #define PHYSLINK_UPDATE_STATE_ACK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #define PHYSLINK_UPDATE_STATE_NACK 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) u8 options;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) u16 resv1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) u64 addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) u64 mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) u16 cflags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) #define VNET_LSO_IPV4_CAPAB 0x0001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) u16 ipv4_lso_maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) u32 resv2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) u64 resv3[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #define VNET_NUM_MCAST 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) struct vio_net_mcast_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct vio_msg_tag tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) u8 set;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) u8 count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) u8 mcast_addr[VNET_NUM_MCAST * 6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) u32 resv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) struct vio_net_desc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) struct vio_dring_hdr hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) u32 size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) u32 ncookies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) struct ldc_trans_cookie cookies[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) struct vio_net_dext {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) u8 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) #define VNET_PKT_HASH 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) #define VNET_PKT_HCK_IPV4_HDRCKSUM 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) #define VNET_PKT_HCK_FULLCKSUM 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) #define VNET_PKT_IPV4_LSO 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) #define VNET_PKT_HCK_IPV4_HDRCKSUM_OK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) #define VNET_PKT_HCK_FULLCKSUM_OK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) u8 vnet_hashval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) u16 ipv4_lso_mss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) u32 resv3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) static inline struct vio_net_dext *vio_net_ext(struct vio_net_desc *desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) return (struct vio_net_dext *)&desc->cookies[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) #define VIO_MAX_RING_COOKIES 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) struct vio_dring_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) u64 ident;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) void *base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) u64 snd_nxt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) u64 rcv_nxt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) u32 entry_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) u32 num_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) u32 prod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) u32 cons;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) u32 pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) int ncookies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) struct ldc_trans_cookie cookies[VIO_MAX_RING_COOKIES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) #define VIO_TAG_SIZE ((int)sizeof(struct vio_msg_tag))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) #define VIO_VCC_MTU_SIZE (LDC_PACKET_SIZE - VIO_TAG_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) struct vio_vcc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) struct vio_msg_tag tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) char data[VIO_VCC_MTU_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) static inline void *vio_dring_cur(struct vio_dring_state *dr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) return dr->base + (dr->entry_size * dr->prod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) static inline void *vio_dring_entry(struct vio_dring_state *dr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) unsigned int index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) return dr->base + (dr->entry_size * index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) static inline u32 vio_dring_avail(struct vio_dring_state *dr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) unsigned int ring_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) return (dr->pending -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) ((dr->prod - dr->cons) & (ring_size - 1)) - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) static inline u32 vio_dring_next(struct vio_dring_state *dr, u32 index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) if (++index == dr->num_entries)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) return index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) static inline u32 vio_dring_prev(struct vio_dring_state *dr, u32 index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) if (index == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) return dr->num_entries - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) return index - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) #define VIO_MAX_TYPE_LEN 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) #define VIO_MAX_NAME_LEN 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) #define VIO_MAX_COMPAT_LEN 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) struct vio_dev {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) u64 mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) struct device_node *dp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) char node_name[VIO_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) char type[VIO_MAX_TYPE_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) char compat[VIO_MAX_COMPAT_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) int compat_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) u64 dev_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) unsigned long port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) unsigned long channel_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) unsigned int tx_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) unsigned int rx_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) u64 rx_ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) u64 tx_ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) /* Handle to the root of "channel-devices" sub-tree in MDESC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) u64 cdev_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) /* MD specific data used to identify the vdev in MD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) union md_node_info md_node_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) struct device dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) struct vio_driver {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) struct list_head node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) const struct vio_device_id *id_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) int (*probe)(struct vio_dev *dev, const struct vio_device_id *id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) int (*remove)(struct vio_dev *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) void (*shutdown)(struct vio_dev *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) unsigned long driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) struct device_driver driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) bool no_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) struct vio_version {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) u16 major;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) u16 minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) struct vio_driver_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) struct vio_driver_ops {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) int (*send_attr)(struct vio_driver_state *vio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) int (*handle_attr)(struct vio_driver_state *vio, void *pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) void (*handshake_complete)(struct vio_driver_state *vio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) struct vio_completion {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) struct completion com;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) int waiting_for;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) struct vio_driver_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) /* Protects VIO handshake and, optionally, driver private state. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) struct ldc_channel *lp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) u32 _peer_sid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) u32 _local_sid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) struct vio_dring_state drings[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) #define VIO_DRIVER_TX_RING 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) #define VIO_DRIVER_RX_RING 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) u8 hs_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) #define VIO_HS_INVALID 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) #define VIO_HS_GOTVERS 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) #define VIO_HS_GOT_ATTR 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) #define VIO_HS_SENT_DREG 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) #define VIO_HS_SENT_RDX 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) #define VIO_HS_GOT_RDX_ACK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) #define VIO_HS_GOT_RDX 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) #define VIO_HS_SENT_RDX_ACK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) #define VIO_HS_COMPLETE (VIO_HS_GOT_RDX_ACK | VIO_HS_SENT_RDX_ACK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) u8 dev_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) u8 dr_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) #define VIO_DR_STATE_TXREG 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) #define VIO_DR_STATE_RXREG 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) #define VIO_DR_STATE_TXREQ 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) #define VIO_DR_STATE_RXREQ 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) u8 debug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) #define VIO_DEBUG_HS 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) #define VIO_DEBUG_DATA 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) void *desc_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) unsigned int desc_buf_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) struct vio_completion *cmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) struct vio_dev *vdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) struct timer_list timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) struct vio_version ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) struct vio_version *ver_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) int ver_table_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) struct vio_driver_ops *ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) static inline bool vio_version_before(struct vio_driver_state *vio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) u16 major, u16 minor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) u32 have = (u32)vio->ver.major << 16 | vio->ver.minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) u32 want = (u32)major << 16 | minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) return have < want;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) static inline bool vio_version_after(struct vio_driver_state *vio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) u16 major, u16 minor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) u32 have = (u32)vio->ver.major << 16 | vio->ver.minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) u32 want = (u32)major << 16 | minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) return have > want;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) static inline bool vio_version_after_eq(struct vio_driver_state *vio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) u16 major, u16 minor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) u32 have = (u32)vio->ver.major << 16 | vio->ver.minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) u32 want = (u32)major << 16 | minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) return have >= want;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) #define viodbg(TYPE, f, a...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) do { if (vio->debug & VIO_DEBUG_##TYPE) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) printk(KERN_INFO "vio: ID[%lu] " f, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) vio->vdev->channel_id, ## a); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) int __vio_register_driver(struct vio_driver *drv, struct module *owner,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) const char *mod_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) * vio_register_driver must be a macro so that KBUILD_MODNAME can be expanded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) #define vio_register_driver(driver) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) __vio_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) void vio_unregister_driver(struct vio_driver *drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) static inline struct vio_driver *to_vio_driver(struct device_driver *drv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) return container_of(drv, struct vio_driver, driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) static inline struct vio_dev *to_vio_dev(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) return container_of(dev, struct vio_dev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) int vio_ldc_send(struct vio_driver_state *vio, void *data, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) void vio_link_state_change(struct vio_driver_state *vio, int event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) void vio_conn_reset(struct vio_driver_state *vio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) int vio_control_pkt_engine(struct vio_driver_state *vio, void *pkt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) int vio_validate_sid(struct vio_driver_state *vio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) struct vio_msg_tag *tp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) u32 vio_send_sid(struct vio_driver_state *vio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) int vio_ldc_alloc(struct vio_driver_state *vio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) struct ldc_channel_config *base_cfg, void *event_arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) void vio_ldc_free(struct vio_driver_state *vio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) int vio_driver_init(struct vio_driver_state *vio, struct vio_dev *vdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) u8 dev_class, struct vio_version *ver_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) int ver_table_size, struct vio_driver_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) void vio_port_up(struct vio_driver_state *vio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) int vio_set_intr(unsigned long dev_ino, int state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) u64 vio_vdev_node(struct mdesc_handle *hp, struct vio_dev *vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) #endif /* _SPARC64_VIO_H */