diff options
Diffstat (limited to 'src/parisc/hppa.h')
-rw-r--r-- | src/parisc/hppa.h | 67 |
1 files changed, 60 insertions, 7 deletions
diff --git a/src/parisc/hppa.h b/src/parisc/hppa.h index 0ac0992..036141b 100644 --- a/src/parisc/hppa.h +++ b/src/parisc/hppa.h @@ -14,7 +14,7 @@ #include "byteorder.h" // le16_to_cpu /* Pointer to zero-page of PA-RISC */ -#define PAGE0 ((volatile struct zeropage *) 0UL) +#define PAGE0 ((struct zeropage *) 0UL) #define PSW_I 0x00000001 @@ -204,9 +204,20 @@ static inline u32 ror(u32 word, unsigned int shift) return (word >> (shift & 31)) | (word << ((-shift) & 31)); } +extern char has_astro; /* false for B160L machine with Dino PCI chip */ +extern unsigned long hppa_port_pci_cmd; +extern unsigned long hppa_port_pci_data; + + #define pci_ioport_addr(port) ((port >= 0x1000) && (port < FIRMWARE_START)) +#define is_astro_ioport(port) (has_astro && (port < IOS_DIST_BASE_SIZE)) + +#define astro_ioport_addr(port) ((void *)(portaddr_t)(IOS_DIST_BASE_ADDR + port)) static inline void outl(u32 value, portaddr_t port) { + if (is_astro_ioport(port)) + *(volatile u32 *)(astro_ioport_addr(port)) = value; + else if (!pci_ioport_addr(port)) { *(volatile u32 *)(port) = be32_to_cpu(value); } else { @@ -218,6 +229,9 @@ static inline void outl(u32 value, portaddr_t port) { } static inline void outw(u16 value, portaddr_t port) { + if (is_astro_ioport(port)) + *(volatile u16 *)(astro_ioport_addr(port)) = value; + else if (!pci_ioport_addr(port)) { *(volatile u16 *)(port) = be16_to_cpu(value); } else { @@ -229,6 +243,9 @@ static inline void outw(u16 value, portaddr_t port) { } static inline void outb(u8 value, portaddr_t port) { + if (is_astro_ioport(port)) + *(volatile u8 *)(astro_ioport_addr(port)) = value; + else if (!pci_ioport_addr(port)) { *(volatile u8 *)(port) = value; } else { @@ -240,7 +257,10 @@ static inline void outb(u8 value, portaddr_t port) { } static inline u8 inb(portaddr_t port) { - if (!pci_ioport_addr(port)) { + if (is_astro_ioport(port)) + return *(volatile u8 *)(astro_ioport_addr(port)); + else + if (has_astro || !pci_ioport_addr(port)) { return *(volatile u8 *)(port); } else { /* write PCI I/O address to Dino's PCI_CONFIG_ADDR */ @@ -251,6 +271,9 @@ static inline u8 inb(portaddr_t port) { } static inline u16 inw(portaddr_t port) { + if (is_astro_ioport(port)) + return *(volatile u16 *)(astro_ioport_addr(port)); + else if (!pci_ioport_addr(port)) { return *(volatile u16 *)(port); } else { @@ -261,6 +284,9 @@ static inline u16 inw(portaddr_t port) { } } static inline u32 inl(portaddr_t port) { + if (is_astro_ioport(port)) + return *(volatile u32 *)(astro_ioport_addr(port)); + else if (!pci_ioport_addr(port)) { return *(volatile u32 *)(port); } else { @@ -321,13 +347,15 @@ static inline void smp_wmb(void) { barrier(); } +/* readX()/writeX() do byteswapping */ + static inline void writel(void *addr, u32 val) { barrier(); - *(volatile u32 *)addr = val; + *(volatile u32 *)addr = cpu_to_le32(val); } static inline void writew(void *addr, u16 val) { barrier(); - *(volatile u16 *)addr = val; + *(volatile u16 *)addr = cpu_to_le16(val); } static inline void writeb(void *addr, u8 val) { barrier(); @@ -336,17 +364,17 @@ static inline void writeb(void *addr, u8 val) { static inline u64 readq(const void *addr) { u64 val = *(volatile const u64 *)addr; barrier(); - return val; + return le64_to_cpu(val); } static inline u32 readl(const void *addr) { u32 val = *(volatile const u32 *)addr; barrier(); - return val; + return le32_to_cpu(val); } static inline u16 readw(const void *addr) { u16 val = *(volatile const u16 *)addr; barrier(); - return val; + return le16_to_cpu(val); } static inline u8 readb(const void *addr) { u8 val = *(volatile const u8 *)addr; @@ -354,6 +382,27 @@ static inline u8 readb(const void *addr) { return val; } +/* gsc_readX()/gsc_writeX() do no byteswapping */ + +static inline void gsc_writel(void *addr, u32 val) { + barrier(); + *(volatile u32 *)addr = val; +} +static inline void gsc_writeb(void *addr, u8 val) { + barrier(); + *(volatile u8 *)addr = val; +} +static inline u32 gsc_readl(const void *addr) { + u32 val = *(volatile const u32 *)addr; + barrier(); + return val; +} +static inline u8 gsc_readb(const void *addr) { + u8 val = *(volatile const u8 *)addr; + barrier(); + return val; +} + // FLASH_FLOPPY not supported #define GDT_CODE (0) #define GDT_DATA (0) @@ -378,5 +427,9 @@ static inline void wrmsr(u32 index, u64 val) // x86.c void cpuid(u32 index, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx); +// pci.c +unsigned long elroy_offset(u16 bdf); +void *elroy_port(unsigned long port, unsigned long offs); + #endif // !__ASSEMBLY__ #endif |