[PARISC] Document history of PDC_NARROW as it is now obsolete
[linux-2.6] / arch / parisc / kernel / firmware.c
1 /*
2  * arch/parisc/kernel/firmware.c  - safe PDC access routines
3  *
4  *      PDC == Processor Dependent Code
5  *
6  * See http://www.parisc-linux.org/documentation/index.html
7  * for documentation describing the entry points and calling
8  * conventions defined below.
9  *
10  * Copyright 1999 SuSE GmbH Nuernberg (Philipp Rumpf, prumpf@tux.org)
11  * Copyright 1999 The Puffin Group, (Alex deVries, David Kennedy)
12  * Copyright 2003 Grant Grundler <grundler parisc-linux org>
13  * Copyright 2003,2004 Ryan Bradetich <rbrad@parisc-linux.org>
14  * Copyright 2004 Thibaut VARENE <varenet@parisc-linux.org>
15  *
16  *    This program is free software; you can redistribute it and/or modify
17  *    it under the terms of the GNU General Public License as published by
18  *    the Free Software Foundation; either version 2 of the License, or
19  *    (at your option) any later version.
20  *
21  */
22
23 /*      I think it would be in everyone's best interest to follow this
24  *      guidelines when writing PDC wrappers:
25  *
26  *       - the name of the pdc wrapper should match one of the macros
27  *         used for the first two arguments
28  *       - don't use caps for random parts of the name
29  *       - use the static PDC result buffers and "copyout" to structs
30  *         supplied by the caller to encapsulate alignment restrictions
31  *       - hold pdc_lock while in PDC or using static result buffers
32  *       - use __pa() to convert virtual (kernel) pointers to physical
33  *         ones.
34  *       - the name of the struct used for pdc return values should equal
35  *         one of the macros used for the first two arguments to the
36  *         corresponding PDC call
37  *       - keep the order of arguments
38  *       - don't be smart (setting trailing NUL bytes for strings, return
39  *         something useful even if the call failed) unless you are sure
40  *         it's not going to affect functionality or performance
41  *
42  *      Example:
43  *      int pdc_cache_info(struct pdc_cache_info *cache_info )
44  *      {
45  *              int retval;
46  *
47  *              spin_lock_irq(&pdc_lock);
48  *              retval = mem_pdc_call(PDC_CACHE,PDC_CACHE_INFO,__pa(cache_info),0);
49  *              convert_to_wide(pdc_result);
50  *              memcpy(cache_info, pdc_result, sizeof(*cache_info));
51  *              spin_unlock_irq(&pdc_lock);
52  *
53  *              return retval;
54  *      }
55  *                                      prumpf  991016  
56  */
57
58 #include <stdarg.h>
59
60 #include <linux/delay.h>
61 #include <linux/init.h>
62 #include <linux/kernel.h>
63 #include <linux/module.h>
64 #include <linux/string.h>
65 #include <linux/spinlock.h>
66
67 #include <asm/page.h>
68 #include <asm/pdc.h>
69 #include <asm/pdcpat.h>
70 #include <asm/system.h>
71 #include <asm/processor.h>      /* for boot_cpu_data */
72
73 static DEFINE_SPINLOCK(pdc_lock);
74 static unsigned long pdc_result[32] __attribute__ ((aligned (8)));
75 static unsigned long pdc_result2[32] __attribute__ ((aligned (8)));
76
77 #ifdef __LP64__
78 #define WIDE_FIRMWARE 0x1
79 #define NARROW_FIRMWARE 0x2
80
81 /* Firmware needs to be initially set to narrow to determine the 
82  * actual firmware width. */
83 int parisc_narrow_firmware = 1;
84 #endif
85
86 /* On most currently-supported platforms, IODC I/O calls are 32-bit calls
87  * and MEM_PDC calls are always the same width as the OS.
88  * Some PAT boxes may have 64-bit IODC I/O.
89  *
90  * Ryan Bradetich added the now obsolete CONFIG_PDC_NARROW to allow
91  * 64-bit kernels to run on systems with 32-bit MEM_PDC calls.
92  * This allowed wide kernels to run on Cxxx boxes.
93  * We now detect 32-bit-only PDC and dynamically switch to 32-bit mode
94  * when running a 64-bit kernel on such boxes (e.g. C200 or C360).
95  */
96
97 #ifdef __LP64__
98 long real64_call(unsigned long function, ...);
99 #endif
100 long real32_call(unsigned long function, ...);
101
102 #ifdef __LP64__
103 #   define MEM_PDC (unsigned long)(PAGE0->mem_pdc_hi) << 32 | PAGE0->mem_pdc
104 #   define mem_pdc_call(args...) unlikely(parisc_narrow_firmware) ? real32_call(MEM_PDC, args) : real64_call(MEM_PDC, args)
105 #else
106 #   define MEM_PDC (unsigned long)PAGE0->mem_pdc
107 #   define mem_pdc_call(args...) real32_call(MEM_PDC, args)
108 #endif
109
110
111 /**
112  * f_extend - Convert PDC addresses to kernel addresses.
113  * @address: Address returned from PDC.
114  *
115  * This function is used to convert PDC addresses into kernel addresses
116  * when the PDC address size and kernel address size are different.
117  */
118 static unsigned long f_extend(unsigned long address)
119 {
120 #ifdef __LP64__
121         if(unlikely(parisc_narrow_firmware)) {
122                 if((address & 0xff000000) == 0xf0000000)
123                         return 0xf0f0f0f000000000UL | (u32)address;
124
125                 if((address & 0xf0000000) == 0xf0000000)
126                         return 0xffffffff00000000UL | (u32)address;
127         }
128 #endif
129         return address;
130 }
131
132 /**
133  * convert_to_wide - Convert the return buffer addresses into kernel addresses.
134  * @address: The return buffer from PDC.
135  *
136  * This function is used to convert the return buffer addresses retrieved from PDC
137  * into kernel addresses when the PDC address size and kernel address size are
138  * different.
139  */
140 static void convert_to_wide(unsigned long *addr)
141 {
142 #ifdef __LP64__
143         int i;
144         unsigned int *p = (unsigned int *)addr;
145
146         if(unlikely(parisc_narrow_firmware)) {
147                 for(i = 31; i >= 0; --i)
148                         addr[i] = p[i];
149         }
150 #endif
151 }
152
153 /**
154  * set_firmware_width - Determine if the firmware is wide or narrow.
155  * 
156  * This function must be called before any pdc_* function that uses the convert_to_wide
157  * function.
158  */
159 void __init set_firmware_width(void)
160 {
161 #ifdef __LP64__
162         int retval;
163
164         spin_lock_irq(&pdc_lock);
165         retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_CAPABILITIES, __pa(pdc_result), 0);
166         convert_to_wide(pdc_result);
167         if(pdc_result[0] != NARROW_FIRMWARE)
168                 parisc_narrow_firmware = 0;
169         spin_unlock_irq(&pdc_lock);
170 #endif
171 }
172
173 /**
174  * pdc_emergency_unlock - Unlock the linux pdc lock
175  *
176  * This call unlocks the linux pdc lock in case we need some PDC functions
177  * (like pdc_add_valid) during kernel stack dump.
178  */
179 void pdc_emergency_unlock(void)
180 {
181         /* Spinlock DEBUG code freaks out if we unconditionally unlock */
182         if (spin_is_locked(&pdc_lock))
183                 spin_unlock(&pdc_lock);
184 }
185
186
187 /**
188  * pdc_add_valid - Verify address can be accessed without causing a HPMC.
189  * @address: Address to be verified.
190  *
191  * This PDC call attempts to read from the specified address and verifies
192  * if the address is valid.
193  * 
194  * The return value is PDC_OK (0) in case accessing this address is valid.
195  */
196 int pdc_add_valid(unsigned long address)
197 {
198         int retval;
199
200         spin_lock_irq(&pdc_lock);
201         retval = mem_pdc_call(PDC_ADD_VALID, PDC_ADD_VALID_VERIFY, address);
202         spin_unlock_irq(&pdc_lock);
203
204         return retval;
205 }
206 EXPORT_SYMBOL(pdc_add_valid);
207
208 /**
209  * pdc_chassis_info - Return chassis information.
210  * @result: The return buffer.
211  * @chassis_info: The memory buffer address.
212  * @len: The size of the memory buffer address.
213  *
214  * An HVERSION dependent call for returning the chassis information.
215  */
216 int __init pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_info, unsigned long len)
217 {
218         int retval;
219
220         spin_lock_irq(&pdc_lock);
221         memcpy(&pdc_result, chassis_info, sizeof(*chassis_info));
222         memcpy(&pdc_result2, led_info, len);
223         retval = mem_pdc_call(PDC_CHASSIS, PDC_RETURN_CHASSIS_INFO,
224                               __pa(pdc_result), __pa(pdc_result2), len);
225         memcpy(chassis_info, pdc_result, sizeof(*chassis_info));
226         memcpy(led_info, pdc_result2, len);
227         spin_unlock_irq(&pdc_lock);
228
229         return retval;
230 }
231
232 /**
233  * pdc_pat_chassis_send_log - Sends a PDC PAT CHASSIS log message.
234  * @retval: -1 on error, 0 on success. Other value are PDC errors
235  * 
236  * Must be correctly formatted or expect system crash
237  */
238 #ifdef __LP64__
239 int pdc_pat_chassis_send_log(unsigned long state, unsigned long data)
240 {
241         int retval = 0;
242         
243         if (!is_pdc_pat())
244                 return -1;
245
246         spin_lock_irq(&pdc_lock);
247         retval = mem_pdc_call(PDC_PAT_CHASSIS_LOG, PDC_PAT_CHASSIS_WRITE_LOG, __pa(&state), __pa(&data));
248         spin_unlock_irq(&pdc_lock);
249
250         return retval;
251 }
252 #endif
253
254 /**
255  * pdc_chassis_disp - Updates display
256  * @retval: -1 on error, 0 on success
257  *
258  * Works on old PDC only (E class, others?)
259  */
260 int pdc_chassis_disp(unsigned long disp)
261 {
262         int retval = 0;
263
264         spin_lock_irq(&pdc_lock);
265         retval = mem_pdc_call(PDC_CHASSIS, PDC_CHASSIS_DISP, disp);
266         spin_unlock_irq(&pdc_lock);
267
268         return retval;
269 }
270
271 /**
272  * pdc_coproc_cfg - To identify coprocessors attached to the processor.
273  * @pdc_coproc_info: Return buffer address.
274  *
275  * This PDC call returns the presence and status of all the coprocessors
276  * attached to the processor.
277  */
278 int __init pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info)
279 {
280         int retval;
281
282         spin_lock_irq(&pdc_lock);
283         retval = mem_pdc_call(PDC_COPROC, PDC_COPROC_CFG, __pa(pdc_result));
284         convert_to_wide(pdc_result);
285         pdc_coproc_info->ccr_functional = pdc_result[0];
286         pdc_coproc_info->ccr_present = pdc_result[1];
287         pdc_coproc_info->revision = pdc_result[17];
288         pdc_coproc_info->model = pdc_result[18];
289         spin_unlock_irq(&pdc_lock);
290
291         return retval;
292 }
293
294 /**
295  * pdc_iodc_read - Read data from the modules IODC.
296  * @actcnt: The actual number of bytes.
297  * @hpa: The HPA of the module for the iodc read.
298  * @index: The iodc entry point.
299  * @iodc_data: A buffer memory for the iodc options.
300  * @iodc_data_size: Size of the memory buffer.
301  *
302  * This PDC call reads from the IODC of the module specified by the hpa
303  * argument.
304  */
305 int pdc_iodc_read(unsigned long *actcnt, unsigned long hpa, unsigned int index,
306                   void *iodc_data, unsigned int iodc_data_size)
307 {
308         int retval;
309
310         spin_lock_irq(&pdc_lock);
311         retval = mem_pdc_call(PDC_IODC, PDC_IODC_READ, __pa(pdc_result), hpa, 
312                               index, __pa(pdc_result2), iodc_data_size);
313         convert_to_wide(pdc_result);
314         *actcnt = pdc_result[0];
315         memcpy(iodc_data, pdc_result2, iodc_data_size);
316         spin_unlock_irq(&pdc_lock);
317
318         return retval;
319 }
320 EXPORT_SYMBOL(pdc_iodc_read);
321
322 /**
323  * pdc_system_map_find_mods - Locate unarchitected modules.
324  * @pdc_mod_info: Return buffer address.
325  * @mod_path: pointer to dev path structure.
326  * @mod_index: fixed address module index.
327  *
328  * To locate and identify modules which reside at fixed I/O addresses, which
329  * do not self-identify via architected bus walks.
330  */
331 int pdc_system_map_find_mods(struct pdc_system_map_mod_info *pdc_mod_info,
332                              struct pdc_module_path *mod_path, long mod_index)
333 {
334         int retval;
335
336         spin_lock_irq(&pdc_lock);
337         retval = mem_pdc_call(PDC_SYSTEM_MAP, PDC_FIND_MODULE, __pa(pdc_result), 
338                               __pa(pdc_result2), mod_index);
339         convert_to_wide(pdc_result);
340         memcpy(pdc_mod_info, pdc_result, sizeof(*pdc_mod_info));
341         memcpy(mod_path, pdc_result2, sizeof(*mod_path));
342         spin_unlock_irq(&pdc_lock);
343
344         pdc_mod_info->mod_addr = f_extend(pdc_mod_info->mod_addr);
345         return retval;
346 }
347
348 /**
349  * pdc_system_map_find_addrs - Retrieve additional address ranges.
350  * @pdc_addr_info: Return buffer address.
351  * @mod_index: Fixed address module index.
352  * @addr_index: Address range index.
353  * 
354  * Retrieve additional information about subsequent address ranges for modules
355  * with multiple address ranges.  
356  */
357 int pdc_system_map_find_addrs(struct pdc_system_map_addr_info *pdc_addr_info, 
358                               long mod_index, long addr_index)
359 {
360         int retval;
361
362         spin_lock_irq(&pdc_lock);
363         retval = mem_pdc_call(PDC_SYSTEM_MAP, PDC_FIND_ADDRESS, __pa(pdc_result),
364                               mod_index, addr_index);
365         convert_to_wide(pdc_result);
366         memcpy(pdc_addr_info, pdc_result, sizeof(*pdc_addr_info));
367         spin_unlock_irq(&pdc_lock);
368
369         pdc_addr_info->mod_addr = f_extend(pdc_addr_info->mod_addr);
370         return retval;
371 }
372
373 /**
374  * pdc_model_info - Return model information about the processor.
375  * @model: The return buffer.
376  *
377  * Returns the version numbers, identifiers, and capabilities from the processor module.
378  */
379 int pdc_model_info(struct pdc_model *model) 
380 {
381         int retval;
382
383         spin_lock_irq(&pdc_lock);
384         retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_INFO, __pa(pdc_result), 0);
385         convert_to_wide(pdc_result);
386         memcpy(model, pdc_result, sizeof(*model));
387         spin_unlock_irq(&pdc_lock);
388
389         return retval;
390 }
391
392 /**
393  * pdc_model_sysmodel - Get the system model name.
394  * @name: A char array of at least 81 characters.
395  *
396  * Get system model name from PDC ROM (e.g. 9000/715 or 9000/778/B160L)
397  */
398 int pdc_model_sysmodel(char *name)
399 {
400         int retval;
401
402         spin_lock_irq(&pdc_lock);
403         retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_SYSMODEL, __pa(pdc_result),
404                               OS_ID_HPUX, __pa(name));
405         convert_to_wide(pdc_result);
406
407         if (retval == PDC_OK) {
408                 name[pdc_result[0]] = '\0'; /* add trailing '\0' */
409         } else {
410                 name[0] = 0;
411         }
412         spin_unlock_irq(&pdc_lock);
413
414         return retval;
415 }
416
417 /**
418  * pdc_model_versions - Identify the version number of each processor.
419  * @cpu_id: The return buffer.
420  * @id: The id of the processor to check.
421  *
422  * Returns the version number for each processor component.
423  *
424  * This comment was here before, but I do not know what it means :( -RB
425  * id: 0 = cpu revision, 1 = boot-rom-version
426  */
427 int pdc_model_versions(unsigned long *versions, int id)
428 {
429         int retval;
430
431         spin_lock_irq(&pdc_lock);
432         retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_VERSIONS, __pa(pdc_result), id);
433         convert_to_wide(pdc_result);
434         *versions = pdc_result[0];
435         spin_unlock_irq(&pdc_lock);
436
437         return retval;
438 }
439
440 /**
441  * pdc_model_cpuid - Returns the CPU_ID.
442  * @cpu_id: The return buffer.
443  *
444  * Returns the CPU_ID value which uniquely identifies the cpu portion of
445  * the processor module.
446  */
447 int pdc_model_cpuid(unsigned long *cpu_id)
448 {
449         int retval;
450
451         spin_lock_irq(&pdc_lock);
452         pdc_result[0] = 0; /* preset zero (call may not be implemented!) */
453         retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_CPU_ID, __pa(pdc_result), 0);
454         convert_to_wide(pdc_result);
455         *cpu_id = pdc_result[0];
456         spin_unlock_irq(&pdc_lock);
457
458         return retval;
459 }
460
461 /**
462  * pdc_model_capabilities - Returns the platform capabilities.
463  * @capabilities: The return buffer.
464  *
465  * Returns information about platform support for 32- and/or 64-bit
466  * OSes, IO-PDIR coherency, and virtual aliasing.
467  */
468 int pdc_model_capabilities(unsigned long *capabilities)
469 {
470         int retval;
471
472         spin_lock_irq(&pdc_lock);
473         pdc_result[0] = 0; /* preset zero (call may not be implemented!) */
474         retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_CAPABILITIES, __pa(pdc_result), 0);
475         convert_to_wide(pdc_result);
476         *capabilities = pdc_result[0];
477         spin_unlock_irq(&pdc_lock);
478
479         return retval;
480 }
481
482 /**
483  * pdc_cache_info - Return cache and TLB information.
484  * @cache_info: The return buffer.
485  *
486  * Returns information about the processor's cache and TLB.
487  */
488 int pdc_cache_info(struct pdc_cache_info *cache_info)
489 {
490         int retval;
491
492         spin_lock_irq(&pdc_lock);
493         retval = mem_pdc_call(PDC_CACHE, PDC_CACHE_INFO, __pa(pdc_result), 0);
494         convert_to_wide(pdc_result);
495         memcpy(cache_info, pdc_result, sizeof(*cache_info));
496         spin_unlock_irq(&pdc_lock);
497
498         return retval;
499 }
500
501 #ifndef CONFIG_PA20
502 /**
503  * pdc_btlb_info - Return block TLB information.
504  * @btlb: The return buffer.
505  *
506  * Returns information about the hardware Block TLB.
507  */
508 int pdc_btlb_info(struct pdc_btlb_info *btlb) 
509 {
510         int retval;
511
512         spin_lock_irq(&pdc_lock);
513         retval = mem_pdc_call(PDC_BLOCK_TLB, PDC_BTLB_INFO, __pa(pdc_result), 0);
514         memcpy(btlb, pdc_result, sizeof(*btlb));
515         spin_unlock_irq(&pdc_lock);
516
517         if(retval < 0) {
518                 btlb->max_size = 0;
519         }
520         return retval;
521 }
522
523 /**
524  * pdc_mem_map_hpa - Find fixed module information.  
525  * @address: The return buffer
526  * @mod_path: pointer to dev path structure.
527  *
528  * This call was developed for S700 workstations to allow the kernel to find
529  * the I/O devices (Core I/O). In the future (Kittyhawk and beyond) this
530  * call will be replaced (on workstations) by the architected PDC_SYSTEM_MAP
531  * call.
532  *
533  * This call is supported by all existing S700 workstations (up to  Gecko).
534  */
535 int pdc_mem_map_hpa(struct pdc_memory_map *address,
536                 struct pdc_module_path *mod_path)
537 {
538         int retval;
539
540         spin_lock_irq(&pdc_lock);
541         memcpy(pdc_result2, mod_path, sizeof(*mod_path));
542         retval = mem_pdc_call(PDC_MEM_MAP, PDC_MEM_MAP_HPA, __pa(pdc_result),
543                                 __pa(pdc_result2));
544         memcpy(address, pdc_result, sizeof(*address));
545         spin_unlock_irq(&pdc_lock);
546
547         return retval;
548 }
549 #endif  /* !CONFIG_PA20 */
550
551 /**
552  * pdc_lan_station_id - Get the LAN address.
553  * @lan_addr: The return buffer.
554  * @hpa: The network device HPA.
555  *
556  * Get the LAN station address when it is not directly available from the LAN hardware.
557  */
558 int pdc_lan_station_id(char *lan_addr, unsigned long hpa)
559 {
560         int retval;
561
562         spin_lock_irq(&pdc_lock);
563         retval = mem_pdc_call(PDC_LAN_STATION_ID, PDC_LAN_STATION_ID_READ,
564                         __pa(pdc_result), hpa);
565         if (retval < 0) {
566                 /* FIXME: else read MAC from NVRAM */
567                 memset(lan_addr, 0, PDC_LAN_STATION_ID_SIZE);
568         } else {
569                 memcpy(lan_addr, pdc_result, PDC_LAN_STATION_ID_SIZE);
570         }
571         spin_unlock_irq(&pdc_lock);
572
573         return retval;
574 }
575 EXPORT_SYMBOL(pdc_lan_station_id);
576
577 /**
578  * pdc_stable_read - Read data from Stable Storage.
579  * @staddr: Stable Storage address to access.
580  * @memaddr: The memory address where Stable Storage data shall be copied.
581  * @count: number of bytes to transfert. count is multiple of 4.
582  *
583  * This PDC call reads from the Stable Storage address supplied in staddr
584  * and copies count bytes to the memory address memaddr.
585  * The call will fail if staddr+count > PDC_STABLE size.
586  */
587 int pdc_stable_read(unsigned long staddr, void *memaddr, unsigned long count)
588 {
589        int retval;
590
591        spin_lock_irq(&pdc_lock);
592        retval = mem_pdc_call(PDC_STABLE, PDC_STABLE_READ, staddr,
593                __pa(pdc_result), count);
594        convert_to_wide(pdc_result);
595        memcpy(memaddr, pdc_result, count);
596        spin_unlock_irq(&pdc_lock);
597
598        return retval;
599 }
600 EXPORT_SYMBOL(pdc_stable_read);
601
602 /**
603  * pdc_stable_write - Write data to Stable Storage.
604  * @staddr: Stable Storage address to access.
605  * @memaddr: The memory address where Stable Storage data shall be read from.
606  * @count: number of bytes to transfert. count is multiple of 4.
607  *
608  * This PDC call reads count bytes from the supplied memaddr address,
609  * and copies count bytes to the Stable Storage address staddr.
610  * The call will fail if staddr+count > PDC_STABLE size.
611  */
612 int pdc_stable_write(unsigned long staddr, void *memaddr, unsigned long count)
613 {
614        int retval;
615
616        spin_lock_irq(&pdc_lock);
617        memcpy(pdc_result, memaddr, count);
618        convert_to_wide(pdc_result);
619        retval = mem_pdc_call(PDC_STABLE, PDC_STABLE_WRITE, staddr,
620                __pa(pdc_result), count);
621        spin_unlock_irq(&pdc_lock);
622
623        return retval;
624 }
625 EXPORT_SYMBOL(pdc_stable_write);
626
627 /**
628  * pdc_stable_get_size - Get Stable Storage size in bytes.
629  * @size: pointer where the size will be stored.
630  *
631  * This PDC call returns the number of bytes in the processor's Stable
632  * Storage, which is the number of contiguous bytes implemented in Stable
633  * Storage starting from staddr=0. size in an unsigned 64-bit integer
634  * which is a multiple of four.
635  */
636 int pdc_stable_get_size(unsigned long *size)
637 {
638        int retval;
639
640        spin_lock_irq(&pdc_lock);
641        retval = mem_pdc_call(PDC_STABLE, PDC_STABLE_RETURN_SIZE, __pa(pdc_result));
642        *size = pdc_result[0];
643        spin_unlock_irq(&pdc_lock);
644
645        return retval;
646 }
647 EXPORT_SYMBOL(pdc_stable_get_size);
648
649 /**
650  * pdc_stable_verify_contents - Checks that Stable Storage contents are valid.
651  *
652  * This PDC call is meant to be used to check the integrity of the current
653  * contents of Stable Storage.
654  */
655 int pdc_stable_verify_contents(void)
656 {
657        int retval;
658
659        spin_lock_irq(&pdc_lock);
660        retval = mem_pdc_call(PDC_STABLE, PDC_STABLE_VERIFY_CONTENTS);
661        spin_unlock_irq(&pdc_lock);
662
663        return retval;
664 }
665 EXPORT_SYMBOL(pdc_stable_verify_contents);
666
667 /**
668  * pdc_stable_initialize - Sets Stable Storage contents to zero and initialize
669  * the validity indicator.
670  *
671  * This PDC call will erase all contents of Stable Storage. Use with care!
672  */
673 int pdc_stable_initialize(void)
674 {
675        int retval;
676
677        spin_lock_irq(&pdc_lock);
678        retval = mem_pdc_call(PDC_STABLE, PDC_STABLE_INITIALIZE);
679        spin_unlock_irq(&pdc_lock);
680
681        return retval;
682 }
683 EXPORT_SYMBOL(pdc_stable_initialize);
684
685 /**
686  * pdc_get_initiator - Get the SCSI Interface Card params (SCSI ID, SDTR, SE or LVD)
687  * @hwpath: fully bc.mod style path to the device.
688  * @initiator: the array to return the result into
689  *
690  * Get the SCSI operational parameters from PDC.
691  * Needed since HPUX never used BIOS or symbios card NVRAM.
692  * Most ncr/sym cards won't have an entry and just use whatever
693  * capabilities of the card are (eg Ultra, LVD). But there are
694  * several cases where it's useful:
695  *    o set SCSI id for Multi-initiator clusters,
696  *    o cable too long (ie SE scsi 10Mhz won't support 6m length),
697  *    o bus width exported is less than what the interface chip supports.
698  */
699 int pdc_get_initiator(struct hardware_path *hwpath, struct pdc_initiator *initiator)
700 {
701         int retval;
702
703         spin_lock_irq(&pdc_lock);
704
705 /* BCJ-XXXX series boxes. E.G. "9000/785/C3000" */
706 #define IS_SPROCKETS() (strlen(boot_cpu_data.pdc.sys_model_name) == 14 && \
707         strncmp(boot_cpu_data.pdc.sys_model_name, "9000/785", 8) == 0)
708
709         retval = mem_pdc_call(PDC_INITIATOR, PDC_GET_INITIATOR, 
710                               __pa(pdc_result), __pa(hwpath));
711         if (retval < PDC_OK)
712                 goto out;
713
714         if (pdc_result[0] < 16) {
715                 initiator->host_id = pdc_result[0];
716         } else {
717                 initiator->host_id = -1;
718         }
719
720         /*
721          * Sprockets and Piranha return 20 or 40 (MT/s).  Prelude returns
722          * 1, 2, 5 or 10 for 5, 10, 20 or 40 MT/s, respectively
723          */
724         switch (pdc_result[1]) {
725                 case  1: initiator->factor = 50; break;
726                 case  2: initiator->factor = 25; break;
727                 case  5: initiator->factor = 12; break;
728                 case 25: initiator->factor = 10; break;
729                 case 20: initiator->factor = 12; break;
730                 case 40: initiator->factor = 10; break;
731                 default: initiator->factor = -1; break;
732         }
733
734         if (IS_SPROCKETS()) {
735                 initiator->width = pdc_result[4];
736                 initiator->mode = pdc_result[5];
737         } else {
738                 initiator->width = -1;
739                 initiator->mode = -1;
740         }
741
742  out:
743         spin_unlock_irq(&pdc_lock);
744         return (retval >= PDC_OK);
745 }
746 EXPORT_SYMBOL(pdc_get_initiator);
747
748
749 /**
750  * pdc_pci_irt_size - Get the number of entries in the interrupt routing table.
751  * @num_entries: The return value.
752  * @hpa: The HPA for the device.
753  *
754  * This PDC function returns the number of entries in the specified cell's
755  * interrupt table.
756  * Similar to PDC_PAT stuff - but added for Forte/Allegro boxes
757  */ 
758 int pdc_pci_irt_size(unsigned long *num_entries, unsigned long hpa)
759 {
760         int retval;
761
762         spin_lock_irq(&pdc_lock);
763         retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL_SIZE, 
764                               __pa(pdc_result), hpa);
765         convert_to_wide(pdc_result);
766         *num_entries = pdc_result[0];
767         spin_unlock_irq(&pdc_lock);
768
769         return retval;
770 }
771
772 /** 
773  * pdc_pci_irt - Get the PCI interrupt routing table.
774  * @num_entries: The number of entries in the table.
775  * @hpa: The Hard Physical Address of the device.
776  * @tbl: 
777  *
778  * Get the PCI interrupt routing table for the device at the given HPA.
779  * Similar to PDC_PAT stuff - but added for Forte/Allegro boxes
780  */
781 int pdc_pci_irt(unsigned long num_entries, unsigned long hpa, void *tbl)
782 {
783         int retval;
784
785         BUG_ON((unsigned long)tbl & 0x7);
786
787         spin_lock_irq(&pdc_lock);
788         pdc_result[0] = num_entries;
789         retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL, 
790                               __pa(pdc_result), hpa, __pa(tbl));
791         spin_unlock_irq(&pdc_lock);
792
793         return retval;
794 }
795
796
797 #if 0   /* UNTEST CODE - left here in case someone needs it */
798
799 /** 
800  * pdc_pci_config_read - read PCI config space.
801  * @hpa         token from PDC to indicate which PCI device
802  * @pci_addr    configuration space address to read from
803  *
804  * Read PCI Configuration space *before* linux PCI subsystem is running.
805  */
806 unsigned int pdc_pci_config_read(void *hpa, unsigned long cfg_addr)
807 {
808         int retval;
809         spin_lock_irq(&pdc_lock);
810         pdc_result[0] = 0;
811         pdc_result[1] = 0;
812         retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_READ_CONFIG, 
813                               __pa(pdc_result), hpa, cfg_addr&~3UL, 4UL);
814         spin_unlock_irq(&pdc_lock);
815         return retval ? ~0 : (unsigned int) pdc_result[0];
816 }
817
818
819 /** 
820  * pdc_pci_config_write - read PCI config space.
821  * @hpa         token from PDC to indicate which PCI device
822  * @pci_addr    configuration space address to write
823  * @val         value we want in the 32-bit register
824  *
825  * Write PCI Configuration space *before* linux PCI subsystem is running.
826  */
827 void pdc_pci_config_write(void *hpa, unsigned long cfg_addr, unsigned int val)
828 {
829         int retval;
830         spin_lock_irq(&pdc_lock);
831         pdc_result[0] = 0;
832         retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_WRITE_CONFIG, 
833                               __pa(pdc_result), hpa,
834                               cfg_addr&~3UL, 4UL, (unsigned long) val);
835         spin_unlock_irq(&pdc_lock);
836         return retval;
837 }
838 #endif /* UNTESTED CODE */
839
840 /**
841  * pdc_tod_read - Read the Time-Of-Day clock.
842  * @tod: The return buffer:
843  *
844  * Read the Time-Of-Day clock
845  */
846 int pdc_tod_read(struct pdc_tod *tod)
847 {
848         int retval;
849
850         spin_lock_irq(&pdc_lock);
851         retval = mem_pdc_call(PDC_TOD, PDC_TOD_READ, __pa(pdc_result), 0);
852         convert_to_wide(pdc_result);
853         memcpy(tod, pdc_result, sizeof(*tod));
854         spin_unlock_irq(&pdc_lock);
855
856         return retval;
857 }
858 EXPORT_SYMBOL(pdc_tod_read);
859
860 /**
861  * pdc_tod_set - Set the Time-Of-Day clock.
862  * @sec: The number of seconds since epoch.
863  * @usec: The number of micro seconds.
864  *
865  * Set the Time-Of-Day clock.
866  */ 
867 int pdc_tod_set(unsigned long sec, unsigned long usec)
868 {
869         int retval;
870
871         spin_lock_irq(&pdc_lock);
872         retval = mem_pdc_call(PDC_TOD, PDC_TOD_WRITE, sec, usec);
873         spin_unlock_irq(&pdc_lock);
874
875         return retval;
876 }
877 EXPORT_SYMBOL(pdc_tod_set);
878
879 #ifdef __LP64__
880 int pdc_mem_mem_table(struct pdc_memory_table_raddr *r_addr,
881                 struct pdc_memory_table *tbl, unsigned long entries)
882 {
883         int retval;
884
885         spin_lock_irq(&pdc_lock);
886         retval = mem_pdc_call(PDC_MEM, PDC_MEM_TABLE, __pa(pdc_result), __pa(pdc_result2), entries);
887         convert_to_wide(pdc_result);
888         memcpy(r_addr, pdc_result, sizeof(*r_addr));
889         memcpy(tbl, pdc_result2, entries * sizeof(*tbl));
890         spin_unlock_irq(&pdc_lock);
891
892         return retval;
893 }
894 #endif /* __LP64__ */
895
896 /* FIXME: Is this pdc used?  I could not find type reference to ftc_bitmap
897  * so I guessed at unsigned long.  Someone who knows what this does, can fix
898  * it later. :)
899  */
900 int pdc_do_firm_test_reset(unsigned long ftc_bitmap)
901 {
902         int retval;
903
904         spin_lock_irq(&pdc_lock);
905         retval = mem_pdc_call(PDC_BROADCAST_RESET, PDC_DO_FIRM_TEST_RESET,
906                               PDC_FIRM_TEST_MAGIC, ftc_bitmap);
907         spin_unlock_irq(&pdc_lock);
908
909         return retval;
910 }
911
912 /*
913  * pdc_do_reset - Reset the system.
914  *
915  * Reset the system.
916  */
917 int pdc_do_reset(void)
918 {
919         int retval;
920
921         spin_lock_irq(&pdc_lock);
922         retval = mem_pdc_call(PDC_BROADCAST_RESET, PDC_DO_RESET);
923         spin_unlock_irq(&pdc_lock);
924
925         return retval;
926 }
927
928 /*
929  * pdc_soft_power_info - Enable soft power switch.
930  * @power_reg: address of soft power register
931  *
932  * Return the absolute address of the soft power switch register
933  */
934 int __init pdc_soft_power_info(unsigned long *power_reg)
935 {
936         int retval;
937
938         *power_reg = (unsigned long) (-1);
939         
940         spin_lock_irq(&pdc_lock);
941         retval = mem_pdc_call(PDC_SOFT_POWER, PDC_SOFT_POWER_INFO, __pa(pdc_result), 0);
942         if (retval == PDC_OK) {
943                 convert_to_wide(pdc_result);
944                 *power_reg = f_extend(pdc_result[0]);
945         }
946         spin_unlock_irq(&pdc_lock);
947
948         return retval;
949 }
950
951 /*
952  * pdc_soft_power_button - Control the soft power button behaviour
953  * @sw_control: 0 for hardware control, 1 for software control 
954  *
955  *
956  * This PDC function places the soft power button under software or
957  * hardware control.
958  * Under software control the OS may control to when to allow to shut 
959  * down the system. Under hardware control pressing the power button 
960  * powers off the system immediately.
961  */
962 int pdc_soft_power_button(int sw_control)
963 {
964         int retval;
965         spin_lock_irq(&pdc_lock);
966         retval = mem_pdc_call(PDC_SOFT_POWER, PDC_SOFT_POWER_ENABLE, __pa(pdc_result), sw_control);
967         spin_unlock_irq(&pdc_lock);
968         return retval;
969 }
970
971 /*
972  * pdc_io_reset - Hack to avoid overlapping range registers of Bridges devices.
973  * Primarily a problem on T600 (which parisc-linux doesn't support) but
974  * who knows what other platform firmware might do with this OS "hook".
975  */
976 void pdc_io_reset(void)
977 {
978         spin_lock_irq(&pdc_lock);  
979         mem_pdc_call(PDC_IO, PDC_IO_RESET, 0);
980         spin_unlock_irq(&pdc_lock);
981 }
982
983 /*
984  * pdc_io_reset_devices - Hack to Stop USB controller
985  *
986  * If PDC used the usb controller, the usb controller
987  * is still running and will crash the machines during iommu 
988  * setup, because of still running DMA. This PDC call
989  * stops the USB controller.
990  * Normally called after calling pdc_io_reset().
991  */
992 void pdc_io_reset_devices(void)
993 {
994         spin_lock_irq(&pdc_lock);  
995         mem_pdc_call(PDC_IO, PDC_IO_RESET_DEVICES, 0);
996         spin_unlock_irq(&pdc_lock);
997 }
998
999
1000 /**
1001  * pdc_iodc_putc - Console character print using IODC.
1002  * @c: the character to output.
1003  *
1004  * Note that only these special chars are architected for console IODC io:
1005  * BEL, BS, CR, and LF. Others are passed through.
1006  * Since the HP console requires CR+LF to perform a 'newline', we translate
1007  * "\n" to "\r\n".
1008  */
1009 void pdc_iodc_putc(unsigned char c)
1010 {
1011         /* XXX Should we spinlock posx usage */
1012         static int posx;        /* for simple TAB-Simulation... */
1013         static int __attribute__((aligned(8)))   iodc_retbuf[32];
1014         static char __attribute__((aligned(64))) iodc_dbuf[4096];
1015         unsigned int n;
1016         unsigned int flags;
1017
1018         switch (c) {
1019         case '\n':
1020                 iodc_dbuf[0] = '\r';
1021                 iodc_dbuf[1] = '\n';
1022                 n = 2;
1023                 posx = 0;
1024                 break;
1025         case '\t':
1026                 pdc_iodc_putc(' ');
1027                 while (posx & 7)        /* expand TAB */
1028                         pdc_iodc_putc(' ');
1029                 return;         /* return since IODC can't handle this */
1030         case '\b':
1031                 posx-=2;                /* BS */
1032         default:
1033                 iodc_dbuf[0] = c;
1034                 n = 1;
1035                 posx++;
1036                 break;
1037         }
1038
1039         spin_lock_irqsave(&pdc_lock, flags);
1040         real32_call(PAGE0->mem_cons.iodc_io,
1041                     (unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT,
1042                     PAGE0->mem_cons.spa, __pa(PAGE0->mem_cons.dp.layers),
1043                     __pa(iodc_retbuf), 0, __pa(iodc_dbuf), n, 0);
1044         spin_unlock_irqrestore(&pdc_lock, flags);
1045 }
1046
1047 /**
1048  * pdc_iodc_outc - Console character print using IODC (without conversions).
1049  * @c: the character to output.
1050  *
1051  * Write the character directly to the IODC console.
1052  */
1053 void pdc_iodc_outc(unsigned char c)
1054 {
1055         unsigned int n, flags;
1056
1057         /* fill buffer with one caracter and print it */
1058         static int __attribute__((aligned(8)))   iodc_retbuf[32];
1059         static char __attribute__((aligned(64))) iodc_dbuf[4096];
1060
1061         n = 1;
1062         iodc_dbuf[0] = c;
1063
1064         spin_lock_irqsave(&pdc_lock, flags);
1065         real32_call(PAGE0->mem_cons.iodc_io,
1066                     (unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT,
1067                     PAGE0->mem_cons.spa, __pa(PAGE0->mem_cons.dp.layers),
1068                     __pa(iodc_retbuf), 0, __pa(iodc_dbuf), n, 0);
1069         spin_unlock_irqrestore(&pdc_lock, flags);
1070 }
1071
1072 /**
1073  * pdc_iodc_getc - Read a character (non-blocking) from the PDC console.
1074  *
1075  * Read a character (non-blocking) from the PDC console, returns -1 if
1076  * key is not present.
1077  */
1078 int pdc_iodc_getc(void)
1079 {
1080         unsigned int flags;
1081         static int __attribute__((aligned(8)))   iodc_retbuf[32];
1082         static char __attribute__((aligned(64))) iodc_dbuf[4096];
1083         int ch;
1084         int status;
1085
1086         /* Bail if no console input device. */
1087         if (!PAGE0->mem_kbd.iodc_io)
1088                 return 0;
1089         
1090         /* wait for a keyboard (rs232)-input */
1091         spin_lock_irqsave(&pdc_lock, flags);
1092         real32_call(PAGE0->mem_kbd.iodc_io,
1093                     (unsigned long)PAGE0->mem_kbd.hpa, ENTRY_IO_CIN,
1094                     PAGE0->mem_kbd.spa, __pa(PAGE0->mem_kbd.dp.layers), 
1095                     __pa(iodc_retbuf), 0, __pa(iodc_dbuf), 1, 0);
1096
1097         ch = *iodc_dbuf;
1098         status = *iodc_retbuf;
1099         spin_unlock_irqrestore(&pdc_lock, flags);
1100
1101         if (status == 0)
1102             return -1;
1103         
1104         return ch;
1105 }
1106
1107 int pdc_sti_call(unsigned long func, unsigned long flags,
1108                  unsigned long inptr, unsigned long outputr,
1109                  unsigned long glob_cfg)
1110 {
1111         int retval;
1112
1113         spin_lock_irq(&pdc_lock);  
1114         retval = real32_call(func, flags, inptr, outputr, glob_cfg);
1115         spin_unlock_irq(&pdc_lock);
1116
1117         return retval;
1118 }
1119 EXPORT_SYMBOL(pdc_sti_call);
1120
1121 #ifdef __LP64__
1122 /**
1123  * pdc_pat_cell_get_number - Returns the cell number.
1124  * @cell_info: The return buffer.
1125  *
1126  * This PDC call returns the cell number of the cell from which the call
1127  * is made.
1128  */
1129 int pdc_pat_cell_get_number(struct pdc_pat_cell_num *cell_info)
1130 {
1131         int retval;
1132
1133         spin_lock_irq(&pdc_lock);
1134         retval = mem_pdc_call(PDC_PAT_CELL, PDC_PAT_CELL_GET_NUMBER, __pa(pdc_result));
1135         memcpy(cell_info, pdc_result, sizeof(*cell_info));
1136         spin_unlock_irq(&pdc_lock);
1137
1138         return retval;
1139 }
1140
1141 /**
1142  * pdc_pat_cell_module - Retrieve the cell's module information.
1143  * @actcnt: The number of bytes written to mem_addr.
1144  * @ploc: The physical location.
1145  * @mod: The module index.
1146  * @view_type: The view of the address type.
1147  * @mem_addr: The return buffer.
1148  *
1149  * This PDC call returns information about each module attached to the cell
1150  * at the specified location.
1151  */
1152 int pdc_pat_cell_module(unsigned long *actcnt, unsigned long ploc, unsigned long mod,
1153                         unsigned long view_type, void *mem_addr)
1154 {
1155         int retval;
1156         static struct pdc_pat_cell_mod_maddr_block result __attribute__ ((aligned (8)));
1157
1158         spin_lock_irq(&pdc_lock);
1159         retval = mem_pdc_call(PDC_PAT_CELL, PDC_PAT_CELL_MODULE, __pa(pdc_result), 
1160                               ploc, mod, view_type, __pa(&result));
1161         if(!retval) {
1162                 *actcnt = pdc_result[0];
1163                 memcpy(mem_addr, &result, *actcnt);
1164         }
1165         spin_unlock_irq(&pdc_lock);
1166
1167         return retval;
1168 }
1169
1170 /**
1171  * pdc_pat_cpu_get_number - Retrieve the cpu number.
1172  * @cpu_info: The return buffer.
1173  * @hpa: The Hard Physical Address of the CPU.
1174  *
1175  * Retrieve the cpu number for the cpu at the specified HPA.
1176  */
1177 int pdc_pat_cpu_get_number(struct pdc_pat_cpu_num *cpu_info, void *hpa)
1178 {
1179         int retval;
1180
1181         spin_lock_irq(&pdc_lock);
1182         retval = mem_pdc_call(PDC_PAT_CPU, PDC_PAT_CPU_GET_NUMBER,
1183                               __pa(&pdc_result), hpa);
1184         memcpy(cpu_info, pdc_result, sizeof(*cpu_info));
1185         spin_unlock_irq(&pdc_lock);
1186
1187         return retval;
1188 }
1189
1190 /**
1191  * pdc_pat_get_irt_size - Retrieve the number of entries in the cell's interrupt table.
1192  * @num_entries: The return value.
1193  * @cell_num: The target cell.
1194  *
1195  * This PDC function returns the number of entries in the specified cell's
1196  * interrupt table.
1197  */
1198 int pdc_pat_get_irt_size(unsigned long *num_entries, unsigned long cell_num)
1199 {
1200         int retval;
1201
1202         spin_lock_irq(&pdc_lock);
1203         retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_GET_PCI_ROUTING_TABLE_SIZE,
1204                               __pa(pdc_result), cell_num);
1205         *num_entries = pdc_result[0];
1206         spin_unlock_irq(&pdc_lock);
1207
1208         return retval;
1209 }
1210
1211 /**
1212  * pdc_pat_get_irt - Retrieve the cell's interrupt table.
1213  * @r_addr: The return buffer.
1214  * @cell_num: The target cell.
1215  *
1216  * This PDC function returns the actual interrupt table for the specified cell.
1217  */
1218 int pdc_pat_get_irt(void *r_addr, unsigned long cell_num)
1219 {
1220         int retval;
1221
1222         spin_lock_irq(&pdc_lock);
1223         retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_GET_PCI_ROUTING_TABLE,
1224                               __pa(r_addr), cell_num);
1225         spin_unlock_irq(&pdc_lock);
1226
1227         return retval;
1228 }
1229
1230 /**
1231  * pdc_pat_pd_get_addr_map - Retrieve information about memory address ranges.
1232  * @actlen: The return buffer.
1233  * @mem_addr: Pointer to the memory buffer.
1234  * @count: The number of bytes to read from the buffer.
1235  * @offset: The offset with respect to the beginning of the buffer.
1236  *
1237  */
1238 int pdc_pat_pd_get_addr_map(unsigned long *actual_len, void *mem_addr, 
1239                             unsigned long count, unsigned long offset)
1240 {
1241         int retval;
1242
1243         spin_lock_irq(&pdc_lock);
1244         retval = mem_pdc_call(PDC_PAT_PD, PDC_PAT_PD_GET_ADDR_MAP, __pa(pdc_result), 
1245                               __pa(pdc_result2), count, offset);
1246         *actual_len = pdc_result[0];
1247         memcpy(mem_addr, pdc_result2, *actual_len);
1248         spin_unlock_irq(&pdc_lock);
1249
1250         return retval;
1251 }
1252
1253 /**
1254  * pdc_pat_io_pci_cfg_read - Read PCI configuration space.
1255  * @pci_addr: PCI configuration space address for which the read request is being made.
1256  * @pci_size: Size of read in bytes. Valid values are 1, 2, and 4. 
1257  * @mem_addr: Pointer to return memory buffer.
1258  *
1259  */
1260 int pdc_pat_io_pci_cfg_read(unsigned long pci_addr, int pci_size, u32 *mem_addr)
1261 {
1262         int retval;
1263         spin_lock_irq(&pdc_lock);
1264         retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_PCI_CONFIG_READ,
1265                                         __pa(pdc_result), pci_addr, pci_size);
1266         switch(pci_size) {
1267                 case 1: *(u8 *) mem_addr =  (u8)  pdc_result[0];
1268                 case 2: *(u16 *)mem_addr =  (u16) pdc_result[0];
1269                 case 4: *(u32 *)mem_addr =  (u32) pdc_result[0];
1270         }
1271         spin_unlock_irq(&pdc_lock);
1272
1273         return retval;
1274 }
1275
1276 /**
1277  * pdc_pat_io_pci_cfg_write - Retrieve information about memory address ranges.
1278  * @pci_addr: PCI configuration space address for which the write  request is being made.
1279  * @pci_size: Size of write in bytes. Valid values are 1, 2, and 4. 
1280  * @value: Pointer to 1, 2, or 4 byte value in low order end of argument to be 
1281  *         written to PCI Config space.
1282  *
1283  */
1284 int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 val)
1285 {
1286         int retval;
1287
1288         spin_lock_irq(&pdc_lock);
1289         retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_PCI_CONFIG_WRITE,
1290                                 pci_addr, pci_size, val);
1291         spin_unlock_irq(&pdc_lock);
1292
1293         return retval;
1294 }
1295 #endif /* __LP64__ */
1296
1297
1298 /***************** 32-bit real-mode calls ***********/
1299 /* The struct below is used
1300  * to overlay real_stack (real2.S), preparing a 32-bit call frame.
1301  * real32_call_asm() then uses this stack in narrow real mode
1302  */
1303
1304 struct narrow_stack {
1305         /* use int, not long which is 64 bits */
1306         unsigned int arg13;
1307         unsigned int arg12;
1308         unsigned int arg11;
1309         unsigned int arg10;
1310         unsigned int arg9;
1311         unsigned int arg8;
1312         unsigned int arg7;
1313         unsigned int arg6;
1314         unsigned int arg5;
1315         unsigned int arg4;
1316         unsigned int arg3;
1317         unsigned int arg2;
1318         unsigned int arg1;
1319         unsigned int arg0;
1320         unsigned int frame_marker[8];
1321         unsigned int sp;
1322         /* in reality, there's nearly 8k of stack after this */
1323 };
1324
1325 long real32_call(unsigned long fn, ...)
1326 {
1327         va_list args;
1328         extern struct narrow_stack real_stack;
1329         extern unsigned long real32_call_asm(unsigned int *,
1330                                              unsigned int *, 
1331                                              unsigned int);
1332         
1333         va_start(args, fn);
1334         real_stack.arg0 = va_arg(args, unsigned int);
1335         real_stack.arg1 = va_arg(args, unsigned int);
1336         real_stack.arg2 = va_arg(args, unsigned int);
1337         real_stack.arg3 = va_arg(args, unsigned int);
1338         real_stack.arg4 = va_arg(args, unsigned int);
1339         real_stack.arg5 = va_arg(args, unsigned int);
1340         real_stack.arg6 = va_arg(args, unsigned int);
1341         real_stack.arg7 = va_arg(args, unsigned int);
1342         real_stack.arg8 = va_arg(args, unsigned int);
1343         real_stack.arg9 = va_arg(args, unsigned int);
1344         real_stack.arg10 = va_arg(args, unsigned int);
1345         real_stack.arg11 = va_arg(args, unsigned int);
1346         real_stack.arg12 = va_arg(args, unsigned int);
1347         real_stack.arg13 = va_arg(args, unsigned int);
1348         va_end(args);
1349         
1350         return real32_call_asm(&real_stack.sp, &real_stack.arg0, fn);
1351 }
1352
1353 #ifdef __LP64__
1354 /***************** 64-bit real-mode calls ***********/
1355
1356 struct wide_stack {
1357         unsigned long arg0;
1358         unsigned long arg1;
1359         unsigned long arg2;
1360         unsigned long arg3;
1361         unsigned long arg4;
1362         unsigned long arg5;
1363         unsigned long arg6;
1364         unsigned long arg7;
1365         unsigned long arg8;
1366         unsigned long arg9;
1367         unsigned long arg10;
1368         unsigned long arg11;
1369         unsigned long arg12;
1370         unsigned long arg13;
1371         unsigned long frame_marker[2];  /* rp, previous sp */
1372         unsigned long sp;
1373         /* in reality, there's nearly 8k of stack after this */
1374 };
1375
1376 long real64_call(unsigned long fn, ...)
1377 {
1378         va_list args;
1379         extern struct wide_stack real64_stack;
1380         extern unsigned long real64_call_asm(unsigned long *,
1381                                              unsigned long *, 
1382                                              unsigned long);
1383     
1384         va_start(args, fn);
1385         real64_stack.arg0 = va_arg(args, unsigned long);
1386         real64_stack.arg1 = va_arg(args, unsigned long);
1387         real64_stack.arg2 = va_arg(args, unsigned long);
1388         real64_stack.arg3 = va_arg(args, unsigned long);
1389         real64_stack.arg4 = va_arg(args, unsigned long);
1390         real64_stack.arg5 = va_arg(args, unsigned long);
1391         real64_stack.arg6 = va_arg(args, unsigned long);
1392         real64_stack.arg7 = va_arg(args, unsigned long);
1393         real64_stack.arg8 = va_arg(args, unsigned long);
1394         real64_stack.arg9 = va_arg(args, unsigned long);
1395         real64_stack.arg10 = va_arg(args, unsigned long);
1396         real64_stack.arg11 = va_arg(args, unsigned long);
1397         real64_stack.arg12 = va_arg(args, unsigned long);
1398         real64_stack.arg13 = va_arg(args, unsigned long);
1399         va_end(args);
1400         
1401         return real64_call_asm(&real64_stack.sp, &real64_stack.arg0, fn);
1402 }
1403
1404 #endif /* __LP64__ */
1405