aboutsummaryrefslogtreecommitdiff
path: root/src/parisc/hppa.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/parisc/hppa.h')
-rw-r--r--src/parisc/hppa.h67
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