[OpenBIOS] [PATCH] ppc: Convert IO macros to inline functions

Andreas Färber andreas.faerber at web.de
Thu Nov 11 20:59:32 CET 2010


Am 11.11.2010 um 20:07 schrieb Alexander Graf:

> On 11.11.2010, at 19:33, Blue Swirl <blauwirbel at gmail.com> wrote:
>
>> On Thu, Nov 11, 2010 at 6:21 PM, Andreas Färber <andreas.faerber at web.de 
>> > wrote:
>>> Am 11.11.2010 um 08:39 schrieb Alexander Graf:
>>>
>>>> On 11.11.2010, at 00:01, Andreas Färber <andreas.faerber at web.de>  
>>>> wrote:
>>>>
>>>>> Am 30.10.2010 um 21:51 schrieb Andreas Färber:
>>>>>
>>>>>> diff --git a/include/arch/ppc/io.h b/include/arch/ppc/io.h
>>>>>> index e5180f2..84198f2 100644
>>>>>> --- a/include/arch/ppc/io.h
>>>>>> +++ b/include/arch/ppc/io.h
>>>>>
>>>>>> +static inline void insw(phys_addr_t port, void *buf, int ns)
>>>>>> +{
>>>>>> +    _insw((uint16_t *)(port + isa_io_base), buf, ns);
>>>>>> +}
>>>>>
>>>>> I'm wondering whether the use of phys_addr_t is right here or  
>>>>> whether it
>>>>> should be uintptr_t? Would like to get this out of my queue.
>>>>
>>>> PIO only defines 16 bit number of ports anyways, no?
>>>
>>> If you say so. :) I'll try uint16_t then. We'll either need to  
>>> upcast
>>> isa_io_base from uint32_t then or change that variable in qemu/ 
>>> init.c(?) to
>>> either phys_addr_t or uintptr_t...
>>>
>>> Do we want to consider a phys_addr_t an address where devices are  
>>> located,
>>> whether accessed through MMU or real mode, or is phys_addr_t just  
>>> supposed
>>> to be the MMU counterpart to the effective address? If the latter,  
>>> do we
>>> need a new addr_t type or something or is uintptr_t the type to  
>>> use since we
>>> want to cast it to pointer ultimately?
>>
>> I'm not sure about PPC terminology, but on Sparc the physical address
>> space (if not mapped by MMU) can be accessed only with special
>> alternate loads or stores. This is what Sparc64 IO macros do.

This seems different from ppc.

>> If an area is mapped it can be accessed with pointer dereference,  
>> then
>> a pointer type or uintptr_t would be correct.
>
> Any reason we can't just make it void*

The reason for address types elsewhere (e.g., Haiku) is that offsets  
are easier to calculate with non-pointer types (a + b vs. (sometype*)a  
+ bdependingontype).
I'd prefer uintptr_t then.

> and map it for real where necessary?

We could use void* but please don't rely on MMU mappings. As mentioned  
before, we need to support real mode too and the weird ROM-into-RAM  
mapping via ISI/DSI is problematic enough already. (Any particular  
reason there's no real OF-visible MMU translation btw?)

Andreas


More information about the OpenBIOS mailing list