Index: sparc64/include/bus.h =================================================================== RCS file: /home/ncvs/src/sys/sparc64/include/bus.h,v retrieving revision 1.26 diff -u -r1.26 bus.h --- sparc64/include/bus.h 2003/05/30 20:40:33 1.26 +++ sparc64/include/bus.h 2003/06/12 23:39:21 @@ -820,6 +820,38 @@ bus_space_write_stream_8(t, h1, o1, bus_space_read_8(t, h2, o2)); } +static __inline uint8_t +bus_space_readms_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) +{ + + __BUS_DEBUG_ACCESS(h, o, "read", 1); + return (lduba_ms((caddr_t)(h + o), bus_type_asi[t->bst_type])); +} + +static __inline uint16_t +bus_space_readms_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) +{ + + __BUS_DEBUG_ACCESS(h, o, "readms", 2); + return (lduha_ms((caddr_t)(h + o), bus_type_asi[t->bst_type])); +} + +static __inline uint32_t +bus_space_readms_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) +{ + + __BUS_DEBUG_ACCESS(h, o, "readms", 4); + return (lduwa_ms((caddr_t)(h + o), bus_type_asi[t->bst_type])); +} + +static __inline uint64_t +bus_space_readms_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) +{ + + __BUS_DEBUG_ACCESS(h, o, "readms", 8); + return (ldxa_ms((caddr_t)(h + o), bus_type_asi[t->bst_type])); +} + /* Back-compat functions for old ISA drivers */ extern bus_space_tag_t isa_io_bt; extern bus_space_handle_t isa_io_hdl; Index: sparc64/include/cpu.h =================================================================== RCS file: /home/ncvs/src/sys/sparc64/include/cpu.h,v retrieving revision 1.10 diff -u -r1.10 cpu.h --- sparc64/include/cpu.h 2002/07/28 01:01:14 1.10 +++ sparc64/include/cpu.h 2003/06/12 23:39:21 @@ -77,6 +77,8 @@ extern char btext[]; extern char etext[]; +extern volatile int de_expected, de_received; + void fork_trampoline(void); static __inline u_int64_t Index: sparc64/include/cpufunc.h =================================================================== RCS file: /home/ncvs/src/sys/sparc64/include/cpufunc.h,v retrieving revision 1.16 diff -u -r1.16 cpufunc.h --- sparc64/include/cpufunc.h 2003/04/06 17:05:26 1.16 +++ sparc64/include/cpufunc.h 2003/06/12 23:39:21 @@ -102,6 +102,24 @@ LDNC_GEN(u_int, lduwa); LDNC_GEN(u_long, ldxa); +#define LDMS_GEN(tp, o) \ + static __inline tp \ + o ## _ms(caddr_t va, int asi) \ + { \ + tp r; \ + __asm __volatile("wr %2, 0, %%asi\n" \ + " membar #Sync\n" \ + #o " [%1] %%asi, %0\n" \ + " membar #Sync\n" \ + : "=r" (r) : "r" (va), "r" (asi)); \ + return (r); \ + } + +LDMS_GEN(u_char, lduba); +LDMS_GEN(u_short, lduha); +LDMS_GEN(u_int, lduwa); +LDMS_GEN(u_long, ldxa); + #define LD_GENERIC(va, asi, op, type) ({ \ type __r; \ __asm __volatile(#op " [%1] %2, %0" \ Index: sparc64/pci/psycho.c =================================================================== RCS file: /home/ncvs/src/sys/sparc64/pci/psycho.c,v retrieving revision 1.35 diff -u -r1.35 psycho.c --- sparc64/pci/psycho.c 2003/05/30 20:48:05 1.35 +++ sparc64/pci/psycho.c 2003/06/12 23:39:23 @@ -56,6 +56,7 @@ #include #include #include +#include #include @@ -929,33 +930,40 @@ bus_space_handle_t bh; u_long offset = 0; u_int32_t r, devid; - int i; + int i, der; - /* - * The psycho bridge does not tolerate accesses to unconfigured PCI - * devices' or function's config space, so look up the device in the - * firmware device tree first, and if it is not present, return a value - * that will make the detection code think that there is no device here. - * This is ugly... - */ - if (reg == 0 && ofw_pci_find_node(bus, slot, func) == 0) - return (0xffffffff); sc = (struct psycho_softc *)device_get_softc(dev); offset = PSYCHO_CONF_OFF(bus, slot, func, reg); bh = sc->sc_bh[PCI_CS_CONFIG]; +#ifdef PSYCHO_DEBUG + printf("psycho_read_config expecting data error: %d.%d.%d: 0x%x\n", + bus, slot, func, reg); +#endif + de_expected = 1; + de_received = 0; switch (width) { case 1: - r = bus_space_read_1(sc->sc_cfgt, bh, offset); + r = bus_space_readms_1(sc->sc_cfgt, bh, offset); break; case 2: - r = bus_space_read_2(sc->sc_cfgt, bh, offset); + r = bus_space_readms_2(sc->sc_cfgt, bh, offset); break; case 4: - r = bus_space_read_4(sc->sc_cfgt, bh, offset); + r = bus_space_readms_4(sc->sc_cfgt, bh, offset); break; default: panic("psycho_read_config: bad width"); } + der = de_received; + de_received = de_expected = 0; + if (der) + r = -1; + +#ifdef PSYCHO_DEBUG + printf("psycho_read_config after data error: received: %d, r: 0x%x\n", + der, r); +#endif + if (reg == PCIR_INTPIN && r == 0) { /* Check for DQT_BAD_INTPIN quirk. */ devid = psycho_read_config(dev, bus, slot, func, Index: sparc64/sparc64/trap.c =================================================================== RCS file: /home/ncvs/src/sys/sparc64/sparc64/trap.c,v retrieving revision 1.62 diff -u -r1.62 trap.c --- sparc64/sparc64/trap.c 2003/05/04 07:21:04 1.62 +++ sparc64/sparc64/trap.c 2003/06/12 23:39:24 @@ -219,6 +219,8 @@ SYSCTL_INT(_debug, OID_AUTO, debugger_on_signal, CTLFLAG_RW, &debugger_on_signal, 0, ""); +volatile int de_expected, de_received; + void trap(struct trapframe *tf) { @@ -328,6 +330,22 @@ } } error = 1; + break; + case T_DATA_ERROR: + printf("trap data error received.\n"); +#define MEMBARSYNC_INST ((u_int32_t)0x8143e040) + if (de_expected) { + de_received = 1; + /* + * XXX - we need to check that tf->tpc is + * pointing to MEMBARSYNC_INST + */ + tf->tf_tnpc = tf->tf_tpc + 4; + error = 0; + break; + } +#undef MEMBARSYNC_INST + error = 1; break; default: error = 1;