1264601Sbz/*- 2264601Sbz * Copyright (c) 2013-2014 Bjoern A. Zeeb 3264601Sbz * All rights reserved. 4264601Sbz * 5264601Sbz * This software was developed by SRI International and the University of 6264601Sbz * Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249 7264601Sbz * ("MRC2"), as part of the DARPA MRC research programme. 8264601Sbz * 9264601Sbz * Redistribution and use in source and binary forms, with or without 10264601Sbz * modification, are permitted provided that the following conditions 11264601Sbz * are met: 12264601Sbz * 1. Redistributions of source code must retain the above copyright 13264601Sbz * notice, this list of conditions and the following disclaimer. 14264601Sbz * 2. Redistributions in binary form must reproduce the above copyright 15264601Sbz * notice, this list of conditions and the following disclaimer in the 16264601Sbz * documentation and/or other materials provided with the distribution. 17264601Sbz * 18264601Sbz * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19264601Sbz * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20264601Sbz * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21264601Sbz * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22264601Sbz * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23264601Sbz * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24264601Sbz * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25264601Sbz * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26264601Sbz * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27264601Sbz * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28264601Sbz * SUCH DAMAGE. 29264601Sbz * 30264601Sbz * This driver is modelled after atse(4). We need to seriously reduce the 31264601Sbz * per-driver code we have to write^wcopy & paste. 32264601Sbz */ 33264601Sbz 34264601Sbz#include <sys/cdefs.h> 35264601Sbz__FBSDID("$FreeBSD: releng/11.0/sys/dev/netfpga10g/nf10bmac/if_nf10bmac_fdt.c 267923 2014-06-26 17:26:33Z bz $"); 36264601Sbz 37264601Sbz#include <sys/param.h> 38264601Sbz#include <sys/bus.h> 39264601Sbz#include <sys/kernel.h> 40264601Sbz#include <sys/module.h> 41264601Sbz#include <sys/rman.h> 42264601Sbz#include <sys/socket.h> 43264601Sbz#include <sys/systm.h> 44264601Sbz 45264601Sbz#include <machine/bus.h> 46264601Sbz#include <machine/resource.h> 47264601Sbz 48264601Sbz#include <net/ethernet.h> 49264601Sbz#include <net/if.h> 50264601Sbz#include <net/if_media.h> 51264601Sbz#include <net/if_var.h> 52264601Sbz 53264601Sbz#include <dev/fdt/fdt_common.h> 54264601Sbz#include <dev/ofw/openfirm.h> 55264601Sbz#include <dev/ofw/ofw_bus.h> 56264601Sbz#include <dev/ofw/ofw_bus_subr.h> 57264601Sbz 58264601Sbz#include "if_nf10bmacreg.h" 59264601Sbz 60264601Sbzstatic int 61264601Sbznf10bmac_probe_fdt(device_t dev) 62264601Sbz{ 63264601Sbz 64264601Sbz if (!ofw_bus_status_okay(dev)) 65264601Sbz return (ENXIO); 66264601Sbz 67264601Sbz if (ofw_bus_is_compatible(dev, "netfpag10g,nf10bmac")) { 68264601Sbz device_set_desc(dev, "NetFPGA-10G Embedded CPU Ethernet Core"); 69264601Sbz return (BUS_PROBE_DEFAULT); 70264601Sbz } 71264601Sbz 72264601Sbz return (ENXIO); 73264601Sbz} 74264601Sbz 75264601Sbzstatic int 76264601Sbznf10bmac_attach_fdt(device_t dev) 77264601Sbz{ 78264601Sbz struct nf10bmac_softc *sc; 79264601Sbz int error; 80264601Sbz 81264601Sbz sc = device_get_softc(dev); 82264601Sbz sc->nf10bmac_dev = dev; 83264601Sbz sc->nf10bmac_unit = device_get_unit(dev); 84264601Sbz 85264601Sbz /* 86264601Sbz * FDT lists our resources. For convenience we use three different 87264601Sbz * mappings. We need to attach them in the oder specified in .dts: 88265766Sbz * LOOP (size 0x1f), TX (0x2f), RX (0x2f), INTR (0xf). 89264601Sbz */ 90264601Sbz 91265766Sbz /* 92265766Sbz * LOOP memory region (this could be a general control region). 93267920Sbz * 0x00: 32/64bit register to enable a Y-"lopback". 94265766Sbz */ 95267923Sbz sc->nf10bmac_ctrl_rid = 0; 96267923Sbz sc->nf10bmac_ctrl_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, 97267923Sbz &sc->nf10bmac_ctrl_rid, RF_ACTIVE); 98267923Sbz if (sc->nf10bmac_ctrl_res == NULL) { 99267923Sbz device_printf(dev, "failed to map memory for CTRL region\n"); 100267923Sbz error = ENXIO; 101267923Sbz goto err; 102267923Sbz } 103267923Sbz if (bootverbose) 104267923Sbz device_printf(sc->nf10bmac_dev, "CTRL region at mem %p-%p\n", 105267923Sbz (void *)rman_get_start(sc->nf10bmac_ctrl_res), 106267923Sbz (void *)(rman_get_start(sc->nf10bmac_ctrl_res) + 107267923Sbz rman_get_size(sc->nf10bmac_ctrl_res))); 108265766Sbz 109267923Sbz /* 110267923Sbz * TX and TX metadata FIFO memory region. 111267923Sbz * 0x00: 32/64bit FIFO data, 112267920Sbz * 0x08: 32/64bit FIFO metadata, 113267923Sbz * 0x10: 32/64bit packet length. 114267923Sbz */ 115267923Sbz sc->nf10bmac_tx_mem_rid = 1; 116267923Sbz sc->nf10bmac_tx_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, 117267923Sbz &sc->nf10bmac_tx_mem_rid, RF_ACTIVE); 118267923Sbz if (sc->nf10bmac_tx_mem_res == NULL) { 119267923Sbz device_printf(dev, "failed to map memory for TX FIFO\n"); 120267923Sbz error = ENXIO; 121267923Sbz goto err; 122267923Sbz } 123267923Sbz if (bootverbose) 124267923Sbz device_printf(sc->nf10bmac_dev, "TX FIFO at mem %p-%p\n", 125267923Sbz (void *)rman_get_start(sc->nf10bmac_tx_mem_res), 126267923Sbz (void *)(rman_get_start(sc->nf10bmac_tx_mem_res) + 127267923Sbz rman_get_size(sc->nf10bmac_tx_mem_res))); 128264601Sbz 129267923Sbz /* 130267923Sbz * RX and RXC metadata FIFO memory region. 131267923Sbz * 0x00: 32/64bit FIFO data, 132267920Sbz * 0x08: 32/64bit FIFO metadata, 133267923Sbz * 0x10: 32/64bit packet length. 134267923Sbz */ 135267923Sbz sc->nf10bmac_rx_mem_rid = 2; 136267923Sbz sc->nf10bmac_rx_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, 137267923Sbz &sc->nf10bmac_rx_mem_rid, RF_ACTIVE); 138267923Sbz if (sc->nf10bmac_rx_mem_res == NULL) { 139267923Sbz device_printf(dev, "failed to map memory for RX FIFO\n"); 140267923Sbz error = ENXIO; 141267923Sbz goto err; 142267923Sbz } 143267923Sbz if (bootverbose) 144267923Sbz device_printf(sc->nf10bmac_dev, "RX FIFO at mem %p-%p\n", 145267923Sbz (void *)rman_get_start(sc->nf10bmac_rx_mem_res), 146267923Sbz (void *)(rman_get_start(sc->nf10bmac_rx_mem_res) + 147267923Sbz rman_get_size(sc->nf10bmac_rx_mem_res))); 148264601Sbz 149264601Sbz /* 150265766Sbz * Interrupt handling registers. 151267920Sbz * 0x00: 32/64bit register to clear (and disable) the RX interrupt. 152267920Sbz * 0x08: 32/64bit register to enable or disable the RX interrupt. 153264601Sbz */ 154267923Sbz sc->nf10bmac_intr_rid = 3; 155267923Sbz sc->nf10bmac_intr_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, 156267923Sbz &sc->nf10bmac_intr_rid, RF_ACTIVE); 157267923Sbz if (sc->nf10bmac_intr_res == NULL) { 158267923Sbz device_printf(dev, "failed to map memory for INTR region\n"); 159267923Sbz error = ENXIO; 160267923Sbz goto err; 161267923Sbz } 162267923Sbz if (bootverbose) 163267923Sbz device_printf(sc->nf10bmac_dev, "INTR region at mem %p-%p\n", 164267923Sbz (void *)rman_get_start(sc->nf10bmac_intr_res), 165267923Sbz (void *)(rman_get_start(sc->nf10bmac_intr_res) + 166267923Sbz rman_get_size(sc->nf10bmac_intr_res))); 167264601Sbz 168265766Sbz /* (Optional) RX and TX IRQ. */ 169265766Sbz sc->nf10bmac_rx_irq_rid = 0; 170265766Sbz sc->nf10bmac_rx_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, 171265766Sbz &sc->nf10bmac_rx_irq_rid, RF_ACTIVE | RF_SHAREABLE); 172265766Sbz 173264601Sbz error = nf10bmac_attach(dev); 174264601Sbz if (error) 175264601Sbz goto err; 176264601Sbz 177264601Sbz return (0); 178264601Sbz 179264601Sbzerr: 180264601Sbz /* Cleanup. */ 181264601Sbz nf10bmac_detach_resources(dev); 182264601Sbz 183264601Sbz return (error); 184264601Sbz} 185264601Sbz 186264601Sbzstatic device_method_t nf10bmac_methods_fdt[] = { 187264601Sbz /* Device interface */ 188264601Sbz DEVMETHOD(device_probe, nf10bmac_probe_fdt), 189264601Sbz DEVMETHOD(device_attach, nf10bmac_attach_fdt), 190264601Sbz DEVMETHOD(device_detach, nf10bmac_detach_dev), 191264601Sbz 192264601Sbz DEVMETHOD_END 193264601Sbz}; 194264601Sbz 195264601Sbzstatic driver_t nf10bmac_driver_fdt = { 196264601Sbz "nf10bmac", 197264601Sbz nf10bmac_methods_fdt, 198264601Sbz sizeof(struct nf10bmac_softc) 199264601Sbz}; 200264601Sbz 201264601SbzDRIVER_MODULE(nf10bmac, simplebus, nf10bmac_driver_fdt, nf10bmac_devclass, 0,0); 202264601Sbz 203264601Sbz/* end */ 204