root/drivers/pci/switch/switchtec.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. stuser_create
  2. stuser_free
  3. stuser_put
  4. stuser_set_state
  5. flush_wc_buf
  6. mrpc_cmd_submit
  7. mrpc_queue_cmd
  8. mrpc_complete_cmd
  9. mrpc_event_work
  10. mrpc_timeout_work
  11. device_version_show
  12. fw_version_show
  13. io_string_show
  14. component_id_show
  15. component_revision_show
  16. partition_show
  17. partition_count_show
  18. switchtec_dev_open
  19. switchtec_dev_release
  20. lock_mutex_and_test_alive
  21. switchtec_dev_write
  22. switchtec_dev_read
  23. switchtec_dev_poll
  24. ioctl_flash_info
  25. set_fw_info_part
  26. ioctl_flash_part_info
  27. ioctl_event_summary
  28. global_ev_reg
  29. part_ev_reg
  30. pff_ev_reg
  31. event_hdr_addr
  32. event_ctl
  33. ioctl_event_ctl
  34. ioctl_pff_to_port
  35. ioctl_port_to_pff
  36. switchtec_dev_ioctl
  37. link_event_work
  38. check_link_state_events
  39. enable_link_state_events
  40. enable_dma_mrpc
  41. stdev_release
  42. stdev_kill
  43. stdev_create
  44. mask_event
  45. mask_all_events
  46. switchtec_event_isr
  47. switchtec_dma_mrpc_isr
  48. switchtec_init_isr
  49. init_pff
  50. switchtec_init_pci
  51. switchtec_pci_probe
  52. switchtec_pci_remove
  53. switchtec_init
  54. switchtec_exit

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Microsemi Switchtec(tm) PCIe Management Driver
   4  * Copyright (c) 2017, Microsemi Corporation
   5  */
   6 
   7 #include <linux/switchtec.h>
   8 #include <linux/switchtec_ioctl.h>
   9 
  10 #include <linux/interrupt.h>
  11 #include <linux/module.h>
  12 #include <linux/fs.h>
  13 #include <linux/uaccess.h>
  14 #include <linux/poll.h>
  15 #include <linux/wait.h>
  16 #include <linux/io-64-nonatomic-lo-hi.h>
  17 #include <linux/nospec.h>
  18 
  19 MODULE_DESCRIPTION("Microsemi Switchtec(tm) PCIe Management Driver");
  20 MODULE_VERSION("0.1");
  21 MODULE_LICENSE("GPL");
  22 MODULE_AUTHOR("Microsemi Corporation");
  23 
  24 static int max_devices = 16;
  25 module_param(max_devices, int, 0644);
  26 MODULE_PARM_DESC(max_devices, "max number of switchtec device instances");
  27 
  28 static bool use_dma_mrpc = 1;
  29 module_param(use_dma_mrpc, bool, 0644);
  30 MODULE_PARM_DESC(use_dma_mrpc,
  31                  "Enable the use of the DMA MRPC feature");
  32 
  33 static int nirqs = 32;
  34 module_param(nirqs, int, 0644);
  35 MODULE_PARM_DESC(nirqs, "number of interrupts to allocate (more may be useful for NTB applications)");
  36 
  37 static dev_t switchtec_devt;
  38 static DEFINE_IDA(switchtec_minor_ida);
  39 
  40 struct class *switchtec_class;
  41 EXPORT_SYMBOL_GPL(switchtec_class);
  42 
  43 enum mrpc_state {
  44         MRPC_IDLE = 0,
  45         MRPC_QUEUED,
  46         MRPC_RUNNING,
  47         MRPC_DONE,
  48 };
  49 
  50 struct switchtec_user {
  51         struct switchtec_dev *stdev;
  52 
  53         enum mrpc_state state;
  54 
  55         struct completion comp;
  56         struct kref kref;
  57         struct list_head list;
  58 
  59         u32 cmd;
  60         u32 status;
  61         u32 return_code;
  62         size_t data_len;
  63         size_t read_len;
  64         unsigned char data[SWITCHTEC_MRPC_PAYLOAD_SIZE];
  65         int event_cnt;
  66 };
  67 
  68 static struct switchtec_user *stuser_create(struct switchtec_dev *stdev)
  69 {
  70         struct switchtec_user *stuser;
  71 
  72         stuser = kzalloc(sizeof(*stuser), GFP_KERNEL);
  73         if (!stuser)
  74                 return ERR_PTR(-ENOMEM);
  75 
  76         get_device(&stdev->dev);
  77         stuser->stdev = stdev;
  78         kref_init(&stuser->kref);
  79         INIT_LIST_HEAD(&stuser->list);
  80         init_completion(&stuser->comp);
  81         stuser->event_cnt = atomic_read(&stdev->event_cnt);
  82 
  83         dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser);
  84 
  85         return stuser;
  86 }
  87 
  88 static void stuser_free(struct kref *kref)
  89 {
  90         struct switchtec_user *stuser;
  91 
  92         stuser = container_of(kref, struct switchtec_user, kref);
  93 
  94         dev_dbg(&stuser->stdev->dev, "%s: %p\n", __func__, stuser);
  95 
  96         put_device(&stuser->stdev->dev);
  97         kfree(stuser);
  98 }
  99 
 100 static void stuser_put(struct switchtec_user *stuser)
 101 {
 102         kref_put(&stuser->kref, stuser_free);
 103 }
 104 
 105 static void stuser_set_state(struct switchtec_user *stuser,
 106                              enum mrpc_state state)
 107 {
 108         /* requires the mrpc_mutex to already be held when called */
 109 
 110         const char * const state_names[] = {
 111                 [MRPC_IDLE] = "IDLE",
 112                 [MRPC_QUEUED] = "QUEUED",
 113                 [MRPC_RUNNING] = "RUNNING",
 114                 [MRPC_DONE] = "DONE",
 115         };
 116 
 117         stuser->state = state;
 118 
 119         dev_dbg(&stuser->stdev->dev, "stuser state %p -> %s",
 120                 stuser, state_names[state]);
 121 }
 122 
 123 static void mrpc_complete_cmd(struct switchtec_dev *stdev);
 124 
 125 static void flush_wc_buf(struct switchtec_dev *stdev)
 126 {
 127         struct ntb_dbmsg_regs __iomem *mmio_dbmsg;
 128 
 129         /*
 130          * odb (outbound doorbell) register is processed by low latency
 131          * hardware and w/o side effect
 132          */
 133         mmio_dbmsg = (void __iomem *)stdev->mmio_ntb +
 134                 SWITCHTEC_NTB_REG_DBMSG_OFFSET;
 135         ioread32(&mmio_dbmsg->odb);
 136 }
 137 
 138 static void mrpc_cmd_submit(struct switchtec_dev *stdev)
 139 {
 140         /* requires the mrpc_mutex to already be held when called */
 141 
 142         struct switchtec_user *stuser;
 143 
 144         if (stdev->mrpc_busy)
 145                 return;
 146 
 147         if (list_empty(&stdev->mrpc_queue))
 148                 return;
 149 
 150         stuser = list_entry(stdev->mrpc_queue.next, struct switchtec_user,
 151                             list);
 152 
 153         if (stdev->dma_mrpc) {
 154                 stdev->dma_mrpc->status = SWITCHTEC_MRPC_STATUS_INPROGRESS;
 155                 memset(stdev->dma_mrpc->data, 0xFF, SWITCHTEC_MRPC_PAYLOAD_SIZE);
 156         }
 157 
 158         stuser_set_state(stuser, MRPC_RUNNING);
 159         stdev->mrpc_busy = 1;
 160         memcpy_toio(&stdev->mmio_mrpc->input_data,
 161                     stuser->data, stuser->data_len);
 162         flush_wc_buf(stdev);
 163         iowrite32(stuser->cmd, &stdev->mmio_mrpc->cmd);
 164 
 165         schedule_delayed_work(&stdev->mrpc_timeout,
 166                               msecs_to_jiffies(500));
 167 }
 168 
 169 static int mrpc_queue_cmd(struct switchtec_user *stuser)
 170 {
 171         /* requires the mrpc_mutex to already be held when called */
 172 
 173         struct switchtec_dev *stdev = stuser->stdev;
 174 
 175         kref_get(&stuser->kref);
 176         stuser->read_len = sizeof(stuser->data);
 177         stuser_set_state(stuser, MRPC_QUEUED);
 178         reinit_completion(&stuser->comp);
 179         list_add_tail(&stuser->list, &stdev->mrpc_queue);
 180 
 181         mrpc_cmd_submit(stdev);
 182 
 183         return 0;
 184 }
 185 
 186 static void mrpc_complete_cmd(struct switchtec_dev *stdev)
 187 {
 188         /* requires the mrpc_mutex to already be held when called */
 189         struct switchtec_user *stuser;
 190 
 191         if (list_empty(&stdev->mrpc_queue))
 192                 return;
 193 
 194         stuser = list_entry(stdev->mrpc_queue.next, struct switchtec_user,
 195                             list);
 196 
 197         if (stdev->dma_mrpc)
 198                 stuser->status = stdev->dma_mrpc->status;
 199         else
 200                 stuser->status = ioread32(&stdev->mmio_mrpc->status);
 201 
 202         if (stuser->status == SWITCHTEC_MRPC_STATUS_INPROGRESS)
 203                 return;
 204 
 205         stuser_set_state(stuser, MRPC_DONE);
 206         stuser->return_code = 0;
 207 
 208         if (stuser->status != SWITCHTEC_MRPC_STATUS_DONE)
 209                 goto out;
 210 
 211         if (stdev->dma_mrpc)
 212                 stuser->return_code = stdev->dma_mrpc->rtn_code;
 213         else
 214                 stuser->return_code = ioread32(&stdev->mmio_mrpc->ret_value);
 215         if (stuser->return_code != 0)
 216                 goto out;
 217 
 218         if (stdev->dma_mrpc)
 219                 memcpy(stuser->data, &stdev->dma_mrpc->data,
 220                               stuser->read_len);
 221         else
 222                 memcpy_fromio(stuser->data, &stdev->mmio_mrpc->output_data,
 223                               stuser->read_len);
 224 out:
 225         complete_all(&stuser->comp);
 226         list_del_init(&stuser->list);
 227         stuser_put(stuser);
 228         stdev->mrpc_busy = 0;
 229 
 230         mrpc_cmd_submit(stdev);
 231 }
 232 
 233 static void mrpc_event_work(struct work_struct *work)
 234 {
 235         struct switchtec_dev *stdev;
 236 
 237         stdev = container_of(work, struct switchtec_dev, mrpc_work);
 238 
 239         dev_dbg(&stdev->dev, "%s\n", __func__);
 240 
 241         mutex_lock(&stdev->mrpc_mutex);
 242         cancel_delayed_work(&stdev->mrpc_timeout);
 243         mrpc_complete_cmd(stdev);
 244         mutex_unlock(&stdev->mrpc_mutex);
 245 }
 246 
 247 static void mrpc_timeout_work(struct work_struct *work)
 248 {
 249         struct switchtec_dev *stdev;
 250         u32 status;
 251 
 252         stdev = container_of(work, struct switchtec_dev, mrpc_timeout.work);
 253 
 254         dev_dbg(&stdev->dev, "%s\n", __func__);
 255 
 256         mutex_lock(&stdev->mrpc_mutex);
 257 
 258         if (stdev->dma_mrpc)
 259                 status = stdev->dma_mrpc->status;
 260         else
 261                 status = ioread32(&stdev->mmio_mrpc->status);
 262         if (status == SWITCHTEC_MRPC_STATUS_INPROGRESS) {
 263                 schedule_delayed_work(&stdev->mrpc_timeout,
 264                                       msecs_to_jiffies(500));
 265                 goto out;
 266         }
 267 
 268         mrpc_complete_cmd(stdev);
 269 out:
 270         mutex_unlock(&stdev->mrpc_mutex);
 271 }
 272 
 273 static ssize_t device_version_show(struct device *dev,
 274         struct device_attribute *attr, char *buf)
 275 {
 276         struct switchtec_dev *stdev = to_stdev(dev);
 277         u32 ver;
 278 
 279         ver = ioread32(&stdev->mmio_sys_info->device_version);
 280 
 281         return sprintf(buf, "%x\n", ver);
 282 }
 283 static DEVICE_ATTR_RO(device_version);
 284 
 285 static ssize_t fw_version_show(struct device *dev,
 286         struct device_attribute *attr, char *buf)
 287 {
 288         struct switchtec_dev *stdev = to_stdev(dev);
 289         u32 ver;
 290 
 291         ver = ioread32(&stdev->mmio_sys_info->firmware_version);
 292 
 293         return sprintf(buf, "%08x\n", ver);
 294 }
 295 static DEVICE_ATTR_RO(fw_version);
 296 
 297 static ssize_t io_string_show(char *buf, void __iomem *attr, size_t len)
 298 {
 299         int i;
 300 
 301         memcpy_fromio(buf, attr, len);
 302         buf[len] = '\n';
 303         buf[len + 1] = 0;
 304 
 305         for (i = len - 1; i > 0; i--) {
 306                 if (buf[i] != ' ')
 307                         break;
 308                 buf[i] = '\n';
 309                 buf[i + 1] = 0;
 310         }
 311 
 312         return strlen(buf);
 313 }
 314 
 315 #define DEVICE_ATTR_SYS_INFO_STR(field) \
 316 static ssize_t field ## _show(struct device *dev, \
 317         struct device_attribute *attr, char *buf) \
 318 { \
 319         struct switchtec_dev *stdev = to_stdev(dev); \
 320         return io_string_show(buf, &stdev->mmio_sys_info->field, \
 321                             sizeof(stdev->mmio_sys_info->field)); \
 322 } \
 323 \
 324 static DEVICE_ATTR_RO(field)
 325 
 326 DEVICE_ATTR_SYS_INFO_STR(vendor_id);
 327 DEVICE_ATTR_SYS_INFO_STR(product_id);
 328 DEVICE_ATTR_SYS_INFO_STR(product_revision);
 329 DEVICE_ATTR_SYS_INFO_STR(component_vendor);
 330 
 331 static ssize_t component_id_show(struct device *dev,
 332         struct device_attribute *attr, char *buf)
 333 {
 334         struct switchtec_dev *stdev = to_stdev(dev);
 335         int id = ioread16(&stdev->mmio_sys_info->component_id);
 336 
 337         return sprintf(buf, "PM%04X\n", id);
 338 }
 339 static DEVICE_ATTR_RO(component_id);
 340 
 341 static ssize_t component_revision_show(struct device *dev,
 342         struct device_attribute *attr, char *buf)
 343 {
 344         struct switchtec_dev *stdev = to_stdev(dev);
 345         int rev = ioread8(&stdev->mmio_sys_info->component_revision);
 346 
 347         return sprintf(buf, "%d\n", rev);
 348 }
 349 static DEVICE_ATTR_RO(component_revision);
 350 
 351 static ssize_t partition_show(struct device *dev,
 352         struct device_attribute *attr, char *buf)
 353 {
 354         struct switchtec_dev *stdev = to_stdev(dev);
 355 
 356         return sprintf(buf, "%d\n", stdev->partition);
 357 }
 358 static DEVICE_ATTR_RO(partition);
 359 
 360 static ssize_t partition_count_show(struct device *dev,
 361         struct device_attribute *attr, char *buf)
 362 {
 363         struct switchtec_dev *stdev = to_stdev(dev);
 364 
 365         return sprintf(buf, "%d\n", stdev->partition_count);
 366 }
 367 static DEVICE_ATTR_RO(partition_count);
 368 
 369 static struct attribute *switchtec_device_attrs[] = {
 370         &dev_attr_device_version.attr,
 371         &dev_attr_fw_version.attr,
 372         &dev_attr_vendor_id.attr,
 373         &dev_attr_product_id.attr,
 374         &dev_attr_product_revision.attr,
 375         &dev_attr_component_vendor.attr,
 376         &dev_attr_component_id.attr,
 377         &dev_attr_component_revision.attr,
 378         &dev_attr_partition.attr,
 379         &dev_attr_partition_count.attr,
 380         NULL,
 381 };
 382 
 383 ATTRIBUTE_GROUPS(switchtec_device);
 384 
 385 static int switchtec_dev_open(struct inode *inode, struct file *filp)
 386 {
 387         struct switchtec_dev *stdev;
 388         struct switchtec_user *stuser;
 389 
 390         stdev = container_of(inode->i_cdev, struct switchtec_dev, cdev);
 391 
 392         stuser = stuser_create(stdev);
 393         if (IS_ERR(stuser))
 394                 return PTR_ERR(stuser);
 395 
 396         filp->private_data = stuser;
 397         stream_open(inode, filp);
 398 
 399         dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser);
 400 
 401         return 0;
 402 }
 403 
 404 static int switchtec_dev_release(struct inode *inode, struct file *filp)
 405 {
 406         struct switchtec_user *stuser = filp->private_data;
 407 
 408         stuser_put(stuser);
 409 
 410         return 0;
 411 }
 412 
 413 static int lock_mutex_and_test_alive(struct switchtec_dev *stdev)
 414 {
 415         if (mutex_lock_interruptible(&stdev->mrpc_mutex))
 416                 return -EINTR;
 417 
 418         if (!stdev->alive) {
 419                 mutex_unlock(&stdev->mrpc_mutex);
 420                 return -ENODEV;
 421         }
 422 
 423         return 0;
 424 }
 425 
 426 static ssize_t switchtec_dev_write(struct file *filp, const char __user *data,
 427                                    size_t size, loff_t *off)
 428 {
 429         struct switchtec_user *stuser = filp->private_data;
 430         struct switchtec_dev *stdev = stuser->stdev;
 431         int rc;
 432 
 433         if (size < sizeof(stuser->cmd) ||
 434             size > sizeof(stuser->cmd) + sizeof(stuser->data))
 435                 return -EINVAL;
 436 
 437         stuser->data_len = size - sizeof(stuser->cmd);
 438 
 439         rc = lock_mutex_and_test_alive(stdev);
 440         if (rc)
 441                 return rc;
 442 
 443         if (stuser->state != MRPC_IDLE) {
 444                 rc = -EBADE;
 445                 goto out;
 446         }
 447 
 448         rc = copy_from_user(&stuser->cmd, data, sizeof(stuser->cmd));
 449         if (rc) {
 450                 rc = -EFAULT;
 451                 goto out;
 452         }
 453 
 454         data += sizeof(stuser->cmd);
 455         rc = copy_from_user(&stuser->data, data, size - sizeof(stuser->cmd));
 456         if (rc) {
 457                 rc = -EFAULT;
 458                 goto out;
 459         }
 460 
 461         rc = mrpc_queue_cmd(stuser);
 462 
 463 out:
 464         mutex_unlock(&stdev->mrpc_mutex);
 465 
 466         if (rc)
 467                 return rc;
 468 
 469         return size;
 470 }
 471 
 472 static ssize_t switchtec_dev_read(struct file *filp, char __user *data,
 473                                   size_t size, loff_t *off)
 474 {
 475         struct switchtec_user *stuser = filp->private_data;
 476         struct switchtec_dev *stdev = stuser->stdev;
 477         int rc;
 478 
 479         if (size < sizeof(stuser->cmd) ||
 480             size > sizeof(stuser->cmd) + sizeof(stuser->data))
 481                 return -EINVAL;
 482 
 483         rc = lock_mutex_and_test_alive(stdev);
 484         if (rc)
 485                 return rc;
 486 
 487         if (stuser->state == MRPC_IDLE) {
 488                 mutex_unlock(&stdev->mrpc_mutex);
 489                 return -EBADE;
 490         }
 491 
 492         stuser->read_len = size - sizeof(stuser->return_code);
 493 
 494         mutex_unlock(&stdev->mrpc_mutex);
 495 
 496         if (filp->f_flags & O_NONBLOCK) {
 497                 if (!try_wait_for_completion(&stuser->comp))
 498                         return -EAGAIN;
 499         } else {
 500                 rc = wait_for_completion_interruptible(&stuser->comp);
 501                 if (rc < 0)
 502                         return rc;
 503         }
 504 
 505         rc = lock_mutex_and_test_alive(stdev);
 506         if (rc)
 507                 return rc;
 508 
 509         if (stuser->state != MRPC_DONE) {
 510                 mutex_unlock(&stdev->mrpc_mutex);
 511                 return -EBADE;
 512         }
 513 
 514         rc = copy_to_user(data, &stuser->return_code,
 515                           sizeof(stuser->return_code));
 516         if (rc) {
 517                 rc = -EFAULT;
 518                 goto out;
 519         }
 520 
 521         data += sizeof(stuser->return_code);
 522         rc = copy_to_user(data, &stuser->data,
 523                           size - sizeof(stuser->return_code));
 524         if (rc) {
 525                 rc = -EFAULT;
 526                 goto out;
 527         }
 528 
 529         stuser_set_state(stuser, MRPC_IDLE);
 530 
 531 out:
 532         mutex_unlock(&stdev->mrpc_mutex);
 533 
 534         if (stuser->status == SWITCHTEC_MRPC_STATUS_DONE)
 535                 return size;
 536         else if (stuser->status == SWITCHTEC_MRPC_STATUS_INTERRUPTED)
 537                 return -ENXIO;
 538         else
 539                 return -EBADMSG;
 540 }
 541 
 542 static __poll_t switchtec_dev_poll(struct file *filp, poll_table *wait)
 543 {
 544         struct switchtec_user *stuser = filp->private_data;
 545         struct switchtec_dev *stdev = stuser->stdev;
 546         __poll_t ret = 0;
 547 
 548         poll_wait(filp, &stuser->comp.wait, wait);
 549         poll_wait(filp, &stdev->event_wq, wait);
 550 
 551         if (lock_mutex_and_test_alive(stdev))
 552                 return EPOLLIN | EPOLLRDHUP | EPOLLOUT | EPOLLERR | EPOLLHUP;
 553 
 554         mutex_unlock(&stdev->mrpc_mutex);
 555 
 556         if (try_wait_for_completion(&stuser->comp))
 557                 ret |= EPOLLIN | EPOLLRDNORM;
 558 
 559         if (stuser->event_cnt != atomic_read(&stdev->event_cnt))
 560                 ret |= EPOLLPRI | EPOLLRDBAND;
 561 
 562         return ret;
 563 }
 564 
 565 static int ioctl_flash_info(struct switchtec_dev *stdev,
 566                             struct switchtec_ioctl_flash_info __user *uinfo)
 567 {
 568         struct switchtec_ioctl_flash_info info = {0};
 569         struct flash_info_regs __iomem *fi = stdev->mmio_flash_info;
 570 
 571         info.flash_length = ioread32(&fi->flash_length);
 572         info.num_partitions = SWITCHTEC_IOCTL_NUM_PARTITIONS;
 573 
 574         if (copy_to_user(uinfo, &info, sizeof(info)))
 575                 return -EFAULT;
 576 
 577         return 0;
 578 }
 579 
 580 static void set_fw_info_part(struct switchtec_ioctl_flash_part_info *info,
 581                              struct partition_info __iomem *pi)
 582 {
 583         info->address = ioread32(&pi->address);
 584         info->length = ioread32(&pi->length);
 585 }
 586 
 587 static int ioctl_flash_part_info(struct switchtec_dev *stdev,
 588         struct switchtec_ioctl_flash_part_info __user *uinfo)
 589 {
 590         struct switchtec_ioctl_flash_part_info info = {0};
 591         struct flash_info_regs __iomem *fi = stdev->mmio_flash_info;
 592         struct sys_info_regs __iomem *si = stdev->mmio_sys_info;
 593         u32 active_addr = -1;
 594 
 595         if (copy_from_user(&info, uinfo, sizeof(info)))
 596                 return -EFAULT;
 597 
 598         switch (info.flash_partition) {
 599         case SWITCHTEC_IOCTL_PART_CFG0:
 600                 active_addr = ioread32(&fi->active_cfg);
 601                 set_fw_info_part(&info, &fi->cfg0);
 602                 if (ioread16(&si->cfg_running) == SWITCHTEC_CFG0_RUNNING)
 603                         info.active |= SWITCHTEC_IOCTL_PART_RUNNING;
 604                 break;
 605         case SWITCHTEC_IOCTL_PART_CFG1:
 606                 active_addr = ioread32(&fi->active_cfg);
 607                 set_fw_info_part(&info, &fi->cfg1);
 608                 if (ioread16(&si->cfg_running) == SWITCHTEC_CFG1_RUNNING)
 609                         info.active |= SWITCHTEC_IOCTL_PART_RUNNING;
 610                 break;
 611         case SWITCHTEC_IOCTL_PART_IMG0:
 612                 active_addr = ioread32(&fi->active_img);
 613                 set_fw_info_part(&info, &fi->img0);
 614                 if (ioread16(&si->img_running) == SWITCHTEC_IMG0_RUNNING)
 615                         info.active |= SWITCHTEC_IOCTL_PART_RUNNING;
 616                 break;
 617         case SWITCHTEC_IOCTL_PART_IMG1:
 618                 active_addr = ioread32(&fi->active_img);
 619                 set_fw_info_part(&info, &fi->img1);
 620                 if (ioread16(&si->img_running) == SWITCHTEC_IMG1_RUNNING)
 621                         info.active |= SWITCHTEC_IOCTL_PART_RUNNING;
 622                 break;
 623         case SWITCHTEC_IOCTL_PART_NVLOG:
 624                 set_fw_info_part(&info, &fi->nvlog);
 625                 break;
 626         case SWITCHTEC_IOCTL_PART_VENDOR0:
 627                 set_fw_info_part(&info, &fi->vendor[0]);
 628                 break;
 629         case SWITCHTEC_IOCTL_PART_VENDOR1:
 630                 set_fw_info_part(&info, &fi->vendor[1]);
 631                 break;
 632         case SWITCHTEC_IOCTL_PART_VENDOR2:
 633                 set_fw_info_part(&info, &fi->vendor[2]);
 634                 break;
 635         case SWITCHTEC_IOCTL_PART_VENDOR3:
 636                 set_fw_info_part(&info, &fi->vendor[3]);
 637                 break;
 638         case SWITCHTEC_IOCTL_PART_VENDOR4:
 639                 set_fw_info_part(&info, &fi->vendor[4]);
 640                 break;
 641         case SWITCHTEC_IOCTL_PART_VENDOR5:
 642                 set_fw_info_part(&info, &fi->vendor[5]);
 643                 break;
 644         case SWITCHTEC_IOCTL_PART_VENDOR6:
 645                 set_fw_info_part(&info, &fi->vendor[6]);
 646                 break;
 647         case SWITCHTEC_IOCTL_PART_VENDOR7:
 648                 set_fw_info_part(&info, &fi->vendor[7]);
 649                 break;
 650         default:
 651                 return -EINVAL;
 652         }
 653 
 654         if (info.address == active_addr)
 655                 info.active |= SWITCHTEC_IOCTL_PART_ACTIVE;
 656 
 657         if (copy_to_user(uinfo, &info, sizeof(info)))
 658                 return -EFAULT;
 659 
 660         return 0;
 661 }
 662 
 663 static int ioctl_event_summary(struct switchtec_dev *stdev,
 664         struct switchtec_user *stuser,
 665         struct switchtec_ioctl_event_summary __user *usum,
 666         size_t size)
 667 {
 668         struct switchtec_ioctl_event_summary *s;
 669         int i;
 670         u32 reg;
 671         int ret = 0;
 672 
 673         s = kzalloc(sizeof(*s), GFP_KERNEL);
 674         if (!s)
 675                 return -ENOMEM;
 676 
 677         s->global = ioread32(&stdev->mmio_sw_event->global_summary);
 678         s->part_bitmap = ioread64(&stdev->mmio_sw_event->part_event_bitmap);
 679         s->local_part = ioread32(&stdev->mmio_part_cfg->part_event_summary);
 680 
 681         for (i = 0; i < stdev->partition_count; i++) {
 682                 reg = ioread32(&stdev->mmio_part_cfg_all[i].part_event_summary);
 683                 s->part[i] = reg;
 684         }
 685 
 686         for (i = 0; i < SWITCHTEC_MAX_PFF_CSR; i++) {
 687                 reg = ioread16(&stdev->mmio_pff_csr[i].vendor_id);
 688                 if (reg != PCI_VENDOR_ID_MICROSEMI)
 689                         break;
 690 
 691                 reg = ioread32(&stdev->mmio_pff_csr[i].pff_event_summary);
 692                 s->pff[i] = reg;
 693         }
 694 
 695         if (copy_to_user(usum, s, size)) {
 696                 ret = -EFAULT;
 697                 goto error_case;
 698         }
 699 
 700         stuser->event_cnt = atomic_read(&stdev->event_cnt);
 701 
 702 error_case:
 703         kfree(s);
 704         return ret;
 705 }
 706 
 707 static u32 __iomem *global_ev_reg(struct switchtec_dev *stdev,
 708                                   size_t offset, int index)
 709 {
 710         return (void __iomem *)stdev->mmio_sw_event + offset;
 711 }
 712 
 713 static u32 __iomem *part_ev_reg(struct switchtec_dev *stdev,
 714                                 size_t offset, int index)
 715 {
 716         return (void __iomem *)&stdev->mmio_part_cfg_all[index] + offset;
 717 }
 718 
 719 static u32 __iomem *pff_ev_reg(struct switchtec_dev *stdev,
 720                                size_t offset, int index)
 721 {
 722         return (void __iomem *)&stdev->mmio_pff_csr[index] + offset;
 723 }
 724 
 725 #define EV_GLB(i, r)[i] = {offsetof(struct sw_event_regs, r), global_ev_reg}
 726 #define EV_PAR(i, r)[i] = {offsetof(struct part_cfg_regs, r), part_ev_reg}
 727 #define EV_PFF(i, r)[i] = {offsetof(struct pff_csr_regs, r), pff_ev_reg}
 728 
 729 static const struct event_reg {
 730         size_t offset;
 731         u32 __iomem *(*map_reg)(struct switchtec_dev *stdev,
 732                                 size_t offset, int index);
 733 } event_regs[] = {
 734         EV_GLB(SWITCHTEC_IOCTL_EVENT_STACK_ERROR, stack_error_event_hdr),
 735         EV_GLB(SWITCHTEC_IOCTL_EVENT_PPU_ERROR, ppu_error_event_hdr),
 736         EV_GLB(SWITCHTEC_IOCTL_EVENT_ISP_ERROR, isp_error_event_hdr),
 737         EV_GLB(SWITCHTEC_IOCTL_EVENT_SYS_RESET, sys_reset_event_hdr),
 738         EV_GLB(SWITCHTEC_IOCTL_EVENT_FW_EXC, fw_exception_hdr),
 739         EV_GLB(SWITCHTEC_IOCTL_EVENT_FW_NMI, fw_nmi_hdr),
 740         EV_GLB(SWITCHTEC_IOCTL_EVENT_FW_NON_FATAL, fw_non_fatal_hdr),
 741         EV_GLB(SWITCHTEC_IOCTL_EVENT_FW_FATAL, fw_fatal_hdr),
 742         EV_GLB(SWITCHTEC_IOCTL_EVENT_TWI_MRPC_COMP, twi_mrpc_comp_hdr),
 743         EV_GLB(SWITCHTEC_IOCTL_EVENT_TWI_MRPC_COMP_ASYNC,
 744                twi_mrpc_comp_async_hdr),
 745         EV_GLB(SWITCHTEC_IOCTL_EVENT_CLI_MRPC_COMP, cli_mrpc_comp_hdr),
 746         EV_GLB(SWITCHTEC_IOCTL_EVENT_CLI_MRPC_COMP_ASYNC,
 747                cli_mrpc_comp_async_hdr),
 748         EV_GLB(SWITCHTEC_IOCTL_EVENT_GPIO_INT, gpio_interrupt_hdr),
 749         EV_GLB(SWITCHTEC_IOCTL_EVENT_GFMS, gfms_event_hdr),
 750         EV_PAR(SWITCHTEC_IOCTL_EVENT_PART_RESET, part_reset_hdr),
 751         EV_PAR(SWITCHTEC_IOCTL_EVENT_MRPC_COMP, mrpc_comp_hdr),
 752         EV_PAR(SWITCHTEC_IOCTL_EVENT_MRPC_COMP_ASYNC, mrpc_comp_async_hdr),
 753         EV_PAR(SWITCHTEC_IOCTL_EVENT_DYN_PART_BIND_COMP, dyn_binding_hdr),
 754         EV_PFF(SWITCHTEC_IOCTL_EVENT_AER_IN_P2P, aer_in_p2p_hdr),
 755         EV_PFF(SWITCHTEC_IOCTL_EVENT_AER_IN_VEP, aer_in_vep_hdr),
 756         EV_PFF(SWITCHTEC_IOCTL_EVENT_DPC, dpc_hdr),
 757         EV_PFF(SWITCHTEC_IOCTL_EVENT_CTS, cts_hdr),
 758         EV_PFF(SWITCHTEC_IOCTL_EVENT_HOTPLUG, hotplug_hdr),
 759         EV_PFF(SWITCHTEC_IOCTL_EVENT_IER, ier_hdr),
 760         EV_PFF(SWITCHTEC_IOCTL_EVENT_THRESH, threshold_hdr),
 761         EV_PFF(SWITCHTEC_IOCTL_EVENT_POWER_MGMT, power_mgmt_hdr),
 762         EV_PFF(SWITCHTEC_IOCTL_EVENT_TLP_THROTTLING, tlp_throttling_hdr),
 763         EV_PFF(SWITCHTEC_IOCTL_EVENT_FORCE_SPEED, force_speed_hdr),
 764         EV_PFF(SWITCHTEC_IOCTL_EVENT_CREDIT_TIMEOUT, credit_timeout_hdr),
 765         EV_PFF(SWITCHTEC_IOCTL_EVENT_LINK_STATE, link_state_hdr),
 766 };
 767 
 768 static u32 __iomem *event_hdr_addr(struct switchtec_dev *stdev,
 769                                    int event_id, int index)
 770 {
 771         size_t off;
 772 
 773         if (event_id < 0 || event_id >= SWITCHTEC_IOCTL_MAX_EVENTS)
 774                 return ERR_PTR(-EINVAL);
 775 
 776         off = event_regs[event_id].offset;
 777 
 778         if (event_regs[event_id].map_reg == part_ev_reg) {
 779                 if (index == SWITCHTEC_IOCTL_EVENT_LOCAL_PART_IDX)
 780                         index = stdev->partition;
 781                 else if (index < 0 || index >= stdev->partition_count)
 782                         return ERR_PTR(-EINVAL);
 783         } else if (event_regs[event_id].map_reg == pff_ev_reg) {
 784                 if (index < 0 || index >= stdev->pff_csr_count)
 785                         return ERR_PTR(-EINVAL);
 786         }
 787 
 788         return event_regs[event_id].map_reg(stdev, off, index);
 789 }
 790 
 791 static int event_ctl(struct switchtec_dev *stdev,
 792                      struct switchtec_ioctl_event_ctl *ctl)
 793 {
 794         int i;
 795         u32 __iomem *reg;
 796         u32 hdr;
 797 
 798         reg = event_hdr_addr(stdev, ctl->event_id, ctl->index);
 799         if (IS_ERR(reg))
 800                 return PTR_ERR(reg);
 801 
 802         hdr = ioread32(reg);
 803         for (i = 0; i < ARRAY_SIZE(ctl->data); i++)
 804                 ctl->data[i] = ioread32(&reg[i + 1]);
 805 
 806         ctl->occurred = hdr & SWITCHTEC_EVENT_OCCURRED;
 807         ctl->count = (hdr >> 5) & 0xFF;
 808 
 809         if (!(ctl->flags & SWITCHTEC_IOCTL_EVENT_FLAG_CLEAR))
 810                 hdr &= ~SWITCHTEC_EVENT_CLEAR;
 811         if (ctl->flags & SWITCHTEC_IOCTL_EVENT_FLAG_EN_POLL)
 812                 hdr |= SWITCHTEC_EVENT_EN_IRQ;
 813         if (ctl->flags & SWITCHTEC_IOCTL_EVENT_FLAG_DIS_POLL)
 814                 hdr &= ~SWITCHTEC_EVENT_EN_IRQ;
 815         if (ctl->flags & SWITCHTEC_IOCTL_EVENT_FLAG_EN_LOG)
 816                 hdr |= SWITCHTEC_EVENT_EN_LOG;
 817         if (ctl->flags & SWITCHTEC_IOCTL_EVENT_FLAG_DIS_LOG)
 818                 hdr &= ~SWITCHTEC_EVENT_EN_LOG;
 819         if (ctl->flags & SWITCHTEC_IOCTL_EVENT_FLAG_EN_CLI)
 820                 hdr |= SWITCHTEC_EVENT_EN_CLI;
 821         if (ctl->flags & SWITCHTEC_IOCTL_EVENT_FLAG_DIS_CLI)
 822                 hdr &= ~SWITCHTEC_EVENT_EN_CLI;
 823         if (ctl->flags & SWITCHTEC_IOCTL_EVENT_FLAG_EN_FATAL)
 824                 hdr |= SWITCHTEC_EVENT_FATAL;
 825         if (ctl->flags & SWITCHTEC_IOCTL_EVENT_FLAG_DIS_FATAL)
 826                 hdr &= ~SWITCHTEC_EVENT_FATAL;
 827 
 828         if (ctl->flags)
 829                 iowrite32(hdr, reg);
 830 
 831         ctl->flags = 0;
 832         if (hdr & SWITCHTEC_EVENT_EN_IRQ)
 833                 ctl->flags |= SWITCHTEC_IOCTL_EVENT_FLAG_EN_POLL;
 834         if (hdr & SWITCHTEC_EVENT_EN_LOG)
 835                 ctl->flags |= SWITCHTEC_IOCTL_EVENT_FLAG_EN_LOG;
 836         if (hdr & SWITCHTEC_EVENT_EN_CLI)
 837                 ctl->flags |= SWITCHTEC_IOCTL_EVENT_FLAG_EN_CLI;
 838         if (hdr & SWITCHTEC_EVENT_FATAL)
 839                 ctl->flags |= SWITCHTEC_IOCTL_EVENT_FLAG_EN_FATAL;
 840 
 841         return 0;
 842 }
 843 
 844 static int ioctl_event_ctl(struct switchtec_dev *stdev,
 845         struct switchtec_ioctl_event_ctl __user *uctl)
 846 {
 847         int ret;
 848         int nr_idxs;
 849         unsigned int event_flags;
 850         struct switchtec_ioctl_event_ctl ctl;
 851 
 852         if (copy_from_user(&ctl, uctl, sizeof(ctl)))
 853                 return -EFAULT;
 854 
 855         if (ctl.event_id >= SWITCHTEC_IOCTL_MAX_EVENTS)
 856                 return -EINVAL;
 857 
 858         if (ctl.flags & SWITCHTEC_IOCTL_EVENT_FLAG_UNUSED)
 859                 return -EINVAL;
 860 
 861         if (ctl.index == SWITCHTEC_IOCTL_EVENT_IDX_ALL) {
 862                 if (event_regs[ctl.event_id].map_reg == global_ev_reg)
 863                         nr_idxs = 1;
 864                 else if (event_regs[ctl.event_id].map_reg == part_ev_reg)
 865                         nr_idxs = stdev->partition_count;
 866                 else if (event_regs[ctl.event_id].map_reg == pff_ev_reg)
 867                         nr_idxs = stdev->pff_csr_count;
 868                 else
 869                         return -EINVAL;
 870 
 871                 event_flags = ctl.flags;
 872                 for (ctl.index = 0; ctl.index < nr_idxs; ctl.index++) {
 873                         ctl.flags = event_flags;
 874                         ret = event_ctl(stdev, &ctl);
 875                         if (ret < 0)
 876                                 return ret;
 877                 }
 878         } else {
 879                 ret = event_ctl(stdev, &ctl);
 880                 if (ret < 0)
 881                         return ret;
 882         }
 883 
 884         if (copy_to_user(uctl, &ctl, sizeof(ctl)))
 885                 return -EFAULT;
 886 
 887         return 0;
 888 }
 889 
 890 static int ioctl_pff_to_port(struct switchtec_dev *stdev,
 891                              struct switchtec_ioctl_pff_port *up)
 892 {
 893         int i, part;
 894         u32 reg;
 895         struct part_cfg_regs *pcfg;
 896         struct switchtec_ioctl_pff_port p;
 897 
 898         if (copy_from_user(&p, up, sizeof(p)))
 899                 return -EFAULT;
 900 
 901         p.port = -1;
 902         for (part = 0; part < stdev->partition_count; part++) {
 903                 pcfg = &stdev->mmio_part_cfg_all[part];
 904                 p.partition = part;
 905 
 906                 reg = ioread32(&pcfg->usp_pff_inst_id);
 907                 if (reg == p.pff) {
 908                         p.port = 0;
 909                         break;
 910                 }
 911 
 912                 reg = ioread32(&pcfg->vep_pff_inst_id);
 913                 if (reg == p.pff) {
 914                         p.port = SWITCHTEC_IOCTL_PFF_VEP;
 915                         break;
 916                 }
 917 
 918                 for (i = 0; i < ARRAY_SIZE(pcfg->dsp_pff_inst_id); i++) {
 919                         reg = ioread32(&pcfg->dsp_pff_inst_id[i]);
 920                         if (reg != p.pff)
 921                                 continue;
 922 
 923                         p.port = i + 1;
 924                         break;
 925                 }
 926 
 927                 if (p.port != -1)
 928                         break;
 929         }
 930 
 931         if (copy_to_user(up, &p, sizeof(p)))
 932                 return -EFAULT;
 933 
 934         return 0;
 935 }
 936 
 937 static int ioctl_port_to_pff(struct switchtec_dev *stdev,
 938                              struct switchtec_ioctl_pff_port *up)
 939 {
 940         struct switchtec_ioctl_pff_port p;
 941         struct part_cfg_regs *pcfg;
 942 
 943         if (copy_from_user(&p, up, sizeof(p)))
 944                 return -EFAULT;
 945 
 946         if (p.partition == SWITCHTEC_IOCTL_EVENT_LOCAL_PART_IDX)
 947                 pcfg = stdev->mmio_part_cfg;
 948         else if (p.partition < stdev->partition_count)
 949                 pcfg = &stdev->mmio_part_cfg_all[p.partition];
 950         else
 951                 return -EINVAL;
 952 
 953         switch (p.port) {
 954         case 0:
 955                 p.pff = ioread32(&pcfg->usp_pff_inst_id);
 956                 break;
 957         case SWITCHTEC_IOCTL_PFF_VEP:
 958                 p.pff = ioread32(&pcfg->vep_pff_inst_id);
 959                 break;
 960         default:
 961                 if (p.port > ARRAY_SIZE(pcfg->dsp_pff_inst_id))
 962                         return -EINVAL;
 963                 p.port = array_index_nospec(p.port,
 964                                         ARRAY_SIZE(pcfg->dsp_pff_inst_id) + 1);
 965                 p.pff = ioread32(&pcfg->dsp_pff_inst_id[p.port - 1]);
 966                 break;
 967         }
 968 
 969         if (copy_to_user(up, &p, sizeof(p)))
 970                 return -EFAULT;
 971 
 972         return 0;
 973 }
 974 
 975 static long switchtec_dev_ioctl(struct file *filp, unsigned int cmd,
 976                                 unsigned long arg)
 977 {
 978         struct switchtec_user *stuser = filp->private_data;
 979         struct switchtec_dev *stdev = stuser->stdev;
 980         int rc;
 981         void __user *argp = (void __user *)arg;
 982 
 983         rc = lock_mutex_and_test_alive(stdev);
 984         if (rc)
 985                 return rc;
 986 
 987         switch (cmd) {
 988         case SWITCHTEC_IOCTL_FLASH_INFO:
 989                 rc = ioctl_flash_info(stdev, argp);
 990                 break;
 991         case SWITCHTEC_IOCTL_FLASH_PART_INFO:
 992                 rc = ioctl_flash_part_info(stdev, argp);
 993                 break;
 994         case SWITCHTEC_IOCTL_EVENT_SUMMARY_LEGACY:
 995                 rc = ioctl_event_summary(stdev, stuser, argp,
 996                                          sizeof(struct switchtec_ioctl_event_summary_legacy));
 997                 break;
 998         case SWITCHTEC_IOCTL_EVENT_CTL:
 999                 rc = ioctl_event_ctl(stdev, argp);
1000                 break;
1001         case SWITCHTEC_IOCTL_PFF_TO_PORT:
1002                 rc = ioctl_pff_to_port(stdev, argp);
1003                 break;
1004         case SWITCHTEC_IOCTL_PORT_TO_PFF:
1005                 rc = ioctl_port_to_pff(stdev, argp);
1006                 break;
1007         case SWITCHTEC_IOCTL_EVENT_SUMMARY:
1008                 rc = ioctl_event_summary(stdev, stuser, argp,
1009                                          sizeof(struct switchtec_ioctl_event_summary));
1010                 break;
1011         default:
1012                 rc = -ENOTTY;
1013                 break;
1014         }
1015 
1016         mutex_unlock(&stdev->mrpc_mutex);
1017         return rc;
1018 }
1019 
1020 static const struct file_operations switchtec_fops = {
1021         .owner = THIS_MODULE,
1022         .open = switchtec_dev_open,
1023         .release = switchtec_dev_release,
1024         .write = switchtec_dev_write,
1025         .read = switchtec_dev_read,
1026         .poll = switchtec_dev_poll,
1027         .unlocked_ioctl = switchtec_dev_ioctl,
1028         .compat_ioctl = switchtec_dev_ioctl,
1029 };
1030 
1031 static void link_event_work(struct work_struct *work)
1032 {
1033         struct switchtec_dev *stdev;
1034 
1035         stdev = container_of(work, struct switchtec_dev, link_event_work);
1036 
1037         if (stdev->link_notifier)
1038                 stdev->link_notifier(stdev);
1039 }
1040 
1041 static void check_link_state_events(struct switchtec_dev *stdev)
1042 {
1043         int idx;
1044         u32 reg;
1045         int count;
1046         int occurred = 0;
1047 
1048         for (idx = 0; idx < stdev->pff_csr_count; idx++) {
1049                 reg = ioread32(&stdev->mmio_pff_csr[idx].link_state_hdr);
1050                 dev_dbg(&stdev->dev, "link_state: %d->%08x\n", idx, reg);
1051                 count = (reg >> 5) & 0xFF;
1052 
1053                 if (count != stdev->link_event_count[idx]) {
1054                         occurred = 1;
1055                         stdev->link_event_count[idx] = count;
1056                 }
1057         }
1058 
1059         if (occurred)
1060                 schedule_work(&stdev->link_event_work);
1061 }
1062 
1063 static void enable_link_state_events(struct switchtec_dev *stdev)
1064 {
1065         int idx;
1066 
1067         for (idx = 0; idx < stdev->pff_csr_count; idx++) {
1068                 iowrite32(SWITCHTEC_EVENT_CLEAR |
1069                           SWITCHTEC_EVENT_EN_IRQ,
1070                           &stdev->mmio_pff_csr[idx].link_state_hdr);
1071         }
1072 }
1073 
1074 static void enable_dma_mrpc(struct switchtec_dev *stdev)
1075 {
1076         writeq(stdev->dma_mrpc_dma_addr, &stdev->mmio_mrpc->dma_addr);
1077         flush_wc_buf(stdev);
1078         iowrite32(SWITCHTEC_DMA_MRPC_EN, &stdev->mmio_mrpc->dma_en);
1079 }
1080 
1081 static void stdev_release(struct device *dev)
1082 {
1083         struct switchtec_dev *stdev = to_stdev(dev);
1084 
1085         if (stdev->dma_mrpc) {
1086                 iowrite32(0, &stdev->mmio_mrpc->dma_en);
1087                 flush_wc_buf(stdev);
1088                 writeq(0, &stdev->mmio_mrpc->dma_addr);
1089                 dma_free_coherent(&stdev->pdev->dev, sizeof(*stdev->dma_mrpc),
1090                                 stdev->dma_mrpc, stdev->dma_mrpc_dma_addr);
1091         }
1092         kfree(stdev);
1093 }
1094 
1095 static void stdev_kill(struct switchtec_dev *stdev)
1096 {
1097         struct switchtec_user *stuser, *tmpuser;
1098 
1099         pci_clear_master(stdev->pdev);
1100 
1101         cancel_delayed_work_sync(&stdev->mrpc_timeout);
1102 
1103         /* Mark the hardware as unavailable and complete all completions */
1104         mutex_lock(&stdev->mrpc_mutex);
1105         stdev->alive = false;
1106 
1107         /* Wake up and kill any users waiting on an MRPC request */
1108         list_for_each_entry_safe(stuser, tmpuser, &stdev->mrpc_queue, list) {
1109                 complete_all(&stuser->comp);
1110                 list_del_init(&stuser->list);
1111                 stuser_put(stuser);
1112         }
1113 
1114         mutex_unlock(&stdev->mrpc_mutex);
1115 
1116         /* Wake up any users waiting on event_wq */
1117         wake_up_interruptible(&stdev->event_wq);
1118 }
1119 
1120 static struct switchtec_dev *stdev_create(struct pci_dev *pdev)
1121 {
1122         struct switchtec_dev *stdev;
1123         int minor;
1124         struct device *dev;
1125         struct cdev *cdev;
1126         int rc;
1127 
1128         stdev = kzalloc_node(sizeof(*stdev), GFP_KERNEL,
1129                              dev_to_node(&pdev->dev));
1130         if (!stdev)
1131                 return ERR_PTR(-ENOMEM);
1132 
1133         stdev->alive = true;
1134         stdev->pdev = pdev;
1135         INIT_LIST_HEAD(&stdev->mrpc_queue);
1136         mutex_init(&stdev->mrpc_mutex);
1137         stdev->mrpc_busy = 0;
1138         INIT_WORK(&stdev->mrpc_work, mrpc_event_work);
1139         INIT_DELAYED_WORK(&stdev->mrpc_timeout, mrpc_timeout_work);
1140         INIT_WORK(&stdev->link_event_work, link_event_work);
1141         init_waitqueue_head(&stdev->event_wq);
1142         atomic_set(&stdev->event_cnt, 0);
1143 
1144         dev = &stdev->dev;
1145         device_initialize(dev);
1146         dev->class = switchtec_class;
1147         dev->parent = &pdev->dev;
1148         dev->groups = switchtec_device_groups;
1149         dev->release = stdev_release;
1150 
1151         minor = ida_simple_get(&switchtec_minor_ida, 0, 0,
1152                                GFP_KERNEL);
1153         if (minor < 0) {
1154                 rc = minor;
1155                 goto err_put;
1156         }
1157 
1158         dev->devt = MKDEV(MAJOR(switchtec_devt), minor);
1159         dev_set_name(dev, "switchtec%d", minor);
1160 
1161         cdev = &stdev->cdev;
1162         cdev_init(cdev, &switchtec_fops);
1163         cdev->owner = THIS_MODULE;
1164 
1165         return stdev;
1166 
1167 err_put:
1168         put_device(&stdev->dev);
1169         return ERR_PTR(rc);
1170 }
1171 
1172 static int mask_event(struct switchtec_dev *stdev, int eid, int idx)
1173 {
1174         size_t off = event_regs[eid].offset;
1175         u32 __iomem *hdr_reg;
1176         u32 hdr;
1177 
1178         hdr_reg = event_regs[eid].map_reg(stdev, off, idx);
1179         hdr = ioread32(hdr_reg);
1180 
1181         if (!(hdr & SWITCHTEC_EVENT_OCCURRED && hdr & SWITCHTEC_EVENT_EN_IRQ))
1182                 return 0;
1183 
1184         if (eid == SWITCHTEC_IOCTL_EVENT_LINK_STATE ||
1185             eid == SWITCHTEC_IOCTL_EVENT_MRPC_COMP)
1186                 return 0;
1187 
1188         dev_dbg(&stdev->dev, "%s: %d %d %x\n", __func__, eid, idx, hdr);
1189         hdr &= ~(SWITCHTEC_EVENT_EN_IRQ | SWITCHTEC_EVENT_OCCURRED);
1190         iowrite32(hdr, hdr_reg);
1191 
1192         return 1;
1193 }
1194 
1195 static int mask_all_events(struct switchtec_dev *stdev, int eid)
1196 {
1197         int idx;
1198         int count = 0;
1199 
1200         if (event_regs[eid].map_reg == part_ev_reg) {
1201                 for (idx = 0; idx < stdev->partition_count; idx++)
1202                         count += mask_event(stdev, eid, idx);
1203         } else if (event_regs[eid].map_reg == pff_ev_reg) {
1204                 for (idx = 0; idx < stdev->pff_csr_count; idx++) {
1205                         if (!stdev->pff_local[idx])
1206                                 continue;
1207 
1208                         count += mask_event(stdev, eid, idx);
1209                 }
1210         } else {
1211                 count += mask_event(stdev, eid, 0);
1212         }
1213 
1214         return count;
1215 }
1216 
1217 static irqreturn_t switchtec_event_isr(int irq, void *dev)
1218 {
1219         struct switchtec_dev *stdev = dev;
1220         u32 reg;
1221         irqreturn_t ret = IRQ_NONE;
1222         int eid, event_count = 0;
1223 
1224         reg = ioread32(&stdev->mmio_part_cfg->mrpc_comp_hdr);
1225         if (reg & SWITCHTEC_EVENT_OCCURRED) {
1226                 dev_dbg(&stdev->dev, "%s: mrpc comp\n", __func__);
1227                 ret = IRQ_HANDLED;
1228                 schedule_work(&stdev->mrpc_work);
1229                 iowrite32(reg, &stdev->mmio_part_cfg->mrpc_comp_hdr);
1230         }
1231 
1232         check_link_state_events(stdev);
1233 
1234         for (eid = 0; eid < SWITCHTEC_IOCTL_MAX_EVENTS; eid++)
1235                 event_count += mask_all_events(stdev, eid);
1236 
1237         if (event_count) {
1238                 atomic_inc(&stdev->event_cnt);
1239                 wake_up_interruptible(&stdev->event_wq);
1240                 dev_dbg(&stdev->dev, "%s: %d events\n", __func__,
1241                         event_count);
1242                 return IRQ_HANDLED;
1243         }
1244 
1245         return ret;
1246 }
1247 
1248 
1249 static irqreturn_t switchtec_dma_mrpc_isr(int irq, void *dev)
1250 {
1251         struct switchtec_dev *stdev = dev;
1252         irqreturn_t ret = IRQ_NONE;
1253 
1254         iowrite32(SWITCHTEC_EVENT_CLEAR |
1255                   SWITCHTEC_EVENT_EN_IRQ,
1256                   &stdev->mmio_part_cfg->mrpc_comp_hdr);
1257         schedule_work(&stdev->mrpc_work);
1258 
1259         ret = IRQ_HANDLED;
1260         return ret;
1261 }
1262 
1263 static int switchtec_init_isr(struct switchtec_dev *stdev)
1264 {
1265         int nvecs;
1266         int event_irq;
1267         int dma_mrpc_irq;
1268         int rc;
1269 
1270         if (nirqs < 4)
1271                 nirqs = 4;
1272 
1273         nvecs = pci_alloc_irq_vectors(stdev->pdev, 1, nirqs,
1274                                       PCI_IRQ_MSIX | PCI_IRQ_MSI |
1275                                       PCI_IRQ_VIRTUAL);
1276         if (nvecs < 0)
1277                 return nvecs;
1278 
1279         event_irq = ioread16(&stdev->mmio_part_cfg->vep_vector_number);
1280         if (event_irq < 0 || event_irq >= nvecs)
1281                 return -EFAULT;
1282 
1283         event_irq = pci_irq_vector(stdev->pdev, event_irq);
1284         if (event_irq < 0)
1285                 return event_irq;
1286 
1287         rc = devm_request_irq(&stdev->pdev->dev, event_irq,
1288                                 switchtec_event_isr, 0,
1289                                 KBUILD_MODNAME, stdev);
1290 
1291         if (rc)
1292                 return rc;
1293 
1294         if (!stdev->dma_mrpc)
1295                 return rc;
1296 
1297         dma_mrpc_irq = ioread32(&stdev->mmio_mrpc->dma_vector);
1298         if (dma_mrpc_irq < 0 || dma_mrpc_irq >= nvecs)
1299                 return -EFAULT;
1300 
1301         dma_mrpc_irq  = pci_irq_vector(stdev->pdev, dma_mrpc_irq);
1302         if (dma_mrpc_irq < 0)
1303                 return dma_mrpc_irq;
1304 
1305         rc = devm_request_irq(&stdev->pdev->dev, dma_mrpc_irq,
1306                                 switchtec_dma_mrpc_isr, 0,
1307                                 KBUILD_MODNAME, stdev);
1308 
1309         return rc;
1310 }
1311 
1312 static void init_pff(struct switchtec_dev *stdev)
1313 {
1314         int i;
1315         u32 reg;
1316         struct part_cfg_regs *pcfg = stdev->mmio_part_cfg;
1317 
1318         for (i = 0; i < SWITCHTEC_MAX_PFF_CSR; i++) {
1319                 reg = ioread16(&stdev->mmio_pff_csr[i].vendor_id);
1320                 if (reg != PCI_VENDOR_ID_MICROSEMI)
1321                         break;
1322         }
1323 
1324         stdev->pff_csr_count = i;
1325 
1326         reg = ioread32(&pcfg->usp_pff_inst_id);
1327         if (reg < SWITCHTEC_MAX_PFF_CSR)
1328                 stdev->pff_local[reg] = 1;
1329 
1330         reg = ioread32(&pcfg->vep_pff_inst_id);
1331         if (reg < SWITCHTEC_MAX_PFF_CSR)
1332                 stdev->pff_local[reg] = 1;
1333 
1334         for (i = 0; i < ARRAY_SIZE(pcfg->dsp_pff_inst_id); i++) {
1335                 reg = ioread32(&pcfg->dsp_pff_inst_id[i]);
1336                 if (reg < SWITCHTEC_MAX_PFF_CSR)
1337                         stdev->pff_local[reg] = 1;
1338         }
1339 }
1340 
1341 static int switchtec_init_pci(struct switchtec_dev *stdev,
1342                               struct pci_dev *pdev)
1343 {
1344         int rc;
1345         void __iomem *map;
1346         unsigned long res_start, res_len;
1347 
1348         rc = pcim_enable_device(pdev);
1349         if (rc)
1350                 return rc;
1351 
1352         rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
1353         if (rc)
1354                 return rc;
1355 
1356         pci_set_master(pdev);
1357 
1358         res_start = pci_resource_start(pdev, 0);
1359         res_len = pci_resource_len(pdev, 0);
1360 
1361         if (!devm_request_mem_region(&pdev->dev, res_start,
1362                                      res_len, KBUILD_MODNAME))
1363                 return -EBUSY;
1364 
1365         stdev->mmio_mrpc = devm_ioremap_wc(&pdev->dev, res_start,
1366                                            SWITCHTEC_GAS_TOP_CFG_OFFSET);
1367         if (!stdev->mmio_mrpc)
1368                 return -ENOMEM;
1369 
1370         map = devm_ioremap(&pdev->dev,
1371                            res_start + SWITCHTEC_GAS_TOP_CFG_OFFSET,
1372                            res_len - SWITCHTEC_GAS_TOP_CFG_OFFSET);
1373         if (!map)
1374                 return -ENOMEM;
1375 
1376         stdev->mmio = map - SWITCHTEC_GAS_TOP_CFG_OFFSET;
1377         stdev->mmio_sw_event = stdev->mmio + SWITCHTEC_GAS_SW_EVENT_OFFSET;
1378         stdev->mmio_sys_info = stdev->mmio + SWITCHTEC_GAS_SYS_INFO_OFFSET;
1379         stdev->mmio_flash_info = stdev->mmio + SWITCHTEC_GAS_FLASH_INFO_OFFSET;
1380         stdev->mmio_ntb = stdev->mmio + SWITCHTEC_GAS_NTB_OFFSET;
1381         stdev->partition = ioread8(&stdev->mmio_sys_info->partition_id);
1382         stdev->partition_count = ioread8(&stdev->mmio_ntb->partition_count);
1383         stdev->mmio_part_cfg_all = stdev->mmio + SWITCHTEC_GAS_PART_CFG_OFFSET;
1384         stdev->mmio_part_cfg = &stdev->mmio_part_cfg_all[stdev->partition];
1385         stdev->mmio_pff_csr = stdev->mmio + SWITCHTEC_GAS_PFF_CSR_OFFSET;
1386 
1387         if (stdev->partition_count < 1)
1388                 stdev->partition_count = 1;
1389 
1390         init_pff(stdev);
1391 
1392         pci_set_drvdata(pdev, stdev);
1393 
1394         if (!use_dma_mrpc)
1395                 return 0;
1396 
1397         if (ioread32(&stdev->mmio_mrpc->dma_ver) == 0)
1398                 return 0;
1399 
1400         stdev->dma_mrpc = dma_alloc_coherent(&stdev->pdev->dev,
1401                                              sizeof(*stdev->dma_mrpc),
1402                                              &stdev->dma_mrpc_dma_addr,
1403                                              GFP_KERNEL);
1404         if (stdev->dma_mrpc == NULL)
1405                 return -ENOMEM;
1406 
1407         return 0;
1408 }
1409 
1410 static int switchtec_pci_probe(struct pci_dev *pdev,
1411                                const struct pci_device_id *id)
1412 {
1413         struct switchtec_dev *stdev;
1414         int rc;
1415 
1416         if (pdev->class == (PCI_CLASS_BRIDGE_OTHER << 8))
1417                 request_module_nowait("ntb_hw_switchtec");
1418 
1419         stdev = stdev_create(pdev);
1420         if (IS_ERR(stdev))
1421                 return PTR_ERR(stdev);
1422 
1423         rc = switchtec_init_pci(stdev, pdev);
1424         if (rc)
1425                 goto err_put;
1426 
1427         rc = switchtec_init_isr(stdev);
1428         if (rc) {
1429                 dev_err(&stdev->dev, "failed to init isr.\n");
1430                 goto err_put;
1431         }
1432 
1433         iowrite32(SWITCHTEC_EVENT_CLEAR |
1434                   SWITCHTEC_EVENT_EN_IRQ,
1435                   &stdev->mmio_part_cfg->mrpc_comp_hdr);
1436         enable_link_state_events(stdev);
1437 
1438         if (stdev->dma_mrpc)
1439                 enable_dma_mrpc(stdev);
1440 
1441         rc = cdev_device_add(&stdev->cdev, &stdev->dev);
1442         if (rc)
1443                 goto err_devadd;
1444 
1445         dev_info(&stdev->dev, "Management device registered.\n");
1446 
1447         return 0;
1448 
1449 err_devadd:
1450         stdev_kill(stdev);
1451 err_put:
1452         ida_simple_remove(&switchtec_minor_ida, MINOR(stdev->dev.devt));
1453         put_device(&stdev->dev);
1454         return rc;
1455 }
1456 
1457 static void switchtec_pci_remove(struct pci_dev *pdev)
1458 {
1459         struct switchtec_dev *stdev = pci_get_drvdata(pdev);
1460 
1461         pci_set_drvdata(pdev, NULL);
1462 
1463         cdev_device_del(&stdev->cdev, &stdev->dev);
1464         ida_simple_remove(&switchtec_minor_ida, MINOR(stdev->dev.devt));
1465         dev_info(&stdev->dev, "unregistered.\n");
1466         stdev_kill(stdev);
1467         put_device(&stdev->dev);
1468 }
1469 
1470 #define SWITCHTEC_PCI_DEVICE(device_id) \
1471         { \
1472                 .vendor     = PCI_VENDOR_ID_MICROSEMI, \
1473                 .device     = device_id, \
1474                 .subvendor  = PCI_ANY_ID, \
1475                 .subdevice  = PCI_ANY_ID, \
1476                 .class      = (PCI_CLASS_MEMORY_OTHER << 8), \
1477                 .class_mask = 0xFFFFFFFF, \
1478         }, \
1479         { \
1480                 .vendor     = PCI_VENDOR_ID_MICROSEMI, \
1481                 .device     = device_id, \
1482                 .subvendor  = PCI_ANY_ID, \
1483                 .subdevice  = PCI_ANY_ID, \
1484                 .class      = (PCI_CLASS_BRIDGE_OTHER << 8), \
1485                 .class_mask = 0xFFFFFFFF, \
1486         }
1487 
1488 static const struct pci_device_id switchtec_pci_tbl[] = {
1489         SWITCHTEC_PCI_DEVICE(0x8531),  //PFX 24xG3
1490         SWITCHTEC_PCI_DEVICE(0x8532),  //PFX 32xG3
1491         SWITCHTEC_PCI_DEVICE(0x8533),  //PFX 48xG3
1492         SWITCHTEC_PCI_DEVICE(0x8534),  //PFX 64xG3
1493         SWITCHTEC_PCI_DEVICE(0x8535),  //PFX 80xG3
1494         SWITCHTEC_PCI_DEVICE(0x8536),  //PFX 96xG3
1495         SWITCHTEC_PCI_DEVICE(0x8541),  //PSX 24xG3
1496         SWITCHTEC_PCI_DEVICE(0x8542),  //PSX 32xG3
1497         SWITCHTEC_PCI_DEVICE(0x8543),  //PSX 48xG3
1498         SWITCHTEC_PCI_DEVICE(0x8544),  //PSX 64xG3
1499         SWITCHTEC_PCI_DEVICE(0x8545),  //PSX 80xG3
1500         SWITCHTEC_PCI_DEVICE(0x8546),  //PSX 96xG3
1501         SWITCHTEC_PCI_DEVICE(0x8551),  //PAX 24XG3
1502         SWITCHTEC_PCI_DEVICE(0x8552),  //PAX 32XG3
1503         SWITCHTEC_PCI_DEVICE(0x8553),  //PAX 48XG3
1504         SWITCHTEC_PCI_DEVICE(0x8554),  //PAX 64XG3
1505         SWITCHTEC_PCI_DEVICE(0x8555),  //PAX 80XG3
1506         SWITCHTEC_PCI_DEVICE(0x8556),  //PAX 96XG3
1507         SWITCHTEC_PCI_DEVICE(0x8561),  //PFXL 24XG3
1508         SWITCHTEC_PCI_DEVICE(0x8562),  //PFXL 32XG3
1509         SWITCHTEC_PCI_DEVICE(0x8563),  //PFXL 48XG3
1510         SWITCHTEC_PCI_DEVICE(0x8564),  //PFXL 64XG3
1511         SWITCHTEC_PCI_DEVICE(0x8565),  //PFXL 80XG3
1512         SWITCHTEC_PCI_DEVICE(0x8566),  //PFXL 96XG3
1513         SWITCHTEC_PCI_DEVICE(0x8571),  //PFXI 24XG3
1514         SWITCHTEC_PCI_DEVICE(0x8572),  //PFXI 32XG3
1515         SWITCHTEC_PCI_DEVICE(0x8573),  //PFXI 48XG3
1516         SWITCHTEC_PCI_DEVICE(0x8574),  //PFXI 64XG3
1517         SWITCHTEC_PCI_DEVICE(0x8575),  //PFXI 80XG3
1518         SWITCHTEC_PCI_DEVICE(0x8576),  //PFXI 96XG3
1519         {0}
1520 };
1521 MODULE_DEVICE_TABLE(pci, switchtec_pci_tbl);
1522 
1523 static struct pci_driver switchtec_pci_driver = {
1524         .name           = KBUILD_MODNAME,
1525         .id_table       = switchtec_pci_tbl,
1526         .probe          = switchtec_pci_probe,
1527         .remove         = switchtec_pci_remove,
1528 };
1529 
1530 static int __init switchtec_init(void)
1531 {
1532         int rc;
1533 
1534         rc = alloc_chrdev_region(&switchtec_devt, 0, max_devices,
1535                                  "switchtec");
1536         if (rc)
1537                 return rc;
1538 
1539         switchtec_class = class_create(THIS_MODULE, "switchtec");
1540         if (IS_ERR(switchtec_class)) {
1541                 rc = PTR_ERR(switchtec_class);
1542                 goto err_create_class;
1543         }
1544 
1545         rc = pci_register_driver(&switchtec_pci_driver);
1546         if (rc)
1547                 goto err_pci_register;
1548 
1549         pr_info(KBUILD_MODNAME ": loaded.\n");
1550 
1551         return 0;
1552 
1553 err_pci_register:
1554         class_destroy(switchtec_class);
1555 
1556 err_create_class:
1557         unregister_chrdev_region(switchtec_devt, max_devices);
1558 
1559         return rc;
1560 }
1561 module_init(switchtec_init);
1562 
1563 static void __exit switchtec_exit(void)
1564 {
1565         pci_unregister_driver(&switchtec_pci_driver);
1566         class_destroy(switchtec_class);
1567         unregister_chrdev_region(switchtec_devt, max_devices);
1568         ida_destroy(&switchtec_minor_ida);
1569 
1570         pr_info(KBUILD_MODNAME ": unloaded.\n");
1571 }
1572 module_exit(switchtec_exit);

/* [<][>][^][v][top][bottom][index][help] */