linux/drivers/char/tpm/tpm_ibmvtpm.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2012 IBM Corporation
   3 *
   4 * Author: Ashley Lai <ashleydlai@gmail.com>
   5 *
   6 * Maintained by: <tpmdd-devel@lists.sourceforge.net>
   7 *
   8 * Device driver for TCG/TCPA TPM (trusted platform module).
   9 * Specifications at www.trustedcomputinggroup.org
  10 *
  11 * This program is free software; you can redistribute it and/or
  12 * modify it under the terms of the GNU General Public License as
  13 * published by the Free Software Foundation, version 2 of the
  14 * License.
  15 *
  16 */
  17
  18#include <linux/dma-mapping.h>
  19#include <linux/dmapool.h>
  20#include <linux/slab.h>
  21#include <asm/vio.h>
  22#include <asm/irq.h>
  23#include <linux/types.h>
  24#include <linux/list.h>
  25#include <linux/spinlock.h>
  26#include <linux/interrupt.h>
  27#include <linux/wait.h>
  28#include <asm/prom.h>
  29
  30#include "tpm.h"
  31#include "tpm_ibmvtpm.h"
  32
  33static const char tpm_ibmvtpm_driver_name[] = "tpm_ibmvtpm";
  34
  35static struct vio_device_id tpm_ibmvtpm_device_table[] = {
  36        { "IBM,vtpm", "IBM,vtpm"},
  37        { "", "" }
  38};
  39MODULE_DEVICE_TABLE(vio, tpm_ibmvtpm_device_table);
  40
  41/**
  42 * ibmvtpm_send_crq - Send a CRQ request
  43 * @vdev:       vio device struct
  44 * @w1:         first word
  45 * @w2:         second word
  46 *
  47 * Return value:
  48 *      0 -Sucess
  49 *      Non-zero - Failure
  50 */
  51static int ibmvtpm_send_crq(struct vio_dev *vdev, u64 w1, u64 w2)
  52{
  53        return plpar_hcall_norets(H_SEND_CRQ, vdev->unit_address, w1, w2);
  54}
  55
  56/**
  57 * ibmvtpm_get_data - Retrieve ibm vtpm data
  58 * @dev:        device struct
  59 *
  60 * Return value:
  61 *      vtpm device struct
  62 */
  63static struct ibmvtpm_dev *ibmvtpm_get_data(const struct device *dev)
  64{
  65        struct tpm_chip *chip = dev_get_drvdata(dev);
  66        if (chip)
  67                return (struct ibmvtpm_dev *)TPM_VPRIV(chip);
  68        return NULL;
  69}
  70
  71/**
  72 * tpm_ibmvtpm_recv - Receive data after send
  73 * @chip:       tpm chip struct
  74 * @buf:        buffer to read
  75 * count:       size of buffer
  76 *
  77 * Return value:
  78 *      Number of bytes read
  79 */
  80static int tpm_ibmvtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count)
  81{
  82        struct ibmvtpm_dev *ibmvtpm;
  83        u16 len;
  84        int sig;
  85
  86        ibmvtpm = (struct ibmvtpm_dev *)TPM_VPRIV(chip);
  87
  88        if (!ibmvtpm->rtce_buf) {
  89                dev_err(ibmvtpm->dev, "ibmvtpm device is not ready\n");
  90                return 0;
  91        }
  92
  93        sig = wait_event_interruptible(ibmvtpm->wq, !ibmvtpm->tpm_processing_cmd);
  94        if (sig)
  95                return -EINTR;
  96
  97        len = ibmvtpm->res_len;
  98
  99        if (count < len) {
 100                dev_err(ibmvtpm->dev,
 101                        "Invalid size in recv: count=%zd, crq_size=%d\n",
 102                        count, len);
 103                return -EIO;
 104        }
 105
 106        spin_lock(&ibmvtpm->rtce_lock);
 107        memcpy((void *)buf, (void *)ibmvtpm->rtce_buf, len);
 108        memset(ibmvtpm->rtce_buf, 0, len);
 109        ibmvtpm->res_len = 0;
 110        spin_unlock(&ibmvtpm->rtce_lock);
 111        return len;
 112}
 113
 114/**
 115 * tpm_ibmvtpm_send - Send tpm request
 116 * @chip:       tpm chip struct
 117 * @buf:        buffer contains data to send
 118 * count:       size of buffer
 119 *
 120 * Return value:
 121 *      Number of bytes sent
 122 */
 123static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
 124{
 125        struct ibmvtpm_dev *ibmvtpm;
 126        struct ibmvtpm_crq crq;
 127        __be64 *word = (__be64 *)&crq;
 128        int rc, sig;
 129
 130        ibmvtpm = (struct ibmvtpm_dev *)TPM_VPRIV(chip);
 131
 132        if (!ibmvtpm->rtce_buf) {
 133                dev_err(ibmvtpm->dev, "ibmvtpm device is not ready\n");
 134                return 0;
 135        }
 136
 137        if (count > ibmvtpm->rtce_size) {
 138                dev_err(ibmvtpm->dev,
 139                        "Invalid size in send: count=%zd, rtce_size=%d\n",
 140                        count, ibmvtpm->rtce_size);
 141                return -EIO;
 142        }
 143
 144        if (ibmvtpm->tpm_processing_cmd) {
 145                dev_info(ibmvtpm->dev,
 146                         "Need to wait for TPM to finish\n");
 147                /* wait for previous command to finish */
 148                sig = wait_event_interruptible(ibmvtpm->wq, !ibmvtpm->tpm_processing_cmd);
 149                if (sig)
 150                        return -EINTR;
 151        }
 152
 153        spin_lock(&ibmvtpm->rtce_lock);
 154        ibmvtpm->res_len = 0;
 155        memcpy((void *)ibmvtpm->rtce_buf, (void *)buf, count);
 156        crq.valid = (u8)IBMVTPM_VALID_CMD;
 157        crq.msg = (u8)VTPM_TPM_COMMAND;
 158        crq.len = cpu_to_be16(count);
 159        crq.data = cpu_to_be32(ibmvtpm->rtce_dma_handle);
 160
 161        /*
 162         * set the processing flag before the Hcall, since we may get the
 163         * result (interrupt) before even being able to check rc.
 164         */
 165        ibmvtpm->tpm_processing_cmd = true;
 166
 167        rc = ibmvtpm_send_crq(ibmvtpm->vdev, be64_to_cpu(word[0]),
 168                              be64_to_cpu(word[1]));
 169        if (rc != H_SUCCESS) {
 170                dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed rc=%d\n", rc);
 171                rc = 0;
 172                ibmvtpm->tpm_processing_cmd = false;
 173        } else
 174                rc = count;
 175
 176        spin_unlock(&ibmvtpm->rtce_lock);
 177        return rc;
 178}
 179
 180static void tpm_ibmvtpm_cancel(struct tpm_chip *chip)
 181{
 182        return;
 183}
 184
 185static u8 tpm_ibmvtpm_status(struct tpm_chip *chip)
 186{
 187        return 0;
 188}
 189
 190/**
 191 * ibmvtpm_crq_get_rtce_size - Send a CRQ request to get rtce size
 192 * @ibmvtpm:    vtpm device struct
 193 *
 194 * Return value:
 195 *      0 - Success
 196 *      Non-zero - Failure
 197 */
 198static int ibmvtpm_crq_get_rtce_size(struct ibmvtpm_dev *ibmvtpm)
 199{
 200        struct ibmvtpm_crq crq;
 201        u64 *buf = (u64 *) &crq;
 202        int rc;
 203
 204        crq.valid = (u8)IBMVTPM_VALID_CMD;
 205        crq.msg = (u8)VTPM_GET_RTCE_BUFFER_SIZE;
 206
 207        rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
 208                              cpu_to_be64(buf[1]));
 209        if (rc != H_SUCCESS)
 210                dev_err(ibmvtpm->dev,
 211                        "ibmvtpm_crq_get_rtce_size failed rc=%d\n", rc);
 212
 213        return rc;
 214}
 215
 216/**
 217 * ibmvtpm_crq_get_version - Send a CRQ request to get vtpm version
 218 *                         - Note that this is vtpm version and not tpm version
 219 * @ibmvtpm:    vtpm device struct
 220 *
 221 * Return value:
 222 *      0 - Success
 223 *      Non-zero - Failure
 224 */
 225static int ibmvtpm_crq_get_version(struct ibmvtpm_dev *ibmvtpm)
 226{
 227        struct ibmvtpm_crq crq;
 228        u64 *buf = (u64 *) &crq;
 229        int rc;
 230
 231        crq.valid = (u8)IBMVTPM_VALID_CMD;
 232        crq.msg = (u8)VTPM_GET_VERSION;
 233
 234        rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
 235                              cpu_to_be64(buf[1]));
 236        if (rc != H_SUCCESS)
 237                dev_err(ibmvtpm->dev,
 238                        "ibmvtpm_crq_get_version failed rc=%d\n", rc);
 239
 240        return rc;
 241}
 242
 243/**
 244 * ibmvtpm_crq_send_init_complete - Send a CRQ initialize complete message
 245 * @ibmvtpm:    vtpm device struct
 246 *
 247 * Return value:
 248 *      0 - Success
 249 *      Non-zero - Failure
 250 */
 251static int ibmvtpm_crq_send_init_complete(struct ibmvtpm_dev *ibmvtpm)
 252{
 253        int rc;
 254
 255        rc = ibmvtpm_send_crq(ibmvtpm->vdev, INIT_CRQ_COMP_CMD, 0);
 256        if (rc != H_SUCCESS)
 257                dev_err(ibmvtpm->dev,
 258                        "ibmvtpm_crq_send_init_complete failed rc=%d\n", rc);
 259
 260        return rc;
 261}
 262
 263/**
 264 * ibmvtpm_crq_send_init - Send a CRQ initialize message
 265 * @ibmvtpm:    vtpm device struct
 266 *
 267 * Return value:
 268 *      0 - Success
 269 *      Non-zero - Failure
 270 */
 271static int ibmvtpm_crq_send_init(struct ibmvtpm_dev *ibmvtpm)
 272{
 273        int rc;
 274
 275        rc = ibmvtpm_send_crq(ibmvtpm->vdev, INIT_CRQ_CMD, 0);
 276        if (rc != H_SUCCESS)
 277                dev_err(ibmvtpm->dev,
 278                        "ibmvtpm_crq_send_init failed rc=%d\n", rc);
 279
 280        return rc;
 281}
 282
 283/**
 284 * tpm_ibmvtpm_remove - ibm vtpm remove entry point
 285 * @vdev:       vio device struct
 286 *
 287 * Return value:
 288 *      0
 289 */
 290static int tpm_ibmvtpm_remove(struct vio_dev *vdev)
 291{
 292        struct ibmvtpm_dev *ibmvtpm = ibmvtpm_get_data(&vdev->dev);
 293        struct tpm_chip *chip = dev_get_drvdata(ibmvtpm->dev);
 294        int rc = 0;
 295
 296        tpm_chip_unregister(chip);
 297
 298        free_irq(vdev->irq, ibmvtpm);
 299
 300        do {
 301                if (rc)
 302                        msleep(100);
 303                rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
 304        } while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
 305
 306        dma_unmap_single(ibmvtpm->dev, ibmvtpm->crq_dma_handle,
 307                         CRQ_RES_BUF_SIZE, DMA_BIDIRECTIONAL);
 308        free_page((unsigned long)ibmvtpm->crq_queue.crq_addr);
 309
 310        if (ibmvtpm->rtce_buf) {
 311                dma_unmap_single(ibmvtpm->dev, ibmvtpm->rtce_dma_handle,
 312                                 ibmvtpm->rtce_size, DMA_BIDIRECTIONAL);
 313                kfree(ibmvtpm->rtce_buf);
 314        }
 315
 316        kfree(ibmvtpm);
 317
 318        return 0;
 319}
 320
 321/**
 322 * tpm_ibmvtpm_get_desired_dma - Get DMA size needed by this driver
 323 * @vdev:       vio device struct
 324 *
 325 * Return value:
 326 *      Number of bytes the driver needs to DMA map
 327 */
 328static unsigned long tpm_ibmvtpm_get_desired_dma(struct vio_dev *vdev)
 329{
 330        struct ibmvtpm_dev *ibmvtpm = ibmvtpm_get_data(&vdev->dev);
 331
 332        /* ibmvtpm initializes at probe time, so the data we are
 333        * asking for may not be set yet. Estimate that 4K required
 334        * for TCE-mapped buffer in addition to CRQ.
 335        */
 336        if (!ibmvtpm)
 337                return CRQ_RES_BUF_SIZE + PAGE_SIZE;
 338
 339        return CRQ_RES_BUF_SIZE + ibmvtpm->rtce_size;
 340}
 341
 342/**
 343 * tpm_ibmvtpm_suspend - Suspend
 344 * @dev:        device struct
 345 *
 346 * Return value:
 347 *      0
 348 */
 349static int tpm_ibmvtpm_suspend(struct device *dev)
 350{
 351        struct ibmvtpm_dev *ibmvtpm = ibmvtpm_get_data(dev);
 352        struct ibmvtpm_crq crq;
 353        u64 *buf = (u64 *) &crq;
 354        int rc = 0;
 355
 356        crq.valid = (u8)IBMVTPM_VALID_CMD;
 357        crq.msg = (u8)VTPM_PREPARE_TO_SUSPEND;
 358
 359        rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
 360                              cpu_to_be64(buf[1]));
 361        if (rc != H_SUCCESS)
 362                dev_err(ibmvtpm->dev,
 363                        "tpm_ibmvtpm_suspend failed rc=%d\n", rc);
 364
 365        return rc;
 366}
 367
 368/**
 369 * ibmvtpm_reset_crq - Reset CRQ
 370 * @ibmvtpm:    ibm vtpm struct
 371 *
 372 * Return value:
 373 *      0 - Success
 374 *      Non-zero - Failure
 375 */
 376static int ibmvtpm_reset_crq(struct ibmvtpm_dev *ibmvtpm)
 377{
 378        int rc = 0;
 379
 380        do {
 381                if (rc)
 382                        msleep(100);
 383                rc = plpar_hcall_norets(H_FREE_CRQ,
 384                                        ibmvtpm->vdev->unit_address);
 385        } while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
 386
 387        memset(ibmvtpm->crq_queue.crq_addr, 0, CRQ_RES_BUF_SIZE);
 388        ibmvtpm->crq_queue.index = 0;
 389
 390        return plpar_hcall_norets(H_REG_CRQ, ibmvtpm->vdev->unit_address,
 391                                  ibmvtpm->crq_dma_handle, CRQ_RES_BUF_SIZE);
 392}
 393
 394/**
 395 * tpm_ibmvtpm_resume - Resume from suspend
 396 * @dev:        device struct
 397 *
 398 * Return value:
 399 *      0
 400 */
 401static int tpm_ibmvtpm_resume(struct device *dev)
 402{
 403        struct ibmvtpm_dev *ibmvtpm = ibmvtpm_get_data(dev);
 404        int rc = 0;
 405
 406        do {
 407                if (rc)
 408                        msleep(100);
 409                rc = plpar_hcall_norets(H_ENABLE_CRQ,
 410                                        ibmvtpm->vdev->unit_address);
 411        } while (rc == H_IN_PROGRESS || rc == H_BUSY || H_IS_LONG_BUSY(rc));
 412
 413        if (rc) {
 414                dev_err(dev, "Error enabling ibmvtpm rc=%d\n", rc);
 415                return rc;
 416        }
 417
 418        rc = vio_enable_interrupts(ibmvtpm->vdev);
 419        if (rc) {
 420                dev_err(dev, "Error vio_enable_interrupts rc=%d\n", rc);
 421                return rc;
 422        }
 423
 424        rc = ibmvtpm_crq_send_init(ibmvtpm);
 425        if (rc)
 426                dev_err(dev, "Error send_init rc=%d\n", rc);
 427
 428        return rc;
 429}
 430
 431static bool tpm_ibmvtpm_req_canceled(struct tpm_chip *chip, u8 status)
 432{
 433        return (status == 0);
 434}
 435
 436static const struct tpm_class_ops tpm_ibmvtpm = {
 437        .recv = tpm_ibmvtpm_recv,
 438        .send = tpm_ibmvtpm_send,
 439        .cancel = tpm_ibmvtpm_cancel,
 440        .status = tpm_ibmvtpm_status,
 441        .req_complete_mask = 0,
 442        .req_complete_val = 0,
 443        .req_canceled = tpm_ibmvtpm_req_canceled,
 444};
 445
 446static const struct dev_pm_ops tpm_ibmvtpm_pm_ops = {
 447        .suspend = tpm_ibmvtpm_suspend,
 448        .resume = tpm_ibmvtpm_resume,
 449};
 450
 451/**
 452 * ibmvtpm_crq_get_next - Get next responded crq
 453 * @ibmvtpm     vtpm device struct
 454 *
 455 * Return value:
 456 *      vtpm crq pointer
 457 */
 458static struct ibmvtpm_crq *ibmvtpm_crq_get_next(struct ibmvtpm_dev *ibmvtpm)
 459{
 460        struct ibmvtpm_crq_queue *crq_q = &ibmvtpm->crq_queue;
 461        struct ibmvtpm_crq *crq = &crq_q->crq_addr[crq_q->index];
 462
 463        if (crq->valid & VTPM_MSG_RES) {
 464                if (++crq_q->index == crq_q->num_entry)
 465                        crq_q->index = 0;
 466                smp_rmb();
 467        } else
 468                crq = NULL;
 469        return crq;
 470}
 471
 472/**
 473 * ibmvtpm_crq_process - Process responded crq
 474 * @crq         crq to be processed
 475 * @ibmvtpm     vtpm device struct
 476 *
 477 * Return value:
 478 *      Nothing
 479 */
 480static void ibmvtpm_crq_process(struct ibmvtpm_crq *crq,
 481                                struct ibmvtpm_dev *ibmvtpm)
 482{
 483        int rc = 0;
 484
 485        switch (crq->valid) {
 486        case VALID_INIT_CRQ:
 487                switch (crq->msg) {
 488                case INIT_CRQ_RES:
 489                        dev_info(ibmvtpm->dev, "CRQ initialized\n");
 490                        rc = ibmvtpm_crq_send_init_complete(ibmvtpm);
 491                        if (rc)
 492                                dev_err(ibmvtpm->dev, "Unable to send CRQ init complete rc=%d\n", rc);
 493                        return;
 494                case INIT_CRQ_COMP_RES:
 495                        dev_info(ibmvtpm->dev,
 496                                 "CRQ initialization completed\n");
 497                        return;
 498                default:
 499                        dev_err(ibmvtpm->dev, "Unknown crq message type: %d\n", crq->msg);
 500                        return;
 501                }
 502        case IBMVTPM_VALID_CMD:
 503                switch (crq->msg) {
 504                case VTPM_GET_RTCE_BUFFER_SIZE_RES:
 505                        if (be16_to_cpu(crq->len) <= 0) {
 506                                dev_err(ibmvtpm->dev, "Invalid rtce size\n");
 507                                return;
 508                        }
 509                        ibmvtpm->rtce_size = be16_to_cpu(crq->len);
 510                        ibmvtpm->rtce_buf = kmalloc(ibmvtpm->rtce_size,
 511                                                    GFP_ATOMIC);
 512                        if (!ibmvtpm->rtce_buf) {
 513                                dev_err(ibmvtpm->dev, "Failed to allocate memory for rtce buffer\n");
 514                                return;
 515                        }
 516
 517                        ibmvtpm->rtce_dma_handle = dma_map_single(ibmvtpm->dev,
 518                                ibmvtpm->rtce_buf, ibmvtpm->rtce_size,
 519                                DMA_BIDIRECTIONAL);
 520
 521                        if (dma_mapping_error(ibmvtpm->dev,
 522                                              ibmvtpm->rtce_dma_handle)) {
 523                                kfree(ibmvtpm->rtce_buf);
 524                                ibmvtpm->rtce_buf = NULL;
 525                                dev_err(ibmvtpm->dev, "Failed to dma map rtce buffer\n");
 526                        }
 527
 528                        return;
 529                case VTPM_GET_VERSION_RES:
 530                        ibmvtpm->vtpm_version = be32_to_cpu(crq->data);
 531                        return;
 532                case VTPM_TPM_COMMAND_RES:
 533                        /* len of the data in rtce buffer */
 534                        ibmvtpm->res_len = be16_to_cpu(crq->len);
 535                        ibmvtpm->tpm_processing_cmd = false;
 536                        wake_up_interruptible(&ibmvtpm->wq);
 537                        return;
 538                default:
 539                        return;
 540                }
 541        }
 542        return;
 543}
 544
 545/**
 546 * ibmvtpm_interrupt -  Interrupt handler
 547 * @irq:                irq number to handle
 548 * @vtpm_instance:      vtpm that received interrupt
 549 *
 550 * Returns:
 551 *      IRQ_HANDLED
 552 **/
 553static irqreturn_t ibmvtpm_interrupt(int irq, void *vtpm_instance)
 554{
 555        struct ibmvtpm_dev *ibmvtpm = (struct ibmvtpm_dev *) vtpm_instance;
 556        struct ibmvtpm_crq *crq;
 557
 558        /* while loop is needed for initial setup (get version and
 559         * get rtce_size). There should be only one tpm request at any
 560         * given time.
 561         */
 562        while ((crq = ibmvtpm_crq_get_next(ibmvtpm)) != NULL) {
 563                ibmvtpm_crq_process(crq, ibmvtpm);
 564                crq->valid = 0;
 565                smp_wmb();
 566        }
 567
 568        return IRQ_HANDLED;
 569}
 570
 571/**
 572 * tpm_ibmvtpm_probe - ibm vtpm initialize entry point
 573 * @vio_dev:    vio device struct
 574 * @id:         vio device id struct
 575 *
 576 * Return value:
 577 *      0 - Success
 578 *      Non-zero - Failure
 579 */
 580static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,
 581                                   const struct vio_device_id *id)
 582{
 583        struct ibmvtpm_dev *ibmvtpm;
 584        struct device *dev = &vio_dev->dev;
 585        struct ibmvtpm_crq_queue *crq_q;
 586        struct tpm_chip *chip;
 587        int rc = -ENOMEM, rc1;
 588
 589        chip = tpmm_chip_alloc(dev, &tpm_ibmvtpm);
 590        if (IS_ERR(chip))
 591                return PTR_ERR(chip);
 592
 593        ibmvtpm = kzalloc(sizeof(struct ibmvtpm_dev), GFP_KERNEL);
 594        if (!ibmvtpm) {
 595                dev_err(dev, "kzalloc for ibmvtpm failed\n");
 596                goto cleanup;
 597        }
 598
 599        ibmvtpm->dev = dev;
 600        ibmvtpm->vdev = vio_dev;
 601
 602        crq_q = &ibmvtpm->crq_queue;
 603        crq_q->crq_addr = (struct ibmvtpm_crq *)get_zeroed_page(GFP_KERNEL);
 604        if (!crq_q->crq_addr) {
 605                dev_err(dev, "Unable to allocate memory for crq_addr\n");
 606                goto cleanup;
 607        }
 608
 609        crq_q->num_entry = CRQ_RES_BUF_SIZE / sizeof(*crq_q->crq_addr);
 610        ibmvtpm->crq_dma_handle = dma_map_single(dev, crq_q->crq_addr,
 611                                                 CRQ_RES_BUF_SIZE,
 612                                                 DMA_BIDIRECTIONAL);
 613
 614        if (dma_mapping_error(dev, ibmvtpm->crq_dma_handle)) {
 615                dev_err(dev, "dma mapping failed\n");
 616                goto cleanup;
 617        }
 618
 619        rc = plpar_hcall_norets(H_REG_CRQ, vio_dev->unit_address,
 620                                ibmvtpm->crq_dma_handle, CRQ_RES_BUF_SIZE);
 621        if (rc == H_RESOURCE)
 622                rc = ibmvtpm_reset_crq(ibmvtpm);
 623
 624        if (rc) {
 625                dev_err(dev, "Unable to register CRQ rc=%d\n", rc);
 626                goto reg_crq_cleanup;
 627        }
 628
 629        rc = request_irq(vio_dev->irq, ibmvtpm_interrupt, 0,
 630                         tpm_ibmvtpm_driver_name, ibmvtpm);
 631        if (rc) {
 632                dev_err(dev, "Error %d register irq 0x%x\n", rc, vio_dev->irq);
 633                goto init_irq_cleanup;
 634        }
 635
 636        rc = vio_enable_interrupts(vio_dev);
 637        if (rc) {
 638                dev_err(dev, "Error %d enabling interrupts\n", rc);
 639                goto init_irq_cleanup;
 640        }
 641
 642        init_waitqueue_head(&ibmvtpm->wq);
 643
 644        crq_q->index = 0;
 645
 646        TPM_VPRIV(chip) = (void *)ibmvtpm;
 647
 648        spin_lock_init(&ibmvtpm->rtce_lock);
 649
 650        rc = ibmvtpm_crq_send_init(ibmvtpm);
 651        if (rc)
 652                goto init_irq_cleanup;
 653
 654        rc = ibmvtpm_crq_get_version(ibmvtpm);
 655        if (rc)
 656                goto init_irq_cleanup;
 657
 658        rc = ibmvtpm_crq_get_rtce_size(ibmvtpm);
 659        if (rc)
 660                goto init_irq_cleanup;
 661
 662        return tpm_chip_register(chip);
 663init_irq_cleanup:
 664        do {
 665                rc1 = plpar_hcall_norets(H_FREE_CRQ, vio_dev->unit_address);
 666        } while (rc1 == H_BUSY || H_IS_LONG_BUSY(rc1));
 667reg_crq_cleanup:
 668        dma_unmap_single(dev, ibmvtpm->crq_dma_handle, CRQ_RES_BUF_SIZE,
 669                         DMA_BIDIRECTIONAL);
 670cleanup:
 671        if (ibmvtpm) {
 672                if (crq_q->crq_addr)
 673                        free_page((unsigned long)crq_q->crq_addr);
 674                kfree(ibmvtpm);
 675        }
 676
 677        return rc;
 678}
 679
 680static struct vio_driver ibmvtpm_driver = {
 681        .id_table        = tpm_ibmvtpm_device_table,
 682        .probe           = tpm_ibmvtpm_probe,
 683        .remove          = tpm_ibmvtpm_remove,
 684        .get_desired_dma = tpm_ibmvtpm_get_desired_dma,
 685        .name            = tpm_ibmvtpm_driver_name,
 686        .pm              = &tpm_ibmvtpm_pm_ops,
 687};
 688
 689/**
 690 * ibmvtpm_module_init - Initialize ibm vtpm module
 691 *
 692 * Return value:
 693 *      0 -Success
 694 *      Non-zero - Failure
 695 */
 696static int __init ibmvtpm_module_init(void)
 697{
 698        return vio_register_driver(&ibmvtpm_driver);
 699}
 700
 701/**
 702 * ibmvtpm_module_exit - Teardown ibm vtpm module
 703 *
 704 * Return value:
 705 *      Nothing
 706 */
 707static void __exit ibmvtpm_module_exit(void)
 708{
 709        vio_unregister_driver(&ibmvtpm_driver);
 710}
 711
 712module_init(ibmvtpm_module_init);
 713module_exit(ibmvtpm_module_exit);
 714
 715MODULE_AUTHOR("adlai@us.ibm.com");
 716MODULE_DESCRIPTION("IBM vTPM Driver");
 717MODULE_VERSION("1.0");
 718MODULE_LICENSE("GPL");
 719