dpaa: Add "libbsd,dedicated-portal" to QMan portals

By default, the network interfaces use a pool channel, see
dpaa_get_channel() in dpaa_eth_priv_probe().  To enable a dedicated QMan
software portal, use libbsd,dedicated-portal = "enabled";.  This option
is useful for special purpose 10Gbit/s Ethernet processing.

/ {
        soc: soc@ffe000000 {
                fman0: fman@400000 {
                        enet7: ethernet@f2000 {
                                libbsd,dedicated-portal = "enabled";
                        };
                };
        };
};
This commit is contained in:
Sebastian Huber
2017-07-13 08:31:46 +02:00
parent e818128789
commit de5791b345
9 changed files with 124 additions and 0 deletions

View File

@@ -3078,6 +3078,17 @@ dpaa_eth_priv_probe(struct platform_device *pdev, struct mac_device *mac_dev)
priv->mac_dev = mac_dev;
#ifdef __rtems__
if (mac_dev->use_dedicated_portal) {
struct qman_portal *portal;
portal = qman_get_dedicated_portal(0);
BSD_ASSERT(portal != NULL);
mac_dev->portal = portal;
channel = qman_portal_get_channel(portal);
priv->channel = (u16)channel;
} else {
#endif /* __rtems__ */
channel = dpaa_get_channel();
if (channel < 0) {
dev_err(dev, "dpaa_get_channel() failed\n");
@@ -3091,6 +3102,9 @@ dpaa_eth_priv_probe(struct platform_device *pdev, struct mac_device *mac_dev)
* and add this pool channel to each's dequeue mask.
*/
dpaa_eth_add_channel(priv->channel);
#ifdef __rtems__
}
#endif /* __rtems__ */
dpaa_fq_setup(priv, &dpaa_fq_cbs, priv->mac_dev->port[TX]);

View File

@@ -748,6 +748,16 @@ MODULE_DEVICE_TABLE(of, mac_match);
#ifndef __rtems__
static int mac_probe(struct platform_device *_of_dev)
#else /* __rtems__ */
static bool
use_dedicated_portal(const struct device_node *mac_node)
{
const char *dp;
int len;
dp = of_get_property(mac_node, "libbsd,dedicated-portal", &len);
return (len > 0 && strcmp(dp, "enabled") == 0);
}
static int mac_probe(device_t _dev, struct platform_device *_of_dev, struct fman *fman)
#endif /* __rtems__ */
{
@@ -1096,6 +1106,9 @@ static int mac_probe(device_t _dev, struct platform_device *_of_dev, struct fman
mac_dev->addr[0], mac_dev->addr[1], mac_dev->addr[2],
mac_dev->addr[3], mac_dev->addr[4], mac_dev->addr[5]);
#ifdef __rtems__
mac_dev->use_dedicated_portal = use_dedicated_portal(mac_node);
#endif /* __rtems__ */
priv->eth_dev = dpaa_eth_add_device(fman_id, mac_dev, mac_node);
if (IS_ERR(priv->eth_dev)) {
dev_err(dev, "failed to add Ethernet platform device for MAC %d\n",

View File

@@ -85,6 +85,8 @@ struct mac_device {
struct phy_device *(*init_phy)(struct net_device *net_dev,
struct mac_device *mac_dev);
#else /* __rtems__ */
bool use_dedicated_portal;
struct qman_portal *portal;
void (*adjust_link)(struct mac_device *mac_dev, u16 speed);
#endif /* __rtems__ */
int (*init)(struct mac_device *mac_dev);