1*91c6945eSHariprasad Kelam // SPDX-License-Identifier: GPL-2.0
2*91c6945eSHariprasad Kelam /*  Marvell OcteonTx2 RPM driver
3*91c6945eSHariprasad Kelam  *
4*91c6945eSHariprasad Kelam  * Copyright (C) 2020 Marvell.
5*91c6945eSHariprasad Kelam  *
6*91c6945eSHariprasad Kelam  */
7*91c6945eSHariprasad Kelam 
8*91c6945eSHariprasad Kelam #include "cgx.h"
9*91c6945eSHariprasad Kelam #include "lmac_common.h"
10*91c6945eSHariprasad Kelam 
11*91c6945eSHariprasad Kelam static struct mac_ops	rpm_mac_ops   = {
12*91c6945eSHariprasad Kelam 	.name		=       "rpm",
13*91c6945eSHariprasad Kelam 	.csr_offset     =       0x4e00,
14*91c6945eSHariprasad Kelam 	.lmac_offset    =       20,
15*91c6945eSHariprasad Kelam 	.int_register	=       RPMX_CMRX_SW_INT,
16*91c6945eSHariprasad Kelam 	.int_set_reg    =       RPMX_CMRX_SW_INT_ENA_W1S,
17*91c6945eSHariprasad Kelam 	.irq_offset     =       1,
18*91c6945eSHariprasad Kelam 	.int_ena_bit    =       BIT_ULL(0),
19*91c6945eSHariprasad Kelam 	.lmac_fwi	=	RPM_LMAC_FWI,
20*91c6945eSHariprasad Kelam 	.non_contiguous_serdes_lane = true,
21*91c6945eSHariprasad Kelam 	.get_nr_lmacs	=	rpm_get_nr_lmacs,
22*91c6945eSHariprasad Kelam };
23*91c6945eSHariprasad Kelam 
24*91c6945eSHariprasad Kelam struct mac_ops *rpm_get_mac_ops(void)
25*91c6945eSHariprasad Kelam {
26*91c6945eSHariprasad Kelam 	return &rpm_mac_ops;
27*91c6945eSHariprasad Kelam }
28*91c6945eSHariprasad Kelam 
29*91c6945eSHariprasad Kelam static u64 rpm_read(rpm_t *rpm, u64 lmac, u64 offset)
30*91c6945eSHariprasad Kelam {
31*91c6945eSHariprasad Kelam 	return	cgx_read(rpm, lmac, offset);
32*91c6945eSHariprasad Kelam }
33*91c6945eSHariprasad Kelam 
34*91c6945eSHariprasad Kelam int rpm_get_nr_lmacs(void *rpmd)
35*91c6945eSHariprasad Kelam {
36*91c6945eSHariprasad Kelam 	rpm_t *rpm = rpmd;
37*91c6945eSHariprasad Kelam 
38*91c6945eSHariprasad Kelam 	return hweight8(rpm_read(rpm, 0, CGXX_CMRX_RX_LMACS) & 0xFULL);
39*91c6945eSHariprasad Kelam }
40