/* Get first nr AHB Slave devices, put them into dev (which is an array of nr length) */
int
amba_find_ahbmsts (amba_confarea_type * amba_conf, int vendor, int device,
                   amba_ahb_device * devs, int maxno)
{
  unsigned int conf, mbar, addr;
  int i, j, cnt;

  for (cnt = i = 0; (i < amba_conf->ahbmst.devnr) && (maxno < cnt); i++) {
    conf = amba_get_confword (amba_conf->ahbslv, i, 0);
    if ((amba_vendor (conf) == vendor) && (amba_device (conf) == device)) {
      for (j = 0; j < 4; j++) {
        mbar = amba_ahb_get_membar (amba_conf->ahbmst, i, j);
        addr = amba_membar_start (mbar);
        if (amba_membar_type (mbar) == AMBA_TYPE_AHBIO) {
          addr = AMBA_TYPE_AHBIO_ADDR (addr, amba_conf->ioarea);
        } else {
          /* convert address if needed */
          if ((addr = addr_from (amba_conf->mmaps, addr)) == 1) {
            addr = 0;           /* no available memory translation available, will not be able to access
                                 * Plug&Play information for this AHB address. Skip it.
                                 */
          }
        }
        devs[cnt].start[j] = addr;
      }
      devs[cnt].irq = amba_irq (conf);
      devs[cnt].ver = amba_ver (conf);
      cnt++;
    }
  }
  return cnt;
}
void
amba_scan (amba_confarea_type * amba_conf, unsigned int ioarea,
           struct amba_mmap *mmaps)
{
  unsigned int *cfg_area;       /* address to configuration area */
  unsigned int mbar, conf, custom;
  int i, j;
  unsigned int apbmst;
  int maxloops = amba_conf->notroot ? 16 : 64; /* scan first bus for 64 devices, rest for 16 devices */

  amba_conf->ahbmst.devnr = 0;
  amba_conf->ahbslv.devnr = 0;
  amba_conf->apbslv.devnr = 0;
  cfg_area = (unsigned int *) (ioarea | AMBA_CONF_AREA);
  amba_conf->ioarea = ioarea;
  amba_conf->mmaps = mmaps;

  for (i = 0; i < maxloops; i++) {
    amba_insert_device (&amba_conf->ahbmst, cfg_area);
    cfg_area += AMBA_AHB_CONF_WORDS;
  }

  cfg_area =
    (unsigned int *) (ioarea | AMBA_CONF_AREA | AMBA_AHB_SLAVE_CONF_AREA);
  for (i = 0; i < maxloops; i++) {
    amba_insert_device (&amba_conf->ahbslv, cfg_area);
    cfg_area += AMBA_AHB_CONF_WORDS;
  }

  for (i = 0; i < amba_conf->ahbslv.devnr; i++){
    conf = amba_get_confword(amba_conf->ahbslv, i, 0);
    mbar = amba_ahb_get_membar(amba_conf->ahbslv, i, 0);
    if ( (amba_vendor(conf) == VENDOR_GAISLER) && (amba_device(conf) == GAISLER_AHB2AHB) ){
      /* Found AHB->AHB bus bridge, scan it if more free amba_confarea_type:s available
       * Custom config 1 contain ioarea.
       */
      custom = amba_ahb_get_custom(amba_conf->ahbslv,i,1);

      if ( amba_ver(conf) && amba_conf->next ){
        amba_conf->next->notroot = 1;
        amba_scan(amba_conf->next,custom,mmaps);
      }
    }else if ((amba_vendor(conf) == VENDOR_GAISLER) && (amba_device(conf) == GAISLER_APBMST))
    {
      apbmst = amba_membar_start(mbar);
			if ( (apbmst=addr_from(mmaps,apbmst)) == 1 )
				continue; /* no available memory translation available, will not be able to access
				           * Plug&Play information for this AHB/APB bridge. Skip it.
				           */
			cfg_area = (unsigned int *)( apbmst | AMBA_CONF_AREA);
      for (j=0; (amba_conf->apbslv.devnr<AMBA_APB_SLAVES) && (j<AMBA_APB_SLAVES); j++){
        amba_insert_apb_device(&amba_conf->apbslv, cfg_area, apbmst);
        cfg_area += AMBA_APB_CONF_WORDS;
      }
    }
  }
}
Example #3
0
std::unique_ptr<addr_match> parser::parse_rule_part(group_mem_protocol gmp)
{
    HC_LOG_TRACE("");
    //TT_STAR
    //TT_STRING
    //single_addr
    //addr_range

    addr_storage addr_from(get_addr_family(gmp));
    addr_storage addr_to(get_addr_family(gmp));
    if (m_current_token.get_type() == TT_STRING || m_current_token.get_type() == TT_STAR) {
        if (m_current_token.get_type() == TT_STRING) {
            addr_from = get_addr(gmp);
        } else { //TT_STAR
            get_next_token();
        }

        if (m_current_token.get_type() == TT_SLASH) {
            get_next_token();
            if (m_current_token.get_type() == TT_STRING) {
                try {
                    unsigned int prefix = std::stoi(m_current_token.get_string());
                    if (prefix > 128) {
                        throw;
                    }

                    addr_to = addr_from;
                    addr_from.mask(prefix);
                    addr_to.broadcast_addr(prefix);

                    get_next_token();
                    if (m_current_token.get_type() == TT_RIGHT_BRACKET || m_current_token.get_type() == TT_PIPE) {
                        std::unique_ptr<addr_match> result(new addr_range(addr_from, addr_to));
                        return result;
                    }
                } catch (...) {
                    HC_LOG_ERROR("failed to parse line " << m_current_line << " token " << get_token_type_name(m_current_token.get_type()) << " with value " << m_current_token.get_string() << " cant be converted to a prefix or subnet mask");
                    throw "failed to parse config file";
                }
            }
        } else if (m_current_token.get_type() == TT_RIGHT_BRACKET || m_current_token.get_type() == TT_PIPE) {
            std::unique_ptr<addr_match> result(new single_addr(addr_from));
            return result;
        } else if (m_current_token.get_type() == TT_RANGE) {
            get_next_token();
            if (m_current_token.get_type() == TT_STRING || m_current_token.get_type() == TT_STAR) {
                if (m_current_token.get_type() == TT_STRING) {
                    addr_to = get_addr(gmp);
                } else {
                    get_next_token();
                }

                if (m_current_token.get_type() == TT_RIGHT_BRACKET || m_current_token.get_type() == TT_PIPE) {
                    std::unique_ptr<addr_match> result(new addr_range(addr_from, addr_to));
                    return result;
                }
            }
        }
    }

    HC_LOG_ERROR("failed to parse line " << m_current_line << " unknown token " << get_token_type_name(m_current_token.get_type()) << " with value " << m_current_token.get_string() << " in this context");
    throw "failed to parse config file";
}