static void mvneta_conf_mbus_windows(struct mvneta_port *priv) { const struct mbus_dram_target_info *dram = mvebu_mbus_dram_info(); u32 win_enable, win_protect; int i; for (i = 0; i < 6; i++) { writel(0, priv->reg + MVNETA_WIN_BASE(i)); writel(0, priv->reg + MVNETA_WIN_SIZE(i)); if (i < 4) writel(0, priv->reg + MVNETA_WIN_REMAP(i)); } win_enable = 0x3f; win_protect = 0; for (i = 0; i < dram->num_cs; i++) { const struct mbus_dram_window *cs = dram->cs + i; writel((cs->base & 0xffff0000) | (cs->mbus_attr << 8) | dram->mbus_dram_target_id, priv->reg + MVNETA_WIN_BASE(i)); writel((cs->size - 1) & 0xffff0000, priv->reg + MVNETA_WIN_SIZE(i)); win_enable &= ~(1 << i); win_protect |= 3 << (2 * i); } writel(win_enable, priv->reg + MVNETA_BASE_ADDR_ENABLE); }
static void mvneta_conf_mbus_windows(struct mvneta_port *pp) { const struct mbus_dram_target_info *dram; u32 win_enable; u32 win_protect; int i; dram = mvebu_mbus_dram_info(); for (i = 0; i < 6; i++) { mvreg_write(pp, MVNETA_WIN_BASE(i), 0); mvreg_write(pp, MVNETA_WIN_SIZE(i), 0); if (i < 4) mvreg_write(pp, MVNETA_WIN_REMAP(i), 0); } win_enable = 0x3f; win_protect = 0; for (i = 0; i < dram->num_cs; i++) { const struct mbus_dram_window *cs = dram->cs + i; mvreg_write(pp, MVNETA_WIN_BASE(i), (cs->base & 0xffff0000) | (cs->mbus_attr << 8) | dram->mbus_dram_target_id); mvreg_write(pp, MVNETA_WIN_SIZE(i), (cs->size - 1) & 0xffff0000); win_enable &= ~(1 << i); win_protect |= 3 << (2 * i); } mvreg_write(pp, MVNETA_BASE_ADDR_ENABLE, win_enable); }
/* setup DRAM access windows provided by mbus */ static void eunit_set_dram_access(struct orion_gbe *gbe) { const struct mbus_dram_target_info *dram = mvebu_mbus_dram_info(); u32 bare = ~0, epap = 0, reg; int n; for (n = 0; n < NR_ADDR_WINS; n++) { if (n >= dram->num_cs) continue; /* enable BAR */ bare &= ~BIT(n); /* set port access protect to R/W */ epap |= ACCESS_FULL << (n * 2); /* configure Base Address and Size */ reg = ((dram->cs[n].size / SZ_64K) - 1) << 16; writel(reg, gbe->regs + EUNIT_S(n)); reg = dram->cs[n].base & 0xffff0000; reg |= dram->cs[n].mbus_attr << 8; reg |= dram->mbus_dram_target_id; writel(reg, gbe->regs + EUNIT_BA(n)); if (n < NR_HIGH_ADDR_WINS) writel(0, gbe->regs + EUNIT_HA(n)); } writel(epap, gbe->regs + EUNIT_PAP); writel(bare, gbe->regs + EUNIT_BARE); }
/* * Setup PCIE BARs and Address Decode Wins: * BAR[0,2] -> disabled, BAR[1] -> covers all DRAM banks * WIN[0-3] -> DRAM bank[0-3] */ static void mvebu_pcie_setup_wins(struct mvebu_pcie *pcie) { const struct mbus_dram_target_info *dram = mvebu_mbus_dram_info(); u32 size; int i; /* First, disable and clear BARs and windows. */ for (i = 1; i < 3; i++) { writel(0, pcie->base + PCIE_BAR_CTRL_OFF(i)); writel(0, pcie->base + PCIE_BAR_LO_OFF(i)); writel(0, pcie->base + PCIE_BAR_HI_OFF(i)); } for (i = 0; i < 5; i++) { writel(0, pcie->base + PCIE_WIN04_CTRL_OFF(i)); writel(0, pcie->base + PCIE_WIN04_BASE_OFF(i)); writel(0, pcie->base + PCIE_WIN04_REMAP_OFF(i)); } writel(0, pcie->base + PCIE_WIN5_CTRL_OFF); writel(0, pcie->base + PCIE_WIN5_BASE_OFF); writel(0, pcie->base + PCIE_WIN5_REMAP_OFF); /* Setup windows for DDR banks. Count total DDR size on the fly. */ size = 0; for (i = 0; i < dram->num_cs; i++) { const struct mbus_dram_window *cs = dram->cs + i; writel(cs->base & 0xffff0000, pcie->base + PCIE_WIN04_BASE_OFF(i)); writel(0, pcie->base + PCIE_WIN04_REMAP_OFF(i)); writel(((cs->size - 1) & 0xffff0000) | (cs->mbus_attr << 8) | (dram->mbus_dram_target_id << 4) | 1, pcie->base + PCIE_WIN04_CTRL_OFF(i)); size += cs->size; } /* Round up 'size' to the nearest power of two. */ if ((size & (size - 1)) != 0) size = 1 << fls(size); /* Setup BAR[1] to all DRAM banks. */ writel(dram->cs[0].base | 0xc, pcie->base + PCIE_BAR_LO_OFF(1)); writel(0, pcie->base + PCIE_BAR_HI_OFF(1)); writel(((size - 1) & 0xffff0000) | 0x1, pcie->base + PCIE_BAR_CTRL_OFF(1)); }
/* * Initialize SATA memory windows */ static void mvsata_ide_conf_mbus_windows(void) { const struct mbus_dram_target_info *dram; int i; dram = mvebu_mbus_dram_info(); /* Disable windows, Set Size/Base to 0 */ for (i = 0; i < 4; i++) { writel(0, MVSATA_WIN_CONTROL(i)); writel(0, MVSATA_WIN_BASE(i)); } for (i = 0; i < dram->num_cs; i++) { const struct mbus_dram_window *cs = dram->cs + i; writel(((cs->size - 1) & 0xffff0000) | (cs->mbus_attr << 8) | (dram->mbus_dram_target_id << 4) | 1, MVSATA_WIN_CONTROL(i)); writel(cs->base & 0xffff0000, MVSATA_WIN_BASE(i)); } }
static void sdhci_mvebu_mbus_config(void __iomem *base) { const struct mbus_dram_target_info *dram; int i; dram = mvebu_mbus_dram_info(); for (i = 0; i < 4; i++) { writel(0, base + SDHCI_WINDOW_CTRL(i)); writel(0, base + SDHCI_WINDOW_BASE(i)); } for (i = 0; i < dram->num_cs; i++) { const struct mbus_dram_window *cs = dram->cs + i; /* Write size, attributes and target id to control register */ writel(((cs->size - 1) & 0xffff0000) | (cs->mbus_attr << 8) | (dram->mbus_dram_target_id << 4) | 1, base + SDHCI_WINDOW_CTRL(i)); /* Write base address to base register */ writel(cs->base, base + SDHCI_WINDOW_BASE(i)); } }
/* * Once all the older Marvell SoC's (Orion, Kirkwood) are converted * to the common mvebu archticture including the mbus setup, this * will be the only function needed to configure the access windows */ static void usb_brg_adrdec_setup(int index) { const struct mbus_dram_target_info *dram; int i; dram = mvebu_mbus_dram_info(); for (i = 0; i < 4; i++) { writel(0, MVUSB_BASE(index) + USB_WINDOW_CTRL(i)); writel(0, MVUSB_BASE(index) + USB_WINDOW_BASE(i)); } for (i = 0; i < dram->num_cs; i++) { const struct mbus_dram_window *cs = dram->cs + i; /* Write size, attributes and target id to control register */ writel(((cs->size - 1) & 0xffff0000) | (cs->mbus_attr << 8) | (dram->mbus_dram_target_id << 4) | 1, MVUSB_BASE(index) + USB_WINDOW_CTRL(i)); /* Write base address to base register */ writel(cs->base, MVUSB_BASE(index) + USB_WINDOW_BASE(i)); } }