#ifndef _MCAMD_ROWCOL_IMPL_H
#define _MCAMD_ROWCOL_IMPL_H
#include <mcamd_api.h>
#include <sys/mc_amd.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MC_PC_COLADDRBIT 10
#define MC_PC_ALL -1
#define MC_CS_SCALE (1024 * 1024)
#define MC_CS_SIZE(bam, width) \
((size_t)bam->bam_sizemb * MC_CS_SCALE * ((width) == 128 ? 2 : 1))
#define MC_CS_MODE(csbmap, csnum) \
(csbmap >> MC_CHIP_DIMMPAIR(csnum) * MC_DC_BAM_CSBANK_SHIFT & \
MC_DC_BAM_CSBANK_MASK)
#define BIT(val, num) ((val) & 1ULL << num)
#define BITS(val, high, low) \
((val) & (((2ULL << (high)) - 1) & ~((1ULL << (low)) - 1)))
#define SETBIT(var, num) (var |= (1ULL << (num)))
#define BITVAL(var, num) ((BIT(var, num) >> (num)) & 1ULL)
#define MC_RC_ROW_MAX 16
#define MC_RC_COL_MAX 12
#define MC_RC_BANKBITS_MAX 3
#define MC_RC_CSMODES 16
#define MC_RC_SWZLBITS 2
struct rct_bnkaddrmode {
int bam_sizemb;
int bam_nrows;
int bam_ncols;
int bam_ambig;
};
struct rct_rcbmap {
int rcb_nbankbits;
int rcb_bankbit[MC_RC_BANKBITS_MAX];
int rcb_rowbit[MC_RC_ROW_MAX];
int rcb_colbit[MC_RC_COL_MAX + 1];
};
struct rct_bnkswzlinfo {
int bswz_rowbits[MC_RC_BANKBITS_MAX][MC_RC_SWZLBITS];
};
struct rct_csintlv {
int csi_factor;
int csi_hibit;
int csi_lobit;
int csi_nbits;
};
#define MC_RC_CSI_SWAPPED_BIT(csidp, n) \
(csidp->csi_factor && n >= csidp->csi_lobit && \
n <= csidp->csi_lobit + csidp->csi_nbits - 1)
#define MC_RC_CSI_BITSWAP(csidp, n) \
(csidp->csi_hibit + n - csidp->csi_lobit)
extern const struct rct_bnkaddrmode *rct_bnkaddrmode(uint_t, uint_t);
extern const struct rct_rcbmap *rct_rcbmap(uint_t, int, uint_t);
extern const struct rct_bnkswzlinfo *rct_bnkswzlinfo(uint_t, int);
extern void rct_csintlv_bits(uint_t, int, uint_t, int, struct rct_csintlv *);
#ifdef __cplusplus
}
#endif
#endif