Lines Matching refs:chip

160 static int wait_startup(struct tpm_chip *chip, int l)  in wait_startup()  argument
162 unsigned long stop = jiffies + chip->vendor.timeout_a; in wait_startup()
164 if (ioread8(chip->vendor.iobase + TPM_ACCESS(l)) & in wait_startup()
172 static int check_locality(struct tpm_chip *chip, int l) in check_locality() argument
174 if ((ioread8(chip->vendor.iobase + TPM_ACCESS(l)) & in check_locality()
177 return chip->vendor.locality = l; in check_locality()
182 static void release_locality(struct tpm_chip *chip, int l, int force) in release_locality() argument
184 if (force || (ioread8(chip->vendor.iobase + TPM_ACCESS(l)) & in release_locality()
188 chip->vendor.iobase + TPM_ACCESS(l)); in release_locality()
191 static int request_locality(struct tpm_chip *chip, int l) in request_locality() argument
196 if (check_locality(chip, l) >= 0) in request_locality()
200 chip->vendor.iobase + TPM_ACCESS(l)); in request_locality()
202 stop = jiffies + chip->vendor.timeout_a; in request_locality()
204 if (chip->vendor.irq) { in request_locality()
209 rc = wait_event_interruptible_timeout(chip->vendor.int_queue, in request_locality()
211 (chip, l) >= 0), in request_locality()
222 if (check_locality(chip, l) >= 0) in request_locality()
231 static u8 tpm_tis_status(struct tpm_chip *chip) in tpm_tis_status() argument
233 return ioread8(chip->vendor.iobase + in tpm_tis_status()
234 TPM_STS(chip->vendor.locality)); in tpm_tis_status()
237 static void tpm_tis_ready(struct tpm_chip *chip) in tpm_tis_ready() argument
241 chip->vendor.iobase + TPM_STS(chip->vendor.locality)); in tpm_tis_ready()
244 static int get_burstcount(struct tpm_chip *chip) in get_burstcount() argument
251 stop = jiffies + chip->vendor.timeout_d; in get_burstcount()
253 burstcnt = ioread8(chip->vendor.iobase + in get_burstcount()
254 TPM_STS(chip->vendor.locality) + 1); in get_burstcount()
255 burstcnt += ioread8(chip->vendor.iobase + in get_burstcount()
256 TPM_STS(chip->vendor.locality) + in get_burstcount()
265 static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count) in recv_data() argument
269 wait_for_tpm_stat(chip, in recv_data()
271 chip->vendor.timeout_c, in recv_data()
272 &chip->vendor.read_queue, true) in recv_data()
274 burstcnt = get_burstcount(chip); in recv_data()
276 buf[size++] = ioread8(chip->vendor.iobase + in recv_data()
277 TPM_DATA_FIFO(chip->vendor. in recv_data()
283 static int tpm_tis_recv(struct tpm_chip *chip, u8 *buf, size_t count) in tpm_tis_recv() argument
295 recv_data(chip, buf, TPM_HEADER_SIZE)) < TPM_HEADER_SIZE) { in tpm_tis_recv()
296 dev_err(chip->pdev, "Unable to read header\n"); in tpm_tis_recv()
307 recv_data(chip, &buf[TPM_HEADER_SIZE], in tpm_tis_recv()
309 dev_err(chip->pdev, "Unable to read remainder of result\n"); in tpm_tis_recv()
314 wait_for_tpm_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, in tpm_tis_recv()
315 &chip->vendor.int_queue, false); in tpm_tis_recv()
316 status = tpm_tis_status(chip); in tpm_tis_recv()
318 dev_err(chip->pdev, "Error left over data\n"); in tpm_tis_recv()
324 tpm_tis_ready(chip); in tpm_tis_recv()
325 release_locality(chip, chip->vendor.locality, 0); in tpm_tis_recv()
338 static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len) in tpm_tis_send_data() argument
343 if (request_locality(chip, 0) < 0) in tpm_tis_send_data()
346 status = tpm_tis_status(chip); in tpm_tis_send_data()
348 tpm_tis_ready(chip); in tpm_tis_send_data()
350 (chip, TPM_STS_COMMAND_READY, chip->vendor.timeout_b, in tpm_tis_send_data()
351 &chip->vendor.int_queue, false) < 0) { in tpm_tis_send_data()
358 burstcnt = get_burstcount(chip); in tpm_tis_send_data()
360 iowrite8(buf[count], chip->vendor.iobase + in tpm_tis_send_data()
361 TPM_DATA_FIFO(chip->vendor.locality)); in tpm_tis_send_data()
365 wait_for_tpm_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, in tpm_tis_send_data()
366 &chip->vendor.int_queue, false); in tpm_tis_send_data()
367 status = tpm_tis_status(chip); in tpm_tis_send_data()
376 chip->vendor.iobase + TPM_DATA_FIFO(chip->vendor.locality)); in tpm_tis_send_data()
377 wait_for_tpm_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, in tpm_tis_send_data()
378 &chip->vendor.int_queue, false); in tpm_tis_send_data()
379 status = tpm_tis_status(chip); in tpm_tis_send_data()
388 tpm_tis_ready(chip); in tpm_tis_send_data()
389 release_locality(chip, chip->vendor.locality, 0); in tpm_tis_send_data()
393 static void disable_interrupts(struct tpm_chip *chip) in disable_interrupts() argument
398 ioread32(chip->vendor.iobase + in disable_interrupts()
399 TPM_INT_ENABLE(chip->vendor.locality)); in disable_interrupts()
402 chip->vendor.iobase + in disable_interrupts()
403 TPM_INT_ENABLE(chip->vendor.locality)); in disable_interrupts()
404 free_irq(chip->vendor.irq, chip); in disable_interrupts()
405 chip->vendor.irq = 0; in disable_interrupts()
413 static int tpm_tis_send_main(struct tpm_chip *chip, u8 *buf, size_t len) in tpm_tis_send_main() argument
419 rc = tpm_tis_send_data(chip, buf, len); in tpm_tis_send_main()
425 chip->vendor.iobase + TPM_STS(chip->vendor.locality)); in tpm_tis_send_main()
427 if (chip->vendor.irq) { in tpm_tis_send_main()
430 if (chip->flags & TPM_CHIP_FLAG_TPM2) in tpm_tis_send_main()
431 dur = tpm2_calc_ordinal_duration(chip, ordinal); in tpm_tis_send_main()
433 dur = tpm_calc_ordinal_duration(chip, ordinal); in tpm_tis_send_main()
436 (chip, TPM_STS_DATA_AVAIL | TPM_STS_VALID, dur, in tpm_tis_send_main()
437 &chip->vendor.read_queue, false) < 0) { in tpm_tis_send_main()
444 tpm_tis_ready(chip); in tpm_tis_send_main()
445 release_locality(chip, chip->vendor.locality, 0); in tpm_tis_send_main()
449 static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len) in tpm_tis_send() argument
452 struct priv_data *priv = chip->vendor.priv; in tpm_tis_send()
454 if (!chip->vendor.irq || priv->irq_tested) in tpm_tis_send()
455 return tpm_tis_send_main(chip, buf, len); in tpm_tis_send()
458 irq = chip->vendor.irq; in tpm_tis_send()
459 chip->vendor.irq = 0; in tpm_tis_send()
460 rc = tpm_tis_send_main(chip, buf, len); in tpm_tis_send()
461 chip->vendor.irq = irq; in tpm_tis_send()
465 disable_interrupts(chip); in tpm_tis_send()
466 dev_err(chip->pdev, in tpm_tis_send()
484 static bool tpm_tis_update_timeouts(struct tpm_chip *chip, in tpm_tis_update_timeouts() argument
490 did_vid = ioread32(chip->vendor.iobase + TPM_DID_VID(0)); in tpm_tis_update_timeouts()
508 static int probe_itpm(struct tpm_chip *chip) in probe_itpm() argument
517 u16 vendor = ioread16(chip->vendor.iobase + TPM_DID_VID(0)); in probe_itpm()
525 rc = tpm_tis_send_data(chip, cmd_getticks, len); in probe_itpm()
529 tpm_tis_ready(chip); in probe_itpm()
530 release_locality(chip, chip->vendor.locality, 0); in probe_itpm()
534 rc = tpm_tis_send_data(chip, cmd_getticks, len); in probe_itpm()
536 dev_info(chip->pdev, "Detected an iTPM.\n"); in probe_itpm()
543 tpm_tis_ready(chip); in probe_itpm()
544 release_locality(chip, chip->vendor.locality, 0); in probe_itpm()
549 static bool tpm_tis_req_canceled(struct tpm_chip *chip, u8 status) in tpm_tis_req_canceled() argument
551 switch (chip->vendor.manufacturer_id) { in tpm_tis_req_canceled()
575 struct tpm_chip *chip = dev_id; in tis_int_probe() local
578 interrupt = ioread32(chip->vendor.iobase + in tis_int_probe()
579 TPM_INT_STATUS(chip->vendor.locality)); in tis_int_probe()
584 chip->vendor.probed_irq = irq; in tis_int_probe()
588 chip->vendor.iobase + in tis_int_probe()
589 TPM_INT_STATUS(chip->vendor.locality)); in tis_int_probe()
595 struct tpm_chip *chip = dev_id; in tis_int_handler() local
599 interrupt = ioread32(chip->vendor.iobase + in tis_int_handler()
600 TPM_INT_STATUS(chip->vendor.locality)); in tis_int_handler()
605 ((struct priv_data *)chip->vendor.priv)->irq_tested = true; in tis_int_handler()
607 wake_up_interruptible(&chip->vendor.read_queue); in tis_int_handler()
610 if (check_locality(chip, i) >= 0) in tis_int_handler()
615 wake_up_interruptible(&chip->vendor.int_queue); in tis_int_handler()
619 chip->vendor.iobase + in tis_int_handler()
620 TPM_INT_STATUS(chip->vendor.locality)); in tis_int_handler()
621 ioread32(chip->vendor.iobase + TPM_INT_STATUS(chip->vendor.locality)); in tis_int_handler()
629 static void tpm_tis_remove(struct tpm_chip *chip) in tpm_tis_remove() argument
631 if (chip->flags & TPM_CHIP_FLAG_TPM2) in tpm_tis_remove()
632 tpm2_shutdown(chip, TPM2_SU_CLEAR); in tpm_tis_remove()
635 ioread32(chip->vendor.iobase + in tpm_tis_remove()
636 TPM_INT_ENABLE(chip->vendor. in tpm_tis_remove()
638 chip->vendor.iobase + in tpm_tis_remove()
639 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_remove()
640 release_locality(chip, chip->vendor.locality, 1); in tpm_tis_remove()
648 struct tpm_chip *chip; in tpm_tis_init() local
655 chip = tpmm_chip_alloc(dev, &tpm_tis); in tpm_tis_init()
656 if (IS_ERR(chip)) in tpm_tis_init()
657 return PTR_ERR(chip); in tpm_tis_init()
659 chip->vendor.priv = priv; in tpm_tis_init()
661 chip->acpi_dev_handle = acpi_dev_handle; in tpm_tis_init()
664 chip->vendor.iobase = devm_ioremap(dev, tpm_info->start, tpm_info->len); in tpm_tis_init()
665 if (!chip->vendor.iobase) in tpm_tis_init()
669 chip->vendor.timeout_a = TIS_TIMEOUT_A_MAX; in tpm_tis_init()
670 chip->vendor.timeout_b = TIS_TIMEOUT_B_MAX; in tpm_tis_init()
671 chip->vendor.timeout_c = TIS_TIMEOUT_C_MAX; in tpm_tis_init()
672 chip->vendor.timeout_d = TIS_TIMEOUT_D_MAX; in tpm_tis_init()
674 if (wait_startup(chip, 0) != 0) { in tpm_tis_init()
679 if (request_locality(chip, 0) != 0) { in tpm_tis_init()
684 rc = tpm2_probe(chip); in tpm_tis_init()
688 vendor = ioread32(chip->vendor.iobase + TPM_DID_VID(0)); in tpm_tis_init()
689 chip->vendor.manufacturer_id = vendor; in tpm_tis_init()
692 (chip->flags & TPM_CHIP_FLAG_TPM2) ? "2.0" : "1.2", in tpm_tis_init()
693 vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0))); in tpm_tis_init()
696 probe = probe_itpm(chip); in tpm_tis_init()
710 ioread32(chip->vendor.iobase + in tpm_tis_init()
711 TPM_INTF_CAPS(chip->vendor.locality)); in tpm_tis_init()
734 init_waitqueue_head(&chip->vendor.read_queue); in tpm_tis_init()
735 init_waitqueue_head(&chip->vendor.int_queue); in tpm_tis_init()
738 ioread32(chip->vendor.iobase + in tpm_tis_init()
739 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_init()
746 chip->vendor.iobase + in tpm_tis_init()
747 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_init()
749 chip->vendor.irq = tpm_info->irq; in tpm_tis_init()
750 if (interrupts && !chip->vendor.irq) { in tpm_tis_init()
752 ioread8(chip->vendor.iobase + in tpm_tis_init()
753 TPM_INT_VECTOR(chip->vendor.locality)); in tpm_tis_init()
761 for (i = irq_s; i <= irq_e && chip->vendor.irq == 0; i++) { in tpm_tis_init()
762 iowrite8(i, chip->vendor.iobase + in tpm_tis_init()
763 TPM_INT_VECTOR(chip->vendor.locality)); in tpm_tis_init()
766 chip->devname, chip) != 0) { in tpm_tis_init()
767 dev_info(chip->pdev, in tpm_tis_init()
775 (chip->vendor.iobase + in tpm_tis_init()
776 TPM_INT_STATUS(chip->vendor.locality)), in tpm_tis_init()
777 chip->vendor.iobase + in tpm_tis_init()
778 TPM_INT_STATUS(chip->vendor.locality)); in tpm_tis_init()
782 chip->vendor.iobase + in tpm_tis_init()
783 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_init()
785 chip->vendor.probed_irq = 0; in tpm_tis_init()
788 if (chip->flags & TPM_CHIP_FLAG_TPM2) in tpm_tis_init()
789 tpm2_gen_interrupt(chip); in tpm_tis_init()
791 tpm_gen_interrupt(chip); in tpm_tis_init()
793 chip->vendor.irq = chip->vendor.probed_irq; in tpm_tis_init()
799 (chip->vendor.iobase + in tpm_tis_init()
800 TPM_INT_STATUS(chip->vendor.locality)), in tpm_tis_init()
801 chip->vendor.iobase + in tpm_tis_init()
802 TPM_INT_STATUS(chip->vendor.locality)); in tpm_tis_init()
806 chip->vendor.iobase + in tpm_tis_init()
807 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_init()
810 if (chip->vendor.irq) { in tpm_tis_init()
811 iowrite8(chip->vendor.irq, in tpm_tis_init()
812 chip->vendor.iobase + in tpm_tis_init()
813 TPM_INT_VECTOR(chip->vendor.locality)); in tpm_tis_init()
815 (dev, chip->vendor.irq, tis_int_handler, IRQF_SHARED, in tpm_tis_init()
816 chip->devname, chip) != 0) { in tpm_tis_init()
817 dev_info(chip->pdev, in tpm_tis_init()
819 chip->vendor.irq); in tpm_tis_init()
820 chip->vendor.irq = 0; in tpm_tis_init()
824 (chip->vendor.iobase + in tpm_tis_init()
825 TPM_INT_STATUS(chip->vendor.locality)), in tpm_tis_init()
826 chip->vendor.iobase + in tpm_tis_init()
827 TPM_INT_STATUS(chip->vendor.locality)); in tpm_tis_init()
831 chip->vendor.iobase + in tpm_tis_init()
832 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_init()
836 if (chip->flags & TPM_CHIP_FLAG_TPM2) { in tpm_tis_init()
837 chip->vendor.timeout_a = msecs_to_jiffies(TPM2_TIMEOUT_A); in tpm_tis_init()
838 chip->vendor.timeout_b = msecs_to_jiffies(TPM2_TIMEOUT_B); in tpm_tis_init()
839 chip->vendor.timeout_c = msecs_to_jiffies(TPM2_TIMEOUT_C); in tpm_tis_init()
840 chip->vendor.timeout_d = msecs_to_jiffies(TPM2_TIMEOUT_D); in tpm_tis_init()
841 chip->vendor.duration[TPM_SHORT] = in tpm_tis_init()
843 chip->vendor.duration[TPM_MEDIUM] = in tpm_tis_init()
845 chip->vendor.duration[TPM_LONG] = in tpm_tis_init()
848 rc = tpm2_do_selftest(chip); in tpm_tis_init()
851 rc = tpm2_startup(chip, TPM2_SU_CLEAR); in tpm_tis_init()
853 rc = tpm2_do_selftest(chip); in tpm_tis_init()
863 if (tpm_get_timeouts(chip)) { in tpm_tis_init()
869 if (tpm_do_selftest(chip)) { in tpm_tis_init()
876 return tpm_chip_register(chip); in tpm_tis_init()
878 tpm_tis_remove(chip); in tpm_tis_init()
883 static void tpm_tis_reenable_interrupts(struct tpm_chip *chip) in tpm_tis_reenable_interrupts() argument
889 iowrite8(chip->vendor.irq, chip->vendor.iobase + in tpm_tis_reenable_interrupts()
890 TPM_INT_VECTOR(chip->vendor.locality)); in tpm_tis_reenable_interrupts()
893 ioread32(chip->vendor.iobase + in tpm_tis_reenable_interrupts()
894 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_reenable_interrupts()
901 chip->vendor.iobase + TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_reenable_interrupts()
906 struct tpm_chip *chip = dev_get_drvdata(dev); in tpm_tis_resume() local
909 if (chip->vendor.irq) in tpm_tis_resume()
910 tpm_tis_reenable_interrupts(chip); in tpm_tis_resume()
919 if (!(chip->flags & TPM_CHIP_FLAG_TPM2)) in tpm_tis_resume()
920 tpm_do_selftest(chip); in tpm_tis_resume()
971 struct tpm_chip *chip = pnp_get_drvdata(dev); in tpm_tis_pnp_remove() local
973 tpm_chip_unregister(chip); in tpm_tis_pnp_remove()
974 tpm_tis_remove(chip); in tpm_tis_pnp_remove()
1037 struct tpm_chip *chip = dev_get_drvdata(&dev->dev); in tpm_tis_acpi_remove() local
1039 tpm_chip_unregister(chip); in tpm_tis_acpi_remove()
1040 tpm_tis_remove(chip); in tpm_tis_acpi_remove()
1123 struct tpm_chip *chip; in cleanup_tis() local
1135 chip = dev_get_drvdata(&pdev->dev); in cleanup_tis()
1136 tpm_chip_unregister(chip); in cleanup_tis()
1137 tpm_tis_remove(chip); in cleanup_tis()