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