18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/drivers/net/ethernet/ibm/ehea/ehea_hw.h 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * eHEA ethernet device driver for IBM eServer System p 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * (C) Copyright IBM Corp. 2006 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * Authors: 108c2ecf20Sopenharmony_ci * Christoph Raisch <raisch@de.ibm.com> 118c2ecf20Sopenharmony_ci * Jan-Bernd Themann <themann@de.ibm.com> 128c2ecf20Sopenharmony_ci * Thomas Klein <tklein@de.ibm.com> 138c2ecf20Sopenharmony_ci */ 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#ifndef __EHEA_HW_H__ 168c2ecf20Sopenharmony_ci#define __EHEA_HW_H__ 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#define QPX_SQA_VALUE EHEA_BMASK_IBM(48, 63) 198c2ecf20Sopenharmony_ci#define QPX_RQ1A_VALUE EHEA_BMASK_IBM(48, 63) 208c2ecf20Sopenharmony_ci#define QPX_RQ2A_VALUE EHEA_BMASK_IBM(48, 63) 218c2ecf20Sopenharmony_ci#define QPX_RQ3A_VALUE EHEA_BMASK_IBM(48, 63) 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#define QPTEMM_OFFSET(x) offsetof(struct ehea_qptemm, x) 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistruct ehea_qptemm { 268c2ecf20Sopenharmony_ci u64 qpx_hcr; 278c2ecf20Sopenharmony_ci u64 qpx_c; 288c2ecf20Sopenharmony_ci u64 qpx_herr; 298c2ecf20Sopenharmony_ci u64 qpx_aer; 308c2ecf20Sopenharmony_ci u64 qpx_sqa; 318c2ecf20Sopenharmony_ci u64 qpx_sqc; 328c2ecf20Sopenharmony_ci u64 qpx_rq1a; 338c2ecf20Sopenharmony_ci u64 qpx_rq1c; 348c2ecf20Sopenharmony_ci u64 qpx_st; 358c2ecf20Sopenharmony_ci u64 qpx_aerr; 368c2ecf20Sopenharmony_ci u64 qpx_tenure; 378c2ecf20Sopenharmony_ci u64 qpx_reserved1[(0x098 - 0x058) / 8]; 388c2ecf20Sopenharmony_ci u64 qpx_portp; 398c2ecf20Sopenharmony_ci u64 qpx_reserved2[(0x100 - 0x0A0) / 8]; 408c2ecf20Sopenharmony_ci u64 qpx_t; 418c2ecf20Sopenharmony_ci u64 qpx_sqhp; 428c2ecf20Sopenharmony_ci u64 qpx_sqptp; 438c2ecf20Sopenharmony_ci u64 qpx_reserved3[(0x140 - 0x118) / 8]; 448c2ecf20Sopenharmony_ci u64 qpx_sqwsize; 458c2ecf20Sopenharmony_ci u64 qpx_reserved4[(0x170 - 0x148) / 8]; 468c2ecf20Sopenharmony_ci u64 qpx_sqsize; 478c2ecf20Sopenharmony_ci u64 qpx_reserved5[(0x1B0 - 0x178) / 8]; 488c2ecf20Sopenharmony_ci u64 qpx_sigt; 498c2ecf20Sopenharmony_ci u64 qpx_wqecnt; 508c2ecf20Sopenharmony_ci u64 qpx_rq1hp; 518c2ecf20Sopenharmony_ci u64 qpx_rq1ptp; 528c2ecf20Sopenharmony_ci u64 qpx_rq1size; 538c2ecf20Sopenharmony_ci u64 qpx_reserved6[(0x220 - 0x1D8) / 8]; 548c2ecf20Sopenharmony_ci u64 qpx_rq1wsize; 558c2ecf20Sopenharmony_ci u64 qpx_reserved7[(0x240 - 0x228) / 8]; 568c2ecf20Sopenharmony_ci u64 qpx_pd; 578c2ecf20Sopenharmony_ci u64 qpx_scqn; 588c2ecf20Sopenharmony_ci u64 qpx_rcqn; 598c2ecf20Sopenharmony_ci u64 qpx_aeqn; 608c2ecf20Sopenharmony_ci u64 reserved49; 618c2ecf20Sopenharmony_ci u64 qpx_ram; 628c2ecf20Sopenharmony_ci u64 qpx_reserved8[(0x300 - 0x270) / 8]; 638c2ecf20Sopenharmony_ci u64 qpx_rq2a; 648c2ecf20Sopenharmony_ci u64 qpx_rq2c; 658c2ecf20Sopenharmony_ci u64 qpx_rq2hp; 668c2ecf20Sopenharmony_ci u64 qpx_rq2ptp; 678c2ecf20Sopenharmony_ci u64 qpx_rq2size; 688c2ecf20Sopenharmony_ci u64 qpx_rq2wsize; 698c2ecf20Sopenharmony_ci u64 qpx_rq2th; 708c2ecf20Sopenharmony_ci u64 qpx_rq3a; 718c2ecf20Sopenharmony_ci u64 qpx_rq3c; 728c2ecf20Sopenharmony_ci u64 qpx_rq3hp; 738c2ecf20Sopenharmony_ci u64 qpx_rq3ptp; 748c2ecf20Sopenharmony_ci u64 qpx_rq3size; 758c2ecf20Sopenharmony_ci u64 qpx_rq3wsize; 768c2ecf20Sopenharmony_ci u64 qpx_rq3th; 778c2ecf20Sopenharmony_ci u64 qpx_lpn; 788c2ecf20Sopenharmony_ci u64 qpx_reserved9[(0x400 - 0x378) / 8]; 798c2ecf20Sopenharmony_ci u64 reserved_ext[(0x500 - 0x400) / 8]; 808c2ecf20Sopenharmony_ci u64 reserved2[(0x1000 - 0x500) / 8]; 818c2ecf20Sopenharmony_ci}; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci#define MRx_HCR_LPARID_VALID EHEA_BMASK_IBM(0, 0) 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci#define MRMWMM_OFFSET(x) offsetof(struct ehea_mrmwmm, x) 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_cistruct ehea_mrmwmm { 888c2ecf20Sopenharmony_ci u64 mrx_hcr; 898c2ecf20Sopenharmony_ci u64 mrx_c; 908c2ecf20Sopenharmony_ci u64 mrx_herr; 918c2ecf20Sopenharmony_ci u64 mrx_aer; 928c2ecf20Sopenharmony_ci u64 mrx_pp; 938c2ecf20Sopenharmony_ci u64 reserved1; 948c2ecf20Sopenharmony_ci u64 reserved2; 958c2ecf20Sopenharmony_ci u64 reserved3; 968c2ecf20Sopenharmony_ci u64 reserved4[(0x200 - 0x40) / 8]; 978c2ecf20Sopenharmony_ci u64 mrx_ctl[64]; 988c2ecf20Sopenharmony_ci}; 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci#define QPEDMM_OFFSET(x) offsetof(struct ehea_qpedmm, x) 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_cistruct ehea_qpedmm { 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci u64 reserved0[(0x400) / 8]; 1058c2ecf20Sopenharmony_ci u64 qpedx_phh; 1068c2ecf20Sopenharmony_ci u64 qpedx_ppsgp; 1078c2ecf20Sopenharmony_ci u64 qpedx_ppsgu; 1088c2ecf20Sopenharmony_ci u64 qpedx_ppdgp; 1098c2ecf20Sopenharmony_ci u64 qpedx_ppdgu; 1108c2ecf20Sopenharmony_ci u64 qpedx_aph; 1118c2ecf20Sopenharmony_ci u64 qpedx_apsgp; 1128c2ecf20Sopenharmony_ci u64 qpedx_apsgu; 1138c2ecf20Sopenharmony_ci u64 qpedx_apdgp; 1148c2ecf20Sopenharmony_ci u64 qpedx_apdgu; 1158c2ecf20Sopenharmony_ci u64 qpedx_apav; 1168c2ecf20Sopenharmony_ci u64 qpedx_apsav; 1178c2ecf20Sopenharmony_ci u64 qpedx_hcr; 1188c2ecf20Sopenharmony_ci u64 reserved1[4]; 1198c2ecf20Sopenharmony_ci u64 qpedx_rrl0; 1208c2ecf20Sopenharmony_ci u64 qpedx_rrrkey0; 1218c2ecf20Sopenharmony_ci u64 qpedx_rrva0; 1228c2ecf20Sopenharmony_ci u64 reserved2; 1238c2ecf20Sopenharmony_ci u64 qpedx_rrl1; 1248c2ecf20Sopenharmony_ci u64 qpedx_rrrkey1; 1258c2ecf20Sopenharmony_ci u64 qpedx_rrva1; 1268c2ecf20Sopenharmony_ci u64 reserved3; 1278c2ecf20Sopenharmony_ci u64 qpedx_rrl2; 1288c2ecf20Sopenharmony_ci u64 qpedx_rrrkey2; 1298c2ecf20Sopenharmony_ci u64 qpedx_rrva2; 1308c2ecf20Sopenharmony_ci u64 reserved4; 1318c2ecf20Sopenharmony_ci u64 qpedx_rrl3; 1328c2ecf20Sopenharmony_ci u64 qpedx_rrrkey3; 1338c2ecf20Sopenharmony_ci u64 qpedx_rrva3; 1348c2ecf20Sopenharmony_ci}; 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci#define CQX_FECADDER EHEA_BMASK_IBM(32, 63) 1378c2ecf20Sopenharmony_ci#define CQX_FEC_CQE_CNT EHEA_BMASK_IBM(32, 63) 1388c2ecf20Sopenharmony_ci#define CQX_N1_GENERATE_COMP_EVENT EHEA_BMASK_IBM(0, 0) 1398c2ecf20Sopenharmony_ci#define CQX_EP_EVENT_PENDING EHEA_BMASK_IBM(0, 0) 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci#define CQTEMM_OFFSET(x) offsetof(struct ehea_cqtemm, x) 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_cistruct ehea_cqtemm { 1448c2ecf20Sopenharmony_ci u64 cqx_hcr; 1458c2ecf20Sopenharmony_ci u64 cqx_c; 1468c2ecf20Sopenharmony_ci u64 cqx_herr; 1478c2ecf20Sopenharmony_ci u64 cqx_aer; 1488c2ecf20Sopenharmony_ci u64 cqx_ptp; 1498c2ecf20Sopenharmony_ci u64 cqx_tp; 1508c2ecf20Sopenharmony_ci u64 cqx_fec; 1518c2ecf20Sopenharmony_ci u64 cqx_feca; 1528c2ecf20Sopenharmony_ci u64 cqx_ep; 1538c2ecf20Sopenharmony_ci u64 cqx_eq; 1548c2ecf20Sopenharmony_ci u64 reserved1; 1558c2ecf20Sopenharmony_ci u64 cqx_n0; 1568c2ecf20Sopenharmony_ci u64 cqx_n1; 1578c2ecf20Sopenharmony_ci u64 reserved2[(0x1000 - 0x60) / 8]; 1588c2ecf20Sopenharmony_ci}; 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci#define EQTEMM_OFFSET(x) offsetof(struct ehea_eqtemm, x) 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_cistruct ehea_eqtemm { 1638c2ecf20Sopenharmony_ci u64 eqx_hcr; 1648c2ecf20Sopenharmony_ci u64 eqx_c; 1658c2ecf20Sopenharmony_ci u64 eqx_herr; 1668c2ecf20Sopenharmony_ci u64 eqx_aer; 1678c2ecf20Sopenharmony_ci u64 eqx_ptp; 1688c2ecf20Sopenharmony_ci u64 eqx_tp; 1698c2ecf20Sopenharmony_ci u64 eqx_ssba; 1708c2ecf20Sopenharmony_ci u64 eqx_psba; 1718c2ecf20Sopenharmony_ci u64 eqx_cec; 1728c2ecf20Sopenharmony_ci u64 eqx_meql; 1738c2ecf20Sopenharmony_ci u64 eqx_xisbi; 1748c2ecf20Sopenharmony_ci u64 eqx_xisc; 1758c2ecf20Sopenharmony_ci u64 eqx_it; 1768c2ecf20Sopenharmony_ci}; 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci/* 1798c2ecf20Sopenharmony_ci * These access functions will be changed when the dissuccsion about 1808c2ecf20Sopenharmony_ci * the new access methods for POWER has settled. 1818c2ecf20Sopenharmony_ci */ 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_cistatic inline u64 epa_load(struct h_epa epa, u32 offset) 1848c2ecf20Sopenharmony_ci{ 1858c2ecf20Sopenharmony_ci return __raw_readq((void __iomem *)(epa.addr + offset)); 1868c2ecf20Sopenharmony_ci} 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_cistatic inline void epa_store(struct h_epa epa, u32 offset, u64 value) 1898c2ecf20Sopenharmony_ci{ 1908c2ecf20Sopenharmony_ci __raw_writeq(value, (void __iomem *)(epa.addr + offset)); 1918c2ecf20Sopenharmony_ci epa_load(epa, offset); /* synchronize explicitly to eHEA */ 1928c2ecf20Sopenharmony_ci} 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_cistatic inline void epa_store_acc(struct h_epa epa, u32 offset, u64 value) 1958c2ecf20Sopenharmony_ci{ 1968c2ecf20Sopenharmony_ci __raw_writeq(value, (void __iomem *)(epa.addr + offset)); 1978c2ecf20Sopenharmony_ci} 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci#define epa_store_cq(epa, offset, value)\ 2008c2ecf20Sopenharmony_ci epa_store(epa, CQTEMM_OFFSET(offset), value) 2018c2ecf20Sopenharmony_ci#define epa_load_cq(epa, offset)\ 2028c2ecf20Sopenharmony_ci epa_load(epa, CQTEMM_OFFSET(offset)) 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_cistatic inline void ehea_update_sqa(struct ehea_qp *qp, u16 nr_wqes) 2058c2ecf20Sopenharmony_ci{ 2068c2ecf20Sopenharmony_ci struct h_epa epa = qp->epas.kernel; 2078c2ecf20Sopenharmony_ci epa_store_acc(epa, QPTEMM_OFFSET(qpx_sqa), 2088c2ecf20Sopenharmony_ci EHEA_BMASK_SET(QPX_SQA_VALUE, nr_wqes)); 2098c2ecf20Sopenharmony_ci} 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_cistatic inline void ehea_update_rq3a(struct ehea_qp *qp, u16 nr_wqes) 2128c2ecf20Sopenharmony_ci{ 2138c2ecf20Sopenharmony_ci struct h_epa epa = qp->epas.kernel; 2148c2ecf20Sopenharmony_ci epa_store_acc(epa, QPTEMM_OFFSET(qpx_rq3a), 2158c2ecf20Sopenharmony_ci EHEA_BMASK_SET(QPX_RQ1A_VALUE, nr_wqes)); 2168c2ecf20Sopenharmony_ci} 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_cistatic inline void ehea_update_rq2a(struct ehea_qp *qp, u16 nr_wqes) 2198c2ecf20Sopenharmony_ci{ 2208c2ecf20Sopenharmony_ci struct h_epa epa = qp->epas.kernel; 2218c2ecf20Sopenharmony_ci epa_store_acc(epa, QPTEMM_OFFSET(qpx_rq2a), 2228c2ecf20Sopenharmony_ci EHEA_BMASK_SET(QPX_RQ2A_VALUE, nr_wqes)); 2238c2ecf20Sopenharmony_ci} 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_cistatic inline void ehea_update_rq1a(struct ehea_qp *qp, u16 nr_wqes) 2268c2ecf20Sopenharmony_ci{ 2278c2ecf20Sopenharmony_ci struct h_epa epa = qp->epas.kernel; 2288c2ecf20Sopenharmony_ci epa_store_acc(epa, QPTEMM_OFFSET(qpx_rq1a), 2298c2ecf20Sopenharmony_ci EHEA_BMASK_SET(QPX_RQ3A_VALUE, nr_wqes)); 2308c2ecf20Sopenharmony_ci} 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_cistatic inline void ehea_update_feca(struct ehea_cq *cq, u32 nr_cqes) 2338c2ecf20Sopenharmony_ci{ 2348c2ecf20Sopenharmony_ci struct h_epa epa = cq->epas.kernel; 2358c2ecf20Sopenharmony_ci epa_store_acc(epa, CQTEMM_OFFSET(cqx_feca), 2368c2ecf20Sopenharmony_ci EHEA_BMASK_SET(CQX_FECADDER, nr_cqes)); 2378c2ecf20Sopenharmony_ci} 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_cistatic inline void ehea_reset_cq_n1(struct ehea_cq *cq) 2408c2ecf20Sopenharmony_ci{ 2418c2ecf20Sopenharmony_ci struct h_epa epa = cq->epas.kernel; 2428c2ecf20Sopenharmony_ci epa_store_cq(epa, cqx_n1, 2438c2ecf20Sopenharmony_ci EHEA_BMASK_SET(CQX_N1_GENERATE_COMP_EVENT, 1)); 2448c2ecf20Sopenharmony_ci} 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_cistatic inline void ehea_reset_cq_ep(struct ehea_cq *my_cq) 2478c2ecf20Sopenharmony_ci{ 2488c2ecf20Sopenharmony_ci struct h_epa epa = my_cq->epas.kernel; 2498c2ecf20Sopenharmony_ci epa_store_acc(epa, CQTEMM_OFFSET(cqx_ep), 2508c2ecf20Sopenharmony_ci EHEA_BMASK_SET(CQX_EP_EVENT_PENDING, 0)); 2518c2ecf20Sopenharmony_ci} 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci#endif /* __EHEA_HW_H__ */ 254