162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/drivers/net/ethernet/ibm/ehea/ehea_hw.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * eHEA ethernet device driver for IBM eServer System p 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * (C) Copyright IBM Corp. 2006 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * Authors: 1062306a36Sopenharmony_ci * Christoph Raisch <raisch@de.ibm.com> 1162306a36Sopenharmony_ci * Jan-Bernd Themann <themann@de.ibm.com> 1262306a36Sopenharmony_ci * Thomas Klein <tklein@de.ibm.com> 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#ifndef __EHEA_HW_H__ 1662306a36Sopenharmony_ci#define __EHEA_HW_H__ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define QPX_SQA_VALUE EHEA_BMASK_IBM(48, 63) 1962306a36Sopenharmony_ci#define QPX_RQ1A_VALUE EHEA_BMASK_IBM(48, 63) 2062306a36Sopenharmony_ci#define QPX_RQ2A_VALUE EHEA_BMASK_IBM(48, 63) 2162306a36Sopenharmony_ci#define QPX_RQ3A_VALUE EHEA_BMASK_IBM(48, 63) 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define QPTEMM_OFFSET(x) offsetof(struct ehea_qptemm, x) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistruct ehea_qptemm { 2662306a36Sopenharmony_ci u64 qpx_hcr; 2762306a36Sopenharmony_ci u64 qpx_c; 2862306a36Sopenharmony_ci u64 qpx_herr; 2962306a36Sopenharmony_ci u64 qpx_aer; 3062306a36Sopenharmony_ci u64 qpx_sqa; 3162306a36Sopenharmony_ci u64 qpx_sqc; 3262306a36Sopenharmony_ci u64 qpx_rq1a; 3362306a36Sopenharmony_ci u64 qpx_rq1c; 3462306a36Sopenharmony_ci u64 qpx_st; 3562306a36Sopenharmony_ci u64 qpx_aerr; 3662306a36Sopenharmony_ci u64 qpx_tenure; 3762306a36Sopenharmony_ci u64 qpx_reserved1[(0x098 - 0x058) / 8]; 3862306a36Sopenharmony_ci u64 qpx_portp; 3962306a36Sopenharmony_ci u64 qpx_reserved2[(0x100 - 0x0A0) / 8]; 4062306a36Sopenharmony_ci u64 qpx_t; 4162306a36Sopenharmony_ci u64 qpx_sqhp; 4262306a36Sopenharmony_ci u64 qpx_sqptp; 4362306a36Sopenharmony_ci u64 qpx_reserved3[(0x140 - 0x118) / 8]; 4462306a36Sopenharmony_ci u64 qpx_sqwsize; 4562306a36Sopenharmony_ci u64 qpx_reserved4[(0x170 - 0x148) / 8]; 4662306a36Sopenharmony_ci u64 qpx_sqsize; 4762306a36Sopenharmony_ci u64 qpx_reserved5[(0x1B0 - 0x178) / 8]; 4862306a36Sopenharmony_ci u64 qpx_sigt; 4962306a36Sopenharmony_ci u64 qpx_wqecnt; 5062306a36Sopenharmony_ci u64 qpx_rq1hp; 5162306a36Sopenharmony_ci u64 qpx_rq1ptp; 5262306a36Sopenharmony_ci u64 qpx_rq1size; 5362306a36Sopenharmony_ci u64 qpx_reserved6[(0x220 - 0x1D8) / 8]; 5462306a36Sopenharmony_ci u64 qpx_rq1wsize; 5562306a36Sopenharmony_ci u64 qpx_reserved7[(0x240 - 0x228) / 8]; 5662306a36Sopenharmony_ci u64 qpx_pd; 5762306a36Sopenharmony_ci u64 qpx_scqn; 5862306a36Sopenharmony_ci u64 qpx_rcqn; 5962306a36Sopenharmony_ci u64 qpx_aeqn; 6062306a36Sopenharmony_ci u64 reserved49; 6162306a36Sopenharmony_ci u64 qpx_ram; 6262306a36Sopenharmony_ci u64 qpx_reserved8[(0x300 - 0x270) / 8]; 6362306a36Sopenharmony_ci u64 qpx_rq2a; 6462306a36Sopenharmony_ci u64 qpx_rq2c; 6562306a36Sopenharmony_ci u64 qpx_rq2hp; 6662306a36Sopenharmony_ci u64 qpx_rq2ptp; 6762306a36Sopenharmony_ci u64 qpx_rq2size; 6862306a36Sopenharmony_ci u64 qpx_rq2wsize; 6962306a36Sopenharmony_ci u64 qpx_rq2th; 7062306a36Sopenharmony_ci u64 qpx_rq3a; 7162306a36Sopenharmony_ci u64 qpx_rq3c; 7262306a36Sopenharmony_ci u64 qpx_rq3hp; 7362306a36Sopenharmony_ci u64 qpx_rq3ptp; 7462306a36Sopenharmony_ci u64 qpx_rq3size; 7562306a36Sopenharmony_ci u64 qpx_rq3wsize; 7662306a36Sopenharmony_ci u64 qpx_rq3th; 7762306a36Sopenharmony_ci u64 qpx_lpn; 7862306a36Sopenharmony_ci u64 qpx_reserved9[(0x400 - 0x378) / 8]; 7962306a36Sopenharmony_ci u64 reserved_ext[(0x500 - 0x400) / 8]; 8062306a36Sopenharmony_ci u64 reserved2[(0x1000 - 0x500) / 8]; 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#define MRx_HCR_LPARID_VALID EHEA_BMASK_IBM(0, 0) 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define MRMWMM_OFFSET(x) offsetof(struct ehea_mrmwmm, x) 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistruct ehea_mrmwmm { 8862306a36Sopenharmony_ci u64 mrx_hcr; 8962306a36Sopenharmony_ci u64 mrx_c; 9062306a36Sopenharmony_ci u64 mrx_herr; 9162306a36Sopenharmony_ci u64 mrx_aer; 9262306a36Sopenharmony_ci u64 mrx_pp; 9362306a36Sopenharmony_ci u64 reserved1; 9462306a36Sopenharmony_ci u64 reserved2; 9562306a36Sopenharmony_ci u64 reserved3; 9662306a36Sopenharmony_ci u64 reserved4[(0x200 - 0x40) / 8]; 9762306a36Sopenharmony_ci u64 mrx_ctl[64]; 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#define QPEDMM_OFFSET(x) offsetof(struct ehea_qpedmm, x) 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistruct ehea_qpedmm { 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci u64 reserved0[(0x400) / 8]; 10562306a36Sopenharmony_ci u64 qpedx_phh; 10662306a36Sopenharmony_ci u64 qpedx_ppsgp; 10762306a36Sopenharmony_ci u64 qpedx_ppsgu; 10862306a36Sopenharmony_ci u64 qpedx_ppdgp; 10962306a36Sopenharmony_ci u64 qpedx_ppdgu; 11062306a36Sopenharmony_ci u64 qpedx_aph; 11162306a36Sopenharmony_ci u64 qpedx_apsgp; 11262306a36Sopenharmony_ci u64 qpedx_apsgu; 11362306a36Sopenharmony_ci u64 qpedx_apdgp; 11462306a36Sopenharmony_ci u64 qpedx_apdgu; 11562306a36Sopenharmony_ci u64 qpedx_apav; 11662306a36Sopenharmony_ci u64 qpedx_apsav; 11762306a36Sopenharmony_ci u64 qpedx_hcr; 11862306a36Sopenharmony_ci u64 reserved1[4]; 11962306a36Sopenharmony_ci u64 qpedx_rrl0; 12062306a36Sopenharmony_ci u64 qpedx_rrrkey0; 12162306a36Sopenharmony_ci u64 qpedx_rrva0; 12262306a36Sopenharmony_ci u64 reserved2; 12362306a36Sopenharmony_ci u64 qpedx_rrl1; 12462306a36Sopenharmony_ci u64 qpedx_rrrkey1; 12562306a36Sopenharmony_ci u64 qpedx_rrva1; 12662306a36Sopenharmony_ci u64 reserved3; 12762306a36Sopenharmony_ci u64 qpedx_rrl2; 12862306a36Sopenharmony_ci u64 qpedx_rrrkey2; 12962306a36Sopenharmony_ci u64 qpedx_rrva2; 13062306a36Sopenharmony_ci u64 reserved4; 13162306a36Sopenharmony_ci u64 qpedx_rrl3; 13262306a36Sopenharmony_ci u64 qpedx_rrrkey3; 13362306a36Sopenharmony_ci u64 qpedx_rrva3; 13462306a36Sopenharmony_ci}; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci#define CQX_FECADDER EHEA_BMASK_IBM(32, 63) 13762306a36Sopenharmony_ci#define CQX_FEC_CQE_CNT EHEA_BMASK_IBM(32, 63) 13862306a36Sopenharmony_ci#define CQX_N1_GENERATE_COMP_EVENT EHEA_BMASK_IBM(0, 0) 13962306a36Sopenharmony_ci#define CQX_EP_EVENT_PENDING EHEA_BMASK_IBM(0, 0) 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci#define CQTEMM_OFFSET(x) offsetof(struct ehea_cqtemm, x) 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistruct ehea_cqtemm { 14462306a36Sopenharmony_ci u64 cqx_hcr; 14562306a36Sopenharmony_ci u64 cqx_c; 14662306a36Sopenharmony_ci u64 cqx_herr; 14762306a36Sopenharmony_ci u64 cqx_aer; 14862306a36Sopenharmony_ci u64 cqx_ptp; 14962306a36Sopenharmony_ci u64 cqx_tp; 15062306a36Sopenharmony_ci u64 cqx_fec; 15162306a36Sopenharmony_ci u64 cqx_feca; 15262306a36Sopenharmony_ci u64 cqx_ep; 15362306a36Sopenharmony_ci u64 cqx_eq; 15462306a36Sopenharmony_ci u64 reserved1; 15562306a36Sopenharmony_ci u64 cqx_n0; 15662306a36Sopenharmony_ci u64 cqx_n1; 15762306a36Sopenharmony_ci u64 reserved2[(0x1000 - 0x60) / 8]; 15862306a36Sopenharmony_ci}; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci#define EQTEMM_OFFSET(x) offsetof(struct ehea_eqtemm, x) 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cistruct ehea_eqtemm { 16362306a36Sopenharmony_ci u64 eqx_hcr; 16462306a36Sopenharmony_ci u64 eqx_c; 16562306a36Sopenharmony_ci u64 eqx_herr; 16662306a36Sopenharmony_ci u64 eqx_aer; 16762306a36Sopenharmony_ci u64 eqx_ptp; 16862306a36Sopenharmony_ci u64 eqx_tp; 16962306a36Sopenharmony_ci u64 eqx_ssba; 17062306a36Sopenharmony_ci u64 eqx_psba; 17162306a36Sopenharmony_ci u64 eqx_cec; 17262306a36Sopenharmony_ci u64 eqx_meql; 17362306a36Sopenharmony_ci u64 eqx_xisbi; 17462306a36Sopenharmony_ci u64 eqx_xisc; 17562306a36Sopenharmony_ci u64 eqx_it; 17662306a36Sopenharmony_ci}; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci/* 17962306a36Sopenharmony_ci * These access functions will be changed when the dissuccsion about 18062306a36Sopenharmony_ci * the new access methods for POWER has settled. 18162306a36Sopenharmony_ci */ 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistatic inline u64 epa_load(struct h_epa epa, u32 offset) 18462306a36Sopenharmony_ci{ 18562306a36Sopenharmony_ci return __raw_readq((void __iomem *)(epa.addr + offset)); 18662306a36Sopenharmony_ci} 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistatic inline void epa_store(struct h_epa epa, u32 offset, u64 value) 18962306a36Sopenharmony_ci{ 19062306a36Sopenharmony_ci __raw_writeq(value, (void __iomem *)(epa.addr + offset)); 19162306a36Sopenharmony_ci epa_load(epa, offset); /* synchronize explicitly to eHEA */ 19262306a36Sopenharmony_ci} 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_cistatic inline void epa_store_acc(struct h_epa epa, u32 offset, u64 value) 19562306a36Sopenharmony_ci{ 19662306a36Sopenharmony_ci __raw_writeq(value, (void __iomem *)(epa.addr + offset)); 19762306a36Sopenharmony_ci} 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci#define epa_store_cq(epa, offset, value)\ 20062306a36Sopenharmony_ci epa_store(epa, CQTEMM_OFFSET(offset), value) 20162306a36Sopenharmony_ci#define epa_load_cq(epa, offset)\ 20262306a36Sopenharmony_ci epa_load(epa, CQTEMM_OFFSET(offset)) 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cistatic inline void ehea_update_sqa(struct ehea_qp *qp, u16 nr_wqes) 20562306a36Sopenharmony_ci{ 20662306a36Sopenharmony_ci struct h_epa epa = qp->epas.kernel; 20762306a36Sopenharmony_ci epa_store_acc(epa, QPTEMM_OFFSET(qpx_sqa), 20862306a36Sopenharmony_ci EHEA_BMASK_SET(QPX_SQA_VALUE, nr_wqes)); 20962306a36Sopenharmony_ci} 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cistatic inline void ehea_update_rq3a(struct ehea_qp *qp, u16 nr_wqes) 21262306a36Sopenharmony_ci{ 21362306a36Sopenharmony_ci struct h_epa epa = qp->epas.kernel; 21462306a36Sopenharmony_ci epa_store_acc(epa, QPTEMM_OFFSET(qpx_rq3a), 21562306a36Sopenharmony_ci EHEA_BMASK_SET(QPX_RQ1A_VALUE, nr_wqes)); 21662306a36Sopenharmony_ci} 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_cistatic inline void ehea_update_rq2a(struct ehea_qp *qp, u16 nr_wqes) 21962306a36Sopenharmony_ci{ 22062306a36Sopenharmony_ci struct h_epa epa = qp->epas.kernel; 22162306a36Sopenharmony_ci epa_store_acc(epa, QPTEMM_OFFSET(qpx_rq2a), 22262306a36Sopenharmony_ci EHEA_BMASK_SET(QPX_RQ2A_VALUE, nr_wqes)); 22362306a36Sopenharmony_ci} 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_cistatic inline void ehea_update_rq1a(struct ehea_qp *qp, u16 nr_wqes) 22662306a36Sopenharmony_ci{ 22762306a36Sopenharmony_ci struct h_epa epa = qp->epas.kernel; 22862306a36Sopenharmony_ci epa_store_acc(epa, QPTEMM_OFFSET(qpx_rq1a), 22962306a36Sopenharmony_ci EHEA_BMASK_SET(QPX_RQ3A_VALUE, nr_wqes)); 23062306a36Sopenharmony_ci} 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_cistatic inline void ehea_update_feca(struct ehea_cq *cq, u32 nr_cqes) 23362306a36Sopenharmony_ci{ 23462306a36Sopenharmony_ci struct h_epa epa = cq->epas.kernel; 23562306a36Sopenharmony_ci epa_store_acc(epa, CQTEMM_OFFSET(cqx_feca), 23662306a36Sopenharmony_ci EHEA_BMASK_SET(CQX_FECADDER, nr_cqes)); 23762306a36Sopenharmony_ci} 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_cistatic inline void ehea_reset_cq_n1(struct ehea_cq *cq) 24062306a36Sopenharmony_ci{ 24162306a36Sopenharmony_ci struct h_epa epa = cq->epas.kernel; 24262306a36Sopenharmony_ci epa_store_cq(epa, cqx_n1, 24362306a36Sopenharmony_ci EHEA_BMASK_SET(CQX_N1_GENERATE_COMP_EVENT, 1)); 24462306a36Sopenharmony_ci} 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_cistatic inline void ehea_reset_cq_ep(struct ehea_cq *my_cq) 24762306a36Sopenharmony_ci{ 24862306a36Sopenharmony_ci struct h_epa epa = my_cq->epas.kernel; 24962306a36Sopenharmony_ci epa_store_acc(epa, CQTEMM_OFFSET(cqx_ep), 25062306a36Sopenharmony_ci EHEA_BMASK_SET(CQX_EP_EVENT_PENDING, 0)); 25162306a36Sopenharmony_ci} 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci#endif /* __EHEA_HW_H__ */ 254