Blame sim/bfin/devices.h

Packit Service 706eca
/* Common Blackfin device stuff.
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
#ifndef DEVICES_H
Packit Service 706eca
#define DEVICES_H
Packit Service 706eca
Packit Service 706eca
#include "hw-base.h"
Packit Service 706eca
#include "hw-main.h"
Packit Service 706eca
#include "hw-device.h"
Packit Service 706eca
#include "hw-tree.h"
Packit Service 706eca
Packit Service 706eca
/* We keep the same inital structure layout with DMA enabled devices.  */
Packit Service 706eca
struct dv_bfin {
Packit Service 706eca
  bu32 base;
Packit Service 706eca
  struct hw *dma_master;
Packit Service 706eca
  bool acked;
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
#define BFIN_MMR_16(mmr) mmr, __pad_##mmr
Packit Service 706eca
Packit Service 706eca
/* Most peripherals have either one interrupt or these three.  */
Packit Service 706eca
#define DV_PORT_TX   0
Packit Service 706eca
#define DV_PORT_RX   1
Packit Service 706eca
#define DV_PORT_STAT 2
Packit Service 706eca
Packit Service 706eca
unsigned int dv_get_bus_num (struct hw *);
Packit Service 706eca

Packit Service 706eca
static inline bu8 dv_load_1 (const void *ptr)
Packit Service 706eca
{
Packit Service 706eca
  const unsigned char *c = ptr;
Packit Service 706eca
  return c[0];
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static inline void dv_store_1 (void *ptr, bu8 val)
Packit Service 706eca
{
Packit Service 706eca
  unsigned char *c = ptr;
Packit Service 706eca
  c[0] = val;
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static inline bu16 dv_load_2 (const void *ptr)
Packit Service 706eca
{
Packit Service 706eca
  const unsigned char *c = ptr;
Packit Service 706eca
  return (c[1] << 8) | dv_load_1 (ptr);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static inline void dv_store_2 (void *ptr, bu16 val)
Packit Service 706eca
{
Packit Service 706eca
  unsigned char *c = ptr;
Packit Service 706eca
  c[1] = val >> 8;
Packit Service 706eca
  dv_store_1 (ptr, val);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static inline bu32 dv_load_4 (const void *ptr)
Packit Service 706eca
{
Packit Service 706eca
  const unsigned char *c = ptr;
Packit Service 706eca
  return (c[3] << 24) | (c[2] << 16) | dv_load_2 (ptr);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static inline void dv_store_4 (void *ptr, bu32 val)
Packit Service 706eca
{
Packit Service 706eca
  unsigned char *c = ptr;
Packit Service 706eca
  c[3] = val >> 24;
Packit Service 706eca
  c[2] = val >> 16;
Packit Service 706eca
  dv_store_2 (ptr, val);
Packit Service 706eca
}
Packit Service 706eca

Packit Service 706eca
/* Helpers for MMRs where only the specified bits are W1C.  The
Packit Service 706eca
   rest are left unmodified.  */
Packit Service 706eca
#define dv_w1c(ptr, val, bits) (*(ptr) &= ~((val) & (bits)))
Packit Service 706eca
static inline void dv_w1c_2 (bu16 *ptr, bu16 val, bu16 bits)
Packit Service 706eca
{
Packit Service 706eca
  dv_w1c (ptr, val, bits);
Packit Service 706eca
}
Packit Service 706eca
static inline void dv_w1c_4 (bu32 *ptr, bu32 val, bu32 bits)
Packit Service 706eca
{
Packit Service 706eca
  dv_w1c (ptr, val, bits);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
/* Helpers for MMRs where all bits are RW except for the specified
Packit Service 706eca
   bits -- those ones are W1C.  */
Packit Service 706eca
#define dv_w1c_partial(ptr, val, bits) \
Packit Service 706eca
  (*(ptr) = ((val) | (*(ptr) & (bits))) & ~((val) & (bits)))
Packit Service 706eca
static inline void dv_w1c_2_partial (bu16 *ptr, bu16 val, bu16 bits)
Packit Service 706eca
{
Packit Service 706eca
  dv_w1c_partial (ptr, val, bits);
Packit Service 706eca
}
Packit Service 706eca
static inline void dv_w1c_4_partial (bu32 *ptr, bu32 val, bu32 bits)
Packit Service 706eca
{
Packit Service 706eca
  dv_w1c_partial (ptr, val, bits);
Packit Service 706eca
}
Packit Service 706eca

Packit Service 706eca
/* XXX: Grubbing around in device internals is probably wrong, but
Packit Service 706eca
        until someone shows me what's right ...  */
Packit Service 706eca
static inline struct hw *
Packit Service 706eca
dv_get_device (SIM_CPU *cpu, const char *device_name)
Packit Service 706eca
{
Packit Service 706eca
  SIM_DESC sd = CPU_STATE (cpu);
Packit Service 706eca
  void *root = STATE_HW (sd);
Packit Service 706eca
  return hw_tree_find_device (root, device_name);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
static inline void *
Packit Service 706eca
dv_get_state (SIM_CPU *cpu, const char *device_name)
Packit Service 706eca
{
Packit Service 706eca
  return hw_data (dv_get_device (cpu, device_name));
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
#define DV_STATE(cpu, dv) dv_get_state (cpu, "/core/bfin_"#dv)
Packit Service 706eca
Packit Service 706eca
#define DV_STATE_CACHED(cpu, dv) \
Packit Service 706eca
  ({ \
Packit Service 706eca
    struct bfin_##dv *__##dv = BFIN_CPU_STATE.dv##_cache; \
Packit Service 706eca
    if (!__##dv) \
Packit Service 706eca
      BFIN_CPU_STATE.dv##_cache = __##dv = dv_get_state (cpu, "/core/bfin_"#dv); \
Packit Service 706eca
    __##dv; \
Packit Service 706eca
  })
Packit Service 706eca

Packit Service 706eca
void dv_bfin_mmr_invalid (struct hw *, address_word, unsigned nr_bytes, bool write);
Packit Service 706eca
bool dv_bfin_mmr_require (struct hw *, address_word, unsigned nr_bytes, unsigned size, bool write);
Packit Service 706eca
/* For 32-bit memory mapped registers that allow 16-bit or 32-bit access.  */
Packit Service 706eca
bool dv_bfin_mmr_require_16_32 (struct hw *, address_word, unsigned nr_bytes, bool write);
Packit Service 706eca
/* For 32-bit memory mapped registers that only allow 16-bit access.  */
Packit Service 706eca
#define dv_bfin_mmr_require_16(hw, addr, nr_bytes, write) dv_bfin_mmr_require (hw, addr, nr_bytes, 2, write)
Packit Service 706eca
/* For 32-bit memory mapped registers that only allow 32-bit access.  */
Packit Service 706eca
#define dv_bfin_mmr_require_32(hw, addr, nr_bytes, write) dv_bfin_mmr_require (hw, addr, nr_bytes, 4, write)
Packit Service 706eca

Packit Service 706eca
#define HW_TRACE_WRITE() \
Packit Service 706eca
  HW_TRACE ((me, "write 0x%08lx (%s) length %u with 0x%x", \
Packit Service 706eca
	     (unsigned long) addr, mmr_name (mmr_off), nr_bytes, value))
Packit Service 706eca
#define HW_TRACE_READ() \
Packit Service 706eca
  HW_TRACE ((me, "read 0x%08lx (%s) length %u", \
Packit Service 706eca
	     (unsigned long) addr, mmr_name (mmr_off), nr_bytes))
Packit Service 706eca
Packit Service 706eca
#define HW_TRACE_DMA_WRITE() \
Packit Service 706eca
  HW_TRACE ((me, "dma write 0x%08lx length %u", \
Packit Service 706eca
	     (unsigned long) addr, nr_bytes))
Packit Service 706eca
#define HW_TRACE_DMA_READ() \
Packit Service 706eca
  HW_TRACE ((me, "dma read 0x%08lx length %u", \
Packit Service 706eca
	     (unsigned long) addr, nr_bytes))
Packit Service 706eca
Packit Service 706eca
#endif