/* * Attach an SMC91111 driver to the system */ int rtems_smc91111_driver_attach_leon3 (struct rtems_bsdnet_ifconfig *config, int attach) { unsigned long addr_mctrl = 0; struct grgpio_regs *io; struct ambapp_apb_info apbpio; struct ambapp_apb_info apbmctrl; if (ambapp_find_apbslv(&ambapp_plb, VENDOR_GAISLER, GAISLER_GPIO, &apbpio) != 1) { printk("SMC9111_leon3: didn't find PIO\n"); return 0; } /* In order to access the SMC controller the memory controller must have * I/O bus enabled. Find first memory controller. */ if (ambapp_find_apbslv(&ambapp_plb, VENDOR_ESA, ESA_MCTRL, &apbmctrl) != 1) { if (ambapp_find_apbslv(&ambapp_plb, VENDOR_GAISLER, GAISLER_FTMCTRL, &apbmctrl) != 1) { if (ambapp_find_apbslv(&ambapp_plb, VENDOR_GAISLER, GAISLER_FTSRCTRL, &apbmctrl) != 1) { if (ambapp_find_apbslv(&ambapp_plb, VENDOR_GAISLER, GAISLER_FTSRCTRL8, &apbmctrl) != 1) { printk("SMC9111_leon3: didn't find any memory controller\n"); return 0; } } } } /* Get controller address */ addr_mctrl = (unsigned long) apbmctrl.start; io = (struct grgpio_regs *) apbpio.start; printk( "Activating Leon3 io port for smsc_lan91cxx (pio:%x mctrl:%x)\n", (unsigned int)io, (unsigned int)addr_mctrl); /* Setup PIO IRQ */ io->imask |= (1 << leon_scmv91111_configuration.pio); io->ipol |= (1 << leon_scmv91111_configuration.pio); io->iedge |= (1 << leon_scmv91111_configuration.pio); io->dir &= ~(1 << leon_scmv91111_configuration.pio); /* Setup memory controller I/O waitstates */ *((volatile unsigned int *) addr_mctrl) |= 0x10f80000; /* enable I/O area access */ return _rtems_smc91111_driver_attach(config, &leon_scmv91111_configuration); };
/* * Function: SLINK_getaddr * Arguments: amba_conf * base: assigned to base of core registers * irq: assigned to core irq lines * Returns: Base address and IRQ via arguments, 0 if core is found, else -1 * Description: See above. */ static int SLINK_getaddr(int *base, int *irq) { struct ambapp_apb_info c; if (ambapp_find_apbslv(&ambapp_plb,VENDOR_GAISLER,GAISLER_SLINK,&c) == 1) { *base = c.start; *irq = c.irq; return 0; } return -1; }
/* * Function: SLINK_getsysfreq * Arguments: None * Returns: System frequency in Hz, or 0 if system timer is not found. * Description: Looks at the timer to determine system frequency. Makes use * of AMBA Plug'n'Play. */ static int SLINK_getsysfreq(void) { struct ambapp_apb_info t; struct gptimer_regs *tregs; if (ambapp_find_apbslv(&ambapp_plb,VENDOR_GAISLER,GAISLER_GPTIMER,&t)==1) { tregs = (struct gptimer_regs *)t.start; DBG("SLINK_getsysfreq returning %d\n", (tregs->scaler_reload+1)*1000*1000); return (tregs->scaler_reload+1)*1000*1000; } return 0; }