xref: /openbmc/linux/arch/alpha/include/asm/core_apecs.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1  /* SPDX-License-Identifier: GPL-2.0 */
2  #ifndef __ALPHA_APECS__H__
3  #define __ALPHA_APECS__H__
4  
5  #include <linux/types.h>
6  #include <asm/compiler.h>
7  
8  /*
9   * APECS is the internal name for the 2107x chipset which provides
10   * memory controller and PCI access for the 21064 chip based systems.
11   *
12   * This file is based on:
13   *
14   * DECchip 21071-AA and DECchip 21072-AA Core Logic Chipsets
15   * Data Sheet
16   *
17   * EC-N0648-72
18   *
19   *
20   * david.rusling@reo.mts.dec.com Initial Version.
21   *
22   */
23  
24  /*
25     An AVANTI *might* be an XL, and an XL has only 27 bits of ISA address
26     that get passed through the PCI<->ISA bridge chip. So we've gotta use
27     both windows to max out the physical memory we can DMA to. Sigh...
28  
29     If we try a window at 0 for 1GB as a work-around, we run into conflicts
30     with ISA/PCI bus memory which can't be relocated, like VGA aperture and
31     BIOS ROMs. So we must put the windows high enough to avoid these areas.
32  
33     We put window 1 at BUS 64Mb for 64Mb, mapping physical 0 to 64Mb-1,
34     and window 2 at BUS 1Gb for 1Gb, mapping physical 0 to 1Gb-1.
35     Yes, this does map 0 to 64Mb-1 twice, but only window 1 will actually
36     be used for that range (via virt_to_bus()).
37  
38     Note that we actually fudge the window 1 maximum as 48Mb instead of 64Mb,
39     to keep virt_to_bus() from returning an address in the first window, for
40     a data area that goes beyond the 64Mb first DMA window.  Sigh...
41     The fudge factor MUST match with <asm/dma.h> MAX_DMA_ADDRESS, but
42     we can't just use that here, because of header file looping... :-(
43  
44     Window 1 will be used for all DMA from the ISA bus; yes, that does
45     limit what memory an ISA floppy or sound card or Ethernet can touch, but
46     it's also a known limitation on other platforms as well. We use the
47     same technique that is used on INTEL platforms with similar limitation:
48     set MAX_DMA_ADDRESS and clear some pages' DMAable flags during mem_init().
49     We trust that any ISA bus device drivers will *always* ask for DMAable
50     memory explicitly via kmalloc()/get_free_pages() flags arguments.
51  
52     Note that most PCI bus devices' drivers do *not* explicitly ask for
53     DMAable memory; they count on being able to DMA to any memory they
54     get from kmalloc()/get_free_pages(). They will also use window 1 for
55     any physical memory accesses below 64Mb; the rest will be handled by
56     window 2, maxing out at 1Gb of memory. I trust this is enough... :-)
57  
58     We hope that the area before the first window is large enough so that
59     there will be no overlap at the top end (64Mb). We *must* locate the
60     PCI cards' memory just below window 1, so that there's still the
61     possibility of being able to access it via SPARSE space. This is
62     important for cards such as the Matrox Millennium, whose Xserver
63     wants to access memory-mapped registers in byte and short lengths.
64  
65     Note that the XL is treated differently from the AVANTI, even though
66     for most other things they are identical. It didn't seem reasonable to
67     make the AVANTI support pay for the limitations of the XL. It is true,
68     however, that an XL kernel will run on an AVANTI without problems.
69  
70     %%% All of this should be obviated by the ability to route
71     everything through the iommu.
72  */
73  
74  /*
75   * 21071-DA Control and Status registers.
76   * These are used for PCI memory access.
77   */
78  #define APECS_IOC_DCSR                  (IDENT_ADDR + 0x1A0000000UL)
79  #define APECS_IOC_PEAR                  (IDENT_ADDR + 0x1A0000020UL)
80  #define APECS_IOC_SEAR                  (IDENT_ADDR + 0x1A0000040UL)
81  #define APECS_IOC_DR1                   (IDENT_ADDR + 0x1A0000060UL)
82  #define APECS_IOC_DR2                   (IDENT_ADDR + 0x1A0000080UL)
83  #define APECS_IOC_DR3                   (IDENT_ADDR + 0x1A00000A0UL)
84  
85  #define APECS_IOC_TB1R                  (IDENT_ADDR + 0x1A00000C0UL)
86  #define APECS_IOC_TB2R                  (IDENT_ADDR + 0x1A00000E0UL)
87  
88  #define APECS_IOC_PB1R                  (IDENT_ADDR + 0x1A0000100UL)
89  #define APECS_IOC_PB2R                  (IDENT_ADDR + 0x1A0000120UL)
90  
91  #define APECS_IOC_PM1R                  (IDENT_ADDR + 0x1A0000140UL)
92  #define APECS_IOC_PM2R                  (IDENT_ADDR + 0x1A0000160UL)
93  
94  #define APECS_IOC_HAXR0                 (IDENT_ADDR + 0x1A0000180UL)
95  #define APECS_IOC_HAXR1                 (IDENT_ADDR + 0x1A00001A0UL)
96  #define APECS_IOC_HAXR2                 (IDENT_ADDR + 0x1A00001C0UL)
97  
98  #define APECS_IOC_PMLT                  (IDENT_ADDR + 0x1A00001E0UL)
99  
100  #define APECS_IOC_TLBTAG0               (IDENT_ADDR + 0x1A0000200UL)
101  #define APECS_IOC_TLBTAG1               (IDENT_ADDR + 0x1A0000220UL)
102  #define APECS_IOC_TLBTAG2               (IDENT_ADDR + 0x1A0000240UL)
103  #define APECS_IOC_TLBTAG3               (IDENT_ADDR + 0x1A0000260UL)
104  #define APECS_IOC_TLBTAG4               (IDENT_ADDR + 0x1A0000280UL)
105  #define APECS_IOC_TLBTAG5               (IDENT_ADDR + 0x1A00002A0UL)
106  #define APECS_IOC_TLBTAG6               (IDENT_ADDR + 0x1A00002C0UL)
107  #define APECS_IOC_TLBTAG7               (IDENT_ADDR + 0x1A00002E0UL)
108  
109  #define APECS_IOC_TLBDATA0              (IDENT_ADDR + 0x1A0000300UL)
110  #define APECS_IOC_TLBDATA1              (IDENT_ADDR + 0x1A0000320UL)
111  #define APECS_IOC_TLBDATA2              (IDENT_ADDR + 0x1A0000340UL)
112  #define APECS_IOC_TLBDATA3              (IDENT_ADDR + 0x1A0000360UL)
113  #define APECS_IOC_TLBDATA4              (IDENT_ADDR + 0x1A0000380UL)
114  #define APECS_IOC_TLBDATA5              (IDENT_ADDR + 0x1A00003A0UL)
115  #define APECS_IOC_TLBDATA6              (IDENT_ADDR + 0x1A00003C0UL)
116  #define APECS_IOC_TLBDATA7              (IDENT_ADDR + 0x1A00003E0UL)
117  
118  #define APECS_IOC_TBIA                  (IDENT_ADDR + 0x1A0000400UL)
119  
120  
121  /*
122   * 21071-CA Control and Status registers.
123   * These are used to program memory timing,
124   *  configure memory and initialise the B-Cache.
125   */
126  #define APECS_MEM_GCR		        (IDENT_ADDR + 0x180000000UL)
127  #define APECS_MEM_EDSR		        (IDENT_ADDR + 0x180000040UL)
128  #define APECS_MEM_TAR  		        (IDENT_ADDR + 0x180000060UL)
129  #define APECS_MEM_ELAR		        (IDENT_ADDR + 0x180000080UL)
130  #define APECS_MEM_EHAR  		(IDENT_ADDR + 0x1800000a0UL)
131  #define APECS_MEM_SFT_RST		(IDENT_ADDR + 0x1800000c0UL)
132  #define APECS_MEM_LDxLAR 		(IDENT_ADDR + 0x1800000e0UL)
133  #define APECS_MEM_LDxHAR 		(IDENT_ADDR + 0x180000100UL)
134  #define APECS_MEM_GTR    		(IDENT_ADDR + 0x180000200UL)
135  #define APECS_MEM_RTR    		(IDENT_ADDR + 0x180000220UL)
136  #define APECS_MEM_VFPR   		(IDENT_ADDR + 0x180000240UL)
137  #define APECS_MEM_PDLDR  		(IDENT_ADDR + 0x180000260UL)
138  #define APECS_MEM_PDhDR  		(IDENT_ADDR + 0x180000280UL)
139  
140  /* Bank x Base Address Register */
141  #define APECS_MEM_B0BAR  		(IDENT_ADDR + 0x180000800UL)
142  #define APECS_MEM_B1BAR  		(IDENT_ADDR + 0x180000820UL)
143  #define APECS_MEM_B2BAR  		(IDENT_ADDR + 0x180000840UL)
144  #define APECS_MEM_B3BAR  		(IDENT_ADDR + 0x180000860UL)
145  #define APECS_MEM_B4BAR  		(IDENT_ADDR + 0x180000880UL)
146  #define APECS_MEM_B5BAR  		(IDENT_ADDR + 0x1800008A0UL)
147  #define APECS_MEM_B6BAR  		(IDENT_ADDR + 0x1800008C0UL)
148  #define APECS_MEM_B7BAR  		(IDENT_ADDR + 0x1800008E0UL)
149  #define APECS_MEM_B8BAR  		(IDENT_ADDR + 0x180000900UL)
150  
151  /* Bank x Configuration Register */
152  #define APECS_MEM_B0BCR  		(IDENT_ADDR + 0x180000A00UL)
153  #define APECS_MEM_B1BCR  		(IDENT_ADDR + 0x180000A20UL)
154  #define APECS_MEM_B2BCR  		(IDENT_ADDR + 0x180000A40UL)
155  #define APECS_MEM_B3BCR  		(IDENT_ADDR + 0x180000A60UL)
156  #define APECS_MEM_B4BCR  		(IDENT_ADDR + 0x180000A80UL)
157  #define APECS_MEM_B5BCR  		(IDENT_ADDR + 0x180000AA0UL)
158  #define APECS_MEM_B6BCR  		(IDENT_ADDR + 0x180000AC0UL)
159  #define APECS_MEM_B7BCR  		(IDENT_ADDR + 0x180000AE0UL)
160  #define APECS_MEM_B8BCR  		(IDENT_ADDR + 0x180000B00UL)
161  
162  /* Bank x Timing Register A */
163  #define APECS_MEM_B0TRA  		(IDENT_ADDR + 0x180000C00UL)
164  #define APECS_MEM_B1TRA  		(IDENT_ADDR + 0x180000C20UL)
165  #define APECS_MEM_B2TRA  		(IDENT_ADDR + 0x180000C40UL)
166  #define APECS_MEM_B3TRA  		(IDENT_ADDR + 0x180000C60UL)
167  #define APECS_MEM_B4TRA  		(IDENT_ADDR + 0x180000C80UL)
168  #define APECS_MEM_B5TRA  		(IDENT_ADDR + 0x180000CA0UL)
169  #define APECS_MEM_B6TRA  		(IDENT_ADDR + 0x180000CC0UL)
170  #define APECS_MEM_B7TRA  		(IDENT_ADDR + 0x180000CE0UL)
171  #define APECS_MEM_B8TRA  		(IDENT_ADDR + 0x180000D00UL)
172  
173  /* Bank x Timing Register B */
174  #define APECS_MEM_B0TRB                 (IDENT_ADDR + 0x180000E00UL)
175  #define APECS_MEM_B1TRB  		(IDENT_ADDR + 0x180000E20UL)
176  #define APECS_MEM_B2TRB  		(IDENT_ADDR + 0x180000E40UL)
177  #define APECS_MEM_B3TRB  		(IDENT_ADDR + 0x180000E60UL)
178  #define APECS_MEM_B4TRB  		(IDENT_ADDR + 0x180000E80UL)
179  #define APECS_MEM_B5TRB  		(IDENT_ADDR + 0x180000EA0UL)
180  #define APECS_MEM_B6TRB  		(IDENT_ADDR + 0x180000EC0UL)
181  #define APECS_MEM_B7TRB  		(IDENT_ADDR + 0x180000EE0UL)
182  #define APECS_MEM_B8TRB  		(IDENT_ADDR + 0x180000F00UL)
183  
184  
185  /*
186   * Memory spaces:
187   */
188  #define APECS_IACK_SC		        (IDENT_ADDR + 0x1b0000000UL)
189  #define APECS_CONF		        (IDENT_ADDR + 0x1e0000000UL)
190  #define APECS_IO			(IDENT_ADDR + 0x1c0000000UL)
191  #define APECS_SPARSE_MEM		(IDENT_ADDR + 0x200000000UL)
192  #define APECS_DENSE_MEM		        (IDENT_ADDR + 0x300000000UL)
193  
194  
195  /*
196   * Bit definitions for I/O Controller status register 0:
197   */
198  #define APECS_IOC_STAT0_CMD		0xf
199  #define APECS_IOC_STAT0_ERR		(1<<4)
200  #define APECS_IOC_STAT0_LOST		(1<<5)
201  #define APECS_IOC_STAT0_THIT		(1<<6)
202  #define APECS_IOC_STAT0_TREF		(1<<7)
203  #define APECS_IOC_STAT0_CODE_SHIFT	8
204  #define APECS_IOC_STAT0_CODE_MASK	0x7
205  #define APECS_IOC_STAT0_P_NBR_SHIFT	13
206  #define APECS_IOC_STAT0_P_NBR_MASK	0x7ffff
207  
208  #define APECS_HAE_ADDRESS		APECS_IOC_HAXR1
209  
210  
211  /*
212   * Data structure for handling APECS machine checks:
213   */
214  
215  struct el_apecs_mikasa_sysdata_mcheck
216  {
217  	unsigned long coma_gcr;
218  	unsigned long coma_edsr;
219  	unsigned long coma_ter;
220  	unsigned long coma_elar;
221  	unsigned long coma_ehar;
222  	unsigned long coma_ldlr;
223  	unsigned long coma_ldhr;
224  	unsigned long coma_base0;
225  	unsigned long coma_base1;
226  	unsigned long coma_base2;
227  	unsigned long coma_base3;
228  	unsigned long coma_cnfg0;
229  	unsigned long coma_cnfg1;
230  	unsigned long coma_cnfg2;
231  	unsigned long coma_cnfg3;
232  	unsigned long epic_dcsr;
233  	unsigned long epic_pear;
234  	unsigned long epic_sear;
235  	unsigned long epic_tbr1;
236  	unsigned long epic_tbr2;
237  	unsigned long epic_pbr1;
238  	unsigned long epic_pbr2;
239  	unsigned long epic_pmr1;
240  	unsigned long epic_pmr2;
241  	unsigned long epic_harx1;
242  	unsigned long epic_harx2;
243  	unsigned long epic_pmlt;
244  	unsigned long epic_tag0;
245  	unsigned long epic_tag1;
246  	unsigned long epic_tag2;
247  	unsigned long epic_tag3;
248  	unsigned long epic_tag4;
249  	unsigned long epic_tag5;
250  	unsigned long epic_tag6;
251  	unsigned long epic_tag7;
252  	unsigned long epic_data0;
253  	unsigned long epic_data1;
254  	unsigned long epic_data2;
255  	unsigned long epic_data3;
256  	unsigned long epic_data4;
257  	unsigned long epic_data5;
258  	unsigned long epic_data6;
259  	unsigned long epic_data7;
260  
261  	unsigned long pceb_vid;
262  	unsigned long pceb_did;
263  	unsigned long pceb_revision;
264  	unsigned long pceb_command;
265  	unsigned long pceb_status;
266  	unsigned long pceb_latency;
267  	unsigned long pceb_control;
268  	unsigned long pceb_arbcon;
269  	unsigned long pceb_arbpri;
270  
271  	unsigned long esc_id;
272  	unsigned long esc_revision;
273  	unsigned long esc_int0;
274  	unsigned long esc_int1;
275  	unsigned long esc_elcr0;
276  	unsigned long esc_elcr1;
277  	unsigned long esc_last_eisa;
278  	unsigned long esc_nmi_stat;
279  
280  	unsigned long pci_ir;
281  	unsigned long pci_imr;
282  	unsigned long svr_mgr;
283  };
284  
285  /* This for the normal APECS machines.  */
286  struct el_apecs_sysdata_mcheck
287  {
288  	unsigned long coma_gcr;
289  	unsigned long coma_edsr;
290  	unsigned long coma_ter;
291  	unsigned long coma_elar;
292  	unsigned long coma_ehar;
293  	unsigned long coma_ldlr;
294  	unsigned long coma_ldhr;
295  	unsigned long coma_base0;
296  	unsigned long coma_base1;
297  	unsigned long coma_base2;
298  	unsigned long coma_cnfg0;
299  	unsigned long coma_cnfg1;
300  	unsigned long coma_cnfg2;
301  	unsigned long epic_dcsr;
302  	unsigned long epic_pear;
303  	unsigned long epic_sear;
304  	unsigned long epic_tbr1;
305  	unsigned long epic_tbr2;
306  	unsigned long epic_pbr1;
307  	unsigned long epic_pbr2;
308  	unsigned long epic_pmr1;
309  	unsigned long epic_pmr2;
310  	unsigned long epic_harx1;
311  	unsigned long epic_harx2;
312  	unsigned long epic_pmlt;
313  	unsigned long epic_tag0;
314  	unsigned long epic_tag1;
315  	unsigned long epic_tag2;
316  	unsigned long epic_tag3;
317  	unsigned long epic_tag4;
318  	unsigned long epic_tag5;
319  	unsigned long epic_tag6;
320  	unsigned long epic_tag7;
321  	unsigned long epic_data0;
322  	unsigned long epic_data1;
323  	unsigned long epic_data2;
324  	unsigned long epic_data3;
325  	unsigned long epic_data4;
326  	unsigned long epic_data5;
327  	unsigned long epic_data6;
328  	unsigned long epic_data7;
329  };
330  
331  struct el_apecs_procdata
332  {
333  	unsigned long paltemp[32];  /* PAL TEMP REGS. */
334  	/* EV4-specific fields */
335  	unsigned long exc_addr;     /* Address of excepting instruction. */
336  	unsigned long exc_sum;      /* Summary of arithmetic traps. */
337  	unsigned long exc_mask;     /* Exception mask (from exc_sum). */
338  	unsigned long iccsr;        /* IBox hardware enables. */
339  	unsigned long pal_base;     /* Base address for PALcode. */
340  	unsigned long hier;         /* Hardware Interrupt Enable. */
341  	unsigned long hirr;         /* Hardware Interrupt Request. */
342  	unsigned long csr;          /* D-stream fault info. */
343  	unsigned long dc_stat;      /* D-cache status (ECC/Parity Err). */
344  	unsigned long dc_addr;      /* EV3 Phys Addr for ECC/DPERR. */
345  	unsigned long abox_ctl;     /* ABox Control Register. */
346  	unsigned long biu_stat;     /* BIU Status. */
347  	unsigned long biu_addr;     /* BUI Address. */
348  	unsigned long biu_ctl;      /* BIU Control. */
349  	unsigned long fill_syndrome;/* For correcting ECC errors. */
350  	unsigned long fill_addr;    /* Cache block which was being read */
351  	unsigned long va;           /* Effective VA of fault or miss. */
352  	unsigned long bc_tag;       /* Backup Cache Tag Probe Results.*/
353  };
354  
355  
356  #ifdef __KERNEL__
357  
358  #ifndef __EXTERN_INLINE
359  #define __EXTERN_INLINE extern inline
360  #define __IO_EXTERN_INLINE
361  #endif
362  
363  /*
364   * I/O functions:
365   *
366   * Unlike Jensen, the APECS machines have no concept of local
367   * I/O---everything goes over the PCI bus.
368   *
369   * There is plenty room for optimization here.  In particular,
370   * the Alpha's insb/insw/extb/extw should be useful in moving
371   * data to/from the right byte-lanes.
372   */
373  
374  #define vip	volatile int __force *
375  #define vuip	volatile unsigned int __force *
376  #define vulp	volatile unsigned long __force *
377  
378  #define APECS_SET_HAE						\
379  	do {							\
380  		if (addr >= (1UL << 24)) {			\
381  			unsigned long msb = addr & 0xf8000000;	\
382  			addr -= msb;				\
383  			set_hae(msb);				\
384  		}						\
385  	} while (0)
386  
apecs_ioread8(const void __iomem * xaddr)387  __EXTERN_INLINE u8 apecs_ioread8(const void __iomem *xaddr)
388  {
389  	unsigned long addr = (unsigned long) xaddr;
390  	unsigned long result, base_and_type;
391  
392  	if (addr >= APECS_DENSE_MEM) {
393  		addr -= APECS_DENSE_MEM;
394  		APECS_SET_HAE;
395  		base_and_type = APECS_SPARSE_MEM + 0x00;
396  	} else {
397  		addr -= APECS_IO;
398  		base_and_type = APECS_IO + 0x00;
399  	}
400  
401  	result = *(vip) ((addr << 5) + base_and_type);
402  	return __kernel_extbl(result, addr & 3);
403  }
404  
apecs_iowrite8(u8 b,void __iomem * xaddr)405  __EXTERN_INLINE void apecs_iowrite8(u8 b, void __iomem *xaddr)
406  {
407  	unsigned long addr = (unsigned long) xaddr;
408  	unsigned long w, base_and_type;
409  
410  	if (addr >= APECS_DENSE_MEM) {
411  		addr -= APECS_DENSE_MEM;
412  		APECS_SET_HAE;
413  		base_and_type = APECS_SPARSE_MEM + 0x00;
414  	} else {
415  		addr -= APECS_IO;
416  		base_and_type = APECS_IO + 0x00;
417  	}
418  
419  	w = __kernel_insbl(b, addr & 3);
420  	*(vuip) ((addr << 5) + base_and_type) = w;
421  }
422  
apecs_ioread16(const void __iomem * xaddr)423  __EXTERN_INLINE u16 apecs_ioread16(const void __iomem *xaddr)
424  {
425  	unsigned long addr = (unsigned long) xaddr;
426  	unsigned long result, base_and_type;
427  
428  	if (addr >= APECS_DENSE_MEM) {
429  		addr -= APECS_DENSE_MEM;
430  		APECS_SET_HAE;
431  		base_and_type = APECS_SPARSE_MEM + 0x08;
432  	} else {
433  		addr -= APECS_IO;
434  		base_and_type = APECS_IO + 0x08;
435  	}
436  
437  	result = *(vip) ((addr << 5) + base_and_type);
438  	return __kernel_extwl(result, addr & 3);
439  }
440  
apecs_iowrite16(u16 b,void __iomem * xaddr)441  __EXTERN_INLINE void apecs_iowrite16(u16 b, void __iomem *xaddr)
442  {
443  	unsigned long addr = (unsigned long) xaddr;
444  	unsigned long w, base_and_type;
445  
446  	if (addr >= APECS_DENSE_MEM) {
447  		addr -= APECS_DENSE_MEM;
448  		APECS_SET_HAE;
449  		base_and_type = APECS_SPARSE_MEM + 0x08;
450  	} else {
451  		addr -= APECS_IO;
452  		base_and_type = APECS_IO + 0x08;
453  	}
454  
455  	w = __kernel_inswl(b, addr & 3);
456  	*(vuip) ((addr << 5) + base_and_type) = w;
457  }
458  
apecs_ioread32(const void __iomem * xaddr)459  __EXTERN_INLINE u32 apecs_ioread32(const void __iomem *xaddr)
460  {
461  	unsigned long addr = (unsigned long) xaddr;
462  	if (addr < APECS_DENSE_MEM)
463  		addr = ((addr - APECS_IO) << 5) + APECS_IO + 0x18;
464  	return *(vuip)addr;
465  }
466  
apecs_iowrite32(u32 b,void __iomem * xaddr)467  __EXTERN_INLINE void apecs_iowrite32(u32 b, void __iomem *xaddr)
468  {
469  	unsigned long addr = (unsigned long) xaddr;
470  	if (addr < APECS_DENSE_MEM)
471  		addr = ((addr - APECS_IO) << 5) + APECS_IO + 0x18;
472  	*(vuip)addr = b;
473  }
474  
apecs_ioread64(const void __iomem * xaddr)475  __EXTERN_INLINE u64 apecs_ioread64(const void __iomem *xaddr)
476  {
477  	unsigned long addr = (unsigned long) xaddr;
478  	if (addr < APECS_DENSE_MEM)
479  		addr = ((addr - APECS_IO) << 5) + APECS_IO + 0x18;
480  	return *(vulp)addr;
481  }
482  
apecs_iowrite64(u64 b,void __iomem * xaddr)483  __EXTERN_INLINE void apecs_iowrite64(u64 b, void __iomem *xaddr)
484  {
485  	unsigned long addr = (unsigned long) xaddr;
486  	if (addr < APECS_DENSE_MEM)
487  		addr = ((addr - APECS_IO) << 5) + APECS_IO + 0x18;
488  	*(vulp)addr = b;
489  }
490  
apecs_ioportmap(unsigned long addr)491  __EXTERN_INLINE void __iomem *apecs_ioportmap(unsigned long addr)
492  {
493  	return (void __iomem *)(addr + APECS_IO);
494  }
495  
apecs_ioremap(unsigned long addr,unsigned long size)496  __EXTERN_INLINE void __iomem *apecs_ioremap(unsigned long addr,
497  					    unsigned long size)
498  {
499  	return (void __iomem *)(addr + APECS_DENSE_MEM);
500  }
501  
apecs_is_ioaddr(unsigned long addr)502  __EXTERN_INLINE int apecs_is_ioaddr(unsigned long addr)
503  {
504  	return addr >= IDENT_ADDR + 0x180000000UL;
505  }
506  
apecs_is_mmio(const volatile void __iomem * addr)507  __EXTERN_INLINE int apecs_is_mmio(const volatile void __iomem *addr)
508  {
509  	return (unsigned long)addr >= APECS_DENSE_MEM;
510  }
511  
512  #undef APECS_SET_HAE
513  
514  #undef vip
515  #undef vuip
516  #undef vulp
517  
518  #undef __IO_PREFIX
519  #define __IO_PREFIX		apecs
520  #define apecs_trivial_io_bw	0
521  #define apecs_trivial_io_lq	0
522  #define apecs_trivial_rw_bw	2
523  #define apecs_trivial_rw_lq	1
524  #define apecs_trivial_iounmap	1
525  #include <asm/io_trivial.h>
526  
527  #ifdef __IO_EXTERN_INLINE
528  #undef __EXTERN_INLINE
529  #undef __IO_EXTERN_INLINE
530  #endif
531  
532  #endif /* __KERNEL__ */
533  
534  #endif /* __ALPHA_APECS__H__ */
535