/* 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; } } } }
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"; }