0001
0002
0003
0004
0005
0006
0007 #define KMSG_COMPONENT "ism"
0008 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
0009
0010 #include <linux/module.h>
0011 #include <linux/types.h>
0012 #include <linux/interrupt.h>
0013 #include <linux/device.h>
0014 #include <linux/pci.h>
0015 #include <linux/err.h>
0016 #include <linux/ctype.h>
0017 #include <linux/processor.h>
0018 #include <net/smc.h>
0019
0020 #include <asm/debug.h>
0021
0022 #include "ism.h"
0023
0024 MODULE_DESCRIPTION("ISM driver for s390");
0025 MODULE_LICENSE("GPL");
0026
0027 #define PCI_DEVICE_ID_IBM_ISM 0x04ED
0028 #define DRV_NAME "ism"
0029
0030 static const struct pci_device_id ism_device_table[] = {
0031 { PCI_VDEVICE(IBM, PCI_DEVICE_ID_IBM_ISM), 0 },
0032 { 0, }
0033 };
0034 MODULE_DEVICE_TABLE(pci, ism_device_table);
0035
0036 static debug_info_t *ism_debug_info;
0037
0038 static int ism_cmd(struct ism_dev *ism, void *cmd)
0039 {
0040 struct ism_req_hdr *req = cmd;
0041 struct ism_resp_hdr *resp = cmd;
0042
0043 __ism_write_cmd(ism, req + 1, sizeof(*req), req->len - sizeof(*req));
0044 __ism_write_cmd(ism, req, 0, sizeof(*req));
0045
0046 WRITE_ONCE(resp->ret, ISM_ERROR);
0047
0048 __ism_read_cmd(ism, resp, 0, sizeof(*resp));
0049 if (resp->ret) {
0050 debug_text_event(ism_debug_info, 0, "cmd failure");
0051 debug_event(ism_debug_info, 0, resp, sizeof(*resp));
0052 goto out;
0053 }
0054 __ism_read_cmd(ism, resp + 1, sizeof(*resp), resp->len - sizeof(*resp));
0055 out:
0056 return resp->ret;
0057 }
0058
0059 static int ism_cmd_simple(struct ism_dev *ism, u32 cmd_code)
0060 {
0061 union ism_cmd_simple cmd;
0062
0063 memset(&cmd, 0, sizeof(cmd));
0064 cmd.request.hdr.cmd = cmd_code;
0065 cmd.request.hdr.len = sizeof(cmd.request);
0066
0067 return ism_cmd(ism, &cmd);
0068 }
0069
0070 static int query_info(struct ism_dev *ism)
0071 {
0072 union ism_qi cmd;
0073
0074 memset(&cmd, 0, sizeof(cmd));
0075 cmd.request.hdr.cmd = ISM_QUERY_INFO;
0076 cmd.request.hdr.len = sizeof(cmd.request);
0077
0078 if (ism_cmd(ism, &cmd))
0079 goto out;
0080
0081 debug_text_event(ism_debug_info, 3, "query info");
0082 debug_event(ism_debug_info, 3, &cmd.response, sizeof(cmd.response));
0083 out:
0084 return 0;
0085 }
0086
0087 static int register_sba(struct ism_dev *ism)
0088 {
0089 union ism_reg_sba cmd;
0090 dma_addr_t dma_handle;
0091 struct ism_sba *sba;
0092
0093 sba = dma_alloc_coherent(&ism->pdev->dev, PAGE_SIZE, &dma_handle,
0094 GFP_KERNEL);
0095 if (!sba)
0096 return -ENOMEM;
0097
0098 memset(&cmd, 0, sizeof(cmd));
0099 cmd.request.hdr.cmd = ISM_REG_SBA;
0100 cmd.request.hdr.len = sizeof(cmd.request);
0101 cmd.request.sba = dma_handle;
0102
0103 if (ism_cmd(ism, &cmd)) {
0104 dma_free_coherent(&ism->pdev->dev, PAGE_SIZE, sba, dma_handle);
0105 return -EIO;
0106 }
0107
0108 ism->sba = sba;
0109 ism->sba_dma_addr = dma_handle;
0110
0111 return 0;
0112 }
0113
0114 static int register_ieq(struct ism_dev *ism)
0115 {
0116 union ism_reg_ieq cmd;
0117 dma_addr_t dma_handle;
0118 struct ism_eq *ieq;
0119
0120 ieq = dma_alloc_coherent(&ism->pdev->dev, PAGE_SIZE, &dma_handle,
0121 GFP_KERNEL);
0122 if (!ieq)
0123 return -ENOMEM;
0124
0125 memset(&cmd, 0, sizeof(cmd));
0126 cmd.request.hdr.cmd = ISM_REG_IEQ;
0127 cmd.request.hdr.len = sizeof(cmd.request);
0128 cmd.request.ieq = dma_handle;
0129 cmd.request.len = sizeof(*ieq);
0130
0131 if (ism_cmd(ism, &cmd)) {
0132 dma_free_coherent(&ism->pdev->dev, PAGE_SIZE, ieq, dma_handle);
0133 return -EIO;
0134 }
0135
0136 ism->ieq = ieq;
0137 ism->ieq_idx = -1;
0138 ism->ieq_dma_addr = dma_handle;
0139
0140 return 0;
0141 }
0142
0143 static int unregister_sba(struct ism_dev *ism)
0144 {
0145 int ret;
0146
0147 if (!ism->sba)
0148 return 0;
0149
0150 ret = ism_cmd_simple(ism, ISM_UNREG_SBA);
0151 if (ret && ret != ISM_ERROR)
0152 return -EIO;
0153
0154 dma_free_coherent(&ism->pdev->dev, PAGE_SIZE,
0155 ism->sba, ism->sba_dma_addr);
0156
0157 ism->sba = NULL;
0158 ism->sba_dma_addr = 0;
0159
0160 return 0;
0161 }
0162
0163 static int unregister_ieq(struct ism_dev *ism)
0164 {
0165 int ret;
0166
0167 if (!ism->ieq)
0168 return 0;
0169
0170 ret = ism_cmd_simple(ism, ISM_UNREG_IEQ);
0171 if (ret && ret != ISM_ERROR)
0172 return -EIO;
0173
0174 dma_free_coherent(&ism->pdev->dev, PAGE_SIZE,
0175 ism->ieq, ism->ieq_dma_addr);
0176
0177 ism->ieq = NULL;
0178 ism->ieq_dma_addr = 0;
0179
0180 return 0;
0181 }
0182
0183 static int ism_read_local_gid(struct ism_dev *ism)
0184 {
0185 union ism_read_gid cmd;
0186 int ret;
0187
0188 memset(&cmd, 0, sizeof(cmd));
0189 cmd.request.hdr.cmd = ISM_READ_GID;
0190 cmd.request.hdr.len = sizeof(cmd.request);
0191
0192 ret = ism_cmd(ism, &cmd);
0193 if (ret)
0194 goto out;
0195
0196 ism->smcd->local_gid = cmd.response.gid;
0197 out:
0198 return ret;
0199 }
0200
0201 static int ism_query_rgid(struct smcd_dev *smcd, u64 rgid, u32 vid_valid,
0202 u32 vid)
0203 {
0204 struct ism_dev *ism = smcd->priv;
0205 union ism_query_rgid cmd;
0206
0207 memset(&cmd, 0, sizeof(cmd));
0208 cmd.request.hdr.cmd = ISM_QUERY_RGID;
0209 cmd.request.hdr.len = sizeof(cmd.request);
0210
0211 cmd.request.rgid = rgid;
0212 cmd.request.vlan_valid = vid_valid;
0213 cmd.request.vlan_id = vid;
0214
0215 return ism_cmd(ism, &cmd);
0216 }
0217
0218 static void ism_free_dmb(struct ism_dev *ism, struct smcd_dmb *dmb)
0219 {
0220 clear_bit(dmb->sba_idx, ism->sba_bitmap);
0221 dma_free_coherent(&ism->pdev->dev, dmb->dmb_len,
0222 dmb->cpu_addr, dmb->dma_addr);
0223 }
0224
0225 static int ism_alloc_dmb(struct ism_dev *ism, struct smcd_dmb *dmb)
0226 {
0227 unsigned long bit;
0228
0229 if (PAGE_ALIGN(dmb->dmb_len) > dma_get_max_seg_size(&ism->pdev->dev))
0230 return -EINVAL;
0231
0232 if (!dmb->sba_idx) {
0233 bit = find_next_zero_bit(ism->sba_bitmap, ISM_NR_DMBS,
0234 ISM_DMB_BIT_OFFSET);
0235 if (bit == ISM_NR_DMBS)
0236 return -ENOSPC;
0237
0238 dmb->sba_idx = bit;
0239 }
0240 if (dmb->sba_idx < ISM_DMB_BIT_OFFSET ||
0241 test_and_set_bit(dmb->sba_idx, ism->sba_bitmap))
0242 return -EINVAL;
0243
0244 dmb->cpu_addr = dma_alloc_coherent(&ism->pdev->dev, dmb->dmb_len,
0245 &dmb->dma_addr,
0246 GFP_KERNEL | __GFP_NOWARN | __GFP_NOMEMALLOC | __GFP_COMP | __GFP_NORETRY);
0247 if (!dmb->cpu_addr)
0248 clear_bit(dmb->sba_idx, ism->sba_bitmap);
0249
0250 return dmb->cpu_addr ? 0 : -ENOMEM;
0251 }
0252
0253 static int ism_register_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb)
0254 {
0255 struct ism_dev *ism = smcd->priv;
0256 union ism_reg_dmb cmd;
0257 int ret;
0258
0259 ret = ism_alloc_dmb(ism, dmb);
0260 if (ret)
0261 goto out;
0262
0263 memset(&cmd, 0, sizeof(cmd));
0264 cmd.request.hdr.cmd = ISM_REG_DMB;
0265 cmd.request.hdr.len = sizeof(cmd.request);
0266
0267 cmd.request.dmb = dmb->dma_addr;
0268 cmd.request.dmb_len = dmb->dmb_len;
0269 cmd.request.sba_idx = dmb->sba_idx;
0270 cmd.request.vlan_valid = dmb->vlan_valid;
0271 cmd.request.vlan_id = dmb->vlan_id;
0272 cmd.request.rgid = dmb->rgid;
0273
0274 ret = ism_cmd(ism, &cmd);
0275 if (ret) {
0276 ism_free_dmb(ism, dmb);
0277 goto out;
0278 }
0279 dmb->dmb_tok = cmd.response.dmb_tok;
0280 out:
0281 return ret;
0282 }
0283
0284 static int ism_unregister_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb)
0285 {
0286 struct ism_dev *ism = smcd->priv;
0287 union ism_unreg_dmb cmd;
0288 int ret;
0289
0290 memset(&cmd, 0, sizeof(cmd));
0291 cmd.request.hdr.cmd = ISM_UNREG_DMB;
0292 cmd.request.hdr.len = sizeof(cmd.request);
0293
0294 cmd.request.dmb_tok = dmb->dmb_tok;
0295
0296 ret = ism_cmd(ism, &cmd);
0297 if (ret && ret != ISM_ERROR)
0298 goto out;
0299
0300 ism_free_dmb(ism, dmb);
0301 out:
0302 return ret;
0303 }
0304
0305 static int ism_add_vlan_id(struct smcd_dev *smcd, u64 vlan_id)
0306 {
0307 struct ism_dev *ism = smcd->priv;
0308 union ism_set_vlan_id cmd;
0309
0310 memset(&cmd, 0, sizeof(cmd));
0311 cmd.request.hdr.cmd = ISM_ADD_VLAN_ID;
0312 cmd.request.hdr.len = sizeof(cmd.request);
0313
0314 cmd.request.vlan_id = vlan_id;
0315
0316 return ism_cmd(ism, &cmd);
0317 }
0318
0319 static int ism_del_vlan_id(struct smcd_dev *smcd, u64 vlan_id)
0320 {
0321 struct ism_dev *ism = smcd->priv;
0322 union ism_set_vlan_id cmd;
0323
0324 memset(&cmd, 0, sizeof(cmd));
0325 cmd.request.hdr.cmd = ISM_DEL_VLAN_ID;
0326 cmd.request.hdr.len = sizeof(cmd.request);
0327
0328 cmd.request.vlan_id = vlan_id;
0329
0330 return ism_cmd(ism, &cmd);
0331 }
0332
0333 static int ism_set_vlan_required(struct smcd_dev *smcd)
0334 {
0335 return ism_cmd_simple(smcd->priv, ISM_SET_VLAN);
0336 }
0337
0338 static int ism_reset_vlan_required(struct smcd_dev *smcd)
0339 {
0340 return ism_cmd_simple(smcd->priv, ISM_RESET_VLAN);
0341 }
0342
0343 static int ism_signal_ieq(struct smcd_dev *smcd, u64 rgid, u32 trigger_irq,
0344 u32 event_code, u64 info)
0345 {
0346 struct ism_dev *ism = smcd->priv;
0347 union ism_sig_ieq cmd;
0348
0349 memset(&cmd, 0, sizeof(cmd));
0350 cmd.request.hdr.cmd = ISM_SIGNAL_IEQ;
0351 cmd.request.hdr.len = sizeof(cmd.request);
0352
0353 cmd.request.rgid = rgid;
0354 cmd.request.trigger_irq = trigger_irq;
0355 cmd.request.event_code = event_code;
0356 cmd.request.info = info;
0357
0358 return ism_cmd(ism, &cmd);
0359 }
0360
0361 static unsigned int max_bytes(unsigned int start, unsigned int len,
0362 unsigned int boundary)
0363 {
0364 return min(boundary - (start & (boundary - 1)), len);
0365 }
0366
0367 static int ism_move(struct smcd_dev *smcd, u64 dmb_tok, unsigned int idx,
0368 bool sf, unsigned int offset, void *data, unsigned int size)
0369 {
0370 struct ism_dev *ism = smcd->priv;
0371 unsigned int bytes;
0372 u64 dmb_req;
0373 int ret;
0374
0375 while (size) {
0376 bytes = max_bytes(offset, size, PAGE_SIZE);
0377 dmb_req = ISM_CREATE_REQ(dmb_tok, idx, size == bytes ? sf : 0,
0378 offset);
0379
0380 ret = __ism_move(ism, dmb_req, data, bytes);
0381 if (ret)
0382 return ret;
0383
0384 size -= bytes;
0385 data += bytes;
0386 offset += bytes;
0387 }
0388
0389 return 0;
0390 }
0391
0392 static struct ism_systemeid SYSTEM_EID = {
0393 .seid_string = "IBM-SYSZ-ISMSEID00000000",
0394 .serial_number = "0000",
0395 .type = "0000",
0396 };
0397
0398 static void ism_create_system_eid(void)
0399 {
0400 struct cpuid id;
0401 u16 ident_tail;
0402 char tmp[5];
0403
0404 get_cpu_id(&id);
0405 ident_tail = (u16)(id.ident & ISM_IDENT_MASK);
0406 snprintf(tmp, 5, "%04X", ident_tail);
0407 memcpy(&SYSTEM_EID.serial_number, tmp, 4);
0408 snprintf(tmp, 5, "%04X", id.machine);
0409 memcpy(&SYSTEM_EID.type, tmp, 4);
0410 }
0411
0412 static u8 *ism_get_system_eid(void)
0413 {
0414 return SYSTEM_EID.seid_string;
0415 }
0416
0417 static u16 ism_get_chid(struct smcd_dev *smcd)
0418 {
0419 struct ism_dev *ism = (struct ism_dev *)smcd->priv;
0420
0421 if (!ism || !ism->pdev)
0422 return 0;
0423
0424 return to_zpci(ism->pdev)->pchid;
0425 }
0426
0427 static void ism_handle_event(struct ism_dev *ism)
0428 {
0429 struct smcd_event *entry;
0430
0431 while ((ism->ieq_idx + 1) != READ_ONCE(ism->ieq->header.idx)) {
0432 if (++(ism->ieq_idx) == ARRAY_SIZE(ism->ieq->entry))
0433 ism->ieq_idx = 0;
0434
0435 entry = &ism->ieq->entry[ism->ieq_idx];
0436 debug_event(ism_debug_info, 2, entry, sizeof(*entry));
0437 smcd_handle_event(ism->smcd, entry);
0438 }
0439 }
0440
0441 static irqreturn_t ism_handle_irq(int irq, void *data)
0442 {
0443 struct ism_dev *ism = data;
0444 unsigned long bit, end;
0445 unsigned long *bv;
0446 u16 dmbemask;
0447
0448 bv = (void *) &ism->sba->dmb_bits[ISM_DMB_WORD_OFFSET];
0449 end = sizeof(ism->sba->dmb_bits) * BITS_PER_BYTE - ISM_DMB_BIT_OFFSET;
0450
0451 spin_lock(&ism->lock);
0452 ism->sba->s = 0;
0453 barrier();
0454 for (bit = 0;;) {
0455 bit = find_next_bit_inv(bv, end, bit);
0456 if (bit >= end)
0457 break;
0458
0459 clear_bit_inv(bit, bv);
0460 dmbemask = ism->sba->dmbe_mask[bit + ISM_DMB_BIT_OFFSET];
0461 ism->sba->dmbe_mask[bit + ISM_DMB_BIT_OFFSET] = 0;
0462 barrier();
0463 smcd_handle_irq(ism->smcd, bit + ISM_DMB_BIT_OFFSET, dmbemask);
0464 }
0465
0466 if (ism->sba->e) {
0467 ism->sba->e = 0;
0468 barrier();
0469 ism_handle_event(ism);
0470 }
0471 spin_unlock(&ism->lock);
0472 return IRQ_HANDLED;
0473 }
0474
0475 static const struct smcd_ops ism_ops = {
0476 .query_remote_gid = ism_query_rgid,
0477 .register_dmb = ism_register_dmb,
0478 .unregister_dmb = ism_unregister_dmb,
0479 .add_vlan_id = ism_add_vlan_id,
0480 .del_vlan_id = ism_del_vlan_id,
0481 .set_vlan_required = ism_set_vlan_required,
0482 .reset_vlan_required = ism_reset_vlan_required,
0483 .signal_event = ism_signal_ieq,
0484 .move_data = ism_move,
0485 .get_system_eid = ism_get_system_eid,
0486 .get_chid = ism_get_chid,
0487 };
0488
0489 static int ism_dev_init(struct ism_dev *ism)
0490 {
0491 struct pci_dev *pdev = ism->pdev;
0492 int ret;
0493
0494 ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
0495 if (ret <= 0)
0496 goto out;
0497
0498 ret = request_irq(pci_irq_vector(pdev, 0), ism_handle_irq, 0,
0499 pci_name(pdev), ism);
0500 if (ret)
0501 goto free_vectors;
0502
0503 ret = register_sba(ism);
0504 if (ret)
0505 goto free_irq;
0506
0507 ret = register_ieq(ism);
0508 if (ret)
0509 goto unreg_sba;
0510
0511 ret = ism_read_local_gid(ism);
0512 if (ret)
0513 goto unreg_ieq;
0514
0515 if (!ism_add_vlan_id(ism->smcd, ISM_RESERVED_VLANID))
0516
0517 ism_create_system_eid();
0518
0519 ret = smcd_register_dev(ism->smcd);
0520 if (ret)
0521 goto unreg_ieq;
0522
0523 query_info(ism);
0524 return 0;
0525
0526 unreg_ieq:
0527 unregister_ieq(ism);
0528 unreg_sba:
0529 unregister_sba(ism);
0530 free_irq:
0531 free_irq(pci_irq_vector(pdev, 0), ism);
0532 free_vectors:
0533 pci_free_irq_vectors(pdev);
0534 out:
0535 return ret;
0536 }
0537
0538 static int ism_probe(struct pci_dev *pdev, const struct pci_device_id *id)
0539 {
0540 struct ism_dev *ism;
0541 int ret;
0542
0543 ism = kzalloc(sizeof(*ism), GFP_KERNEL);
0544 if (!ism)
0545 return -ENOMEM;
0546
0547 spin_lock_init(&ism->lock);
0548 dev_set_drvdata(&pdev->dev, ism);
0549 ism->pdev = pdev;
0550
0551 ret = pci_enable_device_mem(pdev);
0552 if (ret)
0553 goto err;
0554
0555 ret = pci_request_mem_regions(pdev, DRV_NAME);
0556 if (ret)
0557 goto err_disable;
0558
0559 ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64));
0560 if (ret)
0561 goto err_resource;
0562
0563 dma_set_seg_boundary(&pdev->dev, SZ_1M - 1);
0564 dma_set_max_seg_size(&pdev->dev, SZ_1M);
0565 pci_set_master(pdev);
0566
0567 ism->smcd = smcd_alloc_dev(&pdev->dev, dev_name(&pdev->dev), &ism_ops,
0568 ISM_NR_DMBS);
0569 if (!ism->smcd) {
0570 ret = -ENOMEM;
0571 goto err_resource;
0572 }
0573
0574 ism->smcd->priv = ism;
0575 ret = ism_dev_init(ism);
0576 if (ret)
0577 goto err_free;
0578
0579 return 0;
0580
0581 err_free:
0582 smcd_free_dev(ism->smcd);
0583 err_resource:
0584 pci_release_mem_regions(pdev);
0585 err_disable:
0586 pci_disable_device(pdev);
0587 err:
0588 kfree(ism);
0589 dev_set_drvdata(&pdev->dev, NULL);
0590 return ret;
0591 }
0592
0593 static void ism_dev_exit(struct ism_dev *ism)
0594 {
0595 struct pci_dev *pdev = ism->pdev;
0596
0597 smcd_unregister_dev(ism->smcd);
0598 if (SYSTEM_EID.serial_number[0] != '0' ||
0599 SYSTEM_EID.type[0] != '0')
0600 ism_del_vlan_id(ism->smcd, ISM_RESERVED_VLANID);
0601 unregister_ieq(ism);
0602 unregister_sba(ism);
0603 free_irq(pci_irq_vector(pdev, 0), ism);
0604 pci_free_irq_vectors(pdev);
0605 }
0606
0607 static void ism_remove(struct pci_dev *pdev)
0608 {
0609 struct ism_dev *ism = dev_get_drvdata(&pdev->dev);
0610
0611 ism_dev_exit(ism);
0612
0613 smcd_free_dev(ism->smcd);
0614 pci_release_mem_regions(pdev);
0615 pci_disable_device(pdev);
0616 dev_set_drvdata(&pdev->dev, NULL);
0617 kfree(ism);
0618 }
0619
0620 static struct pci_driver ism_driver = {
0621 .name = DRV_NAME,
0622 .id_table = ism_device_table,
0623 .probe = ism_probe,
0624 .remove = ism_remove,
0625 };
0626
0627 static int __init ism_init(void)
0628 {
0629 int ret;
0630
0631 ism_debug_info = debug_register("ism", 2, 1, 16);
0632 if (!ism_debug_info)
0633 return -ENODEV;
0634
0635 debug_register_view(ism_debug_info, &debug_hex_ascii_view);
0636 ret = pci_register_driver(&ism_driver);
0637 if (ret)
0638 debug_unregister(ism_debug_info);
0639
0640 return ret;
0641 }
0642
0643 static void __exit ism_exit(void)
0644 {
0645 pci_unregister_driver(&ism_driver);
0646 debug_unregister(ism_debug_info);
0647 }
0648
0649 module_init(ism_init);
0650 module_exit(ism_exit);