Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
64278fe8
Commit
64278fe8
authored
Aug 25, 2016
by
Doug Ledford
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'hns-roce' into k.o/for-4.9
parents
d68478da
528f1deb
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
228 additions
and
75 deletions
+228
-75
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_device.h
+1
-1
drivers/infiniband/hw/hns/hns_roce_eq.c
drivers/infiniband/hw/hns/hns_roce_eq.c
+1
-1
drivers/infiniband/hw/hns/hns_roce_hw_v1.c
drivers/infiniband/hw/hns/hns_roce_hw_v1.c
+28
-9
drivers/infiniband/hw/hns/hns_roce_hw_v1.h
drivers/infiniband/hw/hns/hns_roce_hw_v1.h
+1
-1
drivers/infiniband/hw/hns/hns_roce_main.c
drivers/infiniband/hw/hns/hns_roce_main.c
+105
-22
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+1
-16
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+34
-13
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
+4
-5
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+49
-4
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.h
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.h
+2
-1
drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
+2
-2
No files found.
drivers/infiniband/hw/hns/hns_roce_device.h
View file @
64278fe8
...
@@ -531,7 +531,7 @@ struct hns_roce_dev {
...
@@ -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
;
...
...
drivers/infiniband/hw/hns/hns_roce_eq.c
View file @
64278fe8
...
@@ -713,7 +713,7 @@ int hns_roce_init_eq_table(struct hns_roce_dev *hr_dev)
...
@@ -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
;
...
...
drivers/infiniband/hw/hns/hns_roce_hw_v1.c
View file @
64278fe8
...
@@ -31,6 +31,7 @@
...
@@ -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)
...
@@ -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
);
ret
urn
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
)
...
...
drivers/infiniband/hw/hns/hns_roce_hw_v1.h
View file @
64278fe8
...
@@ -976,6 +976,6 @@ struct hns_roce_v1_priv {
...
@@ -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
drivers/infiniband/hw/hns/hns_roce_main.c
View file @
64278fe8
...
@@ -30,7 +30,7 @@
...
@@ -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 @@ static int hns_roce_register_device(struct hns_roce_dev *hr_dev)
...
@@ -694,40 +694,122 @@ static int hns_roce_register_device(struct hns_roce_dev *hr_dev)
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
-
E
INVAL
;
return
-
E
NXIO
;
}
}
/* 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)
...
@@ -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
;
/*
C
md issue mode: 0 is poll, 1 is event */
/*
c
md 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)
...
@@ -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
,
"No
t
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)
...
@@ -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
),
},
},
};
};
...
...
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
View file @
64278fe8
...
@@ -644,21 +644,6 @@ hns_mac_phy_parse_addr(struct device *dev, struct fwnode_handle *fwnode)
...
@@ -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)
...
@@ -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
)
...
...
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
View file @
64278fe8
...
@@ -2788,7 +2788,7 @@ module_platform_driver(g_dsaf_driver);
...
@@ -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)
...
@@ -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
{
/*
C
onfigure dsaf tx roce correspond to port map and sl map */
/*
c
onfigure 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)
...
@@ -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
);
/*
Ean
ble dsaf channel rocee credit */
/*
ena
ble 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
);
...
...
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
View file @
64278fe8
...
@@ -305,7 +305,7 @@ struct dsaf_misc_op {
...
@@ -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 seri
s function, it will be reset if the derese
et is 0 */
/* reset seri
es function, it will be reset if the deres
et 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 {
...
@@ -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(
...
@@ -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
);
...
...
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
View file @
64278fe8
...
@@ -26,6 +26,8 @@ enum _dsm_rst_type {
...
@@ -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,
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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
;
}
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.h
View file @
64278fe8
...
@@ -34,5 +34,6 @@
...
@@ -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
drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
View file @
64278fe8
...
@@ -78,10 +78,10 @@
...
@@ -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
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment