Changeset d62a3df in rtems-libbsd for linux


Ignore:
Timestamp:
Jan 17, 2018, 12:28:45 PM (21 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
c1e05b9ea378b2971e3d7704779112b4bc4296da, 4a77611a223ea883fb548679b516d326a020d447
Children:
327f4e1
Parents:
f5ed3aa
git-author:
Sebastian Huber <sebastian.huber@…> (01/17/18 12:28:45)
git-committer:
Sebastian Huber <sebastian.huber@…> (01/23/18 13:55:31)
Message:

sdk_dpaa: Port to RTEMS

Update #3277.

Location:
linux/drivers/net/ethernet/freescale
Files:
4 added
6 edited

Legend:

Unmodified
Added
Removed
  • linux/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c

    rf5ed3aa rd62a3df  
    33743374MODULE_DESCRIPTION("FSL DPAA Ethernet driver");
    33753375#endif /* __rtems__ */
     3376#ifdef __rtems__
     3377static enum qman_cb_dqrr_result
     3378shared_rx_dqrr(struct qman_portal *portal, struct qman_fq *fq,
     3379    const struct qm_dqrr_entry *dq)
     3380{
     3381        const struct qm_fd *fd;
     3382        struct net_device *net_dev;
     3383        struct ifnet *ifp;
     3384        u32 fd_status;
     3385        enum qm_fd_format fd_format;
     3386        struct mbuf *m;
     3387        int len;
     3388        void *dst;
     3389
     3390        fd = &dq->fd;
     3391        fd_status = be32_to_cpu(fd->status);
     3392        fd_format = qm_fd_get_format(fd);
     3393        net_dev = ((struct dpaa_fq *)fq)->net_dev;
     3394        ifp = net_dev->ifp;
     3395
     3396        if (unlikely(fd_status & FM_FD_STAT_RX_ERRORS) != 0) {
     3397                if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
     3398                goto out;
     3399        }
     3400
     3401        BSD_ASSERT((be32_to_cpu(fd->status) & FM_FD_STAT_L4CV) == 0);
     3402        BSD_ASSERT(fd_format == qm_fd_contig);
     3403
     3404        m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
     3405        if (unlikely(m == NULL)) {
     3406                if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
     3407                goto out;
     3408        }
     3409
     3410        len = qm_fd_get_length(fd);
     3411        dst = mtod(m, char *) + ETHER_ALIGN;
     3412        m->m_pkthdr.rcvif = ifp;
     3413        m->m_pkthdr.len = len;
     3414        m->m_len = len;
     3415        m->m_data = dst;
     3416        memcpy(dst, (const void *)(qm_fd_addr(fd) +
     3417            qm_fd_get_offset(fd)), (size_t)len);
     3418
     3419        if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
     3420        (*ifp->if_input)(ifp, m);
     3421
     3422out:
     3423
     3424        dpaa_fd_release(net_dev, fd);
     3425        return (qman_cb_dqrr_consume);
     3426}
     3427
     3428static enum qman_cb_dqrr_result
     3429shared_tx_error_dqrr(struct qman_portal *portal, struct qman_fq *fq,
     3430    const struct qm_dqrr_entry *dq)
     3431{
     3432        BSD_ASSERT(0);
     3433        return (qman_cb_dqrr_consume);
     3434}
     3435
     3436static enum qman_cb_dqrr_result
     3437shared_tx_default_dqrr(struct qman_portal *portal, struct qman_fq *fq,
     3438    const struct qm_dqrr_entry *dq)
     3439{
     3440        BSD_ASSERT(0);
     3441        return (qman_cb_dqrr_consume);
     3442}
     3443
     3444static void shared_ern(struct qman_portal *portal, struct qman_fq *fq,
     3445    const union qm_mr_entry *msg)
     3446{
     3447        BSD_ASSERT(0);
     3448}
     3449
     3450const struct dpaa_fq_cbs shared_fq_cbs = {
     3451        .rx_defq = { .cb = { .dqrr = shared_rx_dqrr } },
     3452        .tx_defq = { .cb = { .dqrr = shared_tx_default_dqrr } },
     3453        .rx_errq = { .cb = { .dqrr = shared_rx_dqrr } },
     3454        .tx_errq = { .cb = { .dqrr = shared_tx_error_dqrr } },
     3455        .egress_ern = { .cb = { .ern = shared_ern } }
     3456};
     3457#endif /* __rtems__ */
  • linux/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h

    rf5ed3aa rd62a3df  
    216216void dpaa_cleanup_tx_fd(struct ifnet *ifp, const struct qm_fd *fd);
    217217
     218/* Compatibility for SDK DPAA */
     219
     220extern const struct dpaa_fq_cbs shared_fq_cbs;
     221
    218222#ifdef QORIQ_IS_HYPERVISOR_GUEST
    219223int dpaa_bp_alloc_pool(struct dpaa_bp *dpaa_bp);
  • linux/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_base.c

    rf5ed3aa rd62a3df  
    6060MODULE_LICENSE("Dual BSD/GPL");
    6161
     62#ifndef __rtems__
    6263uint8_t advanced_debug = -1;
    6364module_param(advanced_debug, byte, S_IRUGO);
    6465MODULE_PARM_DESC(advanced_debug, "Module/Driver verbosity level");
    6566EXPORT_SYMBOL(advanced_debug);
     67#endif /* __rtems__ */
    6668
    6769static int dpa_bp_cmp(const void *dpa_bp0, const void *dpa_bp1)
     
    7779        struct device           *dev;
    7880        struct device_node      *dev_node;
     81#ifdef __rtems__
     82        struct device_node      dns;
     83#endif /* __rtems__ */
    7984        const __be32            *bpool_cfg;
    8085        struct dpa_bp           *dpa_bp;
     
    96101        }
    97102
     103#ifndef __rtems__
    98104        dev_node = of_find_node_by_path("/");
     105#else /* __rtems__ */
     106        dev_node = of_find_node_by_path(&dns, "/");
     107#endif /* __rtems__ */
    99108        if (unlikely(dev_node == NULL)) {
    100109                dev_err(dev, "of_find_node_by_path(/) failed\n");
     
    108117                of_node_put(dev_node);
    109118
     119#ifndef __rtems__
    110120                dev_node = of_parse_phandle(dev->of_node,
    111121                                "fsl,bman-buffer-pools", i);
     122#else /* __rtems__ */
     123                dev_node = of_parse_phandle(&dns, dev->of_node,
     124                                "fsl,bman-buffer-pools", i);
     125#endif /* __rtems__ */
    112126                if (dev_node == NULL) {
    113127                        dev_err(dev, "of_find_node_by_phandle() failed\n");
     
    134148                                        &lenp);
    135149                if (bpool_cfg && (lenp == (2 * ns + na) * sizeof(*bpool_cfg))) {
     150#ifndef __rtems__
    136151                        const uint32_t *seed_pool;
     152#endif /* __rtems__ */
    137153
    138154                        dpa_bp[i].config_count =
     
    140156                        dpa_bp[i].size  =
    141157                                (size_t)of_read_number(bpool_cfg + ns, ns);
     158#ifndef __rtems__
    142159                        dpa_bp[i].paddr =
    143160                                of_read_number(bpool_cfg + 2 * ns, na);
     
    146163                                        "fsl,bpool-ethernet-seeds", &lenp);
    147164                        dpa_bp[i].seed_pool = !!seed_pool;
     165#endif /* __rtems__ */
    148166
    149167                } else {
     
    168186EXPORT_SYMBOL(dpa_bp_probe);
    169187
     188#ifndef __rtems__
    170189int dpa_bp_shared_port_seed(struct dpa_bp *bp)
    171190{
     
    264283}
    265284module_exit(dpa_advanced_unload);
     285#endif /* __rtems__ */
  • linux/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_base.h

    rf5ed3aa rd62a3df  
    4040extern uint8_t advanced_debug;
    4141extern const struct dpa_fq_cbs_t shared_fq_cbs;
     42#ifndef __rtems__
    4243extern int __hot dpa_shared_tx(struct sk_buff *skb, struct net_device *net_dev);
     44#endif /* __rtems__ */
    4345
    4446struct dpa_bp * __cold __must_check /* __attribute__((nonnull)) */
  • linux/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.h

    rf5ed3aa rd62a3df  
    4141#include "lnxwrp_fsl_fman.h"
    4242
     43#ifndef __rtems__
    4344#define dpaa_eth_init_port(type, port, param, errq_id, defq_id, buf_layout,\
    4445                           frag_enabled) \
     
    168169void dpa_set_buffers_layout(struct mac_device *mac_dev,
    169170                struct dpa_buffer_layout_s *layout);
     171#endif /* __rtems__ */
    170172int __attribute__((nonnull))
    171173dpa_bp_alloc(struct dpa_bp *dpa_bp);
    172174void __cold __attribute__((nonnull))
    173175dpa_bp_free(struct dpa_priv_s *priv);
     176#ifndef __rtems__
    174177struct dpa_bp *dpa_bpid2pool(int bpid);
    175178void dpa_bpid2pool_map(int bpid, struct dpa_bp *dpa_bp);
     
    226229int dpa_proxy_set_rx_mode(struct proxy_device *proxy_dev,
    227230                      struct net_device *net_dev);
     231#endif /* __rtems__ */
    228232
    229233#endif /* __DPAA_ETH_COMMON_H */
  • linux/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_macless.c

    rf5ed3aa rd62a3df  
    11#include <machine/rtems-bsd-kernel-space.h>
     2
     3#include <rtems/bsd/local/opt_dpaa.h>
    24
    35/* Copyright 2008-2013 Freescale Semiconductor Inc.
     
    6264#define DPA_DEFAULT_TX_HEADROOM 64
    6365
     66#ifndef __rtems__
    6467#define DPA_DESCRIPTION "FSL DPAA MACless Ethernet driver"
    6568
     
    7982                                          void *addr);
    8083static void __cold dpa_macless_set_rx_mode(struct net_device *net_dev);
     84#endif /* __rtems__ */
    8185
    8286static int dpaa_eth_macless_probe(struct platform_device *_of_dev);
     87#ifndef __rtems__
    8388static netdev_features_t
    8489dpa_macless_fix_features(struct net_device *dev, netdev_features_t features);
     
    119124        .remove         = dpa_remove
    120125};
     126#endif /* __rtems__ */
    121127
    122128static const char macless_frame_queues[][25] = {
     
    125131};
    126132
     133#ifndef __rtems__
    127134static int __cold dpa_macless_start(struct net_device *net_dev)
    128135{
     
    236243        }
    237244}
     245#endif /* __rtems__ */
    238246
    239247/* Probing of FQs for MACless ports */
     
    272280        struct device           *dev;
    273281        const phandle           *proxy_prop;
     282#ifndef __rtems__
    274283        struct proxy_device     *proxy_dev;
    275284        struct device_node      *proxy_node;
    276285        struct platform_device  *proxy_pdev;
     286#endif /* __rtems__ */
    277287        int lenp;
    278288
     
    283293                return NULL;
    284294
     295#ifndef __rtems__
    285296        proxy_node = of_find_node_by_phandle(*proxy_prop);
    286297        if (!proxy_node) {
     
    301312
    302313        return proxy_dev;
     314#else /* __rtems__ */
     315        BSD_ASSERT(0);
     316        return (NULL);
     317#endif /* __rtems__ */
    303318}
    304319
     
    314329        struct dpa_percpu_priv_s *percpu_priv;
    315330        static struct proxy_device *proxy_dev;
     331#ifndef __rtems__
    316332        struct task_struct *kth;
    317333        static u8 macless_idx;
     334#else /* __rtems__ */
     335        struct dpaa_fq *dpaa_fq, *tmp;
     336#endif /* __rtems__ */
    318337
    319338        dev = &_of_dev->dev;
     
    329348                return PTR_ERR(dpa_bp);
    330349
     350#ifndef __rtems__
    331351        for (i = 0; i < count; i++)
    332352                dpa_bp[i].seed_cb = dpa_bp_shared_port_seed;
     353#endif /* __rtems__ */
    333354
    334355        proxy_dev = dpa_macless_proxy_probe(_of_dev);
    335356
    336357
     358#ifndef __rtems__
    337359        /* Allocate this early, so we can store relevant information in
    338360         * the private area (needed by 1588 code in dpa_mac_probe)
     
    346368        /* Do this here, so we can be verbose early */
    347369        SET_NETDEV_DEV(net_dev, dev);
     370#else /* __rtems__ */
     371        net_dev = _of_dev->platform_data;
     372#endif /* __rtems__ */
    348373        dev_set_drvdata(dev, net_dev);
    349374
     375#ifndef __rtems__
    350376        priv = netdev_priv(net_dev);
     377#else /* __rtems__ */
     378        priv = malloc(sizeof(*priv), M_KMALLOC, M_WAITOK | M_ZERO);
     379        net_dev->priv = priv;
     380#endif /* __rtems__ */
    351381        priv->net_dev = net_dev;
     382#ifndef __rtems__
    352383        sprintf(priv->if_type, "macless%d", macless_idx++);
    353384
     
    371402                priv->peer = (void *)proxy_dev;
    372403        }
     404#else /* __rtems__ */
     405        (void)proxy_dev;
     406#endif /* __rtems__ */
    373407
    374408        INIT_LIST_HEAD(&priv->dpa_fq_list);
     
    382416
    383417        /* bp init */
     418#ifndef __rtems__
    384419        priv->bp_count = count;
    385420        err = dpa_bp_create(net_dev, dpa_bp, count);
    386421        if (err < 0)
    387422                goto bp_create_failed;
     423#else /* __rtems__ */
     424        BSD_ASSERT(count == DPAA_BPS_NUM);
     425        for (i = 0; i < DPAA_BPS_NUM; i++) {
     426                int err;
     427
     428                dpa_bp[i].raw_size = dpa_bp[i].size;
     429                dpa_bp[i].dev = dev;
     430
     431                err = dpaa_bp_alloc_pool(&dpa_bp[i]);
     432                BSD_ASSERT(err == 0);
     433                priv->dpaa_bps[i] = &dpa_bp[i];
     434        }
     435#endif /* __rtems__ */
    388436
    389437        channel = dpa_get_channel();
     
    399447         * and add this pool channel to each's dequeue mask.
    400448         */
     449#ifndef __rtems__
    401450        kth = kthread_run(dpaa_eth_add_channel,
    402451                          (void *)(unsigned long)priv->channel,
     
    406455                goto add_channel_failed;
    407456        }
     457#else /* __rtems__ */
     458        dpaa_eth_add_channel(priv->channel);
     459#endif /* __rtems__ */
    408460
    409461        dpa_fq_setup(priv, &shared_fq_cbs, NULL);
     
    418470         * partition doing qman_enqueue.
    419471         */
     472#ifndef __rtems__
    420473        err = dpa_fqs_init(dev,  &priv->dpa_fq_list, true);
    421474        if (err < 0)
    422475                goto fq_alloc_failed;
     476#else /* __rtems__ */
     477        list_for_each_entry_safe(dpaa_fq, tmp, &priv->dpaa_fq_list, list) {
     478                err = dpaa_fq_init(dpaa_fq, true);
     479                if (err < 0)
     480                        goto fq_alloc_failed;
     481        }
     482#endif /* __rtems__ */
    423483
    424484        priv->tx_headroom = DPA_DEFAULT_TX_HEADROOM;
     
    436496        }
    437497
     498#ifndef __rtems__
    438499        err = dpa_macless_netdev_init(dpa_node, net_dev);
    439500        if (err < 0)
     
    444505        pr_info("fsl_dpa_macless: Probed %s interface as %s\n",
    445506                        priv->if_type, net_dev->name);
     507#endif /* __rtems__ */
    446508
    447509        return 0;
    448510
     511#ifndef __rtems__
    449512netdev_init_failed:
     513#endif /* __rtems__ */
    450514alloc_percpu_failed:
    451515fq_alloc_failed:
     516#ifndef __rtems__
    452517        if (net_dev)
    453518                dpa_fq_free(dev, &priv->dpa_fq_list);
    454519add_channel_failed:
     520#endif /* __rtems__ */
    455521get_channel_failed:
     522#ifndef __rtems__
    456523        if (net_dev)
    457524                dpa_bp_free(priv);
    458525bp_create_failed:
     526#endif /* __rtems__ */
    459527fq_probe_failed:
     528#ifndef __rtems__
    460529        dev_set_drvdata(dev, NULL);
    461530        if (net_dev)
    462531                free_netdev(net_dev);
     532#else /* __rtems__ */
     533        BSD_ASSERT(0);
     534#endif /* __rtems__ */
    463535
    464536        return err;
    465537}
    466538
     539#ifndef __rtems__
    467540static int __init __cold dpa_macless_load(void)
    468541{
     
    497570}
    498571module_exit(dpa_macless_unload);
     572#else /* __rtems__ */
     573#include <sys/cdefs.h>
     574#include <sys/param.h>
     575#include <sys/systm.h>
     576#include <sys/bus.h>
     577#include <sys/kernel.h>
     578
     579#include <bsp/fdt.h>
     580
     581static const char dpaa_ml_compatible[] = "fsl,dpa-ethernet-macless";
     582
     583static int
     584dpaa_ml_attach(device_t dev)
     585{
     586        const char *fdt;
     587        int node;
     588        int unit;
     589
     590        fdt = bsp_fdt_get();
     591        node = -1;
     592        unit = 0;
     593
     594        while (true) {
     595                struct if_ml_softc *sc;
     596                struct platform_device of_dev;
     597                struct device_node dn;
     598                int err;
     599
     600                node = fdt_node_offset_by_compatible(fdt, node, dpaa_ml_compatible);
     601                if (node < 0) {
     602                        break;
     603                }
     604
     605                sc = malloc(sizeof(*sc), M_KMALLOC, M_WAITOK | M_ZERO);
     606
     607                memset(&of_dev, 0, sizeof(of_dev));
     608                memset(&dn, 0, sizeof(dn));
     609                dn.offset = node;
     610                dn.full_name = dpaa_ml_compatible;
     611                of_dev.dev.of_node = &dn;
     612                of_dev.platform_data = &sc->net_dev;
     613
     614                err = dpaa_eth_macless_probe(&of_dev);
     615                BSD_ASSERT(err == 0);
     616
     617                if_ml_attach(sc, unit, of_get_mac_address(&dn));
     618                ++unit;
     619        }
     620
     621        return (0);
     622}
     623
     624static device_method_t dpaa_ml_methods[] = {
     625        /* Device interface */
     626        DEVMETHOD(device_probe, bus_generic_probe),
     627        DEVMETHOD(device_attach, dpaa_ml_attach),
     628        DEVMETHOD(device_detach, bus_generic_detach),
     629        DEVMETHOD(device_suspend, bus_generic_suspend),
     630        DEVMETHOD(device_resume, bus_generic_resume),
     631        DEVMETHOD(device_shutdown, bus_generic_shutdown),
     632
     633        DEVMETHOD_END
     634};
     635
     636driver_t dpaa_ml_driver = {
     637        .name = "dpaa_ml",
     638        .methods = dpaa_ml_methods
     639};
     640
     641static devclass_t dpaa_ml_devclass;
     642
     643DRIVER_MODULE(dpaa_ml, nexus, dpaa_ml_driver, dpaa_ml_devclass, 0, 0);
     644#endif /* __rtems__ */
Note: See TracChangeset for help on using the changeset viewer.