1a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#ifndef _SPARC64_VIO_H 2a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define _SPARC64_VIO_H 3a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 4a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#include <linux/kernel.h> 5a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#include <linux/device.h> 6a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#include <linux/mod_devicetable.h> 7a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#include <linux/timer.h> 8a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#include <linux/spinlock.h> 9a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#include <linux/completion.h> 10a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#include <linux/list.h> 11a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#include <linux/log2.h> 12a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 13a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#include <asm/ldc.h> 14a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#include <asm/mdesc.h> 15a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 16a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_msg_tag { 17a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 type; 18a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_TYPE_CTRL 0x01 19a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_TYPE_DATA 0x02 20a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_TYPE_ERR 0x04 21a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 22a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 stype; 23a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_SUBTYPE_INFO 0x01 24a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_SUBTYPE_ACK 0x02 25a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_SUBTYPE_NACK 0x04 26a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 27a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 stype_env; 28a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_VER_INFO 0x0001 29a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_ATTR_INFO 0x0002 30a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DRING_REG 0x0003 31a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DRING_UNREG 0x0004 32a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_RDX 0x0005 33a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_PKT_DATA 0x0040 34a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DESC_DATA 0x0041 35a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DRING_DATA 0x0042 36a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VNET_MCAST_INFO 0x0101 37a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 38a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 sid; 39a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 40a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 41a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_rdx { 42a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_msg_tag tag; 43a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 resv[6]; 44a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 45a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 46a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_ver_info { 47a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_msg_tag tag; 48a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 major; 49a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 minor; 50a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 dev_class; 51a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VDEV_NETWORK 0x01 52a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VDEV_NETWORK_SWITCH 0x02 53a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VDEV_DISK 0x03 54a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VDEV_DISK_SERVER 0x04 55a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 56a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 resv1[3]; 57a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 resv2[5]; 58a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 59a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 60a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_dring_register { 61a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_msg_tag tag; 62a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 dring_ident; 63a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 num_descr; 64a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 descr_size; 65a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 options; 66a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_TX_DRING 0x0001 67a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_RX_DRING 0x0002 68163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens#define VIO_RX_DRING_DATA 0x0004 69a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 resv; 70a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 num_cookies; 71a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct ldc_trans_cookie cookies[0]; 72a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 73a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 74a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_dring_unregister { 75a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_msg_tag tag; 76a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 dring_ident; 77a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 resv[5]; 78a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 79a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 80a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg/* Data transfer modes */ 81a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_PKT_MODE 0x01 /* Packet based transfer */ 82a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DESC_MODE 0x02 /* In-band descriptors */ 83a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DRING_MODE 0x03 /* Descriptor rings */ 84163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens/* in vers >= 1.2, VIO_DRING_MODE is 0x04 and transfer mode is a bitmask */ 85163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens#define VIO_NEW_DRING_MODE 0x04 86a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 87a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_dring_data { 88a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_msg_tag tag; 89a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 seq; 90a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 dring_ident; 91a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 start_idx; 92a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 end_idx; 93a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 state; 94a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DRING_ACTIVE 0x01 95a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DRING_STOPPED 0x02 96a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 97a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 __pad1; 98a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 __pad2; 99a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 __pad3; 100a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 __par4[2]; 101a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 102a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 103a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_dring_hdr { 104a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 state; 105a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DESC_FREE 0x01 106a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DESC_READY 0x02 107a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DESC_ACCEPTED 0x03 108a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DESC_DONE 0x04 109a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 ack; 110a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_ACK_ENABLE 0x01 111a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_ACK_DISABLE 0x00 112a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 113a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 __pad1; 114a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 __pad2; 115a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 116a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 117a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg/* VIO disk specific structures and defines */ 118a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_disk_attr_info { 119a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_msg_tag tag; 120a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 xfer_mode; 121a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 vdisk_type; 122a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_DISK_TYPE_SLICE 0x01 /* Slice in block device */ 123a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_DISK_TYPE_DISK 0x02 /* Entire block device */ 1249bce21828d54a95143f1b74619705c2dd8e88b92Allen Pais u8 vdisk_mtype; /* v1.1 */ 1259bce21828d54a95143f1b74619705c2dd8e88b92Allen Pais#define VD_MEDIA_TYPE_FIXED 0x01 /* Fixed device */ 1269bce21828d54a95143f1b74619705c2dd8e88b92Allen Pais#define VD_MEDIA_TYPE_CD 0x02 /* CD Device */ 1279bce21828d54a95143f1b74619705c2dd8e88b92Allen Pais#define VD_MEDIA_TYPE_DVD 0x03 /* DVD Device */ 1289bce21828d54a95143f1b74619705c2dd8e88b92Allen Pais u8 resv1; 129a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 vdisk_block_size; 130a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 operations; 1319bce21828d54a95143f1b74619705c2dd8e88b92Allen Pais u64 vdisk_size; /* v1.1 */ 132a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 max_xfer_size; 1339bce21828d54a95143f1b74619705c2dd8e88b92Allen Pais u32 phys_block_size; /* v1.2 */ 1349bce21828d54a95143f1b74619705c2dd8e88b92Allen Pais u32 resv2; 1359bce21828d54a95143f1b74619705c2dd8e88b92Allen Pais u64 resv3[1]; 136a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 137a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 138a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_disk_desc { 139a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_dring_hdr hdr; 140a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 req_id; 141a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 operation; 142a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_BREAD 0x01 /* Block read */ 143a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_BWRITE 0x02 /* Block write */ 144a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_FLUSH 0x03 /* Flush disk contents */ 145a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_GET_WCE 0x04 /* Get write-cache status */ 146a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_SET_WCE 0x05 /* Enable/disable write-cache */ 147a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_GET_VTOC 0x06 /* Get VTOC */ 148a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_SET_VTOC 0x07 /* Set VTOC */ 149a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_GET_DISKGEOM 0x08 /* Get disk geometry */ 150a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_SET_DISKGEOM 0x09 /* Set disk geometry */ 151a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_SCSICMD 0x0a /* SCSI control command */ 152a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_GET_DEVID 0x0b /* Get device ID */ 153a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_GET_EFI 0x0c /* Get EFI */ 154a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VD_OP_SET_EFI 0x0d /* Set EFI */ 155a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 slice; 156a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 resv1; 157a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 status; 158a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 offset; 159a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 size; 160a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 ncookies; 161a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 resv2; 162a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct ldc_trans_cookie cookies[0]; 163a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 164a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 165a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DISK_VNAME_LEN 8 166a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DISK_ALABEL_LEN 128 167a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DISK_NUM_PART 8 168a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 169a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_disk_vtoc { 170a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 volume_name[VIO_DISK_VNAME_LEN]; 171a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 sector_size; 172a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 num_partitions; 173a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 ascii_label[VIO_DISK_ALABEL_LEN]; 174a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct { 175a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 id; 176a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 perm_flags; 177a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 resv; 178a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 start_block; 179a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 num_blocks; 180a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg } partitions[VIO_DISK_NUM_PART]; 181a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 182a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 183a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_disk_geom { 184a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 num_cyl; /* Num data cylinders */ 185a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 alt_cyl; /* Num alternate cylinders */ 186a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 beg_cyl; /* Cyl off of fixed head area */ 187a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 num_hd; /* Num heads */ 188a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 num_sec; /* Num sectors */ 189a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 ifact; /* Interleave factor */ 190a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 apc; /* Alts per cylinder (SCSI) */ 191a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 rpm; /* Revolutions per minute */ 192a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 phy_cyl; /* Num physical cylinders */ 193a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 wr_skip; /* Num sects to skip, writes */ 194a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 rd_skip; /* Num sects to skip, writes */ 195a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 196a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 197a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_disk_devid { 198a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 resv; 199a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 type; 200a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 len; 201a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg char id[0]; 202a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 203a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 204a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_disk_efi { 205a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 lba; 206a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 len; 207a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg char data[0]; 208a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 209a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 210a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg/* VIO net specific structures and defines */ 211a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_net_attr_info { 212a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_msg_tag tag; 213a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 xfer_mode; 214a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 addr_type; 215a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VNET_ADDR_ETHERMAC 0x01 216a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 ack_freq; 217163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u8 plnk_updt; 218163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens#define PHYSLINK_UPDATE_NONE 0x00 219163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens#define PHYSLINK_UPDATE_STATE 0x01 220163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens#define PHYSLINK_UPDATE_STATE_ACK 0x02 221163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens#define PHYSLINK_UPDATE_STATE_NACK 0x03 222163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u8 options; 223163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u16 resv1; 224a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 addr; 225a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 mtu; 226163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u16 cflags; 227163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens#define VNET_LSO_IPV4_CAPAB 0x0001 228163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u16 ipv4_lso_maxlen; 229163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u32 resv2; 230163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u64 resv3[2]; 231a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 232a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 233a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VNET_NUM_MCAST 7 234a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 235a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_net_mcast_info { 236a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_msg_tag tag; 237a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 set; 238a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 count; 239a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 mcast_addr[VNET_NUM_MCAST * 6]; 240a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 resv; 241a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 242a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 243a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_net_desc { 244a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_dring_hdr hdr; 245a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 size; 246a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 ncookies; 247a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct ldc_trans_cookie cookies[0]; 248a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 249a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 250a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_MAX_RING_COOKIES 24 251a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 252a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_dring_state { 253a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 ident; 254a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg void *base; 255a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 snd_nxt; 256a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 rcv_nxt; 257a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 entry_size; 258a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 num_entries; 259a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 prod; 260a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 cons; 261a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 pending; 262a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg int ncookies; 263a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct ldc_trans_cookie cookies[VIO_MAX_RING_COOKIES]; 264a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 265a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 266a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstatic inline void *vio_dring_cur(struct vio_dring_state *dr) 267a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg{ 268a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg return dr->base + (dr->entry_size * dr->prod); 269a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg} 270a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 271a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstatic inline void *vio_dring_entry(struct vio_dring_state *dr, 272a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg unsigned int index) 273a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg{ 274a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg return dr->base + (dr->entry_size * index); 275a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg} 276a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 277a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstatic inline u32 vio_dring_avail(struct vio_dring_state *dr, 278a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg unsigned int ring_size) 279a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg{ 280a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg return (dr->pending - 281d0aedcd4f14a22e23b313f42b7e6e6ebfc0fbc31Dwight Engen ((dr->prod - dr->cons) & (ring_size - 1)) - 1); 282a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg} 283a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 284a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_MAX_TYPE_LEN 32 285a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_MAX_COMPAT_LEN 64 286a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 287a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_dev { 288a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 mp; 289a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct device_node *dp; 290a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 291a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg char type[VIO_MAX_TYPE_LEN]; 292a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg char compat[VIO_MAX_COMPAT_LEN]; 293a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg int compat_len; 294a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 295a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u64 dev_no; 296a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 297a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg unsigned long channel_id; 298a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 299a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg unsigned int tx_irq; 300a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg unsigned int rx_irq; 301ca605b7dd740c8909408d67911d8ddd272c2b320Sowmini Varadhan u64 rx_ino; 302a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 303a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct device dev; 304a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 305a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 306a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_driver { 307cb52d8970eee65bf2c47d9a91bd4f58b17f595f4Benjamin Herrenschmidt const char *name; 308a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct list_head node; 309a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg const struct vio_device_id *id_table; 310a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg int (*probe)(struct vio_dev *dev, const struct vio_device_id *id); 311a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg int (*remove)(struct vio_dev *dev); 312a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg void (*shutdown)(struct vio_dev *dev); 313a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg unsigned long driver_data; 314a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct device_driver driver; 315a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 316a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 317a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_version { 318a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 major; 319a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u16 minor; 320a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 321a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 322a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_driver_state; 323a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_driver_ops { 324a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg int (*send_attr)(struct vio_driver_state *vio); 325a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg int (*handle_attr)(struct vio_driver_state *vio, void *pkt); 326a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg void (*handshake_complete)(struct vio_driver_state *vio); 327a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 328a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 329a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_completion { 330a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct completion com; 331a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg int err; 332a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg int waiting_for; 333a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 334a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 335a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstruct vio_driver_state { 336a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg /* Protects VIO handshake and, optionally, driver private state. */ 337a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg spinlock_t lock; 338a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 339a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct ldc_channel *lp; 340a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 341a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 _peer_sid; 342a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u32 _local_sid; 343a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_dring_state drings[2]; 344a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DRIVER_TX_RING 0 345a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DRIVER_RX_RING 1 346a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 347a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 hs_state; 348a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_HS_INVALID 0x00 349a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_HS_GOTVERS 0x01 350a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_HS_GOT_ATTR 0x04 351a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_HS_SENT_DREG 0x08 352a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_HS_SENT_RDX 0x10 353a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_HS_GOT_RDX_ACK 0x20 354a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_HS_GOT_RDX 0x40 355a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_HS_SENT_RDX_ACK 0x80 356a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_HS_COMPLETE (VIO_HS_GOT_RDX_ACK | VIO_HS_SENT_RDX_ACK) 357a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 358a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 dev_class; 359a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 360a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 dr_state; 361a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DR_STATE_TXREG 0x01 362a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DR_STATE_RXREG 0x02 363a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DR_STATE_TXREQ 0x10 364a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DR_STATE_RXREQ 0x20 365a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 366a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg u8 debug; 367a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DEBUG_HS 0x01 368a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define VIO_DEBUG_DATA 0x02 369a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 370a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg void *desc_buf; 371a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg unsigned int desc_buf_len; 372a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 373a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_completion *cmp; 374a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 375a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_dev *vdev; 376a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 377a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct timer_list timer; 378a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 379a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_version ver; 380a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 381a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_version *ver_table; 382a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg int ver_table_entries; 383a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 384a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg char *name; 385a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 386a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg struct vio_driver_ops *ops; 387a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg}; 388a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 389163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevensstatic inline bool vio_version_before(struct vio_driver_state *vio, 390163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u16 major, u16 minor) 391163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens{ 392163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u32 have = (u32)vio->ver.major << 16 | vio->ver.minor; 393163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u32 want = (u32)major << 16 | minor; 394163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens 395163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens return have < want; 396163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens} 397163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens 398163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevensstatic inline bool vio_version_after(struct vio_driver_state *vio, 399163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u16 major, u16 minor) 400163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens{ 401163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u32 have = (u32)vio->ver.major << 16 | vio->ver.minor; 402163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u32 want = (u32)major << 16 | minor; 403163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens 404163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens return have > want; 405163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens} 406163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens 407163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevensstatic inline bool vio_version_after_eq(struct vio_driver_state *vio, 408163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u16 major, u16 minor) 409163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens{ 410163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u32 have = (u32)vio->ver.major << 16 | vio->ver.minor; 411163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens u32 want = (u32)major << 16 | minor; 412163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens 413163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens return have >= want; 414163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens} 415163a4e7473061388bba0899a1a063bae44e1715aDavid L Stevens 416a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#define viodbg(TYPE, f, a...) \ 417a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgdo { if (vio->debug & VIO_DEBUG_##TYPE) \ 418a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg printk(KERN_INFO "vio: ID[%lu] " f, \ 419a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg vio->vdev->channel_id, ## a); \ 420a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg} while (0) 421a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 422f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborgint __vio_register_driver(struct vio_driver *drv, struct module *owner, 423cb52d8970eee65bf2c47d9a91bd4f58b17f595f4Benjamin Herrenschmidt const char *mod_name); 424cb52d8970eee65bf2c47d9a91bd4f58b17f595f4Benjamin Herrenschmidt/* 425cb52d8970eee65bf2c47d9a91bd4f58b17f595f4Benjamin Herrenschmidt * vio_register_driver must be a macro so that KBUILD_MODNAME can be expanded 426cb52d8970eee65bf2c47d9a91bd4f58b17f595f4Benjamin Herrenschmidt */ 427cb52d8970eee65bf2c47d9a91bd4f58b17f595f4Benjamin Herrenschmidt#define vio_register_driver(driver) \ 428cb52d8970eee65bf2c47d9a91bd4f58b17f595f4Benjamin Herrenschmidt __vio_register_driver(driver, THIS_MODULE, KBUILD_MODNAME) 429f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborgvoid vio_unregister_driver(struct vio_driver *drv); 430a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 431a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstatic inline struct vio_driver *to_vio_driver(struct device_driver *drv) 432a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg{ 433a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg return container_of(drv, struct vio_driver, driver); 434a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg} 435a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 436a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborgstatic inline struct vio_dev *to_vio_dev(struct device *dev) 437a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg{ 438a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg return container_of(dev, struct vio_dev, dev); 439a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg} 440a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 441f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborgint vio_ldc_send(struct vio_driver_state *vio, void *data, int len); 442f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborgvoid vio_link_state_change(struct vio_driver_state *vio, int event); 443f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborgvoid vio_conn_reset(struct vio_driver_state *vio); 444f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborgint vio_control_pkt_engine(struct vio_driver_state *vio, void *pkt); 445f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborgint vio_validate_sid(struct vio_driver_state *vio, 446f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborg struct vio_msg_tag *tp); 447f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborgu32 vio_send_sid(struct vio_driver_state *vio); 448f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborgint vio_ldc_alloc(struct vio_driver_state *vio, 449f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborg struct ldc_channel_config *base_cfg, void *event_arg); 450f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborgvoid vio_ldc_free(struct vio_driver_state *vio); 451f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborgint vio_driver_init(struct vio_driver_state *vio, struct vio_dev *vdev, 452f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborg u8 dev_class, struct vio_version *ver_table, 453f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborg int ver_table_size, struct vio_driver_ops *ops, 454f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborg char *name); 455f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborg 456f05a68653e56ca2f23bccf7e50be69486886f052Sam Ravnborgvoid vio_port_up(struct vio_driver_state *vio); 457ca605b7dd740c8909408d67911d8ddd272c2b320Sowmini Varadhanint vio_set_intr(unsigned long dev_ino, int state); 458a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg 459a00736e936c2a1e9c36f22f6f3a69392eaab51f4Sam Ravnborg#endif /* _SPARC64_VIO_H */ 460