#ifndef _SYS_MC_US3I_H
#define _SYS_MC_US3I_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
#if defined(_KERNEL)
#define NDGRPS_PER_MC 2
#define NDIMMS_PER_DGRP 2
#define NLOGBANKS_PER_DGRP 2
#define NLOGBANKS_PER_MC 16
#define NLOGBANKS_PER_SEG 16
#define MAX_DEVLEN 8
#define TRANSFER_SIZE 64
#define MC_SELECT_MASK 0x3000000000LL
#define MC_SELECT_SHIFT 36
#define DIMM_PAIR_SELECT_MASK 0x200000000LL
#define DIMM_PAIR_SELECT_SHIFT 33
#define LOG_BANK_SELECT_MASK 0x100000000LL
#define LOG_BANK_SELECT_SHIFT 32
#define XOR_DEVICE_SELECT_MASK 0x200000LL
#define XOR_DEVICE_SELECT_SHIFT 21
#define XOR_BANK_SELECT_MASK 0x100000LL
#define XOR_BANK_SELECT_SHIFT 20
#define MC_SIZE_MAX 0x1000000000LL
#define DGRP_SIZE_MAX 0x200000000LL
#define BANK_SIZE_MAX 0x100000000LL
#define MC_BASE(id) (id * MC_SIZE_MAX)
#define DGRP_BASE(id) ((id & (NDGRPS_PER_MC - 1)) * DGRP_SIZE_MAX)
#define LOGBANK_BASE(id) ((id & (NLOGBANKS_PER_SEG - 1)) * BANK_SIZE_MAX)
#define ADDR_GEN_128Mb_X8_ROW_0 14
#define ADDR_GEN_512Mb_X8_ROW_0 15
#ifndef _ASM
struct mc_soft_state {
dev_info_t *dip;
int portid;
int mcr_read_ok;
uint64_t mcreg1;
int reglen;
void *reg;
int memlayoutlen;
void *memlayoutp;
};
struct memory_reg_info {
uint64_t base;
uint64_t size;
};
struct dimm_info {
char label[NDGRPS_PER_MC * NDIMMS_PER_DGRP][MAX_DEVLEN];
char table_width;
char data[1];
};
struct pin_info {
uchar_t dimmtable[18];
uchar_t pintable[144];
};
typedef struct mc_dlist {
struct mc_dlist *next;
struct mc_dlist *prev;
int id;
} mc_dlist_t;
struct seg_info {
mc_dlist_t seg_node;
int nbanks;
uint32_t ifactor;
uint64_t base;
uint64_t size;
struct bank_info *head;
struct bank_info *tail;
};
struct bank_info {
mc_dlist_t bank_node;
int local_id;
int seg_id;
int devgrp_id;
uint64_t mask;
uint64_t match;
uint64_t base;
uint64_t size;
struct bank_info *next;
};
struct device_info {
mc_dlist_t dev_node;
char label[MAX_DEVLEN];
uint64_t size;
};
struct dgrp_info {
mc_dlist_t dgrp_node;
int ndevices;
int nlogbanks;
int base_device;
int part_type;
uint64_t base;
uint64_t size;
int deviceids[NDIMMS_PER_DGRP];
};
struct mctrl_info {
mc_dlist_t mctrl_node;
int ndevgrps;
int devgrpids[NDGRPS_PER_MC];
struct dimm_info *dimminfop;
};
extern int (*p2get_mem_unum)(int, uint64_t, char *, int, int *);
extern int (*p2get_mem_info)(int, uint64_t, uint64_t *, uint64_t *,
uint64_t *, int *, int *, int *);
extern void plat_add_mem_unum_label(char *, int, int, int);
uint64_t get_mcr(int);
#include <sys/promif.h>
#define MC_ATTACH_DEBUG 0x00000001
#define MC_DETACH_DEBUG 0x00000002
#define MC_CMD_DEBUG 0x00000004
#define MC_REG_DEBUG 0x00000008
#define MC_GUNUM_DEBUG 0x00000010
#define MC_CNSTRC_DEBUG 0x00000020
#define MC_DESTRC_DEBUG 0x00000040
#define MC_LIST_DEBUG 0x00000080
#define _PRINTF printf
#define DPRINTF(flag, args) if (mc_debug & flag) _PRINTF args;
#else
#define DPRINTF(flag, args)
#endif
#define ASI_MCU_CTRL 0x72
#define MCREG1OFFSET 0x00
#define MCREG1_DIMM2_BANK3 0x8000000000000000ULL
#define MCREG1_DIMM1_BANK1 0x4000000000000000ULL
#define MCREG1_DIMM2_BANK2 0x2000000000000000ULL
#define MCREG1_DIMM1_BANK0 0x1000000000000000ULL
#define MCREG1_XOR_ENABLE 0x10000000000LL
#define MCREG1_ADDRGEN2_MASK 0xE000000000LL
#define MCREG1_ADDRGEN2_SHIFT 37
#define MCREG1_ADDRGEN1_MASK 0x1C00000000LL
#define MCREG1_ADDRGEN1_SHIFT 34
#define BASE_DEVICE_128Mb 0
#define BASE_DEVICE_256Mb 1
#define BASE_DEVICE_512Mb 2
#define BASE_DEVICE_1Gb 3
#define MCREG1_INTERLEAVE_MASK 0x1800000LL
#define MCREG1_INTERLEAVE_SHIFT 23
#define INTERLEAVE_DISABLE 0
#define INTERLEAVE_INTEXT_SAME_DIMM_PAIR 1
#define INTERLEAVE_INTERNAL 2
#define INTERLEAVE_INTEXT_BOTH_DIMM_PAIR 3
#define MCREG1_X4DIMM2_MASK 0x200000LL
#define MCREG1_X4DIMM2_SHIFT 21
#define MCREG1_X4DIMM1_MASK 0x100000LL
#define MCREG1_X4DIMM1_SHIFT 20
#define PART_TYPE_X4 1
#define PART_TYPE_X8 0
#endif
#ifdef __cplusplus
}
#endif
#endif