Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 28 Aug 2015 10:35:50 -0700
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-arch@freebsd.org
Cc:        Marcel Moolenaar <marcel@xcllnt.net>, Justin Hibbits <jrh29@alumni.cwru.edu>
Subject:   Re: Devices with 36-bit paddr on 32-bit system
Message-ID:  <1568331.OrSoeYfXsf@ralph.baldwin.cx>
In-Reply-To: <ED4B5B25-D7A7-440C-9452-4C79B0800D2E@xcllnt.net>
References:  <CAHSQbTDsvB32%2BLyzHJO78VwUwAfUTMOUQp13BMCUpapSMT0fbg@mail.gmail.com> <ED4B5B25-D7A7-440C-9452-4C79B0800D2E@xcllnt.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tuesday, August 25, 2015 08:55:45 AM Marcel Moolenaar wrote:
>=20
> > On Aug 24, 2015, at 11:44 PM, Justin Hibbits <jrh29@alumni.cwru.edu=
> wrote:
> >=20
> > With my work porting FreeBSD to PowerPC e500mc and e5500, I have
> > devices in my device tree mapped well above the 4GB mark
> > (0xffexxxxxx), and have no idea how to properly address them for
> > resources in rman.  Do we already have a solution to support this?
> > Part of the problem is the powerpc nexus does a straight convert to=

> > vm_offset_t of rman_get_start() (itself returning a u_long), and
> > vm_offset_t is not necessarily equal to vm_paddr_t (on Book-E power=
pc
> > vm_offset_t is 32-bits, vm_paddr_t is 64-bits).
>=20
> I think the best solution is to represent a resource address
> space with a type other than u_long. It makes sense to have
> it use bus_addr_t or vm_paddr_t for example. Such a change
> comes at a high price for sure, but you=E2=80=99ll fix it once and
> for all. I don=E2=80=99t think you should kluge your way out of this.=
..

Expanding beyond u_long is the right solution.  PAE doesn't generally s=
uffer
from this on i386 (though the ram0 device "punts" and ignores RAM range=
s above
4G as a workaround).

However, u_long is baked into the bus resource API quite a bit.  Specif=
ically,
the values 0ul and ~0ul are used as magic numbers in lots of places to =
request
"anywhere" locations.  Some of this has been mitigated by
bus_alloc_resource_any(), but that doesn't cover all cases.  You will p=
robably
want to add some explicit constants and do a sweep replacing the magic =
numbers
with those first (and MFC the constants at least to make it easier to p=
ort
drivers across branches).  Then you can change the type.

As far as the best type: rman's are in theory generic and not just for =
bus
addresses.  I'd be tempted to let each platform define an rman_addr_t a=
long
with RMAN_ADDR_MAX constants, but in practice it is probably fine to us=
e
bus_addr_t and BUS_SPACE_MAXADDR.  If you do that it also means you can=
 skip
the step of having to MFC new constants.

Note that various bus APIs will have to change to use bus_addr_t instea=
d of
u_long as well.

--=20
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1568331.OrSoeYfXsf>