blob: 0bbe90df968d13dff29f66a56db54d01622c3dc6 [file] [log] [blame]
Logan Gunthorpe080b47d2017-03-06 18:30:54 -06001/*
2 * Microsemi Switchtec(tm) PCIe Management Driver
3 * Copyright (c) 2017, Microsemi Corporation
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 */
15
16#include <linux/interrupt.h>
17#include <linux/module.h>
18#include <linux/fs.h>
19#include <linux/uaccess.h>
20#include <linux/poll.h>
21#include <linux/pci.h>
22#include <linux/cdev.h>
23#include <linux/wait.h>
24
25MODULE_DESCRIPTION("Microsemi Switchtec(tm) PCIe Management Driver");
26MODULE_VERSION("0.1");
27MODULE_LICENSE("GPL");
28MODULE_AUTHOR("Microsemi Corporation");
29
30static int max_devices = 16;
31module_param(max_devices, int, 0644);
32MODULE_PARM_DESC(max_devices, "max number of switchtec device instances");
33
34static dev_t switchtec_devt;
35static struct class *switchtec_class;
36static DEFINE_IDA(switchtec_minor_ida);
37
38#define MICROSEMI_VENDOR_ID 0x11f8
39#define MICROSEMI_NTB_CLASSCODE 0x068000
40#define MICROSEMI_MGMT_CLASSCODE 0x058000
41
42#define SWITCHTEC_MRPC_PAYLOAD_SIZE 1024
43#define SWITCHTEC_MAX_PFF_CSR 48
44
45#define SWITCHTEC_EVENT_OCCURRED BIT(0)
46#define SWITCHTEC_EVENT_CLEAR BIT(0)
47#define SWITCHTEC_EVENT_EN_LOG BIT(1)
48#define SWITCHTEC_EVENT_EN_CLI BIT(2)
49#define SWITCHTEC_EVENT_EN_IRQ BIT(3)
50#define SWITCHTEC_EVENT_FATAL BIT(4)
51
52enum {
53 SWITCHTEC_GAS_MRPC_OFFSET = 0x0000,
54 SWITCHTEC_GAS_TOP_CFG_OFFSET = 0x1000,
55 SWITCHTEC_GAS_SW_EVENT_OFFSET = 0x1800,
56 SWITCHTEC_GAS_SYS_INFO_OFFSET = 0x2000,
57 SWITCHTEC_GAS_FLASH_INFO_OFFSET = 0x2200,
58 SWITCHTEC_GAS_PART_CFG_OFFSET = 0x4000,
59 SWITCHTEC_GAS_NTB_OFFSET = 0x10000,
60 SWITCHTEC_GAS_PFF_CSR_OFFSET = 0x134000,
61};
62
63struct mrpc_regs {
64 u8 input_data[SWITCHTEC_MRPC_PAYLOAD_SIZE];
65 u8 output_data[SWITCHTEC_MRPC_PAYLOAD_SIZE];
66 u32 cmd;
67 u32 status;
68 u32 ret_value;
69} __packed;
70
71enum mrpc_status {
72 SWITCHTEC_MRPC_STATUS_INPROGRESS = 1,
73 SWITCHTEC_MRPC_STATUS_DONE = 2,
74 SWITCHTEC_MRPC_STATUS_ERROR = 0xFF,
75 SWITCHTEC_MRPC_STATUS_INTERRUPTED = 0x100,
76};
77
78struct sw_event_regs {
79 u64 event_report_ctrl;
80 u64 reserved1;
81 u64 part_event_bitmap;
82 u64 reserved2;
83 u32 global_summary;
84 u32 reserved3[3];
85 u32 stack_error_event_hdr;
86 u32 stack_error_event_data;
87 u32 reserved4[4];
88 u32 ppu_error_event_hdr;
89 u32 ppu_error_event_data;
90 u32 reserved5[4];
91 u32 isp_error_event_hdr;
92 u32 isp_error_event_data;
93 u32 reserved6[4];
94 u32 sys_reset_event_hdr;
95 u32 reserved7[5];
96 u32 fw_exception_hdr;
97 u32 reserved8[5];
98 u32 fw_nmi_hdr;
99 u32 reserved9[5];
100 u32 fw_non_fatal_hdr;
101 u32 reserved10[5];
102 u32 fw_fatal_hdr;
103 u32 reserved11[5];
104 u32 twi_mrpc_comp_hdr;
105 u32 twi_mrpc_comp_data;
106 u32 reserved12[4];
107 u32 twi_mrpc_comp_async_hdr;
108 u32 twi_mrpc_comp_async_data;
109 u32 reserved13[4];
110 u32 cli_mrpc_comp_hdr;
111 u32 cli_mrpc_comp_data;
112 u32 reserved14[4];
113 u32 cli_mrpc_comp_async_hdr;
114 u32 cli_mrpc_comp_async_data;
115 u32 reserved15[4];
116 u32 gpio_interrupt_hdr;
117 u32 gpio_interrupt_data;
118 u32 reserved16[4];
119} __packed;
120
121struct sys_info_regs {
122 u32 device_id;
123 u32 device_version;
124 u32 firmware_version;
125 u32 reserved1;
126 u32 vendor_table_revision;
127 u32 table_format_version;
128 u32 partition_id;
129 u32 cfg_file_fmt_version;
130 u32 reserved2[58];
131 char vendor_id[8];
132 char product_id[16];
133 char product_revision[4];
134 char component_vendor[8];
135 u16 component_id;
136 u8 component_revision;
137} __packed;
138
139struct flash_info_regs {
140 u32 flash_part_map_upd_idx;
141
142 struct active_partition_info {
143 u32 address;
144 u32 build_version;
145 u32 build_string;
146 } active_img;
147
148 struct active_partition_info active_cfg;
149 struct active_partition_info inactive_img;
150 struct active_partition_info inactive_cfg;
151
152 u32 flash_length;
153
154 struct partition_info {
155 u32 address;
156 u32 length;
157 } cfg0;
158
159 struct partition_info cfg1;
160 struct partition_info img0;
161 struct partition_info img1;
162 struct partition_info nvlog;
163 struct partition_info vendor[8];
164};
165
166struct ntb_info_regs {
167 u8 partition_count;
168 u8 partition_id;
169 u16 reserved1;
170 u64 ep_map;
171 u16 requester_id;
172} __packed;
173
174struct part_cfg_regs {
175 u32 status;
176 u32 state;
177 u32 port_cnt;
178 u32 usp_port_mode;
179 u32 usp_pff_inst_id;
180 u32 vep_pff_inst_id;
181 u32 dsp_pff_inst_id[47];
182 u32 reserved1[11];
183 u16 vep_vector_number;
184 u16 usp_vector_number;
185 u32 port_event_bitmap;
186 u32 reserved2[3];
187 u32 part_event_summary;
188 u32 reserved3[3];
189 u32 part_reset_hdr;
190 u32 part_reset_data[5];
191 u32 mrpc_comp_hdr;
192 u32 mrpc_comp_data[5];
193 u32 mrpc_comp_async_hdr;
194 u32 mrpc_comp_async_data[5];
195 u32 dyn_binding_hdr;
196 u32 dyn_binding_data[5];
197 u32 reserved4[159];
198} __packed;
199
200enum {
201 SWITCHTEC_PART_CFG_EVENT_RESET = 1 << 0,
202 SWITCHTEC_PART_CFG_EVENT_MRPC_CMP = 1 << 1,
203 SWITCHTEC_PART_CFG_EVENT_MRPC_ASYNC_CMP = 1 << 2,
204 SWITCHTEC_PART_CFG_EVENT_DYN_PART_CMP = 1 << 3,
205};
206
207struct pff_csr_regs {
208 u16 vendor_id;
209 u16 device_id;
210 u32 pci_cfg_header[15];
211 u32 pci_cap_region[48];
212 u32 pcie_cap_region[448];
213 u32 indirect_gas_window[128];
214 u32 indirect_gas_window_off;
215 u32 reserved[127];
216 u32 pff_event_summary;
217 u32 reserved2[3];
218 u32 aer_in_p2p_hdr;
219 u32 aer_in_p2p_data[5];
220 u32 aer_in_vep_hdr;
221 u32 aer_in_vep_data[5];
222 u32 dpc_hdr;
223 u32 dpc_data[5];
224 u32 cts_hdr;
225 u32 cts_data[5];
226 u32 reserved3[6];
227 u32 hotplug_hdr;
228 u32 hotplug_data[5];
229 u32 ier_hdr;
230 u32 ier_data[5];
231 u32 threshold_hdr;
232 u32 threshold_data[5];
233 u32 power_mgmt_hdr;
234 u32 power_mgmt_data[5];
235 u32 tlp_throttling_hdr;
236 u32 tlp_throttling_data[5];
237 u32 force_speed_hdr;
238 u32 force_speed_data[5];
239 u32 credit_timeout_hdr;
240 u32 credit_timeout_data[5];
241 u32 link_state_hdr;
242 u32 link_state_data[5];
243 u32 reserved4[174];
244} __packed;
245
246struct switchtec_dev {
247 struct pci_dev *pdev;
248 struct device dev;
249 struct cdev cdev;
250
251 int partition;
252 int partition_count;
253 int pff_csr_count;
254 char pff_local[SWITCHTEC_MAX_PFF_CSR];
255
256 void __iomem *mmio;
257 struct mrpc_regs __iomem *mmio_mrpc;
258 struct sw_event_regs __iomem *mmio_sw_event;
259 struct sys_info_regs __iomem *mmio_sys_info;
260 struct flash_info_regs __iomem *mmio_flash_info;
261 struct ntb_info_regs __iomem *mmio_ntb;
262 struct part_cfg_regs __iomem *mmio_part_cfg;
263 struct part_cfg_regs __iomem *mmio_part_cfg_all;
264 struct pff_csr_regs __iomem *mmio_pff_csr;
265
266 /*
267 * The mrpc mutex must be held when accessing the other
268 * mrpc_ fields, alive flag and stuser->state field
269 */
270 struct mutex mrpc_mutex;
271 struct list_head mrpc_queue;
272 int mrpc_busy;
273 struct work_struct mrpc_work;
274 struct delayed_work mrpc_timeout;
275 bool alive;
276
277 wait_queue_head_t event_wq;
278 atomic_t event_cnt;
279};
280
281static struct switchtec_dev *to_stdev(struct device *dev)
282{
283 return container_of(dev, struct switchtec_dev, dev);
284}
285
286enum mrpc_state {
287 MRPC_IDLE = 0,
288 MRPC_QUEUED,
289 MRPC_RUNNING,
290 MRPC_DONE,
291};
292
293struct switchtec_user {
294 struct switchtec_dev *stdev;
295
296 enum mrpc_state state;
297
298 struct completion comp;
299 struct kref kref;
300 struct list_head list;
301
302 u32 cmd;
303 u32 status;
304 u32 return_code;
305 size_t data_len;
306 size_t read_len;
307 unsigned char data[SWITCHTEC_MRPC_PAYLOAD_SIZE];
308 int event_cnt;
309};
310
311static struct switchtec_user *stuser_create(struct switchtec_dev *stdev)
312{
313 struct switchtec_user *stuser;
314
315 stuser = kzalloc(sizeof(*stuser), GFP_KERNEL);
316 if (!stuser)
317 return ERR_PTR(-ENOMEM);
318
319 get_device(&stdev->dev);
320 stuser->stdev = stdev;
321 kref_init(&stuser->kref);
322 INIT_LIST_HEAD(&stuser->list);
323 init_completion(&stuser->comp);
324 stuser->event_cnt = atomic_read(&stdev->event_cnt);
325
326 dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser);
327
328 return stuser;
329}
330
331static void stuser_free(struct kref *kref)
332{
333 struct switchtec_user *stuser;
334
335 stuser = container_of(kref, struct switchtec_user, kref);
336
337 dev_dbg(&stuser->stdev->dev, "%s: %p\n", __func__, stuser);
338
339 put_device(&stuser->stdev->dev);
340 kfree(stuser);
341}
342
343static void stuser_put(struct switchtec_user *stuser)
344{
345 kref_put(&stuser->kref, stuser_free);
346}
347
348static void stuser_set_state(struct switchtec_user *stuser,
349 enum mrpc_state state)
350{
351 /* requires the mrpc_mutex to already be held when called */
352
353 const char * const state_names[] = {
354 [MRPC_IDLE] = "IDLE",
355 [MRPC_QUEUED] = "QUEUED",
356 [MRPC_RUNNING] = "RUNNING",
357 [MRPC_DONE] = "DONE",
358 };
359
360 stuser->state = state;
361
362 dev_dbg(&stuser->stdev->dev, "stuser state %p -> %s",
363 stuser, state_names[state]);
364}
365
366static void mrpc_complete_cmd(struct switchtec_dev *stdev);
367
368static void mrpc_cmd_submit(struct switchtec_dev *stdev)
369{
370 /* requires the mrpc_mutex to already be held when called */
371
372 struct switchtec_user *stuser;
373
374 if (stdev->mrpc_busy)
375 return;
376
377 if (list_empty(&stdev->mrpc_queue))
378 return;
379
380 stuser = list_entry(stdev->mrpc_queue.next, struct switchtec_user,
381 list);
382
383 stuser_set_state(stuser, MRPC_RUNNING);
384 stdev->mrpc_busy = 1;
385 memcpy_toio(&stdev->mmio_mrpc->input_data,
386 stuser->data, stuser->data_len);
387 iowrite32(stuser->cmd, &stdev->mmio_mrpc->cmd);
388
389 stuser->status = ioread32(&stdev->mmio_mrpc->status);
390 if (stuser->status != SWITCHTEC_MRPC_STATUS_INPROGRESS)
391 mrpc_complete_cmd(stdev);
392
393 schedule_delayed_work(&stdev->mrpc_timeout,
394 msecs_to_jiffies(500));
395}
396
397static int mrpc_queue_cmd(struct switchtec_user *stuser)
398{
399 /* requires the mrpc_mutex to already be held when called */
400
401 struct switchtec_dev *stdev = stuser->stdev;
402
403 kref_get(&stuser->kref);
404 stuser->read_len = sizeof(stuser->data);
405 stuser_set_state(stuser, MRPC_QUEUED);
406 init_completion(&stuser->comp);
407 list_add_tail(&stuser->list, &stdev->mrpc_queue);
408
409 mrpc_cmd_submit(stdev);
410
411 return 0;
412}
413
414static void mrpc_complete_cmd(struct switchtec_dev *stdev)
415{
416 /* requires the mrpc_mutex to already be held when called */
417 struct switchtec_user *stuser;
418
419 if (list_empty(&stdev->mrpc_queue))
420 return;
421
422 stuser = list_entry(stdev->mrpc_queue.next, struct switchtec_user,
423 list);
424
425 stuser->status = ioread32(&stdev->mmio_mrpc->status);
426 if (stuser->status == SWITCHTEC_MRPC_STATUS_INPROGRESS)
427 return;
428
429 stuser_set_state(stuser, MRPC_DONE);
430 stuser->return_code = 0;
431
432 if (stuser->status != SWITCHTEC_MRPC_STATUS_DONE)
433 goto out;
434
435 stuser->return_code = ioread32(&stdev->mmio_mrpc->ret_value);
436 if (stuser->return_code != 0)
437 goto out;
438
439 memcpy_fromio(stuser->data, &stdev->mmio_mrpc->output_data,
440 stuser->read_len);
441
442out:
443 complete_all(&stuser->comp);
444 list_del_init(&stuser->list);
445 stuser_put(stuser);
446 stdev->mrpc_busy = 0;
447
448 mrpc_cmd_submit(stdev);
449}
450
451static void mrpc_event_work(struct work_struct *work)
452{
453 struct switchtec_dev *stdev;
454
455 stdev = container_of(work, struct switchtec_dev, mrpc_work);
456
457 dev_dbg(&stdev->dev, "%s\n", __func__);
458
459 mutex_lock(&stdev->mrpc_mutex);
460 cancel_delayed_work(&stdev->mrpc_timeout);
461 mrpc_complete_cmd(stdev);
462 mutex_unlock(&stdev->mrpc_mutex);
463}
464
465static void mrpc_timeout_work(struct work_struct *work)
466{
467 struct switchtec_dev *stdev;
468 u32 status;
469
470 stdev = container_of(work, struct switchtec_dev, mrpc_timeout.work);
471
472 dev_dbg(&stdev->dev, "%s\n", __func__);
473
474 mutex_lock(&stdev->mrpc_mutex);
475
476 status = ioread32(&stdev->mmio_mrpc->status);
477 if (status == SWITCHTEC_MRPC_STATUS_INPROGRESS) {
478 schedule_delayed_work(&stdev->mrpc_timeout,
479 msecs_to_jiffies(500));
480 goto out;
481 }
482
483 mrpc_complete_cmd(stdev);
484
485out:
486 mutex_unlock(&stdev->mrpc_mutex);
487}
488
489static int switchtec_dev_open(struct inode *inode, struct file *filp)
490{
491 struct switchtec_dev *stdev;
492 struct switchtec_user *stuser;
493
494 stdev = container_of(inode->i_cdev, struct switchtec_dev, cdev);
495
496 stuser = stuser_create(stdev);
497 if (IS_ERR(stuser))
498 return PTR_ERR(stuser);
499
500 filp->private_data = stuser;
501 nonseekable_open(inode, filp);
502
503 dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser);
504
505 return 0;
506}
507
508static int switchtec_dev_release(struct inode *inode, struct file *filp)
509{
510 struct switchtec_user *stuser = filp->private_data;
511
512 stuser_put(stuser);
513
514 return 0;
515}
516
517static int lock_mutex_and_test_alive(struct switchtec_dev *stdev)
518{
519 if (mutex_lock_interruptible(&stdev->mrpc_mutex))
520 return -EINTR;
521
522 if (!stdev->alive) {
523 mutex_unlock(&stdev->mrpc_mutex);
524 return -ENODEV;
525 }
526
527 return 0;
528}
529
530static ssize_t switchtec_dev_write(struct file *filp, const char __user *data,
531 size_t size, loff_t *off)
532{
533 struct switchtec_user *stuser = filp->private_data;
534 struct switchtec_dev *stdev = stuser->stdev;
535 int rc;
536
537 if (size < sizeof(stuser->cmd) ||
538 size > sizeof(stuser->cmd) + sizeof(stuser->data))
539 return -EINVAL;
540
541 stuser->data_len = size - sizeof(stuser->cmd);
542
543 rc = lock_mutex_and_test_alive(stdev);
544 if (rc)
545 return rc;
546
547 if (stuser->state != MRPC_IDLE) {
548 rc = -EBADE;
549 goto out;
550 }
551
552 rc = copy_from_user(&stuser->cmd, data, sizeof(stuser->cmd));
553 if (rc) {
554 rc = -EFAULT;
555 goto out;
556 }
557
558 data += sizeof(stuser->cmd);
559 rc = copy_from_user(&stuser->data, data, size - sizeof(stuser->cmd));
560 if (rc) {
561 rc = -EFAULT;
562 goto out;
563 }
564
565 rc = mrpc_queue_cmd(stuser);
566
567out:
568 mutex_unlock(&stdev->mrpc_mutex);
569
570 if (rc)
571 return rc;
572
573 return size;
574}
575
576static ssize_t switchtec_dev_read(struct file *filp, char __user *data,
577 size_t size, loff_t *off)
578{
579 struct switchtec_user *stuser = filp->private_data;
580 struct switchtec_dev *stdev = stuser->stdev;
581 int rc;
582
583 if (size < sizeof(stuser->cmd) ||
584 size > sizeof(stuser->cmd) + sizeof(stuser->data))
585 return -EINVAL;
586
587 rc = lock_mutex_and_test_alive(stdev);
588 if (rc)
589 return rc;
590
591 if (stuser->state == MRPC_IDLE) {
592 mutex_unlock(&stdev->mrpc_mutex);
593 return -EBADE;
594 }
595
596 stuser->read_len = size - sizeof(stuser->return_code);
597
598 mutex_unlock(&stdev->mrpc_mutex);
599
600 if (filp->f_flags & O_NONBLOCK) {
601 if (!try_wait_for_completion(&stuser->comp))
602 return -EAGAIN;
603 } else {
604 rc = wait_for_completion_interruptible(&stuser->comp);
605 if (rc < 0)
606 return rc;
607 }
608
609 rc = lock_mutex_and_test_alive(stdev);
610 if (rc)
611 return rc;
612
613 if (stuser->state != MRPC_DONE) {
614 mutex_unlock(&stdev->mrpc_mutex);
615 return -EBADE;
616 }
617
618 rc = copy_to_user(data, &stuser->return_code,
619 sizeof(stuser->return_code));
620 if (rc) {
621 rc = -EFAULT;
622 goto out;
623 }
624
625 data += sizeof(stuser->return_code);
626 rc = copy_to_user(data, &stuser->data,
627 size - sizeof(stuser->return_code));
628 if (rc) {
629 rc = -EFAULT;
630 goto out;
631 }
632
633 stuser_set_state(stuser, MRPC_IDLE);
634
635out:
636 mutex_unlock(&stdev->mrpc_mutex);
637
638 if (stuser->status == SWITCHTEC_MRPC_STATUS_DONE)
639 return size;
640 else if (stuser->status == SWITCHTEC_MRPC_STATUS_INTERRUPTED)
641 return -ENXIO;
642 else
643 return -EBADMSG;
644}
645
646static unsigned int switchtec_dev_poll(struct file *filp, poll_table *wait)
647{
648 struct switchtec_user *stuser = filp->private_data;
649 struct switchtec_dev *stdev = stuser->stdev;
650 int ret = 0;
651
652 poll_wait(filp, &stuser->comp.wait, wait);
653 poll_wait(filp, &stdev->event_wq, wait);
654
655 if (lock_mutex_and_test_alive(stdev))
656 return POLLIN | POLLRDHUP | POLLOUT | POLLERR | POLLHUP;
657
658 mutex_unlock(&stdev->mrpc_mutex);
659
660 if (try_wait_for_completion(&stuser->comp))
661 ret |= POLLIN | POLLRDNORM;
662
663 if (stuser->event_cnt != atomic_read(&stdev->event_cnt))
664 ret |= POLLPRI | POLLRDBAND;
665
666 return ret;
667}
668
669static const struct file_operations switchtec_fops = {
670 .owner = THIS_MODULE,
671 .open = switchtec_dev_open,
672 .release = switchtec_dev_release,
673 .write = switchtec_dev_write,
674 .read = switchtec_dev_read,
675 .poll = switchtec_dev_poll,
676};
677
678static void stdev_release(struct device *dev)
679{
680 struct switchtec_dev *stdev = to_stdev(dev);
681
682 kfree(stdev);
683}
684
685static void stdev_kill(struct switchtec_dev *stdev)
686{
687 struct switchtec_user *stuser, *tmpuser;
688
689 pci_clear_master(stdev->pdev);
690
691 cancel_delayed_work_sync(&stdev->mrpc_timeout);
692
693 /* Mark the hardware as unavailable and complete all completions */
694 mutex_lock(&stdev->mrpc_mutex);
695 stdev->alive = false;
696
697 /* Wake up and kill any users waiting on an MRPC request */
698 list_for_each_entry_safe(stuser, tmpuser, &stdev->mrpc_queue, list) {
699 complete_all(&stuser->comp);
700 list_del_init(&stuser->list);
701 stuser_put(stuser);
702 }
703
704 mutex_unlock(&stdev->mrpc_mutex);
705
706 /* Wake up any users waiting on event_wq */
707 wake_up_interruptible(&stdev->event_wq);
708}
709
710static struct switchtec_dev *stdev_create(struct pci_dev *pdev)
711{
712 struct switchtec_dev *stdev;
713 int minor;
714 struct device *dev;
715 struct cdev *cdev;
716 int rc;
717
718 stdev = kzalloc_node(sizeof(*stdev), GFP_KERNEL,
719 dev_to_node(&pdev->dev));
720 if (!stdev)
721 return ERR_PTR(-ENOMEM);
722
723 stdev->alive = true;
724 stdev->pdev = pdev;
725 INIT_LIST_HEAD(&stdev->mrpc_queue);
726 mutex_init(&stdev->mrpc_mutex);
727 stdev->mrpc_busy = 0;
728 INIT_WORK(&stdev->mrpc_work, mrpc_event_work);
729 INIT_DELAYED_WORK(&stdev->mrpc_timeout, mrpc_timeout_work);
730 init_waitqueue_head(&stdev->event_wq);
731 atomic_set(&stdev->event_cnt, 0);
732
733 dev = &stdev->dev;
734 device_initialize(dev);
735 dev->class = switchtec_class;
736 dev->parent = &pdev->dev;
737 dev->release = stdev_release;
738
739 minor = ida_simple_get(&switchtec_minor_ida, 0, 0,
740 GFP_KERNEL);
741 if (minor < 0) {
742 rc = minor;
743 goto err_put;
744 }
745
746 dev->devt = MKDEV(MAJOR(switchtec_devt), minor);
747 dev_set_name(dev, "switchtec%d", minor);
748
749 cdev = &stdev->cdev;
750 cdev_init(cdev, &switchtec_fops);
751 cdev->owner = THIS_MODULE;
752 cdev->kobj.parent = &dev->kobj;
753
754 return stdev;
755
756err_put:
757 put_device(&stdev->dev);
758 return ERR_PTR(rc);
759}
760
761static irqreturn_t switchtec_event_isr(int irq, void *dev)
762{
763 struct switchtec_dev *stdev = dev;
764 u32 reg;
765 irqreturn_t ret = IRQ_NONE;
766
767 reg = ioread32(&stdev->mmio_part_cfg->mrpc_comp_hdr);
768 if (reg & SWITCHTEC_EVENT_OCCURRED) {
769 dev_dbg(&stdev->dev, "%s: mrpc comp\n", __func__);
770 ret = IRQ_HANDLED;
771 schedule_work(&stdev->mrpc_work);
772 iowrite32(reg, &stdev->mmio_part_cfg->mrpc_comp_hdr);
773 }
774
775 return ret;
776}
777
778static int switchtec_init_isr(struct switchtec_dev *stdev)
779{
780 int nvecs;
781 int event_irq;
782
783 nvecs = pci_alloc_irq_vectors(stdev->pdev, 1, 4,
784 PCI_IRQ_MSIX | PCI_IRQ_MSI);
785 if (nvecs < 0)
786 return nvecs;
787
788 event_irq = ioread32(&stdev->mmio_part_cfg->vep_vector_number);
789 if (event_irq < 0 || event_irq >= nvecs)
790 return -EFAULT;
791
792 event_irq = pci_irq_vector(stdev->pdev, event_irq);
793 if (event_irq < 0)
794 return event_irq;
795
796 return devm_request_irq(&stdev->pdev->dev, event_irq,
797 switchtec_event_isr, 0,
798 KBUILD_MODNAME, stdev);
799}
800
801static void init_pff(struct switchtec_dev *stdev)
802{
803 int i;
804 u32 reg;
805 struct part_cfg_regs *pcfg = stdev->mmio_part_cfg;
806
807 for (i = 0; i < SWITCHTEC_MAX_PFF_CSR; i++) {
808 reg = ioread16(&stdev->mmio_pff_csr[i].vendor_id);
809 if (reg != MICROSEMI_VENDOR_ID)
810 break;
811 }
812
813 stdev->pff_csr_count = i;
814
815 reg = ioread32(&pcfg->usp_pff_inst_id);
816 if (reg < SWITCHTEC_MAX_PFF_CSR)
817 stdev->pff_local[reg] = 1;
818
819 reg = ioread32(&pcfg->vep_pff_inst_id);
820 if (reg < SWITCHTEC_MAX_PFF_CSR)
821 stdev->pff_local[reg] = 1;
822
823 for (i = 0; i < ARRAY_SIZE(pcfg->dsp_pff_inst_id); i++) {
824 reg = ioread32(&pcfg->dsp_pff_inst_id[i]);
825 if (reg < SWITCHTEC_MAX_PFF_CSR)
826 stdev->pff_local[reg] = 1;
827 }
828}
829
830static int switchtec_init_pci(struct switchtec_dev *stdev,
831 struct pci_dev *pdev)
832{
833 int rc;
834
835 rc = pcim_enable_device(pdev);
836 if (rc)
837 return rc;
838
839 rc = pcim_iomap_regions(pdev, 0x1, KBUILD_MODNAME);
840 if (rc)
841 return rc;
842
843 pci_set_master(pdev);
844
845 stdev->mmio = pcim_iomap_table(pdev)[0];
846 stdev->mmio_mrpc = stdev->mmio + SWITCHTEC_GAS_MRPC_OFFSET;
847 stdev->mmio_sw_event = stdev->mmio + SWITCHTEC_GAS_SW_EVENT_OFFSET;
848 stdev->mmio_sys_info = stdev->mmio + SWITCHTEC_GAS_SYS_INFO_OFFSET;
849 stdev->mmio_flash_info = stdev->mmio + SWITCHTEC_GAS_FLASH_INFO_OFFSET;
850 stdev->mmio_ntb = stdev->mmio + SWITCHTEC_GAS_NTB_OFFSET;
851 stdev->partition = ioread8(&stdev->mmio_ntb->partition_id);
852 stdev->partition_count = ioread8(&stdev->mmio_ntb->partition_count);
853 stdev->mmio_part_cfg_all = stdev->mmio + SWITCHTEC_GAS_PART_CFG_OFFSET;
854 stdev->mmio_part_cfg = &stdev->mmio_part_cfg_all[stdev->partition];
855 stdev->mmio_pff_csr = stdev->mmio + SWITCHTEC_GAS_PFF_CSR_OFFSET;
856
857 init_pff(stdev);
858
859 pci_set_drvdata(pdev, stdev);
860
861 return 0;
862}
863
864static int switchtec_pci_probe(struct pci_dev *pdev,
865 const struct pci_device_id *id)
866{
867 struct switchtec_dev *stdev;
868 int rc;
869
870 stdev = stdev_create(pdev);
871 if (IS_ERR(stdev))
872 return PTR_ERR(stdev);
873
874 rc = switchtec_init_pci(stdev, pdev);
875 if (rc)
876 goto err_put;
877
878 rc = switchtec_init_isr(stdev);
879 if (rc) {
880 dev_err(&stdev->dev, "failed to init isr.\n");
881 goto err_put;
882 }
883
884 iowrite32(SWITCHTEC_EVENT_CLEAR |
885 SWITCHTEC_EVENT_EN_IRQ,
886 &stdev->mmio_part_cfg->mrpc_comp_hdr);
887
888 rc = cdev_add(&stdev->cdev, stdev->dev.devt, 1);
889 if (rc)
890 goto err_put;
891
892 rc = device_add(&stdev->dev);
893 if (rc)
894 goto err_devadd;
895
896 dev_info(&stdev->dev, "Management device registered.\n");
897
898 return 0;
899
900err_devadd:
901 cdev_del(&stdev->cdev);
902 stdev_kill(stdev);
903err_put:
904 ida_simple_remove(&switchtec_minor_ida, MINOR(stdev->dev.devt));
905 put_device(&stdev->dev);
906 return rc;
907}
908
909static void switchtec_pci_remove(struct pci_dev *pdev)
910{
911 struct switchtec_dev *stdev = pci_get_drvdata(pdev);
912
913 pci_set_drvdata(pdev, NULL);
914
915 device_del(&stdev->dev);
916 cdev_del(&stdev->cdev);
917 ida_simple_remove(&switchtec_minor_ida, MINOR(stdev->dev.devt));
918 dev_info(&stdev->dev, "unregistered.\n");
919
920 stdev_kill(stdev);
921 put_device(&stdev->dev);
922}
923
924#define SWITCHTEC_PCI_DEVICE(device_id) \
925 { \
926 .vendor = MICROSEMI_VENDOR_ID, \
927 .device = device_id, \
928 .subvendor = PCI_ANY_ID, \
929 .subdevice = PCI_ANY_ID, \
930 .class = MICROSEMI_MGMT_CLASSCODE, \
931 .class_mask = 0xFFFFFFFF, \
932 }, \
933 { \
934 .vendor = MICROSEMI_VENDOR_ID, \
935 .device = device_id, \
936 .subvendor = PCI_ANY_ID, \
937 .subdevice = PCI_ANY_ID, \
938 .class = MICROSEMI_NTB_CLASSCODE, \
939 .class_mask = 0xFFFFFFFF, \
940 }
941
942static const struct pci_device_id switchtec_pci_tbl[] = {
943 SWITCHTEC_PCI_DEVICE(0x8531), //PFX 24xG3
944 SWITCHTEC_PCI_DEVICE(0x8532), //PFX 32xG3
945 SWITCHTEC_PCI_DEVICE(0x8533), //PFX 48xG3
946 SWITCHTEC_PCI_DEVICE(0x8534), //PFX 64xG3
947 SWITCHTEC_PCI_DEVICE(0x8535), //PFX 80xG3
948 SWITCHTEC_PCI_DEVICE(0x8536), //PFX 96xG3
949 SWITCHTEC_PCI_DEVICE(0x8543), //PSX 48xG3
950 SWITCHTEC_PCI_DEVICE(0x8544), //PSX 64xG3
951 SWITCHTEC_PCI_DEVICE(0x8545), //PSX 80xG3
952 SWITCHTEC_PCI_DEVICE(0x8546), //PSX 96xG3
953 {0}
954};
955MODULE_DEVICE_TABLE(pci, switchtec_pci_tbl);
956
957static struct pci_driver switchtec_pci_driver = {
958 .name = KBUILD_MODNAME,
959 .id_table = switchtec_pci_tbl,
960 .probe = switchtec_pci_probe,
961 .remove = switchtec_pci_remove,
962};
963
964static int __init switchtec_init(void)
965{
966 int rc;
967
968 rc = alloc_chrdev_region(&switchtec_devt, 0, max_devices,
969 "switchtec");
970 if (rc)
971 return rc;
972
973 switchtec_class = class_create(THIS_MODULE, "switchtec");
974 if (IS_ERR(switchtec_class)) {
975 rc = PTR_ERR(switchtec_class);
976 goto err_create_class;
977 }
978
979 rc = pci_register_driver(&switchtec_pci_driver);
980 if (rc)
981 goto err_pci_register;
982
983 pr_info(KBUILD_MODNAME ": loaded.\n");
984
985 return 0;
986
987err_pci_register:
988 class_destroy(switchtec_class);
989
990err_create_class:
991 unregister_chrdev_region(switchtec_devt, max_devices);
992
993 return rc;
994}
995module_init(switchtec_init);
996
997static void __exit switchtec_exit(void)
998{
999 pci_unregister_driver(&switchtec_pci_driver);
1000 class_destroy(switchtec_class);
1001 unregister_chrdev_region(switchtec_devt, max_devices);
1002 ida_destroy(&switchtec_minor_ida);
1003
1004 pr_info(KBUILD_MODNAME ": unloaded.\n");
1005}
1006module_exit(switchtec_exit);