Merge tag 'rproc-v4.6-rc1' of git://github.com/andersson/remoteproc
[cascardo/linux.git] / drivers / bus / mvebu-mbus.c
index c43c3d2..c2e5286 100644 (file)
@@ -948,6 +948,58 @@ void mvebu_mbus_get_pcie_io_aperture(struct resource *res)
        *res = mbus_state.pcie_io_aperture;
 }
 
+int mvebu_mbus_get_dram_win_info(phys_addr_t phyaddr, u8 *target, u8 *attr)
+{
+       const struct mbus_dram_target_info *dram;
+       int i;
+
+       /* Get dram info */
+       dram = mv_mbus_dram_info();
+       if (!dram) {
+               pr_err("missing DRAM information\n");
+               return -ENODEV;
+       }
+
+       /* Try to find matching DRAM window for phyaddr */
+       for (i = 0; i < dram->num_cs; i++) {
+               const struct mbus_dram_window *cs = dram->cs + i;
+
+               if (cs->base <= phyaddr &&
+                       phyaddr <= (cs->base + cs->size - 1)) {
+                       *target = dram->mbus_dram_target_id;
+                       *attr = cs->mbus_attr;
+                       return 0;
+               }
+       }
+
+       pr_err("invalid dram address 0x%x\n", phyaddr);
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(mvebu_mbus_get_dram_win_info);
+
+int mvebu_mbus_get_io_win_info(phys_addr_t phyaddr, u32 *size, u8 *target,
+                              u8 *attr)
+{
+       int win;
+
+       for (win = 0; win < mbus_state.soc->num_wins; win++) {
+               u64 wbase;
+               int enabled;
+
+               mvebu_mbus_read_window(&mbus_state, win, &enabled, &wbase,
+                                      size, target, attr, NULL);
+
+               if (!enabled)
+                       continue;
+
+               if (wbase <= phyaddr && phyaddr <= wbase + *size)
+                       return win;
+       }
+
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(mvebu_mbus_get_io_win_info);
+
 static __init int mvebu_mbus_debugfs_init(void)
 {
        struct mvebu_mbus_state *s = &mbus_state;