uisqueue.h revision b3c55b13a1e458878e813c4fe2cccfa97c75f884
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>
3190addb0218d47a886c846a22d75979fe5bf3471bBenjamin Romer#include <linux/uuid.h>
3212e364b9f08aa335dc7716ce74113e834c993765Ken Cox
3312e364b9f08aa335dc7716ce74113e834c993765Ken Cox#include "controlvmchannel.h"
3412e364b9f08aa335dc7716ce74113e834c993765Ken Cox#include "controlvmcompletionstatus.h"
3512e364b9f08aa335dc7716ce74113e834c993765Ken Cox
3612e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct uisqueue_info {
3712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
388504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	CHANNEL_HEADER __iomem *chan;
3912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* channel containing queues in which scsi commands &
4012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 * responses are queued
4112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 */
4212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 packets_sent;
4312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 packets_received;
4412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 interrupts_sent;
4512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 interrupts_received;
4612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 max_not_empty_cnt;
4712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 total_wakeup_cnt;
4812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 non_empty_wakeup_cnt;
4912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
5012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct {
5112e364b9f08aa335dc7716ce74113e834c993765Ken Cox		SIGNAL_QUEUE_HEADER Reserved1;	/*  */
5212e364b9f08aa335dc7716ce74113e834c993765Ken Cox		SIGNAL_QUEUE_HEADER Reserved2;	/*  */
5312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	} safe_uis_queue;
5412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	unsigned int (*send_int_if_needed)(struct uisqueue_info *info,
5512e364b9f08aa335dc7716ce74113e834c993765Ken Cox					   unsigned int whichcqueue,
5612e364b9f08aa335dc7716ce74113e834c993765Ken Cox					   unsigned char issueInterruptIfEmpty,
5712e364b9f08aa335dc7716ce74113e834c993765Ken Cox					   U64 interruptHandle,
5812e364b9f08aa335dc7716ce74113e834c993765Ken Cox					   unsigned char io_termination);
5912e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
6012e364b9f08aa335dc7716ce74113e834c993765Ken Cox
6112e364b9f08aa335dc7716ce74113e834c993765Ken Cox/* uisqueue_put_cmdrsp_with_lock_client queues a commmand or response
6212e364b9f08aa335dc7716ce74113e834c993765Ken Cox * to the specified queue, at the tail if the queue is full but
6312e364b9f08aa335dc7716ce74113e834c993765Ken Cox * oktowait == 0, then it return 0 indicating failure.  otherwise it
6412e364b9f08aa335dc7716ce74113e834c993765Ken Cox * wait for the queue to become non-full. If command is queued, return
6512e364b9f08aa335dc7716ce74113e834c993765Ken Cox * 1 for success.
6612e364b9f08aa335dc7716ce74113e834c993765Ken Cox */
6712e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define DONT_ISSUE_INTERRUPT 0
6812e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define ISSUE_INTERRUPT		 1
6912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
7012e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define DONT_WAIT			 0
7112e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define OK_TO_WAIT			 1
7212e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define UISLIB_LOCK_PREFIX \
7312e364b9f08aa335dc7716ce74113e834c993765Ken Cox		".section .smp_locks,\"a\"\n"   \
7412e364b9f08aa335dc7716ce74113e834c993765Ken Cox		_ASM_ALIGN "\n"                 \
7512e364b9f08aa335dc7716ce74113e834c993765Ken Cox		_ASM_PTR "661f\n" /* address */ \
7612e364b9f08aa335dc7716ce74113e834c993765Ken Cox		".previous\n"                   \
7712e364b9f08aa335dc7716ce74113e834c993765Ken Cox		"661:\n\tlock; "
7812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
798504ff6cab9cc43591999e542e437445db5cfd92Ken Coxunsigned long long uisqueue_InterlockedOr(unsigned long long __iomem *Target,
8012e364b9f08aa335dc7716ce74113e834c993765Ken Cox					  unsigned long long Set);
818504ff6cab9cc43591999e542e437445db5cfd92Ken Coxunsigned long long uisqueue_InterlockedAnd(unsigned long long __iomem *Target,
8212e364b9f08aa335dc7716ce74113e834c993765Ken Cox					   unsigned long long Set);
8312e364b9f08aa335dc7716ce74113e834c993765Ken Cox
8412e364b9f08aa335dc7716ce74113e834c993765Ken Coxunsigned int uisqueue_send_int_if_needed(struct uisqueue_info *pqueueinfo,
8512e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 unsigned int whichqueue,
8612e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 unsigned char issueInterruptIfEmpty,
8712e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 U64 interruptHandle,
8812e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 unsigned char io_termination);
8912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
9012e364b9f08aa335dc7716ce74113e834c993765Ken Coxint uisqueue_put_cmdrsp_with_lock_client(struct uisqueue_info *queueinfo,
9112e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 struct uiscmdrsp *cmdrsp,
9212e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 unsigned int queue,
9312e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 void *insertlock,
9412e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 unsigned char issueInterruptIfEmpty,
9512e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 U64 interruptHandle,
9612e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 char oktowait,
97c242233e5b578ef08362d98171c10519876d0d93Benjamin Romer					 u8 *channelId);
9812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
9912e364b9f08aa335dc7716ce74113e834c993765Ken Cox/* uisqueue_get_cmdrsp gets the cmdrsp entry at the head of the queue
10012e364b9f08aa335dc7716ce74113e834c993765Ken Cox * and copies it to the area pointed by cmdrsp param.
10112e364b9f08aa335dc7716ce74113e834c993765Ken Cox * returns 0 if queue is empty, 1 otherwise
10212e364b9f08aa335dc7716ce74113e834c993765Ken Cox */
10312e364b9f08aa335dc7716ce74113e834c993765Ken Coxint
10412e364b9f08aa335dc7716ce74113e834c993765Ken Cox
10512e364b9f08aa335dc7716ce74113e834c993765Ken Coxuisqueue_get_cmdrsp(struct uisqueue_info *queueinfo, void *cmdrsp,
10612e364b9f08aa335dc7716ce74113e834c993765Ken Cox		    unsigned int queue);
10712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
10812e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define MAX_NAME_SIZE_UISQUEUE 64
10912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
11012e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct extport_info {
111c242233e5b578ef08362d98171c10519876d0d93Benjamin Romer	u8 valid:1;
11212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* if 1, indicates this extport slot is occupied
11312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 * if 0, indicates that extport slot is unoccupied */
11412e364b9f08aa335dc7716ce74113e834c993765Ken Cox
115b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 num_devs_using;
11612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* When extport is added, this is set to 0.  For exports
11712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* located in NETWORK switches:
11812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* Each time a VNIC, i.e., intport, is added to the switch this
11912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* is used to assign a pref_pnic for the VNIC and when assigned
12012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* to a VNIC this counter is incremented. When a VNIC is
12112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* deleted, the extport corresponding to the VNIC's pref_pnic
12212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* is located and its num_devs_using is decremented. For VNICs,
12312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* num_devs_using is basically used to load-balance transmit
12412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* traffic from VNICs.
12512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	*/
12612e364b9f08aa335dc7716ce74113e834c993765Ken Cox
12712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct switch_info *swtch;
12812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct PciId pci_id;
12912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char name[MAX_NAME_SIZE_UISQUEUE];
13012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	union {
13112e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct vhba_wwnn wwnn;
13212e364b9f08aa335dc7716ce74113e834c993765Ken Cox		unsigned char macaddr[MAX_MACADDR_LEN];
13312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	};
13412e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
13512e364b9f08aa335dc7716ce74113e834c993765Ken Cox
13612e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct device_info {
1378504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	void __iomem *chanptr;
13812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 channelAddr;
13912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 channelBytes;
14090addb0218d47a886c846a22d75979fe5bf3471bBenjamin Romer	uuid_le channelTypeGuid;
14190addb0218d47a886c846a22d75979fe5bf3471bBenjamin Romer	uuid_le devInstGuid;
14212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct InterruptInfo intr;
14312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct switch_info *swtch;
14412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char devid[30];		/* "vbus<busno>:dev<devno>" */
145b06bdf7d5bd4f817b481674d69a63174279e6662Benjamin Romer	u16 polling;
14612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct semaphore interrupt_callback_lock;
147b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 busNo;
148b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 devNo;
14912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	int (*interrupt)(void *);
15012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *interrupt_context;
15112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *private_data;
15212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct list_head list_polling_device_channels;
15312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	unsigned long long moved_to_tail_cnt;
15412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	unsigned long long first_busy_cnt;
15512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	unsigned long long last_on_list_cnt;
15612e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
15712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
15812e364b9f08aa335dc7716ce74113e834c993765Ken Coxtypedef enum {
15912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	RECOVERY_LAN = 1,
16012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IB_LAN = 2
16112e364b9f08aa335dc7716ce74113e834c993765Ken Cox} SWITCH_TYPE;
16212e364b9f08aa335dc7716ce74113e834c993765Ken Cox
16312e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct bus_info {
164b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 busNo, deviceCount;
16512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct device_info **device;
16612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 guestHandle, recvBusInterruptHandle;
16790addb0218d47a886c846a22d75979fe5bf3471bBenjamin Romer	uuid_le busInstGuid;
1688504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	ULTRA_VBUS_CHANNEL_PROTOCOL __iomem *pBusChannel;
16912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	int busChannelBytes;
17012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct proc_dir_entry *proc_dir;	/* proc/uislib/vbus/<x> */
17112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct proc_dir_entry *proc_info;	/* proc/uislib/vbus/<x>/info */
17212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char name[25];
17312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char partitionName[99];
17412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct bus_info *next;
175c242233e5b578ef08362d98171c10519876d0d93Benjamin Romer	u8 localVnic;		/* 1 if local vnic created internally
17612e364b9f08aa335dc7716ce74113e834c993765Ken Cox				 * by IOVM; 0 otherwise... */
17712e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
17812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
17912e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define DEDICATED_SWITCH(pSwitch) ((pSwitch->extPortCount == 1) &&	\
18012e364b9f08aa335dc7716ce74113e834c993765Ken Cox				   (pSwitch->intPortCount == 1))
18112e364b9f08aa335dc7716ce74113e834c993765Ken Cox
18212e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct sn_list_entry {
18312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct uisscsi_dest pdest;	/* scsi bus, target, lun for
18412e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * phys disk */
185c242233e5b578ef08362d98171c10519876d0d93Benjamin Romer	u8 sernum[MAX_SERIAL_NUM];	/* serial num of physical
18612e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * disk.. The length is always
18712e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * MAX_SERIAL_NUM, padded with
18812e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * spaces */
18912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct sn_list_entry *next;
19012e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
19112e364b9f08aa335dc7716ce74113e834c993765Ken Cox
19212e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct networkPolicy {
193b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 promiscuous:1;
194b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 macassign:1;
195b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 peerforwarding:1;
196b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 nonotify:1;
197b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 standby:1;
198b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 callhome:2;
19912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char ip_addr[30];
20012e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
20112e364b9f08aa335dc7716ce74113e834c993765Ken Cox
20212e364b9f08aa335dc7716ce74113e834c993765Ken Cox/*
20312e364b9f08aa335dc7716ce74113e834c993765Ken Cox * IO messages sent to UisnicControlChanFunc & UissdControlChanFunc by
20412e364b9f08aa335dc7716ce74113e834c993765Ken Cox * code that processes the ControlVm channel messages.
20512e364b9f08aa335dc7716ce74113e834c993765Ken Cox */
20612e364b9f08aa335dc7716ce74113e834c993765Ken Cox
20712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
20812e364b9f08aa335dc7716ce74113e834c993765Ken Coxtypedef enum {
20912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_ADD_VNIC,
21012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_VNIC,
21112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_ALL_VNICS,
21212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_ADD_VHBA,
21312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_ADD_VDISK,
21412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_VHBA,
21512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_VDISK,
21612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_ALL_VDISKS_FOR_VHBA,
21712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_ALL_VHBAS,
21812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_ATTACH_PHBA,
21912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DETACH_PHBA,	/* 10 */
22012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_ATTACH_PNIC,
22112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DETACH_PNIC,
22212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DETACH_VHBA,
22312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DETACH_VNIC,
22412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_PAUSE_VDISK,
22512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_RESUME_VDISK,
22612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_ADD_DEVICE,	/* add generic device */
22712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_DEL_DEVICE,	/* del generic device */
22812e364b9f08aa335dc7716ce74113e834c993765Ken Cox} IOPART_MSG_TYPE;
22912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
23012e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct add_virt_iopart {
23112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *chanptr;		/* pointer to data channel */
23212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 guestHandle;	/* used to convert guest physical
23312e364b9f08aa335dc7716ce74113e834c993765Ken Cox				 * address to real physical address
23412e364b9f08aa335dc7716ce74113e834c993765Ken Cox				 * for DMA, for ex. */
23512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	U64 recvBusInterruptHandle;	/* used to register to receive
23612e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * bus level interrupts. */
23712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct InterruptInfo intr;	/* contains recv & send
23812e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * interrupt info */
23912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* recvInterruptHandle is used to register to receive
24012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* interrupts on the data channel. Used by GuestLinux/Windows
24112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* IO drivers to connect to interrupt.  sendInterruptHandle is
24212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* used by IOPart drivers as parameter to
24312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* Issue_VMCALL_IO_QUEUE_TRANSITION to interrupt thread in
24412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* guest linux/windows IO drivers when data channel queue for
24512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* vhba/vnic goes from EMPTY to NON-EMPTY. */
24612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct switch_info *swtch;	/* pointer to the virtual
24712e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * switch to which the vnic is
24812e364b9f08aa335dc7716ce74113e834c993765Ken Cox					 * connected */
24912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
250c242233e5b578ef08362d98171c10519876d0d93Benjamin Romer	u8 useG2GCopy;		/* Used to determine if a virtual HBA
25112e364b9f08aa335dc7716ce74113e834c993765Ken Cox				 * needs to use G2G copy. */
252c242233e5b578ef08362d98171c10519876d0d93Benjamin Romer	u8 Filler[7];
25312e364b9f08aa335dc7716ce74113e834c993765Ken Cox
254b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 busNo;
255b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 devNo;
25612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char *params;
25712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	ulong params_bytes;
25812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
25912e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
26012e364b9f08aa335dc7716ce74113e834c993765Ken Cox
26112e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct add_vdisk_iopart {
26212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *chanptr;		      /* pointer to data channel */
26312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	int implicit;
26412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct uisscsi_dest vdest;    /* scsi bus, target, lun for virt disk */
26512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct uisscsi_dest pdest;    /* scsi bus, target, lun for phys disk */
266c242233e5b578ef08362d98171c10519876d0d93Benjamin Romer	u8 sernum[MAX_SERIAL_NUM];    /* serial num of physical disk */
267b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 serlen;		      /* length of serial num */
268b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 busNo;
269b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 devNo;
27012e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
27112e364b9f08aa335dc7716ce74113e834c993765Ken Cox
27212e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct del_vdisk_iopart {
27312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *chanptr;		     /* pointer to data channel */
27412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct uisscsi_dest vdest;   /* scsi bus, target, lun for virt disk */
275b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 busNo;
276b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 devNo;
27712e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
27812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
27912e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct del_virt_iopart {
28012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *chanptr;		     /* pointer to data channel */
281b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 busNo;
282b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 devNo;
28312e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
28412e364b9f08aa335dc7716ce74113e834c993765Ken Cox
28512e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct det_virt_iopart {	     /* detach internal port */
28612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *chanptr;		     /* pointer to data channel */
28712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct switch_info *swtch;
28812e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
28912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
29012e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct paures_vdisk_iopart {
29112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	void *chanptr;		     /* pointer to data channel */
29212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct uisscsi_dest vdest;   /* scsi bus, target, lun for virt disk */
29312e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
29412e364b9f08aa335dc7716ce74113e834c993765Ken Cox
29512e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct add_switch_iopart {	     /* add switch */
29612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct switch_info *swtch;
29712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	char *params;
29812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	ulong params_bytes;
29912e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
30012e364b9f08aa335dc7716ce74113e834c993765Ken Cox
30112e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct del_switch_iopart {	     /* destroy switch */
30212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct switch_info *swtch;
30312e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
30412e364b9f08aa335dc7716ce74113e834c993765Ken Cox
30512e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct io_msgs {
30612e364b9f08aa335dc7716ce74113e834c993765Ken Cox
30712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	IOPART_MSG_TYPE msgtype;
30812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
30912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* additional params needed by some messages */
31012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	union {
31112e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_virt_iopart add_vhba;
31212e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_virt_iopart add_vnic;
31312e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_vdisk_iopart add_vdisk;
31412e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_virt_iopart del_vhba;
31512e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_virt_iopart del_vnic;
31612e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct det_virt_iopart det_vhba;
31712e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct det_virt_iopart det_vnic;
31812e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_vdisk_iopart del_vdisk;
31912e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_virt_iopart del_all_vdisks_for_vhba;
32012e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_virt_iopart add_device;
32112e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_virt_iopart del_device;
32212e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct det_virt_iopart det_intport;
32312e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_switch_iopart add_switch;
32412e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_switch_iopart del_switch;
32512e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct extport_info *extPort;	/* for attach or detach
32612e364b9f08aa335dc7716ce74113e834c993765Ken Cox						 * pnic/generic delete all
32712e364b9f08aa335dc7716ce74113e834c993765Ken Cox						 * vhbas/allvnics need no
32812e364b9f08aa335dc7716ce74113e834c993765Ken Cox						 * parameters */
32912e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct paures_vdisk_iopart paures_vdisk;
33012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	};
33112e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
33212e364b9f08aa335dc7716ce74113e834c993765Ken Cox
33312e364b9f08aa335dc7716ce74113e834c993765Ken Cox/*
33412e364b9f08aa335dc7716ce74113e834c993765Ken Cox* Guest messages sent to VirtControlChanFunc by code that processes
33512e364b9f08aa335dc7716ce74113e834c993765Ken Cox* the ControlVm channel messages.
33612e364b9f08aa335dc7716ce74113e834c993765Ken Cox*/
33712e364b9f08aa335dc7716ce74113e834c993765Ken Cox
33812e364b9f08aa335dc7716ce74113e834c993765Ken Coxtypedef enum {
33912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_ADD_VBUS,
34012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_ADD_VHBA,
34112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_ADD_VNIC,
34212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_DEL_VBUS,
34312e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_DEL_VHBA,
34412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_DEL_VNIC,
34512e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_DEL_ALL_VHBAS,
34612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_DEL_ALL_VNICS,
34712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_DEL_ALL_VBUSES,	/* deletes all vhbas & vnics on all
34812e364b9f08aa335dc7716ce74113e834c993765Ken Cox				 * buses and deletes all buses */
34912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_PAUSE_VHBA,
35012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_PAUSE_VNIC,
35112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_RESUME_VHBA,
35212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUEST_RESUME_VNIC
35312e364b9f08aa335dc7716ce74113e834c993765Ken Cox} GUESTPART_MSG_TYPE;
35412e364b9f08aa335dc7716ce74113e834c993765Ken Cox
35512e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct add_vbus_guestpart {
3568504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	void __iomem *chanptr;		/* pointer to data channel for bus -
3578504ff6cab9cc43591999e542e437445db5cfd92Ken Cox					 * NOT YET USED */
358b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 busNo;		/* bus number to be created/deleted */
359b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 deviceCount;	/* max num of devices on bus */
36090addb0218d47a886c846a22d75979fe5bf3471bBenjamin Romer	uuid_le busTypeGuid;	/* indicates type of bus */
36190addb0218d47a886c846a22d75979fe5bf3471bBenjamin Romer	uuid_le busInstGuid;	/* instance guid for device */
36212e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
36312e364b9f08aa335dc7716ce74113e834c993765Ken Cox
36412e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct del_vbus_guestpart {
365b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 busNo;		/* bus number to be deleted */
36612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* once we start using the bus's channel, add can dump busNo
36712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* into the channel header and then delete will need only one
36812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	* parameter, chanptr. */
36912e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
37012e364b9f08aa335dc7716ce74113e834c993765Ken Cox
37112e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct add_virt_guestpart {
3728504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	void __iomem *chanptr;		/* pointer to data channel */
373b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 busNo;		/* bus number for the operation */
374b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 deviceNo;		/* number of device on the bus */
37590addb0218d47a886c846a22d75979fe5bf3471bBenjamin Romer	uuid_le devInstGuid;	/* instance guid for device */
37612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct InterruptInfo intr;	/* recv/send interrupt info */
37712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* recvInterruptHandle contains info needed in order to
37812e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 * register to receive interrupts on the data channel.
37912e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 * sendInterruptHandle contains handle which is provided to
38012e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 * monitor VMCALL that will cause an interrupt to be generated
38112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 * for the other end.
38212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	 */
38312e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
38412e364b9f08aa335dc7716ce74113e834c993765Ken Cox
38512e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct pause_virt_guestpart {
3868504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	void __iomem *chanptr;		/* pointer to data channel */
38712e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
38812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
38912e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct resume_virt_guestpart {
3908504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	void __iomem *chanptr;		/* pointer to data channel */
39112e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
39212e364b9f08aa335dc7716ce74113e834c993765Ken Cox
39312e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct del_virt_guestpart {
3948504ff6cab9cc43591999e542e437445db5cfd92Ken Cox	void __iomem *chanptr;		/* pointer to data channel */
39512e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
39612e364b9f08aa335dc7716ce74113e834c993765Ken Cox
39712e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct init_chipset_guestpart {
398b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 busCount;		/* indicates the max number of busses */
399b3c55b13a1e458878e813c4fe2cccfa97c75f884Benjamin Romer	u32 switchCount;	/* indicates the max number of switches */
40012e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
40112e364b9f08aa335dc7716ce74113e834c993765Ken Cox
40212e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct guest_msgs {
40312e364b9f08aa335dc7716ce74113e834c993765Ken Cox
40412e364b9f08aa335dc7716ce74113e834c993765Ken Cox	GUESTPART_MSG_TYPE msgtype;
40512e364b9f08aa335dc7716ce74113e834c993765Ken Cox
40612e364b9f08aa335dc7716ce74113e834c993765Ken Cox	/* additional params needed by messages */
40712e364b9f08aa335dc7716ce74113e834c993765Ken Cox	union {
40812e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_vbus_guestpart add_vbus;
40912e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_virt_guestpart add_vhba;
41012e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct add_virt_guestpart add_vnic;
41112e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct pause_virt_guestpart pause_vhba;
41212e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct pause_virt_guestpart pause_vnic;
41312e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct resume_virt_guestpart resume_vhba;
41412e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct resume_virt_guestpart resume_vnic;
41512e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_vbus_guestpart del_vbus;
41612e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_virt_guestpart del_vhba;
41712e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_virt_guestpart del_vnic;
41812e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_vbus_guestpart del_all_vhbas;
41912e364b9f08aa335dc7716ce74113e834c993765Ken Cox		struct del_vbus_guestpart del_all_vnics;
42012e364b9f08aa335dc7716ce74113e834c993765Ken Cox		/* del_all_vbuses needs no parameters */
42112e364b9f08aa335dc7716ce74113e834c993765Ken Cox	};
42212e364b9f08aa335dc7716ce74113e834c993765Ken Cox	struct init_chipset_guestpart init_chipset;
42312e364b9f08aa335dc7716ce74113e834c993765Ken Cox
42412e364b9f08aa335dc7716ce74113e834c993765Ken Cox};
42512e364b9f08aa335dc7716ce74113e834c993765Ken Cox
42612e364b9f08aa335dc7716ce74113e834c993765Ken Cox#ifndef __xg
42712e364b9f08aa335dc7716ce74113e834c993765Ken Cox#define __xg(x) ((volatile long *)(x))
42812e364b9f08aa335dc7716ce74113e834c993765Ken Cox#endif
42912e364b9f08aa335dc7716ce74113e834c993765Ken Cox
43012e364b9f08aa335dc7716ce74113e834c993765Ken Cox/*
43112e364b9f08aa335dc7716ce74113e834c993765Ken Cox*  Below code is a copy of Linux kernel's cmpxchg function located at
43212e364b9f08aa335dc7716ce74113e834c993765Ken Cox*  this place
43312e364b9f08aa335dc7716ce74113e834c993765Ken Cox*  http://tcsxeon:8080/source/xref/00trunk-AppOS-linux/include/asm-x86/cmpxchg_64.h#84
43412e364b9f08aa335dc7716ce74113e834c993765Ken Cox*  Reason for creating our own version of cmpxchg along with
43512e364b9f08aa335dc7716ce74113e834c993765Ken Cox*  UISLIB_LOCK_PREFIX is to make the operation atomic even for non SMP
43612e364b9f08aa335dc7716ce74113e834c993765Ken Cox*  guests.
43712e364b9f08aa335dc7716ce74113e834c993765Ken Cox*/
43812e364b9f08aa335dc7716ce74113e834c993765Ken Cox
4398504ff6cab9cc43591999e542e437445db5cfd92Ken Cox#define uislibcmpxchg64(p, o, n, s) cmpxchg(p, o, n)
44012e364b9f08aa335dc7716ce74113e834c993765Ken Cox
44112e364b9f08aa335dc7716ce74113e834c993765Ken Cox#endif				/* __UISQUEUE_H__ */
442