uisqueue.h revision c242233e5b578ef08362d98171c10519876d0d93
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 11512e364b9f08aa335dc7716ce74113e834c993765Ken Cox 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>" */ 14512e364b9f08aa335dc7716ce74113e834c993765Ken Cox U16 polling; 14612e364b9f08aa335dc7716ce74113e834c993765Ken Cox struct semaphore interrupt_callback_lock; 14712e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 busNo; 14812e364b9f08aa335dc7716ce74113e834c993765Ken Cox 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 { 16412e364b9f08aa335dc7716ce74113e834c993765Ken Cox 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 { 19312e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 promiscuous:1; 19412e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 macassign:1; 19512e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 peerforwarding:1; 19612e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 nonotify:1; 19712e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 standby:1; 19812e364b9f08aa335dc7716ce74113e834c993765Ken Cox 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 25412e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 busNo; 25512e364b9f08aa335dc7716ce74113e834c993765Ken Cox 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 */ 26712e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 serlen; /* length of serial num */ 26812e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 busNo; 26912e364b9f08aa335dc7716ce74113e834c993765Ken Cox 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 */ 27512e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 busNo; 27612e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 devNo; 27712e364b9f08aa335dc7716ce74113e834c993765Ken Cox}; 27812e364b9f08aa335dc7716ce74113e834c993765Ken Cox 27912e364b9f08aa335dc7716ce74113e834c993765Ken Coxstruct del_virt_iopart { 28012e364b9f08aa335dc7716ce74113e834c993765Ken Cox void *chanptr; /* pointer to data channel */ 28112e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 busNo; 28212e364b9f08aa335dc7716ce74113e834c993765Ken Cox 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 */ 35812e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 busNo; /* bus number to be created/deleted */ 35912e364b9f08aa335dc7716ce74113e834c993765Ken Cox 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 { 36512e364b9f08aa335dc7716ce74113e834c993765Ken Cox 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 */ 37312e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 busNo; /* bus number for the operation */ 37412e364b9f08aa335dc7716ce74113e834c993765Ken Cox 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 { 39812e364b9f08aa335dc7716ce74113e834c993765Ken Cox U32 busCount; /* indicates the max number of busses */ 39912e364b9f08aa335dc7716ce74113e834c993765Ken Cox 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