xref: /linux/drivers/net/ethernet/hisilicon/hibmcge/hbg_hw.h (revision 60675d4ca1ef0857e44eba5849b74a3a998d0c0f)
1fc1992baSJijie Shao /* SPDX-License-Identifier: GPL-2.0+ */
2fc1992baSJijie Shao /* Copyright (c) 2024 Hisilicon Limited. */
3fc1992baSJijie Shao 
4fc1992baSJijie Shao #ifndef __HBG_HW_H
5fc1992baSJijie Shao #define __HBG_HW_H
6fc1992baSJijie Shao 
7fc1992baSJijie Shao #include <linux/bitfield.h>
8fc1992baSJijie Shao #include <linux/io-64-nonatomic-lo-hi.h>
9fc1992baSJijie Shao 
10fc1992baSJijie Shao static inline u32 hbg_reg_read(struct hbg_priv *priv, u32 addr)
11fc1992baSJijie Shao {
12fc1992baSJijie Shao 	return readl(priv->io_base + addr);
13fc1992baSJijie Shao }
14fc1992baSJijie Shao 
15fc1992baSJijie Shao static inline void hbg_reg_write(struct hbg_priv *priv, u32 addr, u32 value)
16fc1992baSJijie Shao {
17fc1992baSJijie Shao 	writel(value, priv->io_base + addr);
18fc1992baSJijie Shao }
19fc1992baSJijie Shao 
20fc1992baSJijie Shao static inline u64 hbg_reg_read64(struct hbg_priv *priv, u32 addr)
21fc1992baSJijie Shao {
22fc1992baSJijie Shao 	return lo_hi_readq(priv->io_base + addr);
23fc1992baSJijie Shao }
24fc1992baSJijie Shao 
25fc1992baSJijie Shao static inline void hbg_reg_write64(struct hbg_priv *priv, u32 addr, u64 value)
26fc1992baSJijie Shao {
27fc1992baSJijie Shao 	lo_hi_writeq(value, priv->io_base + addr);
28fc1992baSJijie Shao }
29fc1992baSJijie Shao 
30a239b2b1SJijie Shao #define hbg_reg_read_field(priv, addr, mask) \
31a239b2b1SJijie Shao 		FIELD_GET(mask, hbg_reg_read(priv, addr))
32a239b2b1SJijie Shao 
33a239b2b1SJijie Shao #define hbg_field_modify(reg_value, mask, value) ({	\
34a239b2b1SJijie Shao 		(reg_value) &= ~(mask);			\
35a239b2b1SJijie Shao 		(reg_value) |= FIELD_PREP(mask, value); })
36a239b2b1SJijie Shao 
37a239b2b1SJijie Shao #define hbg_reg_write_field(priv, addr, mask, val) ({		\
38a239b2b1SJijie Shao 		typeof(priv) _priv = (priv);			\
39a239b2b1SJijie Shao 		typeof(addr) _addr = (addr);			\
40a239b2b1SJijie Shao 		u32 _value = hbg_reg_read(_priv, _addr);	\
41a239b2b1SJijie Shao 		hbg_field_modify(_value, mask, val);		\
42a239b2b1SJijie Shao 		hbg_reg_write(_priv, _addr, _value); })
43a239b2b1SJijie Shao 
44fc1992baSJijie Shao int hbg_hw_event_notify(struct hbg_priv *priv,
45fc1992baSJijie Shao 			enum hbg_hw_event_type event_type);
46fc1992baSJijie Shao int hbg_hw_init(struct hbg_priv *priv);
47a239b2b1SJijie Shao void hbg_hw_adjust_link(struct hbg_priv *priv, u32 speed, u32 duplex);
484d089035SJijie Shao u32 hbg_hw_get_irq_status(struct hbg_priv *priv);
494d089035SJijie Shao void hbg_hw_irq_clear(struct hbg_priv *priv, u32 mask);
504d089035SJijie Shao bool hbg_hw_irq_is_enabled(struct hbg_priv *priv, u32 mask);
514d089035SJijie Shao void hbg_hw_irq_enable(struct hbg_priv *priv, u32 mask, bool enable);
52ff4edac6SJijie Shao void hbg_hw_set_mtu(struct hbg_priv *priv, u16 mtu);
53ff4edac6SJijie Shao void hbg_hw_mac_enable(struct hbg_priv *priv, u32 enable);
54ff4edac6SJijie Shao void hbg_hw_set_uc_addr(struct hbg_priv *priv, u64 mac_addr);
5540735e75SJijie Shao u32 hbg_hw_get_fifo_used_num(struct hbg_priv *priv, enum hbg_dir dir);
5640735e75SJijie Shao void hbg_hw_set_tx_desc(struct hbg_priv *priv, struct hbg_tx_desc *tx_desc);
57*f72e2559SJijie Shao void hbg_hw_fill_buffer(struct hbg_priv *priv, u32 buffer_dma_addr);
58fc1992baSJijie Shao 
59fc1992baSJijie Shao #endif
60