2005-04-16 15:20:36 -07:00
# ifndef _PARISC_PDC_H
# define _PARISC_PDC_H
2012-10-16 21:28:05 +01:00
# include <uapi/asm/pdc.h>
2008-07-28 22:52:18 -04:00
2007-10-18 00:03:34 -07:00
# if !defined(__ASSEMBLY__)
2005-04-16 15:20:36 -07:00
extern int pdc_type ;
/* Values for pdc_type */
# define PDC_TYPE_ILLEGAL -1
# define PDC_TYPE_PAT 0 /* 64-bit PAT-PDC */
# define PDC_TYPE_SYSTEM_MAP 1 /* 32-bit, but supports PDC_SYSTEM_MAP */
# define PDC_TYPE_SNAKE 2 /* Doesn't support SYSTEM_MAP */
struct pdc_chassis_info { /* for PDC_CHASSIS_INFO */
unsigned long actcnt ; /* actual number of bytes returned */
unsigned long maxcnt ; /* maximum number of bytes that could be returned */
} ;
struct pdc_coproc_cfg { /* for PDC_COPROC_CFG */
unsigned long ccr_functional ;
unsigned long ccr_present ;
unsigned long revision ;
unsigned long model ;
} ;
struct pdc_model { /* for PDC_MODEL */
unsigned long hversion ;
unsigned long sversion ;
unsigned long hw_id ;
unsigned long boot_id ;
unsigned long sw_id ;
unsigned long sw_cap ;
unsigned long arch_rev ;
unsigned long pot_key ;
unsigned long curr_key ;
} ;
struct pdc_cache_cf { /* for PDC_CACHE (I/D-caches) */
unsigned long
2007-01-28 15:09:20 +01:00
# ifdef CONFIG_64BIT
2005-04-16 15:20:36 -07:00
cc_padW : 32 ,
# endif
cc_alias : 4 , /* alias boundaries for virtual addresses */
cc_block : 4 , /* to determine most efficient stride */
cc_line : 3 , /* maximum amount written back as a result of store (multiple of 16 bytes) */
cc_shift : 2 , /* how much to shift cc_block left */
cc_wt : 1 , /* 0 = WT-Dcache, 1 = WB-Dcache */
cc_sh : 2 , /* 0 = separate I/D-cache, else shared I/D-cache */
cc_cst : 3 , /* 0 = incoherent D-cache, 1=coherent D-cache */
2006-06-14 20:26:25 +00:00
cc_pad1 : 10 , /* reserved */
cc_hv : 3 ; /* hversion dependent */
2005-04-16 15:20:36 -07:00
} ;
struct pdc_tlb_cf { /* for PDC_CACHE (I/D-TLB's) */
unsigned long tc_pad0 : 12 , /* reserved */
2007-01-28 15:09:20 +01:00
# ifdef CONFIG_64BIT
2005-04-16 15:20:36 -07:00
tc_padW : 32 ,
# endif
tc_sh : 2 , /* 0 = separate I/D-TLB, else shared I/D-TLB */
tc_hv : 1 , /* HV */
tc_page : 1 , /* 0 = 2K page-size-machine, 1 = 4k page size */
tc_cst : 3 , /* 0 = incoherent operations, else coherent operations */
tc_aid : 5 , /* ITLB: width of access ids of processor (encoded!) */
tc_pad1 : 8 ; /* ITLB: width of space-registers (encoded) */
} ;
struct pdc_cache_info { /* main-PDC_CACHE-structure (caches & TLB's) */
/* I-cache */
unsigned long ic_size ; /* size in bytes */
struct pdc_cache_cf ic_conf ; /* configuration */
unsigned long ic_base ; /* base-addr */
unsigned long ic_stride ;
unsigned long ic_count ;
unsigned long ic_loop ;
/* D-cache */
unsigned long dc_size ; /* size in bytes */
struct pdc_cache_cf dc_conf ; /* configuration */
unsigned long dc_base ; /* base-addr */
unsigned long dc_stride ;
unsigned long dc_count ;
unsigned long dc_loop ;
/* Instruction-TLB */
unsigned long it_size ; /* number of entries in I-TLB */
struct pdc_tlb_cf it_conf ; /* I-TLB-configuration */
unsigned long it_sp_base ;
unsigned long it_sp_stride ;
unsigned long it_sp_count ;
unsigned long it_off_base ;
unsigned long it_off_stride ;
unsigned long it_off_count ;
unsigned long it_loop ;
/* data-TLB */
unsigned long dt_size ; /* number of entries in D-TLB */
struct pdc_tlb_cf dt_conf ; /* D-TLB-configuration */
unsigned long dt_sp_base ;
unsigned long dt_sp_stride ;
unsigned long dt_sp_count ;
unsigned long dt_off_base ;
unsigned long dt_off_stride ;
unsigned long dt_off_count ;
unsigned long dt_loop ;
} ;
#if 0
/* If you start using the next struct, you'll have to adjust it to
* work with 64 - bit firmware I think - PB
*/
struct pdc_iodc { /* PDC_IODC */
unsigned char hversion_model ;
unsigned char hversion ;
unsigned char spa ;
unsigned char type ;
unsigned int sversion_rev : 4 ;
unsigned int sversion_model : 19 ;
unsigned int sversion_opt : 8 ;
unsigned char rev ;
unsigned char dep ;
unsigned char features ;
unsigned char pad1 ;
unsigned int checksum : 16 ;
unsigned int length : 16 ;
unsigned int pad [ 15 ] ;
} __attribute__ ( ( aligned ( 8 ) ) ) ;
# endif
# ifndef CONFIG_PA20
/* no BLTBs in pa2.0 processors */
struct pdc_btlb_info_range {
__u8 res00 ;
__u8 num_i ;
__u8 num_d ;
__u8 num_comb ;
} ;
struct pdc_btlb_info { /* PDC_BLOCK_TLB, return of PDC_BTLB_INFO */
unsigned int min_size ; /* minimum size of BTLB in pages */
unsigned int max_size ; /* maximum size of BTLB in pages */
struct pdc_btlb_info_range fixed_range_info ;
struct pdc_btlb_info_range variable_range_info ;
} ;
# endif /* !CONFIG_PA20 */
2007-01-28 15:09:20 +01:00
# ifdef CONFIG_64BIT
2005-04-16 15:20:36 -07:00
struct pdc_memory_table_raddr { /* PDC_MEM/PDC_MEM_TABLE (return info) */
unsigned long entries_returned ;
unsigned long entries_total ;
} ;
struct pdc_memory_table { /* PDC_MEM/PDC_MEM_TABLE (arguments) */
unsigned long paddr ;
unsigned int pages ;
unsigned int reserved ;
} ;
2007-01-28 15:09:20 +01:00
# endif /* CONFIG_64BIT */
2005-04-16 15:20:36 -07:00
struct pdc_system_map_mod_info { /* PDC_SYSTEM_MAP/FIND_MODULE */
unsigned long mod_addr ;
unsigned long mod_pgs ;
unsigned long add_addrs ;
} ;
struct pdc_system_map_addr_info { /* PDC_SYSTEM_MAP/FIND_ADDRESS */
unsigned long mod_addr ;
unsigned long mod_pgs ;
} ;
struct pdc_initiator { /* PDC_INITIATOR */
int host_id ;
int factor ;
int width ;
int mode ;
} ;
struct hardware_path {
char flags ; /* see bit definitions below */
char bc [ 6 ] ; /* Bus Converter routing info to a specific */
/* I/O adaptor (< 0 means none, > 63 resvd) */
char mod ; /* fixed field of specified module */
} ;
/*
* Device path specifications used by PDC .
*/
struct pdc_module_path {
struct hardware_path path ;
unsigned int layers [ 6 ] ; /* device-specific info (ctlr #, unit # ...) */
} ;
# ifndef CONFIG_PA20
/* Only used on some pre-PA2.0 boxes */
struct pdc_memory_map { /* PDC_MEMORY_MAP */
unsigned long hpa ; /* mod's register set address */
unsigned long more_pgs ; /* number of additional I/O pgs */
} ;
# endif
struct pdc_tod {
unsigned long tod_sec ;
unsigned long tod_usec ;
} ;
/* architected results from PDC_PIM/transfer hpmc on a PA1.1 machine */
struct pdc_hpmc_pim_11 { /* PDC_PIM */
__u32 gr [ 32 ] ;
__u32 cr [ 32 ] ;
__u32 sr [ 8 ] ;
__u32 iasq_back ;
__u32 iaoq_back ;
__u32 check_type ;
__u32 cpu_state ;
__u32 rsvd1 ;
__u32 cache_check ;
__u32 tlb_check ;
__u32 bus_check ;
__u32 assists_check ;
__u32 rsvd2 ;
__u32 assist_state ;
__u32 responder_addr ;
__u32 requestor_addr ;
__u32 path_info ;
__u64 fr [ 32 ] ;
} ;
/*
* architected results from PDC_PIM / transfer hpmc on a PA2 .0 machine
*
* Note that PDC_PIM doesn ' t care whether or not wide mode was enabled
* so the results are different on PA1 .1 vs . PA2 .0 when in narrow mode .
*
* Note also that there are unarchitected results available , which
* are hversion dependent . Do a " ser pim 0 hpmc " after rebooting , since
* the firmware is probably the best way of printing hversion dependent
* data .
*/
struct pdc_hpmc_pim_20 { /* PDC_PIM */
__u64 gr [ 32 ] ;
__u64 cr [ 32 ] ;
__u64 sr [ 8 ] ;
__u64 iasq_back ;
__u64 iaoq_back ;
__u32 check_type ;
__u32 cpu_state ;
__u32 cache_check ;
__u32 tlb_check ;
__u32 bus_check ;
__u32 assists_check ;
__u32 assist_state ;
__u32 path_info ;
__u64 responder_addr ;
__u64 requestor_addr ;
__u64 fr [ 32 ] ;
} ;
2007-10-18 00:03:34 -07:00
void pdc_console_init ( void ) ; /* in pdc_console.c */
void pdc_console_restart ( void ) ;
void setup_pdc ( void ) ; /* in inventory.c */
/* wrapper-functions from pdc.c */
int pdc_add_valid ( unsigned long address ) ;
int pdc_chassis_info ( struct pdc_chassis_info * chassis_info , void * led_info , unsigned long len ) ;
int pdc_chassis_disp ( unsigned long disp ) ;
int pdc_chassis_warn ( unsigned long * warn ) ;
int pdc_coproc_cfg ( struct pdc_coproc_cfg * pdc_coproc_info ) ;
2008-07-29 00:09:22 -04:00
int pdc_coproc_cfg_unlocked ( struct pdc_coproc_cfg * pdc_coproc_info ) ;
2007-10-18 00:03:34 -07:00
int pdc_iodc_read ( unsigned long * actcnt , unsigned long hpa , unsigned int index ,
void * iodc_data , unsigned int iodc_data_size ) ;
int pdc_system_map_find_mods ( struct pdc_system_map_mod_info * pdc_mod_info ,
struct pdc_module_path * mod_path , long mod_index ) ;
int pdc_system_map_find_addrs ( struct pdc_system_map_addr_info * pdc_addr_info ,
long mod_index , long addr_index ) ;
int pdc_model_info ( struct pdc_model * model ) ;
int pdc_model_sysmodel ( char * name ) ;
int pdc_model_cpuid ( unsigned long * cpu_id ) ;
int pdc_model_versions ( unsigned long * versions , int id ) ;
int pdc_model_capabilities ( unsigned long * capabilities ) ;
int pdc_cache_info ( struct pdc_cache_info * cache ) ;
int pdc_spaceid_bits ( unsigned long * space_bits ) ;
# ifndef CONFIG_PA20
int pdc_btlb_info ( struct pdc_btlb_info * btlb ) ;
int pdc_mem_map_hpa ( struct pdc_memory_map * r_addr , struct pdc_module_path * mod_path ) ;
# endif /* !CONFIG_PA20 */
int pdc_lan_station_id ( char * lan_addr , unsigned long net_hpa ) ;
int pdc_stable_read ( unsigned long staddr , void * memaddr , unsigned long count ) ;
int pdc_stable_write ( unsigned long staddr , void * memaddr , unsigned long count ) ;
int pdc_stable_get_size ( unsigned long * size ) ;
int pdc_stable_verify_contents ( void ) ;
int pdc_stable_initialize ( void ) ;
int pdc_pci_irt_size ( unsigned long * num_entries , unsigned long hpa ) ;
int pdc_pci_irt ( unsigned long num_entries , unsigned long hpa , void * tbl ) ;
int pdc_get_initiator ( struct hardware_path * , struct pdc_initiator * ) ;
int pdc_tod_read ( struct pdc_tod * tod ) ;
int pdc_tod_set ( unsigned long sec , unsigned long usec ) ;
# ifdef CONFIG_64BIT
int pdc_mem_mem_table ( struct pdc_memory_table_raddr * r_addr ,
struct pdc_memory_table * tbl , unsigned long entries ) ;
# endif
void set_firmware_width ( void ) ;
2008-07-29 00:09:22 -04:00
void set_firmware_width_unlocked ( void ) ;
2007-10-18 00:03:34 -07:00
int pdc_do_firm_test_reset ( unsigned long ftc_bitmap ) ;
int pdc_do_reset ( void ) ;
int pdc_soft_power_info ( unsigned long * power_reg ) ;
int pdc_soft_power_button ( int sw_control ) ;
void pdc_io_reset ( void ) ;
void pdc_io_reset_devices ( void ) ;
int pdc_iodc_getc ( void ) ;
2008-02-18 23:34:34 -08:00
int pdc_iodc_print ( const unsigned char * str , unsigned count ) ;
2007-10-18 00:03:34 -07:00
void pdc_emergency_unlock ( void ) ;
int pdc_sti_call ( unsigned long func , unsigned long flags ,
unsigned long inptr , unsigned long outputr ,
unsigned long glob_cfg ) ;
static inline char * os_id_to_string ( u16 os_id ) {
switch ( os_id ) {
case OS_ID_NONE : return " No OS " ;
case OS_ID_HPUX : return " HP-UX " ;
case OS_ID_MPEXL : return " MPE-iX " ;
case OS_ID_OSF : return " OSF " ;
case OS_ID_HPRT : return " HP-RT " ;
case OS_ID_NOVEL : return " Novell Netware " ;
case OS_ID_LINUX : return " Linux " ;
default : return " Unknown " ;
}
}
# endif /* !defined(__ASSEMBLY__) */
2005-04-16 15:20:36 -07:00
# endif /* _PARISC_PDC_H */