2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
6 * Copyright (C) 2003 Silicon Graphics, Inc. All rights reserved.
9 #include <linux/types.h>
10 #include <asm/sn/sgi.h>
11 #include <asm/sn/addrs.h>
12 #include <asm/sn/pci/pcibr.h>
13 #include <asm/sn/pci/pcibr_private.h>
14 #include <asm/sn/pci/pci_defs.h>
18 * Identification Register Access -- Read Only 0000_0000
21 __pcireg_id_get(pic_t *bridge)
23 return bridge->p_wid_id;
27 pcireg_bridge_id_get(void *ptr)
29 return __pcireg_id_get((pic_t *)ptr);
33 pcireg_id_get(pcibr_soft_t ptr)
35 return __pcireg_id_get((pic_t *)ptr->bs_base);
41 * Address Bus Side Holding Register Access -- Read Only 0000_0010
44 pcireg_bus_err_get(pcibr_soft_t ptr)
46 pic_t *bridge = (pic_t *)ptr->bs_base;
48 return bridge->p_wid_err;
53 * Control Register Access -- Read/Write 0000_0020
56 __pcireg_control_get(pic_t *bridge)
58 return bridge->p_wid_control;
62 pcireg_bridge_control_get(void *ptr)
64 return __pcireg_control_get((pic_t *)ptr);
68 pcireg_control_get(pcibr_soft_t ptr)
70 return __pcireg_control_get((pic_t *)ptr->bs_base);
75 pcireg_control_set(pcibr_soft_t ptr, uint64_t val)
77 pic_t *bridge = (pic_t *)ptr->bs_base;
79 /* WAR for PV 439897 & 454474. Add a readback of the control
80 * register. Lock to protect against MP accesses to this
81 * register along with other write-only registers (See PVs).
82 * This register isnt accessed in the "hot path" so the splhi
83 * shouldn't be a bottleneck
86 bridge->p_wid_control = val;
87 bridge->p_wid_control; /* WAR */
92 pcireg_control_bit_clr(pcibr_soft_t ptr, uint64_t bits)
94 pic_t *bridge = (pic_t *)ptr->bs_base;
96 /* WAR for PV 439897 & 454474. Add a readback of the control
97 * register. Lock to protect against MP accesses to this
98 * register along with other write-only registers (See PVs).
99 * This register isnt accessed in the "hot path" so the splhi
100 * shouldn't be a bottleneck
103 bridge->p_wid_control &= ~bits;
104 bridge->p_wid_control; /* WAR */
109 pcireg_control_bit_set(pcibr_soft_t ptr, uint64_t bits)
111 pic_t *bridge = (pic_t *)ptr->bs_base;
113 /* WAR for PV 439897 & 454474. Add a readback of the control
114 * register. Lock to protect against MP accesses to this
115 * register along with other write-only registers (See PVs).
116 * This register isnt accessed in the "hot path" so the splhi
117 * shouldn't be a bottleneck
120 bridge->p_wid_control |= bits;
121 bridge->p_wid_control; /* WAR */
125 * Bus Speed (from control register); -- Read Only access 0000_0020
126 * 0x00 == 33MHz, 0x01 == 66MHz, 0x10 == 100MHz, 0x11 == 133MHz
129 pcireg_speed_get(pcibr_soft_t ptr)
132 pic_t *bridge = (pic_t *)ptr->bs_base;
134 speedbits = bridge->p_wid_control & PIC_CTRL_PCI_SPEED;
135 return (speedbits >> 4);
139 * Bus Mode (ie. PCIX or PCI) (from Status register); 0000_0008
140 * 0x0 == PCI, 0x1 == PCI-X
143 pcireg_mode_get(pcibr_soft_t ptr)
145 uint64_t pcix_active_bit;
146 pic_t *bridge = (pic_t *)ptr->bs_base;
148 pcix_active_bit = bridge->p_wid_stat & PIC_STAT_PCIX_ACTIVE;
149 return (pcix_active_bit >> PIC_STAT_PCIX_ACTIVE_SHFT);
153 pcireg_req_timeout_set(pcibr_soft_t ptr, uint64_t val)
155 pic_t *bridge = (pic_t *)ptr->bs_base;
157 bridge->p_wid_req_timeout = val;
161 * Interrupt Destination Addr Register Access -- Read/Write 0000_0038
165 pcireg_intr_dst_set(pcibr_soft_t ptr, uint64_t val)
167 pic_t *bridge = (pic_t *)ptr->bs_base;
169 bridge->p_wid_int = val;
173 * Intr Destination Addr Reg Access (target_id) -- Read/Write 0000_0038
176 pcireg_intr_dst_target_id_get(pcibr_soft_t ptr)
179 pic_t *bridge = (pic_t *)ptr->bs_base;
181 tid_bits = (bridge->p_wid_int & PIC_INTR_DEST_TID);
182 return (tid_bits >> PIC_INTR_DEST_TID_SHFT);
186 pcireg_intr_dst_target_id_set(pcibr_soft_t ptr, uint64_t target_id)
188 pic_t *bridge = (pic_t *)ptr->bs_base;
190 bridge->p_wid_int &= ~PIC_INTR_DEST_TID;
192 ((target_id << PIC_INTR_DEST_TID_SHFT) & PIC_INTR_DEST_TID);
196 * Intr Destination Addr Register Access (addr) -- Read/Write 0000_0038
199 pcireg_intr_dst_addr_get(pcibr_soft_t ptr)
201 pic_t *bridge = (pic_t *)ptr->bs_base;
203 return bridge->p_wid_int & PIC_XTALK_ADDR_MASK;
207 pcireg_intr_dst_addr_set(pcibr_soft_t ptr, uint64_t addr)
209 pic_t *bridge = (pic_t *)ptr->bs_base;
211 bridge->p_wid_int &= ~PIC_XTALK_ADDR_MASK;
212 bridge->p_wid_int |= (addr & PIC_XTALK_ADDR_MASK);
216 * Cmd Word Holding Bus Side Error Register Access -- Read Only 0000_0040
219 pcireg_cmdword_err_get(pcibr_soft_t ptr)
221 pic_t *bridge = (pic_t *)ptr->bs_base;
223 return bridge->p_wid_err_cmdword;
227 * PCI/PCIX Target Flush Register Access -- Read Only 0000_0050
230 pcireg_tflush_get(pcibr_soft_t ptr)
233 pic_t *bridge = (pic_t *)ptr->bs_base;
235 ret = bridge->p_wid_tflush;
237 /* Read of the Targer Flush should always return zero */
238 ASSERT_ALWAYS(ret == 0);
243 * Cmd Word Holding Link Side Error Register Access -- Read Only 0000_0058
246 pcireg_linkside_err_get(pcibr_soft_t ptr)
248 pic_t *bridge = (pic_t *)ptr->bs_base;
250 return bridge->p_wid_aux_err;
254 * PCI Response Buffer Address Holding Register -- Read Only 0000_0068
257 pcireg_resp_err_get(pcibr_soft_t ptr)
259 pic_t *bridge = (pic_t *)ptr->bs_base;
261 return bridge->p_wid_resp;
265 * PCI Resp Buffer Address Holding Reg (Address) -- Read Only 0000_0068
268 pcireg_resp_err_addr_get(pcibr_soft_t ptr)
270 pic_t *bridge = (pic_t *)ptr->bs_base;
272 return bridge->p_wid_resp & PIC_RSP_BUF_ADDR;
276 * PCI Resp Buffer Address Holding Register (Buffer)-- Read Only 0000_0068
279 pcireg_resp_err_buf_get(pcibr_soft_t ptr)
281 uint64_t bufnum_bits;
282 pic_t *bridge = (pic_t *)ptr->bs_base;
284 bufnum_bits = (bridge->p_wid_resp_upper & PIC_RSP_BUF_NUM);
285 return (bufnum_bits >> PIC_RSP_BUF_NUM_SHFT);
289 * PCI Resp Buffer Address Holding Register (Device)-- Read Only 0000_0068
292 pcireg_resp_err_dev_get(pcibr_soft_t ptr)
294 uint64_t devnum_bits;
295 pic_t *bridge = (pic_t *)ptr->bs_base;
297 devnum_bits = (bridge->p_wid_resp_upper & PIC_RSP_BUF_DEV_NUM);
298 return (devnum_bits >> PIC_RSP_BUF_DEV_NUM_SHFT);
302 * Address Holding Register Link Side Errors -- Read Only 0000_0078
305 pcireg_linkside_err_addr_get(pcibr_soft_t ptr)
307 pic_t *bridge = (pic_t *)ptr->bs_base;
309 return bridge->p_wid_addr_lkerr;
313 pcireg_dirmap_wid_set(pcibr_soft_t ptr, uint64_t target)
315 pic_t *bridge = (pic_t *)ptr->bs_base;
317 bridge->p_dir_map &= ~PIC_DIRMAP_WID;
319 ((target << PIC_DIRMAP_WID_SHFT) & PIC_DIRMAP_WID);
323 pcireg_dirmap_diroff_set(pcibr_soft_t ptr, uint64_t dir_off)
325 pic_t *bridge = (pic_t *)ptr->bs_base;
327 bridge->p_dir_map &= ~PIC_DIRMAP_DIROFF;
328 bridge->p_dir_map |= (dir_off & PIC_DIRMAP_DIROFF);
332 pcireg_dirmap_add512_set(pcibr_soft_t ptr)
334 pic_t *bridge = (pic_t *)ptr->bs_base;
336 bridge->p_dir_map |= PIC_DIRMAP_ADD512;
340 pcireg_dirmap_add512_clr(pcibr_soft_t ptr)
342 pic_t *bridge = (pic_t *)ptr->bs_base;
344 bridge->p_dir_map &= ~PIC_DIRMAP_ADD512;
348 * PCI Page Map Fault Address Register Access -- Read Only 0000_0090
351 pcireg_map_fault_get(pcibr_soft_t ptr)
353 pic_t *bridge = (pic_t *)ptr->bs_base;
355 return bridge->p_map_fault;
359 * Arbitration Register Access -- Read/Write 0000_00A0
362 pcireg_arbitration_get(pcibr_soft_t ptr)
364 pic_t *bridge = (pic_t *)ptr->bs_base;
366 return bridge->p_arb;
370 pcireg_arbitration_bit_set(pcibr_soft_t ptr, uint64_t bits)
372 pic_t *bridge = (pic_t *)ptr->bs_base;
374 bridge->p_arb |= bits;
378 * Internal Ram Parity Error Register Access -- Read Only 0000_00B0
381 pcireg_parity_err_get(pcibr_soft_t ptr)
383 pic_t *bridge = (pic_t *)ptr->bs_base;
385 return bridge->p_ate_parity_err;
389 * Type 1 Configuration Register Access -- Read/Write 0000_00C8
392 pcireg_type1_cntr_set(pcibr_soft_t ptr, uint64_t val)
394 pic_t *bridge = (pic_t *)ptr->bs_base;
396 bridge->p_pci_cfg = val;
400 * PCI Bus Error Lower Addr Holding Reg Access -- Read Only 0000_00D8
403 pcireg_pci_bus_addr_get(pcibr_soft_t ptr)
405 pic_t *bridge = (pic_t *)ptr->bs_base;
407 return bridge->p_pci_err;
411 * PCI Bus Error Addr Holding Reg Access (Address) -- Read Only 0000_00D8
414 pcireg_pci_bus_addr_addr_get(pcibr_soft_t ptr)
416 pic_t *bridge = (pic_t *)ptr->bs_base;
418 return bridge->p_pci_err & PIC_XTALK_ADDR_MASK;
422 * Interrupt Status Register Access -- Read Only 0000_0100
425 pcireg_intr_status_get(pcibr_soft_t ptr)
427 pic_t *bridge = (pic_t *)ptr->bs_base;
429 return bridge->p_int_status;
433 * Interrupt Enable Register Access -- Read/Write 0000_0108
436 pcireg_intr_enable_get(pcibr_soft_t ptr)
438 pic_t *bridge = (pic_t *)ptr->bs_base;
440 return bridge->p_int_enable;
444 pcireg_intr_enable_set(pcibr_soft_t ptr, uint64_t val)
446 pic_t *bridge = (pic_t *)ptr->bs_base;
448 bridge->p_int_enable = val;
452 pcireg_intr_enable_bit_clr(pcibr_soft_t ptr, uint64_t bits)
454 pic_t *bridge = (pic_t *)ptr->bs_base;
456 bridge->p_int_enable &= ~bits;
460 pcireg_intr_enable_bit_set(pcibr_soft_t ptr, uint64_t bits)
462 pic_t *bridge = (pic_t *)ptr->bs_base;
464 bridge->p_int_enable |= bits;
468 * Interrupt Reset Register Access -- Write Only 0000_0110
471 pcireg_intr_reset_set(pcibr_soft_t ptr, uint64_t val)
473 pic_t *bridge = (pic_t *)ptr->bs_base;
475 bridge->p_int_rst_stat = val;
479 pcireg_intr_mode_set(pcibr_soft_t ptr, uint64_t val)
481 pic_t *bridge = (pic_t *)ptr->bs_base;
483 bridge->p_int_mode = val;
487 pcireg_intr_device_set(pcibr_soft_t ptr, uint64_t val)
489 pic_t *bridge = (pic_t *)ptr->bs_base;
491 bridge->p_int_device = val;
495 __pcireg_intr_device_bit_set(pic_t *bridge, uint64_t bits)
497 bridge->p_int_device |= bits;
501 pcireg_bridge_intr_device_bit_set(void *ptr, uint64_t bits)
503 __pcireg_intr_device_bit_set((pic_t *)ptr, bits);
507 pcireg_intr_device_bit_set(pcibr_soft_t ptr, uint64_t bits)
509 __pcireg_intr_device_bit_set((pic_t *)ptr->bs_base, bits);
513 pcireg_intr_device_bit_clr(pcibr_soft_t ptr, uint64_t bits)
515 pic_t *bridge = (pic_t *)ptr->bs_base;
517 bridge->p_int_device &= ~bits;
521 * Host Error Interrupt Field Register Access -- Read/Write 0000_0128
524 pcireg_intr_host_err_set(pcibr_soft_t ptr, uint64_t val)
526 pic_t *bridge = (pic_t *)ptr->bs_base;
528 bridge->p_int_host_err = val;
532 * Interrupt Host Address Register -- Read/Write 0000_0130 - 0000_0168
535 pcireg_intr_addr_get(pcibr_soft_t ptr, int int_n)
537 pic_t *bridge = (pic_t *)ptr->bs_base;
539 return bridge->p_int_addr[int_n];
543 __pcireg_intr_addr_set(pic_t *bridge, int int_n, uint64_t val)
545 bridge->p_int_addr[int_n] = val;
549 pcireg_bridge_intr_addr_set(void *ptr, int int_n, uint64_t val)
551 __pcireg_intr_addr_set((pic_t *)ptr, int_n, val);
555 pcireg_intr_addr_set(pcibr_soft_t ptr, int int_n, uint64_t val)
557 __pcireg_intr_addr_set((pic_t *)ptr->bs_base, int_n, val);
561 pcireg_intr_addr_addr(pcibr_soft_t ptr, int int_n)
563 pic_t *bridge = (pic_t *)ptr->bs_base;
565 return (void *)&(bridge->p_int_addr[int_n]);
569 __pcireg_intr_addr_vect_set(pic_t *bridge, int int_n, uint64_t vect)
571 bridge->p_int_addr[int_n] &= ~PIC_HOST_INTR_FLD;
572 bridge->p_int_addr[int_n] |=
573 ((vect << PIC_HOST_INTR_FLD_SHFT) & PIC_HOST_INTR_FLD);
577 pcireg_bridge_intr_addr_vect_set(void *ptr, int int_n, uint64_t vect)
579 __pcireg_intr_addr_vect_set((pic_t *)ptr, int_n, vect);
583 pcireg_intr_addr_vect_set(pcibr_soft_t ptr, int int_n, uint64_t vect)
585 __pcireg_intr_addr_vect_set((pic_t *)ptr->bs_base, int_n, vect);
591 * Intr Host Address Register (int_addr) -- Read/Write 0000_0130 - 0000_0168
594 __pcireg_intr_addr_addr_set(pic_t *bridge, int int_n, uint64_t addr)
596 bridge->p_int_addr[int_n] &= ~PIC_HOST_INTR_ADDR;
597 bridge->p_int_addr[int_n] |= (addr & PIC_HOST_INTR_ADDR);
601 pcireg_bridge_intr_addr_addr_set(void *ptr, int int_n, uint64_t addr)
603 __pcireg_intr_addr_addr_set((pic_t *)ptr, int_n, addr);
607 pcireg_intr_addr_addr_set(pcibr_soft_t ptr, int int_n, uint64_t addr)
609 __pcireg_intr_addr_addr_set((pic_t *)ptr->bs_base, int_n, addr);
613 * Multiple Interrupt Register Access -- Read Only 0000_0178
616 pcireg_intr_multiple_get(pcibr_soft_t ptr)
618 pic_t *bridge = (pic_t *)ptr->bs_base;
620 return bridge->p_mult_int;
624 * Force Always Intr Register Access -- Write Only 0000_0180 - 0000_01B8
627 __pcireg_force_always_addr_get(pic_t *bridge, int int_n)
629 return (void *)&(bridge->p_force_always[int_n]);
633 pcireg_bridge_force_always_addr_get(void *ptr, int int_n)
635 return __pcireg_force_always_addr_get((pic_t *)ptr, int_n);
639 pcireg_force_always_addr_get(pcibr_soft_t ptr, int int_n)
641 return __pcireg_force_always_addr_get((pic_t *)ptr->bs_base, int_n);
645 * Force Interrupt Register Access -- Write Only 0000_01C0 - 0000_01F8
648 pcireg_force_intr_set(pcibr_soft_t ptr, int int_n)
650 pic_t *bridge = (pic_t *)ptr->bs_base;
652 bridge->p_force_pin[int_n] = 1;
656 * Device(x) Register Access -- Read/Write 0000_0200 - 0000_0218
659 pcireg_device_get(pcibr_soft_t ptr, int device)
661 pic_t *bridge = (pic_t *)ptr->bs_base;
663 ASSERT_ALWAYS((device >= 0) && (device <= 3));
664 return bridge->p_device[device];
668 pcireg_device_set(pcibr_soft_t ptr, int device, uint64_t val)
670 pic_t *bridge = (pic_t *)ptr->bs_base;
672 ASSERT_ALWAYS((device >= 0) && (device <= 3));
673 bridge->p_device[device] = val;
677 * Device(x) Write Buffer Flush Reg Access -- Read Only 0000_0240 - 0000_0258
680 pcireg_wrb_flush_get(pcibr_soft_t ptr, int device)
682 pic_t *bridge = (pic_t *)ptr->bs_base;
685 ASSERT_ALWAYS((device >= 0) && (device <= 3));
686 ret = bridge->p_wr_req_buf[device];
688 /* Read of the Write Buffer Flush should always return zero */
689 ASSERT_ALWAYS(ret == 0);
694 * Even/Odd RRB Register Access -- Read/Write 0000_0280 - 0000_0288
697 pcireg_rrb_get(pcibr_soft_t ptr, int even_odd)
699 pic_t *bridge = (pic_t *)ptr->bs_base;
701 return bridge->p_rrb_map[even_odd];
705 pcireg_rrb_set(pcibr_soft_t ptr, int even_odd, uint64_t val)
707 pic_t *bridge = (pic_t *)ptr->bs_base;
709 bridge->p_rrb_map[even_odd] = val;
713 pcireg_rrb_bit_set(pcibr_soft_t ptr, int even_odd, uint64_t bits)
715 pic_t *bridge = (pic_t *)ptr->bs_base;
717 bridge->p_rrb_map[even_odd] |= bits;
721 * RRB Status Register Access -- Read Only 0000_0290
724 pcireg_rrb_status_get(pcibr_soft_t ptr)
726 pic_t *bridge = (pic_t *)ptr->bs_base;
728 return bridge->p_resp_status;
732 * RRB Clear Register Access -- Write Only 0000_0298
735 pcireg_rrb_clear_set(pcibr_soft_t ptr, uint64_t val)
737 pic_t *bridge = (pic_t *)ptr->bs_base;
739 bridge->p_resp_clear = val;
743 * PCIX Bus Error Address Register Access -- Read Only 0000_0600
746 pcireg_pcix_bus_err_addr_get(pcibr_soft_t ptr)
748 pic_t *bridge = (pic_t *)ptr->bs_base;
750 return bridge->p_pcix_bus_err_addr;
754 * PCIX Bus Error Attribute Register Access -- Read Only 0000_0608
757 pcireg_pcix_bus_err_attr_get(pcibr_soft_t ptr)
759 pic_t *bridge = (pic_t *)ptr->bs_base;
761 return bridge->p_pcix_bus_err_attr;
765 * PCIX Bus Error Data Register Access -- Read Only 0000_0610
768 pcireg_pcix_bus_err_data_get(pcibr_soft_t ptr)
770 pic_t *bridge = (pic_t *)ptr->bs_base;
772 return bridge->p_pcix_bus_err_data;
776 * PCIX PIO Split Request Address Register Access -- Read Only 0000_0618
779 pcireg_pcix_pio_split_addr_get(pcibr_soft_t ptr)
781 pic_t *bridge = (pic_t *)ptr->bs_base;
783 return bridge->p_pcix_pio_split_addr;
787 * PCIX PIO Split Request Attribute Register Access -- Read Only 0000_0620
790 pcireg_pcix_pio_split_attr_get(pcibr_soft_t ptr)
792 pic_t *bridge = (pic_t *)ptr->bs_base;
794 return bridge->p_pcix_pio_split_attr;
798 * PCIX DMA Request Error Attribute Register Access -- Read Only 0000_0628
801 pcireg_pcix_req_err_attr_get(pcibr_soft_t ptr)
803 pic_t *bridge = (pic_t *)ptr->bs_base;
805 return bridge->p_pcix_dma_req_err_attr;
809 * PCIX DMA Request Error Address Register Access -- Read Only 0000_0630
812 pcireg_pcix_req_err_addr_get(pcibr_soft_t ptr)
814 pic_t *bridge = (pic_t *)ptr->bs_base;
816 return bridge->p_pcix_dma_req_err_addr;
820 * Type 0 Configuration Space Access -- Read/Write
823 pcireg_type0_cfg_addr(pcibr_soft_t ptr, uint8_t slot, uint8_t func, int off)
825 pic_t *bridge = (pic_t *)ptr->bs_base;
827 /* Type 0 Config space accesses on PIC are 1-4, not 0-3 since
828 * it is a PCIX Bridge. See sys/PCI/pic.h for explanation.
831 ASSERT_ALWAYS(((int) slot >= 1) && ((int) slot <= 4));
832 return &(bridge->p_type0_cfg_dev[slot].f[func].l[(off / 4)]);
836 * Type 1 Configuration Space Access -- Read/Write
839 pcireg_type1_cfg_addr(pcibr_soft_t ptr, uint8_t func, int offset)
841 pic_t *bridge = (pic_t *)ptr->bs_base;
844 * Return a config space address for the given slot/func/offset.
845 * Note the returned ptr is a 32bit word (ie. cfg_p) aligned ptr
846 * pointing to the 32bit word that contains the "offset" byte.
848 return &(bridge->p_type1_cfg.f[func].l[(offset / 4)]);
852 * Internal ATE SSRAM Access -- Read/Write
855 pcireg_int_ate_get(pcibr_soft_t ptr, int ate_index)
857 pic_t *bridge = (pic_t *)ptr->bs_base;
859 ASSERT_ALWAYS((ate_index >= 0) && (ate_index <= 1024));
860 return bridge->p_int_ate_ram[ate_index];
864 pcireg_int_ate_set(pcibr_soft_t ptr, int ate_index, bridge_ate_t val)
866 pic_t *bridge = (pic_t *)ptr->bs_base;
868 ASSERT_ALWAYS((ate_index >= 0) && (ate_index <= 1024));
869 bridge->p_int_ate_ram[ate_index] = (picate_t) val;
873 pcireg_int_ate_addr(pcibr_soft_t ptr, int ate_index)
875 pic_t *bridge = (pic_t *)ptr->bs_base;
877 ASSERT_ALWAYS((ate_index >= 0) && (ate_index <= 1024));
878 return &(bridge->p_int_ate_ram[ate_index]);