/* 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;
}
Esempio n. 2
0
void amba_prinf_config(void) {
  char devbuf[128];
  char vendorbuf[128];
  unsigned int conf;
  int i = 0;
  int j = 0;
  unsigned int addr;
  unsigned int m;
  printf("             Vendors         Slaves\n");
  printf("Ahb masters:\n");
  i = 0;
  while (i < amba_conf.ahbmst.devnr) {
    conf = amba_get_confword(amba_conf.ahbmst, i, 0);
    vendor_dev_string(conf, vendorbuf, devbuf);
    printf("%2i(%2x:%3x|%2i): %16s %16s \n", i, amba_vendor(conf),
           amba_device(conf), amba_irq(conf), vendorbuf, devbuf);
    for (j = 0; j < 4; j++) {
      m = amba_ahb_get_membar(amba_conf.ahbmst, i, j);
      if (m) {
        addr = amba_membar_start(m);
        printf(" +%i: 0x%x \n", j, addr);
      }
    }
    i++;
  }
  printf("Ahb slaves:\n");
  i = 0;
  while (i < amba_conf.ahbslv.devnr) {
    conf = amba_get_confword(amba_conf.ahbslv, i, 0);
    vendor_dev_string(conf, vendorbuf, devbuf);
    printf("%2i(%2x:%3x|%2i): %16s %16s \n", i, amba_vendor(conf),
           amba_device(conf), amba_irq(conf), vendorbuf, devbuf);
    for (j = 0; j < 4; j++) {
      m = amba_ahb_get_membar(amba_conf.ahbslv, i, j);
      if (m) {
        addr = amba_membar_start(m);
        if (amba_membar_type(m) == AMBA_TYPE_AHBIO) {
          addr = AMBA_TYPE_AHBIO_ADDR(addr);
        } else if (amba_membar_type(m) ==
             AMBA_TYPE_APBIO) {
          printf("Warning: apbio membar\n");
        }
        printf(" +%i: 0x%x (raw:0x%x)\n", j, addr, m);
      }
    }
    i++;
  }
  printf("Apb slaves:\n");
  i = 0;
  while (i < amba_conf.apbslv.devnr) {

    conf = amba_get_confword(amba_conf.apbslv, i, 0);
    vendor_dev_string(conf, vendorbuf, devbuf);
    printf("%2i(%2x:%3x|%2i): %16s %16s \n", i, amba_vendor(conf),
           amba_device(conf), amba_irq(conf), vendorbuf, devbuf);

    m = amba_apb_get_membar(amba_conf.apbslv, i);
    addr = amba_iobar_start(amba_conf.apbslv.apbmst[i], m);
    printf(" +%2i: 0x%x (raw:0x%x) \n", 0, addr, m);

    i++;
  }
}