Blame sim/bfin/dv-bfin_ebiu_amc.c

Packit Service 706eca
/* Blackfin External Bus Interface Unit (EBIU) Asynchronous Memory Controller
Packit Service 706eca
   (AMC) model.
Packit Service 706eca
Packit Service 706eca
   Copyright (C) 2010-2018 Free Software Foundation, Inc.
Packit Service 706eca
   Contributed by Analog Devices, Inc.
Packit Service 706eca
Packit Service 706eca
   This file is part of simulators.
Packit Service 706eca
Packit Service 706eca
   This program is free software; you can redistribute it and/or modify
Packit Service 706eca
   it under the terms of the GNU General Public License as published by
Packit Service 706eca
   the Free Software Foundation; either version 3 of the License, or
Packit Service 706eca
   (at your option) any later version.
Packit Service 706eca
Packit Service 706eca
   This program is distributed in the hope that it will be useful,
Packit Service 706eca
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 706eca
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 706eca
   GNU General Public License for more details.
Packit Service 706eca
Packit Service 706eca
   You should have received a copy of the GNU General Public License
Packit Service 706eca
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 706eca
Packit Service 706eca
#include "config.h"
Packit Service 706eca
Packit Service 706eca
#include "sim-main.h"
Packit Service 706eca
#include "devices.h"
Packit Service 706eca
#include "dv-bfin_ebiu_amc.h"
Packit Service 706eca
Packit Service 706eca
struct bfin_ebiu_amc
Packit Service 706eca
{
Packit Service 706eca
  bu32 base;
Packit Service 706eca
  int type;
Packit Service 706eca
  bu32 bank_base, bank_size;
Packit Service 706eca
  unsigned (*io_write) (struct hw *, const void *, int, address_word,
Packit Service 706eca
			unsigned, struct bfin_ebiu_amc *, bu32, bu32);
Packit Service 706eca
  unsigned (*io_read) (struct hw *, void *, int, address_word, unsigned,
Packit Service 706eca
		       struct bfin_ebiu_amc *, bu32, void *, bu16 *, bu32 *);
Packit Service 706eca
  struct hw *slaves[4];
Packit Service 706eca
Packit Service 706eca
  /* Order after here is important -- matches hardware MMR layout.  */
Packit Service 706eca
  bu16 BFIN_MMR_16(amgctl);
Packit Service 706eca
  union {
Packit Service 706eca
    struct {
Packit Service 706eca
      bu32 ambctl0, ambctl1;
Packit Service 706eca
      bu32 _pad0[5];
Packit Service 706eca
      bu16 BFIN_MMR_16(mode);
Packit Service 706eca
      bu16 BFIN_MMR_16(fctl);
Packit Service 706eca
    } bf50x;
Packit Service 706eca
    struct {
Packit Service 706eca
      bu32 ambctl0, ambctl1;
Packit Service 706eca
    } bf53x;
Packit Service 706eca
    struct {
Packit Service 706eca
      bu32 ambctl0, ambctl1;
Packit Service 706eca
      bu32 mbsctl, arbstat, mode, fctl;
Packit Service 706eca
    } bf54x;
Packit Service 706eca
  };
Packit Service 706eca
};
Packit Service 706eca
#define mmr_base()      offsetof(struct bfin_ebiu_amc, amgctl)
Packit Service 706eca
#define mmr_offset(mmr) (offsetof(struct bfin_ebiu_amc, mmr) - mmr_base())
Packit Service 706eca
#define mmr_idx(mmr)    (mmr_offset (mmr) / 4)
Packit Service 706eca
Packit Service 706eca
static const char * const bf50x_mmr_names[] =
Packit Service 706eca
{
Packit Service 706eca
  "EBIU_AMGCTL", "EBIU_AMBCTL0", "EBIU_AMBCTL1",
Packit Service 706eca
  [mmr_idx (bf50x.mode)] = "EBIU_MODE", "EBIU_FCTL",
Packit Service 706eca
};
Packit Service 706eca
static const char * const bf53x_mmr_names[] =
Packit Service 706eca
{
Packit Service 706eca
  "EBIU_AMGCTL", "EBIU_AMBCTL0", "EBIU_AMBCTL1",
Packit Service 706eca
};
Packit Service 706eca
static const char * const bf54x_mmr_names[] =
Packit Service 706eca
{
Packit Service 706eca
  "EBIU_AMGCTL", "EBIU_AMBCTL0", "EBIU_AMBCTL1",
Packit Service 706eca
  "EBIU_MSBCTL", "EBIU_ARBSTAT", "EBIU_MODE", "EBIU_FCTL",
Packit Service 706eca
};
Packit Service 706eca
static const char * const *mmr_names;
Packit Service 706eca
#define mmr_name(off) (mmr_names[(off) / 4] ? : "<INV>")
Packit Service 706eca
Packit Service 706eca
static void
Packit Service 706eca
bfin_ebiu_amc_write_amgctl (struct hw *me, struct bfin_ebiu_amc *amc,
Packit Service 706eca
			    bu16 amgctl)
Packit Service 706eca
{
Packit Service 706eca
  bu32 amben_old, amben, addr, i;
Packit Service 706eca
Packit Service 706eca
  amben_old = min ((amc->amgctl >> 1) & 0x7, 4);
Packit Service 706eca
  amben = min ((amgctl >> 1) & 0x7, 4);
Packit Service 706eca
Packit Service 706eca
  HW_TRACE ((me, "reattaching banks: AMGCTL 0x%04x[%u] -> 0x%04x[%u]",
Packit Service 706eca
	     amc->amgctl, amben_old, amgctl, amben));
Packit Service 706eca
Packit Service 706eca
  for (i = 0; i < 4; ++i)
Packit Service 706eca
    {
Packit Service 706eca
      addr = amc->bank_base + i * amc->bank_size;
Packit Service 706eca
Packit Service 706eca
      if (i < amben_old)
Packit Service 706eca
	{
Packit Service 706eca
	  HW_TRACE ((me, "detaching bank %u (%#x base)", i, addr));
Packit Service 706eca
	  sim_core_detach (hw_system (me), NULL, 0, 0, addr);
Packit Service 706eca
	}
Packit Service 706eca
Packit Service 706eca
      if (i < amben)
Packit Service 706eca
	{
Packit Service 706eca
	  struct hw *slave = amc->slaves[i];
Packit Service 706eca
Packit Service 706eca
	  HW_TRACE ((me, "attaching bank %u (%#x base) to %s", i, addr,
Packit Service 706eca
		     slave ? hw_path (slave) : "<floating pins>"));
Packit Service 706eca
Packit Service 706eca
	  sim_core_attach (hw_system (me), NULL, 0, access_read_write_exec,
Packit Service 706eca
			   0, addr, amc->bank_size, 0, slave, NULL);
Packit Service 706eca
	}
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  amc->amgctl = amgctl;
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static unsigned
Packit Service 706eca
bf50x_ebiu_amc_io_write_buffer (struct hw *me, const void *source, int space,
Packit Service 706eca
				address_word addr, unsigned nr_bytes,
Packit Service 706eca
				struct bfin_ebiu_amc *amc, bu32 mmr_off,
Packit Service 706eca
				bu32 value)
Packit Service 706eca
{
Packit Service 706eca
  switch (mmr_off)
Packit Service 706eca
    {
Packit Service 706eca
    case mmr_offset(amgctl):
Packit Service 706eca
      if (!dv_bfin_mmr_require_16 (me, addr, nr_bytes, true))
Packit Service 706eca
	return 0;
Packit Service 706eca
      bfin_ebiu_amc_write_amgctl (me, amc, value);
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf50x.ambctl0):
Packit Service 706eca
      amc->bf50x.ambctl0 = value;
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf50x.ambctl1):
Packit Service 706eca
      amc->bf50x.ambctl1 = value;
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf50x.mode):
Packit Service 706eca
      /* XXX: implement this.  */
Packit Service 706eca
      if (!dv_bfin_mmr_require_16 (me, addr, nr_bytes, true))
Packit Service 706eca
	return 0;
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf50x.fctl):
Packit Service 706eca
      /* XXX: implement this.  */
Packit Service 706eca
      if (!dv_bfin_mmr_require_16 (me, addr, nr_bytes, true))
Packit Service 706eca
	return 0;
Packit Service 706eca
      break;
Packit Service 706eca
    default:
Packit Service 706eca
      dv_bfin_mmr_invalid (me, addr, nr_bytes, true);
Packit Service 706eca
      return 0;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  return nr_bytes;
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static unsigned
Packit Service 706eca
bf53x_ebiu_amc_io_write_buffer (struct hw *me, const void *source, int space,
Packit Service 706eca
				address_word addr, unsigned nr_bytes,
Packit Service 706eca
				struct bfin_ebiu_amc *amc, bu32 mmr_off,
Packit Service 706eca
				bu32 value)
Packit Service 706eca
{
Packit Service 706eca
  switch (mmr_off)
Packit Service 706eca
    {
Packit Service 706eca
    case mmr_offset(amgctl):
Packit Service 706eca
      if (!dv_bfin_mmr_require_16 (me, addr, nr_bytes, true))
Packit Service 706eca
	return 0;
Packit Service 706eca
      bfin_ebiu_amc_write_amgctl (me, amc, value);
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf53x.ambctl0):
Packit Service 706eca
      amc->bf53x.ambctl0 = value;
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf53x.ambctl1):
Packit Service 706eca
      amc->bf53x.ambctl1 = value;
Packit Service 706eca
      break;
Packit Service 706eca
    default:
Packit Service 706eca
      dv_bfin_mmr_invalid (me, addr, nr_bytes, true);
Packit Service 706eca
      return 0;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  return nr_bytes;
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static unsigned
Packit Service 706eca
bf54x_ebiu_amc_io_write_buffer (struct hw *me, const void *source, int space,
Packit Service 706eca
				address_word addr, unsigned nr_bytes,
Packit Service 706eca
				struct bfin_ebiu_amc *amc, bu32 mmr_off,
Packit Service 706eca
				bu32 value)
Packit Service 706eca
{
Packit Service 706eca
  switch (mmr_off)
Packit Service 706eca
    {
Packit Service 706eca
    case mmr_offset(amgctl):
Packit Service 706eca
      if (!dv_bfin_mmr_require_16 (me, addr, nr_bytes, true))
Packit Service 706eca
	return 0;
Packit Service 706eca
      bfin_ebiu_amc_write_amgctl (me, amc, value);
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf54x.ambctl0):
Packit Service 706eca
      amc->bf54x.ambctl0 = value;
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf54x.ambctl1):
Packit Service 706eca
      amc->bf54x.ambctl1 = value;
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf54x.mbsctl):
Packit Service 706eca
      /* XXX: implement this.  */
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf54x.arbstat):
Packit Service 706eca
      /* XXX: implement this.  */
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf54x.mode):
Packit Service 706eca
      /* XXX: implement this.  */
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf54x.fctl):
Packit Service 706eca
      /* XXX: implement this.  */
Packit Service 706eca
      break;
Packit Service 706eca
    default:
Packit Service 706eca
      dv_bfin_mmr_invalid (me, addr, nr_bytes, true);
Packit Service 706eca
      return 0;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  return nr_bytes;
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static unsigned
Packit Service 706eca
bfin_ebiu_amc_io_write_buffer (struct hw *me, const void *source, int space,
Packit Service 706eca
			       address_word addr, unsigned nr_bytes)
Packit Service 706eca
{
Packit Service 706eca
  struct bfin_ebiu_amc *amc = hw_data (me);
Packit Service 706eca
  bu32 mmr_off;
Packit Service 706eca
  bu32 value;
Packit Service 706eca
Packit Service 706eca
  /* Invalid access mode is higher priority than missing register.  */
Packit Service 706eca
  if (!dv_bfin_mmr_require_16_32 (me, addr, nr_bytes, true))
Packit Service 706eca
    return 0;
Packit Service 706eca
Packit Service 706eca
  value = dv_load_4 (source);
Packit Service 706eca
  mmr_off = addr - amc->base;
Packit Service 706eca
Packit Service 706eca
  HW_TRACE_WRITE ();
Packit Service 706eca
Packit Service 706eca
  return amc->io_write (me, source, space, addr, nr_bytes,
Packit Service 706eca
			amc, mmr_off, value);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static unsigned
Packit Service 706eca
bf50x_ebiu_amc_io_read_buffer (struct hw *me, void *dest, int space,
Packit Service 706eca
			       address_word addr, unsigned nr_bytes,
Packit Service 706eca
			       struct bfin_ebiu_amc *amc, bu32 mmr_off,
Packit Service 706eca
			       void *valuep, bu16 *value16, bu32 *value32)
Packit Service 706eca
{
Packit Service 706eca
  switch (mmr_off)
Packit Service 706eca
    {
Packit Service 706eca
    case mmr_offset(amgctl):
Packit Service 706eca
    case mmr_offset(bf50x.fctl):
Packit Service 706eca
      if (!dv_bfin_mmr_require_16 (me, addr, nr_bytes, false))
Packit Service 706eca
	return 0;
Packit Service 706eca
      dv_store_2 (dest, *value16);
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf50x.ambctl0):
Packit Service 706eca
    case mmr_offset(bf50x.ambctl1):
Packit Service 706eca
    case mmr_offset(bf50x.mode):
Packit Service 706eca
      dv_store_4 (dest, *value32);
Packit Service 706eca
      break;
Packit Service 706eca
    default:
Packit Service 706eca
      dv_bfin_mmr_invalid (me, addr, nr_bytes, false);
Packit Service 706eca
      return 0;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  return nr_bytes;
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static unsigned
Packit Service 706eca
bf53x_ebiu_amc_io_read_buffer (struct hw *me, void *dest, int space,
Packit Service 706eca
			       address_word addr, unsigned nr_bytes,
Packit Service 706eca
			       struct bfin_ebiu_amc *amc, bu32 mmr_off,
Packit Service 706eca
			       void *valuep, bu16 *value16, bu32 *value32)
Packit Service 706eca
{
Packit Service 706eca
  switch (mmr_off)
Packit Service 706eca
    {
Packit Service 706eca
    case mmr_offset(amgctl):
Packit Service 706eca
      if (!dv_bfin_mmr_require_16 (me, addr, nr_bytes, false))
Packit Service 706eca
	return 0;
Packit Service 706eca
      dv_store_2 (dest, *value16);
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf53x.ambctl0):
Packit Service 706eca
    case mmr_offset(bf53x.ambctl1):
Packit Service 706eca
      dv_store_4 (dest, *value32);
Packit Service 706eca
      break;
Packit Service 706eca
    default:
Packit Service 706eca
      dv_bfin_mmr_invalid (me, addr, nr_bytes, false);
Packit Service 706eca
      return 0;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  return nr_bytes;
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static unsigned
Packit Service 706eca
bf54x_ebiu_amc_io_read_buffer (struct hw *me, void *dest, int space,
Packit Service 706eca
			       address_word addr, unsigned nr_bytes,
Packit Service 706eca
			       struct bfin_ebiu_amc *amc, bu32 mmr_off,
Packit Service 706eca
			       void *valuep, bu16 *value16, bu32 *value32)
Packit Service 706eca
{
Packit Service 706eca
  switch (mmr_off)
Packit Service 706eca
    {
Packit Service 706eca
    case mmr_offset(amgctl):
Packit Service 706eca
      if (!dv_bfin_mmr_require_16 (me, addr, nr_bytes, false))
Packit Service 706eca
	return 0;
Packit Service 706eca
      dv_store_2 (dest, *value16);
Packit Service 706eca
      break;
Packit Service 706eca
    case mmr_offset(bf54x.ambctl0):
Packit Service 706eca
    case mmr_offset(bf54x.ambctl1):
Packit Service 706eca
    case mmr_offset(bf54x.mbsctl):
Packit Service 706eca
    case mmr_offset(bf54x.arbstat):
Packit Service 706eca
    case mmr_offset(bf54x.mode):
Packit Service 706eca
    case mmr_offset(bf54x.fctl):
Packit Service 706eca
      dv_store_4 (dest, *value32);
Packit Service 706eca
      break;
Packit Service 706eca
    default:
Packit Service 706eca
      dv_bfin_mmr_invalid (me, addr, nr_bytes, false);
Packit Service 706eca
      return 0;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  return nr_bytes;
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static unsigned
Packit Service 706eca
bfin_ebiu_amc_io_read_buffer (struct hw *me, void *dest, int space,
Packit Service 706eca
			      address_word addr, unsigned nr_bytes)
Packit Service 706eca
{
Packit Service 706eca
  struct bfin_ebiu_amc *amc = hw_data (me);
Packit Service 706eca
  bu32 mmr_off;
Packit Service 706eca
  void *valuep;
Packit Service 706eca
Packit Service 706eca
  /* Invalid access mode is higher priority than missing register.  */
Packit Service 706eca
  if (!dv_bfin_mmr_require_16_32 (me, addr, nr_bytes, false))
Packit Service 706eca
    return 0;
Packit Service 706eca
Packit Service 706eca
  mmr_off = addr - amc->base;
Packit Service 706eca
  valuep = (void *)((unsigned long)amc + mmr_base() + mmr_off);
Packit Service 706eca
Packit Service 706eca
  HW_TRACE_READ ();
Packit Service 706eca
Packit Service 706eca
  return amc->io_read (me, dest, space, addr, nr_bytes, amc,
Packit Service 706eca
		       mmr_off, valuep, valuep, valuep);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static void
Packit Service 706eca
bfin_ebiu_amc_attach_address_callback (struct hw *me,
Packit Service 706eca
				       int level,
Packit Service 706eca
				       int space,
Packit Service 706eca
				       address_word addr,
Packit Service 706eca
				       address_word nr_bytes,
Packit Service 706eca
				       struct hw *client)
Packit Service 706eca
{
Packit Service 706eca
  struct bfin_ebiu_amc *amc = hw_data (me);
Packit Service 706eca
Packit Service 706eca
  HW_TRACE ((me, "attach - level=%d, space=%d, addr=0x%lx, nr_bytes=%lu, client=%s",
Packit Service 706eca
	     level, space, (unsigned long) addr, (unsigned long) nr_bytes, hw_path (client)));
Packit Service 706eca
Packit Service 706eca
  if (addr + nr_bytes > ARRAY_SIZE (amc->slaves))
Packit Service 706eca
    hw_abort (me, "ebiu amc attaches are done in terms of banks");
Packit Service 706eca
Packit Service 706eca
  while (nr_bytes--)
Packit Service 706eca
    amc->slaves[addr + nr_bytes] = client;
Packit Service 706eca
Packit Service 706eca
  bfin_ebiu_amc_write_amgctl (me, amc, amc->amgctl);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static void
Packit Service 706eca
attach_bfin_ebiu_amc_regs (struct hw *me, struct bfin_ebiu_amc *amc,
Packit Service 706eca
			   unsigned reg_size)
Packit Service 706eca
{
Packit Service 706eca
  address_word attach_address;
Packit Service 706eca
  int attach_space;
Packit Service 706eca
  unsigned attach_size;
Packit Service 706eca
  reg_property_spec reg;
Packit Service 706eca
Packit Service 706eca
  if (hw_find_property (me, "reg") == NULL)
Packit Service 706eca
    hw_abort (me, "Missing \"reg\" property");
Packit Service 706eca
Packit Service 706eca
  if (!hw_find_reg_array_property (me, "reg", 0, &reg))
Packit Service 706eca
    hw_abort (me, "\"reg\" property must contain three addr/size entries");
Packit Service 706eca
Packit Service 706eca
  if (hw_find_property (me, "type") == NULL)
Packit Service 706eca
    hw_abort (me, "Missing \"type\" property");
Packit Service 706eca
Packit Service 706eca
  hw_unit_address_to_attach_address (hw_parent (me),
Packit Service 706eca
				     &reg.address,
Packit Service 706eca
				     &attach_space, &attach_address, me);
Packit Service 706eca
  hw_unit_size_to_attach_size (hw_parent (me), &reg.size, &attach_size, me);
Packit Service 706eca
Packit Service 706eca
  if (attach_size != reg_size)
Packit Service 706eca
    hw_abort (me, "\"reg\" size must be %#x", reg_size);
Packit Service 706eca
Packit Service 706eca
  hw_attach_address (hw_parent (me),
Packit Service 706eca
		     0, attach_space, attach_address, attach_size, me);
Packit Service 706eca
Packit Service 706eca
  amc->base = attach_address;
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static void
Packit Service 706eca
bfin_ebiu_amc_finish (struct hw *me)
Packit Service 706eca
{
Packit Service 706eca
  struct bfin_ebiu_amc *amc;
Packit Service 706eca
  bu32 amgctl;
Packit Service 706eca
  unsigned reg_size;
Packit Service 706eca
Packit Service 706eca
  amc = HW_ZALLOC (me, struct bfin_ebiu_amc);
Packit Service 706eca
Packit Service 706eca
  set_hw_data (me, amc);
Packit Service 706eca
  set_hw_io_read_buffer (me, bfin_ebiu_amc_io_read_buffer);
Packit Service 706eca
  set_hw_io_write_buffer (me, bfin_ebiu_amc_io_write_buffer);
Packit Service 706eca
  set_hw_attach_address (me, bfin_ebiu_amc_attach_address_callback);
Packit Service 706eca
Packit Service 706eca
  amc->type = hw_find_integer_property (me, "type");
Packit Service 706eca
Packit Service 706eca
  switch (amc->type)
Packit Service 706eca
    {
Packit Service 706eca
    case 500 ... 509:
Packit Service 706eca
      amc->io_write = bf50x_ebiu_amc_io_write_buffer;
Packit Service 706eca
      amc->io_read = bf50x_ebiu_amc_io_read_buffer;
Packit Service 706eca
      mmr_names = bf50x_mmr_names;
Packit Service 706eca
      reg_size = sizeof (amc->bf50x) + 4;
Packit Service 706eca
Packit Service 706eca
      /* Initialize the AMC.  */
Packit Service 706eca
      amc->bank_base     = BFIN_EBIU_AMC_BASE;
Packit Service 706eca
      amc->bank_size     = 1 * 1024 * 1024;
Packit Service 706eca
      amgctl             = 0x00F3;
Packit Service 706eca
      amc->bf50x.ambctl0 = 0x0000FFC2;
Packit Service 706eca
      amc->bf50x.ambctl1 = 0x0000FFC2;
Packit Service 706eca
      amc->bf50x.mode    = 0x0001;
Packit Service 706eca
      amc->bf50x.fctl    = 0x0002;
Packit Service 706eca
      break;
Packit Service 706eca
    case 540 ... 549:
Packit Service 706eca
      amc->io_write = bf54x_ebiu_amc_io_write_buffer;
Packit Service 706eca
      amc->io_read = bf54x_ebiu_amc_io_read_buffer;
Packit Service 706eca
      mmr_names = bf54x_mmr_names;
Packit Service 706eca
      reg_size = sizeof (amc->bf54x) + 4;
Packit Service 706eca
Packit Service 706eca
      /* Initialize the AMC.  */
Packit Service 706eca
      amc->bank_base     = BFIN_EBIU_AMC_BASE;
Packit Service 706eca
      amc->bank_size     = 64 * 1024 * 1024;
Packit Service 706eca
      amgctl             = 0x0002;
Packit Service 706eca
      amc->bf54x.ambctl0 = 0xFFC2FFC2;
Packit Service 706eca
      amc->bf54x.ambctl1 = 0xFFC2FFC2;
Packit Service 706eca
      amc->bf54x.fctl    = 0x0006;
Packit Service 706eca
      break;
Packit Service 706eca
    case 510 ... 519:
Packit Service 706eca
    case 522 ... 527:
Packit Service 706eca
    case 531 ... 533:
Packit Service 706eca
    case 534:
Packit Service 706eca
    case 536:
Packit Service 706eca
    case 537:
Packit Service 706eca
    case 538 ... 539:
Packit Service 706eca
    case 561:
Packit Service 706eca
      amc->io_write = bf53x_ebiu_amc_io_write_buffer;
Packit Service 706eca
      amc->io_read = bf53x_ebiu_amc_io_read_buffer;
Packit Service 706eca
      mmr_names = bf53x_mmr_names;
Packit Service 706eca
      reg_size = sizeof (amc->bf53x) + 4;
Packit Service 706eca
Packit Service 706eca
      /* Initialize the AMC.  */
Packit Service 706eca
      amc->bank_base     = BFIN_EBIU_AMC_BASE;
Packit Service 706eca
      if (amc->type == 561)
Packit Service 706eca
	amc->bank_size   = 64 * 1024 * 1024;
Packit Service 706eca
      else
Packit Service 706eca
	amc->bank_size   = 1 * 1024 * 1024;
Packit Service 706eca
      amgctl             = 0x00F2;
Packit Service 706eca
      amc->bf53x.ambctl0 = 0xFFC2FFC2;
Packit Service 706eca
      amc->bf53x.ambctl1 = 0xFFC2FFC2;
Packit Service 706eca
      break;
Packit Service 706eca
    case 590 ... 599: /* BF59x has no AMC.  */
Packit Service 706eca
    default:
Packit Service 706eca
      hw_abort (me, "no support for EBIU AMC on this Blackfin model yet");
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  attach_bfin_ebiu_amc_regs (me, amc, reg_size);
Packit Service 706eca
Packit Service 706eca
  bfin_ebiu_amc_write_amgctl (me, amc, amgctl);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
const struct hw_descriptor dv_bfin_ebiu_amc_descriptor[] =
Packit Service 706eca
{
Packit Service 706eca
  {"bfin_ebiu_amc", bfin_ebiu_amc_finish,},
Packit Service 706eca
  {NULL, NULL},
Packit Service 706eca
};