MCPcopy Create free account
hub / github.com/F-Stack/f-stack / decode_win_pcie_setup

Function decode_win_pcie_setup

freebsd/arm/mv/mv_common.c:1754–1816  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1752}
1753
1754void
1755decode_win_pcie_setup(u_long base)
1756{
1757 uint32_t size = 0, ddrbase = ~0;
1758 uint32_t cr, br;
1759 int i, j;
1760
1761 for (i = 0; i < MV_PCIE_BAR_MAX; i++) {
1762 pcie_bar_br_write(base, i,
1763 MV_PCIE_BAR_64BIT | MV_PCIE_BAR_PREFETCH_EN);
1764 if (i < 3)
1765 pcie_bar_brh_write(base, i, 0);
1766 if (i > 0)
1767 pcie_bar_cr_write(base, i, 0);
1768 }
1769
1770 for (i = 0; i < MV_WIN_PCIE_MAX; i++) {
1771 win_pcie_cr_write(base, i, 0);
1772 win_pcie_br_write(base, i, 0);
1773 win_pcie_remap_write(base, i, 0);
1774 }
1775
1776 /* On End-Point only set BAR size to 1MB regardless of DDR size */
1777 if ((bus_space_read_4(fdtbus_bs_tag, base, MV_PCIE_CONTROL)
1778 & MV_PCIE_ROOT_CMPLX) == 0) {
1779 pcie_bar_cr_write(base, 1, 0xf0000 | 1);
1780 return;
1781 }
1782
1783 for (i = 0; i < MV_WIN_DDR_MAX; i++) {
1784 if (ddr_is_active(i)) {
1785 /* Map DDR to BAR 1 */
1786 cr = (ddr_size(i) - 1) & 0xffff0000;
1787 size += ddr_size(i) & 0xffff0000;
1788 cr |= (ddr_attr(i) << 8) | (ddr_target(i) << 4) | 1;
1789 br = ddr_base(i);
1790 if (br < ddrbase)
1791 ddrbase = br;
1792
1793 /* Use the first available PCIE window */
1794 for (j = 0; j < MV_WIN_PCIE_MAX; j++) {
1795 if (win_pcie_cr_read(base, j) != 0)
1796 continue;
1797
1798 win_pcie_br_write(base, j, br);
1799 win_pcie_cr_write(base, j, cr);
1800 break;
1801 }
1802 }
1803 }
1804
1805 /*
1806 * Upper 16 bits in BAR register is interpreted as BAR size
1807 * (in 64 kB units) plus 64kB, so subtract 0x10000
1808 * form value passed to register to get correct value.
1809 */
1810 size -= 0x10000;
1811 pcie_bar_cr_write(base, 1, size | 1);

Callers

nothing calls this directly

Calls 6

bus_space_read_4Function · 0.85
ddr_is_activeFunction · 0.85
ddr_sizeFunction · 0.85
ddr_attrFunction · 0.85
ddr_targetFunction · 0.85
ddr_baseFunction · 0.85

Tested by

no test coverage detected