On Thu, Oct 29, 2020 at 02:55:17PM +0100, Mark Kettenis wrote:
> > Date: Wed, 28 Oct 2020 23:54:40 -0400
> > From: George Koehler <[email protected]>
> > 
> > >Synopsis:  linux/io.h changes broke radeondrm RV350 macppc
> > >Category:  powerpc
> > >Environment:
> >     System      : OpenBSD 6.8
> >     Details     : OpenBSD 6.8-current (GENERIC) #8: Wed Oct 28 22:51:59 EDT 
> > 2020
> >                      
> > [email protected]:/sys/arch/macppc/compile/GENERIC
> > 
> >     Architecture: OpenBSD.macppc
> >     Machine     : macppc
> > >Description:
> >     Today's commits in /sys/dev/pci/drm about <linux/io.h> broke
> > radeondrm RV350 on my PowerBook5,4.  The screen freezes while the
> > kernel is initializing radeondrm.  The screen is all or almost all dark.
> > The boot gets stuck without touching the filesystems.
> > >How-To-Repeat:
> >     Boot a new kernel.
> > >Fix:
> >     I reverted /sys/dev/pci/drm to -D 2020-10-27, and the problem
> > went away.  2020-10-27 is yesterday, before these 2 commits:
> >     - Use the function from <linux/io.h> for all "Memory Space" IO.
> >     - Switch from bus_space_read/write to linux io.h interfaces...
> > I kept the latest r1.61 of /sys/arch/macppc/macppc/ofw_machdep.c.
> > I have not updated the kernels of my other OpenBSD machines.
> 
> Hmm, I thought I tested this properly on macppc, but apparently I
> didn't.  The powerpc IO stuff is a maze and I missed the Linux uses a
> "sync" before doing a read.  Does the diff below fix things for you?

This seems to fix the bug on my powerbook 5,8 with "ATI Radeon Mobility M10".
ok tobhe@

> 
> 
> Index: dev/pci/drm/include/linux/io.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/drm/include/linux/io.h,v
> retrieving revision 1.3
> diff -u -p -r1.3 io.h
> --- dev/pci/drm/include/linux/io.h    26 Oct 2020 14:34:46 -0000      1.3
> +++ dev/pci/drm/include/linux/io.h    29 Oct 2020 13:48:24 -0000
> @@ -16,12 +16,18 @@
>  #define memcpy_fromio(d, s, n)       memcpy(d, s, n)
>  #define memset_io(d, b, n)   memset(d, b, n)
>  
> +#ifdef __powerpc__
> +#define iobarrier()          mb()
> +#else
> +#define iobarrier()          barrier()
> +#endif
> +
>  static inline u8
>  ioread8(const volatile void __iomem *addr)
>  {
>       uint8_t val;
>  
> -     barrier();
> +     iobarrier();
>       val = *(volatile uint8_t *)addr;
>       rmb();
>       return val;
> @@ -47,7 +53,7 @@ ioread16(const volatile void __iomem *ad
>  {
>       uint16_t val;
>  
> -     barrier();
> +     iobarrier();
>       val = *(volatile uint16_t *)addr;
>       rmb();
>       return val;
> @@ -58,7 +64,7 @@ ioread32(const volatile void __iomem *ad
>  {
>       uint32_t val;
>  
> -     barrier();
> +     iobarrier();
>       val = *(volatile uint32_t *)addr;
>       rmb();
>       return val;
> @@ -69,7 +75,7 @@ ioread64(const volatile void __iomem *ad
>  {
>       uint64_t val;
>  
> -     barrier();
> +     iobarrier();
>       val = *(volatile uint64_t *)addr;
>       rmb();
>       return val;
> @@ -103,7 +109,7 @@ ioread16(const volatile void __iomem *ad
>  {
>       uint16_t val;
>  
> -     barrier();
> +     iobarrier();
>       val = lemtoh16(addr);
>       rmb();
>       return val;
> @@ -114,7 +120,7 @@ ioread32(const volatile void __iomem *ad
>  {
>       uint32_t val;
>       
> -     barrier();
> +     iobarrier();
>       val = lemtoh32(addr);
>       rmb();
>       return val;
> @@ -125,7 +131,7 @@ ioread64(const volatile void __iomem *ad
>  {
>       uint64_t val;
>  
> -     barrier();
> +     iobarrier();
>       val = lemtoh64(addr);
>       rmb();
>       return val;
> 

Reply via email to