xref: /dpdk/drivers/net/atlantic/atl_hw_regs.c (revision cab05c5302633bc339b5944e74423f5691f53f78)
1*cab05c53SIgor Russkikh // SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2*cab05c53SIgor Russkikh /* Copyright (C) 2014-2017 aQuantia Corporation. */
3*cab05c53SIgor Russkikh 
4*cab05c53SIgor Russkikh /* File aq_hw_utils.c: Definitions of helper functions used across
5*cab05c53SIgor Russkikh  * hardware layer.
6*cab05c53SIgor Russkikh  */
7*cab05c53SIgor Russkikh 
8*cab05c53SIgor Russkikh #include "atl_hw_regs.h"
9*cab05c53SIgor Russkikh 
10*cab05c53SIgor Russkikh #include <rte_io.h>
11*cab05c53SIgor Russkikh #include <rte_byteorder.h>
12*cab05c53SIgor Russkikh 
aq_hw_write_reg_bit(struct aq_hw_s * aq_hw,u32 addr,u32 msk,u32 shift,u32 val)13*cab05c53SIgor Russkikh void aq_hw_write_reg_bit(struct aq_hw_s *aq_hw, u32 addr, u32 msk,
14*cab05c53SIgor Russkikh 			 u32 shift, u32 val)
15*cab05c53SIgor Russkikh {
16*cab05c53SIgor Russkikh 	if (msk ^ ~0) {
17*cab05c53SIgor Russkikh 		u32 reg_old, reg_new;
18*cab05c53SIgor Russkikh 
19*cab05c53SIgor Russkikh 		reg_old = aq_hw_read_reg(aq_hw, addr);
20*cab05c53SIgor Russkikh 		reg_new = (reg_old & (~msk)) | (val << shift);
21*cab05c53SIgor Russkikh 
22*cab05c53SIgor Russkikh 		if (reg_old != reg_new)
23*cab05c53SIgor Russkikh 			aq_hw_write_reg(aq_hw, addr, reg_new);
24*cab05c53SIgor Russkikh 	} else {
25*cab05c53SIgor Russkikh 		aq_hw_write_reg(aq_hw, addr, val);
26*cab05c53SIgor Russkikh 	}
27*cab05c53SIgor Russkikh }
28*cab05c53SIgor Russkikh 
aq_hw_read_reg_bit(struct aq_hw_s * aq_hw,u32 addr,u32 msk,u32 shift)29*cab05c53SIgor Russkikh u32 aq_hw_read_reg_bit(struct aq_hw_s *aq_hw, u32 addr, u32 msk, u32 shift)
30*cab05c53SIgor Russkikh {
31*cab05c53SIgor Russkikh 	return ((aq_hw_read_reg(aq_hw, addr) & msk) >> shift);
32*cab05c53SIgor Russkikh }
33*cab05c53SIgor Russkikh 
aq_hw_read_reg(struct aq_hw_s * hw,u32 reg)34*cab05c53SIgor Russkikh u32 aq_hw_read_reg(struct aq_hw_s *hw, u32 reg)
35*cab05c53SIgor Russkikh {
36*cab05c53SIgor Russkikh 	return rte_le_to_cpu_32(rte_read32((u8 *)hw->mmio + reg));
37*cab05c53SIgor Russkikh }
38*cab05c53SIgor Russkikh 
aq_hw_write_reg(struct aq_hw_s * hw,u32 reg,u32 value)39*cab05c53SIgor Russkikh void aq_hw_write_reg(struct aq_hw_s *hw, u32 reg, u32 value)
40*cab05c53SIgor Russkikh {
41*cab05c53SIgor Russkikh 	rte_write32((rte_cpu_to_le_32(value)), (u8 *)hw->mmio + reg);
42*cab05c53SIgor Russkikh }
43*cab05c53SIgor Russkikh 
aq_hw_err_from_flags(struct aq_hw_s * hw)44*cab05c53SIgor Russkikh int aq_hw_err_from_flags(struct aq_hw_s *hw)
45*cab05c53SIgor Russkikh {
46*cab05c53SIgor Russkikh 	int err = 0;
47*cab05c53SIgor Russkikh 
48*cab05c53SIgor Russkikh 	if (aq_hw_read_reg(hw, 0x10U) == ~0U)
49*cab05c53SIgor Russkikh 		return -ENXIO;
50*cab05c53SIgor Russkikh 
51*cab05c53SIgor Russkikh 	return err;
52*cab05c53SIgor Russkikh }
53