2
#include <linux/module.h>
3
#include <linux/kernel.h>
4
#include <linux/compiler.h>
6
#include <linux/init.h>
7
#include <linux/ioport.h>
8
#include <linux/completion.h>
9
#include <linux/interrupt.h>
11
#include <asm/uaccess.h>
14
#define HYPERCALL_DRIVER_NAME "Qumranet_hypercall_driver"
15
#define HYPERCALL_DRIVER_VERSION "1"
16
#define PCI_VENDOR_ID_HYPERCALL 0x5002
17
#define PCI_DEVICE_ID_HYPERCALL 0x2258
19
MODULE_AUTHOR ("Dor Laor <dor.laor@qumranet.com>");
20
MODULE_DESCRIPTION (HYPERCALL_DRIVER_NAME);
21
MODULE_LICENSE("GPL");
22
MODULE_VERSION(HYPERCALL_DRIVER_VERSION);
25
module_param(debug, int, 0);
26
MODULE_PARM_DESC (debug, "toggle debug flag");
28
#define HYPERCALL_DEBUG 1
30
# define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args)
31
# define assert(expr) \
32
if(unlikely(!(expr))) { \
33
printk(KERN_ERR "Assertion failed! %s,%s,%s,line=%d\n", \
34
#expr,__FILE__,__FUNCTION__,__LINE__); \
37
# define DPRINTK(fmt, args...)
38
# define assert(expr) do {} while (0)
41
static struct pci_device_id hypercall_pci_tbl[] = {
42
{PCI_VENDOR_ID_HYPERCALL, PCI_DEVICE_ID_HYPERCALL, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
45
MODULE_DEVICE_TABLE (pci, hypercall_pci_tbl);
49
/****** Hypercall device definitions ***************/
50
#include <qemu/hw/hypercall.h>
52
/* read PIO/MMIO register */
53
#define HIO_READ8(reg, ioaddr) ioread8(ioaddr + (reg))
54
#define HIO_READ16(reg, ioaddr) ioread16(ioaddr + (reg))
55
#define HIO_READ32(reg, ioaddr) ioread32(ioaddr + (reg))
57
/* write PIO/MMIO register */
58
#define HIO_WRITE8(reg, val8, ioaddr) iowrite8((val8), ioaddr + (reg))
59
#define HIO_WRITE16(reg, val16, ioaddr) iowrite16((val16), ioaddr + (reg))
60
#define HIO_WRITE32(reg, val32, ioaddr) iowrite32((val32), ioaddr + (reg))
63
struct hypercall_dev {
64
struct pci_dev *pci_dev;
65
struct kobject kobject;
71
void __iomem *io_addr;
72
unsigned long base_addr; /* device I/O address */
77
static int hypercall_close(struct hypercall_dev* dev);
78
static int hypercall_open(struct hypercall_dev *dev);
79
static void hypercall_cleanup_dev(struct hypercall_dev *dev);
80
static irqreturn_t hypercall_interrupt(int irq, void *dev_instance,
81
struct pt_regs *regs);
83
static void __exit hypercall_sysfs_remove(struct hypercall_dev *dev);
84
static int hypercall_sysfs_add(struct hypercall_dev *dev);
87
static int __devinit hypercall_init_board(struct pci_dev *pdev,
88
struct hypercall_dev **dev_out)
91
struct hypercall_dev *dev;
93
u32 disable_dev_on_err = 0;
94
unsigned long pio_start, pio_end, pio_flags, pio_len;
95
unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;
101
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
103
printk (KERN_ERR "%s: Unable to alloc hypercall device\n", pci_name(pdev));
107
rc = pci_enable_device(pdev);
110
disable_dev_on_err = 1;
112
pio_start = pci_resource_start (pdev, 0);
113
pio_end = pci_resource_end (pdev, 0);
114
pio_flags = pci_resource_flags (pdev, 0);
115
pio_len = pci_resource_len (pdev, 0);
117
mmio_start = pci_resource_start (pdev, 1);
118
mmio_end = pci_resource_end (pdev, 1);
119
mmio_flags = pci_resource_flags (pdev, 1);
120
mmio_len = pci_resource_len (pdev, 1);
122
DPRINTK("PIO region size == 0x%02lX\n", pio_len);
123
DPRINTK("MMIO region size == 0x%02lX\n", mmio_len);
125
rc = pci_request_regions (pdev, "hypercall");
131
ioaddr = (unsigned long)pci_iomap(pdev, 0, 0);
132
//ioaddr = ioport_map(pio_start, pio_len);
134
printk(KERN_ERR "%s: cannot map PIO, aborting\n", pci_name(pdev));
138
dev->base_addr = (unsigned long)pio_start;
139
dev->io_addr = (void*)ioaddr;
140
dev->regs_len = pio_len;
142
ioaddr = pci_iomap(pdev, 1, 0);
143
if (ioaddr == NULL) {
144
printk(KERN_ERR "%s: cannot remap MMIO, aborting\n", pci_name(pdev));
148
dev->base_addr = ioaddr;
149
dev->io_addr = (void*)ioaddr;
150
dev->regs_len = mmio_len;
151
#endif /* USE_IO_OPS */
157
hypercall_cleanup_dev(dev);
158
if (disable_dev_on_err)
159
pci_disable_device(pdev);
163
static int __devinit hypercall_init_one(struct pci_dev *pdev,
164
const struct pci_device_id *ent)
166
struct hypercall_dev *dev;
169
assert(pdev != NULL);
172
pci_read_config_byte(pdev, PCI_REVISION_ID, &pci_rev);
174
if (pdev->vendor == PCI_VENDOR_ID_HYPERCALL &&
175
pdev->device == PCI_DEVICE_ID_HYPERCALL) {
176
printk(KERN_INFO "pci dev %s (id %04x:%04x rev %02x) is a guest hypercall device\n",
177
pci_name(pdev), pdev->vendor, pdev->device, pci_rev);
180
if (hypercall_init_board(pdev, &dev) != 0)
185
dev->irq = pdev->irq;
187
spin_lock_init(&dev->lock);
188
pci_set_drvdata(pdev, dev);
190
printk (KERN_INFO "name=%s: base_addr=0x%lx, io_addr=0x%lx, IRQ=%d\n",
191
dev->name, dev->base_addr, (unsigned long)dev->io_addr, dev->irq);
194
if (hypercall_sysfs_add(dev) != 0)
200
static void __devexit hypercall_remove_one(struct pci_dev *pdev)
202
struct hypercall_dev *dev = pci_get_drvdata(pdev);
206
hypercall_close(dev);
207
hypercall_sysfs_remove(dev);
208
hypercall_cleanup_dev(dev);
209
pci_disable_device(pdev);
212
static int hypercall_tx(struct hypercall_dev *dev, unsigned char *buf, size_t len)
214
void __iomem *ioaddr = (void __iomem*)dev->io_addr;
217
if (len > HP_MEM_SIZE)
220
spin_lock(&dev->lock);
221
HIO_WRITE8(HP_TXSIZE, len, ioaddr);
222
for (i=0; i< len; i++)
223
HIO_WRITE8(HP_TXBUFF, buf[i], ioaddr);
224
spin_unlock(&dev->lock);
230
* The interrupt handler does all of the rx work and cleans up
233
static irqreturn_t hypercall_interrupt(int irq, void *dev_instance,
234
struct pt_regs *regs)
236
struct hypercall_dev *dev = (struct hypercall_dev *)dev_instance;
237
void __iomem *ioaddr = (void __iomem*)dev->io_addr;
239
int irq_handled = IRQ_NONE;
242
u8 buffer[HP_MEM_SIZE];
245
DPRINTK("base addr is 0x%lx, io_addr=0x%lx\n", dev->base_addr, (long)dev->io_addr);
247
spin_lock(&dev->lock);
248
status = HIO_READ8(HSR_REGISTER, ioaddr);
249
DPRINTK("irq status is 0x%x\n", status);
252
if (unlikely((status & HSR_VDR) == 0)) {
253
DPRINTK("not handeling irq, not ours\n");
257
/* Disable device interrupts */
258
HIO_WRITE8(HCR_REGISTER, HCR_DI, ioaddr);
259
DPRINTK("disable device interrupts\n");
261
rx_buf_size = HIO_READ8(HP_RXSIZE, ioaddr);
262
DPRINTK("Rx buffer size is %d\n", rx_buf_size);
264
if (rx_buf_size > HP_MEM_SIZE)
265
rx_buf_size = HP_MEM_SIZE;
267
for (i=0, pbuf=buffer; i<rx_buf_size; i++, pbuf++) {
268
*pbuf = HIO_READ8(HP_RXBUFF, ioaddr + i);
269
DPRINTK("Read 0x%x as dword %d\n", *pbuf, i);
272
DPRINTK("Read buffer %s", (char*)buffer);
274
HIO_WRITE8(HCR_REGISTER, HCR_EI, ioaddr);
275
DPRINTK("Enable interrupt\n");
276
irq_handled = IRQ_HANDLED;
278
spin_unlock(&dev->lock);
281
hypercall_tx(dev, "hello host", sizeof("hello host"));
286
static int hypercall_open(struct hypercall_dev *dev)
290
rc = request_irq(dev->irq, &hypercall_interrupt,
291
SA_SHIRQ, dev->name, dev);
293
printk(KERN_ERR "%s failed to request an irq\n", __FUNCTION__);
297
//hypercall_thread_start(dev);
302
static int hypercall_close(struct hypercall_dev* dev)
304
//hypercall_thread_stop(dev);
305
synchronize_irq(dev->irq);
306
free_irq(dev->irq, dev);
313
static int hypercall_suspend(struct pci_dev *pdev, pm_message_t state)
315
pci_save_state(pdev);
316
pci_set_power_state(pdev, PCI_D3hot);
317
DPRINTK("Power mgmt suspend, set power state to PCI_D3hot\n");
322
static int hypercall_resume(struct pci_dev *pdev)
324
pci_restore_state(pdev);
325
pci_set_power_state(pdev, PCI_D0);
326
DPRINTK("Power mgmt resume, set power state to PCI_D0\n");
331
#endif /* CONFIG_PM */
333
static void hypercall_cleanup_dev(struct hypercall_dev *dev)
335
DPRINTK("cleaning up\n");
336
pci_release_regions(dev->pci_dev);
337
pci_iounmap(dev->pci_dev, (void*)dev->io_addr);
338
pci_set_drvdata (dev->pci_dev, NULL);
342
static struct pci_driver hypercall_pci_driver = {
343
.name = HYPERCALL_DRIVER_NAME,
344
.id_table = hypercall_pci_tbl,
345
.probe = hypercall_init_one,
346
.remove = __devexit_p(hypercall_remove_one),
348
.suspend = hypercall_suspend,
349
.resume = hypercall_resume,
350
#endif /* CONFIG_PM */
353
static int __init hypercall_init_module(void)
355
printk (KERN_INFO HYPERCALL_DRIVER_NAME "\n");
356
return pci_module_init(&hypercall_pci_driver);
359
static void __exit hypercall_cleanup_module(void)
361
pci_unregister_driver(&hypercall_pci_driver);
368
struct hypercall_attribute {
369
struct attribute attr;
370
ssize_t (*show)(struct hypercall_dev*, char *buf);
371
ssize_t (*store)(struct hypercall_dev*, unsigned long val);
374
static ssize_t hypercall_attribute_show(struct kobject *kobj,
375
struct attribute *attr, char *buf)
377
struct hypercall_attribute *hypercall_attr;
378
struct hypercall_dev *hdev;
380
hypercall_attr = container_of(attr, struct hypercall_attribute, attr);
381
hdev = container_of(kobj, struct hypercall_dev, kobject);
383
if (!hypercall_attr->show)
386
return hypercall_attr->show(hdev, buf);
389
static ssize_t hypercall_attribute_store(struct kobject *kobj,
390
struct attribute *attr, const char *buf, size_t count)
392
struct hypercall_attribute *hypercall_attr;
393
struct hypercall_dev *hdev;
398
val = simple_strtoul(buf, &endp, 0);
400
hypercall_attr = container_of(attr, struct hypercall_attribute, attr);
401
hdev = container_of(kobj, struct hypercall_dev, kobject);
403
if (!hypercall_attr->store)
406
rc = hypercall_attr->store(hdev, val);
412
#define MAKE_HYPERCALL_R_ATTR(_name) \
413
static ssize_t _name##_show(struct hypercall_dev *hdev, char *buf) \
415
return sprintf(buf, "%lu\n", (unsigned long)hdev->_name); \
417
struct hypercall_attribute hypercall_attr_##_name = __ATTR_RO(_name)
419
#define MAKE_HYPERCALL_WR_ATTR(_name) \
420
static int _name##_store(struct hypercall_dev *hdev, unsigned long val) \
422
hdev->_name = (typeof(hdev->_name))val; \
425
static ssize_t _name##_show(struct hypercall_dev *hdev, char *buf) \
427
return sprintf(buf, "%lu\n", (unsigned long)hdev->_name); \
429
struct hypercall_attribute hypercall_attr_##_name = \
430
__ATTR(_name,S_IRUGO|S_IWUGO,_name##_show,_name##_store)
432
MAKE_HYPERCALL_R_ATTR(base_addr);
433
MAKE_HYPERCALL_R_ATTR(irq);
434
MAKE_HYPERCALL_WR_ATTR(cmd);
436
#define GET_HYPERCALL_ATTR(_name) (&hypercall_attr_##_name.attr)
438
static struct attribute *hypercall_default_attrs[] = {
439
GET_HYPERCALL_ATTR(base_addr),
440
GET_HYPERCALL_ATTR(irq),
441
GET_HYPERCALL_ATTR(cmd),
445
static struct sysfs_ops hypercall_sysfs_ops = {
446
.show = hypercall_attribute_show,
447
.store = hypercall_attribute_store,
450
static void hypercall_sysfs_release(struct kobject *kobj)
452
DPRINTK(" called for obj name %s\n", kobj->name);
455
static struct kobj_type hypercall_ktype = {
456
.release = hypercall_sysfs_release,
457
.sysfs_ops = &hypercall_sysfs_ops,
458
.default_attrs = hypercall_default_attrs
462
static int hypercall_sysfs_add(struct hypercall_dev *dev)
466
kobject_init(&dev->kobject);
467
dev->kobject.ktype = &hypercall_ktype;
468
rc = kobject_set_name(&dev->kobject, "%s", HYPERCALL_DRIVER_NAME);
470
printk("%s: kobject_set_name failed, err=%d\n", __FUNCTION__, rc);
474
rc = kobject_add(&dev->kobject);
476
printk("%s: kobject_add failed, err=%d\n", __FUNCTION__, rc);
480
rc = sysfs_create_link(&dev->pci_dev->dev.kobj, &dev->kobject,
481
HYPERCALL_DRIVER_NAME);
483
printk("%s: sysfs_create_link failed, err=%d\n", __FUNCTION__, rc);
484
kobject_del(&dev->kobject);
490
static void hypercall_sysfs_remove(struct hypercall_dev *dev)
492
sysfs_remove_link(&dev->pci_dev->dev.kobj, HYPERCALL_DRIVER_NAME);
493
kobject_del(&dev->kobject);
496
module_init(hypercall_init_module);
497
module_exit(hypercall_cleanup_module);