#ifndef _SYS_AC_H
#define _SYS_AC_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
#define AC_ATTACH_DEBUG 0x1
#define AC_REGISTERS_DEBUG 0x2
#define AC_OFFSET 0x00001000000ull
#define AC_CENTRAL 0x80000000
#define AC_ARB_FAST 0x00002000
#define AC_BCSR(board) (FHC_BOARD_BASE(2*(board)) + FHC_OFFSET + \
AC_OFFSET + AC_OFF_BCSR)
#define AC_OFF_BRCS 0x10
#define AC_OFF_BCSR 0x20
#define AC_OFF_ESR 0x30
#define AC_OFF_EMR 0x40
#define AC_OFF_MEMCTL 0x60
#define AC_OFF_MEMDEC0 0x70
#define AC_OFF_MEMDEC1 0x80
#define AC_OFF_UPA0 0x2000
#define AC_OFF_UPA1 0x4000
#define AC_OFF_CNTR 0x6000
#define AC_OFF_MCCR 0x6020
#define AC_KSTAT_NAME "address_controller"
#define MEMCTL_KSTAT_NAMED "acmemctl"
#define MEMDECODE0_KSTAT_NAMED "acmemdecode0"
#define MEMDECODE1_KSTAT_NAMED "acmemdecode1"
#define CNTR_KSTAT_NAMED "accounter"
#define MCCR_KSTAT_NAMED "acmccr"
#define BANK_0_KSTAT_NAMED "acbank0"
#define BANK_1_KSTAT_NAMED "acbank1"
#define AC_NUM_PICS 2
#define AC_COUNTER_TO_PIC0(CNTR) ((CNTR) & 0xFFFFFFFFULL)
#define AC_COUNTER_TO_PIC1(CNTR) ((CNTR) >> 32)
#define AC_CLEAR_PCR(PCR) ((PCR) & ~(0x3F3F))
#define AC_SET_HOT_PLUG(PCR) ((PCR) | (0x3F3F))
#define AC_SET_PIC_BUS_PAUSE(BRD) (0x80000000LL - 0x9ac4 - ((BRD) << 3))
#define NO_CACHE 0
#define CACHE_512K 2
#define CACHE_1M 3
#define CACHE_2M 4
#define CACHE_4M 5
#define CACHE_8M 6
#define CACHE_16M 7
#define ARB_MASTER 0x8000
#define ARB_INIT 0x4000
#define ARB_FAST 0x2000
#define FTC_CPAR 0x0200
#define AC_CSR_REFEN (1ULL << 27)
#define AC_MEM_VALID 0x8000000000000000ULL
#define RASIZE0(memctl) (8 << ((((memctl) >> 8) & 0x7) << 1))
#define RASIZE1(memctl) (8 << ((((memctl) >> 11) & 0x7) << 1))
#define RATBL0(memctl) (((memctl) >> 8) & 0x7)
#define RATBL1(memctl) (((memctl) >> 11) & 0x7)
#define INTLV0(memctl) (1 << ((memctl) & 0x7))
#define INTLV1(memctl) (1 << (((memctl) >> 3) & 0x7))
#define INTVAL0(memctl) ((memctl) & 0x7)
#define INTVAL1(memctl) (((memctl) >> 3) & 0x7)
#define GRP_UK(memdec) (((memdec) >> 39) & 0xFFF)
#define GRP_UM(memdec) (((memdec) >> 12) & 0x7FFF)
#define GRP_BASE(memdec) (GRP_UM(memdec) & ~(GRP_UK(memdec)))
#define GRP_LK(memdec) (((memdec) >> 6) & 0xf)
#define GRP_LM(memdec) ((memdec) & 0xf)
#define GRP_LBASE(memdec) (GRP_LM(memdec) & ~(GRP_LK(memdec)))
#define GRP_REALBASE(m) ((GRP_BASE(m) << 26) | (GRP_LBASE(m) << 6))
#define GRP_UK2SPAN(memdec) ((GRP_UK(memdec) + 1) << 26)
#define GRP_SPANMB(memdec) (GRP_UK2SPAN(memdec) >> 20)
enum ac_bank_id { Bank0 = 0, Bank1 = 1 };
enum ac_bank_status { StUnknown = 0, StNoMem, StBad, StActive, StSpare };
enum ac_bank_condition { ConUnknown = 0, ConOK, ConFailing, ConFailed,
ConTest, ConBad };
#define AC_IOC ('G'<<8)
#define AC_MEM_ADMIN_VER (AC_IOC|0)
#define AC_MEM_CONFIGURE (AC_IOC|1)
#define AC_MEM_UNCONFIGURE (AC_IOC|2)
#define AC_MEM_STAT (AC_IOC|3)
#define AC_MEM_TEST_START (AC_IOC|4)
#define AC_MEM_TEST_STOP (AC_IOC|5)
#define AC_MEM_TEST_READ (AC_IOC|6)
#define AC_MEM_TEST_WRITE (AC_IOC|7)
#define AC_MEM_EXERCISE (AC_IOC|128)
#define AC_OUTPUT_LEN MAXPATHLEN
typedef enum {
AC_ERR_DEFAULT = 0,
AC_ERR_INTRANS,
AC_ERR_UTHREAD,
AC_ERR_KTHREAD,
AC_ERR_SUSPEND,
AC_ERR_RESUME,
AC_ERR_POWER,
AC_ERR_COOLING,
AC_ERR_PRECHARGE,
AC_ERR_HOTPLUG,
AC_ERR_HW_COMPAT,
AC_ERR_NON_DR_PROM,
AC_ERR_CORE_RESOURCE,
AC_ERR_PROM,
AC_ERR_DR_INIT,
AC_ERR_NDI_ATTACH,
AC_ERR_NDI_DETACH,
AC_ERR_RSTATE,
AC_ERR_OSTATE,
AC_ERR_COND,
AC_ERR_BD,
AC_ERR_BD_TYPE,
AC_ERR_BD_STATE,
AC_ERR_MEM_PERM,
AC_ERR_MEM_BK,
AC_ERR_MEM_TEST,
AC_ERR_MEM_TEST_PAR,
AC_ERR_KPM_CANCELLED,
AC_ERR_KPM_REFUSED,
AC_ERR_KPM_SPAN,
AC_ERR_KPM_DUP,
AC_ERR_KPM_FAULT,
AC_ERR_KPM_RESOURCE,
AC_ERR_KPM_NOTSUP,
AC_ERR_KPM_NOHANDLES,
AC_ERR_KPM_NONRELOC,
AC_ERR_KPM_HANDLE,
AC_ERR_KPM_BUSY,
AC_ERR_KPM_NOTVIABLE,
AC_ERR_KPM_SEQUENCE,
AC_ERR_KPM_NOWORK,
AC_ERR_KPM_NOTFINISHED,
AC_ERR_KPM_NOTRUNNING,
AC_ERR_VMEM,
AC_ERR_INTR,
AC_ERR_TIMEOUT,
AC_ERR_MEM_DEINTLV
} ac_err_t;
typedef struct ac_cfga_cmd {
uint_t force:1;
uint_t test:1;
int arg;
ac_err_t errtype;
char *outputstr;
void *private;
} ac_cfga_cmd_t;
typedef struct ac_cfga_cmd32 {
uint_t force:1;
uint_t test:1;
int arg;
ac_err_t errtype;
caddr32_t outputstr;
caddr32_t private;
} ac_cfga_cmd32_t;
typedef uint_t ac_mem_version_t;
#define AC_MEM_ADMIN_VERSION 1
typedef uint_t mem_test_handle_t;
typedef struct {
uint64_t module_id;
uint64_t afsr;
uint64_t afar;
uint64_t udbh_error_reg;
uint64_t udbl_error_reg;
} sunfire_processor_error_regs_t;
typedef struct {
mem_test_handle_t handle;
pid_t tester_pid;
sysc_cfga_cond_t prev_condition;
u_longlong_t bank_size;
uint_t page_size;
uint_t line_size;
u_longlong_t afar_base;
} ac_mem_test_start_t;
typedef struct {
mem_test_handle_t handle;
sysc_cfga_cond_t condition;
} ac_mem_test_stop_t;
typedef struct {
u_longlong_t page_num;
uint_t line_offset;
uint_t line_count;
} ac_test_addr_t;
typedef struct {
mem_test_handle_t handle;
void *page_buf;
ac_test_addr_t address;
sunfire_processor_error_regs_t *error_buf;
} ac_mem_test_read_t;
typedef struct {
mem_test_handle_t handle;
void *page_buf;
ac_test_addr_t address;
} ac_mem_test_write_t;
#ifdef _SYSCALL32
typedef struct {
mem_test_handle_t handle;
caddr32_t page_buf;
ac_test_addr_t address;
caddr32_t error_buf;
} ac_mem_test_read32_t;
typedef struct {
mem_test_handle_t handle;
caddr32_t page_buf;
ac_test_addr_t address;
} ac_mem_test_write32_t;
#endif
typedef struct {
sysc_cfga_rstate_t rstate;
sysc_cfga_ostate_t ostate;
sysc_cfga_cond_t condition;
time_t status_time;
uint_t board;
uint_t real_size;
uint_t use_size;
uint_t busy;
uint_t page_size;
uint64_t phys_pages;
uint64_t managed;
uint64_t nonrelocatable;
uint64_t ac_memctl;
uint64_t ac_decode0;
uint64_t ac_decode1;
} ac_stat_t;
#ifdef _SYSCALL32
typedef struct {
sysc_cfga_rstate_t rstate;
sysc_cfga_ostate_t ostate;
sysc_cfga_cond_t condition;
time32_t status_time;
uint_t board;
uint_t real_size;
uint_t use_size;
uint_t busy;
uint_t page_size;
uint64_t phys_pages;
uint64_t managed;
uint64_t nonrelocatable;
uint64_t ac_memctl;
uint64_t ac_decode0;
uint64_t ac_decode1;
} ac_stat32_t;
#endif
#define AC_MEMX_RELOCATE_ALL 0
struct ac_memx_relocate_stats {
uint_t base;
uint_t npgs;
uint_t nopaget;
uint_t nolock;
uint_t isfree;
uint_t reloc;
uint_t noreloc;
};
#if defined(_KERNEL)
typedef struct {
ac_cfga_cmd_t cmd_cfga;
char *errbuf;
struct ac_soft_state *softsp;
uint_t bank;
} ac_cfga_pkt_t;
#define AC_ERR_SET(pkt, err) (pkt)->cmd_cfga.errtype = (err)
#define MEM_BOARD_VISIBLE(BD) \
((BD)->sc.rstate == SYSC_CFGA_RSTATE_CONNECTED && \
(BD)->sc.ostate == SYSC_CFGA_OSTATE_CONFIGURED)
#ifndef TRUE
#define TRUE (1)
#endif
#ifndef FALSE
#define FALSE (0)
#endif
#define AC_BANK0_STATUS "bank-0-status"
#define AC_BANK1_STATUS "bank-1-status"
#define AC_BANK_NOMEM "nomem"
#define AC_BANK_OK "ok"
#define AC_BANK_SPARE "spare"
#define AC_BANK_FAILED "failed"
#define GRP_SIZE_IS_SET(memdec) ((GRP_UK(memdec) & (GRP_UK(memdec) + 1)) == 0)
#define SETUP_DECODE(addr, mb, intlv, group) \
((((addr) >> 26) & 0x7fffULL) << 12) | \
((((mb) >> 6) - 1ULL) << 39) | \
((group) & 0xfULL) | \
((0xfULL << (intlv) & 0xfULL) << 6)
#define AC_GETINSTANCE(M) ((M) >> 1)
#define AC_GETBANK(M) ((M) & 1)
#define AC_PUTINSTANCE(I) ((I) << 1)
#define NAME_BANK0 "bank0"
#define NAME_BANK1 "bank1"
struct ac_mem_info {
int busy;
time_t status_change;
sysc_cfga_rstate_t rstate;
sysc_cfga_ostate_t ostate;
sysc_cfga_cond_t condition;
uint_t real_size;
uint_t use_size;
};
struct ac_soft_state {
dev_info_t *dip;
dev_info_t *pdip;
int board;
struct ac_mem_info bank[2];
void *ac_base;
volatile uint32_t *ac_id;
volatile uint64_t *ac_memctl;
volatile uint64_t *ac_memdecode0;
volatile uint64_t *ac_memdecode1;
volatile uint64_t *ac_counter;
volatile uint32_t *ac_mccr;
kstat_t *ac_ksp;
kstat_t *ac_counters_ksp;
};
extern void ac_blkcopy(caddr_t, caddr_t, uint_t, uint_t);
extern void ac_mapin(uint64_t, caddr_t);
extern void ac_unmap(caddr_t);
struct ac_kstat {
struct kstat_named ac_memctl;
struct kstat_named ac_memdecode0;
struct kstat_named ac_memdecode1;
struct kstat_named ac_mccr;
struct kstat_named ac_counter;
struct kstat_named ac_bank0_status;
struct kstat_named ac_bank1_status;
};
#endif
#ifdef __cplusplus
}
#endif
#endif