2 * Intel MIC Platform Software Stack (MPSS)
4 * Copyright(c) 2013 Intel Corporation.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License, version 2, as
8 * published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * The full GNU General Public License is included in this distribution in
16 * the file called "COPYING".
18 * Intel MIC Host driver.
20 * Global TODO's across the driver to be added after initial base
21 * patches are accepted upstream:
22 * 1) Enable DMA support.
23 * 2) Enable per vring interrupt support.
26 #include <linux/module.h>
27 #include <linux/pci.h>
28 #include <linux/poll.h>
29 #include <linux/suspend.h>
31 #include <linux/mic_common.h>
32 #include "../common/mic_dev.h"
33 #include "mic_device.h"
37 #include "mic_virtio.h"
39 static const char mic_driver_name
[] = "mic";
41 static DEFINE_PCI_DEVICE_TABLE(mic_pci_tbl
) = {
42 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_2250
)},
43 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_2251
)},
44 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_2252
)},
45 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_2253
)},
46 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_2254
)},
47 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_2255
)},
48 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_2256
)},
49 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_2257
)},
50 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_2258
)},
51 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_2259
)},
52 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_225a
)},
53 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_225b
)},
54 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_225c
)},
55 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_225d
)},
56 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, MIC_X100_PCI_DEVICE_225e
)},
58 /* required last entry */
62 MODULE_DEVICE_TABLE(pci
, mic_pci_tbl
);
64 /* ID allocator for MIC devices */
65 static struct ida g_mic_ida
;
66 /* Class of MIC devices for sysfs accessibility. */
67 static struct class *g_mic_class
;
68 /* Base device node number for MIC devices */
69 static dev_t g_mic_devno
;
71 static const struct file_operations mic_fops
= {
73 .release
= mic_release
,
74 .unlocked_ioctl
= mic_ioctl
,
80 /* Initialize the device page */
81 static int mic_dp_init(struct mic_device
*mdev
)
83 mdev
->dp
= kzalloc(MIC_DP_SIZE
, GFP_KERNEL
);
85 dev_err(mdev
->sdev
->parent
, "%s %d err %d\n",
86 __func__
, __LINE__
, -ENOMEM
);
90 mdev
->dp_dma_addr
= mic_map_single(mdev
,
91 mdev
->dp
, MIC_DP_SIZE
);
92 if (mic_map_error(mdev
->dp_dma_addr
)) {
94 dev_err(mdev
->sdev
->parent
, "%s %d err %d\n",
95 __func__
, __LINE__
, -ENOMEM
);
98 mdev
->ops
->write_spad(mdev
, MIC_DPLO_SPAD
, mdev
->dp_dma_addr
);
99 mdev
->ops
->write_spad(mdev
, MIC_DPHI_SPAD
, mdev
->dp_dma_addr
>> 32);
103 /* Uninitialize the device page */
104 static void mic_dp_uninit(struct mic_device
*mdev
)
106 mic_unmap_single(mdev
, mdev
->dp_dma_addr
, MIC_DP_SIZE
);
111 * mic_shutdown_db - Shutdown doorbell interrupt handler.
113 static irqreturn_t
mic_shutdown_db(int irq
, void *data
)
115 struct mic_device
*mdev
= data
;
116 struct mic_bootparam
*bootparam
= mdev
->dp
;
118 mdev
->ops
->intr_workarounds(mdev
);
120 switch (bootparam
->shutdown_status
) {
126 schedule_work(&mdev
->shutdown_work
);
135 * mic_ops_init: Initialize HW specific operation tables.
137 * @mdev: pointer to mic_device instance
141 static void mic_ops_init(struct mic_device
*mdev
)
143 switch (mdev
->family
) {
144 case MIC_FAMILY_X100
:
145 mdev
->ops
= &mic_x100_ops
;
146 mdev
->intr_ops
= &mic_x100_intr_ops
;
147 mdev
->smpt_ops
= &mic_x100_smpt_ops
;
155 * mic_get_family - Determine hardware family to which this MIC belongs.
157 * @pdev: The pci device structure
161 static enum mic_hw_family
mic_get_family(struct pci_dev
*pdev
)
163 enum mic_hw_family family
;
165 switch (pdev
->device
) {
166 case MIC_X100_PCI_DEVICE_2250
:
167 case MIC_X100_PCI_DEVICE_2251
:
168 case MIC_X100_PCI_DEVICE_2252
:
169 case MIC_X100_PCI_DEVICE_2253
:
170 case MIC_X100_PCI_DEVICE_2254
:
171 case MIC_X100_PCI_DEVICE_2255
:
172 case MIC_X100_PCI_DEVICE_2256
:
173 case MIC_X100_PCI_DEVICE_2257
:
174 case MIC_X100_PCI_DEVICE_2258
:
175 case MIC_X100_PCI_DEVICE_2259
:
176 case MIC_X100_PCI_DEVICE_225a
:
177 case MIC_X100_PCI_DEVICE_225b
:
178 case MIC_X100_PCI_DEVICE_225c
:
179 case MIC_X100_PCI_DEVICE_225d
:
180 case MIC_X100_PCI_DEVICE_225e
:
181 family
= MIC_FAMILY_X100
;
184 family
= MIC_FAMILY_UNKNOWN
;
191 * mic_pm_notifier: Notifier callback function that handles
194 * @notifier_block: The notifier structure.
195 * @pm_event: The event for which the driver was notified.
196 * @unused: Meaningless. Always NULL.
198 * returns NOTIFY_DONE
200 static int mic_pm_notifier(struct notifier_block
*notifier
,
201 unsigned long pm_event
, void *unused
)
203 struct mic_device
*mdev
= container_of(notifier
,
204 struct mic_device
, pm_notifier
);
207 case PM_HIBERNATION_PREPARE
:
209 case PM_SUSPEND_PREPARE
:
210 mic_prepare_suspend(mdev
);
212 case PM_POST_HIBERNATION
:
214 case PM_POST_SUSPEND
:
216 case PM_POST_RESTORE
:
217 mic_complete_resume(mdev
);
219 case PM_RESTORE_PREPARE
:
228 * mic_device_init - Allocates and initializes the MIC device structure
230 * @mdev: pointer to mic_device instance
231 * @pdev: The pci device structure
236 mic_device_init(struct mic_device
*mdev
, struct pci_dev
*pdev
)
240 mdev
->family
= mic_get_family(pdev
);
241 mdev
->stepping
= pdev
->revision
;
243 mic_sysfs_init(mdev
);
244 mutex_init(&mdev
->mic_mutex
);
245 mdev
->irq_info
.next_avail_src
= 0;
246 INIT_WORK(&mdev
->reset_trigger_work
, mic_reset_trigger_work
);
247 INIT_WORK(&mdev
->shutdown_work
, mic_shutdown_work
);
248 init_completion(&mdev
->reset_wait
);
249 INIT_LIST_HEAD(&mdev
->vdev_list
);
250 mdev
->pm_notifier
.notifier_call
= mic_pm_notifier
;
251 rc
= register_pm_notifier(&mdev
->pm_notifier
);
253 dev_err(&pdev
->dev
, "register_pm_notifier failed rc %d\n",
255 goto register_pm_notifier_fail
;
258 register_pm_notifier_fail
:
259 flush_work(&mdev
->shutdown_work
);
260 flush_work(&mdev
->reset_trigger_work
);
265 * mic_device_uninit - Frees resources allocated during mic_device_init(..)
267 * @mdev: pointer to mic_device instance
271 static void mic_device_uninit(struct mic_device
*mdev
)
273 /* The cmdline sysfs entry might have allocated cmdline */
274 kfree(mdev
->cmdline
);
275 kfree(mdev
->firmware
);
276 kfree(mdev
->ramdisk
);
277 kfree(mdev
->bootmode
);
278 flush_work(&mdev
->reset_trigger_work
);
279 flush_work(&mdev
->shutdown_work
);
280 unregister_pm_notifier(&mdev
->pm_notifier
);
284 * mic_probe - Device Initialization Routine
286 * @pdev: PCI device structure
287 * @ent: entry in mic_pci_tbl
289 * returns 0 on success, < 0 on failure.
291 static int mic_probe(struct pci_dev
*pdev
,
292 const struct pci_device_id
*ent
)
295 struct mic_device
*mdev
;
297 mdev
= kzalloc(sizeof(*mdev
), GFP_KERNEL
);
300 dev_err(&pdev
->dev
, "mdev kmalloc failed rc %d\n", rc
);
301 goto mdev_alloc_fail
;
303 mdev
->id
= ida_simple_get(&g_mic_ida
, 0, MIC_MAX_NUM_DEVS
, GFP_KERNEL
);
306 dev_err(&pdev
->dev
, "ida_simple_get failed rc %d\n", rc
);
310 rc
= mic_device_init(mdev
, pdev
);
312 dev_err(&pdev
->dev
, "mic_device_init failed rc %d\n", rc
);
313 goto device_init_fail
;
316 rc
= pci_enable_device(pdev
);
318 dev_err(&pdev
->dev
, "failed to enable pci device.\n");
322 pci_set_master(pdev
);
324 rc
= pci_request_regions(pdev
, mic_driver_name
);
326 dev_err(&pdev
->dev
, "failed to get pci regions.\n");
330 rc
= pci_set_dma_mask(pdev
, DMA_BIT_MASK(64));
332 dev_err(&pdev
->dev
, "Cannot set DMA mask\n");
333 goto release_regions
;
336 mdev
->mmio
.pa
= pci_resource_start(pdev
, mdev
->ops
->mmio_bar
);
337 mdev
->mmio
.len
= pci_resource_len(pdev
, mdev
->ops
->mmio_bar
);
338 mdev
->mmio
.va
= pci_ioremap_bar(pdev
, mdev
->ops
->mmio_bar
);
339 if (!mdev
->mmio
.va
) {
340 dev_err(&pdev
->dev
, "Cannot remap MMIO BAR\n");
342 goto release_regions
;
345 mdev
->aper
.pa
= pci_resource_start(pdev
, mdev
->ops
->aper_bar
);
346 mdev
->aper
.len
= pci_resource_len(pdev
, mdev
->ops
->aper_bar
);
347 mdev
->aper
.va
= ioremap_wc(mdev
->aper
.pa
, mdev
->aper
.len
);
348 if (!mdev
->aper
.va
) {
349 dev_err(&pdev
->dev
, "Cannot remap Aperture BAR\n");
354 mdev
->intr_ops
->intr_init(mdev
);
355 rc
= mic_setup_interrupts(mdev
, pdev
);
357 dev_err(&pdev
->dev
, "mic_setup_interrupts failed %d\n", rc
);
360 rc
= mic_smpt_init(mdev
);
362 dev_err(&pdev
->dev
, "smpt_init failed %d\n", rc
);
363 goto free_interrupts
;
366 pci_set_drvdata(pdev
, mdev
);
368 mdev
->sdev
= device_create_with_groups(g_mic_class
, &pdev
->dev
,
369 MKDEV(MAJOR(g_mic_devno
), mdev
->id
), NULL
,
370 mdev
->attr_group
, "mic%d", mdev
->id
);
371 if (IS_ERR(mdev
->sdev
)) {
372 rc
= PTR_ERR(mdev
->sdev
);
374 "device_create_with_groups failed rc %d\n", rc
);
377 mdev
->state_sysfs
= sysfs_get_dirent(mdev
->sdev
->kobj
.sd
, "state");
378 if (!mdev
->state_sysfs
) {
380 dev_err(&pdev
->dev
, "sysfs_get_dirent failed rc %d\n", rc
);
384 rc
= mic_dp_init(mdev
);
386 dev_err(&pdev
->dev
, "mic_dp_init failed rc %d\n", rc
);
389 mutex_lock(&mdev
->mic_mutex
);
391 mdev
->shutdown_db
= mic_next_db(mdev
);
392 mdev
->shutdown_cookie
= mic_request_irq(mdev
, mic_shutdown_db
,
393 "shutdown-interrupt", mdev
, mdev
->shutdown_db
, MIC_INTR_DB
);
394 if (IS_ERR(mdev
->shutdown_cookie
)) {
395 rc
= PTR_ERR(mdev
->shutdown_cookie
);
396 mutex_unlock(&mdev
->mic_mutex
);
399 mutex_unlock(&mdev
->mic_mutex
);
400 mic_bootparam_init(mdev
);
402 mic_create_debug_dir(mdev
);
403 cdev_init(&mdev
->cdev
, &mic_fops
);
404 mdev
->cdev
.owner
= THIS_MODULE
;
405 rc
= cdev_add(&mdev
->cdev
, MKDEV(MAJOR(g_mic_devno
), mdev
->id
), 1);
407 dev_err(&pdev
->dev
, "cdev_add err id %d rc %d\n", mdev
->id
, rc
);
408 goto cleanup_debug_dir
;
412 mic_delete_debug_dir(mdev
);
413 mutex_lock(&mdev
->mic_mutex
);
414 mic_free_irq(mdev
, mdev
->shutdown_cookie
, mdev
);
415 mutex_unlock(&mdev
->mic_mutex
);
419 sysfs_put(mdev
->state_sysfs
);
421 device_destroy(g_mic_class
, MKDEV(MAJOR(g_mic_devno
), mdev
->id
));
423 mic_smpt_uninit(mdev
);
425 mic_free_interrupts(mdev
, pdev
);
427 iounmap(mdev
->aper
.va
);
429 iounmap(mdev
->mmio
.va
);
431 pci_release_regions(pdev
);
433 pci_disable_device(pdev
);
435 mic_device_uninit(mdev
);
437 ida_simple_remove(&g_mic_ida
, mdev
->id
);
441 dev_err(&pdev
->dev
, "Probe failed rc %d\n", rc
);
446 * mic_remove - Device Removal Routine
447 * mic_remove is called by the PCI subsystem to alert the driver
448 * that it should release a PCI device.
450 * @pdev: PCI device structure
452 static void mic_remove(struct pci_dev
*pdev
)
454 struct mic_device
*mdev
;
456 mdev
= pci_get_drvdata(pdev
);
460 mic_stop(mdev
, false);
461 cdev_del(&mdev
->cdev
);
462 mic_delete_debug_dir(mdev
);
463 mutex_lock(&mdev
->mic_mutex
);
464 mic_free_irq(mdev
, mdev
->shutdown_cookie
, mdev
);
465 mutex_unlock(&mdev
->mic_mutex
);
466 flush_work(&mdev
->shutdown_work
);
468 sysfs_put(mdev
->state_sysfs
);
469 device_destroy(g_mic_class
, MKDEV(MAJOR(g_mic_devno
), mdev
->id
));
470 mic_smpt_uninit(mdev
);
471 mic_free_interrupts(mdev
, pdev
);
472 iounmap(mdev
->mmio
.va
);
473 iounmap(mdev
->aper
.va
);
474 mic_device_uninit(mdev
);
475 pci_release_regions(pdev
);
476 pci_disable_device(pdev
);
477 ida_simple_remove(&g_mic_ida
, mdev
->id
);
480 static struct pci_driver mic_driver
= {
481 .name
= mic_driver_name
,
482 .id_table
= mic_pci_tbl
,
487 static int __init
mic_init(void)
491 ret
= alloc_chrdev_region(&g_mic_devno
, 0,
492 MIC_MAX_NUM_DEVS
, mic_driver_name
);
494 pr_err("alloc_chrdev_region failed ret %d\n", ret
);
498 g_mic_class
= class_create(THIS_MODULE
, mic_driver_name
);
499 if (IS_ERR(g_mic_class
)) {
500 ret
= PTR_ERR(g_mic_class
);
501 pr_err("class_create failed ret %d\n", ret
);
506 ida_init(&g_mic_ida
);
507 ret
= pci_register_driver(&mic_driver
);
509 pr_err("pci_register_driver failed ret %d\n", ret
);
510 goto cleanup_debugfs
;
515 class_destroy(g_mic_class
);
517 unregister_chrdev_region(g_mic_devno
, MIC_MAX_NUM_DEVS
);
522 static void __exit
mic_exit(void)
524 pci_unregister_driver(&mic_driver
);
525 ida_destroy(&g_mic_ida
);
527 class_destroy(g_mic_class
);
528 unregister_chrdev_region(g_mic_devno
, MIC_MAX_NUM_DEVS
);
531 module_init(mic_init
);
532 module_exit(mic_exit
);
534 MODULE_AUTHOR("Intel Corporation");
535 MODULE_DESCRIPTION("Intel(R) MIC X100 Host driver");
536 MODULE_LICENSE("GPL v2");