4 #include <uapi/asm/pdc.h>
6 #if !defined(__ASSEMBLY__)
10 /* Values for pdc_type */
11 #define PDC_TYPE_ILLEGAL -1
12 #define PDC_TYPE_PAT 0 /* 64-bit PAT-PDC */
13 #define PDC_TYPE_SYSTEM_MAP 1 /* 32-bit, but supports PDC_SYSTEM_MAP */
14 #define PDC_TYPE_SNAKE 2 /* Doesn't support SYSTEM_MAP */
16 struct pdc_chassis_info
{ /* for PDC_CHASSIS_INFO */
17 unsigned long actcnt
; /* actual number of bytes returned */
18 unsigned long maxcnt
; /* maximum number of bytes that could be returned */
21 struct pdc_coproc_cfg
{ /* for PDC_COPROC_CFG */
22 unsigned long ccr_functional
;
23 unsigned long ccr_present
;
24 unsigned long revision
;
28 struct pdc_model
{ /* for PDC_MODEL */
29 unsigned long hversion
;
30 unsigned long sversion
;
32 unsigned long boot_id
;
35 unsigned long arch_rev
;
36 unsigned long pot_key
;
37 unsigned long curr_key
;
40 struct pdc_cache_cf
{ /* for PDC_CACHE (I/D-caches) */
45 cc_alias
: 4, /* alias boundaries for virtual addresses */
46 cc_block
: 4, /* to determine most efficient stride */
47 cc_line
: 3, /* maximum amount written back as a result of store (multiple of 16 bytes) */
48 cc_shift
: 2, /* how much to shift cc_block left */
49 cc_wt
: 1, /* 0 = WT-Dcache, 1 = WB-Dcache */
50 cc_sh
: 2, /* 0 = separate I/D-cache, else shared I/D-cache */
51 cc_cst
: 3, /* 0 = incoherent D-cache, 1=coherent D-cache */
52 cc_pad1
: 10, /* reserved */
53 cc_hv
: 3; /* hversion dependent */
56 struct pdc_tlb_cf
{ /* for PDC_CACHE (I/D-TLB's) */
57 unsigned long tc_pad0
:12, /* reserved */
61 tc_sh
: 2, /* 0 = separate I/D-TLB, else shared I/D-TLB */
63 tc_page
: 1, /* 0 = 2K page-size-machine, 1 = 4k page size */
64 tc_cst
: 3, /* 0 = incoherent operations, else coherent operations */
65 tc_aid
: 5, /* ITLB: width of access ids of processor (encoded!) */
66 tc_pad1
: 8; /* ITLB: width of space-registers (encoded) */
69 struct pdc_cache_info
{ /* main-PDC_CACHE-structure (caches & TLB's) */
71 unsigned long ic_size
; /* size in bytes */
72 struct pdc_cache_cf ic_conf
; /* configuration */
73 unsigned long ic_base
; /* base-addr */
74 unsigned long ic_stride
;
75 unsigned long ic_count
;
76 unsigned long ic_loop
;
78 unsigned long dc_size
; /* size in bytes */
79 struct pdc_cache_cf dc_conf
; /* configuration */
80 unsigned long dc_base
; /* base-addr */
81 unsigned long dc_stride
;
82 unsigned long dc_count
;
83 unsigned long dc_loop
;
85 unsigned long it_size
; /* number of entries in I-TLB */
86 struct pdc_tlb_cf it_conf
; /* I-TLB-configuration */
87 unsigned long it_sp_base
;
88 unsigned long it_sp_stride
;
89 unsigned long it_sp_count
;
90 unsigned long it_off_base
;
91 unsigned long it_off_stride
;
92 unsigned long it_off_count
;
93 unsigned long it_loop
;
95 unsigned long dt_size
; /* number of entries in D-TLB */
96 struct pdc_tlb_cf dt_conf
; /* D-TLB-configuration */
97 unsigned long dt_sp_base
;
98 unsigned long dt_sp_stride
;
99 unsigned long dt_sp_count
;
100 unsigned long dt_off_base
;
101 unsigned long dt_off_stride
;
102 unsigned long dt_off_count
;
103 unsigned long dt_loop
;
107 /* If you start using the next struct, you'll have to adjust it to
108 * work with 64-bit firmware I think -PB
110 struct pdc_iodc
{ /* PDC_IODC */
111 unsigned char hversion_model
;
112 unsigned char hversion
;
115 unsigned int sversion_rev
:4;
116 unsigned int sversion_model
:19;
117 unsigned int sversion_opt
:8;
120 unsigned char features
;
122 unsigned int checksum
:16;
123 unsigned int length
:16;
124 unsigned int pad
[15];
125 } __attribute__((aligned(8))) ;
129 /* no BLTBs in pa2.0 processors */
130 struct pdc_btlb_info_range
{
137 struct pdc_btlb_info
{ /* PDC_BLOCK_TLB, return of PDC_BTLB_INFO */
138 unsigned int min_size
; /* minimum size of BTLB in pages */
139 unsigned int max_size
; /* maximum size of BTLB in pages */
140 struct pdc_btlb_info_range fixed_range_info
;
141 struct pdc_btlb_info_range variable_range_info
;
144 #endif /* !CONFIG_PA20 */
147 struct pdc_memory_table_raddr
{ /* PDC_MEM/PDC_MEM_TABLE (return info) */
148 unsigned long entries_returned
;
149 unsigned long entries_total
;
152 struct pdc_memory_table
{ /* PDC_MEM/PDC_MEM_TABLE (arguments) */
155 unsigned int reserved
;
157 #endif /* CONFIG_64BIT */
159 struct pdc_system_map_mod_info
{ /* PDC_SYSTEM_MAP/FIND_MODULE */
160 unsigned long mod_addr
;
161 unsigned long mod_pgs
;
162 unsigned long add_addrs
;
165 struct pdc_system_map_addr_info
{ /* PDC_SYSTEM_MAP/FIND_ADDRESS */
166 unsigned long mod_addr
;
167 unsigned long mod_pgs
;
170 struct pdc_initiator
{ /* PDC_INITIATOR */
177 struct hardware_path
{
178 char flags
; /* see bit definitions below */
179 char bc
[6]; /* Bus Converter routing info to a specific */
180 /* I/O adaptor (< 0 means none, > 63 resvd) */
181 char mod
; /* fixed field of specified module */
185 * Device path specifications used by PDC.
187 struct pdc_module_path
{
188 struct hardware_path path
;
189 unsigned int layers
[6]; /* device-specific info (ctlr #, unit # ...) */
193 /* Only used on some pre-PA2.0 boxes */
194 struct pdc_memory_map
{ /* PDC_MEMORY_MAP */
195 unsigned long hpa
; /* mod's register set address */
196 unsigned long more_pgs
; /* number of additional I/O pgs */
201 unsigned long tod_sec
;
202 unsigned long tod_usec
;
205 /* architected results from PDC_PIM/transfer hpmc on a PA1.1 machine */
207 struct pdc_hpmc_pim_11
{ /* PDC_PIM */
222 __u32 responder_addr
;
223 __u32 requestor_addr
;
229 * architected results from PDC_PIM/transfer hpmc on a PA2.0 machine
231 * Note that PDC_PIM doesn't care whether or not wide mode was enabled
232 * so the results are different on PA1.1 vs. PA2.0 when in narrow mode.
234 * Note also that there are unarchitected results available, which
235 * are hversion dependent. Do a "ser pim 0 hpmc" after rebooting, since
236 * the firmware is probably the best way of printing hversion dependent
240 struct pdc_hpmc_pim_20
{ /* PDC_PIM */
254 __u64 responder_addr
;
255 __u64 requestor_addr
;
259 void pdc_console_init(void); /* in pdc_console.c */
260 void pdc_console_restart(void);
262 void setup_pdc(void); /* in inventory.c */
264 /* wrapper-functions from pdc.c */
266 int pdc_add_valid(unsigned long address
);
267 int pdc_chassis_info(struct pdc_chassis_info
*chassis_info
, void *led_info
, unsigned long len
);
268 int pdc_chassis_disp(unsigned long disp
);
269 int pdc_chassis_warn(unsigned long *warn
);
270 int pdc_coproc_cfg(struct pdc_coproc_cfg
*pdc_coproc_info
);
271 int pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg
*pdc_coproc_info
);
272 int pdc_iodc_read(unsigned long *actcnt
, unsigned long hpa
, unsigned int index
,
273 void *iodc_data
, unsigned int iodc_data_size
);
274 int pdc_system_map_find_mods(struct pdc_system_map_mod_info
*pdc_mod_info
,
275 struct pdc_module_path
*mod_path
, long mod_index
);
276 int pdc_system_map_find_addrs(struct pdc_system_map_addr_info
*pdc_addr_info
,
277 long mod_index
, long addr_index
);
278 int pdc_model_info(struct pdc_model
*model
);
279 int pdc_model_sysmodel(char *name
);
280 int pdc_model_cpuid(unsigned long *cpu_id
);
281 int pdc_model_versions(unsigned long *versions
, int id
);
282 int pdc_model_capabilities(unsigned long *capabilities
);
283 int pdc_cache_info(struct pdc_cache_info
*cache
);
284 int pdc_spaceid_bits(unsigned long *space_bits
);
286 int pdc_btlb_info(struct pdc_btlb_info
*btlb
);
287 int pdc_mem_map_hpa(struct pdc_memory_map
*r_addr
, struct pdc_module_path
*mod_path
);
288 #endif /* !CONFIG_PA20 */
289 int pdc_lan_station_id(char *lan_addr
, unsigned long net_hpa
);
291 int pdc_stable_read(unsigned long staddr
, void *memaddr
, unsigned long count
);
292 int pdc_stable_write(unsigned long staddr
, void *memaddr
, unsigned long count
);
293 int pdc_stable_get_size(unsigned long *size
);
294 int pdc_stable_verify_contents(void);
295 int pdc_stable_initialize(void);
297 int pdc_pci_irt_size(unsigned long *num_entries
, unsigned long hpa
);
298 int pdc_pci_irt(unsigned long num_entries
, unsigned long hpa
, void *tbl
);
300 int pdc_get_initiator(struct hardware_path
*, struct pdc_initiator
*);
301 int pdc_tod_read(struct pdc_tod
*tod
);
302 int pdc_tod_set(unsigned long sec
, unsigned long usec
);
305 int pdc_mem_mem_table(struct pdc_memory_table_raddr
*r_addr
,
306 struct pdc_memory_table
*tbl
, unsigned long entries
);
309 void set_firmware_width(void);
310 void set_firmware_width_unlocked(void);
311 int pdc_do_firm_test_reset(unsigned long ftc_bitmap
);
312 int pdc_do_reset(void);
313 int pdc_soft_power_info(unsigned long *power_reg
);
314 int pdc_soft_power_button(int sw_control
);
315 void pdc_io_reset(void);
316 void pdc_io_reset_devices(void);
317 int pdc_iodc_getc(void);
318 int pdc_iodc_print(const unsigned char *str
, unsigned count
);
320 void pdc_emergency_unlock(void);
321 int pdc_sti_call(unsigned long func
, unsigned long flags
,
322 unsigned long inptr
, unsigned long outputr
,
323 unsigned long glob_cfg
);
325 static inline char * os_id_to_string(u16 os_id
) {
327 case OS_ID_NONE
: return "No OS";
328 case OS_ID_HPUX
: return "HP-UX";
329 case OS_ID_MPEXL
: return "MPE-iX";
330 case OS_ID_OSF
: return "OSF";
331 case OS_ID_HPRT
: return "HP-RT";
332 case OS_ID_NOVEL
: return "Novell Netware";
333 case OS_ID_LINUX
: return "Linux";
334 default: return "Unknown";
338 #endif /* !defined(__ASSEMBLY__) */
339 #endif /* _PARISC_PDC_H */