]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
sim: bfin: add proper regs to dmac
authorMike Frysinger <vapier@gentoo.org>
Sat, 4 Jun 2011 17:06:39 +0000 (13:06 -0400)
committerMike Frysinger <vapier@gentoo.org>
Mon, 1 Jan 2024 23:23:25 +0000 (18:23 -0500)
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
sim/bfin/dv-bfin_dmac.c
sim/bfin/machs.c
sim/bfin/machs.h

index b193dc3c0c6dce0978d3e558d15bbc47009ddbb3..5480dcb6ac3d0e39459801a56ac79217c68b0122 100644 (file)
@@ -37,7 +37,21 @@ struct bfin_dmac
 
   const char * const *pmap;
   unsigned int pmap_count;
+
+  /* Order after here is important -- matches hardware MMR layout.  */
+  bu32 _pad0[3];
+  bu16 BFIN_MMR_16 (tc_per);
+  bu16 BFIN_MMR_16 (tc_cnt);
+};
+#define mmr_base()      offsetof(struct bfin_dmac, _pad0[0])
+#define mmr_offset(mmr) (offsetof(struct bfin_dmac, mmr) - mmr_base())
+#define mmr_idx(mmr)    (mmr_offset (mmr) / 4)
+
+static const char * const mmr_names[] =
+{
+  [mmr_idx (tc_per)] = "DMAC_TC_PER", "DMAC_TC_CNT",
 };
+#define mmr_name(off) (mmr_names[(off) / 4] ? : "<INV>")
 
 struct hw *
 bfin_dmac_get_peer (struct hw *dma, bu16 pmap)
@@ -371,6 +385,34 @@ bfin_dmac_port_event (struct hw *me, int my_port, struct hw *source,
   hw_port_event (dma, 0, 1);
 }
 
+static void
+attach_bfin_dmac_regs (struct hw *me, struct bfin_dmac *dmac)
+{
+  address_word attach_address;
+  int attach_space;
+  unsigned attach_size;
+  reg_property_spec reg;
+
+  if (hw_find_property (me, "reg") == NULL)
+    hw_abort (me, "Missing \"reg\" property");
+
+  if (!hw_find_reg_array_property (me, "reg", 0, &reg))
+    hw_abort (me, "\"reg\" property must contain three addr/size entries");
+
+  hw_unit_address_to_attach_address (hw_parent (me),
+                                    &reg.address,
+                                    &attach_space, &attach_address, me);
+  hw_unit_size_to_attach_size (hw_parent (me), &reg.size, &attach_size, me);
+
+  if (attach_size != BFIN_MMR_DMAC_SIZE)
+    hw_abort (me, "\"reg\" size must be %#x", BFIN_MMR_DMAC_SIZE);
+
+  hw_attach_address (hw_parent (me),
+                    0, attach_space, attach_address, attach_size, me);
+
+  dmac->base = attach_address;
+}
+
 static void
 bfin_dmac_finish (struct hw *me)
 {
@@ -382,6 +424,8 @@ bfin_dmac_finish (struct hw *me)
   set_hw_data (me, dmac);
   set_hw_port_event (me, bfin_dmac_port_event);
 
+  attach_bfin_dmac_regs (me, dmac);
+
   /* Initialize the DMA Controller.  */
   if (hw_find_property (me, "type") == NULL)
     hw_abort (me, "Missing \"type\" property");
index 92ce85aeb676e11134ff8ad77a3dc5402ec91d78..4ed4c0d7bdbea502424722dfbcc95813c9266922 100644 (file)
@@ -655,6 +655,7 @@ static const struct bfin_dev_layout bf534_dev[] =
   DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
   DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE,  "bfin_ebiu_amc"),
   DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE,  "bfin_ebiu_sdc"),
+  DEVICE (0xFFC00B00, BFIN_MMR_DMAC_SIZE,      "bfin_dmac@0"),
   DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0"),
   DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
   DEVICE (0xFFC01500, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@6"),
@@ -690,6 +691,7 @@ static const struct bfin_dev_layout bf537_dev[] =
   DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
   DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE,  "bfin_ebiu_amc"),
   DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE,  "bfin_ebiu_sdc"),
+  DEVICE (0xFFC00B00, BFIN_MMR_DMAC_SIZE,      "bfin_dmac@0"),
   DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0"),
   DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
   DEVICE (0xFFC01500, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@6"),
index 5bddfcfe59e5a952f14e36a376c82db306d3f693..e062cc04257150bf4cc4510adc1b1955899f9ae2 100644 (file)
@@ -52,6 +52,7 @@ extern const SIM_MACH * const bfin_sim_machs[];
 #define BFIN_COREMMR_WP_SIZE           0x204
 
 #define BFIN_MMR_DMA_SIZE              (4 * 16)
+#define BFIN_MMR_DMAC_SIZE             0x20
 #define BFIN_MMR_DMAC0_BASE            0xFFC00C00
 #define BFIN_MMR_DMAC1_BASE            0xFFC01C00
 #define BFIN_MMR_EBIU_AMC_SIZE         (4 * 3)