| 614 | } |
| 615 | |
| 616 | static void |
| 617 | its_init_cpu_lpi(device_t dev, struct gicv3_its_softc *sc) |
| 618 | { |
| 619 | device_t gicv3; |
| 620 | uint64_t xbaser, tmp; |
| 621 | uint32_t ctlr; |
| 622 | u_int cpuid; |
| 623 | |
| 624 | gicv3 = device_get_parent(dev); |
| 625 | cpuid = PCPU_GET(cpuid); |
| 626 | |
| 627 | /* Disable LPIs */ |
| 628 | ctlr = gic_r_read_4(gicv3, GICR_CTLR); |
| 629 | ctlr &= ~GICR_CTLR_LPI_ENABLE; |
| 630 | gic_r_write_4(gicv3, GICR_CTLR, ctlr); |
| 631 | |
| 632 | /* Make sure changes are observable my the GIC */ |
| 633 | dsb(sy); |
| 634 | |
| 635 | /* |
| 636 | * Set the redistributor base |
| 637 | */ |
| 638 | xbaser = vtophys(sc->sc_conf_base) | |
| 639 | (GICR_PROPBASER_SHARE_IS << GICR_PROPBASER_SHARE_SHIFT) | |
| 640 | (GICR_PROPBASER_CACHE_NIWAWB << GICR_PROPBASER_CACHE_SHIFT) | |
| 641 | (flsl(LPI_CONFTAB_SIZE | GIC_FIRST_LPI) - 1); |
| 642 | gic_r_write_8(gicv3, GICR_PROPBASER, xbaser); |
| 643 | |
| 644 | /* Check the cache attributes we set */ |
| 645 | tmp = gic_r_read_8(gicv3, GICR_PROPBASER); |
| 646 | |
| 647 | if ((tmp & GICR_PROPBASER_SHARE_MASK) != |
| 648 | (xbaser & GICR_PROPBASER_SHARE_MASK)) { |
| 649 | if ((tmp & GICR_PROPBASER_SHARE_MASK) == |
| 650 | (GICR_PROPBASER_SHARE_NS << GICR_PROPBASER_SHARE_SHIFT)) { |
| 651 | /* We need to mark as non-cacheable */ |
| 652 | xbaser &= ~(GICR_PROPBASER_SHARE_MASK | |
| 653 | GICR_PROPBASER_CACHE_MASK); |
| 654 | /* Non-cacheable */ |
| 655 | xbaser |= GICR_PROPBASER_CACHE_NIN << |
| 656 | GICR_PROPBASER_CACHE_SHIFT; |
| 657 | /* Non-sareable */ |
| 658 | xbaser |= GICR_PROPBASER_SHARE_NS << |
| 659 | GICR_PROPBASER_SHARE_SHIFT; |
| 660 | gic_r_write_8(gicv3, GICR_PROPBASER, xbaser); |
| 661 | } |
| 662 | sc->sc_its_flags |= ITS_FLAGS_LPI_CONF_FLUSH; |
| 663 | } |
| 664 | |
| 665 | /* |
| 666 | * Set the LPI pending table base |
| 667 | */ |
| 668 | xbaser = vtophys(sc->sc_pend_base[cpuid]) | |
| 669 | (GICR_PENDBASER_CACHE_NIWAWB << GICR_PENDBASER_CACHE_SHIFT) | |
| 670 | (GICR_PENDBASER_SHARE_IS << GICR_PENDBASER_SHARE_SHIFT); |
| 671 | |
| 672 | gic_r_write_8(gicv3, GICR_PENDBASER, xbaser); |
| 673 |
no test coverage detected