if_nf10bmac_fdt.c revision 267920
1251875Speter/*-
2251875Speter * Copyright (c) 2013-2014 Bjoern A. Zeeb
3251875Speter * All rights reserved.
4251875Speter *
5251875Speter * This software was developed by SRI International and the University of
6251875Speter * Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249
7251875Speter * ("MRC2"), as part of the DARPA MRC research programme.
8251875Speter *
9251875Speter * Redistribution and use in source and binary forms, with or without
10251875Speter * modification, are permitted provided that the following conditions
11251875Speter * are met:
12251875Speter * 1. Redistributions of source code must retain the above copyright
13251875Speter *    notice, this list of conditions and the following disclaimer.
14251875Speter * 2. Redistributions in binary form must reproduce the above copyright
15251875Speter *    notice, this list of conditions and the following disclaimer in the
16251875Speter *    documentation and/or other materials provided with the distribution.
17251875Speter *
18251875Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19251875Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20251875Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21251875Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22251875Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23251875Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24251875Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25251875Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26251875Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27251875Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28251875Speter * SUCH DAMAGE.
29251875Speter *
30251875Speter * This driver is modelled after atse(4).  We need to seriously reduce the
31251875Speter * per-driver code we have to write^wcopy & paste.
32251875Speter */
33251875Speter
34251875Speter#include <sys/cdefs.h>
35251875Speter__FBSDID("$FreeBSD: head/sys/dev/netfpga10g/nf10bmac/if_nf10bmac_fdt.c 267920 2014-06-26 17:10:07Z bz $");
36251875Speter
37251875Speter#include <sys/param.h>
38251875Speter#include <sys/bus.h>
39251875Speter#include <sys/kernel.h>
40251875Speter#include <sys/module.h>
41251875Speter#include <sys/rman.h>
42251875Speter#include <sys/socket.h>
43251875Speter#include <sys/systm.h>
44251875Speter
45251875Speter#include <machine/bus.h>
46251875Speter#include <machine/resource.h>
47251875Speter
48251875Speter#include <net/ethernet.h>
49251875Speter#include <net/if.h>
50251875Speter#include <net/if_media.h>
51251875Speter#include <net/if_var.h>
52251875Speter
53251875Speter#include <dev/fdt/fdt_common.h>
54251875Speter#include <dev/ofw/openfirm.h>
55251875Speter#include <dev/ofw/ofw_bus.h>
56251875Speter#include <dev/ofw/ofw_bus_subr.h>
57251875Speter
58251875Speter#include "if_nf10bmacreg.h"
59251875Speter
60251875Speterstatic int
61251875Speternf10bmac_probe_fdt(device_t dev)
62251875Speter{
63251875Speter
64251875Speter	if (!ofw_bus_status_okay(dev))
65251875Speter		return (ENXIO);
66251875Speter
67251875Speter	if (ofw_bus_is_compatible(dev, "netfpag10g,nf10bmac")) {
68251875Speter		device_set_desc(dev, "NetFPGA-10G Embedded CPU Ethernet Core");
69251875Speter		return (BUS_PROBE_DEFAULT);
70251875Speter	}
71251875Speter
72251875Speter	return (ENXIO);
73251875Speter}
74251875Speter
75251875Speterstatic int
76251875Speternf10bmac_attach_fdt(device_t dev)
77251875Speter{
78251875Speter	struct nf10bmac_softc *sc;
79251875Speter	int error;
80251875Speter
81251875Speter	sc = device_get_softc(dev);
82251875Speter	sc->nf10bmac_dev = dev;
83251875Speter	sc->nf10bmac_unit = device_get_unit(dev);
84251875Speter
85251875Speter	/*
86251875Speter	 * FDT lists our resources.  For convenience we use three different
87251875Speter	 * mappings.  We need to attach them in the oder specified in .dts:
88251875Speter	 * LOOP (size 0x1f), TX (0x2f), RX (0x2f), INTR (0xf).
89251875Speter	 */
90251875Speter
91251875Speter	/*
92251875Speter	 * LOOP memory region (this could be a general control region).
93251875Speter	 * 0x00: 32/64bit register to enable a Y-"lopback".
94251875Speter	 */
95251875Speter        sc->nf10bmac_ctrl_rid = 0;
96251875Speter        sc->nf10bmac_ctrl_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
97251875Speter            &sc->nf10bmac_ctrl_rid, RF_ACTIVE);
98251875Speter        if (sc->nf10bmac_ctrl_res == NULL) {
99251875Speter                device_printf(dev, "failed to map memory for CTRL region\n");
100251875Speter                error = ENXIO;
101251875Speter                goto err;
102251875Speter        }
103251875Speter        if (bootverbose)
104251875Speter                device_printf(sc->nf10bmac_dev, "CTRL region at mem %p-%p\n",
105251875Speter                    (void *)rman_get_start(sc->nf10bmac_ctrl_res),
106251875Speter                    (void *)(rman_get_start(sc->nf10bmac_ctrl_res) +
107251875Speter                    rman_get_size(sc->nf10bmac_ctrl_res)));
108251875Speter
109251875Speter        /*
110251875Speter         * TX and TX metadata FIFO memory region.
111251875Speter         * 0x00: 32/64bit FIFO data,
112251875Speter	 * 0x08: 32/64bit FIFO metadata,
113251875Speter         * 0x10: 32/64bit packet length.
114251875Speter         */
115251875Speter        sc->nf10bmac_tx_mem_rid = 1;
116251875Speter        sc->nf10bmac_tx_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
117251875Speter            &sc->nf10bmac_tx_mem_rid, RF_ACTIVE);
118251875Speter        if (sc->nf10bmac_tx_mem_res == NULL) {
119251875Speter                device_printf(dev, "failed to map memory for TX FIFO\n");
120251875Speter                error = ENXIO;
121251875Speter                goto err;
122251875Speter        }
123251875Speter        if (bootverbose)
124251875Speter                device_printf(sc->nf10bmac_dev, "TX FIFO at mem %p-%p\n",
125251875Speter                    (void *)rman_get_start(sc->nf10bmac_tx_mem_res),
126251875Speter                    (void *)(rman_get_start(sc->nf10bmac_tx_mem_res) +
127251875Speter                    rman_get_size(sc->nf10bmac_tx_mem_res)));
128251875Speter
129251875Speter        /*
130251875Speter         * RX and RXC metadata FIFO memory region.
131251875Speter         * 0x00: 32/64bit FIFO data,
132251875Speter	 * 0x08: 32/64bit FIFO metadata,
133251875Speter         * 0x10: 32/64bit packet length.
134251875Speter         */
135251875Speter        sc->nf10bmac_rx_mem_rid = 2;
136251875Speter        sc->nf10bmac_rx_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
137251875Speter            &sc->nf10bmac_rx_mem_rid, RF_ACTIVE);
138251875Speter        if (sc->nf10bmac_rx_mem_res == NULL) {
139251875Speter                device_printf(dev, "failed to map memory for RX FIFO\n");
140251875Speter                error = ENXIO;
141251875Speter                goto err;
142251875Speter        }
143251875Speter        if (bootverbose)
144251875Speter                device_printf(sc->nf10bmac_dev, "RX FIFO at mem %p-%p\n",
145251875Speter                    (void *)rman_get_start(sc->nf10bmac_rx_mem_res),
146251875Speter                    (void *)(rman_get_start(sc->nf10bmac_rx_mem_res) +
147251875Speter                    rman_get_size(sc->nf10bmac_rx_mem_res)));
148251875Speter
149251875Speter	/*
150251875Speter	 * Interrupt handling registers.
151251875Speter	 * 0x00: 32/64bit register to clear (and disable) the RX interrupt.
152251875Speter	 * 0x08: 32/64bit register to enable or disable the RX interrupt.
153251875Speter	 */
154251875Speter        sc->nf10bmac_intr_rid = 3;
155251875Speter        sc->nf10bmac_intr_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
156251875Speter            &sc->nf10bmac_intr_rid, RF_ACTIVE);
157251875Speter        if (sc->nf10bmac_intr_res == NULL) {
158251875Speter                device_printf(dev, "failed to map memory for INTR region\n");
159251875Speter                error = ENXIO;
160251875Speter                goto err;
161251875Speter        }
162251875Speter        if (bootverbose)
163251875Speter                device_printf(sc->nf10bmac_dev, "INTR region at mem %p-%p\n",
164251875Speter                    (void *)rman_get_start(sc->nf10bmac_intr_res),
165251875Speter                    (void *)(rman_get_start(sc->nf10bmac_intr_res) +
166251875Speter                    rman_get_size(sc->nf10bmac_intr_res)));
167251875Speter
168251875Speter	/* (Optional) RX and TX IRQ. */
169251875Speter	sc->nf10bmac_rx_irq_rid = 0;
170251875Speter	sc->nf10bmac_rx_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
171251875Speter	    &sc->nf10bmac_rx_irq_rid, RF_ACTIVE | RF_SHAREABLE);
172251875Speter
173251875Speter	error = nf10bmac_attach(dev);
174251875Speter	if (error)
175251875Speter		goto err;
176251875Speter
177251875Speter	return (0);
178251875Speter
179251875Spetererr:
180251875Speter	/* Cleanup. */
181251875Speter	nf10bmac_detach_resources(dev);
182251875Speter
183251875Speter	return (error);
184251875Speter}
185251875Speter
186251875Speterstatic device_method_t nf10bmac_methods_fdt[] = {
187251875Speter	/* Device interface */
188251875Speter	DEVMETHOD(device_probe,		nf10bmac_probe_fdt),
189251875Speter	DEVMETHOD(device_attach,	nf10bmac_attach_fdt),
190251875Speter	DEVMETHOD(device_detach,	nf10bmac_detach_dev),
191251875Speter
192251875Speter	DEVMETHOD_END
193251875Speter};
194251875Speter
195251875Speterstatic driver_t nf10bmac_driver_fdt = {
196251875Speter	"nf10bmac",
197251875Speter	nf10bmac_methods_fdt,
198251875Speter	sizeof(struct nf10bmac_softc)
199251875Speter};
200251875Speter
201251875SpeterDRIVER_MODULE(nf10bmac, simplebus, nf10bmac_driver_fdt, nf10bmac_devclass, 0,0);
202251875Speter
203251875Speter/* end */
204251875Speter