Merge branch 'hns-roce' into k.o/for-4.9
This commit is contained in:
Коммит
64278fe89b
|
@ -531,7 +531,7 @@ struct hns_roce_dev {
|
||||||
struct ib_device ib_dev;
|
struct ib_device ib_dev;
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
struct hns_roce_uar priv_uar;
|
struct hns_roce_uar priv_uar;
|
||||||
const char *irq_names;
|
const char *irq_names[HNS_ROCE_MAX_IRQ_NUM];
|
||||||
spinlock_t sm_lock;
|
spinlock_t sm_lock;
|
||||||
spinlock_t cq_db_lock;
|
spinlock_t cq_db_lock;
|
||||||
spinlock_t bt_cmd_lock;
|
spinlock_t bt_cmd_lock;
|
||||||
|
|
|
@ -713,7 +713,7 @@ int hns_roce_init_eq_table(struct hns_roce_dev *hr_dev)
|
||||||
|
|
||||||
for (j = 0; j < eq_num; j++) {
|
for (j = 0; j < eq_num; j++) {
|
||||||
ret = request_irq(eq_table->eq[j].irq, hns_roce_msi_x_interrupt,
|
ret = request_irq(eq_table->eq[j].irq, hns_roce_msi_x_interrupt,
|
||||||
0, hr_dev->irq_names, eq_table->eq + j);
|
0, hr_dev->irq_names[j], eq_table->eq + j);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(dev, "request irq error!\n");
|
dev_err(dev, "request irq error!\n");
|
||||||
goto err_request_irq_fail;
|
goto err_request_irq_fail;
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/acpi.h>
|
||||||
#include <rdma/ib_umem.h>
|
#include <rdma/ib_umem.h>
|
||||||
#include "hns_roce_common.h"
|
#include "hns_roce_common.h"
|
||||||
#include "hns_roce_device.h"
|
#include "hns_roce_device.h"
|
||||||
|
@ -794,29 +795,47 @@ static void hns_roce_port_enable(struct hns_roce_dev *hr_dev, int enable_flag)
|
||||||
* @enable: true -- drop reset, false -- reset
|
* @enable: true -- drop reset, false -- reset
|
||||||
* return 0 - success , negative --fail
|
* return 0 - success , negative --fail
|
||||||
*/
|
*/
|
||||||
int hns_roce_v1_reset(struct hns_roce_dev *hr_dev, bool enable)
|
int hns_roce_v1_reset(struct hns_roce_dev *hr_dev, bool dereset)
|
||||||
{
|
{
|
||||||
struct device_node *dsaf_node;
|
struct device_node *dsaf_node;
|
||||||
struct device *dev = &hr_dev->pdev->dev;
|
struct device *dev = &hr_dev->pdev->dev;
|
||||||
struct device_node *np = dev->of_node;
|
struct device_node *np = dev->of_node;
|
||||||
|
struct fwnode_handle *fwnode;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
dsaf_node = of_parse_phandle(np, "dsaf-handle", 0);
|
/* check if this is DT/ACPI case */
|
||||||
if (!dsaf_node) {
|
if (dev_of_node(dev)) {
|
||||||
dev_err(dev, "Unable to get dsaf node by dsaf-handle!\n");
|
dsaf_node = of_parse_phandle(np, "dsaf-handle", 0);
|
||||||
return -EINVAL;
|
if (!dsaf_node) {
|
||||||
|
dev_err(dev, "could not find dsaf-handle\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
fwnode = &dsaf_node->fwnode;
|
||||||
|
} else if (is_acpi_device_node(dev->fwnode)) {
|
||||||
|
struct acpi_reference_args args;
|
||||||
|
|
||||||
|
ret = acpi_node_get_property_reference(dev->fwnode,
|
||||||
|
"dsaf-handle", 0, &args);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dev, "could not find dsaf-handle\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
fwnode = acpi_fwnode_handle(args.adev);
|
||||||
|
} else {
|
||||||
|
dev_err(dev, "cannot read data from DT or ACPI\n");
|
||||||
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = hns_dsaf_roce_reset(&dsaf_node->fwnode, false);
|
ret = hns_dsaf_roce_reset(fwnode, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (enable) {
|
if (dereset) {
|
||||||
msleep(SLEEP_TIME_INTERVAL);
|
msleep(SLEEP_TIME_INTERVAL);
|
||||||
return hns_dsaf_roce_reset(&dsaf_node->fwnode, true);
|
ret = hns_dsaf_roce_reset(fwnode, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hns_roce_v1_profile(struct hns_roce_dev *hr_dev)
|
void hns_roce_v1_profile(struct hns_roce_dev *hr_dev)
|
||||||
|
|
|
@ -976,6 +976,6 @@ struct hns_roce_v1_priv {
|
||||||
struct hns_roce_raq_table raq_table;
|
struct hns_roce_raq_table raq_table;
|
||||||
};
|
};
|
||||||
|
|
||||||
int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool enable);
|
int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool dereset);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
#include <linux/acpi.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <rdma/ib_addr.h>
|
#include <rdma/ib_addr.h>
|
||||||
#include <rdma/ib_smi.h>
|
#include <rdma/ib_smi.h>
|
||||||
|
@ -694,40 +694,122 @@ error_failed_setup_mtu_gids:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct of_device_id hns_roce_of_match[] = {
|
||||||
|
{ .compatible = "hisilicon,hns-roce-v1", .data = &hns_roce_hw_v1, },
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, hns_roce_of_match);
|
||||||
|
|
||||||
|
static const struct acpi_device_id hns_roce_acpi_match[] = {
|
||||||
|
{ "HISI00D1", (kernel_ulong_t)&hns_roce_hw_v1 },
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(acpi, hns_roce_acpi_match);
|
||||||
|
|
||||||
|
static int hns_roce_node_match(struct device *dev, void *fwnode)
|
||||||
|
{
|
||||||
|
return dev->fwnode == fwnode;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct
|
||||||
|
platform_device *hns_roce_find_pdev(struct fwnode_handle *fwnode)
|
||||||
|
{
|
||||||
|
struct device *dev;
|
||||||
|
|
||||||
|
/* get the 'device'corresponding to matching 'fwnode' */
|
||||||
|
dev = bus_find_device(&platform_bus_type, NULL,
|
||||||
|
fwnode, hns_roce_node_match);
|
||||||
|
/* get the platform device */
|
||||||
|
return dev ? to_platform_device(dev) : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static int hns_roce_get_cfg(struct hns_roce_dev *hr_dev)
|
static int hns_roce_get_cfg(struct hns_roce_dev *hr_dev)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
int ret;
|
||||||
u8 phy_port;
|
u8 phy_port;
|
||||||
int port_cnt = 0;
|
int port_cnt = 0;
|
||||||
struct device *dev = &hr_dev->pdev->dev;
|
struct device *dev = &hr_dev->pdev->dev;
|
||||||
struct device_node *np = dev->of_node;
|
|
||||||
struct device_node *net_node;
|
struct device_node *net_node;
|
||||||
struct net_device *netdev = NULL;
|
struct net_device *netdev = NULL;
|
||||||
struct platform_device *pdev = NULL;
|
struct platform_device *pdev = NULL;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
|
|
||||||
if (of_device_is_compatible(np, "hisilicon,hns-roce-v1")) {
|
/* check if we are compatible with the underlying SoC */
|
||||||
hr_dev->hw = &hns_roce_hw_v1;
|
if (dev_of_node(dev)) {
|
||||||
|
const struct of_device_id *of_id;
|
||||||
|
|
||||||
|
of_id = of_match_node(hns_roce_of_match, dev->of_node);
|
||||||
|
if (!of_id) {
|
||||||
|
dev_err(dev, "device is not compatible!\n");
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
|
hr_dev->hw = (struct hns_roce_hw *)of_id->data;
|
||||||
|
if (!hr_dev->hw) {
|
||||||
|
dev_err(dev, "couldn't get H/W specific DT data!\n");
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
|
} else if (is_acpi_device_node(dev->fwnode)) {
|
||||||
|
const struct acpi_device_id *acpi_id;
|
||||||
|
|
||||||
|
acpi_id = acpi_match_device(hns_roce_acpi_match, dev);
|
||||||
|
if (!acpi_id) {
|
||||||
|
dev_err(dev, "device is not compatible!\n");
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
|
hr_dev->hw = (struct hns_roce_hw *) acpi_id->driver_data;
|
||||||
|
if (!hr_dev->hw) {
|
||||||
|
dev_err(dev, "couldn't get H/W specific ACPI data!\n");
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
dev_err(dev, "device no compatible!\n");
|
dev_err(dev, "can't read compatibility data from DT or ACPI\n");
|
||||||
return -EINVAL;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get the mapped register base address */
|
||||||
res = platform_get_resource(hr_dev->pdev, IORESOURCE_MEM, 0);
|
res = platform_get_resource(hr_dev->pdev, IORESOURCE_MEM, 0);
|
||||||
|
if (!res) {
|
||||||
|
dev_err(dev, "memory resource not found!\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
hr_dev->reg_base = devm_ioremap_resource(dev, res);
|
hr_dev->reg_base = devm_ioremap_resource(dev, res);
|
||||||
if (IS_ERR(hr_dev->reg_base))
|
if (IS_ERR(hr_dev->reg_base))
|
||||||
return PTR_ERR(hr_dev->reg_base);
|
return PTR_ERR(hr_dev->reg_base);
|
||||||
|
|
||||||
|
/* get the RoCE associated ethernet ports or netdevices */
|
||||||
for (i = 0; i < HNS_ROCE_MAX_PORTS; i++) {
|
for (i = 0; i < HNS_ROCE_MAX_PORTS; i++) {
|
||||||
net_node = of_parse_phandle(np, "eth-handle", i);
|
if (dev_of_node(dev)) {
|
||||||
if (net_node) {
|
net_node = of_parse_phandle(dev->of_node, "eth-handle",
|
||||||
|
i);
|
||||||
|
if (!net_node)
|
||||||
|
continue;
|
||||||
pdev = of_find_device_by_node(net_node);
|
pdev = of_find_device_by_node(net_node);
|
||||||
|
} else if (is_acpi_device_node(dev->fwnode)) {
|
||||||
|
struct acpi_reference_args args;
|
||||||
|
struct fwnode_handle *fwnode;
|
||||||
|
|
||||||
|
ret = acpi_node_get_property_reference(dev->fwnode,
|
||||||
|
"eth-handle",
|
||||||
|
i, &args);
|
||||||
|
if (ret)
|
||||||
|
continue;
|
||||||
|
fwnode = acpi_fwnode_handle(args.adev);
|
||||||
|
pdev = hns_roce_find_pdev(fwnode);
|
||||||
|
} else {
|
||||||
|
dev_err(dev, "cannot read data from DT or ACPI\n");
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pdev) {
|
||||||
netdev = platform_get_drvdata(pdev);
|
netdev = platform_get_drvdata(pdev);
|
||||||
phy_port = (u8)i;
|
phy_port = (u8)i;
|
||||||
if (netdev) {
|
if (netdev) {
|
||||||
hr_dev->iboe.netdevs[port_cnt] = netdev;
|
hr_dev->iboe.netdevs[port_cnt] = netdev;
|
||||||
hr_dev->iboe.phy_port[port_cnt] = phy_port;
|
hr_dev->iboe.phy_port[port_cnt] = phy_port;
|
||||||
} else {
|
} else {
|
||||||
|
dev_err(dev, "no netdev found with pdev %s\n",
|
||||||
|
pdev->name);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
port_cnt++;
|
port_cnt++;
|
||||||
|
@ -735,26 +817,32 @@ static int hns_roce_get_cfg(struct hns_roce_dev *hr_dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (port_cnt == 0) {
|
if (port_cnt == 0) {
|
||||||
dev_err(dev, "Unable to get available port by eth-handle!\n");
|
dev_err(dev, "unable to get eth-handle for available ports!\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr_dev->caps.num_ports = port_cnt;
|
hr_dev->caps.num_ports = port_cnt;
|
||||||
|
|
||||||
/* Cmd issue mode: 0 is poll, 1 is event */
|
/* cmd issue mode: 0 is poll, 1 is event */
|
||||||
hr_dev->cmd_mod = 1;
|
hr_dev->cmd_mod = 1;
|
||||||
hr_dev->loop_idc = 0;
|
hr_dev->loop_idc = 0;
|
||||||
|
|
||||||
|
/* read the interrupt names from the DT or ACPI */
|
||||||
|
ret = device_property_read_string_array(dev, "interrupt-names",
|
||||||
|
hr_dev->irq_names,
|
||||||
|
HNS_ROCE_MAX_IRQ_NUM);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev, "couldn't get interrupt names from DT or ACPI!\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fetch the interrupt numbers */
|
||||||
for (i = 0; i < HNS_ROCE_MAX_IRQ_NUM; i++) {
|
for (i = 0; i < HNS_ROCE_MAX_IRQ_NUM; i++) {
|
||||||
hr_dev->irq[i] = platform_get_irq(hr_dev->pdev, i);
|
hr_dev->irq[i] = platform_get_irq(hr_dev->pdev, i);
|
||||||
if (hr_dev->irq[i] <= 0) {
|
if (hr_dev->irq[i] <= 0) {
|
||||||
dev_err(dev, "Get No.%d irq resource failed!\n", i);
|
dev_err(dev, "platform get of irq[=%d] failed!\n", i);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (of_property_read_string_index(np, "interrupt-names", i,
|
|
||||||
&hr_dev->irq_names))
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -917,7 +1005,7 @@ static int hns_roce_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64ULL)) &&
|
if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64ULL)) &&
|
||||||
dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32ULL))) {
|
dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32ULL))) {
|
||||||
dev_err(dev, "No usable DMA addressing mode\n");
|
dev_err(dev, "Not usable DMA addressing mode\n");
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
goto error_failed_get_cfg;
|
goto error_failed_get_cfg;
|
||||||
}
|
}
|
||||||
|
@ -1035,18 +1123,13 @@ static int hns_roce_remove(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id hns_roce_of_match[] = {
|
|
||||||
{ .compatible = "hisilicon,hns-roce-v1",},
|
|
||||||
{},
|
|
||||||
};
|
|
||||||
MODULE_DEVICE_TABLE(of, hns_roce_of_match);
|
|
||||||
|
|
||||||
static struct platform_driver hns_roce_driver = {
|
static struct platform_driver hns_roce_driver = {
|
||||||
.probe = hns_roce_probe,
|
.probe = hns_roce_probe,
|
||||||
.remove = hns_roce_remove,
|
.remove = hns_roce_remove,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = DRV_NAME,
|
.name = DRV_NAME,
|
||||||
.of_match_table = hns_roce_of_match,
|
.of_match_table = hns_roce_of_match,
|
||||||
|
.acpi_match_table = ACPI_PTR(hns_roce_acpi_match),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -644,21 +644,6 @@ hns_mac_phy_parse_addr(struct device *dev, struct fwnode_handle *fwnode)
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hns_mac_phydev_match(struct device *dev, void *fwnode)
|
|
||||||
{
|
|
||||||
return dev->fwnode == fwnode;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct
|
|
||||||
platform_device *hns_mac_find_platform_device(struct fwnode_handle *fwnode)
|
|
||||||
{
|
|
||||||
struct device *dev;
|
|
||||||
|
|
||||||
dev = bus_find_device(&platform_bus_type, NULL,
|
|
||||||
fwnode, hns_mac_phydev_match);
|
|
||||||
return dev ? to_platform_device(dev) : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
hns_mac_register_phydev(struct mii_bus *mdio, struct hns_mac_cb *mac_cb,
|
hns_mac_register_phydev(struct mii_bus *mdio, struct hns_mac_cb *mac_cb,
|
||||||
u32 addr)
|
u32 addr)
|
||||||
|
@ -724,7 +709,7 @@ static void hns_mac_register_phy(struct hns_mac_cb *mac_cb)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* dev address in adev */
|
/* dev address in adev */
|
||||||
pdev = hns_mac_find_platform_device(acpi_fwnode_handle(args.adev));
|
pdev = hns_dsaf_find_platform_device(acpi_fwnode_handle(args.adev));
|
||||||
mii_bus = platform_get_drvdata(pdev);
|
mii_bus = platform_get_drvdata(pdev);
|
||||||
rc = hns_mac_register_phydev(mii_bus, mac_cb, addr);
|
rc = hns_mac_register_phydev(mii_bus, mac_cb, addr);
|
||||||
if (!rc)
|
if (!rc)
|
||||||
|
|
|
@ -2788,7 +2788,7 @@ module_platform_driver(g_dsaf_driver);
|
||||||
* @enable: false - request reset , true - drop reset
|
* @enable: false - request reset , true - drop reset
|
||||||
* retuen 0 - success , negative -fail
|
* retuen 0 - success , negative -fail
|
||||||
*/
|
*/
|
||||||
int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool enable)
|
int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool dereset)
|
||||||
{
|
{
|
||||||
struct dsaf_device *dsaf_dev;
|
struct dsaf_device *dsaf_dev;
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
@ -2817,24 +2817,44 @@ int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool enable)
|
||||||
{DSAF_ROCE_SL_1, DSAF_ROCE_SL_1, DSAF_ROCE_SL_3},
|
{DSAF_ROCE_SL_1, DSAF_ROCE_SL_1, DSAF_ROCE_SL_3},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!is_of_node(dsaf_fwnode)) {
|
/* find the platform device corresponding to fwnode */
|
||||||
pr_err("hisi_dsaf: Only support DT node!\n");
|
if (is_of_node(dsaf_fwnode)) {
|
||||||
|
pdev = of_find_device_by_node(to_of_node(dsaf_fwnode));
|
||||||
|
} else if (is_acpi_device_node(dsaf_fwnode)) {
|
||||||
|
pdev = hns_dsaf_find_platform_device(dsaf_fwnode);
|
||||||
|
} else {
|
||||||
|
pr_err("fwnode is neither OF or ACPI type\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
pdev = of_find_device_by_node(to_of_node(dsaf_fwnode));
|
|
||||||
|
/* check if we were a success in fetching pdev */
|
||||||
|
if (!pdev) {
|
||||||
|
pr_err("couldn't find platform device for node\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* retrieve the dsaf_device from the driver data */
|
||||||
dsaf_dev = dev_get_drvdata(&pdev->dev);
|
dsaf_dev = dev_get_drvdata(&pdev->dev);
|
||||||
|
if (!dsaf_dev) {
|
||||||
|
dev_err(&pdev->dev, "dsaf_dev is NULL\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* now, make sure we are running on compatible SoC */
|
||||||
if (AE_IS_VER1(dsaf_dev->dsaf_ver)) {
|
if (AE_IS_VER1(dsaf_dev->dsaf_ver)) {
|
||||||
dev_err(dsaf_dev->dev, "%s v1 chip doesn't support RoCE!\n",
|
dev_err(dsaf_dev->dev, "%s v1 chip doesn't support RoCE!\n",
|
||||||
dsaf_dev->ae_dev.name);
|
dsaf_dev->ae_dev.name);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!enable) {
|
/* do reset or de-reset according to the flag */
|
||||||
/* Reset rocee-channels in dsaf and rocee */
|
if (!dereset) {
|
||||||
hns_dsaf_srst_chns(dsaf_dev, DSAF_CHNS_MASK, false);
|
/* reset rocee-channels in dsaf and rocee */
|
||||||
hns_dsaf_roce_srst(dsaf_dev, false);
|
dsaf_dev->misc_op->hns_dsaf_srst_chns(dsaf_dev, DSAF_CHNS_MASK,
|
||||||
|
false);
|
||||||
|
dsaf_dev->misc_op->hns_dsaf_roce_srst(dsaf_dev, false);
|
||||||
} else {
|
} else {
|
||||||
/* Configure dsaf tx roce correspond to port map and sl map */
|
/* configure dsaf tx roce correspond to port map and sl map */
|
||||||
mp = dsaf_read_dev(dsaf_dev, DSAF_ROCE_PORT_MAP_REG);
|
mp = dsaf_read_dev(dsaf_dev, DSAF_ROCE_PORT_MAP_REG);
|
||||||
for (i = 0; i < DSAF_ROCE_CREDIT_CHN; i++)
|
for (i = 0; i < DSAF_ROCE_CREDIT_CHN; i++)
|
||||||
dsaf_set_field(mp, 7 << i * 3, i * 3,
|
dsaf_set_field(mp, 7 << i * 3, i * 3,
|
||||||
|
@ -2848,12 +2868,13 @@ int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool enable)
|
||||||
sl_map[i][DSAF_ROCE_6PORT_MODE]);
|
sl_map[i][DSAF_ROCE_6PORT_MODE]);
|
||||||
dsaf_write_dev(dsaf_dev, DSAF_ROCE_SL_MAP_REG, sl);
|
dsaf_write_dev(dsaf_dev, DSAF_ROCE_SL_MAP_REG, sl);
|
||||||
|
|
||||||
/* De-reset rocee-channels in dsaf and rocee */
|
/* de-reset rocee-channels in dsaf and rocee */
|
||||||
hns_dsaf_srst_chns(dsaf_dev, DSAF_CHNS_MASK, true);
|
dsaf_dev->misc_op->hns_dsaf_srst_chns(dsaf_dev, DSAF_CHNS_MASK,
|
||||||
|
true);
|
||||||
msleep(SRST_TIME_INTERVAL);
|
msleep(SRST_TIME_INTERVAL);
|
||||||
hns_dsaf_roce_srst(dsaf_dev, true);
|
dsaf_dev->misc_op->hns_dsaf_roce_srst(dsaf_dev, true);
|
||||||
|
|
||||||
/* Eanble dsaf channel rocee credit */
|
/* enable dsaf channel rocee credit */
|
||||||
credit = dsaf_read_dev(dsaf_dev, DSAF_SBM_ROCEE_CFG_REG_REG);
|
credit = dsaf_read_dev(dsaf_dev, DSAF_SBM_ROCEE_CFG_REG_REG);
|
||||||
dsaf_set_bit(credit, DSAF_SBM_ROCEE_CFG_CRD_EN_B, 0);
|
dsaf_set_bit(credit, DSAF_SBM_ROCEE_CFG_CRD_EN_B, 0);
|
||||||
dsaf_write_dev(dsaf_dev, DSAF_SBM_ROCEE_CFG_REG_REG, credit);
|
dsaf_write_dev(dsaf_dev, DSAF_SBM_ROCEE_CFG_REG_REG, credit);
|
||||||
|
|
|
@ -305,7 +305,7 @@ struct dsaf_misc_op {
|
||||||
void (*cpld_reset_led)(struct hns_mac_cb *mac_cb);
|
void (*cpld_reset_led)(struct hns_mac_cb *mac_cb);
|
||||||
int (*cpld_set_led_id)(struct hns_mac_cb *mac_cb,
|
int (*cpld_set_led_id)(struct hns_mac_cb *mac_cb,
|
||||||
enum hnae_led_state status);
|
enum hnae_led_state status);
|
||||||
/* reset seris function, it will be reset if the dereseet is 0 */
|
/* reset series function, it will be reset if the dereset is 0 */
|
||||||
void (*dsaf_reset)(struct dsaf_device *dsaf_dev, bool dereset);
|
void (*dsaf_reset)(struct dsaf_device *dsaf_dev, bool dereset);
|
||||||
void (*xge_srst)(struct dsaf_device *dsaf_dev, u32 port, bool dereset);
|
void (*xge_srst)(struct dsaf_device *dsaf_dev, u32 port, bool dereset);
|
||||||
void (*xge_core_srst)(struct dsaf_device *dsaf_dev, u32 port,
|
void (*xge_core_srst)(struct dsaf_device *dsaf_dev, u32 port,
|
||||||
|
@ -313,6 +313,9 @@ struct dsaf_misc_op {
|
||||||
void (*ge_srst)(struct dsaf_device *dsaf_dev, u32 port, bool dereset);
|
void (*ge_srst)(struct dsaf_device *dsaf_dev, u32 port, bool dereset);
|
||||||
void (*ppe_srst)(struct dsaf_device *dsaf_dev, u32 port, bool dereset);
|
void (*ppe_srst)(struct dsaf_device *dsaf_dev, u32 port, bool dereset);
|
||||||
void (*ppe_comm_srst)(struct dsaf_device *dsaf_dev, bool dereset);
|
void (*ppe_comm_srst)(struct dsaf_device *dsaf_dev, bool dereset);
|
||||||
|
void (*hns_dsaf_srst_chns)(struct dsaf_device *dsaf_dev, u32 msk,
|
||||||
|
bool dereset);
|
||||||
|
void (*hns_dsaf_roce_srst)(struct dsaf_device *dsaf_dev, bool dereset);
|
||||||
|
|
||||||
phy_interface_t (*get_phy_if)(struct hns_mac_cb *mac_cb);
|
phy_interface_t (*get_phy_if)(struct hns_mac_cb *mac_cb);
|
||||||
int (*get_sfp_prsnt)(struct hns_mac_cb *mac_cb, int *sfp_prsnt);
|
int (*get_sfp_prsnt)(struct hns_mac_cb *mac_cb, int *sfp_prsnt);
|
||||||
|
@ -445,10 +448,6 @@ int hns_dsaf_get_mac_entry_by_index(
|
||||||
|
|
||||||
void hns_dsaf_fix_mac_mode(struct hns_mac_cb *mac_cb);
|
void hns_dsaf_fix_mac_mode(struct hns_mac_cb *mac_cb);
|
||||||
|
|
||||||
void hns_dsaf_srst_chns(struct dsaf_device *dsaf_dev, u32 msk, bool enable);
|
|
||||||
|
|
||||||
void hns_dsaf_roce_srst(struct dsaf_device *dsaf_dev, bool enable);
|
|
||||||
|
|
||||||
int hns_dsaf_ae_init(struct dsaf_device *dsaf_dev);
|
int hns_dsaf_ae_init(struct dsaf_device *dsaf_dev);
|
||||||
void hns_dsaf_ae_uninit(struct dsaf_device *dsaf_dev);
|
void hns_dsaf_ae_uninit(struct dsaf_device *dsaf_dev);
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,8 @@ enum _dsm_rst_type {
|
||||||
HNS_XGE_CORE_RESET_FUNC = 0x3,
|
HNS_XGE_CORE_RESET_FUNC = 0x3,
|
||||||
HNS_XGE_RESET_FUNC = 0x4,
|
HNS_XGE_RESET_FUNC = 0x4,
|
||||||
HNS_GE_RESET_FUNC = 0x5,
|
HNS_GE_RESET_FUNC = 0x5,
|
||||||
|
HNS_DSAF_CHN_RESET_FUNC = 0x6,
|
||||||
|
HNS_ROCE_RESET_FUNC = 0x7,
|
||||||
};
|
};
|
||||||
|
|
||||||
const u8 hns_dsaf_acpi_dsm_uuid[] = {
|
const u8 hns_dsaf_acpi_dsm_uuid[] = {
|
||||||
|
@ -241,11 +243,11 @@ static void hns_dsaf_xge_core_srst_by_port(struct dsaf_device *dsaf_dev,
|
||||||
* bit18-19 for com/dfx
|
* bit18-19 for com/dfx
|
||||||
* @enable: false - request reset , true - drop reset
|
* @enable: false - request reset , true - drop reset
|
||||||
*/
|
*/
|
||||||
void hns_dsaf_srst_chns(struct dsaf_device *dsaf_dev, u32 msk, bool enable)
|
void hns_dsaf_srst_chns(struct dsaf_device *dsaf_dev, u32 msk, bool dereset)
|
||||||
{
|
{
|
||||||
u32 reg_addr;
|
u32 reg_addr;
|
||||||
|
|
||||||
if (!enable)
|
if (!dereset)
|
||||||
reg_addr = DSAF_SUB_SC_DSAF_RESET_REQ_REG;
|
reg_addr = DSAF_SUB_SC_DSAF_RESET_REQ_REG;
|
||||||
else
|
else
|
||||||
reg_addr = DSAF_SUB_SC_DSAF_RESET_DREQ_REG;
|
reg_addr = DSAF_SUB_SC_DSAF_RESET_DREQ_REG;
|
||||||
|
@ -253,9 +255,27 @@ void hns_dsaf_srst_chns(struct dsaf_device *dsaf_dev, u32 msk, bool enable)
|
||||||
dsaf_write_sub(dsaf_dev, reg_addr, msk);
|
dsaf_write_sub(dsaf_dev, reg_addr, msk);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hns_dsaf_roce_srst(struct dsaf_device *dsaf_dev, bool enable)
|
/**
|
||||||
|
* hns_dsaf_srst_chns - reset dsaf channels
|
||||||
|
* @dsaf_dev: dsaf device struct pointer
|
||||||
|
* @msk: xbar channels mask value:
|
||||||
|
* bit0-5 for xge0-5
|
||||||
|
* bit6-11 for ppe0-5
|
||||||
|
* bit12-17 for roce0-5
|
||||||
|
* bit18-19 for com/dfx
|
||||||
|
* @enable: false - request reset , true - drop reset
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
hns_dsaf_srst_chns_acpi(struct dsaf_device *dsaf_dev, u32 msk, bool dereset)
|
||||||
{
|
{
|
||||||
if (!enable) {
|
hns_dsaf_acpi_srst_by_port(dsaf_dev, HNS_OP_RESET_FUNC,
|
||||||
|
HNS_DSAF_CHN_RESET_FUNC,
|
||||||
|
msk, dereset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void hns_dsaf_roce_srst(struct dsaf_device *dsaf_dev, bool dereset)
|
||||||
|
{
|
||||||
|
if (!dereset) {
|
||||||
dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_ROCEE_RESET_REQ_REG, 1);
|
dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_ROCEE_RESET_REQ_REG, 1);
|
||||||
} else {
|
} else {
|
||||||
dsaf_write_sub(dsaf_dev,
|
dsaf_write_sub(dsaf_dev,
|
||||||
|
@ -267,6 +287,12 @@ void hns_dsaf_roce_srst(struct dsaf_device *dsaf_dev, bool enable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hns_dsaf_roce_srst_acpi(struct dsaf_device *dsaf_dev, bool dereset)
|
||||||
|
{
|
||||||
|
hns_dsaf_acpi_srst_by_port(dsaf_dev, HNS_OP_RESET_FUNC,
|
||||||
|
HNS_ROCE_RESET_FUNC, 0, dereset);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hns_dsaf_xge_core_srst_by_port_acpi(struct dsaf_device *dsaf_dev,
|
hns_dsaf_xge_core_srst_by_port_acpi(struct dsaf_device *dsaf_dev,
|
||||||
u32 port, bool dereset)
|
u32 port, bool dereset)
|
||||||
|
@ -575,6 +601,8 @@ struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)
|
||||||
misc_op->ge_srst = hns_dsaf_ge_srst_by_port;
|
misc_op->ge_srst = hns_dsaf_ge_srst_by_port;
|
||||||
misc_op->ppe_srst = hns_ppe_srst_by_port;
|
misc_op->ppe_srst = hns_ppe_srst_by_port;
|
||||||
misc_op->ppe_comm_srst = hns_ppe_com_srst;
|
misc_op->ppe_comm_srst = hns_ppe_com_srst;
|
||||||
|
misc_op->hns_dsaf_srst_chns = hns_dsaf_srst_chns;
|
||||||
|
misc_op->hns_dsaf_roce_srst = hns_dsaf_roce_srst;
|
||||||
|
|
||||||
misc_op->get_phy_if = hns_mac_get_phy_if;
|
misc_op->get_phy_if = hns_mac_get_phy_if;
|
||||||
misc_op->get_sfp_prsnt = hns_mac_get_sfp_prsnt;
|
misc_op->get_sfp_prsnt = hns_mac_get_sfp_prsnt;
|
||||||
|
@ -591,6 +619,8 @@ struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)
|
||||||
misc_op->ge_srst = hns_dsaf_ge_srst_by_port_acpi;
|
misc_op->ge_srst = hns_dsaf_ge_srst_by_port_acpi;
|
||||||
misc_op->ppe_srst = hns_ppe_srst_by_port_acpi;
|
misc_op->ppe_srst = hns_ppe_srst_by_port_acpi;
|
||||||
misc_op->ppe_comm_srst = hns_ppe_com_srst;
|
misc_op->ppe_comm_srst = hns_ppe_com_srst;
|
||||||
|
misc_op->hns_dsaf_srst_chns = hns_dsaf_srst_chns_acpi;
|
||||||
|
misc_op->hns_dsaf_roce_srst = hns_dsaf_roce_srst_acpi;
|
||||||
|
|
||||||
misc_op->get_phy_if = hns_mac_get_phy_if_acpi;
|
misc_op->get_phy_if = hns_mac_get_phy_if_acpi;
|
||||||
misc_op->get_sfp_prsnt = hns_mac_get_sfp_prsnt;
|
misc_op->get_sfp_prsnt = hns_mac_get_sfp_prsnt;
|
||||||
|
@ -603,3 +633,18 @@ struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)
|
||||||
|
|
||||||
return (void *)misc_op;
|
return (void *)misc_op;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hns_dsaf_dev_match(struct device *dev, void *fwnode)
|
||||||
|
{
|
||||||
|
return dev->fwnode == fwnode;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct
|
||||||
|
platform_device *hns_dsaf_find_platform_device(struct fwnode_handle *fwnode)
|
||||||
|
{
|
||||||
|
struct device *dev;
|
||||||
|
|
||||||
|
dev = bus_find_device(&platform_bus_type, NULL,
|
||||||
|
fwnode, hns_dsaf_dev_match);
|
||||||
|
return dev ? to_platform_device(dev) : NULL;
|
||||||
|
}
|
||||||
|
|
|
@ -34,5 +34,6 @@
|
||||||
#define DSAF_LED_ANCHOR_B 5
|
#define DSAF_LED_ANCHOR_B 5
|
||||||
|
|
||||||
struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev);
|
struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev);
|
||||||
|
struct
|
||||||
|
platform_device *hns_dsaf_find_platform_device(struct fwnode_handle *fwnode);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -78,10 +78,10 @@
|
||||||
#define DSAF_SUB_SC_RCB_PPE_COM_RESET_REQ_REG 0xA88
|
#define DSAF_SUB_SC_RCB_PPE_COM_RESET_REQ_REG 0xA88
|
||||||
#define DSAF_SUB_SC_RCB_PPE_COM_RESET_DREQ_REG 0xA8C
|
#define DSAF_SUB_SC_RCB_PPE_COM_RESET_DREQ_REG 0xA8C
|
||||||
#define DSAF_SUB_SC_DSAF_RESET_REQ_REG 0xAA8
|
#define DSAF_SUB_SC_DSAF_RESET_REQ_REG 0xAA8
|
||||||
#define DSAF_SUB_SC_ROCEE_RESET_REQ_REG 0xA50
|
|
||||||
#define DSAF_SUB_SC_DSAF_RESET_DREQ_REG 0xAAC
|
#define DSAF_SUB_SC_DSAF_RESET_DREQ_REG 0xAAC
|
||||||
#define DSAF_SUB_SC_ROCEE_CLK_DIS_REG 0x32C
|
#define DSAF_SUB_SC_ROCEE_RESET_REQ_REG 0xA50
|
||||||
#define DSAF_SUB_SC_ROCEE_RESET_DREQ_REG 0xA54
|
#define DSAF_SUB_SC_ROCEE_RESET_DREQ_REG 0xA54
|
||||||
|
#define DSAF_SUB_SC_ROCEE_CLK_DIS_REG 0x32C
|
||||||
#define DSAF_SUB_SC_ROCEE_CLK_EN_REG 0x328
|
#define DSAF_SUB_SC_ROCEE_CLK_EN_REG 0x328
|
||||||
#define DSAF_SUB_SC_LIGHT_MODULE_DETECT_EN_REG 0x2060
|
#define DSAF_SUB_SC_LIGHT_MODULE_DETECT_EN_REG 0x2060
|
||||||
#define DSAF_SUB_SC_TCAM_MBIST_EN_REG 0x2300
|
#define DSAF_SUB_SC_TCAM_MBIST_EN_REG 0x2300
|
||||||
|
|
Загрузка…
Ссылка в новой задаче