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