diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /include/standard-headers | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip  | |
Diffstat (limited to 'include/standard-headers')
20 files changed, 3595 insertions, 0 deletions
diff --git a/include/standard-headers/asm-s390/kvm_virtio.h b/include/standard-headers/asm-s390/kvm_virtio.h new file mode 100644 index 00000000..daad3249 --- /dev/null +++ b/include/standard-headers/asm-s390/kvm_virtio.h @@ -0,0 +1,64 @@ +/* + * definition for virtio for kvm on s390 + * + * Copyright IBM Corp. 2008 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License (version 2 only) + * as published by the Free Software Foundation. + * + *    Author(s): Christian Borntraeger <borntraeger@de.ibm.com> + */ + +#ifndef __KVM_S390_VIRTIO_H +#define __KVM_S390_VIRTIO_H + +#include "standard-headers/linux/types.h" + +struct kvm_device_desc { +	/* The device type: console, network, disk etc.  Type 0 terminates. */ +	uint8_t type; +	/* The number of virtqueues (first in config array) */ +	uint8_t num_vq; +	/* +	 * The number of bytes of feature bits.  Multiply by 2: one for host +	 * features and one for guest acknowledgements. +	 */ +	uint8_t feature_len; +	/* The number of bytes of the config array after virtqueues. */ +	uint8_t config_len; +	/* A status byte, written by the Guest. */ +	uint8_t status; +	uint8_t config[0]; +}; + +/* + * This is how we expect the device configuration field for a virtqueue + * to be laid out in config space. + */ +struct kvm_vqconfig { +	/* The token returned with an interrupt. Set by the guest */ +	uint64_t token; +	/* The address of the virtio ring */ +	uint64_t address; +	/* The number of entries in the virtio_ring */ +	uint16_t num; + +}; + +#define KVM_S390_VIRTIO_NOTIFY		0 +#define KVM_S390_VIRTIO_RESET		1 +#define KVM_S390_VIRTIO_SET_STATUS	2 + +/* The alignment to use between consumer and producer parts of vring. + * This is pagesize for historical reasons. */ +#define KVM_S390_VIRTIO_RING_ALIGN	4096 + + +/* These values are supposed to be in ext_params on an interrupt */ +#define VIRTIO_PARAM_MASK		0xff +#define VIRTIO_PARAM_VRING_INTERRUPT	0x0 +#define VIRTIO_PARAM_CONFIG_CHANGED	0x1 +#define VIRTIO_PARAM_DEV_ADD		0x2 + +#endif diff --git a/include/standard-headers/asm-s390/virtio-ccw.h b/include/standard-headers/asm-s390/virtio-ccw.h new file mode 100644 index 00000000..a9a4ebf7 --- /dev/null +++ b/include/standard-headers/asm-s390/virtio-ccw.h @@ -0,0 +1,21 @@ +/* + * Definitions for virtio-ccw devices. + * + * Copyright IBM Corp. 2013 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License (version 2 only) + * as published by the Free Software Foundation. + * + *  Author(s): Cornelia Huck <cornelia.huck@de.ibm.com> + */ +#ifndef __KVM_VIRTIO_CCW_H +#define __KVM_VIRTIO_CCW_H + +/* Alignment of vring buffers. */ +#define KVM_VIRTIO_CCW_RING_ALIGN 4096 + +/* Subcode for diagnose 500 (virtio hypercall). */ +#define KVM_S390_VIRTIO_CCW_NOTIFY 3 + +#endif diff --git a/include/standard-headers/linux/if_ether.h b/include/standard-headers/linux/if_ether.h new file mode 100644 index 00000000..91cf735f --- /dev/null +++ b/include/standard-headers/linux/if_ether.h @@ -0,0 +1 @@ +#define ETH_ALEN    6 diff --git a/include/standard-headers/linux/input.h b/include/standard-headers/linux/input.h new file mode 100644 index 00000000..43f1850b --- /dev/null +++ b/include/standard-headers/linux/input.h @@ -0,0 +1,1203 @@ +/* + * Copyright (c) 1999-2002 Vojtech Pavlik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ +#ifndef _INPUT_H +#define _INPUT_H + + +#include <sys/time.h> +#include <sys/types.h> +#include "standard-headers/linux/types.h" + + +/* + * The event structure itself + */ + +struct input_event { +	struct timeval time; +	uint16_t type; +	uint16_t code; +	int32_t value; +}; + +/* + * Protocol version. + */ + +#define EV_VERSION		0x010001 + +/* + * IOCTLs (0x00 - 0x7f) + */ + +struct input_id { +	uint16_t bustype; +	uint16_t vendor; +	uint16_t product; +	uint16_t version; +}; + +/** + * struct input_absinfo - used by EVIOCGABS/EVIOCSABS ioctls + * @value: latest reported value for the axis. + * @minimum: specifies minimum value for the axis. + * @maximum: specifies maximum value for the axis. + * @fuzz: specifies fuzz value that is used to filter noise from + *	the event stream. + * @flat: values that are within this value will be discarded by + *	joydev interface and reported as 0 instead. + * @resolution: specifies resolution for the values reported for + *	the axis. + * + * Note that input core does not clamp reported values to the + * [minimum, maximum] limits, such task is left to userspace. + * + * Resolution for main axes (ABS_X, ABS_Y, ABS_Z) is reported in + * units per millimeter (units/mm), resolution for rotational axes + * (ABS_RX, ABS_RY, ABS_RZ) is reported in units per radian. + */ +struct input_absinfo { +	int32_t value; +	int32_t minimum; +	int32_t maximum; +	int32_t fuzz; +	int32_t flat; +	int32_t resolution; +}; + +/** + * struct input_keymap_entry - used by EVIOCGKEYCODE/EVIOCSKEYCODE ioctls + * @scancode: scancode represented in machine-endian form. + * @len: length of the scancode that resides in @scancode buffer. + * @index: index in the keymap, may be used instead of scancode + * @flags: allows to specify how kernel should handle the request. For + *	example, setting INPUT_KEYMAP_BY_INDEX flag indicates that kernel + *	should perform lookup in keymap by @index instead of @scancode + * @keycode: key code assigned to this scancode + * + * The structure is used to retrieve and modify keymap data. Users have + * option of performing lookup either by @scancode itself or by @index + * in keymap entry. EVIOCGKEYCODE will also return scancode or index + * (depending on which element was used to perform lookup). + */ +struct input_keymap_entry { +#define INPUT_KEYMAP_BY_INDEX	(1 << 0) +	uint8_t  flags; +	uint8_t  len; +	uint16_t index; +	uint32_t keycode; +	uint8_t  scancode[32]; +}; + +#define EVIOCGVERSION		_IOR('E', 0x01, int)			/* get driver version */ +#define EVIOCGID		_IOR('E', 0x02, struct input_id)	/* get device ID */ +#define EVIOCGREP		_IOR('E', 0x03, unsigned int[2])	/* get repeat settings */ +#define EVIOCSREP		_IOW('E', 0x03, unsigned int[2])	/* set repeat settings */ + +#define EVIOCGKEYCODE		_IOR('E', 0x04, unsigned int[2])        /* get keycode */ +#define EVIOCGKEYCODE_V2	_IOR('E', 0x04, struct input_keymap_entry) +#define EVIOCSKEYCODE		_IOW('E', 0x04, unsigned int[2])        /* set keycode */ +#define EVIOCSKEYCODE_V2	_IOW('E', 0x04, struct input_keymap_entry) + +#define EVIOCGNAME(len)		_IOC(_IOC_READ, 'E', 0x06, len)		/* get device name */ +#define EVIOCGPHYS(len)		_IOC(_IOC_READ, 'E', 0x07, len)		/* get physical location */ +#define EVIOCGUNIQ(len)		_IOC(_IOC_READ, 'E', 0x08, len)		/* get unique identifier */ +#define EVIOCGPROP(len)		_IOC(_IOC_READ, 'E', 0x09, len)		/* get device properties */ + +/** + * EVIOCGMTSLOTS(len) - get MT slot values + * @len: size of the data buffer in bytes + * + * The ioctl buffer argument should be binary equivalent to + * + * struct input_mt_request_layout { + *	uint32_t code; + *	int32_t values[num_slots]; + * }; + * + * where num_slots is the (arbitrary) number of MT slots to extract. + * + * The ioctl size argument (len) is the size of the buffer, which + * should satisfy len = (num_slots + 1) * sizeof(int32_t).  If len is + * too small to fit all available slots, the first num_slots are + * returned. + * + * Before the call, code is set to the wanted ABS_MT event type. On + * return, values[] is filled with the slot values for the specified + * ABS_MT code. + * + * If the request code is not an ABS_MT value, -EINVAL is returned. + */ +#define EVIOCGMTSLOTS(len)	_IOC(_IOC_READ, 'E', 0x0a, len) + +#define EVIOCGKEY(len)		_IOC(_IOC_READ, 'E', 0x18, len)		/* get global key state */ +#define EVIOCGLED(len)		_IOC(_IOC_READ, 'E', 0x19, len)		/* get all LEDs */ +#define EVIOCGSND(len)		_IOC(_IOC_READ, 'E', 0x1a, len)		/* get all sounds status */ +#define EVIOCGSW(len)		_IOC(_IOC_READ, 'E', 0x1b, len)		/* get all switch states */ + +#define EVIOCGBIT(ev,len)	_IOC(_IOC_READ, 'E', 0x20 + (ev), len)	/* get event bits */ +#define EVIOCGABS(abs)		_IOR('E', 0x40 + (abs), struct input_absinfo)	/* get abs value/limits */ +#define EVIOCSABS(abs)		_IOW('E', 0xc0 + (abs), struct input_absinfo)	/* set abs value/limits */ + +#define EVIOCSFF		_IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect))	/* send a force effect to a force feedback device */ +#define EVIOCRMFF		_IOW('E', 0x81, int)			/* Erase a force effect */ +#define EVIOCGEFFECTS		_IOR('E', 0x84, int)			/* Report number of effects playable at the same time */ + +#define EVIOCGRAB		_IOW('E', 0x90, int)			/* Grab/Release device */ +#define EVIOCREVOKE		_IOW('E', 0x91, int)			/* Revoke device access */ + +#define EVIOCSCLOCKID		_IOW('E', 0xa0, int)			/* Set clockid to be used for timestamps */ + +/* + * Device properties and quirks + */ + +#define INPUT_PROP_POINTER		0x00	/* needs a pointer */ +#define INPUT_PROP_DIRECT		0x01	/* direct input devices */ +#define INPUT_PROP_BUTTONPAD		0x02	/* has button(s) under pad */ +#define INPUT_PROP_SEMI_MT		0x03	/* touch rectangle only */ +#define INPUT_PROP_TOPBUTTONPAD		0x04	/* softbuttons at top of pad */ +#define INPUT_PROP_POINTING_STICK	0x05	/* is a pointing stick */ +#define INPUT_PROP_ACCELEROMETER	0x06	/* has accelerometer */ + +#define INPUT_PROP_MAX			0x1f +#define INPUT_PROP_CNT			(INPUT_PROP_MAX + 1) + +/* + * Event types + */ + +#define EV_SYN			0x00 +#define EV_KEY			0x01 +#define EV_REL			0x02 +#define EV_ABS			0x03 +#define EV_MSC			0x04 +#define EV_SW			0x05 +#define EV_LED			0x11 +#define EV_SND			0x12 +#define EV_REP			0x14 +#define EV_FF			0x15 +#define EV_PWR			0x16 +#define EV_FF_STATUS		0x17 +#define EV_MAX			0x1f +#define EV_CNT			(EV_MAX+1) + +/* + * Synchronization events. + */ + +#define SYN_REPORT		0 +#define SYN_CONFIG		1 +#define SYN_MT_REPORT		2 +#define SYN_DROPPED		3 +#define SYN_MAX			0xf +#define SYN_CNT			(SYN_MAX+1) + +/* + * Keys and buttons + * + * Most of the keys/buttons are modeled after USB HUT 1.12 + * (see http://www.usb.org/developers/hidpage). + * Abbreviations in the comments: + * AC - Application Control + * AL - Application Launch Button + * SC - System Control + */ + +#define KEY_RESERVED		0 +#define KEY_ESC			1 +#define KEY_1			2 +#define KEY_2			3 +#define KEY_3			4 +#define KEY_4			5 +#define KEY_5			6 +#define KEY_6			7 +#define KEY_7			8 +#define KEY_8			9 +#define KEY_9			10 +#define KEY_0			11 +#define KEY_MINUS		12 +#define KEY_EQUAL		13 +#define KEY_BACKSPACE		14 +#define KEY_TAB			15 +#define KEY_Q			16 +#define KEY_W			17 +#define KEY_E			18 +#define KEY_R			19 +#define KEY_T			20 +#define KEY_Y			21 +#define KEY_U			22 +#define KEY_I			23 +#define KEY_O			24 +#define KEY_P			25 +#define KEY_LEFTBRACE		26 +#define KEY_RIGHTBRACE		27 +#define KEY_ENTER		28 +#define KEY_LEFTCTRL		29 +#define KEY_A			30 +#define KEY_S			31 +#define KEY_D			32 +#define KEY_F			33 +#define KEY_G			34 +#define KEY_H			35 +#define KEY_J			36 +#define KEY_K			37 +#define KEY_L			38 +#define KEY_SEMICOLON		39 +#define KEY_APOSTROPHE		40 +#define KEY_GRAVE		41 +#define KEY_LEFTSHIFT		42 +#define KEY_BACKSLASH		43 +#define KEY_Z			44 +#define KEY_X			45 +#define KEY_C			46 +#define KEY_V			47 +#define KEY_B			48 +#define KEY_N			49 +#define KEY_M			50 +#define KEY_COMMA		51 +#define KEY_DOT			52 +#define KEY_SLASH		53 +#define KEY_RIGHTSHIFT		54 +#define KEY_KPASTERISK		55 +#define KEY_LEFTALT		56 +#define KEY_SPACE		57 +#define KEY_CAPSLOCK		58 +#define KEY_F1			59 +#define KEY_F2			60 +#define KEY_F3			61 +#define KEY_F4			62 +#define KEY_F5			63 +#define KEY_F6			64 +#define KEY_F7			65 +#define KEY_F8			66 +#define KEY_F9			67 +#define KEY_F10			68 +#define KEY_NUMLOCK		69 +#define KEY_SCROLLLOCK		70 +#define KEY_KP7			71 +#define KEY_KP8			72 +#define KEY_KP9			73 +#define KEY_KPMINUS		74 +#define KEY_KP4			75 +#define KEY_KP5			76 +#define KEY_KP6			77 +#define KEY_KPPLUS		78 +#define KEY_KP1			79 +#define KEY_KP2			80 +#define KEY_KP3			81 +#define KEY_KP0			82 +#define KEY_KPDOT		83 + +#define KEY_ZENKAKUHANKAKU	85 +#define KEY_102ND		86 +#define KEY_F11			87 +#define KEY_F12			88 +#define KEY_RO			89 +#define KEY_KATAKANA		90 +#define KEY_HIRAGANA		91 +#define KEY_HENKAN		92 +#define KEY_KATAKANAHIRAGANA	93 +#define KEY_MUHENKAN		94 +#define KEY_KPJPCOMMA		95 +#define KEY_KPENTER		96 +#define KEY_RIGHTCTRL		97 +#define KEY_KPSLASH		98 +#define KEY_SYSRQ		99 +#define KEY_RIGHTALT		100 +#define KEY_LINEFEED		101 +#define KEY_HOME		102 +#define KEY_UP			103 +#define KEY_PAGEUP		104 +#define KEY_LEFT		105 +#define KEY_RIGHT		106 +#define KEY_END			107 +#define KEY_DOWN		108 +#define KEY_PAGEDOWN		109 +#define KEY_INSERT		110 +#define KEY_DELETE		111 +#define KEY_MACRO		112 +#define KEY_MUTE		113 +#define KEY_VOLUMEDOWN		114 +#define KEY_VOLUMEUP		115 +#define KEY_POWER		116	/* SC System Power Down */ +#define KEY_KPEQUAL		117 +#define KEY_KPPLUSMINUS		118 +#define KEY_PAUSE		119 +#define KEY_SCALE		120	/* AL Compiz Scale (Expose) */ + +#define KEY_KPCOMMA		121 +#define KEY_HANGEUL		122 +#define KEY_HANGUEL		KEY_HANGEUL +#define KEY_HANJA		123 +#define KEY_YEN			124 +#define KEY_LEFTMETA		125 +#define KEY_RIGHTMETA		126 +#define KEY_COMPOSE		127 + +#define KEY_STOP		128	/* AC Stop */ +#define KEY_AGAIN		129 +#define KEY_PROPS		130	/* AC Properties */ +#define KEY_UNDO		131	/* AC Undo */ +#define KEY_FRONT		132 +#define KEY_COPY		133	/* AC Copy */ +#define KEY_OPEN		134	/* AC Open */ +#define KEY_PASTE		135	/* AC Paste */ +#define KEY_FIND		136	/* AC Search */ +#define KEY_CUT			137	/* AC Cut */ +#define KEY_HELP		138	/* AL Integrated Help Center */ +#define KEY_MENU		139	/* Menu (show menu) */ +#define KEY_CALC		140	/* AL Calculator */ +#define KEY_SETUP		141 +#define KEY_SLEEP		142	/* SC System Sleep */ +#define KEY_WAKEUP		143	/* System Wake Up */ +#define KEY_FILE		144	/* AL Local Machine Browser */ +#define KEY_SENDFILE		145 +#define KEY_DELETEFILE		146 +#define KEY_XFER		147 +#define KEY_PROG1		148 +#define KEY_PROG2		149 +#define KEY_WWW			150	/* AL Internet Browser */ +#define KEY_MSDOS		151 +#define KEY_COFFEE		152	/* AL Terminal Lock/Screensaver */ +#define KEY_SCREENLOCK		KEY_COFFEE +#define KEY_ROTATE_DISPLAY	153	/* Display orientation for e.g. tablets */ +#define KEY_DIRECTION		KEY_ROTATE_DISPLAY +#define KEY_CYCLEWINDOWS	154 +#define KEY_MAIL		155 +#define KEY_BOOKMARKS		156	/* AC Bookmarks */ +#define KEY_COMPUTER		157 +#define KEY_BACK		158	/* AC Back */ +#define KEY_FORWARD		159	/* AC Forward */ +#define KEY_CLOSECD		160 +#define KEY_EJECTCD		161 +#define KEY_EJECTCLOSECD	162 +#define KEY_NEXTSONG		163 +#define KEY_PLAYPAUSE		164 +#define KEY_PREVIOUSSONG	165 +#define KEY_STOPCD		166 +#define KEY_RECORD		167 +#define KEY_REWIND		168 +#define KEY_PHONE		169	/* Media Select Telephone */ +#define KEY_ISO			170 +#define KEY_CONFIG		171	/* AL Consumer Control Configuration */ +#define KEY_HOMEPAGE		172	/* AC Home */ +#define KEY_REFRESH		173	/* AC Refresh */ +#define KEY_EXIT		174	/* AC Exit */ +#define KEY_MOVE		175 +#define KEY_EDIT		176 +#define KEY_SCROLLUP		177 +#define KEY_SCROLLDOWN		178 +#define KEY_KPLEFTPAREN		179 +#define KEY_KPRIGHTPAREN	180 +#define KEY_NEW			181	/* AC New */ +#define KEY_REDO		182	/* AC Redo/Repeat */ + +#define KEY_F13			183 +#define KEY_F14			184 +#define KEY_F15			185 +#define KEY_F16			186 +#define KEY_F17			187 +#define KEY_F18			188 +#define KEY_F19			189 +#define KEY_F20			190 +#define KEY_F21			191 +#define KEY_F22			192 +#define KEY_F23			193 +#define KEY_F24			194 + +#define KEY_PLAYCD		200 +#define KEY_PAUSECD		201 +#define KEY_PROG3		202 +#define KEY_PROG4		203 +#define KEY_DASHBOARD		204	/* AL Dashboard */ +#define KEY_SUSPEND		205 +#define KEY_CLOSE		206	/* AC Close */ +#define KEY_PLAY		207 +#define KEY_FASTFORWARD		208 +#define KEY_BASSBOOST		209 +#define KEY_PRINT		210	/* AC Print */ +#define KEY_HP			211 +#define KEY_CAMERA		212 +#define KEY_SOUND		213 +#define KEY_QUESTION		214 +#define KEY_EMAIL		215 +#define KEY_CHAT		216 +#define KEY_SEARCH		217 +#define KEY_CONNECT		218 +#define KEY_FINANCE		219	/* AL Checkbook/Finance */ +#define KEY_SPORT		220 +#define KEY_SHOP		221 +#define KEY_ALTERASE		222 +#define KEY_CANCEL		223	/* AC Cancel */ +#define KEY_BRIGHTNESSDOWN	224 +#define KEY_BRIGHTNESSUP	225 +#define KEY_MEDIA		226 + +#define KEY_SWITCHVIDEOMODE	227	/* Cycle between available video +					   outputs (Monitor/LCD/TV-out/etc) */ +#define KEY_KBDILLUMTOGGLE	228 +#define KEY_KBDILLUMDOWN	229 +#define KEY_KBDILLUMUP		230 + +#define KEY_SEND		231	/* AC Send */ +#define KEY_REPLY		232	/* AC Reply */ +#define KEY_FORWARDMAIL		233	/* AC Forward Msg */ +#define KEY_SAVE		234	/* AC Save */ +#define KEY_DOCUMENTS		235 + +#define KEY_BATTERY		236 + +#define KEY_BLUETOOTH		237 +#define KEY_WLAN		238 +#define KEY_UWB			239 + +#define KEY_UNKNOWN		240 + +#define KEY_VIDEO_NEXT		241	/* drive next video source */ +#define KEY_VIDEO_PREV		242	/* drive previous video source */ +#define KEY_BRIGHTNESS_CYCLE	243	/* brightness up, after max is min */ +#define KEY_BRIGHTNESS_AUTO	244	/* Set Auto Brightness: manual +					  brightness control is off, +					  rely on ambient */ +#define KEY_BRIGHTNESS_ZERO	KEY_BRIGHTNESS_AUTO +#define KEY_DISPLAY_OFF		245	/* display device to off state */ + +#define KEY_WWAN		246	/* Wireless WAN (LTE, UMTS, GSM, etc.) */ +#define KEY_WIMAX		KEY_WWAN +#define KEY_RFKILL		247	/* Key that controls all radios */ + +#define KEY_MICMUTE		248	/* Mute / unmute the microphone */ + +/* Code 255 is reserved for special needs of AT keyboard driver */ + +#define BTN_MISC		0x100 +#define BTN_0			0x100 +#define BTN_1			0x101 +#define BTN_2			0x102 +#define BTN_3			0x103 +#define BTN_4			0x104 +#define BTN_5			0x105 +#define BTN_6			0x106 +#define BTN_7			0x107 +#define BTN_8			0x108 +#define BTN_9			0x109 + +#define BTN_MOUSE		0x110 +#define BTN_LEFT		0x110 +#define BTN_RIGHT		0x111 +#define BTN_MIDDLE		0x112 +#define BTN_SIDE		0x113 +#define BTN_EXTRA		0x114 +#define BTN_FORWARD		0x115 +#define BTN_BACK		0x116 +#define BTN_TASK		0x117 + +#define BTN_JOYSTICK		0x120 +#define BTN_TRIGGER		0x120 +#define BTN_THUMB		0x121 +#define BTN_THUMB2		0x122 +#define BTN_TOP			0x123 +#define BTN_TOP2		0x124 +#define BTN_PINKIE		0x125 +#define BTN_BASE		0x126 +#define BTN_BASE2		0x127 +#define BTN_BASE3		0x128 +#define BTN_BASE4		0x129 +#define BTN_BASE5		0x12a +#define BTN_BASE6		0x12b +#define BTN_DEAD		0x12f + +#define BTN_GAMEPAD		0x130 +#define BTN_SOUTH		0x130 +#define BTN_A			BTN_SOUTH +#define BTN_EAST		0x131 +#define BTN_B			BTN_EAST +#define BTN_C			0x132 +#define BTN_NORTH		0x133 +#define BTN_X			BTN_NORTH +#define BTN_WEST		0x134 +#define BTN_Y			BTN_WEST +#define BTN_Z			0x135 +#define BTN_TL			0x136 +#define BTN_TR			0x137 +#define BTN_TL2			0x138 +#define BTN_TR2			0x139 +#define BTN_SELECT		0x13a +#define BTN_START		0x13b +#define BTN_MODE		0x13c +#define BTN_THUMBL		0x13d +#define BTN_THUMBR		0x13e + +#define BTN_DIGI		0x140 +#define BTN_TOOL_PEN		0x140 +#define BTN_TOOL_RUBBER		0x141 +#define BTN_TOOL_BRUSH		0x142 +#define BTN_TOOL_PENCIL		0x143 +#define BTN_TOOL_AIRBRUSH	0x144 +#define BTN_TOOL_FINGER		0x145 +#define BTN_TOOL_MOUSE		0x146 +#define BTN_TOOL_LENS		0x147 +#define BTN_TOOL_QUINTTAP	0x148	/* Five fingers on trackpad */ +#define BTN_TOUCH		0x14a +#define BTN_STYLUS		0x14b +#define BTN_STYLUS2		0x14c +#define BTN_TOOL_DOUBLETAP	0x14d +#define BTN_TOOL_TRIPLETAP	0x14e +#define BTN_TOOL_QUADTAP	0x14f	/* Four fingers on trackpad */ + +#define BTN_WHEEL		0x150 +#define BTN_GEAR_DOWN		0x150 +#define BTN_GEAR_UP		0x151 + +#define KEY_OK			0x160 +#define KEY_SELECT		0x161 +#define KEY_GOTO		0x162 +#define KEY_CLEAR		0x163 +#define KEY_POWER2		0x164 +#define KEY_OPTION		0x165 +#define KEY_INFO		0x166	/* AL OEM Features/Tips/Tutorial */ +#define KEY_TIME		0x167 +#define KEY_VENDOR		0x168 +#define KEY_ARCHIVE		0x169 +#define KEY_PROGRAM		0x16a	/* Media Select Program Guide */ +#define KEY_CHANNEL		0x16b +#define KEY_FAVORITES		0x16c +#define KEY_EPG			0x16d +#define KEY_PVR			0x16e	/* Media Select Home */ +#define KEY_MHP			0x16f +#define KEY_LANGUAGE		0x170 +#define KEY_TITLE		0x171 +#define KEY_SUBTITLE		0x172 +#define KEY_ANGLE		0x173 +#define KEY_ZOOM		0x174 +#define KEY_MODE		0x175 +#define KEY_KEYBOARD		0x176 +#define KEY_SCREEN		0x177 +#define KEY_PC			0x178	/* Media Select Computer */ +#define KEY_TV			0x179	/* Media Select TV */ +#define KEY_TV2			0x17a	/* Media Select Cable */ +#define KEY_VCR			0x17b	/* Media Select VCR */ +#define KEY_VCR2		0x17c	/* VCR Plus */ +#define KEY_SAT			0x17d	/* Media Select Satellite */ +#define KEY_SAT2		0x17e +#define KEY_CD			0x17f	/* Media Select CD */ +#define KEY_TAPE		0x180	/* Media Select Tape */ +#define KEY_RADIO		0x181 +#define KEY_TUNER		0x182	/* Media Select Tuner */ +#define KEY_PLAYER		0x183 +#define KEY_TEXT		0x184 +#define KEY_DVD			0x185	/* Media Select DVD */ +#define KEY_AUX			0x186 +#define KEY_MP3			0x187 +#define KEY_AUDIO		0x188	/* AL Audio Browser */ +#define KEY_VIDEO		0x189	/* AL Movie Browser */ +#define KEY_DIRECTORY		0x18a +#define KEY_LIST		0x18b +#define KEY_MEMO		0x18c	/* Media Select Messages */ +#define KEY_CALENDAR		0x18d +#define KEY_RED			0x18e +#define KEY_GREEN		0x18f +#define KEY_YELLOW		0x190 +#define KEY_BLUE		0x191 +#define KEY_CHANNELUP		0x192	/* Channel Increment */ +#define KEY_CHANNELDOWN		0x193	/* Channel Decrement */ +#define KEY_FIRST		0x194 +#define KEY_LAST		0x195	/* Recall Last */ +#define KEY_AB			0x196 +#define KEY_NEXT		0x197 +#define KEY_RESTART		0x198 +#define KEY_SLOW		0x199 +#define KEY_SHUFFLE		0x19a +#define KEY_BREAK		0x19b +#define KEY_PREVIOUS		0x19c +#define KEY_DIGITS		0x19d +#define KEY_TEEN		0x19e +#define KEY_TWEN		0x19f +#define KEY_VIDEOPHONE		0x1a0	/* Media Select Video Phone */ +#define KEY_GAMES		0x1a1	/* Media Select Games */ +#define KEY_ZOOMIN		0x1a2	/* AC Zoom In */ +#define KEY_ZOOMOUT		0x1a3	/* AC Zoom Out */ +#define KEY_ZOOMRESET		0x1a4	/* AC Zoom */ +#define KEY_WORDPROCESSOR	0x1a5	/* AL Word Processor */ +#define KEY_EDITOR		0x1a6	/* AL Text Editor */ +#define KEY_SPREADSHEET		0x1a7	/* AL Spreadsheet */ +#define KEY_GRAPHICSEDITOR	0x1a8	/* AL Graphics Editor */ +#define KEY_PRESENTATION	0x1a9	/* AL Presentation App */ +#define KEY_DATABASE		0x1aa	/* AL Database App */ +#define KEY_NEWS		0x1ab	/* AL Newsreader */ +#define KEY_VOICEMAIL		0x1ac	/* AL Voicemail */ +#define KEY_ADDRESSBOOK		0x1ad	/* AL Contacts/Address Book */ +#define KEY_MESSENGER		0x1ae	/* AL Instant Messaging */ +#define KEY_DISPLAYTOGGLE	0x1af	/* Turn display (LCD) on and off */ +#define KEY_BRIGHTNESS_TOGGLE	KEY_DISPLAYTOGGLE +#define KEY_SPELLCHECK		0x1b0   /* AL Spell Check */ +#define KEY_LOGOFF		0x1b1   /* AL Logoff */ + +#define KEY_DOLLAR		0x1b2 +#define KEY_EURO		0x1b3 + +#define KEY_FRAMEBACK		0x1b4	/* Consumer - transport controls */ +#define KEY_FRAMEFORWARD	0x1b5 +#define KEY_CONTEXT_MENU	0x1b6	/* GenDesc - system context menu */ +#define KEY_MEDIA_REPEAT	0x1b7	/* Consumer - transport control */ +#define KEY_10CHANNELSUP	0x1b8	/* 10 channels up (10+) */ +#define KEY_10CHANNELSDOWN	0x1b9	/* 10 channels down (10-) */ +#define KEY_IMAGES		0x1ba	/* AL Image Browser */ + +#define KEY_DEL_EOL		0x1c0 +#define KEY_DEL_EOS		0x1c1 +#define KEY_INS_LINE		0x1c2 +#define KEY_DEL_LINE		0x1c3 + +#define KEY_FN			0x1d0 +#define KEY_FN_ESC		0x1d1 +#define KEY_FN_F1		0x1d2 +#define KEY_FN_F2		0x1d3 +#define KEY_FN_F3		0x1d4 +#define KEY_FN_F4		0x1d5 +#define KEY_FN_F5		0x1d6 +#define KEY_FN_F6		0x1d7 +#define KEY_FN_F7		0x1d8 +#define KEY_FN_F8		0x1d9 +#define KEY_FN_F9		0x1da +#define KEY_FN_F10		0x1db +#define KEY_FN_F11		0x1dc +#define KEY_FN_F12		0x1dd +#define KEY_FN_1		0x1de +#define KEY_FN_2		0x1df +#define KEY_FN_D		0x1e0 +#define KEY_FN_E		0x1e1 +#define KEY_FN_F		0x1e2 +#define KEY_FN_S		0x1e3 +#define KEY_FN_B		0x1e4 + +#define KEY_BRL_DOT1		0x1f1 +#define KEY_BRL_DOT2		0x1f2 +#define KEY_BRL_DOT3		0x1f3 +#define KEY_BRL_DOT4		0x1f4 +#define KEY_BRL_DOT5		0x1f5 +#define KEY_BRL_DOT6		0x1f6 +#define KEY_BRL_DOT7		0x1f7 +#define KEY_BRL_DOT8		0x1f8 +#define KEY_BRL_DOT9		0x1f9 +#define KEY_BRL_DOT10		0x1fa + +#define KEY_NUMERIC_0		0x200	/* used by phones, remote controls, */ +#define KEY_NUMERIC_1		0x201	/* and other keypads */ +#define KEY_NUMERIC_2		0x202 +#define KEY_NUMERIC_3		0x203 +#define KEY_NUMERIC_4		0x204 +#define KEY_NUMERIC_5		0x205 +#define KEY_NUMERIC_6		0x206 +#define KEY_NUMERIC_7		0x207 +#define KEY_NUMERIC_8		0x208 +#define KEY_NUMERIC_9		0x209 +#define KEY_NUMERIC_STAR	0x20a +#define KEY_NUMERIC_POUND	0x20b +#define KEY_NUMERIC_A		0x20c	/* Phone key A - HUT Telephony 0xb9 */ +#define KEY_NUMERIC_B		0x20d +#define KEY_NUMERIC_C		0x20e +#define KEY_NUMERIC_D		0x20f + +#define KEY_CAMERA_FOCUS	0x210 +#define KEY_WPS_BUTTON		0x211	/* WiFi Protected Setup key */ + +#define KEY_TOUCHPAD_TOGGLE	0x212	/* Request switch touchpad on or off */ +#define KEY_TOUCHPAD_ON		0x213 +#define KEY_TOUCHPAD_OFF	0x214 + +#define KEY_CAMERA_ZOOMIN	0x215 +#define KEY_CAMERA_ZOOMOUT	0x216 +#define KEY_CAMERA_UP		0x217 +#define KEY_CAMERA_DOWN		0x218 +#define KEY_CAMERA_LEFT		0x219 +#define KEY_CAMERA_RIGHT	0x21a + +#define KEY_ATTENDANT_ON	0x21b +#define KEY_ATTENDANT_OFF	0x21c +#define KEY_ATTENDANT_TOGGLE	0x21d	/* Attendant call on or off */ +#define KEY_LIGHTS_TOGGLE	0x21e	/* Reading light on or off */ + +#define BTN_DPAD_UP		0x220 +#define BTN_DPAD_DOWN		0x221 +#define BTN_DPAD_LEFT		0x222 +#define BTN_DPAD_RIGHT		0x223 + +#define KEY_ALS_TOGGLE		0x230	/* Ambient light sensor */ + +#define KEY_BUTTONCONFIG		0x240	/* AL Button Configuration */ +#define KEY_TASKMANAGER		0x241	/* AL Task/Project Manager */ +#define KEY_JOURNAL		0x242	/* AL Log/Journal/Timecard */ +#define KEY_CONTROLPANEL		0x243	/* AL Control Panel */ +#define KEY_APPSELECT		0x244	/* AL Select Task/Application */ +#define KEY_SCREENSAVER		0x245	/* AL Screen Saver */ +#define KEY_VOICECOMMAND		0x246	/* Listening Voice Command */ + +#define KEY_BRIGHTNESS_MIN		0x250	/* Set Brightness to Minimum */ +#define KEY_BRIGHTNESS_MAX		0x251	/* Set Brightness to Maximum */ + +#define KEY_KBDINPUTASSIST_PREV		0x260 +#define KEY_KBDINPUTASSIST_NEXT		0x261 +#define KEY_KBDINPUTASSIST_PREVGROUP		0x262 +#define KEY_KBDINPUTASSIST_NEXTGROUP		0x263 +#define KEY_KBDINPUTASSIST_ACCEPT		0x264 +#define KEY_KBDINPUTASSIST_CANCEL		0x265 + +#define BTN_TRIGGER_HAPPY		0x2c0 +#define BTN_TRIGGER_HAPPY1		0x2c0 +#define BTN_TRIGGER_HAPPY2		0x2c1 +#define BTN_TRIGGER_HAPPY3		0x2c2 +#define BTN_TRIGGER_HAPPY4		0x2c3 +#define BTN_TRIGGER_HAPPY5		0x2c4 +#define BTN_TRIGGER_HAPPY6		0x2c5 +#define BTN_TRIGGER_HAPPY7		0x2c6 +#define BTN_TRIGGER_HAPPY8		0x2c7 +#define BTN_TRIGGER_HAPPY9		0x2c8 +#define BTN_TRIGGER_HAPPY10		0x2c9 +#define BTN_TRIGGER_HAPPY11		0x2ca +#define BTN_TRIGGER_HAPPY12		0x2cb +#define BTN_TRIGGER_HAPPY13		0x2cc +#define BTN_TRIGGER_HAPPY14		0x2cd +#define BTN_TRIGGER_HAPPY15		0x2ce +#define BTN_TRIGGER_HAPPY16		0x2cf +#define BTN_TRIGGER_HAPPY17		0x2d0 +#define BTN_TRIGGER_HAPPY18		0x2d1 +#define BTN_TRIGGER_HAPPY19		0x2d2 +#define BTN_TRIGGER_HAPPY20		0x2d3 +#define BTN_TRIGGER_HAPPY21		0x2d4 +#define BTN_TRIGGER_HAPPY22		0x2d5 +#define BTN_TRIGGER_HAPPY23		0x2d6 +#define BTN_TRIGGER_HAPPY24		0x2d7 +#define BTN_TRIGGER_HAPPY25		0x2d8 +#define BTN_TRIGGER_HAPPY26		0x2d9 +#define BTN_TRIGGER_HAPPY27		0x2da +#define BTN_TRIGGER_HAPPY28		0x2db +#define BTN_TRIGGER_HAPPY29		0x2dc +#define BTN_TRIGGER_HAPPY30		0x2dd +#define BTN_TRIGGER_HAPPY31		0x2de +#define BTN_TRIGGER_HAPPY32		0x2df +#define BTN_TRIGGER_HAPPY33		0x2e0 +#define BTN_TRIGGER_HAPPY34		0x2e1 +#define BTN_TRIGGER_HAPPY35		0x2e2 +#define BTN_TRIGGER_HAPPY36		0x2e3 +#define BTN_TRIGGER_HAPPY37		0x2e4 +#define BTN_TRIGGER_HAPPY38		0x2e5 +#define BTN_TRIGGER_HAPPY39		0x2e6 +#define BTN_TRIGGER_HAPPY40		0x2e7 + +/* We avoid low common keys in module aliases so they don't get huge. */ +#define KEY_MIN_INTERESTING	KEY_MUTE +#define KEY_MAX			0x2ff +#define KEY_CNT			(KEY_MAX+1) + +/* + * Relative axes + */ + +#define REL_X			0x00 +#define REL_Y			0x01 +#define REL_Z			0x02 +#define REL_RX			0x03 +#define REL_RY			0x04 +#define REL_RZ			0x05 +#define REL_HWHEEL		0x06 +#define REL_DIAL		0x07 +#define REL_WHEEL		0x08 +#define REL_MISC		0x09 +#define REL_MAX			0x0f +#define REL_CNT			(REL_MAX+1) + +/* + * Absolute axes + */ + +#define ABS_X			0x00 +#define ABS_Y			0x01 +#define ABS_Z			0x02 +#define ABS_RX			0x03 +#define ABS_RY			0x04 +#define ABS_RZ			0x05 +#define ABS_THROTTLE		0x06 +#define ABS_RUDDER		0x07 +#define ABS_WHEEL		0x08 +#define ABS_GAS			0x09 +#define ABS_BRAKE		0x0a +#define ABS_HAT0X		0x10 +#define ABS_HAT0Y		0x11 +#define ABS_HAT1X		0x12 +#define ABS_HAT1Y		0x13 +#define ABS_HAT2X		0x14 +#define ABS_HAT2Y		0x15 +#define ABS_HAT3X		0x16 +#define ABS_HAT3Y		0x17 +#define ABS_PRESSURE		0x18 +#define ABS_DISTANCE		0x19 +#define ABS_TILT_X		0x1a +#define ABS_TILT_Y		0x1b +#define ABS_TOOL_WIDTH		0x1c + +#define ABS_VOLUME		0x20 + +#define ABS_MISC		0x28 + +#define ABS_MT_SLOT		0x2f	/* MT slot being modified */ +#define ABS_MT_TOUCH_MAJOR	0x30	/* Major axis of touching ellipse */ +#define ABS_MT_TOUCH_MINOR	0x31	/* Minor axis (omit if circular) */ +#define ABS_MT_WIDTH_MAJOR	0x32	/* Major axis of approaching ellipse */ +#define ABS_MT_WIDTH_MINOR	0x33	/* Minor axis (omit if circular) */ +#define ABS_MT_ORIENTATION	0x34	/* Ellipse orientation */ +#define ABS_MT_POSITION_X	0x35	/* Center X touch position */ +#define ABS_MT_POSITION_Y	0x36	/* Center Y touch position */ +#define ABS_MT_TOOL_TYPE	0x37	/* Type of touching device */ +#define ABS_MT_BLOB_ID		0x38	/* Group a set of packets as a blob */ +#define ABS_MT_TRACKING_ID	0x39	/* Unique ID of initiated contact */ +#define ABS_MT_PRESSURE		0x3a	/* Pressure on contact area */ +#define ABS_MT_DISTANCE		0x3b	/* Contact hover distance */ +#define ABS_MT_TOOL_X		0x3c	/* Center X tool position */ +#define ABS_MT_TOOL_Y		0x3d	/* Center Y tool position */ + + +#define ABS_MAX			0x3f +#define ABS_CNT			(ABS_MAX+1) + +/* + * Switch events + */ + +#define SW_LID			0x00  /* set = lid shut */ +#define SW_TABLET_MODE		0x01  /* set = tablet mode */ +#define SW_HEADPHONE_INSERT	0x02  /* set = inserted */ +#define SW_RFKILL_ALL		0x03  /* rfkill master switch, type "any" +					 set = radio enabled */ +#define SW_RADIO		SW_RFKILL_ALL	/* deprecated */ +#define SW_MICROPHONE_INSERT	0x04  /* set = inserted */ +#define SW_DOCK			0x05  /* set = plugged into dock */ +#define SW_LINEOUT_INSERT	0x06  /* set = inserted */ +#define SW_JACK_PHYSICAL_INSERT 0x07  /* set = mechanical switch set */ +#define SW_VIDEOOUT_INSERT	0x08  /* set = inserted */ +#define SW_CAMERA_LENS_COVER	0x09  /* set = lens covered */ +#define SW_KEYPAD_SLIDE		0x0a  /* set = keypad slide out */ +#define SW_FRONT_PROXIMITY	0x0b  /* set = front proximity sensor active */ +#define SW_ROTATE_LOCK		0x0c  /* set = rotate locked/disabled */ +#define SW_LINEIN_INSERT	0x0d  /* set = inserted */ +#define SW_MUTE_DEVICE		0x0e  /* set = device disabled */ +#define SW_MAX_			0x0f +#define SW_CNT			(SW_MAX_+1) + +/* + * Misc events + */ + +#define MSC_SERIAL		0x00 +#define MSC_PULSELED		0x01 +#define MSC_GESTURE		0x02 +#define MSC_RAW			0x03 +#define MSC_SCAN		0x04 +#define MSC_TIMESTAMP		0x05 +#define MSC_MAX			0x07 +#define MSC_CNT			(MSC_MAX+1) + +/* + * LEDs + */ + +#define LED_NUML		0x00 +#define LED_CAPSL		0x01 +#define LED_SCROLLL		0x02 +#define LED_COMPOSE		0x03 +#define LED_KANA		0x04 +#define LED_SLEEP		0x05 +#define LED_SUSPEND		0x06 +#define LED_MUTE		0x07 +#define LED_MISC		0x08 +#define LED_MAIL		0x09 +#define LED_CHARGING		0x0a +#define LED_MAX			0x0f +#define LED_CNT			(LED_MAX+1) + +/* + * Autorepeat values + */ + +#define REP_DELAY		0x00 +#define REP_PERIOD		0x01 +#define REP_MAX			0x01 +#define REP_CNT			(REP_MAX+1) + +/* + * Sounds + */ + +#define SND_CLICK		0x00 +#define SND_BELL		0x01 +#define SND_TONE		0x02 +#define SND_MAX			0x07 +#define SND_CNT			(SND_MAX+1) + +/* + * IDs. + */ + +#define ID_BUS			0 +#define ID_VENDOR		1 +#define ID_PRODUCT		2 +#define ID_VERSION		3 + +#define BUS_PCI			0x01 +#define BUS_ISAPNP		0x02 +#define BUS_USB			0x03 +#define BUS_HIL			0x04 +#define BUS_BLUETOOTH		0x05 +#define BUS_VIRTUAL		0x06 + +#define BUS_ISA			0x10 +#define BUS_I8042		0x11 +#define BUS_XTKBD		0x12 +#define BUS_RS232		0x13 +#define BUS_GAMEPORT		0x14 +#define BUS_PARPORT		0x15 +#define BUS_AMIGA		0x16 +#define BUS_ADB			0x17 +#define BUS_I2C			0x18 +#define BUS_HOST		0x19 +#define BUS_GSC			0x1A +#define BUS_ATARI		0x1B +#define BUS_SPI			0x1C + +/* + * MT_TOOL types + */ +#define MT_TOOL_FINGER		0 +#define MT_TOOL_PEN		1 +#define MT_TOOL_PALM		2 +#define MT_TOOL_MAX		2 + +/* + * Values describing the status of a force-feedback effect + */ +#define FF_STATUS_STOPPED	0x00 +#define FF_STATUS_PLAYING	0x01 +#define FF_STATUS_MAX		0x01 + +/* + * Structures used in ioctls to upload effects to a device + * They are pieces of a bigger structure (called ff_effect) + */ + +/* + * All duration values are expressed in ms. Values above 32767 ms (0x7fff) + * should not be used and have unspecified results. + */ + +/** + * struct ff_replay - defines scheduling of the force-feedback effect + * @length: duration of the effect + * @delay: delay before effect should start playing + */ +struct ff_replay { +	uint16_t length; +	uint16_t delay; +}; + +/** + * struct ff_trigger - defines what triggers the force-feedback effect + * @button: number of the button triggering the effect + * @interval: controls how soon the effect can be re-triggered + */ +struct ff_trigger { +	uint16_t button; +	uint16_t interval; +}; + +/** + * struct ff_envelope - generic force-feedback effect envelope + * @attack_length: duration of the attack (ms) + * @attack_level: level at the beginning of the attack + * @fade_length: duration of fade (ms) + * @fade_level: level at the end of fade + * + * The @attack_level and @fade_level are absolute values; when applying + * envelope force-feedback core will convert to positive/negative + * value based on polarity of the default level of the effect. + * Valid range for the attack and fade levels is 0x0000 - 0x7fff + */ +struct ff_envelope { +	uint16_t attack_length; +	uint16_t attack_level; +	uint16_t fade_length; +	uint16_t fade_level; +}; + +/** + * struct ff_constant_effect - defines parameters of a constant force-feedback effect + * @level: strength of the effect; may be negative + * @envelope: envelope data + */ +struct ff_constant_effect { +	int16_t level; +	struct ff_envelope envelope; +}; + +/** + * struct ff_ramp_effect - defines parameters of a ramp force-feedback effect + * @start_level: beginning strength of the effect; may be negative + * @end_level: final strength of the effect; may be negative + * @envelope: envelope data + */ +struct ff_ramp_effect { +	int16_t start_level; +	int16_t end_level; +	struct ff_envelope envelope; +}; + +/** + * struct ff_condition_effect - defines a spring or friction force-feedback effect + * @right_saturation: maximum level when joystick moved all way to the right + * @left_saturation: same for the left side + * @right_coeff: controls how fast the force grows when the joystick moves + *	to the right + * @left_coeff: same for the left side + * @deadband: size of the dead zone, where no force is produced + * @center: position of the dead zone + */ +struct ff_condition_effect { +	uint16_t right_saturation; +	uint16_t left_saturation; + +	int16_t right_coeff; +	int16_t left_coeff; + +	uint16_t deadband; +	int16_t center; +}; + +/** + * struct ff_periodic_effect - defines parameters of a periodic force-feedback effect + * @waveform: kind of the effect (wave) + * @period: period of the wave (ms) + * @magnitude: peak value + * @offset: mean value of the wave (roughly) + * @phase: 'horizontal' shift + * @envelope: envelope data + * @custom_len: number of samples (FF_CUSTOM only) + * @custom_data: buffer of samples (FF_CUSTOM only) + * + * Known waveforms - FF_SQUARE, FF_TRIANGLE, FF_SINE, FF_SAW_UP, + * FF_SAW_DOWN, FF_CUSTOM. The exact syntax FF_CUSTOM is undefined + * for the time being as no driver supports it yet. + * + * Note: the data pointed by custom_data is copied by the driver. + * You can therefore dispose of the memory after the upload/update. + */ +struct ff_periodic_effect { +	uint16_t waveform; +	uint16_t period; +	int16_t magnitude; +	int16_t offset; +	uint16_t phase; + +	struct ff_envelope envelope; + +	uint32_t custom_len; +	int16_t *custom_data; +}; + +/** + * struct ff_rumble_effect - defines parameters of a periodic force-feedback effect + * @strong_magnitude: magnitude of the heavy motor + * @weak_magnitude: magnitude of the light one + * + * Some rumble pads have two motors of different weight. Strong_magnitude + * represents the magnitude of the vibration generated by the heavy one. + */ +struct ff_rumble_effect { +	uint16_t strong_magnitude; +	uint16_t weak_magnitude; +}; + +/** + * struct ff_effect - defines force feedback effect + * @type: type of the effect (FF_CONSTANT, FF_PERIODIC, FF_RAMP, FF_SPRING, + *	FF_FRICTION, FF_DAMPER, FF_RUMBLE, FF_INERTIA, or FF_CUSTOM) + * @id: an unique id assigned to an effect + * @direction: direction of the effect + * @trigger: trigger conditions (struct ff_trigger) + * @replay: scheduling of the effect (struct ff_replay) + * @u: effect-specific structure (one of ff_constant_effect, ff_ramp_effect, + *	ff_periodic_effect, ff_condition_effect, ff_rumble_effect) further + *	defining effect parameters + * + * This structure is sent through ioctl from the application to the driver. + * To create a new effect application should set its @id to -1; the kernel + * will return assigned @id which can later be used to update or delete + * this effect. + * + * Direction of the effect is encoded as follows: + *	0 deg -> 0x0000 (down) + *	90 deg -> 0x4000 (left) + *	180 deg -> 0x8000 (up) + *	270 deg -> 0xC000 (right) + */ +struct ff_effect { +	uint16_t type; +	int16_t id; +	uint16_t direction; +	struct ff_trigger trigger; +	struct ff_replay replay; + +	union { +		struct ff_constant_effect constant; +		struct ff_ramp_effect ramp; +		struct ff_periodic_effect periodic; +		struct ff_condition_effect condition[2]; /* One for each axis */ +		struct ff_rumble_effect rumble; +	} u; +}; + +/* + * Force feedback effect types + */ + +#define FF_RUMBLE	0x50 +#define FF_PERIODIC	0x51 +#define FF_CONSTANT	0x52 +#define FF_SPRING	0x53 +#define FF_FRICTION	0x54 +#define FF_DAMPER	0x55 +#define FF_INERTIA	0x56 +#define FF_RAMP		0x57 + +#define FF_EFFECT_MIN	FF_RUMBLE +#define FF_EFFECT_MAX	FF_RAMP + +/* + * Force feedback periodic effect types + */ + +#define FF_SQUARE	0x58 +#define FF_TRIANGLE	0x59 +#define FF_SINE		0x5a +#define FF_SAW_UP	0x5b +#define FF_SAW_DOWN	0x5c +#define FF_CUSTOM	0x5d + +#define FF_WAVEFORM_MIN	FF_SQUARE +#define FF_WAVEFORM_MAX	FF_CUSTOM + +/* + * Set ff device properties + */ + +#define FF_GAIN		0x60 +#define FF_AUTOCENTER	0x61 + +#define FF_MAX		0x7f +#define FF_CNT		(FF_MAX+1) + +#endif /* _INPUT_H */ diff --git a/include/standard-headers/linux/pci_regs.h b/include/standard-headers/linux/pci_regs.h new file mode 100644 index 00000000..57e8c80c --- /dev/null +++ b/include/standard-headers/linux/pci_regs.h @@ -0,0 +1,719 @@ +/* + *	pci_regs.h + * + *	PCI standard defines + *	Copyright 1994, Drew Eckhardt + *	Copyright 1997--1999 Martin Mares <mj@ucw.cz> + * + *	For more information, please consult the following manuals (look at + *	http://www.pcisig.com/ for how to get them): + * + *	PCI BIOS Specification + *	PCI Local Bus Specification + *	PCI to PCI Bridge Specification + *	PCI System Design Guide + * + * 	For hypertransport information, please consult the following manuals + * 	from http://www.hypertransport.org + * + *	The Hypertransport I/O Link Specification + */ + +#ifndef LINUX_PCI_REGS_H +#define LINUX_PCI_REGS_H + +/* + * Under PCI, each device has 256 bytes of configuration address space, + * of which the first 64 bytes are standardized as follows: + */ +#define PCI_VENDOR_ID		0x00	/* 16 bits */ +#define PCI_DEVICE_ID		0x02	/* 16 bits */ +#define PCI_COMMAND		0x04	/* 16 bits */ +#define  PCI_COMMAND_IO		0x1	/* Enable response in I/O space */ +#define  PCI_COMMAND_MEMORY	0x2	/* Enable response in Memory space */ +#define  PCI_COMMAND_MASTER	0x4	/* Enable bus mastering */ +#define  PCI_COMMAND_SPECIAL	0x8	/* Enable response to special cycles */ +#define  PCI_COMMAND_INVALIDATE	0x10	/* Use memory write and invalidate */ +#define  PCI_COMMAND_VGA_PALETTE 0x20	/* Enable palette snooping */ +#define  PCI_COMMAND_PARITY	0x40	/* Enable parity checking */ +#define  PCI_COMMAND_WAIT 	0x80	/* Enable address/data stepping */ +#define  PCI_COMMAND_SERR	0x100	/* Enable SERR */ +#define  PCI_COMMAND_FAST_BACK	0x200	/* Enable back-to-back writes */ +#define  PCI_COMMAND_INTX_DISABLE 0x400 /* INTx Emulation Disable */ + +#define PCI_STATUS		0x06	/* 16 bits */ +#define  PCI_STATUS_INTERRUPT	0x08	/* Interrupt status */ +#define  PCI_STATUS_CAP_LIST	0x10	/* Support Capability List */ +#define  PCI_STATUS_66MHZ	0x20	/* Support 66 Mhz PCI 2.1 bus */ +#define  PCI_STATUS_UDF		0x40	/* Support User Definable Features [obsolete] */ +#define  PCI_STATUS_FAST_BACK	0x80	/* Accept fast-back to back */ +#define  PCI_STATUS_PARITY	0x100	/* Detected parity error */ +#define  PCI_STATUS_DEVSEL_MASK	0x600	/* DEVSEL timing */ +#define  PCI_STATUS_DEVSEL_FAST		0x000 +#define  PCI_STATUS_DEVSEL_MEDIUM	0x200 +#define  PCI_STATUS_DEVSEL_SLOW		0x400 +#define  PCI_STATUS_SIG_TARGET_ABORT	0x800 /* Set on target abort */ +#define  PCI_STATUS_REC_TARGET_ABORT	0x1000 /* Master ack of " */ +#define  PCI_STATUS_REC_MASTER_ABORT	0x2000 /* Set on master abort */ +#define  PCI_STATUS_SIG_SYSTEM_ERROR	0x4000 /* Set when we drive SERR */ +#define  PCI_STATUS_DETECTED_PARITY	0x8000 /* Set on parity error */ + +#define PCI_CLASS_REVISION	0x08	/* High 24 bits are class, low 8 revision */ +#define PCI_REVISION_ID		0x08	/* Revision ID */ +#define PCI_CLASS_PROG		0x09	/* Reg. Level Programming Interface */ +#define PCI_CLASS_DEVICE	0x0a	/* Device class */ + +#define PCI_CACHE_LINE_SIZE	0x0c	/* 8 bits */ +#define PCI_LATENCY_TIMER	0x0d	/* 8 bits */ +#define PCI_HEADER_TYPE		0x0e	/* 8 bits */ +#define  PCI_HEADER_TYPE_NORMAL		0 +#define  PCI_HEADER_TYPE_BRIDGE		1 +#define  PCI_HEADER_TYPE_CARDBUS	2 + +#define PCI_BIST		0x0f	/* 8 bits */ +#define  PCI_BIST_CODE_MASK	0x0f	/* Return result */ +#define  PCI_BIST_START		0x40	/* 1 to start BIST, 2 secs or less */ +#define  PCI_BIST_CAPABLE	0x80	/* 1 if BIST capable */ + +/* + * Base addresses specify locations in memory or I/O space. + * Decoded size can be determined by writing a value of + * 0xffffffff to the register, and reading it back.  Only + * 1 bits are decoded. + */ +#define PCI_BASE_ADDRESS_0	0x10	/* 32 bits */ +#define PCI_BASE_ADDRESS_1	0x14	/* 32 bits [htype 0,1 only] */ +#define PCI_BASE_ADDRESS_2	0x18	/* 32 bits [htype 0 only] */ +#define PCI_BASE_ADDRESS_3	0x1c	/* 32 bits */ +#define PCI_BASE_ADDRESS_4	0x20	/* 32 bits */ +#define PCI_BASE_ADDRESS_5	0x24	/* 32 bits */ +#define  PCI_BASE_ADDRESS_SPACE		0x01	/* 0 = memory, 1 = I/O */ +#define  PCI_BASE_ADDRESS_SPACE_IO	0x01 +#define  PCI_BASE_ADDRESS_SPACE_MEMORY	0x00 +#define  PCI_BASE_ADDRESS_MEM_TYPE_MASK	0x06 +#define  PCI_BASE_ADDRESS_MEM_TYPE_32	0x00	/* 32 bit address */ +#define  PCI_BASE_ADDRESS_MEM_TYPE_1M	0x02	/* Below 1M [obsolete] */ +#define  PCI_BASE_ADDRESS_MEM_TYPE_64	0x04	/* 64 bit address */ +#define  PCI_BASE_ADDRESS_MEM_PREFETCH	0x08	/* prefetchable? */ +#define  PCI_BASE_ADDRESS_MEM_MASK	(~0x0fUL) +#define  PCI_BASE_ADDRESS_IO_MASK	(~0x03UL) +/* bit 1 is reserved if address_space = 1 */ + +/* Header type 0 (normal devices) */ +#define PCI_CARDBUS_CIS		0x28 +#define PCI_SUBSYSTEM_VENDOR_ID	0x2c +#define PCI_SUBSYSTEM_ID	0x2e +#define PCI_ROM_ADDRESS		0x30	/* Bits 31..11 are address, 10..1 reserved */ +#define  PCI_ROM_ADDRESS_ENABLE	0x01 +#define PCI_ROM_ADDRESS_MASK	(~0x7ffUL) + +#define PCI_CAPABILITY_LIST	0x34	/* Offset of first capability list entry */ + +/* 0x35-0x3b are reserved */ +#define PCI_INTERRUPT_LINE	0x3c	/* 8 bits */ +#define PCI_INTERRUPT_PIN	0x3d	/* 8 bits */ +#define PCI_MIN_GNT		0x3e	/* 8 bits */ +#define PCI_MAX_LAT		0x3f	/* 8 bits */ + +/* Header type 1 (PCI-to-PCI bridges) */ +#define PCI_PRIMARY_BUS		0x18	/* Primary bus number */ +#define PCI_SECONDARY_BUS	0x19	/* Secondary bus number */ +#define PCI_SUBORDINATE_BUS	0x1a	/* Highest bus number behind the bridge */ +#define PCI_SEC_LATENCY_TIMER	0x1b	/* Latency timer for secondary interface */ +#define PCI_IO_BASE		0x1c	/* I/O range behind the bridge */ +#define PCI_IO_LIMIT		0x1d +#define  PCI_IO_RANGE_TYPE_MASK	0x0fUL	/* I/O bridging type */ +#define  PCI_IO_RANGE_TYPE_16	0x00 +#define  PCI_IO_RANGE_TYPE_32	0x01 +#define  PCI_IO_RANGE_MASK	(~0x0fUL) +#define PCI_SEC_STATUS		0x1e	/* Secondary status register, only bit 14 used */ +#define PCI_MEMORY_BASE		0x20	/* Memory range behind */ +#define PCI_MEMORY_LIMIT	0x22 +#define  PCI_MEMORY_RANGE_TYPE_MASK 0x0fUL +#define  PCI_MEMORY_RANGE_MASK	(~0x0fUL) +#define PCI_PREF_MEMORY_BASE	0x24	/* Prefetchable memory range behind */ +#define PCI_PREF_MEMORY_LIMIT	0x26 +#define  PCI_PREF_RANGE_TYPE_MASK 0x0fUL +#define  PCI_PREF_RANGE_TYPE_32	0x00 +#define  PCI_PREF_RANGE_TYPE_64	0x01 +#define  PCI_PREF_RANGE_MASK	(~0x0fUL) +#define PCI_PREF_BASE_UPPER32	0x28	/* Upper half of prefetchable memory range */ +#define PCI_PREF_LIMIT_UPPER32	0x2c +#define PCI_IO_BASE_UPPER16	0x30	/* Upper half of I/O addresses */ +#define PCI_IO_LIMIT_UPPER16	0x32 +/* 0x34 same as for htype 0 */ +/* 0x35-0x3b is reserved */ +#define PCI_ROM_ADDRESS1	0x38	/* Same as PCI_ROM_ADDRESS, but for htype 1 */ +/* 0x3c-0x3d are same as for htype 0 */ +#define PCI_BRIDGE_CONTROL	0x3e +#define  PCI_BRIDGE_CTL_PARITY	0x01	/* Enable parity detection on secondary interface */ +#define  PCI_BRIDGE_CTL_SERR	0x02	/* The same for SERR forwarding */ +#define  PCI_BRIDGE_CTL_ISA	0x04	/* Enable ISA mode */ +#define  PCI_BRIDGE_CTL_VGA	0x08	/* Forward VGA addresses */ +#define  PCI_BRIDGE_CTL_MASTER_ABORT	0x20  /* Report master aborts */ +#define  PCI_BRIDGE_CTL_BUS_RESET	0x40	/* Secondary bus reset */ +#define  PCI_BRIDGE_CTL_FAST_BACK	0x80	/* Fast Back2Back enabled on secondary interface */ + +/* Header type 2 (CardBus bridges) */ +#define PCI_CB_CAPABILITY_LIST	0x14 +/* 0x15 reserved */ +#define PCI_CB_SEC_STATUS	0x16	/* Secondary status */ +#define PCI_CB_PRIMARY_BUS	0x18	/* PCI bus number */ +#define PCI_CB_CARD_BUS		0x19	/* CardBus bus number */ +#define PCI_CB_SUBORDINATE_BUS	0x1a	/* Subordinate bus number */ +#define PCI_CB_LATENCY_TIMER	0x1b	/* CardBus latency timer */ +#define PCI_CB_MEMORY_BASE_0	0x1c +#define PCI_CB_MEMORY_LIMIT_0	0x20 +#define PCI_CB_MEMORY_BASE_1	0x24 +#define PCI_CB_MEMORY_LIMIT_1	0x28 +#define PCI_CB_IO_BASE_0	0x2c +#define PCI_CB_IO_BASE_0_HI	0x2e +#define PCI_CB_IO_LIMIT_0	0x30 +#define PCI_CB_IO_LIMIT_0_HI	0x32 +#define PCI_CB_IO_BASE_1	0x34 +#define PCI_CB_IO_BASE_1_HI	0x36 +#define PCI_CB_IO_LIMIT_1	0x38 +#define PCI_CB_IO_LIMIT_1_HI	0x3a +#define  PCI_CB_IO_RANGE_MASK	(~0x03UL) +/* 0x3c-0x3d are same as for htype 0 */ +#define PCI_CB_BRIDGE_CONTROL	0x3e +#define  PCI_CB_BRIDGE_CTL_PARITY	0x01	/* Similar to standard bridge control register */ +#define  PCI_CB_BRIDGE_CTL_SERR		0x02 +#define  PCI_CB_BRIDGE_CTL_ISA		0x04 +#define  PCI_CB_BRIDGE_CTL_VGA		0x08 +#define  PCI_CB_BRIDGE_CTL_MASTER_ABORT	0x20 +#define  PCI_CB_BRIDGE_CTL_CB_RESET	0x40	/* CardBus reset */ +#define  PCI_CB_BRIDGE_CTL_16BIT_INT	0x80	/* Enable interrupt for 16-bit cards */ +#define  PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 0x100	/* Prefetch enable for both memory regions */ +#define  PCI_CB_BRIDGE_CTL_PREFETCH_MEM1 0x200 +#define  PCI_CB_BRIDGE_CTL_POST_WRITES	0x400 +#define PCI_CB_SUBSYSTEM_VENDOR_ID	0x40 +#define PCI_CB_SUBSYSTEM_ID		0x42 +#define PCI_CB_LEGACY_MODE_BASE		0x44	/* 16-bit PC Card legacy mode base address (ExCa) */ +/* 0x48-0x7f reserved */ + +/* Capability lists */ + +#define PCI_CAP_LIST_ID		0	/* Capability ID */ +#define  PCI_CAP_ID_PM		0x01	/* Power Management */ +#define  PCI_CAP_ID_AGP		0x02	/* Accelerated Graphics Port */ +#define  PCI_CAP_ID_VPD		0x03	/* Vital Product Data */ +#define  PCI_CAP_ID_SLOTID	0x04	/* Slot Identification */ +#define  PCI_CAP_ID_MSI		0x05	/* Message Signalled Interrupts */ +#define  PCI_CAP_ID_CHSWP	0x06	/* CompactPCI HotSwap */ +#define  PCI_CAP_ID_PCIX	0x07	/* PCI-X */ +#define  PCI_CAP_ID_HT		0x08	/* HyperTransport */ +#define  PCI_CAP_ID_VNDR	0x09	/* Vendor specific */ +#define  PCI_CAP_ID_DBG		0x0A	/* Debug port */ +#define  PCI_CAP_ID_CCRC	0x0B	/* CompactPCI Central Resource Control */ +#define  PCI_CAP_ID_SHPC 	0x0C	/* PCI Standard Hot-Plug Controller */ +#define  PCI_CAP_ID_SSVID	0x0D	/* Bridge subsystem vendor/device ID */ +#define  PCI_CAP_ID_AGP3	0x0E	/* AGP Target PCI-PCI bridge */ +#define  PCI_CAP_ID_EXP 	0x10	/* PCI Express */ +#define  PCI_CAP_ID_MSIX	0x11	/* MSI-X */ +#define  PCI_CAP_ID_SATA	0x12	/* Serial ATA */ +#define  PCI_CAP_ID_AF		0x13	/* PCI Advanced Features */ +#define PCI_CAP_LIST_NEXT	1	/* Next capability in the list */ +#define PCI_CAP_FLAGS		2	/* Capability defined flags (16 bits) */ +#define PCI_CAP_SIZEOF		4 + +/* Power Management Registers */ + +#define PCI_PM_PMC		2	/* PM Capabilities Register */ +#define  PCI_PM_CAP_VER_MASK	0x0007	/* Version */ +#define  PCI_PM_CAP_PME_CLOCK	0x0008	/* PME clock required */ +#define  PCI_PM_CAP_RESERVED    0x0010  /* Reserved field */ +#define  PCI_PM_CAP_DSI		0x0020	/* Device specific initialization */ +#define  PCI_PM_CAP_AUX_POWER	0x01C0	/* Auxiliary power support mask */ +#define  PCI_PM_CAP_D1		0x0200	/* D1 power state support */ +#define  PCI_PM_CAP_D2		0x0400	/* D2 power state support */ +#define  PCI_PM_CAP_PME		0x0800	/* PME pin supported */ +#define  PCI_PM_CAP_PME_MASK	0xF800	/* PME Mask of all supported states */ +#define  PCI_PM_CAP_PME_D0	0x0800	/* PME# from D0 */ +#define  PCI_PM_CAP_PME_D1	0x1000	/* PME# from D1 */ +#define  PCI_PM_CAP_PME_D2	0x2000	/* PME# from D2 */ +#define  PCI_PM_CAP_PME_D3	0x4000	/* PME# from D3 (hot) */ +#define  PCI_PM_CAP_PME_D3cold	0x8000	/* PME# from D3 (cold) */ +#define  PCI_PM_CAP_PME_SHIFT	11	/* Start of the PME Mask in PMC */ +#define PCI_PM_CTRL		4	/* PM control and status register */ +#define  PCI_PM_CTRL_STATE_MASK	0x0003	/* Current power state (D0 to D3) */ +#define  PCI_PM_CTRL_NO_SOFT_RESET	0x0008	/* No reset for D3hot->D0 */ +#define  PCI_PM_CTRL_PME_ENABLE	0x0100	/* PME pin enable */ +#define  PCI_PM_CTRL_DATA_SEL_MASK	0x1e00	/* Data select (??) */ +#define  PCI_PM_CTRL_DATA_SCALE_MASK	0x6000	/* Data scale (??) */ +#define  PCI_PM_CTRL_PME_STATUS	0x8000	/* PME pin status */ +#define PCI_PM_PPB_EXTENSIONS	6	/* PPB support extensions (??) */ +#define  PCI_PM_PPB_B2_B3	0x40	/* Stop clock when in D3hot (??) */ +#define  PCI_PM_BPCC_ENABLE	0x80	/* Bus power/clock control enable (??) */ +#define PCI_PM_DATA_REGISTER	7	/* (??) */ +#define PCI_PM_SIZEOF		8 + +/* AGP registers */ + +#define PCI_AGP_VERSION		2	/* BCD version number */ +#define PCI_AGP_RFU		3	/* Rest of capability flags */ +#define PCI_AGP_STATUS		4	/* Status register */ +#define  PCI_AGP_STATUS_RQ_MASK	0xff000000	/* Maximum number of requests - 1 */ +#define  PCI_AGP_STATUS_SBA	0x0200	/* Sideband addressing supported */ +#define  PCI_AGP_STATUS_64BIT	0x0020	/* 64-bit addressing supported */ +#define  PCI_AGP_STATUS_FW	0x0010	/* FW transfers supported */ +#define  PCI_AGP_STATUS_RATE4	0x0004	/* 4x transfer rate supported */ +#define  PCI_AGP_STATUS_RATE2	0x0002	/* 2x transfer rate supported */ +#define  PCI_AGP_STATUS_RATE1	0x0001	/* 1x transfer rate supported */ +#define PCI_AGP_COMMAND		8	/* Control register */ +#define  PCI_AGP_COMMAND_RQ_MASK 0xff000000  /* Master: Maximum number of requests */ +#define  PCI_AGP_COMMAND_SBA	0x0200	/* Sideband addressing enabled */ +#define  PCI_AGP_COMMAND_AGP	0x0100	/* Allow processing of AGP transactions */ +#define  PCI_AGP_COMMAND_64BIT	0x0020 	/* Allow processing of 64-bit addresses */ +#define  PCI_AGP_COMMAND_FW	0x0010 	/* Force FW transfers */ +#define  PCI_AGP_COMMAND_RATE4	0x0004	/* Use 4x rate */ +#define  PCI_AGP_COMMAND_RATE2	0x0002	/* Use 2x rate */ +#define  PCI_AGP_COMMAND_RATE1	0x0001	/* Use 1x rate */ +#define PCI_AGP_SIZEOF		12 + +/* Vital Product Data */ + +#define PCI_VPD_ADDR		2	/* Address to access (15 bits!) */ +#define  PCI_VPD_ADDR_MASK	0x7fff	/* Address mask */ +#define  PCI_VPD_ADDR_F		0x8000	/* Write 0, 1 indicates completion */ +#define PCI_VPD_DATA		4	/* 32-bits of data returned here */ + +/* Slot Identification */ + +#define PCI_SID_ESR		2	/* Expansion Slot Register */ +#define  PCI_SID_ESR_NSLOTS	0x1f	/* Number of expansion slots available */ +#define  PCI_SID_ESR_FIC	0x20	/* First In Chassis Flag */ +#define PCI_SID_CHASSIS_NR	3	/* Chassis Number */ + +/* Message Signalled Interrupts registers */ + +#define PCI_MSI_FLAGS		2	/* Various flags */ +#define  PCI_MSI_FLAGS_64BIT	0x80	/* 64-bit addresses allowed */ +#define  PCI_MSI_FLAGS_QSIZE	0x70	/* Message queue size configured */ +#define  PCI_MSI_FLAGS_QMASK	0x0e	/* Maximum queue size available */ +#define  PCI_MSI_FLAGS_ENABLE	0x01	/* MSI feature enabled */ +#define  PCI_MSI_FLAGS_MASKBIT	0x100	/* 64-bit mask bits allowed */ +#define PCI_MSI_RFU		3	/* Rest of capability flags */ +#define PCI_MSI_ADDRESS_LO	4	/* Lower 32 bits */ +#define PCI_MSI_ADDRESS_HI	8	/* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */ +#define PCI_MSI_DATA_32		8	/* 16 bits of data for 32-bit devices */ +#define PCI_MSI_MASK_32		12	/* Mask bits register for 32-bit devices */ +#define PCI_MSI_PENDING_32	16	/* Pending bits register for 32-bit devices */ +#define PCI_MSI_DATA_64		12	/* 16 bits of data for 64-bit devices */ +#define PCI_MSI_MASK_64		16	/* Mask bits register for 64-bit devices */ +#define PCI_MSI_PENDING_64	20	/* Pending bits register for 32-bit devices */ + +/* MSI-X registers */ +#define PCI_MSIX_FLAGS		2 +#define  PCI_MSIX_FLAGS_QSIZE	0x7FF +#define  PCI_MSIX_FLAGS_ENABLE	(1 << 15) +#define  PCI_MSIX_FLAGS_MASKALL	(1 << 14) +#define PCI_MSIX_TABLE		4 +#define PCI_MSIX_PBA		8 +#define  PCI_MSIX_FLAGS_BIRMASK	(7 << 0) + +/* MSI-X entry's format */ +#define PCI_MSIX_ENTRY_SIZE		16 +#define  PCI_MSIX_ENTRY_LOWER_ADDR	0 +#define  PCI_MSIX_ENTRY_UPPER_ADDR	4 +#define  PCI_MSIX_ENTRY_DATA		8 +#define  PCI_MSIX_ENTRY_VECTOR_CTRL	12 +#define   PCI_MSIX_ENTRY_CTRL_MASKBIT	1 + +/* CompactPCI Hotswap Register */ + +#define PCI_CHSWP_CSR		2	/* Control and Status Register */ +#define  PCI_CHSWP_DHA		0x01	/* Device Hiding Arm */ +#define  PCI_CHSWP_EIM		0x02	/* ENUM# Signal Mask */ +#define  PCI_CHSWP_PIE		0x04	/* Pending Insert or Extract */ +#define  PCI_CHSWP_LOO		0x08	/* LED On / Off */ +#define  PCI_CHSWP_PI		0x30	/* Programming Interface */ +#define  PCI_CHSWP_EXT		0x40	/* ENUM# status - extraction */ +#define  PCI_CHSWP_INS		0x80	/* ENUM# status - insertion */ + +/* PCI Advanced Feature registers */ + +#define PCI_AF_LENGTH		2 +#define PCI_AF_CAP		3 +#define  PCI_AF_CAP_TP		0x01 +#define  PCI_AF_CAP_FLR		0x02 +#define PCI_AF_CTRL		4 +#define  PCI_AF_CTRL_FLR	0x01 +#define PCI_AF_STATUS		5 +#define  PCI_AF_STATUS_TP	0x01 + +/* PCI-X registers */ + +#define PCI_X_CMD		2	/* Modes & Features */ +#define  PCI_X_CMD_DPERR_E	0x0001	/* Data Parity Error Recovery Enable */ +#define  PCI_X_CMD_ERO		0x0002	/* Enable Relaxed Ordering */ +#define  PCI_X_CMD_READ_512	0x0000	/* 512 byte maximum read byte count */ +#define  PCI_X_CMD_READ_1K	0x0004	/* 1Kbyte maximum read byte count */ +#define  PCI_X_CMD_READ_2K	0x0008	/* 2Kbyte maximum read byte count */ +#define  PCI_X_CMD_READ_4K	0x000c	/* 4Kbyte maximum read byte count */ +#define  PCI_X_CMD_MAX_READ	0x000c	/* Max Memory Read Byte Count */ +				/* Max # of outstanding split transactions */ +#define  PCI_X_CMD_SPLIT_1	0x0000	/* Max 1 */ +#define  PCI_X_CMD_SPLIT_2	0x0010	/* Max 2 */ +#define  PCI_X_CMD_SPLIT_3	0x0020	/* Max 3 */ +#define  PCI_X_CMD_SPLIT_4	0x0030	/* Max 4 */ +#define  PCI_X_CMD_SPLIT_8	0x0040	/* Max 8 */ +#define  PCI_X_CMD_SPLIT_12	0x0050	/* Max 12 */ +#define  PCI_X_CMD_SPLIT_16	0x0060	/* Max 16 */ +#define  PCI_X_CMD_SPLIT_32	0x0070	/* Max 32 */ +#define  PCI_X_CMD_MAX_SPLIT	0x0070	/* Max Outstanding Split Transactions */ +#define  PCI_X_CMD_VERSION(x) 	(((x) >> 12) & 3) /* Version */ +#define PCI_X_STATUS		4	/* PCI-X capabilities */ +#define  PCI_X_STATUS_DEVFN	0x000000ff	/* A copy of devfn */ +#define  PCI_X_STATUS_BUS	0x0000ff00	/* A copy of bus nr */ +#define  PCI_X_STATUS_64BIT	0x00010000	/* 64-bit device */ +#define  PCI_X_STATUS_133MHZ	0x00020000	/* 133 MHz capable */ +#define  PCI_X_STATUS_SPL_DISC	0x00040000	/* Split Completion Discarded */ +#define  PCI_X_STATUS_UNX_SPL	0x00080000	/* Unexpected Split Completion */ +#define  PCI_X_STATUS_COMPLEX	0x00100000	/* Device Complexity */ +#define  PCI_X_STATUS_MAX_READ	0x00600000	/* Designed Max Memory Read Count */ +#define  PCI_X_STATUS_MAX_SPLIT	0x03800000	/* Designed Max Outstanding Split Transactions */ +#define  PCI_X_STATUS_MAX_CUM	0x1c000000	/* Designed Max Cumulative Read Size */ +#define  PCI_X_STATUS_SPL_ERR	0x20000000	/* Rcvd Split Completion Error Msg */ +#define  PCI_X_STATUS_266MHZ	0x40000000	/* 266 MHz capable */ +#define  PCI_X_STATUS_533MHZ	0x80000000	/* 533 MHz capable */ + +/* PCI Bridge Subsystem ID registers */ + +#define PCI_SSVID_VENDOR_ID     4	/* PCI-Bridge subsystem vendor id register */ +#define PCI_SSVID_DEVICE_ID     6	/* PCI-Bridge subsystem device id register */ + +/* PCI Express capability registers */ + +#define PCI_EXP_FLAGS		2	/* Capabilities register */ +#define PCI_EXP_FLAGS_VERS	0x000f	/* Capability version */ +#define PCI_EXP_FLAGS_TYPE	0x00f0	/* Device/Port type */ +#define  PCI_EXP_TYPE_ENDPOINT	0x0	/* Express Endpoint */ +#define  PCI_EXP_TYPE_LEG_END	0x1	/* Legacy Endpoint */ +#define  PCI_EXP_TYPE_ROOT_PORT 0x4	/* Root Port */ +#define  PCI_EXP_TYPE_UPSTREAM	0x5	/* Upstream Port */ +#define  PCI_EXP_TYPE_DOWNSTREAM 0x6	/* Downstream Port */ +#define  PCI_EXP_TYPE_PCI_BRIDGE 0x7	/* PCI/PCI-X Bridge */ +#define  PCI_EXP_TYPE_PCIE_BRIDGE 0x8   /* PCI/PCI-X to PCIE Bridge */ +#define  PCI_EXP_TYPE_RC_END	0x9	/* Root Complex Integrated Endpoint */ +#define  PCI_EXP_TYPE_RC_EC     0xa     /* Root Complex Event Collector */ +#define PCI_EXP_FLAGS_SLOT	0x0100	/* Slot implemented */ +#define PCI_EXP_FLAGS_IRQ	0x3e00	/* Interrupt message number */ +#define PCI_EXP_DEVCAP		4	/* Device capabilities */ +#define  PCI_EXP_DEVCAP_PAYLOAD	0x07	/* Max_Payload_Size */ +#define  PCI_EXP_DEVCAP_PHANTOM	0x18	/* Phantom functions */ +#define  PCI_EXP_DEVCAP_EXT_TAG	0x20	/* Extended tags */ +#define  PCI_EXP_DEVCAP_L0S	0x1c0	/* L0s Acceptable Latency */ +#define  PCI_EXP_DEVCAP_L1	0xe00	/* L1 Acceptable Latency */ +#define  PCI_EXP_DEVCAP_ATN_BUT	0x1000	/* Attention Button Present */ +#define  PCI_EXP_DEVCAP_ATN_IND	0x2000	/* Attention Indicator Present */ +#define  PCI_EXP_DEVCAP_PWR_IND	0x4000	/* Power Indicator Present */ +#define  PCI_EXP_DEVCAP_RBER	0x8000	/* Role-Based Error Reporting */ +#define  PCI_EXP_DEVCAP_PWR_VAL	0x3fc0000 /* Slot Power Limit Value */ +#define  PCI_EXP_DEVCAP_PWR_SCL	0xc000000 /* Slot Power Limit Scale */ +#define  PCI_EXP_DEVCAP_FLR     0x10000000 /* Function Level Reset */ +#define PCI_EXP_DEVCTL		8	/* Device Control */ +#define  PCI_EXP_DEVCTL_CERE	0x0001	/* Correctable Error Reporting En. */ +#define  PCI_EXP_DEVCTL_NFERE	0x0002	/* Non-Fatal Error Reporting Enable */ +#define  PCI_EXP_DEVCTL_FERE	0x0004	/* Fatal Error Reporting Enable */ +#define  PCI_EXP_DEVCTL_URRE	0x0008	/* Unsupported Request Reporting En. */ +#define  PCI_EXP_DEVCTL_RELAX_EN 0x0010 /* Enable relaxed ordering */ +#define  PCI_EXP_DEVCTL_PAYLOAD	0x00e0	/* Max_Payload_Size */ +#define  PCI_EXP_DEVCTL_EXT_TAG	0x0100	/* Extended Tag Field Enable */ +#define  PCI_EXP_DEVCTL_PHANTOM	0x0200	/* Phantom Functions Enable */ +#define  PCI_EXP_DEVCTL_AUX_PME	0x0400	/* Auxiliary Power PM Enable */ +#define  PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800  /* Enable No Snoop */ +#define  PCI_EXP_DEVCTL_READRQ	0x7000	/* Max_Read_Request_Size */ +#define  PCI_EXP_DEVCTL_BCR_FLR 0x8000  /* Bridge Configuration Retry / FLR */ +#define PCI_EXP_DEVSTA		10	/* Device Status */ +#define  PCI_EXP_DEVSTA_CED	0x01	/* Correctable Error Detected */ +#define  PCI_EXP_DEVSTA_NFED	0x02	/* Non-Fatal Error Detected */ +#define  PCI_EXP_DEVSTA_FED	0x04	/* Fatal Error Detected */ +#define  PCI_EXP_DEVSTA_URD	0x08	/* Unsupported Request Detected */ +#define  PCI_EXP_DEVSTA_AUXPD	0x10	/* AUX Power Detected */ +#define  PCI_EXP_DEVSTA_TRPND	0x20	/* Transactions Pending */ +#define PCI_EXP_LNKCAP		12	/* Link Capabilities */ +#define  PCI_EXP_LNKCAP_SLS	0x0000000f /* Supported Link Speeds */ +#define  PCI_EXP_LNKCAP_MLW	0x000003f0 /* Maximum Link Width */ +#define  PCI_EXP_LNKCAP_ASPMS	0x00000c00 /* ASPM Support */ +#define  PCI_EXP_LNKCAP_L0SEL	0x00007000 /* L0s Exit Latency */ +#define  PCI_EXP_LNKCAP_L1EL	0x00038000 /* L1 Exit Latency */ +#define  PCI_EXP_LNKCAP_CLKPM	0x00040000 /* L1 Clock Power Management */ +#define  PCI_EXP_LNKCAP_SDERC	0x00080000 /* Surprise Down Error Reporting Capable */ +#define  PCI_EXP_LNKCAP_DLLLARC	0x00100000 /* Data Link Layer Link Active Reporting Capable */ +#define  PCI_EXP_LNKCAP_LBNC	0x00200000 /* Link Bandwidth Notification Capability */ +#define  PCI_EXP_LNKCAP_PN	0xff000000 /* Port Number */ +#define PCI_EXP_LNKCTL		16	/* Link Control */ +#define  PCI_EXP_LNKCTL_ASPMC	0x0003	/* ASPM Control */ +#define  PCI_EXP_LNKCTL_RCB	0x0008	/* Read Completion Boundary */ +#define  PCI_EXP_LNKCTL_LD	0x0010	/* Link Disable */ +#define  PCI_EXP_LNKCTL_RL	0x0020	/* Retrain Link */ +#define  PCI_EXP_LNKCTL_CCC	0x0040	/* Common Clock Configuration */ +#define  PCI_EXP_LNKCTL_ES	0x0080	/* Extended Synch */ +#define  PCI_EXP_LNKCTL_CLKREQ_EN 0x100	/* Enable clkreq */ +#define  PCI_EXP_LNKCTL_HAWD	0x0200	/* Hardware Autonomous Width Disable */ +#define  PCI_EXP_LNKCTL_LBMIE	0x0400	/* Link Bandwidth Management Interrupt Enable */ +#define  PCI_EXP_LNKCTL_LABIE	0x0800	/* Lnk Autonomous Bandwidth Interrupt Enable */ +#define PCI_EXP_LNKSTA		18	/* Link Status */ +#define  PCI_EXP_LNKSTA_CLS	0x000f	/* Current Link Speed */ +#define  PCI_EXP_LNKSTA_CLS_2_5GB 0x01	/* Current Link Speed 2.5GT/s */ +#define  PCI_EXP_LNKSTA_CLS_5_0GB 0x02	/* Current Link Speed 5.0GT/s */ +#define  PCI_EXP_LNKSTA_NLW	0x03f0	/* Nogotiated Link Width */ +#define  PCI_EXP_LNKSTA_NLW_SHIFT 4	/* start of NLW mask in link status */ +#define  PCI_EXP_LNKSTA_LT	0x0800	/* Link Training */ +#define  PCI_EXP_LNKSTA_SLC	0x1000	/* Slot Clock Configuration */ +#define  PCI_EXP_LNKSTA_DLLLA	0x2000	/* Data Link Layer Link Active */ +#define  PCI_EXP_LNKSTA_LBMS	0x4000	/* Link Bandwidth Management Status */ +#define  PCI_EXP_LNKSTA_LABS	0x8000	/* Link Autonomous Bandwidth Status */ +#define PCI_EXP_SLTCAP		20	/* Slot Capabilities */ +#define  PCI_EXP_SLTCAP_ABP	0x00000001 /* Attention Button Present */ +#define  PCI_EXP_SLTCAP_PCP	0x00000002 /* Power Controller Present */ +#define  PCI_EXP_SLTCAP_MRLSP	0x00000004 /* MRL Sensor Present */ +#define  PCI_EXP_SLTCAP_AIP	0x00000008 /* Attention Indicator Present */ +#define  PCI_EXP_SLTCAP_PIP	0x00000010 /* Power Indicator Present */ +#define  PCI_EXP_SLTCAP_HPS	0x00000020 /* Hot-Plug Surprise */ +#define  PCI_EXP_SLTCAP_HPC	0x00000040 /* Hot-Plug Capable */ +#define  PCI_EXP_SLTCAP_SPLV	0x00007f80 /* Slot Power Limit Value */ +#define  PCI_EXP_SLTCAP_SPLS	0x00018000 /* Slot Power Limit Scale */ +#define  PCI_EXP_SLTCAP_EIP	0x00020000 /* Electromechanical Interlock Present */ +#define  PCI_EXP_SLTCAP_NCCS	0x00040000 /* No Command Completed Support */ +#define  PCI_EXP_SLTCAP_PSN	0xfff80000 /* Physical Slot Number */ +#define PCI_EXP_SLTCTL		24	/* Slot Control */ +#define  PCI_EXP_SLTCTL_ABPE	0x0001	/* Attention Button Pressed Enable */ +#define  PCI_EXP_SLTCTL_PFDE	0x0002	/* Power Fault Detected Enable */ +#define  PCI_EXP_SLTCTL_MRLSCE	0x0004	/* MRL Sensor Changed Enable */ +#define  PCI_EXP_SLTCTL_PDCE	0x0008	/* Presence Detect Changed Enable */ +#define  PCI_EXP_SLTCTL_CCIE	0x0010	/* Command Completed Interrupt Enable */ +#define  PCI_EXP_SLTCTL_HPIE	0x0020	/* Hot-Plug Interrupt Enable */ +#define  PCI_EXP_SLTCTL_AIC	0x00c0	/* Attention Indicator Control */ +#define  PCI_EXP_SLTCTL_PIC	0x0300	/* Power Indicator Control */ +#define  PCI_EXP_SLTCTL_PCC	0x0400	/* Power Controller Control */ +#define  PCI_EXP_SLTCTL_EIC	0x0800	/* Electromechanical Interlock Control */ +#define  PCI_EXP_SLTCTL_DLLSCE	0x1000	/* Data Link Layer State Changed Enable */ +#define PCI_EXP_SLTSTA		26	/* Slot Status */ +#define  PCI_EXP_SLTSTA_ABP	0x0001	/* Attention Button Pressed */ +#define  PCI_EXP_SLTSTA_PFD	0x0002	/* Power Fault Detected */ +#define  PCI_EXP_SLTSTA_MRLSC	0x0004	/* MRL Sensor Changed */ +#define  PCI_EXP_SLTSTA_PDC	0x0008	/* Presence Detect Changed */ +#define  PCI_EXP_SLTSTA_CC	0x0010	/* Command Completed */ +#define  PCI_EXP_SLTSTA_MRLSS	0x0020	/* MRL Sensor State */ +#define  PCI_EXP_SLTSTA_PDS	0x0040	/* Presence Detect State */ +#define  PCI_EXP_SLTSTA_EIS	0x0080	/* Electromechanical Interlock Status */ +#define  PCI_EXP_SLTSTA_DLLSC	0x0100	/* Data Link Layer State Changed */ +#define PCI_EXP_RTCTL		28	/* Root Control */ +#define  PCI_EXP_RTCTL_SECEE	0x01	/* System Error on Correctable Error */ +#define  PCI_EXP_RTCTL_SENFEE	0x02	/* System Error on Non-Fatal Error */ +#define  PCI_EXP_RTCTL_SEFEE	0x04	/* System Error on Fatal Error */ +#define  PCI_EXP_RTCTL_PMEIE	0x08	/* PME Interrupt Enable */ +#define  PCI_EXP_RTCTL_CRSSVE	0x10	/* CRS Software Visibility Enable */ +#define PCI_EXP_RTCAP		30	/* Root Capabilities */ +#define PCI_EXP_RTSTA		32	/* Root Status */ +#define PCI_EXP_RTSTA_PME	0x10000 /* PME status */ +#define PCI_EXP_RTSTA_PENDING	0x20000 /* PME pending */ +#define PCI_EXP_DEVCAP2		36	/* Device Capabilities 2 */ +#define  PCI_EXP_DEVCAP2_ARI	0x20	/* Alternative Routing-ID */ +#define  PCI_EXP_DEVCAP2_LTR	0x800	/* Latency tolerance reporting */ +#define  PCI_EXP_OBFF_MASK	0xc0000 /* OBFF support mechanism */ +#define  PCI_EXP_OBFF_MSG	0x40000 /* New message signaling */ +#define  PCI_EXP_OBFF_WAKE	0x80000 /* Re-use WAKE# for OBFF */ +#define PCI_EXP_DEVCTL2		40	/* Device Control 2 */ +#define  PCI_EXP_DEVCTL2_ARI	0x20	/* Alternative Routing-ID */ +#define  PCI_EXP_IDO_REQ_EN	0x100	/* ID-based ordering request enable */ +#define  PCI_EXP_IDO_CMP_EN	0x200	/* ID-based ordering completion enable */ +#define  PCI_EXP_LTR_EN		0x400	/* Latency tolerance reporting */ +#define  PCI_EXP_OBFF_MSGA_EN	0x2000	/* OBFF enable with Message type A */ +#define  PCI_EXP_OBFF_MSGB_EN	0x4000	/* OBFF enable with Message type B */ +#define  PCI_EXP_OBFF_WAKE_EN	0x6000	/* OBFF using WAKE# signaling */ +#define PCI_EXP_LNKCTL2		48	/* Link Control 2 */ +#define PCI_EXP_SLTCTL2		56	/* Slot Control 2 */ + +/* Extended Capabilities (PCI-X 2.0 and Express) */ +#define PCI_EXT_CAP_ID(header)		(header & 0x0000ffff) +#define PCI_EXT_CAP_VER(header)		((header >> 16) & 0xf) +#define PCI_EXT_CAP_NEXT(header)	((header >> 20) & 0xffc) + +#define PCI_EXT_CAP_ID_ERR	1 +#define PCI_EXT_CAP_ID_VC	2 +#define PCI_EXT_CAP_ID_DSN	3 +#define PCI_EXT_CAP_ID_PWR	4 +#define PCI_EXT_CAP_ID_VNDR	11 +#define PCI_EXT_CAP_ID_ACS	13 +#define PCI_EXT_CAP_ID_ARI	14 +#define PCI_EXT_CAP_ID_ATS	15 +#define PCI_EXT_CAP_ID_SRIOV	16 +#define PCI_EXT_CAP_ID_LTR	24 + +/* Advanced Error Reporting */ +#define PCI_ERR_UNCOR_STATUS	4	/* Uncorrectable Error Status */ +#define  PCI_ERR_UNC_TRAIN	0x00000001	/* Training */ +#define  PCI_ERR_UNC_DLP	0x00000010	/* Data Link Protocol */ +#define  PCI_ERR_UNC_POISON_TLP	0x00001000	/* Poisoned TLP */ +#define  PCI_ERR_UNC_FCP	0x00002000	/* Flow Control Protocol */ +#define  PCI_ERR_UNC_COMP_TIME	0x00004000	/* Completion Timeout */ +#define  PCI_ERR_UNC_COMP_ABORT	0x00008000	/* Completer Abort */ +#define  PCI_ERR_UNC_UNX_COMP	0x00010000	/* Unexpected Completion */ +#define  PCI_ERR_UNC_RX_OVER	0x00020000	/* Receiver Overflow */ +#define  PCI_ERR_UNC_MALF_TLP	0x00040000	/* Malformed TLP */ +#define  PCI_ERR_UNC_ECRC	0x00080000	/* ECRC Error Status */ +#define  PCI_ERR_UNC_UNSUP	0x00100000	/* Unsupported Request */ +#define PCI_ERR_UNCOR_MASK	8	/* Uncorrectable Error Mask */ +	/* Same bits as above */ +#define PCI_ERR_UNCOR_SEVER	12	/* Uncorrectable Error Severity */ +	/* Same bits as above */ +#define PCI_ERR_COR_STATUS	16	/* Correctable Error Status */ +#define  PCI_ERR_COR_RCVR	0x00000001	/* Receiver Error Status */ +#define  PCI_ERR_COR_BAD_TLP	0x00000040	/* Bad TLP Status */ +#define  PCI_ERR_COR_BAD_DLLP	0x00000080	/* Bad DLLP Status */ +#define  PCI_ERR_COR_REP_ROLL	0x00000100	/* REPLAY_NUM Rollover */ +#define  PCI_ERR_COR_REP_TIMER	0x00001000	/* Replay Timer Timeout */ +#define PCI_ERR_COR_MASK	20	/* Correctable Error Mask */ +	/* Same bits as above */ +#define PCI_ERR_CAP		24	/* Advanced Error Capabilities */ +#define  PCI_ERR_CAP_FEP(x)	((x) & 31)	/* First Error Pointer */ +#define  PCI_ERR_CAP_ECRC_GENC	0x00000020	/* ECRC Generation Capable */ +#define  PCI_ERR_CAP_ECRC_GENE	0x00000040	/* ECRC Generation Enable */ +#define  PCI_ERR_CAP_ECRC_CHKC	0x00000080	/* ECRC Check Capable */ +#define  PCI_ERR_CAP_ECRC_CHKE	0x00000100	/* ECRC Check Enable */ +#define PCI_ERR_HEADER_LOG	28	/* Header Log Register (16 bytes) */ +#define PCI_ERR_ROOT_COMMAND	44	/* Root Error Command */ +/* Correctable Err Reporting Enable */ +#define PCI_ERR_ROOT_CMD_COR_EN		0x00000001 +/* Non-fatal Err Reporting Enable */ +#define PCI_ERR_ROOT_CMD_NONFATAL_EN	0x00000002 +/* Fatal Err Reporting Enable */ +#define PCI_ERR_ROOT_CMD_FATAL_EN	0x00000004 +#define PCI_ERR_ROOT_STATUS	48 +#define PCI_ERR_ROOT_COR_RCV		0x00000001	/* ERR_COR Received */ +/* Multi ERR_COR Received */ +#define PCI_ERR_ROOT_MULTI_COR_RCV	0x00000002 +/* ERR_FATAL/NONFATAL Recevied */ +#define PCI_ERR_ROOT_UNCOR_RCV		0x00000004 +/* Multi ERR_FATAL/NONFATAL Recevied */ +#define PCI_ERR_ROOT_MULTI_UNCOR_RCV	0x00000008 +#define PCI_ERR_ROOT_FIRST_FATAL	0x00000010	/* First Fatal */ +#define PCI_ERR_ROOT_NONFATAL_RCV	0x00000020	/* Non-Fatal Received */ +#define PCI_ERR_ROOT_FATAL_RCV		0x00000040	/* Fatal Received */ +#define PCI_ERR_ROOT_ERR_SRC	52	/* Error Source Identification */ + +/* Virtual Channel */ +#define PCI_VC_PORT_REG1	4 +#define PCI_VC_PORT_REG2	8 +#define PCI_VC_PORT_CTRL	12 +#define PCI_VC_PORT_STATUS	14 +#define PCI_VC_RES_CAP		16 +#define PCI_VC_RES_CTRL		20 +#define PCI_VC_RES_STATUS	26 + +/* Power Budgeting */ +#define PCI_PWR_DSR		4	/* Data Select Register */ +#define PCI_PWR_DATA		8	/* Data Register */ +#define  PCI_PWR_DATA_BASE(x)	((x) & 0xff)	    /* Base Power */ +#define  PCI_PWR_DATA_SCALE(x)	(((x) >> 8) & 3)    /* Data Scale */ +#define  PCI_PWR_DATA_PM_SUB(x)	(((x) >> 10) & 7)   /* PM Sub State */ +#define  PCI_PWR_DATA_PM_STATE(x) (((x) >> 13) & 3) /* PM State */ +#define  PCI_PWR_DATA_TYPE(x)	(((x) >> 15) & 7)   /* Type */ +#define  PCI_PWR_DATA_RAIL(x)	(((x) >> 18) & 7)   /* Power Rail */ +#define PCI_PWR_CAP		12	/* Capability */ +#define  PCI_PWR_CAP_BUDGET(x)	((x) & 1)	/* Included in system budget */ + +/* + * Hypertransport sub capability types + * + * Unfortunately there are both 3 bit and 5 bit capability types defined + * in the HT spec, catering for that is a little messy. You probably don't + * want to use these directly, just use pci_find_ht_capability() and it + * will do the right thing for you. + */ +#define HT_3BIT_CAP_MASK	0xE0 +#define HT_CAPTYPE_SLAVE	0x00	/* Slave/Primary link configuration */ +#define HT_CAPTYPE_HOST		0x20	/* Host/Secondary link configuration */ + +#define HT_5BIT_CAP_MASK	0xF8 +#define HT_CAPTYPE_IRQ		0x80	/* IRQ Configuration */ +#define HT_CAPTYPE_REMAPPING_40	0xA0	/* 40 bit address remapping */ +#define HT_CAPTYPE_REMAPPING_64 0xA2	/* 64 bit address remapping */ +#define HT_CAPTYPE_UNITID_CLUMP	0x90	/* Unit ID clumping */ +#define HT_CAPTYPE_EXTCONF	0x98	/* Extended Configuration Space Access */ +#define HT_CAPTYPE_MSI_MAPPING	0xA8	/* MSI Mapping Capability */ +#define  HT_MSI_FLAGS		0x02		/* Offset to flags */ +#define  HT_MSI_FLAGS_ENABLE	0x1		/* Mapping enable */ +#define  HT_MSI_FLAGS_FIXED	0x2		/* Fixed mapping only */ +#define  HT_MSI_FIXED_ADDR	0x00000000FEE00000ULL	/* Fixed addr */ +#define  HT_MSI_ADDR_LO		0x04		/* Offset to low addr bits */ +#define  HT_MSI_ADDR_LO_MASK	0xFFF00000	/* Low address bit mask */ +#define  HT_MSI_ADDR_HI		0x08		/* Offset to high addr bits */ +#define HT_CAPTYPE_DIRECT_ROUTE	0xB0	/* Direct routing configuration */ +#define HT_CAPTYPE_VCSET	0xB8	/* Virtual Channel configuration */ +#define HT_CAPTYPE_ERROR_RETRY	0xC0	/* Retry on error configuration */ +#define HT_CAPTYPE_GEN3		0xD0	/* Generation 3 hypertransport configuration */ +#define HT_CAPTYPE_PM		0xE0	/* Hypertransport powermanagement configuration */ + +/* Alternative Routing-ID Interpretation */ +#define PCI_ARI_CAP		0x04	/* ARI Capability Register */ +#define  PCI_ARI_CAP_MFVC	0x0001	/* MFVC Function Groups Capability */ +#define  PCI_ARI_CAP_ACS	0x0002	/* ACS Function Groups Capability */ +#define  PCI_ARI_CAP_NFN(x)	(((x) >> 8) & 0xff) /* Next Function Number */ +#define PCI_ARI_CTRL		0x06	/* ARI Control Register */ +#define  PCI_ARI_CTRL_MFVC	0x0001	/* MFVC Function Groups Enable */ +#define  PCI_ARI_CTRL_ACS	0x0002	/* ACS Function Groups Enable */ +#define  PCI_ARI_CTRL_FG(x)	(((x) >> 4) & 7) /* Function Group */ + +/* Address Translation Service */ +#define PCI_ATS_CAP		0x04	/* ATS Capability Register */ +#define  PCI_ATS_CAP_QDEP(x)	((x) & 0x1f)	/* Invalidate Queue Depth */ +#define  PCI_ATS_MAX_QDEP	32	/* Max Invalidate Queue Depth */ +#define PCI_ATS_CTRL		0x06	/* ATS Control Register */ +#define  PCI_ATS_CTRL_ENABLE	0x8000	/* ATS Enable */ +#define  PCI_ATS_CTRL_STU(x)	((x) & 0x1f)	/* Smallest Translation Unit */ +#define  PCI_ATS_MIN_STU	12	/* shift of minimum STU block */ + +/* Single Root I/O Virtualization */ +#define PCI_SRIOV_CAP		0x04	/* SR-IOV Capabilities */ +#define  PCI_SRIOV_CAP_VFM	0x01	/* VF Migration Capable */ +#define  PCI_SRIOV_CAP_INTR(x)	((x) >> 21) /* Interrupt Message Number */ +#define PCI_SRIOV_CTRL		0x08	/* SR-IOV Control */ +#define  PCI_SRIOV_CTRL_VFE	0x01	/* VF Enable */ +#define  PCI_SRIOV_CTRL_VFM	0x02	/* VF Migration Enable */ +#define  PCI_SRIOV_CTRL_INTR	0x04	/* VF Migration Interrupt Enable */ +#define  PCI_SRIOV_CTRL_MSE	0x08	/* VF Memory Space Enable */ +#define  PCI_SRIOV_CTRL_ARI	0x10	/* ARI Capable Hierarchy */ +#define PCI_SRIOV_STATUS	0x0a	/* SR-IOV Status */ +#define  PCI_SRIOV_STATUS_VFM	0x01	/* VF Migration Status */ +#define PCI_SRIOV_INITIAL_VF	0x0c	/* Initial VFs */ +#define PCI_SRIOV_TOTAL_VF	0x0e	/* Total VFs */ +#define PCI_SRIOV_NUM_VF	0x10	/* Number of VFs */ +#define PCI_SRIOV_FUNC_LINK	0x12	/* Function Dependency Link */ +#define PCI_SRIOV_VF_OFFSET	0x14	/* First VF Offset */ +#define PCI_SRIOV_VF_STRIDE	0x16	/* Following VF Stride */ +#define PCI_SRIOV_VF_DID	0x1a	/* VF Device ID */ +#define PCI_SRIOV_SUP_PGSIZE	0x1c	/* Supported Page Sizes */ +#define PCI_SRIOV_SYS_PGSIZE	0x20	/* System Page Size */ +#define PCI_SRIOV_BAR		0x24	/* VF BAR0 */ +#define  PCI_SRIOV_NUM_BARS	6	/* Number of VF BARs */ +#define PCI_SRIOV_VFM		0x3c	/* VF Migration State Array Offset*/ +#define  PCI_SRIOV_VFM_BIR(x)	((x) & 7)	/* State BIR */ +#define  PCI_SRIOV_VFM_OFFSET(x) ((x) & ~7)	/* State Offset */ +#define  PCI_SRIOV_VFM_UA	0x0	/* Inactive.Unavailable */ +#define  PCI_SRIOV_VFM_MI	0x1	/* Dormant.MigrateIn */ +#define  PCI_SRIOV_VFM_MO	0x2	/* Active.MigrateOut */ +#define  PCI_SRIOV_VFM_AV	0x3	/* Active.Available */ + +#define PCI_LTR_MAX_SNOOP_LAT	0x4 +#define PCI_LTR_MAX_NOSNOOP_LAT	0x6 +#define  PCI_LTR_VALUE_MASK	0x000003ff +#define  PCI_LTR_SCALE_MASK	0x00001c00 +#define  PCI_LTR_SCALE_SHIFT	10 + +/* Access Control Service */ +#define PCI_ACS_CAP		0x04	/* ACS Capability Register */ +#define  PCI_ACS_SV		0x01	/* Source Validation */ +#define  PCI_ACS_TB		0x02	/* Translation Blocking */ +#define  PCI_ACS_RR		0x04	/* P2P Request Redirect */ +#define  PCI_ACS_CR		0x08	/* P2P Completion Redirect */ +#define  PCI_ACS_UF		0x10	/* Upstream Forwarding */ +#define  PCI_ACS_EC		0x20	/* P2P Egress Control */ +#define  PCI_ACS_DT		0x40	/* Direct Translated P2P */ +#define PCI_ACS_CTRL		0x06	/* ACS Control Register */ +#define PCI_ACS_EGRESS_CTL_V	0x08	/* ACS Egress Control Vector */ + +#endif /* LINUX_PCI_REGS_H */ diff --git a/include/standard-headers/linux/types.h b/include/standard-headers/linux/types.h new file mode 100644 index 00000000..0526c2b8 --- /dev/null +++ b/include/standard-headers/linux/types.h @@ -0,0 +1,2 @@ +#include <stdint.h> +#include "qemu/compiler.h" diff --git a/include/standard-headers/linux/virtio_9p.h b/include/standard-headers/linux/virtio_9p.h new file mode 100644 index 00000000..e68f71db --- /dev/null +++ b/include/standard-headers/linux/virtio_9p.h @@ -0,0 +1,44 @@ +#ifndef _LINUX_VIRTIO_9P_H +#define _LINUX_VIRTIO_9P_H +/* This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ +#include "standard-headers/linux/types.h" +#include "standard-headers/linux/virtio_ids.h" +#include "standard-headers/linux/virtio_config.h" + +/* The feature bitmap for virtio 9P */ + +/* The mount point is specified in a config variable */ +#define VIRTIO_9P_MOUNT_TAG 0 + +struct virtio_9p_config { +	/* length of the tag name */ +	uint16_t tag_len; +	/* non-NULL terminated tag name */ +	uint8_t tag[0]; +} QEMU_PACKED; + +#endif /* _LINUX_VIRTIO_9P_H */ diff --git a/include/standard-headers/linux/virtio_balloon.h b/include/standard-headers/linux/virtio_balloon.h new file mode 100644 index 00000000..2e2a6dcf --- /dev/null +++ b/include/standard-headers/linux/virtio_balloon.h @@ -0,0 +1,84 @@ +#ifndef _LINUX_VIRTIO_BALLOON_H +#define _LINUX_VIRTIO_BALLOON_H +/* This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ +#include "standard-headers/linux/types.h" +#include "standard-headers/linux/virtio_types.h" +#include "standard-headers/linux/virtio_ids.h" +#include "standard-headers/linux/virtio_config.h" + +/* The feature bitmap for virtio balloon */ +#define VIRTIO_BALLOON_F_MUST_TELL_HOST	0 /* Tell before reclaiming pages */ +#define VIRTIO_BALLOON_F_STATS_VQ	1 /* Memory Stats virtqueue */ +#define VIRTIO_BALLOON_F_DEFLATE_ON_OOM	2 /* Deflate balloon on OOM */ + +/* Size of a PFN in the balloon interface. */ +#define VIRTIO_BALLOON_PFN_SHIFT 12 + +struct virtio_balloon_config { +	/* Number of pages host wants Guest to give up. */ +	uint32_t num_pages; +	/* Number of pages we've actually got in balloon. */ +	uint32_t actual; +}; + +#define VIRTIO_BALLOON_S_SWAP_IN  0   /* Amount of memory swapped in */ +#define VIRTIO_BALLOON_S_SWAP_OUT 1   /* Amount of memory swapped out */ +#define VIRTIO_BALLOON_S_MAJFLT   2   /* Number of major faults */ +#define VIRTIO_BALLOON_S_MINFLT   3   /* Number of minor faults */ +#define VIRTIO_BALLOON_S_MEMFREE  4   /* Total amount of free memory */ +#define VIRTIO_BALLOON_S_MEMTOT   5   /* Total amount of memory */ +#define VIRTIO_BALLOON_S_NR       6 + +/* + * Memory statistics structure. + * Driver fills an array of these structures and passes to device. + * + * NOTE: fields are laid out in a way that would make compiler add padding + * between and after fields, so we have to use compiler-specific attributes to + * pack it, to disable this padding. This also often causes compiler to + * generate suboptimal code. + * + * We maintain this statistics structure format for backwards compatibility, + * but don't follow this example. + * + * If implementing a similar structure, do something like the below instead: + *     struct virtio_balloon_stat { + *         __virtio16 tag; + *         uint8_t reserved[6]; + *         __virtio64 val; + *     }; + * + * In other words, add explicit reserved fields to align field and + * structure boundaries at field size, avoiding compiler padding + * without the packed attribute. + */ +struct virtio_balloon_stat { +	__virtio16 tag; +	__virtio64 val; +} QEMU_PACKED; + +#endif /* _LINUX_VIRTIO_BALLOON_H */ diff --git a/include/standard-headers/linux/virtio_blk.h b/include/standard-headers/linux/virtio_blk.h new file mode 100644 index 00000000..cd601f40 --- /dev/null +++ b/include/standard-headers/linux/virtio_blk.h @@ -0,0 +1,147 @@ +#ifndef _LINUX_VIRTIO_BLK_H +#define _LINUX_VIRTIO_BLK_H +/* This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ +#include "standard-headers/linux/types.h" +#include "standard-headers/linux/virtio_ids.h" +#include "standard-headers/linux/virtio_config.h" +#include "standard-headers/linux/virtio_types.h" + +/* Feature bits */ +#define VIRTIO_BLK_F_SIZE_MAX	1	/* Indicates maximum segment size */ +#define VIRTIO_BLK_F_SEG_MAX	2	/* Indicates maximum # of segments */ +#define VIRTIO_BLK_F_GEOMETRY	4	/* Legacy geometry available  */ +#define VIRTIO_BLK_F_RO		5	/* Disk is read-only */ +#define VIRTIO_BLK_F_BLK_SIZE	6	/* Block size of disk is available*/ +#define VIRTIO_BLK_F_TOPOLOGY	10	/* Topology information is available */ +#define VIRTIO_BLK_F_MQ		12	/* support more than one vq */ + +/* Legacy feature bits */ +#ifndef VIRTIO_BLK_NO_LEGACY +#define VIRTIO_BLK_F_BARRIER	0	/* Does host support barriers? */ +#define VIRTIO_BLK_F_SCSI	7	/* Supports scsi command passthru */ +#define VIRTIO_BLK_F_WCE	9	/* Writeback mode enabled after reset */ +#define VIRTIO_BLK_F_CONFIG_WCE	11	/* Writeback mode available in config */ +/* Old (deprecated) name for VIRTIO_BLK_F_WCE. */ +#define VIRTIO_BLK_F_FLUSH VIRTIO_BLK_F_WCE +#endif /* !VIRTIO_BLK_NO_LEGACY */ + +#define VIRTIO_BLK_ID_BYTES	20	/* ID string length */ + +struct virtio_blk_config { +	/* The capacity (in 512-byte sectors). */ +	uint64_t capacity; +	/* The maximum segment size (if VIRTIO_BLK_F_SIZE_MAX) */ +	uint32_t size_max; +	/* The maximum number of segments (if VIRTIO_BLK_F_SEG_MAX) */ +	uint32_t seg_max; +	/* geometry of the device (if VIRTIO_BLK_F_GEOMETRY) */ +	struct virtio_blk_geometry { +		uint16_t cylinders; +		uint8_t heads; +		uint8_t sectors; +	} geometry; + +	/* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */ +	uint32_t blk_size; + +	/* the next 4 entries are guarded by VIRTIO_BLK_F_TOPOLOGY  */ +	/* exponent for physical block per logical block. */ +	uint8_t physical_block_exp; +	/* alignment offset in logical blocks. */ +	uint8_t alignment_offset; +	/* minimum I/O size without performance penalty in logical blocks. */ +	uint16_t min_io_size; +	/* optimal sustained I/O size in logical blocks. */ +	uint32_t opt_io_size; + +	/* writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */ +	uint8_t wce; +	uint8_t unused; + +	/* number of vqs, only available when VIRTIO_BLK_F_MQ is set */ +	uint16_t num_queues; +} QEMU_PACKED; + +/* + * Command types + * + * Usage is a bit tricky as some bits are used as flags and some are not. + * + * Rules: + *   VIRTIO_BLK_T_OUT may be combined with VIRTIO_BLK_T_SCSI_CMD or + *   VIRTIO_BLK_T_BARRIER.  VIRTIO_BLK_T_FLUSH is a command of its own + *   and may not be combined with any of the other flags. + */ + +/* These two define direction. */ +#define VIRTIO_BLK_T_IN		0 +#define VIRTIO_BLK_T_OUT	1 + +#ifndef VIRTIO_BLK_NO_LEGACY +/* This bit says it's a scsi command, not an actual read or write. */ +#define VIRTIO_BLK_T_SCSI_CMD	2 +#endif /* VIRTIO_BLK_NO_LEGACY */ + +/* Cache flush command */ +#define VIRTIO_BLK_T_FLUSH	4 + +/* Get device ID command */ +#define VIRTIO_BLK_T_GET_ID    8 + +#ifndef VIRTIO_BLK_NO_LEGACY +/* Barrier before this op. */ +#define VIRTIO_BLK_T_BARRIER	0x80000000 +#endif /* !VIRTIO_BLK_NO_LEGACY */ + +/* + * This comes first in the read scatter-gather list. + * For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated, + * this is the first element of the read scatter-gather list. + */ +struct virtio_blk_outhdr { +	/* VIRTIO_BLK_T* */ +	__virtio32 type; +	/* io priority. */ +	__virtio32 ioprio; +	/* Sector (ie. 512 byte offset) */ +	__virtio64 sector; +}; + +#ifndef VIRTIO_BLK_NO_LEGACY +struct virtio_scsi_inhdr { +	__virtio32 errors; +	__virtio32 data_len; +	__virtio32 sense_len; +	__virtio32 residual; +}; +#endif /* !VIRTIO_BLK_NO_LEGACY */ + +/* And this is the final byte of the write scatter-gather list. */ +#define VIRTIO_BLK_S_OK		0 +#define VIRTIO_BLK_S_IOERR	1 +#define VIRTIO_BLK_S_UNSUPP	2 +#endif /* _LINUX_VIRTIO_BLK_H */ diff --git a/include/standard-headers/linux/virtio_config.h b/include/standard-headers/linux/virtio_config.h new file mode 100644 index 00000000..bcc445b3 --- /dev/null +++ b/include/standard-headers/linux/virtio_config.h @@ -0,0 +1,64 @@ +#ifndef _LINUX_VIRTIO_CONFIG_H +#define _LINUX_VIRTIO_CONFIG_H +/* This header, excluding the #ifdef __KERNEL__ part, is BSD licensed so + * anyone can use the definitions to implement compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ + +/* Virtio devices use a standardized configuration space to define their + * features and pass configuration information, but each implementation can + * store and access that space differently. */ +#include "standard-headers/linux/types.h" + +/* Status byte for guest to report progress, and synchronize features. */ +/* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */ +#define VIRTIO_CONFIG_S_ACKNOWLEDGE	1 +/* We have found a driver for the device. */ +#define VIRTIO_CONFIG_S_DRIVER		2 +/* Driver has used its parts of the config, and is happy */ +#define VIRTIO_CONFIG_S_DRIVER_OK	4 +/* Driver has finished configuring features */ +#define VIRTIO_CONFIG_S_FEATURES_OK	8 +/* We've given up on this device. */ +#define VIRTIO_CONFIG_S_FAILED		0x80 + +/* Some virtio feature bits (currently bits 28 through 32) are reserved for the + * transport being used (eg. virtio_ring), the rest are per-device feature + * bits. */ +#define VIRTIO_TRANSPORT_F_START	28 +#define VIRTIO_TRANSPORT_F_END		33 + +#ifndef VIRTIO_CONFIG_NO_LEGACY +/* Do we get callbacks when the ring is completely used, even if we've + * suppressed them? */ +#define VIRTIO_F_NOTIFY_ON_EMPTY	24 + +/* Can the device handle any descriptor layout? */ +#define VIRTIO_F_ANY_LAYOUT		27 +#endif /* VIRTIO_CONFIG_NO_LEGACY */ + +/* v1.0 compliant. */ +#define VIRTIO_F_VERSION_1		32 + +#endif /* _LINUX_VIRTIO_CONFIG_H */ diff --git a/include/standard-headers/linux/virtio_console.h b/include/standard-headers/linux/virtio_console.h new file mode 100644 index 00000000..0dedc9e6 --- /dev/null +++ b/include/standard-headers/linux/virtio_console.h @@ -0,0 +1,78 @@ +/* + * This header, excluding the #ifdef __KERNEL__ part, is BSD licensed so + * anyone can use the definitions to implement compatible drivers/servers: + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Copyright (C) Red Hat, Inc., 2009, 2010, 2011 + * Copyright (C) Amit Shah <amit.shah@redhat.com>, 2009, 2010, 2011 + */ +#ifndef _LINUX_VIRTIO_CONSOLE_H +#define _LINUX_VIRTIO_CONSOLE_H +#include "standard-headers/linux/types.h" +#include "standard-headers/linux/virtio_types.h" +#include "standard-headers/linux/virtio_ids.h" +#include "standard-headers/linux/virtio_config.h" + +/* Feature bits */ +#define VIRTIO_CONSOLE_F_SIZE	0	/* Does host provide console size? */ +#define VIRTIO_CONSOLE_F_MULTIPORT 1	/* Does host provide multiple ports? */ +#define VIRTIO_CONSOLE_F_EMERG_WRITE 2 /* Does host support emergency write? */ + +#define VIRTIO_CONSOLE_BAD_ID		(~(uint32_t)0) + +struct virtio_console_config { +	/* colums of the screens */ +	uint16_t cols; +	/* rows of the screens */ +	uint16_t rows; +	/* max. number of ports this device can hold */ +	uint32_t max_nr_ports; +	/* emergency write register */ +	uint32_t emerg_wr; +} QEMU_PACKED; + +/* + * A message that's passed between the Host and the Guest for a + * particular port. + */ +struct virtio_console_control { +	__virtio32 id;		/* Port number */ +	__virtio16 event;	/* The kind of control event (see below) */ +	__virtio16 value;	/* Extra information for the key */ +}; + +/* Some events for control messages */ +#define VIRTIO_CONSOLE_DEVICE_READY	0 +#define VIRTIO_CONSOLE_PORT_ADD		1 +#define VIRTIO_CONSOLE_PORT_REMOVE	2 +#define VIRTIO_CONSOLE_PORT_READY	3 +#define VIRTIO_CONSOLE_CONSOLE_PORT	4 +#define VIRTIO_CONSOLE_RESIZE		5 +#define VIRTIO_CONSOLE_PORT_OPEN	6 +#define VIRTIO_CONSOLE_PORT_NAME	7 + + +#endif /* _LINUX_VIRTIO_CONSOLE_H */ diff --git a/include/standard-headers/linux/virtio_gpu.h b/include/standard-headers/linux/virtio_gpu.h new file mode 100644 index 00000000..72ef815f --- /dev/null +++ b/include/standard-headers/linux/virtio_gpu.h @@ -0,0 +1,206 @@ +/* + * Virtio GPU Device + * + * Copyright Red Hat, Inc. 2013-2014 + * + * Authors: + *     Dave Airlie <airlied@redhat.com> + *     Gerd Hoffmann <kraxel@redhat.com> + * + * This header is BSD licensed so anyone can use the definitions + * to implement compatible drivers/servers: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef VIRTIO_GPU_HW_H +#define VIRTIO_GPU_HW_H + +#include "standard-headers/linux/types.h" + +enum virtio_gpu_ctrl_type { +	VIRTIO_GPU_UNDEFINED = 0, + +	/* 2d commands */ +	VIRTIO_GPU_CMD_GET_DISPLAY_INFO = 0x0100, +	VIRTIO_GPU_CMD_RESOURCE_CREATE_2D, +	VIRTIO_GPU_CMD_RESOURCE_UNREF, +	VIRTIO_GPU_CMD_SET_SCANOUT, +	VIRTIO_GPU_CMD_RESOURCE_FLUSH, +	VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D, +	VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING, +	VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING, + +	/* cursor commands */ +	VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300, +	VIRTIO_GPU_CMD_MOVE_CURSOR, + +	/* success responses */ +	VIRTIO_GPU_RESP_OK_NODATA = 0x1100, +	VIRTIO_GPU_RESP_OK_DISPLAY_INFO, + +	/* error responses */ +	VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200, +	VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY, +	VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID, +	VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID, +	VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID, +	VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER, +}; + +#define VIRTIO_GPU_FLAG_FENCE (1 << 0) + +struct virtio_gpu_ctrl_hdr { +	uint32_t type; +	uint32_t flags; +	uint64_t fence_id; +	uint32_t ctx_id; +	uint32_t padding; +}; + +/* data passed in the cursor vq */ + +struct virtio_gpu_cursor_pos { +	uint32_t scanout_id; +	uint32_t x; +	uint32_t y; +	uint32_t padding; +}; + +/* VIRTIO_GPU_CMD_UPDATE_CURSOR, VIRTIO_GPU_CMD_MOVE_CURSOR */ +struct virtio_gpu_update_cursor { +	struct virtio_gpu_ctrl_hdr hdr; +	struct virtio_gpu_cursor_pos pos;  /* update & move */ +	uint32_t resource_id;           /* update only */ +	uint32_t hot_x;                 /* update only */ +	uint32_t hot_y;                 /* update only */ +	uint32_t padding; +}; + +/* data passed in the control vq, 2d related */ + +struct virtio_gpu_rect { +	uint32_t x; +	uint32_t y; +	uint32_t width; +	uint32_t height; +}; + +/* VIRTIO_GPU_CMD_RESOURCE_UNREF */ +struct virtio_gpu_resource_unref { +	struct virtio_gpu_ctrl_hdr hdr; +	uint32_t resource_id; +	uint32_t padding; +}; + +/* VIRTIO_GPU_CMD_RESOURCE_CREATE_2D: create a 2d resource with a format */ +struct virtio_gpu_resource_create_2d { +	struct virtio_gpu_ctrl_hdr hdr; +	uint32_t resource_id; +	uint32_t format; +	uint32_t width; +	uint32_t height; +}; + +/* VIRTIO_GPU_CMD_SET_SCANOUT */ +struct virtio_gpu_set_scanout { +	struct virtio_gpu_ctrl_hdr hdr; +	struct virtio_gpu_rect r; +	uint32_t scanout_id; +	uint32_t resource_id; +}; + +/* VIRTIO_GPU_CMD_RESOURCE_FLUSH */ +struct virtio_gpu_resource_flush { +	struct virtio_gpu_ctrl_hdr hdr; +	struct virtio_gpu_rect r; +	uint32_t resource_id; +	uint32_t padding; +}; + +/* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D: simple transfer to_host */ +struct virtio_gpu_transfer_to_host_2d { +	struct virtio_gpu_ctrl_hdr hdr; +	struct virtio_gpu_rect r; +	uint64_t offset; +	uint32_t resource_id; +	uint32_t padding; +}; + +struct virtio_gpu_mem_entry { +	uint64_t addr; +	uint32_t length; +	uint32_t padding; +}; + +/* VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING */ +struct virtio_gpu_resource_attach_backing { +	struct virtio_gpu_ctrl_hdr hdr; +	uint32_t resource_id; +	uint32_t nr_entries; +}; + +/* VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING */ +struct virtio_gpu_resource_detach_backing { +	struct virtio_gpu_ctrl_hdr hdr; +	uint32_t resource_id; +	uint32_t padding; +}; + +/* VIRTIO_GPU_RESP_OK_DISPLAY_INFO */ +#define VIRTIO_GPU_MAX_SCANOUTS 16 +struct virtio_gpu_resp_display_info { +	struct virtio_gpu_ctrl_hdr hdr; +	struct virtio_gpu_display_one { +		struct virtio_gpu_rect r; +		uint32_t enabled; +		uint32_t flags; +	} pmodes[VIRTIO_GPU_MAX_SCANOUTS]; +}; + +#define VIRTIO_GPU_EVENT_DISPLAY (1 << 0) + +struct virtio_gpu_config { +	uint32_t events_read; +	uint32_t events_clear; +	uint32_t num_scanouts; +	uint32_t reserved; +}; + +/* simple formats for fbcon/X use */ +enum virtio_gpu_formats { +	VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM  = 1, +	VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM  = 2, +	VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM  = 3, +	VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM  = 4, + +	VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM  = 67, +	VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM  = 68, + +	VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM  = 121, +	VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM  = 134, +}; + +#endif diff --git a/include/standard-headers/linux/virtio_ids.h b/include/standard-headers/linux/virtio_ids.h new file mode 100644 index 00000000..77925f58 --- /dev/null +++ b/include/standard-headers/linux/virtio_ids.h @@ -0,0 +1,45 @@ +#ifndef _LINUX_VIRTIO_IDS_H +#define _LINUX_VIRTIO_IDS_H +/* + * Virtio IDs + * + * This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ + +#define VIRTIO_ID_NET		1 /* virtio net */ +#define VIRTIO_ID_BLOCK		2 /* virtio block */ +#define VIRTIO_ID_CONSOLE	3 /* virtio console */ +#define VIRTIO_ID_RNG		4 /* virtio rng */ +#define VIRTIO_ID_BALLOON	5 /* virtio balloon */ +#define VIRTIO_ID_RPMSG		7 /* virtio remote processor messaging */ +#define VIRTIO_ID_SCSI		8 /* virtio scsi */ +#define VIRTIO_ID_9P		9 /* 9p virtio console */ +#define VIRTIO_ID_RPROC_SERIAL 11 /* virtio remoteproc serial link */ +#define VIRTIO_ID_CAIF	       12 /* Virtio caif */ +#define VIRTIO_ID_GPU          16 /* virtio GPU */ +#define VIRTIO_ID_INPUT        18 /* virtio input */ + +#endif /* _LINUX_VIRTIO_IDS_H */ diff --git a/include/standard-headers/linux/virtio_input.h b/include/standard-headers/linux/virtio_input.h new file mode 100644 index 00000000..a98a7974 --- /dev/null +++ b/include/standard-headers/linux/virtio_input.h @@ -0,0 +1,76 @@ +#ifndef _LINUX_VIRTIO_INPUT_H +#define _LINUX_VIRTIO_INPUT_H +/* This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ + +#include "standard-headers/linux/types.h" + +enum virtio_input_config_select { +	VIRTIO_INPUT_CFG_UNSET      = 0x00, +	VIRTIO_INPUT_CFG_ID_NAME    = 0x01, +	VIRTIO_INPUT_CFG_ID_SERIAL  = 0x02, +	VIRTIO_INPUT_CFG_ID_DEVIDS  = 0x03, +	VIRTIO_INPUT_CFG_PROP_BITS  = 0x10, +	VIRTIO_INPUT_CFG_EV_BITS    = 0x11, +	VIRTIO_INPUT_CFG_ABS_INFO   = 0x12, +}; + +struct virtio_input_absinfo { +	uint32_t min; +	uint32_t max; +	uint32_t fuzz; +	uint32_t flat; +	uint32_t res; +}; + +struct virtio_input_devids { +	uint16_t bustype; +	uint16_t vendor; +	uint16_t product; +	uint16_t version; +}; + +struct virtio_input_config { +	uint8_t    select; +	uint8_t    subsel; +	uint8_t    size; +	uint8_t    reserved[5]; +	union { +		char string[128]; +		uint8_t bitmap[128]; +		struct virtio_input_absinfo abs; +		struct virtio_input_devids ids; +	} u; +}; + +struct virtio_input_event { +	uint16_t type; +	uint16_t code; +	uint32_t value; +}; + +#endif /* _LINUX_VIRTIO_INPUT_H */ diff --git a/include/standard-headers/linux/virtio_net.h b/include/standard-headers/linux/virtio_net.h new file mode 100644 index 00000000..a78f33e7 --- /dev/null +++ b/include/standard-headers/linux/virtio_net.h @@ -0,0 +1,245 @@ +#ifndef _LINUX_VIRTIO_NET_H +#define _LINUX_VIRTIO_NET_H +/* This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ +#include "standard-headers/linux/types.h" +#include "standard-headers/linux/virtio_ids.h" +#include "standard-headers/linux/virtio_config.h" +#include "standard-headers/linux/virtio_types.h" +#include "standard-headers/linux/if_ether.h" + +/* The feature bitmap for virtio net */ +#define VIRTIO_NET_F_CSUM	0	/* Host handles pkts w/ partial csum */ +#define VIRTIO_NET_F_GUEST_CSUM	1	/* Guest handles pkts w/ partial csum */ +#define VIRTIO_NET_F_CTRL_GUEST_OFFLOADS 2 /* Dynamic offload configuration. */ +#define VIRTIO_NET_F_MAC	5	/* Host has given MAC address. */ +#define VIRTIO_NET_F_GUEST_TSO4	7	/* Guest can handle TSOv4 in. */ +#define VIRTIO_NET_F_GUEST_TSO6	8	/* Guest can handle TSOv6 in. */ +#define VIRTIO_NET_F_GUEST_ECN	9	/* Guest can handle TSO[6] w/ ECN in. */ +#define VIRTIO_NET_F_GUEST_UFO	10	/* Guest can handle UFO in. */ +#define VIRTIO_NET_F_HOST_TSO4	11	/* Host can handle TSOv4 in. */ +#define VIRTIO_NET_F_HOST_TSO6	12	/* Host can handle TSOv6 in. */ +#define VIRTIO_NET_F_HOST_ECN	13	/* Host can handle TSO[6] w/ ECN in. */ +#define VIRTIO_NET_F_HOST_UFO	14	/* Host can handle UFO in. */ +#define VIRTIO_NET_F_MRG_RXBUF	15	/* Host can merge receive buffers. */ +#define VIRTIO_NET_F_STATUS	16	/* virtio_net_config.status available */ +#define VIRTIO_NET_F_CTRL_VQ	17	/* Control channel available */ +#define VIRTIO_NET_F_CTRL_RX	18	/* Control channel RX mode support */ +#define VIRTIO_NET_F_CTRL_VLAN	19	/* Control channel VLAN filtering */ +#define VIRTIO_NET_F_CTRL_RX_EXTRA 20	/* Extra RX mode control support */ +#define VIRTIO_NET_F_GUEST_ANNOUNCE 21	/* Guest can announce device on the +					 * network */ +#define VIRTIO_NET_F_MQ	22	/* Device supports Receive Flow +					 * Steering */ +#define VIRTIO_NET_F_CTRL_MAC_ADDR 23	/* Set MAC address */ + +#ifndef VIRTIO_NET_NO_LEGACY +#define VIRTIO_NET_F_GSO	6	/* Host handles pkts w/ any GSO type */ +#endif /* VIRTIO_NET_NO_LEGACY */ + +#define VIRTIO_NET_S_LINK_UP	1	/* Link is up */ +#define VIRTIO_NET_S_ANNOUNCE	2	/* Announcement is needed */ + +struct virtio_net_config { +	/* The config defining mac address (if VIRTIO_NET_F_MAC) */ +	uint8_t mac[ETH_ALEN]; +	/* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */ +	uint16_t status; +	/* Maximum number of each of transmit and receive queues; +	 * see VIRTIO_NET_F_MQ and VIRTIO_NET_CTRL_MQ. +	 * Legal values are between 1 and 0x8000 +	 */ +	uint16_t max_virtqueue_pairs; +} QEMU_PACKED; + +/* + * This header comes first in the scatter-gather list.  If you don't + * specify GSO or CSUM features, you can simply ignore the header. + * + * This is bitwise-equivalent to the legacy struct virtio_net_hdr_mrg_rxbuf, + * only flattened. + */ +struct virtio_net_hdr_v1 { +#define VIRTIO_NET_HDR_F_NEEDS_CSUM	1	/* Use csum_start, csum_offset */ +#define VIRTIO_NET_HDR_F_DATA_VALID	2	/* Csum is valid */ +	uint8_t flags; +#define VIRTIO_NET_HDR_GSO_NONE		0	/* Not a GSO frame */ +#define VIRTIO_NET_HDR_GSO_TCPV4	1	/* GSO frame, IPv4 TCP (TSO) */ +#define VIRTIO_NET_HDR_GSO_UDP		3	/* GSO frame, IPv4 UDP (UFO) */ +#define VIRTIO_NET_HDR_GSO_TCPV6	4	/* GSO frame, IPv6 TCP */ +#define VIRTIO_NET_HDR_GSO_ECN		0x80	/* TCP has ECN set */ +	uint8_t gso_type; +	__virtio16 hdr_len;	/* Ethernet + IP + tcp/udp hdrs */ +	__virtio16 gso_size;	/* Bytes to append to hdr_len per frame */ +	__virtio16 csum_start;	/* Position to start checksumming from */ +	__virtio16 csum_offset;	/* Offset after that to place checksum */ +	__virtio16 num_buffers;	/* Number of merged rx buffers */ +}; + +#ifndef VIRTIO_NET_NO_LEGACY +/* This header comes first in the scatter-gather list. + * For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated, it must + * be the first element of the scatter-gather list.  If you don't + * specify GSO or CSUM features, you can simply ignore the header. */ +struct virtio_net_hdr { +	/* See VIRTIO_NET_HDR_F_* */ +	uint8_t flags; +	/* See VIRTIO_NET_HDR_GSO_* */ +	uint8_t gso_type; +	__virtio16 hdr_len;		/* Ethernet + IP + tcp/udp hdrs */ +	__virtio16 gso_size;		/* Bytes to append to hdr_len per frame */ +	__virtio16 csum_start;	/* Position to start checksumming from */ +	__virtio16 csum_offset;	/* Offset after that to place checksum */ +}; + +/* This is the version of the header to use when the MRG_RXBUF + * feature has been negotiated. */ +struct virtio_net_hdr_mrg_rxbuf { +	struct virtio_net_hdr hdr; +	__virtio16 num_buffers;	/* Number of merged rx buffers */ +}; +#endif /* ...VIRTIO_NET_NO_LEGACY */ + +/* + * Control virtqueue data structures + * + * The control virtqueue expects a header in the first sg entry + * and an ack/status response in the last entry.  Data for the + * command goes in between. + */ +struct virtio_net_ctrl_hdr { +	uint8_t class; +	uint8_t cmd; +} QEMU_PACKED; + +typedef uint8_t virtio_net_ctrl_ack; + +#define VIRTIO_NET_OK     0 +#define VIRTIO_NET_ERR    1 + +/* + * Control the RX mode, ie. promisucous, allmulti, etc... + * All commands require an "out" sg entry containing a 1 byte + * state value, zero = disable, non-zero = enable.  Commands + * 0 and 1 are supported with the VIRTIO_NET_F_CTRL_RX feature. + * Commands 2-5 are added with VIRTIO_NET_F_CTRL_RX_EXTRA. + */ +#define VIRTIO_NET_CTRL_RX    0 + #define VIRTIO_NET_CTRL_RX_PROMISC      0 + #define VIRTIO_NET_CTRL_RX_ALLMULTI     1 + #define VIRTIO_NET_CTRL_RX_ALLUNI       2 + #define VIRTIO_NET_CTRL_RX_NOMULTI      3 + #define VIRTIO_NET_CTRL_RX_NOUNI        4 + #define VIRTIO_NET_CTRL_RX_NOBCAST      5 + +/* + * Control the MAC + * + * The MAC filter table is managed by the hypervisor, the guest should + * assume the size is infinite.  Filtering should be considered + * non-perfect, ie. based on hypervisor resources, the guest may + * received packets from sources not specified in the filter list. + * + * In addition to the class/cmd header, the TABLE_SET command requires + * two out scatterlists.  Each contains a 4 byte count of entries followed + * by a concatenated byte stream of the ETH_ALEN MAC addresses.  The + * first sg list contains unicast addresses, the second is for multicast. + * This functionality is present if the VIRTIO_NET_F_CTRL_RX feature + * is available. + * + * The ADDR_SET command requests one out scatterlist, it contains a + * 6 bytes MAC address. This functionality is present if the + * VIRTIO_NET_F_CTRL_MAC_ADDR feature is available. + */ +struct virtio_net_ctrl_mac { +	__virtio32 entries; +	uint8_t macs[][ETH_ALEN]; +} QEMU_PACKED; + +#define VIRTIO_NET_CTRL_MAC    1 + #define VIRTIO_NET_CTRL_MAC_TABLE_SET        0 + #define VIRTIO_NET_CTRL_MAC_ADDR_SET         1 + +/* + * Control VLAN filtering + * + * The VLAN filter table is controlled via a simple ADD/DEL interface. + * VLAN IDs not added may be filterd by the hypervisor.  Del is the + * opposite of add.  Both commands expect an out entry containing a 2 + * byte VLAN ID.  VLAN filterting is available with the + * VIRTIO_NET_F_CTRL_VLAN feature bit. + */ +#define VIRTIO_NET_CTRL_VLAN       2 + #define VIRTIO_NET_CTRL_VLAN_ADD             0 + #define VIRTIO_NET_CTRL_VLAN_DEL             1 + +/* + * Control link announce acknowledgement + * + * The command VIRTIO_NET_CTRL_ANNOUNCE_ACK is used to indicate that + * driver has recevied the notification; device would clear the + * VIRTIO_NET_S_ANNOUNCE bit in the status field after it receives + * this command. + */ +#define VIRTIO_NET_CTRL_ANNOUNCE       3 + #define VIRTIO_NET_CTRL_ANNOUNCE_ACK         0 + +/* + * Control Receive Flow Steering + * + * The command VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET + * enables Receive Flow Steering, specifying the number of the transmit and + * receive queues that will be used. After the command is consumed and acked by + * the device, the device will not steer new packets on receive virtqueues + * other than specified nor read from transmit virtqueues other than specified. + * Accordingly, driver should not transmit new packets  on virtqueues other than + * specified. + */ +struct virtio_net_ctrl_mq { +	__virtio16 virtqueue_pairs; +}; + +#define VIRTIO_NET_CTRL_MQ   4 + #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET        0 + #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN        1 + #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX        0x8000 + +/* + * Control network offloads + * + * Reconfigures the network offloads that Guest can handle. + * + * Available with the VIRTIO_NET_F_CTRL_GUEST_OFFLOADS feature bit. + * + * Command data format matches the feature bit mask exactly. + * + * See VIRTIO_NET_F_GUEST_* for the list of offloads + * that can be enabled/disabled. + */ +#define VIRTIO_NET_CTRL_GUEST_OFFLOADS   5 +#define VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET        0 + +#endif /* _LINUX_VIRTIO_NET_H */ diff --git a/include/standard-headers/linux/virtio_pci.h b/include/standard-headers/linux/virtio_pci.h new file mode 100644 index 00000000..9262acd1 --- /dev/null +++ b/include/standard-headers/linux/virtio_pci.h @@ -0,0 +1,199 @@ +/* + * Virtio PCI driver + * + * This module allows virtio devices to be used over a virtual PCI device. + * This can be used with QEMU based VMMs like KVM or Xen. + * + * Copyright IBM Corp. 2007 + * + * Authors: + *  Anthony Liguori  <aliguori@us.ibm.com> + * + * This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _LINUX_VIRTIO_PCI_H +#define _LINUX_VIRTIO_PCI_H + +#include "standard-headers/linux/types.h" + +#ifndef VIRTIO_PCI_NO_LEGACY + +/* A 32-bit r/o bitmask of the features supported by the host */ +#define VIRTIO_PCI_HOST_FEATURES	0 + +/* A 32-bit r/w bitmask of features activated by the guest */ +#define VIRTIO_PCI_GUEST_FEATURES	4 + +/* A 32-bit r/w PFN for the currently selected queue */ +#define VIRTIO_PCI_QUEUE_PFN		8 + +/* A 16-bit r/o queue size for the currently selected queue */ +#define VIRTIO_PCI_QUEUE_NUM		12 + +/* A 16-bit r/w queue selector */ +#define VIRTIO_PCI_QUEUE_SEL		14 + +/* A 16-bit r/w queue notifier */ +#define VIRTIO_PCI_QUEUE_NOTIFY		16 + +/* An 8-bit device status register.  */ +#define VIRTIO_PCI_STATUS		18 + +/* An 8-bit r/o interrupt status register.  Reading the value will return the + * current contents of the ISR and will also clear it.  This is effectively + * a read-and-acknowledge. */ +#define VIRTIO_PCI_ISR			19 + +/* MSI-X registers: only enabled if MSI-X is enabled. */ +/* A 16-bit vector for configuration changes. */ +#define VIRTIO_MSI_CONFIG_VECTOR        20 +/* A 16-bit vector for selected queue notifications. */ +#define VIRTIO_MSI_QUEUE_VECTOR         22 + +/* The remaining space is defined by each driver as the per-driver + * configuration space */ +#define VIRTIO_PCI_CONFIG_OFF(msix_enabled)	((msix_enabled) ? 24 : 20) +/* Deprecated: please use VIRTIO_PCI_CONFIG_OFF instead */ +#define VIRTIO_PCI_CONFIG(dev)	VIRTIO_PCI_CONFIG_OFF((dev)->msix_enabled) + +/* Virtio ABI version, this must match exactly */ +#define VIRTIO_PCI_ABI_VERSION		0 + +/* How many bits to shift physical queue address written to QUEUE_PFN. + * 12 is historical, and due to x86 page size. */ +#define VIRTIO_PCI_QUEUE_ADDR_SHIFT	12 + +/* The alignment to use between consumer and producer parts of vring. + * x86 pagesize again. */ +#define VIRTIO_PCI_VRING_ALIGN		4096 + +#endif /* VIRTIO_PCI_NO_LEGACY */ + +/* The bit of the ISR which indicates a device configuration change. */ +#define VIRTIO_PCI_ISR_CONFIG		0x2 +/* Vector value used to disable MSI for queue */ +#define VIRTIO_MSI_NO_VECTOR            0xffff + +#ifndef VIRTIO_PCI_NO_MODERN + +/* IDs for different capabilities.  Must all exist. */ + +/* Common configuration */ +#define VIRTIO_PCI_CAP_COMMON_CFG	1 +/* Notifications */ +#define VIRTIO_PCI_CAP_NOTIFY_CFG	2 +/* ISR access */ +#define VIRTIO_PCI_CAP_ISR_CFG		3 +/* Device specific configuration */ +#define VIRTIO_PCI_CAP_DEVICE_CFG	4 +/* PCI configuration access */ +#define VIRTIO_PCI_CAP_PCI_CFG		5 + +/* This is the PCI capability header: */ +struct virtio_pci_cap { +	uint8_t cap_vndr;		/* Generic PCI field: PCI_CAP_ID_VNDR */ +	uint8_t cap_next;		/* Generic PCI field: next ptr. */ +	uint8_t cap_len;		/* Generic PCI field: capability length */ +	uint8_t cfg_type;		/* Identifies the structure. */ +	uint8_t bar;		/* Where to find it. */ +	uint8_t padding[3];	/* Pad to full dword. */ +	uint32_t offset;		/* Offset within bar. */ +	uint32_t length;		/* Length of the structure, in bytes. */ +}; + +struct virtio_pci_notify_cap { +	struct virtio_pci_cap cap; +	uint32_t notify_off_multiplier;	/* Multiplier for queue_notify_off. */ +}; + +/* Fields in VIRTIO_PCI_CAP_COMMON_CFG: */ +struct virtio_pci_common_cfg { +	/* About the whole device. */ +	uint32_t device_feature_select;	/* read-write */ +	uint32_t device_feature;		/* read-only */ +	uint32_t guest_feature_select;	/* read-write */ +	uint32_t guest_feature;		/* read-write */ +	uint16_t msix_config;		/* read-write */ +	uint16_t num_queues;		/* read-only */ +	uint8_t device_status;		/* read-write */ +	uint8_t config_generation;		/* read-only */ + +	/* About a specific virtqueue. */ +	uint16_t queue_select;		/* read-write */ +	uint16_t queue_size;		/* read-write, power of 2. */ +	uint16_t queue_msix_vector;	/* read-write */ +	uint16_t queue_enable;		/* read-write */ +	uint16_t queue_notify_off;	/* read-only */ +	uint32_t queue_desc_lo;		/* read-write */ +	uint32_t queue_desc_hi;		/* read-write */ +	uint32_t queue_avail_lo;		/* read-write */ +	uint32_t queue_avail_hi;		/* read-write */ +	uint32_t queue_used_lo;		/* read-write */ +	uint32_t queue_used_hi;		/* read-write */ +}; + +/* Fields in VIRTIO_PCI_CAP_PCI_CFG: */ +struct virtio_pci_cfg_cap { +	struct virtio_pci_cap cap; +	uint8_t pci_cfg_data[4]; /* Data for BAR access. */ +}; + +/* Macro versions of offsets for the Old Timers! */ +#define VIRTIO_PCI_CAP_VNDR		0 +#define VIRTIO_PCI_CAP_NEXT		1 +#define VIRTIO_PCI_CAP_LEN		2 +#define VIRTIO_PCI_CAP_CFG_TYPE		3 +#define VIRTIO_PCI_CAP_BAR		4 +#define VIRTIO_PCI_CAP_OFFSET		8 +#define VIRTIO_PCI_CAP_LENGTH		12 + +#define VIRTIO_PCI_NOTIFY_CAP_MULT	16 + +#define VIRTIO_PCI_COMMON_DFSELECT	0 +#define VIRTIO_PCI_COMMON_DF		4 +#define VIRTIO_PCI_COMMON_GFSELECT	8 +#define VIRTIO_PCI_COMMON_GF		12 +#define VIRTIO_PCI_COMMON_MSIX		16 +#define VIRTIO_PCI_COMMON_NUMQ		18 +#define VIRTIO_PCI_COMMON_STATUS	20 +#define VIRTIO_PCI_COMMON_CFGGENERATION	21 +#define VIRTIO_PCI_COMMON_Q_SELECT	22 +#define VIRTIO_PCI_COMMON_Q_SIZE	24 +#define VIRTIO_PCI_COMMON_Q_MSIX	26 +#define VIRTIO_PCI_COMMON_Q_ENABLE	28 +#define VIRTIO_PCI_COMMON_Q_NOFF	30 +#define VIRTIO_PCI_COMMON_Q_DESCLO	32 +#define VIRTIO_PCI_COMMON_Q_DESCHI	36 +#define VIRTIO_PCI_COMMON_Q_AVAILLO	40 +#define VIRTIO_PCI_COMMON_Q_AVAILHI	44 +#define VIRTIO_PCI_COMMON_Q_USEDLO	48 +#define VIRTIO_PCI_COMMON_Q_USEDHI	52 + +#endif /* VIRTIO_PCI_NO_MODERN */ + +#endif diff --git a/include/standard-headers/linux/virtio_ring.h b/include/standard-headers/linux/virtio_ring.h new file mode 100644 index 00000000..6fe276fa --- /dev/null +++ b/include/standard-headers/linux/virtio_ring.h @@ -0,0 +1,171 @@ +#ifndef _LINUX_VIRTIO_RING_H +#define _LINUX_VIRTIO_RING_H +/* An interface for efficient virtio implementation, currently for use by KVM + * and lguest, but hopefully others soon.  Do NOT change this since it will + * break existing servers and clients. + * + * This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Copyright Rusty Russell IBM Corporation 2007. */ +#include "standard-headers/linux/types.h" +#include "standard-headers/linux/virtio_types.h" + +/* This marks a buffer as continuing via the next field. */ +#define VRING_DESC_F_NEXT	1 +/* This marks a buffer as write-only (otherwise read-only). */ +#define VRING_DESC_F_WRITE	2 +/* This means the buffer contains a list of buffer descriptors. */ +#define VRING_DESC_F_INDIRECT	4 + +/* The Host uses this in used->flags to advise the Guest: don't kick me when + * you add a buffer.  It's unreliable, so it's simply an optimization.  Guest + * will still kick if it's out of buffers. */ +#define VRING_USED_F_NO_NOTIFY	1 +/* The Guest uses this in avail->flags to advise the Host: don't interrupt me + * when you consume a buffer.  It's unreliable, so it's simply an + * optimization.  */ +#define VRING_AVAIL_F_NO_INTERRUPT	1 + +/* We support indirect buffer descriptors */ +#define VIRTIO_RING_F_INDIRECT_DESC	28 + +/* The Guest publishes the used index for which it expects an interrupt + * at the end of the avail ring. Host should ignore the avail->flags field. */ +/* The Host publishes the avail index for which it expects a kick + * at the end of the used ring. Guest should ignore the used->flags field. */ +#define VIRTIO_RING_F_EVENT_IDX		29 + +/* Virtio ring descriptors: 16 bytes.  These can chain together via "next". */ +struct vring_desc { +	/* Address (guest-physical). */ +	__virtio64 addr; +	/* Length. */ +	__virtio32 len; +	/* The flags as indicated above. */ +	__virtio16 flags; +	/* We chain unused descriptors via this, too */ +	__virtio16 next; +}; + +struct vring_avail { +	__virtio16 flags; +	__virtio16 idx; +	__virtio16 ring[]; +}; + +/* u32 is used here for ids for padding reasons. */ +struct vring_used_elem { +	/* Index of start of used descriptor chain. */ +	__virtio32 id; +	/* Total length of the descriptor chain which was used (written to) */ +	__virtio32 len; +}; + +struct vring_used { +	__virtio16 flags; +	__virtio16 idx; +	struct vring_used_elem ring[]; +}; + +struct vring { +	unsigned int num; + +	struct vring_desc *desc; + +	struct vring_avail *avail; + +	struct vring_used *used; +}; + +/* Alignment requirements for vring elements. + * When using pre-virtio 1.0 layout, these fall out naturally. + */ +#define VRING_AVAIL_ALIGN_SIZE 2 +#define VRING_USED_ALIGN_SIZE 4 +#define VRING_DESC_ALIGN_SIZE 16 + +/* The standard layout for the ring is a continuous chunk of memory which looks + * like this.  We assume num is a power of 2. + * + * struct vring + * { + *	// The actual descriptors (16 bytes each) + *	struct vring_desc desc[num]; + * + *	// A ring of available descriptor heads with free-running index. + *	__virtio16 avail_flags; + *	__virtio16 avail_idx; + *	__virtio16 available[num]; + *	__virtio16 used_event_idx; + * + *	// Padding to the next align boundary. + *	char pad[]; + * + *	// A ring of used descriptor heads with free-running index. + *	__virtio16 used_flags; + *	__virtio16 used_idx; + *	struct vring_used_elem used[num]; + *	__virtio16 avail_event_idx; + * }; + */ +/* We publish the used event index at the end of the available ring, and vice + * versa. They are at the end for backwards compatibility. */ +#define vring_used_event(vr) ((vr)->avail->ring[(vr)->num]) +#define vring_avail_event(vr) (*(__virtio16 *)&(vr)->used->ring[(vr)->num]) + +static inline void vring_init(struct vring *vr, unsigned int num, void *p, +			      unsigned long align) +{ +	vr->num = num; +	vr->desc = p; +	vr->avail = p + num*sizeof(struct vring_desc); +	vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + sizeof(__virtio16) +		+ align-1) & ~(align - 1)); +} + +static inline unsigned vring_size(unsigned int num, unsigned long align) +{ +	return ((sizeof(struct vring_desc) * num + sizeof(__virtio16) * (3 + num) +		 + align - 1) & ~(align - 1)) +		+ sizeof(__virtio16) * 3 + sizeof(struct vring_used_elem) * num; +} + +/* The following is used with USED_EVENT_IDX and AVAIL_EVENT_IDX */ +/* Assuming a given event_idx value from the other side, if + * we have just incremented index from old to new_idx, + * should we trigger an event? */ +static inline int vring_need_event(uint16_t event_idx, uint16_t new_idx, uint16_t old) +{ +	/* Note: Xen has similar logic for notification hold-off +	 * in include/xen/interface/io/ring.h with req_event and req_prod +	 * corresponding to event_idx + 1 and new_idx respectively. +	 * Note also that req_event and req_prod in Xen start at 1, +	 * event indexes in virtio start at 0. */ +	return (uint16_t)(new_idx - event_idx - 1) < (uint16_t)(new_idx - old); +} + +#endif /* _LINUX_VIRTIO_RING_H */ diff --git a/include/standard-headers/linux/virtio_rng.h b/include/standard-headers/linux/virtio_rng.h new file mode 100644 index 00000000..60fc798b --- /dev/null +++ b/include/standard-headers/linux/virtio_rng.h @@ -0,0 +1,8 @@ +#ifndef _LINUX_VIRTIO_RNG_H +#define _LINUX_VIRTIO_RNG_H +/* This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. */ +#include "standard-headers/linux/virtio_ids.h" +#include "standard-headers/linux/virtio_config.h" + +#endif /* _LINUX_VIRTIO_RNG_H */ diff --git a/include/standard-headers/linux/virtio_scsi.h b/include/standard-headers/linux/virtio_scsi.h new file mode 100644 index 00000000..ab66166b --- /dev/null +++ b/include/standard-headers/linux/virtio_scsi.h @@ -0,0 +1,172 @@ +/* + * This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _LINUX_VIRTIO_SCSI_H +#define _LINUX_VIRTIO_SCSI_H + +#include "standard-headers/linux/virtio_types.h" + +/* Default values of the CDB and sense data size configuration fields */ +#define VIRTIO_SCSI_CDB_DEFAULT_SIZE   32 +#define VIRTIO_SCSI_SENSE_DEFAULT_SIZE 96 + +#ifndef VIRTIO_SCSI_CDB_SIZE +#define VIRTIO_SCSI_CDB_SIZE VIRTIO_SCSI_CDB_DEFAULT_SIZE +#endif +#ifndef VIRTIO_SCSI_SENSE_SIZE +#define VIRTIO_SCSI_SENSE_SIZE VIRTIO_SCSI_SENSE_DEFAULT_SIZE +#endif + +/* SCSI command request, followed by data-out */ +struct virtio_scsi_cmd_req { +	uint8_t lun[8];		/* Logical Unit Number */ +	__virtio64 tag;		/* Command identifier */ +	uint8_t task_attr;		/* Task attribute */ +	uint8_t prio;		/* SAM command priority field */ +	uint8_t crn; +	uint8_t cdb[VIRTIO_SCSI_CDB_SIZE]; +} QEMU_PACKED; + +/* SCSI command request, followed by protection information */ +struct virtio_scsi_cmd_req_pi { +	uint8_t lun[8];		/* Logical Unit Number */ +	__virtio64 tag;		/* Command identifier */ +	uint8_t task_attr;		/* Task attribute */ +	uint8_t prio;		/* SAM command priority field */ +	uint8_t crn; +	__virtio32 pi_bytesout;	/* DataOUT PI Number of bytes */ +	__virtio32 pi_bytesin;		/* DataIN PI Number of bytes */ +	uint8_t cdb[VIRTIO_SCSI_CDB_SIZE]; +} QEMU_PACKED; + +/* Response, followed by sense data and data-in */ +struct virtio_scsi_cmd_resp { +	__virtio32 sense_len;		/* Sense data length */ +	__virtio32 resid;		/* Residual bytes in data buffer */ +	__virtio16 status_qualifier;	/* Status qualifier */ +	uint8_t status;		/* Command completion status */ +	uint8_t response;		/* Response values */ +	uint8_t sense[VIRTIO_SCSI_SENSE_SIZE]; +} QEMU_PACKED; + +/* Task Management Request */ +struct virtio_scsi_ctrl_tmf_req { +	__virtio32 type; +	__virtio32 subtype; +	uint8_t lun[8]; +	__virtio64 tag; +} QEMU_PACKED; + +struct virtio_scsi_ctrl_tmf_resp { +	uint8_t response; +} QEMU_PACKED; + +/* Asynchronous notification query/subscription */ +struct virtio_scsi_ctrl_an_req { +	__virtio32 type; +	uint8_t lun[8]; +	__virtio32 event_requested; +} QEMU_PACKED; + +struct virtio_scsi_ctrl_an_resp { +	__virtio32 event_actual; +	uint8_t response; +} QEMU_PACKED; + +struct virtio_scsi_event { +	__virtio32 event; +	uint8_t lun[8]; +	__virtio32 reason; +} QEMU_PACKED; + +struct virtio_scsi_config { +	uint32_t num_queues; +	uint32_t seg_max; +	uint32_t max_sectors; +	uint32_t cmd_per_lun; +	uint32_t event_info_size; +	uint32_t sense_size; +	uint32_t cdb_size; +	uint16_t max_channel; +	uint16_t max_target; +	uint32_t max_lun; +} QEMU_PACKED; + +/* Feature Bits */ +#define VIRTIO_SCSI_F_INOUT                    0 +#define VIRTIO_SCSI_F_HOTPLUG                  1 +#define VIRTIO_SCSI_F_CHANGE                   2 +#define VIRTIO_SCSI_F_T10_PI                   3 + +/* Response codes */ +#define VIRTIO_SCSI_S_OK                       0 +#define VIRTIO_SCSI_S_OVERRUN                  1 +#define VIRTIO_SCSI_S_ABORTED                  2 +#define VIRTIO_SCSI_S_BAD_TARGET               3 +#define VIRTIO_SCSI_S_RESET                    4 +#define VIRTIO_SCSI_S_BUSY                     5 +#define VIRTIO_SCSI_S_TRANSPORT_FAILURE        6 +#define VIRTIO_SCSI_S_TARGET_FAILURE           7 +#define VIRTIO_SCSI_S_NEXUS_FAILURE            8 +#define VIRTIO_SCSI_S_FAILURE                  9 +#define VIRTIO_SCSI_S_FUNCTION_SUCCEEDED       10 +#define VIRTIO_SCSI_S_FUNCTION_REJECTED        11 +#define VIRTIO_SCSI_S_INCORRECT_LUN            12 + +/* Controlq type codes.  */ +#define VIRTIO_SCSI_T_TMF                      0 +#define VIRTIO_SCSI_T_AN_QUERY                 1 +#define VIRTIO_SCSI_T_AN_SUBSCRIBE             2 + +/* Valid TMF subtypes.  */ +#define VIRTIO_SCSI_T_TMF_ABORT_TASK           0 +#define VIRTIO_SCSI_T_TMF_ABORT_TASK_SET       1 +#define VIRTIO_SCSI_T_TMF_CLEAR_ACA            2 +#define VIRTIO_SCSI_T_TMF_CLEAR_TASK_SET       3 +#define VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET      4 +#define VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET   5 +#define VIRTIO_SCSI_T_TMF_QUERY_TASK           6 +#define VIRTIO_SCSI_T_TMF_QUERY_TASK_SET       7 + +/* Events.  */ +#define VIRTIO_SCSI_T_EVENTS_MISSED            0x80000000 +#define VIRTIO_SCSI_T_NO_EVENT                 0 +#define VIRTIO_SCSI_T_TRANSPORT_RESET          1 +#define VIRTIO_SCSI_T_ASYNC_NOTIFY             2 +#define VIRTIO_SCSI_T_PARAM_CHANGE             3 + +/* Reasons of transport reset event */ +#define VIRTIO_SCSI_EVT_RESET_HARD             0 +#define VIRTIO_SCSI_EVT_RESET_RESCAN           1 +#define VIRTIO_SCSI_EVT_RESET_REMOVED          2 + +#define VIRTIO_SCSI_S_SIMPLE                   0 +#define VIRTIO_SCSI_S_ORDERED                  1 +#define VIRTIO_SCSI_S_HEAD                     2 +#define VIRTIO_SCSI_S_ACA                      3 + + +#endif /* _LINUX_VIRTIO_SCSI_H */ diff --git a/include/standard-headers/linux/virtio_types.h b/include/standard-headers/linux/virtio_types.h new file mode 100644 index 00000000..fd0d3511 --- /dev/null +++ b/include/standard-headers/linux/virtio_types.h @@ -0,0 +1,46 @@ +#ifndef _LINUX_VIRTIO_TYPES_H +#define _LINUX_VIRTIO_TYPES_H +/* Type definitions for virtio implementations. + * + * This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of IBM nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Copyright (C) 2014 Red Hat, Inc. + * Author: Michael S. Tsirkin <mst@redhat.com> + */ +#include "standard-headers/linux/types.h" + +/* + * __virtio{16,32,64} have the following meaning: + * - __u{16,32,64} for virtio devices in legacy mode, accessed in native endian + * - __le{16,32,64} for standard-compliant virtio devices + */ + +typedef uint16_t  __virtio16; +typedef uint32_t  __virtio32; +typedef uint64_t  __virtio64; + +#endif /* _LINUX_VIRTIO_TYPES_H */  | 
