1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53#include <stdarg.h>
54
55#include <linux/delay.h>
56#include <linux/init.h>
57#include <linux/kernel.h>
58#include <linux/module.h>
59#include <linux/string.h>
60#include <linux/spinlock.h>
61
62#include <asm/page.h>
63#include <asm/pdc.h>
64#include <asm/pdcpat.h>
65#include <asm/processor.h>
66
67#if defined(BOOTLOADER)
68# undef spin_lock_irqsave
69# define spin_lock_irqsave(a, b) { b = 1; }
70# undef spin_unlock_irqrestore
71# define spin_unlock_irqrestore(a, b)
72#else
73static DEFINE_SPINLOCK(pdc_lock);
74#endif
75
76extern unsigned long pdc_result[NUM_PDC_RESULT];
77extern unsigned long pdc_result2[NUM_PDC_RESULT];
78
79#ifdef CONFIG_64BIT
80#define WIDE_FIRMWARE 0x1
81#define NARROW_FIRMWARE 0x2
82
83
84
85int parisc_narrow_firmware __ro_after_init = 1;
86#endif
87
88
89
90
91
92
93
94
95
96
97
98
99#ifdef CONFIG_64BIT
100long real64_call(unsigned long function, ...);
101#endif
102long real32_call(unsigned long function, ...);
103
104#ifdef CONFIG_64BIT
105# define MEM_PDC (unsigned long)(PAGE0->mem_pdc_hi) << 32 | PAGE0->mem_pdc
106# define mem_pdc_call(args...) unlikely(parisc_narrow_firmware) ? real32_call(MEM_PDC, args) : real64_call(MEM_PDC, args)
107#else
108# define MEM_PDC (unsigned long)PAGE0->mem_pdc
109# define mem_pdc_call(args...) real32_call(MEM_PDC, args)
110#endif
111
112
113
114
115
116
117
118
119
120static unsigned long f_extend(unsigned long address)
121{
122#ifdef CONFIG_64BIT
123 if(unlikely(parisc_narrow_firmware)) {
124 if((address & 0xff000000) == 0xf0000000)
125 return 0xf0f0f0f000000000UL | (u32)address;
126
127 if((address & 0xf0000000) == 0xf0000000)
128 return 0xffffffff00000000UL | (u32)address;
129 }
130#endif
131 return address;
132}
133
134
135
136
137
138
139
140
141
142static void convert_to_wide(unsigned long *addr)
143{
144#ifdef CONFIG_64BIT
145 int i;
146 unsigned int *p = (unsigned int *)addr;
147
148 if (unlikely(parisc_narrow_firmware)) {
149 for (i = (NUM_PDC_RESULT-1); i >= 0; --i)
150 addr[i] = p[i];
151 }
152#endif
153}
154
155#ifdef CONFIG_64BIT
156void set_firmware_width_unlocked(void)
157{
158 int ret;
159
160 ret = mem_pdc_call(PDC_MODEL, PDC_MODEL_CAPABILITIES,
161 __pa(pdc_result), 0);
162 convert_to_wide(pdc_result);
163 if (pdc_result[0] != NARROW_FIRMWARE)
164 parisc_narrow_firmware = 0;
165}
166
167
168
169
170
171
172
173void set_firmware_width(void)
174{
175 unsigned long flags;
176 spin_lock_irqsave(&pdc_lock, flags);
177 set_firmware_width_unlocked();
178 spin_unlock_irqrestore(&pdc_lock, flags);
179}
180#else
181void set_firmware_width_unlocked(void)
182{
183 return;
184}
185
186void set_firmware_width(void)
187{
188 return;
189}
190#endif
191
192
193#if !defined(BOOTLOADER)
194
195
196
197
198
199
200void pdc_emergency_unlock(void)
201{
202
203 if (spin_is_locked(&pdc_lock))
204 spin_unlock(&pdc_lock);
205}
206
207
208
209
210
211
212
213
214
215
216
217int pdc_add_valid(unsigned long address)
218{
219 int retval;
220 unsigned long flags;
221
222 spin_lock_irqsave(&pdc_lock, flags);
223 retval = mem_pdc_call(PDC_ADD_VALID, PDC_ADD_VALID_VERIFY, address);
224 spin_unlock_irqrestore(&pdc_lock, flags);
225
226 return retval;
227}
228EXPORT_SYMBOL(pdc_add_valid);
229
230
231
232
233
234
235
236int __init pdc_instr(unsigned int *instr)
237{
238 int retval;
239 unsigned long flags;
240
241 spin_lock_irqsave(&pdc_lock, flags);
242 retval = mem_pdc_call(PDC_INSTR, 0UL, __pa(pdc_result));
243 convert_to_wide(pdc_result);
244 *instr = pdc_result[0];
245 spin_unlock_irqrestore(&pdc_lock, flags);
246
247 return retval;
248}
249
250
251
252
253
254
255
256
257
258int __init pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_info, unsigned long len)
259{
260 int retval;
261 unsigned long flags;
262
263 spin_lock_irqsave(&pdc_lock, flags);
264 memcpy(&pdc_result, chassis_info, sizeof(*chassis_info));
265 memcpy(&pdc_result2, led_info, len);
266 retval = mem_pdc_call(PDC_CHASSIS, PDC_RETURN_CHASSIS_INFO,
267 __pa(pdc_result), __pa(pdc_result2), len);
268 memcpy(chassis_info, pdc_result, sizeof(*chassis_info));
269 memcpy(led_info, pdc_result2, len);
270 spin_unlock_irqrestore(&pdc_lock, flags);
271
272 return retval;
273}
274
275
276
277
278
279
280
281#ifdef CONFIG_64BIT
282int pdc_pat_chassis_send_log(unsigned long state, unsigned long data)
283{
284 int retval = 0;
285 unsigned long flags;
286
287 if (!is_pdc_pat())
288 return -1;
289
290 spin_lock_irqsave(&pdc_lock, flags);
291 retval = mem_pdc_call(PDC_PAT_CHASSIS_LOG, PDC_PAT_CHASSIS_WRITE_LOG, __pa(&state), __pa(&data));
292 spin_unlock_irqrestore(&pdc_lock, flags);
293
294 return retval;
295}
296#endif
297
298
299
300
301
302int pdc_chassis_disp(unsigned long disp)
303{
304 int retval = 0;
305 unsigned long flags;
306
307 spin_lock_irqsave(&pdc_lock, flags);
308 retval = mem_pdc_call(PDC_CHASSIS, PDC_CHASSIS_DISP, disp);
309 spin_unlock_irqrestore(&pdc_lock, flags);
310
311 return retval;
312}
313
314
315
316
317
318int __pdc_cpu_rendezvous(void)
319{
320 if (is_pdc_pat())
321 return mem_pdc_call(PDC_PAT_CPU, PDC_PAT_CPU_RENDEZVOUS);
322 else
323 return mem_pdc_call(PDC_PROC, 1, 0);
324}
325
326
327
328
329
330
331int pdc_chassis_warn(unsigned long *warn)
332{
333 int retval = 0;
334 unsigned long flags;
335
336 spin_lock_irqsave(&pdc_lock, flags);
337 retval = mem_pdc_call(PDC_CHASSIS, PDC_CHASSIS_WARN, __pa(pdc_result));
338 *warn = pdc_result[0];
339 spin_unlock_irqrestore(&pdc_lock, flags);
340
341 return retval;
342}
343
344int pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info)
345{
346 int ret;
347
348 ret = mem_pdc_call(PDC_COPROC, PDC_COPROC_CFG, __pa(pdc_result));
349 convert_to_wide(pdc_result);
350 pdc_coproc_info->ccr_functional = pdc_result[0];
351 pdc_coproc_info->ccr_present = pdc_result[1];
352 pdc_coproc_info->revision = pdc_result[17];
353 pdc_coproc_info->model = pdc_result[18];
354
355 return ret;
356}
357
358
359
360
361
362
363
364
365int pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info)
366{
367 int ret;
368 unsigned long flags;
369
370 spin_lock_irqsave(&pdc_lock, flags);
371 ret = pdc_coproc_cfg_unlocked(pdc_coproc_info);
372 spin_unlock_irqrestore(&pdc_lock, flags);
373
374 return ret;
375}
376
377
378
379
380
381
382
383
384
385
386
387
388int pdc_iodc_read(unsigned long *actcnt, unsigned long hpa, unsigned int index,
389 void *iodc_data, unsigned int iodc_data_size)
390{
391 int retval;
392 unsigned long flags;
393
394 spin_lock_irqsave(&pdc_lock, flags);
395 retval = mem_pdc_call(PDC_IODC, PDC_IODC_READ, __pa(pdc_result), hpa,
396 index, __pa(pdc_result2), iodc_data_size);
397 convert_to_wide(pdc_result);
398 *actcnt = pdc_result[0];
399 memcpy(iodc_data, pdc_result2, iodc_data_size);
400 spin_unlock_irqrestore(&pdc_lock, flags);
401
402 return retval;
403}
404EXPORT_SYMBOL(pdc_iodc_read);
405
406
407
408
409
410
411
412
413
414
415int pdc_system_map_find_mods(struct pdc_system_map_mod_info *pdc_mod_info,
416 struct pdc_module_path *mod_path, long mod_index)
417{
418 int retval;
419 unsigned long flags;
420
421 spin_lock_irqsave(&pdc_lock, flags);
422 retval = mem_pdc_call(PDC_SYSTEM_MAP, PDC_FIND_MODULE, __pa(pdc_result),
423 __pa(pdc_result2), mod_index);
424 convert_to_wide(pdc_result);
425 memcpy(pdc_mod_info, pdc_result, sizeof(*pdc_mod_info));
426 memcpy(mod_path, pdc_result2, sizeof(*mod_path));
427 spin_unlock_irqrestore(&pdc_lock, flags);
428
429 pdc_mod_info->mod_addr = f_extend(pdc_mod_info->mod_addr);
430 return retval;
431}
432
433
434
435
436
437
438
439
440
441
442int pdc_system_map_find_addrs(struct pdc_system_map_addr_info *pdc_addr_info,
443 long mod_index, long addr_index)
444{
445 int retval;
446 unsigned long flags;
447
448 spin_lock_irqsave(&pdc_lock, flags);
449 retval = mem_pdc_call(PDC_SYSTEM_MAP, PDC_FIND_ADDRESS, __pa(pdc_result),
450 mod_index, addr_index);
451 convert_to_wide(pdc_result);
452 memcpy(pdc_addr_info, pdc_result, sizeof(*pdc_addr_info));
453 spin_unlock_irqrestore(&pdc_lock, flags);
454
455 pdc_addr_info->mod_addr = f_extend(pdc_addr_info->mod_addr);
456 return retval;
457}
458
459
460
461
462
463
464
465int pdc_model_info(struct pdc_model *model)
466{
467 int retval;
468 unsigned long flags;
469
470 spin_lock_irqsave(&pdc_lock, flags);
471 retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_INFO, __pa(pdc_result), 0);
472 convert_to_wide(pdc_result);
473 memcpy(model, pdc_result, sizeof(*model));
474 spin_unlock_irqrestore(&pdc_lock, flags);
475
476 return retval;
477}
478
479
480
481
482
483
484
485
486
487int pdc_model_sysmodel(char *name)
488{
489 int retval;
490 unsigned long flags;
491
492 spin_lock_irqsave(&pdc_lock, flags);
493 retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_SYSMODEL, __pa(pdc_result),
494 OS_ID_HPUX, __pa(name));
495 convert_to_wide(pdc_result);
496
497 if (retval == PDC_OK) {
498 name[pdc_result[0]] = '\0';
499 } else {
500 name[0] = 0;
501 }
502 spin_unlock_irqrestore(&pdc_lock, flags);
503
504 return retval;
505}
506
507
508
509
510
511
512
513
514
515
516
517int pdc_model_versions(unsigned long *versions, int id)
518{
519 int retval;
520 unsigned long flags;
521
522 spin_lock_irqsave(&pdc_lock, flags);
523 retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_VERSIONS, __pa(pdc_result), id);
524 convert_to_wide(pdc_result);
525 *versions = pdc_result[0];
526 spin_unlock_irqrestore(&pdc_lock, flags);
527
528 return retval;
529}
530
531
532
533
534
535
536
537
538int pdc_model_cpuid(unsigned long *cpu_id)
539{
540 int retval;
541 unsigned long flags;
542
543 spin_lock_irqsave(&pdc_lock, flags);
544 pdc_result[0] = 0;
545 retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_CPU_ID, __pa(pdc_result), 0);
546 convert_to_wide(pdc_result);
547 *cpu_id = pdc_result[0];
548 spin_unlock_irqrestore(&pdc_lock, flags);
549
550 return retval;
551}
552
553
554
555
556
557
558
559
560int pdc_model_capabilities(unsigned long *capabilities)
561{
562 int retval;
563 unsigned long flags;
564
565 spin_lock_irqsave(&pdc_lock, flags);
566 pdc_result[0] = 0;
567 retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_CAPABILITIES, __pa(pdc_result), 0);
568 convert_to_wide(pdc_result);
569 if (retval == PDC_OK) {
570 *capabilities = pdc_result[0];
571 } else {
572 *capabilities = PDC_MODEL_OS32;
573 }
574 spin_unlock_irqrestore(&pdc_lock, flags);
575
576 return retval;
577}
578
579
580
581
582
583
584
585
586
587
588int pdc_model_platform_info(char *orig_prod_num, char *current_prod_num,
589 char *serial_no)
590{
591 int retval;
592 unsigned long flags;
593
594 spin_lock_irqsave(&pdc_lock, flags);
595 retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_GET_PLATFORM_INFO,
596 __pa(orig_prod_num), __pa(current_prod_num), __pa(serial_no));
597 convert_to_wide(pdc_result);
598 spin_unlock_irqrestore(&pdc_lock, flags);
599
600 return retval;
601}
602
603
604
605
606
607
608
609int pdc_cache_info(struct pdc_cache_info *cache_info)
610{
611 int retval;
612 unsigned long flags;
613
614 spin_lock_irqsave(&pdc_lock, flags);
615 retval = mem_pdc_call(PDC_CACHE, PDC_CACHE_INFO, __pa(pdc_result), 0);
616 convert_to_wide(pdc_result);
617 memcpy(cache_info, pdc_result, sizeof(*cache_info));
618 spin_unlock_irqrestore(&pdc_lock, flags);
619
620 return retval;
621}
622
623
624
625
626
627
628
629int pdc_spaceid_bits(unsigned long *space_bits)
630{
631 int retval;
632 unsigned long flags;
633
634 spin_lock_irqsave(&pdc_lock, flags);
635 pdc_result[0] = 0;
636 retval = mem_pdc_call(PDC_CACHE, PDC_CACHE_RET_SPID, __pa(pdc_result), 0);
637 convert_to_wide(pdc_result);
638 *space_bits = pdc_result[0];
639 spin_unlock_irqrestore(&pdc_lock, flags);
640
641 return retval;
642}
643
644#ifndef CONFIG_PA20
645
646
647
648
649
650
651int pdc_btlb_info(struct pdc_btlb_info *btlb)
652{
653 int retval;
654 unsigned long flags;
655
656 spin_lock_irqsave(&pdc_lock, flags);
657 retval = mem_pdc_call(PDC_BLOCK_TLB, PDC_BTLB_INFO, __pa(pdc_result), 0);
658 memcpy(btlb, pdc_result, sizeof(*btlb));
659 spin_unlock_irqrestore(&pdc_lock, flags);
660
661 if(retval < 0) {
662 btlb->max_size = 0;
663 }
664 return retval;
665}
666
667
668
669
670
671
672
673
674
675
676
677
678
679int pdc_mem_map_hpa(struct pdc_memory_map *address,
680 struct pdc_module_path *mod_path)
681{
682 int retval;
683 unsigned long flags;
684
685 spin_lock_irqsave(&pdc_lock, flags);
686 memcpy(pdc_result2, mod_path, sizeof(*mod_path));
687 retval = mem_pdc_call(PDC_MEM_MAP, PDC_MEM_MAP_HPA, __pa(pdc_result),
688 __pa(pdc_result2));
689 memcpy(address, pdc_result, sizeof(*address));
690 spin_unlock_irqrestore(&pdc_lock, flags);
691
692 return retval;
693}
694#endif
695
696
697
698
699
700
701
702
703int pdc_lan_station_id(char *lan_addr, unsigned long hpa)
704{
705 int retval;
706 unsigned long flags;
707
708 spin_lock_irqsave(&pdc_lock, flags);
709 retval = mem_pdc_call(PDC_LAN_STATION_ID, PDC_LAN_STATION_ID_READ,
710 __pa(pdc_result), hpa);
711 if (retval < 0) {
712
713 memset(lan_addr, 0, PDC_LAN_STATION_ID_SIZE);
714 } else {
715 memcpy(lan_addr, pdc_result, PDC_LAN_STATION_ID_SIZE);
716 }
717 spin_unlock_irqrestore(&pdc_lock, flags);
718
719 return retval;
720}
721EXPORT_SYMBOL(pdc_lan_station_id);
722
723
724
725
726
727
728
729
730
731
732
733int pdc_stable_read(unsigned long staddr, void *memaddr, unsigned long count)
734{
735 int retval;
736 unsigned long flags;
737
738 spin_lock_irqsave(&pdc_lock, flags);
739 retval = mem_pdc_call(PDC_STABLE, PDC_STABLE_READ, staddr,
740 __pa(pdc_result), count);
741 convert_to_wide(pdc_result);
742 memcpy(memaddr, pdc_result, count);
743 spin_unlock_irqrestore(&pdc_lock, flags);
744
745 return retval;
746}
747EXPORT_SYMBOL(pdc_stable_read);
748
749
750
751
752
753
754
755
756
757
758
759int pdc_stable_write(unsigned long staddr, void *memaddr, unsigned long count)
760{
761 int retval;
762 unsigned long flags;
763
764 spin_lock_irqsave(&pdc_lock, flags);
765 memcpy(pdc_result, memaddr, count);
766 convert_to_wide(pdc_result);
767 retval = mem_pdc_call(PDC_STABLE, PDC_STABLE_WRITE, staddr,
768 __pa(pdc_result), count);
769 spin_unlock_irqrestore(&pdc_lock, flags);
770
771 return retval;
772}
773EXPORT_SYMBOL(pdc_stable_write);
774
775
776
777
778
779
780
781
782
783
784int pdc_stable_get_size(unsigned long *size)
785{
786 int retval;
787 unsigned long flags;
788
789 spin_lock_irqsave(&pdc_lock, flags);
790 retval = mem_pdc_call(PDC_STABLE, PDC_STABLE_RETURN_SIZE, __pa(pdc_result));
791 *size = pdc_result[0];
792 spin_unlock_irqrestore(&pdc_lock, flags);
793
794 return retval;
795}
796EXPORT_SYMBOL(pdc_stable_get_size);
797
798
799
800
801
802
803
804int pdc_stable_verify_contents(void)
805{
806 int retval;
807 unsigned long flags;
808
809 spin_lock_irqsave(&pdc_lock, flags);
810 retval = mem_pdc_call(PDC_STABLE, PDC_STABLE_VERIFY_CONTENTS);
811 spin_unlock_irqrestore(&pdc_lock, flags);
812
813 return retval;
814}
815EXPORT_SYMBOL(pdc_stable_verify_contents);
816
817
818
819
820
821
822
823int pdc_stable_initialize(void)
824{
825 int retval;
826 unsigned long flags;
827
828 spin_lock_irqsave(&pdc_lock, flags);
829 retval = mem_pdc_call(PDC_STABLE, PDC_STABLE_INITIALIZE);
830 spin_unlock_irqrestore(&pdc_lock, flags);
831
832 return retval;
833}
834EXPORT_SYMBOL(pdc_stable_initialize);
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850int pdc_get_initiator(struct hardware_path *hwpath, struct pdc_initiator *initiator)
851{
852 int retval;
853 unsigned long flags;
854
855 spin_lock_irqsave(&pdc_lock, flags);
856
857
858#define IS_SPROCKETS() (strlen(boot_cpu_data.pdc.sys_model_name) == 14 && \
859 strncmp(boot_cpu_data.pdc.sys_model_name, "9000/785", 8) == 0)
860
861 retval = mem_pdc_call(PDC_INITIATOR, PDC_GET_INITIATOR,
862 __pa(pdc_result), __pa(hwpath));
863 if (retval < PDC_OK)
864 goto out;
865
866 if (pdc_result[0] < 16) {
867 initiator->host_id = pdc_result[0];
868 } else {
869 initiator->host_id = -1;
870 }
871
872
873
874
875
876 switch (pdc_result[1]) {
877 case 1: initiator->factor = 50; break;
878 case 2: initiator->factor = 25; break;
879 case 5: initiator->factor = 12; break;
880 case 25: initiator->factor = 10; break;
881 case 20: initiator->factor = 12; break;
882 case 40: initiator->factor = 10; break;
883 default: initiator->factor = -1; break;
884 }
885
886 if (IS_SPROCKETS()) {
887 initiator->width = pdc_result[4];
888 initiator->mode = pdc_result[5];
889 } else {
890 initiator->width = -1;
891 initiator->mode = -1;
892 }
893
894 out:
895 spin_unlock_irqrestore(&pdc_lock, flags);
896
897 return (retval >= PDC_OK);
898}
899EXPORT_SYMBOL(pdc_get_initiator);
900
901
902
903
904
905
906
907
908
909
910
911int pdc_pci_irt_size(unsigned long *num_entries, unsigned long hpa)
912{
913 int retval;
914 unsigned long flags;
915
916 spin_lock_irqsave(&pdc_lock, flags);
917 retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL_SIZE,
918 __pa(pdc_result), hpa);
919 convert_to_wide(pdc_result);
920 *num_entries = pdc_result[0];
921 spin_unlock_irqrestore(&pdc_lock, flags);
922
923 return retval;
924}
925
926
927
928
929
930
931
932
933
934
935int pdc_pci_irt(unsigned long num_entries, unsigned long hpa, void *tbl)
936{
937 int retval;
938 unsigned long flags;
939
940 BUG_ON((unsigned long)tbl & 0x7);
941
942 spin_lock_irqsave(&pdc_lock, flags);
943 pdc_result[0] = num_entries;
944 retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL,
945 __pa(pdc_result), hpa, __pa(tbl));
946 spin_unlock_irqrestore(&pdc_lock, flags);
947
948 return retval;
949}
950
951
952#if 0
953
954
955
956
957
958
959
960
961unsigned int pdc_pci_config_read(void *hpa, unsigned long cfg_addr)
962{
963 int retval;
964 unsigned long flags;
965
966 spin_lock_irqsave(&pdc_lock, flags);
967 pdc_result[0] = 0;
968 pdc_result[1] = 0;
969 retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_READ_CONFIG,
970 __pa(pdc_result), hpa, cfg_addr&~3UL, 4UL);
971 spin_unlock_irqrestore(&pdc_lock, flags);
972
973 return retval ? ~0 : (unsigned int) pdc_result[0];
974}
975
976
977
978
979
980
981
982
983
984
985void pdc_pci_config_write(void *hpa, unsigned long cfg_addr, unsigned int val)
986{
987 int retval;
988 unsigned long flags;
989
990 spin_lock_irqsave(&pdc_lock, flags);
991 pdc_result[0] = 0;
992 retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_WRITE_CONFIG,
993 __pa(pdc_result), hpa,
994 cfg_addr&~3UL, 4UL, (unsigned long) val);
995 spin_unlock_irqrestore(&pdc_lock, flags);
996
997 return retval;
998}
999#endif
1000
1001
1002
1003
1004
1005
1006
1007int pdc_tod_read(struct pdc_tod *tod)
1008{
1009 int retval;
1010 unsigned long flags;
1011
1012 spin_lock_irqsave(&pdc_lock, flags);
1013 retval = mem_pdc_call(PDC_TOD, PDC_TOD_READ, __pa(pdc_result), 0);
1014 convert_to_wide(pdc_result);
1015 memcpy(tod, pdc_result, sizeof(*tod));
1016 spin_unlock_irqrestore(&pdc_lock, flags);
1017
1018 return retval;
1019}
1020EXPORT_SYMBOL(pdc_tod_read);
1021
1022int pdc_mem_pdt_info(struct pdc_mem_retinfo *rinfo)
1023{
1024 int retval;
1025 unsigned long flags;
1026
1027 spin_lock_irqsave(&pdc_lock, flags);
1028 retval = mem_pdc_call(PDC_MEM, PDC_MEM_MEMINFO, __pa(pdc_result), 0);
1029 convert_to_wide(pdc_result);
1030 memcpy(rinfo, pdc_result, sizeof(*rinfo));
1031 spin_unlock_irqrestore(&pdc_lock, flags);
1032
1033 return retval;
1034}
1035
1036int pdc_mem_pdt_read_entries(struct pdc_mem_read_pdt *pret,
1037 unsigned long *pdt_entries_ptr)
1038{
1039 int retval;
1040 unsigned long flags;
1041
1042 spin_lock_irqsave(&pdc_lock, flags);
1043 retval = mem_pdc_call(PDC_MEM, PDC_MEM_READ_PDT, __pa(pdc_result),
1044 __pa(pdt_entries_ptr));
1045 if (retval == PDC_OK) {
1046 convert_to_wide(pdc_result);
1047 memcpy(pret, pdc_result, sizeof(*pret));
1048 }
1049 spin_unlock_irqrestore(&pdc_lock, flags);
1050
1051#ifdef CONFIG_64BIT
1052
1053
1054
1055
1056 if (WARN_ON_ONCE((retval == PDC_OK) && parisc_narrow_firmware))
1057 return PDC_ERROR;
1058#endif
1059
1060 return retval;
1061}
1062
1063
1064
1065
1066
1067
1068
1069
1070int pdc_tod_set(unsigned long sec, unsigned long usec)
1071{
1072 int retval;
1073 unsigned long flags;
1074
1075 spin_lock_irqsave(&pdc_lock, flags);
1076 retval = mem_pdc_call(PDC_TOD, PDC_TOD_WRITE, sec, usec);
1077 spin_unlock_irqrestore(&pdc_lock, flags);
1078
1079 return retval;
1080}
1081EXPORT_SYMBOL(pdc_tod_set);
1082
1083#ifdef CONFIG_64BIT
1084int pdc_mem_mem_table(struct pdc_memory_table_raddr *r_addr,
1085 struct pdc_memory_table *tbl, unsigned long entries)
1086{
1087 int retval;
1088 unsigned long flags;
1089
1090 spin_lock_irqsave(&pdc_lock, flags);
1091 retval = mem_pdc_call(PDC_MEM, PDC_MEM_TABLE, __pa(pdc_result), __pa(pdc_result2), entries);
1092 convert_to_wide(pdc_result);
1093 memcpy(r_addr, pdc_result, sizeof(*r_addr));
1094 memcpy(tbl, pdc_result2, entries * sizeof(*tbl));
1095 spin_unlock_irqrestore(&pdc_lock, flags);
1096
1097 return retval;
1098}
1099#endif
1100
1101
1102
1103
1104
1105int pdc_do_firm_test_reset(unsigned long ftc_bitmap)
1106{
1107 int retval;
1108 unsigned long flags;
1109
1110 spin_lock_irqsave(&pdc_lock, flags);
1111 retval = mem_pdc_call(PDC_BROADCAST_RESET, PDC_DO_FIRM_TEST_RESET,
1112 PDC_FIRM_TEST_MAGIC, ftc_bitmap);
1113 spin_unlock_irqrestore(&pdc_lock, flags);
1114
1115 return retval;
1116}
1117
1118
1119
1120
1121
1122
1123int pdc_do_reset(void)
1124{
1125 int retval;
1126 unsigned long flags;
1127
1128 spin_lock_irqsave(&pdc_lock, flags);
1129 retval = mem_pdc_call(PDC_BROADCAST_RESET, PDC_DO_RESET);
1130 spin_unlock_irqrestore(&pdc_lock, flags);
1131
1132 return retval;
1133}
1134
1135
1136
1137
1138
1139
1140
1141int __init pdc_soft_power_info(unsigned long *power_reg)
1142{
1143 int retval;
1144 unsigned long flags;
1145
1146 *power_reg = (unsigned long) (-1);
1147
1148 spin_lock_irqsave(&pdc_lock, flags);
1149 retval = mem_pdc_call(PDC_SOFT_POWER, PDC_SOFT_POWER_INFO, __pa(pdc_result), 0);
1150 if (retval == PDC_OK) {
1151 convert_to_wide(pdc_result);
1152 *power_reg = f_extend(pdc_result[0]);
1153 }
1154 spin_unlock_irqrestore(&pdc_lock, flags);
1155
1156 return retval;
1157}
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170int pdc_soft_power_button(int sw_control)
1171{
1172 int retval;
1173 unsigned long flags;
1174
1175 spin_lock_irqsave(&pdc_lock, flags);
1176 retval = mem_pdc_call(PDC_SOFT_POWER, PDC_SOFT_POWER_ENABLE, __pa(pdc_result), sw_control);
1177 spin_unlock_irqrestore(&pdc_lock, flags);
1178
1179 return retval;
1180}
1181
1182
1183
1184
1185
1186
1187void pdc_io_reset(void)
1188{
1189 unsigned long flags;
1190
1191 spin_lock_irqsave(&pdc_lock, flags);
1192 mem_pdc_call(PDC_IO, PDC_IO_RESET, 0);
1193 spin_unlock_irqrestore(&pdc_lock, flags);
1194}
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205void pdc_io_reset_devices(void)
1206{
1207 unsigned long flags;
1208
1209 spin_lock_irqsave(&pdc_lock, flags);
1210 mem_pdc_call(PDC_IO, PDC_IO_RESET_DEVICES, 0);
1211 spin_unlock_irqrestore(&pdc_lock, flags);
1212}
1213
1214#endif
1215
1216
1217static int __attribute__((aligned(8))) iodc_retbuf[32];
1218static char __attribute__((aligned(64))) iodc_dbuf[4096];
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230int pdc_iodc_print(const unsigned char *str, unsigned count)
1231{
1232 unsigned int i;
1233 unsigned long flags;
1234
1235 for (i = 0; i < count;) {
1236 switch(str[i]) {
1237 case '\n':
1238 iodc_dbuf[i+0] = '\r';
1239 iodc_dbuf[i+1] = '\n';
1240 i += 2;
1241 goto print;
1242 default:
1243 iodc_dbuf[i] = str[i];
1244 i++;
1245 break;
1246 }
1247 }
1248
1249print:
1250 spin_lock_irqsave(&pdc_lock, flags);
1251 real32_call(PAGE0->mem_cons.iodc_io,
1252 (unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT,
1253 PAGE0->mem_cons.spa, __pa(PAGE0->mem_cons.dp.layers),
1254 __pa(iodc_retbuf), 0, __pa(iodc_dbuf), i, 0);
1255 spin_unlock_irqrestore(&pdc_lock, flags);
1256
1257 return i;
1258}
1259
1260#if !defined(BOOTLOADER)
1261
1262
1263
1264
1265
1266
1267int pdc_iodc_getc(void)
1268{
1269 int ch;
1270 int status;
1271 unsigned long flags;
1272
1273
1274 if (!PAGE0->mem_kbd.iodc_io)
1275 return 0;
1276
1277
1278 spin_lock_irqsave(&pdc_lock, flags);
1279 real32_call(PAGE0->mem_kbd.iodc_io,
1280 (unsigned long)PAGE0->mem_kbd.hpa, ENTRY_IO_CIN,
1281 PAGE0->mem_kbd.spa, __pa(PAGE0->mem_kbd.dp.layers),
1282 __pa(iodc_retbuf), 0, __pa(iodc_dbuf), 1, 0);
1283
1284 ch = *iodc_dbuf;
1285 status = *iodc_retbuf;
1286 spin_unlock_irqrestore(&pdc_lock, flags);
1287
1288 if (status == 0)
1289 return -1;
1290
1291 return ch;
1292}
1293
1294int pdc_sti_call(unsigned long func, unsigned long flags,
1295 unsigned long inptr, unsigned long outputr,
1296 unsigned long glob_cfg)
1297{
1298 int retval;
1299 unsigned long irqflags;
1300
1301 spin_lock_irqsave(&pdc_lock, irqflags);
1302 retval = real32_call(func, flags, inptr, outputr, glob_cfg);
1303 spin_unlock_irqrestore(&pdc_lock, irqflags);
1304
1305 return retval;
1306}
1307EXPORT_SYMBOL(pdc_sti_call);
1308
1309#ifdef CONFIG_64BIT
1310
1311
1312
1313
1314
1315
1316
1317int pdc_pat_cell_get_number(struct pdc_pat_cell_num *cell_info)
1318{
1319 int retval;
1320 unsigned long flags;
1321
1322 spin_lock_irqsave(&pdc_lock, flags);
1323 retval = mem_pdc_call(PDC_PAT_CELL, PDC_PAT_CELL_GET_NUMBER, __pa(pdc_result));
1324 memcpy(cell_info, pdc_result, sizeof(*cell_info));
1325 spin_unlock_irqrestore(&pdc_lock, flags);
1326
1327 return retval;
1328}
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341int pdc_pat_cell_module(unsigned long *actcnt, unsigned long ploc, unsigned long mod,
1342 unsigned long view_type, void *mem_addr)
1343{
1344 int retval;
1345 unsigned long flags;
1346 static struct pdc_pat_cell_mod_maddr_block result __attribute__ ((aligned (8)));
1347
1348 spin_lock_irqsave(&pdc_lock, flags);
1349 retval = mem_pdc_call(PDC_PAT_CELL, PDC_PAT_CELL_MODULE, __pa(pdc_result),
1350 ploc, mod, view_type, __pa(&result));
1351 if(!retval) {
1352 *actcnt = pdc_result[0];
1353 memcpy(mem_addr, &result, *actcnt);
1354 }
1355 spin_unlock_irqrestore(&pdc_lock, flags);
1356
1357 return retval;
1358}
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369int pdc_pat_cell_info(struct pdc_pat_cell_info_rtn_block *info,
1370 unsigned long *actcnt, unsigned long offset,
1371 unsigned long cell_number)
1372{
1373 int retval;
1374 unsigned long flags;
1375 struct pdc_pat_cell_info_rtn_block result;
1376
1377 spin_lock_irqsave(&pdc_lock, flags);
1378 retval = mem_pdc_call(PDC_PAT_CELL, PDC_PAT_CELL_GET_INFO,
1379 __pa(pdc_result), __pa(&result), *actcnt,
1380 offset, cell_number);
1381 if (!retval) {
1382 *actcnt = pdc_result[0];
1383 memcpy(info, &result, *actcnt);
1384 }
1385 spin_unlock_irqrestore(&pdc_lock, flags);
1386
1387 return retval;
1388}
1389
1390
1391
1392
1393
1394
1395
1396
1397int pdc_pat_cpu_get_number(struct pdc_pat_cpu_num *cpu_info, unsigned long hpa)
1398{
1399 int retval;
1400 unsigned long flags;
1401
1402 spin_lock_irqsave(&pdc_lock, flags);
1403 retval = mem_pdc_call(PDC_PAT_CPU, PDC_PAT_CPU_GET_NUMBER,
1404 __pa(&pdc_result), hpa);
1405 memcpy(cpu_info, pdc_result, sizeof(*cpu_info));
1406 spin_unlock_irqrestore(&pdc_lock, flags);
1407
1408 return retval;
1409}
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419int pdc_pat_get_irt_size(unsigned long *num_entries, unsigned long cell_num)
1420{
1421 int retval;
1422 unsigned long flags;
1423
1424 spin_lock_irqsave(&pdc_lock, flags);
1425 retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_GET_PCI_ROUTING_TABLE_SIZE,
1426 __pa(pdc_result), cell_num);
1427 *num_entries = pdc_result[0];
1428 spin_unlock_irqrestore(&pdc_lock, flags);
1429
1430 return retval;
1431}
1432
1433
1434
1435
1436
1437
1438
1439
1440int pdc_pat_get_irt(void *r_addr, unsigned long cell_num)
1441{
1442 int retval;
1443 unsigned long flags;
1444
1445 spin_lock_irqsave(&pdc_lock, flags);
1446 retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_GET_PCI_ROUTING_TABLE,
1447 __pa(r_addr), cell_num);
1448 spin_unlock_irqrestore(&pdc_lock, flags);
1449
1450 return retval;
1451}
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461int pdc_pat_pd_get_addr_map(unsigned long *actual_len, void *mem_addr,
1462 unsigned long count, unsigned long offset)
1463{
1464 int retval;
1465 unsigned long flags;
1466
1467 spin_lock_irqsave(&pdc_lock, flags);
1468 retval = mem_pdc_call(PDC_PAT_PD, PDC_PAT_PD_GET_ADDR_MAP, __pa(pdc_result),
1469 __pa(pdc_result2), count, offset);
1470 *actual_len = pdc_result[0];
1471 memcpy(mem_addr, pdc_result2, *actual_len);
1472 spin_unlock_irqrestore(&pdc_lock, flags);
1473
1474 return retval;
1475}
1476
1477
1478
1479
1480
1481
1482
1483
1484int pdc_pat_pd_get_pdc_revisions(unsigned long *legacy_rev,
1485 unsigned long *pat_rev, unsigned long *pdc_cap)
1486{
1487 int retval;
1488 unsigned long flags;
1489
1490 spin_lock_irqsave(&pdc_lock, flags);
1491 retval = mem_pdc_call(PDC_PAT_PD, PDC_PAT_PD_GET_PDC_INTERF_REV,
1492 __pa(pdc_result));
1493 if (retval == PDC_OK) {
1494 *legacy_rev = pdc_result[0];
1495 *pat_rev = pdc_result[1];
1496 *pdc_cap = pdc_result[2];
1497 }
1498 spin_unlock_irqrestore(&pdc_lock, flags);
1499
1500 return retval;
1501}
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511int pdc_pat_io_pci_cfg_read(unsigned long pci_addr, int pci_size, u32 *mem_addr)
1512{
1513 int retval;
1514 unsigned long flags;
1515
1516 spin_lock_irqsave(&pdc_lock, flags);
1517 retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_PCI_CONFIG_READ,
1518 __pa(pdc_result), pci_addr, pci_size);
1519 switch(pci_size) {
1520 case 1: *(u8 *) mem_addr = (u8) pdc_result[0]; break;
1521 case 2: *(u16 *)mem_addr = (u16) pdc_result[0]; break;
1522 case 4: *(u32 *)mem_addr = (u32) pdc_result[0]; break;
1523 }
1524 spin_unlock_irqrestore(&pdc_lock, flags);
1525
1526 return retval;
1527}
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 val)
1538{
1539 int retval;
1540 unsigned long flags;
1541
1542 spin_lock_irqsave(&pdc_lock, flags);
1543 retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_PCI_CONFIG_WRITE,
1544 pci_addr, pci_size, val);
1545 spin_unlock_irqrestore(&pdc_lock, flags);
1546
1547 return retval;
1548}
1549
1550
1551
1552
1553
1554
1555int pdc_pat_mem_pdt_info(struct pdc_pat_mem_retinfo *rinfo)
1556{
1557 int retval;
1558 unsigned long flags;
1559
1560 spin_lock_irqsave(&pdc_lock, flags);
1561 retval = mem_pdc_call(PDC_PAT_MEM, PDC_PAT_MEM_PD_INFO,
1562 __pa(&pdc_result));
1563 if (retval == PDC_OK)
1564 memcpy(rinfo, &pdc_result, sizeof(*rinfo));
1565 spin_unlock_irqrestore(&pdc_lock, flags);
1566
1567 return retval;
1568}
1569
1570
1571
1572
1573
1574
1575
1576
1577int pdc_pat_mem_pdt_cell_info(struct pdc_pat_mem_cell_pdt_retinfo *rinfo,
1578 unsigned long cell)
1579{
1580 int retval;
1581 unsigned long flags;
1582
1583 spin_lock_irqsave(&pdc_lock, flags);
1584 retval = mem_pdc_call(PDC_PAT_MEM, PDC_PAT_MEM_CELL_INFO,
1585 __pa(&pdc_result), cell);
1586 if (retval == PDC_OK)
1587 memcpy(rinfo, &pdc_result, sizeof(*rinfo));
1588 spin_unlock_irqrestore(&pdc_lock, flags);
1589
1590 return retval;
1591}
1592
1593
1594
1595
1596
1597
1598
1599
1600int pdc_pat_mem_read_cell_pdt(struct pdc_pat_mem_read_pd_retinfo *pret,
1601 unsigned long *pdt_entries_ptr, unsigned long max_entries)
1602{
1603 int retval;
1604 unsigned long flags, entries;
1605
1606 spin_lock_irqsave(&pdc_lock, flags);
1607
1608 retval = mem_pdc_call(PDC_PAT_MEM, PDC_PAT_MEM_CELL_READ,
1609 __pa(&pdc_result), parisc_cell_num,
1610 __pa(pdt_entries_ptr));
1611
1612 if (retval == PDC_OK) {
1613
1614 entries = min(pdc_result[0], max_entries);
1615 pret->pdt_entries = entries;
1616 pret->actual_count_bytes = entries * sizeof(unsigned long);
1617 }
1618
1619 spin_unlock_irqrestore(&pdc_lock, flags);
1620 WARN_ON(retval == PDC_OK && pdc_result[0] > max_entries);
1621
1622 return retval;
1623}
1624
1625
1626
1627
1628
1629
1630
1631
1632int pdc_pat_mem_read_pd_pdt(struct pdc_pat_mem_read_pd_retinfo *pret,
1633 unsigned long *pdt_entries_ptr, unsigned long count,
1634 unsigned long offset)
1635{
1636 int retval;
1637 unsigned long flags, entries;
1638
1639 spin_lock_irqsave(&pdc_lock, flags);
1640 retval = mem_pdc_call(PDC_PAT_MEM, PDC_PAT_MEM_PD_READ,
1641 __pa(&pdc_result), __pa(pdt_entries_ptr),
1642 count, offset);
1643
1644 if (retval == PDC_OK) {
1645 entries = min(pdc_result[0], count);
1646 pret->actual_count_bytes = entries;
1647 pret->pdt_entries = entries / sizeof(unsigned long);
1648 }
1649
1650 spin_unlock_irqrestore(&pdc_lock, flags);
1651
1652 return retval;
1653}
1654
1655
1656
1657
1658
1659
1660
1661int pdc_pat_mem_get_dimm_phys_location(
1662 struct pdc_pat_mem_phys_mem_location *pret,
1663 unsigned long phys_addr)
1664{
1665 int retval;
1666 unsigned long flags;
1667
1668 spin_lock_irqsave(&pdc_lock, flags);
1669 retval = mem_pdc_call(PDC_PAT_MEM, PDC_PAT_MEM_ADDRESS,
1670 __pa(&pdc_result), phys_addr);
1671
1672 if (retval == PDC_OK)
1673 memcpy(pret, &pdc_result, sizeof(*pret));
1674
1675 spin_unlock_irqrestore(&pdc_lock, flags);
1676
1677 return retval;
1678}
1679#endif
1680#endif
1681
1682
1683
1684
1685
1686
1687
1688
1689struct narrow_stack {
1690
1691 unsigned int arg13;
1692 unsigned int arg12;
1693 unsigned int arg11;
1694 unsigned int arg10;
1695 unsigned int arg9;
1696 unsigned int arg8;
1697 unsigned int arg7;
1698 unsigned int arg6;
1699 unsigned int arg5;
1700 unsigned int arg4;
1701 unsigned int arg3;
1702 unsigned int arg2;
1703 unsigned int arg1;
1704 unsigned int arg0;
1705 unsigned int frame_marker[8];
1706 unsigned int sp;
1707
1708};
1709
1710long real32_call(unsigned long fn, ...)
1711{
1712 va_list args;
1713 extern struct narrow_stack real_stack;
1714 extern unsigned long real32_call_asm(unsigned int *,
1715 unsigned int *,
1716 unsigned int);
1717
1718 va_start(args, fn);
1719 real_stack.arg0 = va_arg(args, unsigned int);
1720 real_stack.arg1 = va_arg(args, unsigned int);
1721 real_stack.arg2 = va_arg(args, unsigned int);
1722 real_stack.arg3 = va_arg(args, unsigned int);
1723 real_stack.arg4 = va_arg(args, unsigned int);
1724 real_stack.arg5 = va_arg(args, unsigned int);
1725 real_stack.arg6 = va_arg(args, unsigned int);
1726 real_stack.arg7 = va_arg(args, unsigned int);
1727 real_stack.arg8 = va_arg(args, unsigned int);
1728 real_stack.arg9 = va_arg(args, unsigned int);
1729 real_stack.arg10 = va_arg(args, unsigned int);
1730 real_stack.arg11 = va_arg(args, unsigned int);
1731 real_stack.arg12 = va_arg(args, unsigned int);
1732 real_stack.arg13 = va_arg(args, unsigned int);
1733 va_end(args);
1734
1735 return real32_call_asm(&real_stack.sp, &real_stack.arg0, fn);
1736}
1737
1738#ifdef CONFIG_64BIT
1739
1740
1741struct wide_stack {
1742 unsigned long arg0;
1743 unsigned long arg1;
1744 unsigned long arg2;
1745 unsigned long arg3;
1746 unsigned long arg4;
1747 unsigned long arg5;
1748 unsigned long arg6;
1749 unsigned long arg7;
1750 unsigned long arg8;
1751 unsigned long arg9;
1752 unsigned long arg10;
1753 unsigned long arg11;
1754 unsigned long arg12;
1755 unsigned long arg13;
1756 unsigned long frame_marker[2];
1757 unsigned long sp;
1758
1759};
1760
1761long real64_call(unsigned long fn, ...)
1762{
1763 va_list args;
1764 extern struct wide_stack real64_stack;
1765 extern unsigned long real64_call_asm(unsigned long *,
1766 unsigned long *,
1767 unsigned long);
1768
1769 va_start(args, fn);
1770 real64_stack.arg0 = va_arg(args, unsigned long);
1771 real64_stack.arg1 = va_arg(args, unsigned long);
1772 real64_stack.arg2 = va_arg(args, unsigned long);
1773 real64_stack.arg3 = va_arg(args, unsigned long);
1774 real64_stack.arg4 = va_arg(args, unsigned long);
1775 real64_stack.arg5 = va_arg(args, unsigned long);
1776 real64_stack.arg6 = va_arg(args, unsigned long);
1777 real64_stack.arg7 = va_arg(args, unsigned long);
1778 real64_stack.arg8 = va_arg(args, unsigned long);
1779 real64_stack.arg9 = va_arg(args, unsigned long);
1780 real64_stack.arg10 = va_arg(args, unsigned long);
1781 real64_stack.arg11 = va_arg(args, unsigned long);
1782 real64_stack.arg12 = va_arg(args, unsigned long);
1783 real64_stack.arg13 = va_arg(args, unsigned long);
1784 va_end(args);
1785
1786 return real64_call_asm(&real64_stack.sp, &real64_stack.arg0, fn);
1787}
1788
1789#endif
1790