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()
649 struct tpm_chip *chip; in tpm_tis_init() local
656 chip = tpmm_chip_alloc(dev, &tpm_tis); in tpm_tis_init()
657 if (IS_ERR(chip)) in tpm_tis_init()
658 return PTR_ERR(chip); in tpm_tis_init()
660 chip->vendor.priv = priv; in tpm_tis_init()
662 chip->acpi_dev_handle = acpi_dev_handle; in tpm_tis_init()
665 chip->vendor.iobase = devm_ioremap(dev, tpm_info->start, tpm_info->len); in tpm_tis_init()
666 if (!chip->vendor.iobase) in tpm_tis_init()
670 chip->vendor.timeout_a = TIS_TIMEOUT_A_MAX; in tpm_tis_init()
671 chip->vendor.timeout_b = TIS_TIMEOUT_B_MAX; in tpm_tis_init()
672 chip->vendor.timeout_c = TIS_TIMEOUT_C_MAX; in tpm_tis_init()
673 chip->vendor.timeout_d = TIS_TIMEOUT_D_MAX; in tpm_tis_init()
675 if (wait_startup(chip, 0) != 0) { in tpm_tis_init()
680 if (request_locality(chip, 0) != 0) { in tpm_tis_init()
685 rc = tpm2_probe(chip); in tpm_tis_init()
689 vendor = ioread32(chip->vendor.iobase + TPM_DID_VID(0)); in tpm_tis_init()
690 chip->vendor.manufacturer_id = vendor; in tpm_tis_init()
693 (chip->flags & TPM_CHIP_FLAG_TPM2) ? "2.0" : "1.2", in tpm_tis_init()
694 vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0))); in tpm_tis_init()
697 probe = probe_itpm(chip); in tpm_tis_init()
711 ioread32(chip->vendor.iobase + in tpm_tis_init()
712 TPM_INTF_CAPS(chip->vendor.locality)); in tpm_tis_init()
735 init_waitqueue_head(&chip->vendor.read_queue); in tpm_tis_init()
736 init_waitqueue_head(&chip->vendor.int_queue); in tpm_tis_init()
739 ioread32(chip->vendor.iobase + in tpm_tis_init()
740 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_init()
747 chip->vendor.iobase + in tpm_tis_init()
748 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_init()
750 chip->vendor.irq = tpm_info->irq; in tpm_tis_init()
751 if (interrupts && !chip->vendor.irq) { in tpm_tis_init()
753 ioread8(chip->vendor.iobase + in tpm_tis_init()
754 TPM_INT_VECTOR(chip->vendor.locality)); in tpm_tis_init()
763 for (i = irq_s; i <= irq_e && chip->vendor.irq == 0; i++) { in tpm_tis_init()
764 iowrite8(i, chip->vendor.iobase + in tpm_tis_init()
765 TPM_INT_VECTOR(chip->vendor.locality)); in tpm_tis_init()
768 chip->devname, chip) != 0) { in tpm_tis_init()
769 dev_info(chip->pdev, in tpm_tis_init()
777 (chip->vendor.iobase + in tpm_tis_init()
778 TPM_INT_STATUS(chip->vendor.locality)), in tpm_tis_init()
779 chip->vendor.iobase + in tpm_tis_init()
780 TPM_INT_STATUS(chip->vendor.locality)); in tpm_tis_init()
784 chip->vendor.iobase + in tpm_tis_init()
785 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_init()
787 chip->vendor.probed_irq = 0; in tpm_tis_init()
790 if (chip->flags & TPM_CHIP_FLAG_TPM2) in tpm_tis_init()
791 tpm2_gen_interrupt(chip); in tpm_tis_init()
793 tpm_gen_interrupt(chip); in tpm_tis_init()
795 chip->vendor.irq = chip->vendor.probed_irq; in tpm_tis_init()
801 (chip->vendor.iobase + in tpm_tis_init()
802 TPM_INT_STATUS(chip->vendor.locality)), in tpm_tis_init()
803 chip->vendor.iobase + in tpm_tis_init()
804 TPM_INT_STATUS(chip->vendor.locality)); in tpm_tis_init()
808 chip->vendor.iobase + in tpm_tis_init()
809 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_init()
811 devm_free_irq(dev, i, chip); in tpm_tis_init()
814 if (chip->vendor.irq) { in tpm_tis_init()
815 iowrite8(chip->vendor.irq, in tpm_tis_init()
816 chip->vendor.iobase + in tpm_tis_init()
817 TPM_INT_VECTOR(chip->vendor.locality)); in tpm_tis_init()
819 (dev, chip->vendor.irq, tis_int_handler, IRQF_SHARED, in tpm_tis_init()
820 chip->devname, chip) != 0) { in tpm_tis_init()
821 dev_info(chip->pdev, in tpm_tis_init()
823 chip->vendor.irq); in tpm_tis_init()
824 chip->vendor.irq = 0; in tpm_tis_init()
828 (chip->vendor.iobase + in tpm_tis_init()
829 TPM_INT_STATUS(chip->vendor.locality)), in tpm_tis_init()
830 chip->vendor.iobase + in tpm_tis_init()
831 TPM_INT_STATUS(chip->vendor.locality)); in tpm_tis_init()
835 chip->vendor.iobase + in tpm_tis_init()
836 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_init()
839 iowrite8(irq_r, chip->vendor.iobase + in tpm_tis_init()
840 TPM_INT_VECTOR(chip->vendor.locality)); in tpm_tis_init()
842 if (chip->flags & TPM_CHIP_FLAG_TPM2) { in tpm_tis_init()
843 chip->vendor.timeout_a = msecs_to_jiffies(TPM2_TIMEOUT_A); in tpm_tis_init()
844 chip->vendor.timeout_b = msecs_to_jiffies(TPM2_TIMEOUT_B); in tpm_tis_init()
845 chip->vendor.timeout_c = msecs_to_jiffies(TPM2_TIMEOUT_C); in tpm_tis_init()
846 chip->vendor.timeout_d = msecs_to_jiffies(TPM2_TIMEOUT_D); in tpm_tis_init()
847 chip->vendor.duration[TPM_SHORT] = in tpm_tis_init()
849 chip->vendor.duration[TPM_MEDIUM] = in tpm_tis_init()
851 chip->vendor.duration[TPM_LONG] = in tpm_tis_init()
854 rc = tpm2_do_selftest(chip); in tpm_tis_init()
857 rc = tpm2_startup(chip, TPM2_SU_CLEAR); in tpm_tis_init()
859 rc = tpm2_do_selftest(chip); in tpm_tis_init()
869 if (tpm_get_timeouts(chip)) { in tpm_tis_init()
875 if (tpm_do_selftest(chip)) { in tpm_tis_init()
882 return tpm_chip_register(chip); in tpm_tis_init()
884 tpm_tis_remove(chip); in tpm_tis_init()
889 static void tpm_tis_reenable_interrupts(struct tpm_chip *chip) in tpm_tis_reenable_interrupts() argument
895 iowrite8(chip->vendor.irq, chip->vendor.iobase + in tpm_tis_reenable_interrupts()
896 TPM_INT_VECTOR(chip->vendor.locality)); in tpm_tis_reenable_interrupts()
899 ioread32(chip->vendor.iobase + in tpm_tis_reenable_interrupts()
900 TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_reenable_interrupts()
907 chip->vendor.iobase + TPM_INT_ENABLE(chip->vendor.locality)); in tpm_tis_reenable_interrupts()
912 struct tpm_chip *chip = dev_get_drvdata(dev); in tpm_tis_resume() local
915 if (chip->vendor.irq) in tpm_tis_resume()
916 tpm_tis_reenable_interrupts(chip); in tpm_tis_resume()
925 if (!(chip->flags & TPM_CHIP_FLAG_TPM2)) in tpm_tis_resume()
926 tpm_do_selftest(chip); in tpm_tis_resume()
977 struct tpm_chip *chip = pnp_get_drvdata(dev); in tpm_tis_pnp_remove() local
979 tpm_chip_unregister(chip); in tpm_tis_pnp_remove()
980 tpm_tis_remove(chip); in tpm_tis_pnp_remove()
1043 struct tpm_chip *chip = dev_get_drvdata(&dev->dev); in tpm_tis_acpi_remove() local
1045 tpm_chip_unregister(chip); in tpm_tis_acpi_remove()
1046 tpm_tis_remove(chip); in tpm_tis_acpi_remove()
1129 struct tpm_chip *chip; in cleanup_tis() local
1141 chip = dev_get_drvdata(&pdev->dev); in cleanup_tis()
1142 tpm_chip_unregister(chip); in cleanup_tis()
1143 tpm_tis_remove(chip); in cleanup_tis()