Author: blueswirl Date: Fri Jan 29 19:46:38 2010 New Revision: 671 URL: http://tracker.coreboot.org/trac/openbios/changeset/671
Log: QEMU changed PCI/IO port byte swapping, adapt OpenBIOS to new way
This requires an updated QEMU.
Also use little endian access ASIs.
Signed-off-by: Blue Swirl blauwirbel@gmail.com
Modified: trunk/openbios-devel/arch/sparc64/entry.S trunk/openbios-devel/include/sparc64/io.h trunk/openbios-devel/include/sparc64/pci.h
Modified: trunk/openbios-devel/arch/sparc64/entry.S ============================================================================== --- trunk/openbios-devel/arch/sparc64/entry.S Thu Jan 28 14:20:14 2010 (r670) +++ trunk/openbios-devel/arch/sparc64/entry.S Fri Jan 29 19:46:38 2010 (r671) @@ -59,7 +59,7 @@ ! Check signature "QEMU" setx CFG_ADDR, %g2, %g5 mov FW_CFG_SIGNATURE, %g2 - stha %g2, [%g5] ASI_PHYS_BYPASS_EC_E + stha %g2, [%g5] ASI_PHYS_BYPASS_EC_E_L inc %g5 lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g2 cmp %g2, 'Q' @@ -99,7 +99,7 @@ ! NB: little endian format mov FW_CFG_RAM_SIZE, %g2 dec %g5 - stha %g2, [%g5] ASI_PHYS_BYPASS_EC_E + stha %g2, [%g5] ASI_PHYS_BYPASS_EC_E_L inc %g5 lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g4
Modified: trunk/openbios-devel/include/sparc64/io.h ============================================================================== --- trunk/openbios-devel/include/sparc64/io.h Thu Jan 28 14:20:14 2010 (r670) +++ trunk/openbios-devel/include/sparc64/io.h Fri Jan 29 19:46:38 2010 (r671) @@ -56,6 +56,7 @@
/* * 8, 16 and 32 bit, big and little endian I/O operations, with barrier. + * On Sparc64, BE versions must swap bytes using LE access ASI. */ static inline int in_8(volatile unsigned char *addr) { @@ -75,22 +76,19 @@
static inline int in_le16(volatile unsigned short *addr) { - int ret, tmp; + int ret;
- // XXX __asm__ __volatile__("lduha [%1] 0x15, %0\n\t" :"=r"(ret):"r"(addr):"memory");
- tmp = (ret << 8) & 0xff00; - tmp |= (ret >> 8) & 0xff; - return tmp; + return ret; }
static inline int in_be16(volatile unsigned short *addr) { int ret;
- __asm__ __volatile__("lduha [%1] 0x15, %0\n\t" + __asm__ __volatile__("lduha [%1] 0x1d, %0\n\t" :"=r"(ret):"r"(addr):"memory");
return ret; @@ -98,61 +96,45 @@
static inline void out_le16(volatile unsigned short *addr, int val) { - unsigned tmp;
- // XXX - tmp = (val << 8) & 0xff00; - tmp |= (val >> 8) & 0xff; __asm__ __volatile__("stha %0, [%1] 0x15\n\t" - : : "r"(tmp), "r"(addr):"memory"); + : : "r"(val), "r"(addr):"memory"); }
static inline void out_be16(volatile unsigned short *addr, int val) { - __asm__ __volatile__("stha %0, [%1] 0x15\n\t" + __asm__ __volatile__("stha %0, [%1] 0x1d\n\t" : : "r"(val), "r"(addr):"memory"); }
static inline unsigned in_le32(volatile unsigned *addr) { - unsigned ret, tmp; + unsigned ret;
- // XXX __asm__ __volatile__("lduwa [%1] 0x15, %0\n\t" :"=r"(ret):"r"(addr):"memory");
- tmp = ret << 24; - tmp |= (ret << 8) & 0xff0000; - tmp |= (ret >> 8) & 0xff00; - tmp |= (ret >> 24) & 0xff; - return tmp; + return ret; }
static inline unsigned in_be32(volatile unsigned *addr) { unsigned ret;
- __asm__ __volatile__("lduwa [%1] 0x15, %0\n\t" + __asm__ __volatile__("lduwa [%1] 0x1d, %0\n\t" :"=r"(ret):"r"(addr):"memory"); - return ret; }
static inline void out_le32(volatile unsigned *addr, int val) { - unsigned tmp; - // XXX - tmp = val << 24; - tmp |= (val << 8) & 0xff0000; - tmp |= (val >> 8) & 0xff00; - tmp |= (val >> 24) & 0xff; __asm__ __volatile__("stwa %0, [%1] 0x15\n\t" - : : "r"(tmp), "r"(addr):"memory"); + : : "r"(val), "r"(addr):"memory"); }
static inline void out_be32(volatile unsigned *addr, int val) { - __asm__ __volatile__("stwa %0, [%1] 0x15\n\t" + __asm__ __volatile__("stwa %0, [%1] 0x1d\n\t" : : "r"(val), "r"(addr):"memory"); }
Modified: trunk/openbios-devel/include/sparc64/pci.h ============================================================================== --- trunk/openbios-devel/include/sparc64/pci.h Thu Jan 28 14:20:14 2010 (r670) +++ trunk/openbios-devel/include/sparc64/pci.h Fri Jan 29 19:46:38 2010 (r671) @@ -35,14 +35,14 @@ static inline uint16_t pci_config_read16(pci_addr dev, uint8_t reg) { uint16_t res; - res = in_le16((uint16_t *)(PCI_CONFIG(dev) + reg)); + res = in_be16((uint16_t *)(PCI_CONFIG(dev) + reg)); return res; }
static inline uint32_t pci_config_read32(pci_addr dev, uint8_t reg) { uint32_t res; - res = in_le32((uint32_t *)(PCI_CONFIG(dev) + reg)); + res = in_be32((uint32_t *)(PCI_CONFIG(dev) + reg)); return res; }
@@ -53,12 +53,12 @@
static inline void pci_config_write16(pci_addr dev, uint8_t reg, uint16_t val) { - out_le16((uint16_t *)(PCI_CONFIG(dev) + reg), val); + out_be16((uint16_t *)(PCI_CONFIG(dev) + reg), val); }
static inline void pci_config_write32(pci_addr dev, uint8_t reg, uint32_t val) { - out_le32((uint32_t *)(PCI_CONFIG(dev) + reg), val); + out_be32((uint32_t *)(PCI_CONFIG(dev) + reg), val); } #else /* !PCI_CONFIG_1 */ #error PCI Configuration Mechanism is not specified or implemented