uisqueue.h revision f6d0c1e62b111bef3be279e4bf1bc2a6d560e205
112e364b9f08aa335dc7716ce74113e834c993765Ken Cox/* uisqueue.h
212e364b9f08aa335dc7716ce74113e834c993765Ken Cox *
3f6d0c1e62b111bef3be279e4bf1bc2a6d560e205Benjamin Romer * Copyright (C) 2010 - 2013 UNISYS CORPORATION
412e364b9f08aa335dc7716ce74113e834c993765Ken Cox * All rights reserved.
512e364b9f08aa335dc7716ce74113e834c993765Ken Cox *
612e364b9f08aa335dc7716ce74113e834c993765Ken Cox * This program is free software; you can redistribute it and/or modify
712e364b9f08aa335dc7716ce74113e834c993765Ken Cox * it under the terms of the GNU General Public License as published by
812e364b9f08aa335dc7716ce74113e834c993765Ken Cox * the Free Software Foundation; either version 2 of the License, or (at
912e364b9f08aa335dc7716ce74113e834c993765Ken Cox * your option) any later version.
1012e364b9f08aa335dc7716ce74113e834c993765Ken Cox *
1112e364b9f08aa335dc7716ce74113e834c993765Ken Cox * This program is distributed in the hope that it will be useful, but
1212e364b9f08aa335dc7716ce74113e834c993765Ken Cox * WITHOUT ANY WARRANTY; without even the implied warranty of
1312e364b9f08aa335dc7716ce74113e834c993765Ken Cox * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
1412e364b9f08aa335dc7716ce74113e834c993765Ken Cox * NON INFRINGEMENT.  See the GNU General Public License for more
1512e364b9f08aa335dc7716ce74113e834c993765Ken Cox * details.
1612e364b9f08aa335dc7716ce74113e834c993765Ken Cox */
1712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
1812e364b9f08aa335dc7716ce74113e834c993765Ken Cox/*
1912e364b9f08aa335dc7716ce74113e834c993765Ken Cox * Unisys IO Virtualization header NOTE: This file contains only Linux
2012e364b9f08aa335dc7716ce74113e834c993765Ken Cox * specific structs.  All OS-independent structs are in iochannel.h.xx
2112e364b9f08aa335dc7716ce74113e834c993765Ken Cox */
2212e364b9f08aa335dc7716ce74113e834c993765Ken Cox
2312e364b9f08aa335dc7716ce74113e834c993765Ken Cox#ifndef __UISQUEUE_H__
2412e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define __UISQUEUE_H__
2512e364b9f08aa335dc7716ce74113e834c993765Ken Cox
2612e364b9f08aa335dc7716ce74113e834c993765Ken Cox#include "linux/version.h"
2712e364b9f08aa335dc7716ce74113e834c993765Ken Cox#include "iochannel.h"
2812e364b9f08aa335dc7716ce74113e834c993765Ken Cox#include "uniklog.h"
2912e364b9f08aa335dc7716ce74113e834c993765Ken Cox#include <linux/atomic.h>
3012e364b9f08aa335dc7716ce74113e834c993765Ken Cox#include <linux/semaphore.h>
3112e364b9f08aa335dc7716ce74113e834c993765Ken Cox
3212e364b9f08aa335dc7716ce74113e834c993765Ken Cox#include "controlvmchannel.h"
3312e364b9f08aa335dc7716ce74113e834c993765Ken Cox#include "controlvmcompletionstatus.h"
3412e364b9f08aa335dc7716ce74113e834c993765Ken Cox
3512e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct uisqueue_info {
3612e364b9f08aa335dc7716ce74113e834c993765Ken Cox
378504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	CHANNEL_HEADER __iomem *chan;
3812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* channel containing queues in which scsi commands &
3912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 * responses are queued
4012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 */
4112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 packets_sent;
4212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 packets_received;
4312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 interrupts_sent;
4412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 interrupts_received;
4512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 max_not_empty_cnt;
4612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 total_wakeup_cnt;
4712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 non_empty_wakeup_cnt;
4812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
4912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct {
5012e364b9f08aa335dc7716ce74113e834c993765Ken Cox		SIGNAL_QUEUE_HEADER Reserved1;	/*  */
5112e364b9f08aa335dc7716ce74113e834c993765Ken Cox		SIGNAL_QUEUE_HEADER Reserved2;	/*  */
5212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	} safe_uis_queue;
5312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	unsigned int (*send_int_if_needed)(struct uisqueue_info *info,
5412e364b9f08aa335dc7716ce74113e834c993765Ken Cox					   unsigned int whichcqueue,
5512e364b9f08aa335dc7716ce74113e834c993765Ken Cox					   unsigned char issueInterruptIfEmpty,
5612e364b9f08aa335dc7716ce74113e834c993765Ken Cox					   U64 interruptHandle,
5712e364b9f08aa335dc7716ce74113e834c993765Ken Cox					   unsigned char io_termination);
5812e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
5912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
6012e364b9f08aa335dc7716ce74113e834c993765Ken Cox/* uisqueue_put_cmdrsp_with_lock_client queues a commmand or response
6112e364b9f08aa335dc7716ce74113e834c993765Ken Cox * to the specified queue, at the tail if the queue is full but
6212e364b9f08aa335dc7716ce74113e834c993765Ken Cox * oktowait == 0, then it return 0 indicating failure.  otherwise it
6312e364b9f08aa335dc7716ce74113e834c993765Ken Cox * wait for the queue to become non-full. If command is queued, return
6412e364b9f08aa335dc7716ce74113e834c993765Ken Cox * 1 for success.
6512e364b9f08aa335dc7716ce74113e834c993765Ken Cox */
6612e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define DONT_ISSUE_INTERRUPT 0
6712e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define ISSUE_INTERRUPT		 1
6812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
6912e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define DONT_WAIT			 0
7012e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define OK_TO_WAIT			 1
7112e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define UISLIB_LOCK_PREFIX \
7212e364b9f08aa335dc7716ce74113e834c993765Ken Cox		".section .smp_locks,\"a\"\n"   \
7312e364b9f08aa335dc7716ce74113e834c993765Ken Cox		_ASM_ALIGN "\n"                 \
7412e364b9f08aa335dc7716ce74113e834c993765Ken Cox		_ASM_PTR "661f\n" /* address */ \
7512e364b9f08aa335dc7716ce74113e834c993765Ken Cox		".previous\n"                   \
7612e364b9f08aa335dc7716ce74113e834c993765Ken Cox		"661:\n\tlock; "
7712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
788504ff6cab9cc43591999e542e437445db5cfd92Ken Coxunsigned long long uisqueue_InterlockedOr(unsigned long long __iomem *Target,
7912e364b9f08aa335dc7716ce74113e834c993765Ken Cox					  unsigned long long Set);
808504ff6cab9cc43591999e542e437445db5cfd92Ken Coxunsigned long long uisqueue_InterlockedAnd(unsigned long long __iomem *Target,
8112e364b9f08aa335dc7716ce74113e834c993765Ken Cox					   unsigned long long Set);
8212e364b9f08aa335dc7716ce74113e834c993765Ken Cox
8312e364b9f08aa335dc7716ce74113e834c993765Ken Coxunsigned int uisqueue_send_int_if_needed(struct uisqueue_info *pqueueinfo,
8412e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 unsigned int whichqueue,
8512e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 unsigned char issueInterruptIfEmpty,
8612e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 U64 interruptHandle,
8712e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 unsigned char io_termination);
8812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
8912e364b9f08aa335dc7716ce74113e834c993765Ken Coxint uisqueue_put_cmdrsp_with_lock_client(struct uisqueue_info *queueinfo,
9012e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 struct uiscmdrsp *cmdrsp,
9112e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 unsigned int queue,
9212e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 void *insertlock,
9312e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 unsigned char issueInterruptIfEmpty,
9412e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 U64 interruptHandle,
9512e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 char oktowait,
9612e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 U8 *channelId);
9712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
9812e364b9f08aa335dc7716ce74113e834c993765Ken Cox/* uisqueue_get_cmdrsp gets the cmdrsp entry at the head of the queue
9912e364b9f08aa335dc7716ce74113e834c993765Ken Cox * and copies it to the area pointed by cmdrsp param.
10012e364b9f08aa335dc7716ce74113e834c993765Ken Cox * returns 0 if queue is empty, 1 otherwise
10112e364b9f08aa335dc7716ce74113e834c993765Ken Cox */
10212e364b9f08aa335dc7716ce74113e834c993765Ken Coxint
10312e364b9f08aa335dc7716ce74113e834c993765Ken Cox
10412e364b9f08aa335dc7716ce74113e834c993765Ken Coxuisqueue_get_cmdrsp(struct uisqueue_info *queueinfo, void *cmdrsp,
10512e364b9f08aa335dc7716ce74113e834c993765Ken Cox		    unsigned int queue);
10612e364b9f08aa335dc7716ce74113e834c993765Ken Cox
10712e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define MAX_NAME_SIZE_UISQUEUE 64
10812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
10912e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct extport_info {
11012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U8 valid:1;
11112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* if 1, indicates this extport slot is occupied
11212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 * if 0, indicates that extport slot is unoccupied */
11312e364b9f08aa335dc7716ce74113e834c993765Ken Cox
11412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 num_devs_using;
11512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* When extport is added, this is set to 0.  For exports
11612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* located in NETWORK switches:
11712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* Each time a VNIC, i.e., intport, is added to the switch this
11812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* is used to assign a pref_pnic for the VNIC and when assigned
11912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* to a VNIC this counter is incremented. When a VNIC is
12012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* deleted, the extport corresponding to the VNIC's pref_pnic
12112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* is located and its num_devs_using is decremented. For VNICs,
12212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* num_devs_using is basically used to load-balance transmit
12312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* traffic from VNICs.
12412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	*/
12512e364b9f08aa335dc7716ce74113e834c993765Ken Cox
12612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct switch_info *swtch;
12712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct PciId pci_id;
12812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char name[MAX_NAME_SIZE_UISQUEUE];
12912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	union {
13012e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct vhba_wwnn wwnn;
13112e364b9f08aa335dc7716ce74113e834c993765Ken Cox		unsigned char macaddr[MAX_MACADDR_LEN];
13212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	};
13312e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
13412e364b9f08aa335dc7716ce74113e834c993765Ken Cox
13512e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct device_info {
1368504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	void __iomem *chanptr;
13712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 channelAddr;
13812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 channelBytes;
13912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUID channelTypeGuid;
14012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUID devInstGuid;
14112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct InterruptInfo intr;
14212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct switch_info *swtch;
14312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char devid[30];		/* "vbus<busno>:dev<devno>" */
14412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U16 polling;
14512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct semaphore interrupt_callback_lock;
14612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 busNo;
14712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 devNo;
14812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	int (*interrupt)(void *);
14912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *interrupt_context;
15012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *private_data;
15112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct list_head list_polling_device_channels;
15212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	unsigned long long moved_to_tail_cnt;
15312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	unsigned long long first_busy_cnt;
15412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	unsigned long long last_on_list_cnt;
15512e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
15612e364b9f08aa335dc7716ce74113e834c993765Ken Cox
15712e364b9f08aa335dc7716ce74113e834c993765Ken Coxtypedef enum {
15812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	RECOVERY_LAN = 1,
15912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IB_LAN = 2
16012e364b9f08aa335dc7716ce74113e834c993765Ken Cox} SWITCH_TYPE;
16112e364b9f08aa335dc7716ce74113e834c993765Ken Cox
16212e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct bus_info {
16312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 busNo, deviceCount;
16412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct device_info **device;
16512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 guestHandle, recvBusInterruptHandle;
16612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUID busInstGuid;
1678504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	ULTRA_VBUS_CHANNEL_PROTOCOL __iomem *pBusChannel;
16812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	int busChannelBytes;
16912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct proc_dir_entry *proc_dir;	/* proc/uislib/vbus/<x> */
17012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct proc_dir_entry *proc_info;	/* proc/uislib/vbus/<x>/info */
17112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char name[25];
17212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char partitionName[99];
17312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct bus_info *next;
17412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U8 localVnic;		/* 1 if local vnic created internally
17512e364b9f08aa335dc7716ce74113e834c993765Ken Cox				 * by IOVM; 0 otherwise... */
17612e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
17712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
17812e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define DEDICATED_SWITCH(pSwitch) ((pSwitch->extPortCount == 1) &&	\
17912e364b9f08aa335dc7716ce74113e834c993765Ken Cox				   (pSwitch->intPortCount == 1))
18012e364b9f08aa335dc7716ce74113e834c993765Ken Cox
18112e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct sn_list_entry {
18212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct uisscsi_dest pdest;	/* scsi bus, target, lun for
18312e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * phys disk */
18412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U8 sernum[MAX_SERIAL_NUM];	/* serial num of physical
18512e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * disk.. The length is always
18612e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * MAX_SERIAL_NUM, padded with
18712e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * spaces */
18812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct sn_list_entry *next;
18912e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
19012e364b9f08aa335dc7716ce74113e834c993765Ken Cox
19112e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct networkPolicy {
19212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 promiscuous:1;
19312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 macassign:1;
19412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 peerforwarding:1;
19512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 nonotify:1;
19612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 standby:1;
19712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 callhome:2;
19812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char ip_addr[30];
19912e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
20012e364b9f08aa335dc7716ce74113e834c993765Ken Cox
20112e364b9f08aa335dc7716ce74113e834c993765Ken Cox/*
20212e364b9f08aa335dc7716ce74113e834c993765Ken Cox * IO messages sent to UisnicControlChanFunc & UissdControlChanFunc by
20312e364b9f08aa335dc7716ce74113e834c993765Ken Cox * code that processes the ControlVm channel messages.
20412e364b9f08aa335dc7716ce74113e834c993765Ken Cox */
20512e364b9f08aa335dc7716ce74113e834c993765Ken Cox
20612e364b9f08aa335dc7716ce74113e834c993765Ken Cox
20712e364b9f08aa335dc7716ce74113e834c993765Ken Coxtypedef enum {
20812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_ADD_VNIC,
20912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_VNIC,
21012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_ALL_VNICS,
21112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_ADD_VHBA,
21212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_ADD_VDISK,
21312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_VHBA,
21412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_VDISK,
21512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_ALL_VDISKS_FOR_VHBA,
21612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_ALL_VHBAS,
21712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_ATTACH_PHBA,
21812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DETACH_PHBA,	/* 10 */
21912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_ATTACH_PNIC,
22012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DETACH_PNIC,
22112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DETACH_VHBA,
22212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DETACH_VNIC,
22312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_PAUSE_VDISK,
22412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_RESUME_VDISK,
22512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_ADD_DEVICE,	/* add generic device */
22612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_DEVICE,	/* del generic device */
22712e364b9f08aa335dc7716ce74113e834c993765Ken Cox} IOPART_MSG_TYPE;
22812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
22912e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct add_virt_iopart {
23012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *chanptr;		/* pointer to data channel */
23112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 guestHandle;	/* used to convert guest physical
23212e364b9f08aa335dc7716ce74113e834c993765Ken Cox				 * address to real physical address
23312e364b9f08aa335dc7716ce74113e834c993765Ken Cox				 * for DMA, for ex. */
23412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 recvBusInterruptHandle;	/* used to register to receive
23512e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * bus level interrupts. */
23612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct InterruptInfo intr;	/* contains recv & send
23712e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * interrupt info */
23812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* recvInterruptHandle is used to register to receive
23912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* interrupts on the data channel. Used by GuestLinux/Windows
24012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* IO drivers to connect to interrupt.  sendInterruptHandle is
24112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* used by IOPart drivers as parameter to
24212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* Issue_VMCALL_IO_QUEUE_TRANSITION to interrupt thread in
24312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* guest linux/windows IO drivers when data channel queue for
24412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* vhba/vnic goes from EMPTY to NON-EMPTY. */
24512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct switch_info *swtch;	/* pointer to the virtual
24612e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * switch to which the vnic is
24712e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * connected */
24812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
24912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U8 useG2GCopy;		/* Used to determine if a virtual HBA
25012e364b9f08aa335dc7716ce74113e834c993765Ken Cox				 * needs to use G2G copy. */
25112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U8 Filler[7];
25212e364b9f08aa335dc7716ce74113e834c993765Ken Cox
25312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 busNo;
25412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 devNo;
25512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char *params;
25612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	ulong params_bytes;
25712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
25812e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
25912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
26012e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct add_vdisk_iopart {
26112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *chanptr;		      /* pointer to data channel */
26212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	int implicit;
26312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct uisscsi_dest vdest;    /* scsi bus, target, lun for virt disk */
26412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct uisscsi_dest pdest;    /* scsi bus, target, lun for phys disk */
26512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U8 sernum[MAX_SERIAL_NUM];    /* serial num of physical disk */
26612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 serlen;		      /* length of serial num */
26712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 busNo;
26812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 devNo;
26912e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
27012e364b9f08aa335dc7716ce74113e834c993765Ken Cox
27112e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct del_vdisk_iopart {
27212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *chanptr;		     /* pointer to data channel */
27312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct uisscsi_dest vdest;   /* scsi bus, target, lun for virt disk */
27412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 busNo;
27512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 devNo;
27612e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
27712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
27812e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct del_virt_iopart {
27912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *chanptr;		     /* pointer to data channel */
28012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 busNo;
28112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 devNo;
28212e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
28312e364b9f08aa335dc7716ce74113e834c993765Ken Cox
28412e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct det_virt_iopart {	     /* detach internal port */
28512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *chanptr;		     /* pointer to data channel */
28612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct switch_info *swtch;
28712e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
28812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
28912e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct paures_vdisk_iopart {
29012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *chanptr;		     /* pointer to data channel */
29112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct uisscsi_dest vdest;   /* scsi bus, target, lun for virt disk */
29212e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
29312e364b9f08aa335dc7716ce74113e834c993765Ken Cox
29412e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct add_switch_iopart {	     /* add switch */
29512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct switch_info *swtch;
29612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char *params;
29712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	ulong params_bytes;
29812e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
29912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
30012e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct del_switch_iopart {	     /* destroy switch */
30112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct switch_info *swtch;
30212e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
30312e364b9f08aa335dc7716ce74113e834c993765Ken Cox
30412e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct io_msgs {
30512e364b9f08aa335dc7716ce74113e834c993765Ken Cox
30612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_MSG_TYPE msgtype;
30712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
30812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* additional params needed by some messages */
30912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	union {
31012e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_virt_iopart add_vhba;
31112e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_virt_iopart add_vnic;
31212e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_vdisk_iopart add_vdisk;
31312e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_virt_iopart del_vhba;
31412e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_virt_iopart del_vnic;
31512e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct det_virt_iopart det_vhba;
31612e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct det_virt_iopart det_vnic;
31712e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_vdisk_iopart del_vdisk;
31812e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_virt_iopart del_all_vdisks_for_vhba;
31912e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_virt_iopart add_device;
32012e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_virt_iopart del_device;
32112e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct det_virt_iopart det_intport;
32212e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_switch_iopart add_switch;
32312e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_switch_iopart del_switch;
32412e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct extport_info *extPort;	/* for attach or detach
32512e364b9f08aa335dc7716ce74113e834c993765Ken Cox						 * pnic/generic delete all
32612e364b9f08aa335dc7716ce74113e834c993765Ken Cox						 * vhbas/allvnics need no
32712e364b9f08aa335dc7716ce74113e834c993765Ken Cox						 * parameters */
32812e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct paures_vdisk_iopart paures_vdisk;
32912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	};
33012e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
33112e364b9f08aa335dc7716ce74113e834c993765Ken Cox
33212e364b9f08aa335dc7716ce74113e834c993765Ken Cox/*
33312e364b9f08aa335dc7716ce74113e834c993765Ken Cox* Guest messages sent to VirtControlChanFunc by code that processes
33412e364b9f08aa335dc7716ce74113e834c993765Ken Cox* the ControlVm channel messages.
33512e364b9f08aa335dc7716ce74113e834c993765Ken Cox*/
33612e364b9f08aa335dc7716ce74113e834c993765Ken Cox
33712e364b9f08aa335dc7716ce74113e834c993765Ken Coxtypedef enum {
33812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_ADD_VBUS,
33912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_ADD_VHBA,
34012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_ADD_VNIC,
34112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_DEL_VBUS,
34212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_DEL_VHBA,
34312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_DEL_VNIC,
34412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_DEL_ALL_VHBAS,
34512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_DEL_ALL_VNICS,
34612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_DEL_ALL_VBUSES,	/* deletes all vhbas & vnics on all
34712e364b9f08aa335dc7716ce74113e834c993765Ken Cox				 * buses and deletes all buses */
34812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_PAUSE_VHBA,
34912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_PAUSE_VNIC,
35012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_RESUME_VHBA,
35112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_RESUME_VNIC
35212e364b9f08aa335dc7716ce74113e834c993765Ken Cox} GUESTPART_MSG_TYPE;
35312e364b9f08aa335dc7716ce74113e834c993765Ken Cox
35412e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct add_vbus_guestpart {
3558504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	void __iomem *chanptr;		/* pointer to data channel for bus -
3568504ff6cab9cc43591999e542e437445db5cfd92Ken Cox					 * NOT YET USED */
35712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 busNo;		/* bus number to be created/deleted */
35812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 deviceCount;	/* max num of devices on bus */
35912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUID busTypeGuid;	/* indicates type of bus */
36012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUID busInstGuid;	/* instance guid for device */
36112e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
36212e364b9f08aa335dc7716ce74113e834c993765Ken Cox
36312e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct del_vbus_guestpart {
36412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 busNo;		/* bus number to be deleted */
36512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* once we start using the bus's channel, add can dump busNo
36612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* into the channel header and then delete will need only one
36712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* parameter, chanptr. */
36812e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
36912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
37012e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct add_virt_guestpart {
3718504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	void __iomem *chanptr;		/* pointer to data channel */
37212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 busNo;		/* bus number for the operation */
37312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 deviceNo;		/* number of device on the bus */
37412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUID devInstGuid;	/* instance guid for device */
37512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct InterruptInfo intr;	/* recv/send interrupt info */
37612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* recvInterruptHandle contains info needed in order to
37712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 * register to receive interrupts on the data channel.
37812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 * sendInterruptHandle contains handle which is provided to
37912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 * monitor VMCALL that will cause an interrupt to be generated
38012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 * for the other end.
38112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 */
38212e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
38312e364b9f08aa335dc7716ce74113e834c993765Ken Cox
38412e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct pause_virt_guestpart {
3858504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	void __iomem *chanptr;		/* pointer to data channel */
38612e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
38712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
38812e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct resume_virt_guestpart {
3898504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	void __iomem *chanptr;		/* pointer to data channel */
39012e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
39112e364b9f08aa335dc7716ce74113e834c993765Ken Cox
39212e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct del_virt_guestpart {
3938504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	void __iomem *chanptr;		/* pointer to data channel */
39412e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
39512e364b9f08aa335dc7716ce74113e834c993765Ken Cox
39612e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct init_chipset_guestpart {
39712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 busCount;		/* indicates the max number of busses */
39812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U32 switchCount;	/* indicates the max number of switches */
39912e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
40012e364b9f08aa335dc7716ce74113e834c993765Ken Cox
40112e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct guest_msgs {
40212e364b9f08aa335dc7716ce74113e834c993765Ken Cox
40312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUESTPART_MSG_TYPE msgtype;
40412e364b9f08aa335dc7716ce74113e834c993765Ken Cox
40512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* additional params needed by messages */
40612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	union {
40712e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_vbus_guestpart add_vbus;
40812e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_virt_guestpart add_vhba;
40912e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_virt_guestpart add_vnic;
41012e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct pause_virt_guestpart pause_vhba;
41112e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct pause_virt_guestpart pause_vnic;
41212e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct resume_virt_guestpart resume_vhba;
41312e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct resume_virt_guestpart resume_vnic;
41412e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_vbus_guestpart del_vbus;
41512e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_virt_guestpart del_vhba;
41612e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_virt_guestpart del_vnic;
41712e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_vbus_guestpart del_all_vhbas;
41812e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_vbus_guestpart del_all_vnics;
41912e364b9f08aa335dc7716ce74113e834c993765Ken Cox		/* del_all_vbuses needs no parameters */
42012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	};
42112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct init_chipset_guestpart init_chipset;
42212e364b9f08aa335dc7716ce74113e834c993765Ken Cox
42312e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
42412e364b9f08aa335dc7716ce74113e834c993765Ken Cox
42512e364b9f08aa335dc7716ce74113e834c993765Ken Cox#ifndef __xg
42612e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define __xg(x) ((volatile long *)(x))
42712e364b9f08aa335dc7716ce74113e834c993765Ken Cox#endif
42812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
42912e364b9f08aa335dc7716ce74113e834c993765Ken Cox/*
43012e364b9f08aa335dc7716ce74113e834c993765Ken Cox*  Below code is a copy of Linux kernel's cmpxchg function located at
43112e364b9f08aa335dc7716ce74113e834c993765Ken Cox*  this place
43212e364b9f08aa335dc7716ce74113e834c993765Ken Cox*  http://tcsxeon:8080/source/xref/00trunk-AppOS-linux/include/asm-x86/cmpxchg_64.h#84
43312e364b9f08aa335dc7716ce74113e834c993765Ken Cox*  Reason for creating our own version of cmpxchg along with
43412e364b9f08aa335dc7716ce74113e834c993765Ken Cox*  UISLIB_LOCK_PREFIX is to make the operation atomic even for non SMP
43512e364b9f08aa335dc7716ce74113e834c993765Ken Cox*  guests.
43612e364b9f08aa335dc7716ce74113e834c993765Ken Cox*/
43712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
4388504ff6cab9cc43591999e542e437445db5cfd92Ken Cox#define uislibcmpxchg64(p, o, n, s) cmpxchg(p, o, n)
43912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
44012e364b9f08aa335dc7716ce74113e834c993765Ken Cox#endif				/* __UISQUEUE_H__ */
441