[Skiboot] [PATCH 1/2] hw/phys_map: Use raw chip IDs

Oliver O'Halloran oohall at gmail.com
Tue May 16 21:52:16 AEST 2017


On Tue, May 16, 2017 at 9:01 PM, Michael Neuling <mikey at neuling.org> wrote:
> On Tue, 2017-05-16 at 19:03 +1000, Oliver O'Halloran wrote:
>> We need to be able to query the BAR mapping from the HDAT parser which
>> is run prior the the proc_chip structures being initialised. Define
>> a wrapper for the existing usages and provide a low-level function
>> that allows the map the be queried with the global hardware chip ID
>> itself.
>
> We could just move the main api over to use gcid.... a few of the callers need
> to do it anyway, like the fsp code does this...
>
>         phys_map_get(get_chip(chip_id), LPC_BUS, 0, &lpcm_base, NULL);
>

Alright. I'll do a re-spin.

> Mikey
>
>>
>> Cc: Michael Neuling <mikey at neuling.org>
>> Signed-off-by: Oliver O'Halloran <oohall at gmail.com>
>> ---
>>  hw/phys-map.c      |  9 +++++----
>>  include/phys-map.h | 11 ++++++++++-
>>  2 files changed, 15 insertions(+), 5 deletions(-)
>>
>> diff --git a/hw/phys-map.c b/hw/phys-map.c
>> index 768f464f4682..65c440178283 100644
>> --- a/hw/phys-map.c
>> +++ b/hw/phys-map.c
>> @@ -134,10 +134,11 @@ static inline bool phys_map_entry_null(const struct
>> phys_map_entry *e)
>>       return false;
>>  }
>>
>> +
>>  /* This crashes skiboot on error as any bad calls here are almost
>>   *  certainly a developer error
>>   */
>> -void phys_map_get(struct proc_chip *chip, enum phys_map_type type,
>> +void __phys_map_get(uint64_t gcid, enum phys_map_type type,
>>                 int index, uint64_t *addr, uint64_t *size) {
>>       const struct phys_map_entry *e;
>>       uint64_t a;
>> @@ -162,16 +163,16 @@ void phys_map_get(struct proc_chip *chip, enum
>> phys_map_type type,
>>               break;
>>       }
>>       a = e->addr;
>> -     a += (uint64_t)chip->id << phys_map->chip_select_shift;
>> +     a += gcid << phys_map->chip_select_shift;
>>
>>       if (addr)
>>               *addr = a;
>>       if (size)
>>               *size = e->size;
>>
>> -     prlog(PR_TRACE, "Assigning BAR [%x] type:%02i index:%x "
>> +     prlog(PR_TRACE, "Assigning BAR [%"PRIx64"] type:%02i index:%x "
>>             "0x%016"PRIx64" for 0x%016"PRIx64"\n",
>> -           chip->id, type, index, a, e->size);
>> +           gcid, type, index, a, e->size);
>>
>>       return;
>>
>> diff --git a/include/phys-map.h b/include/phys-map.h
>> index a0124322a608..5738a5456900 100644
>> --- a/include/phys-map.h
>> +++ b/include/phys-map.h
>> @@ -53,9 +53,18 @@ enum phys_map_type {
>>       RESV
>>  };
>>
>> -extern void phys_map_get(struct proc_chip *chip, enum phys_map_type type,
>> +/*
>> + * Use this to query the phys map before we've done per-cpu init.
>> + */
>> +extern void __phys_map_get(uint64_t gcid, enum phys_map_type type,
>>                        int index, uint64_t *addr, uint64_t *size);
>>
>> +static inline void phys_map_get(struct proc_chip *chip, enum phys_map_type
>> type,
>> +                      int index, uint64_t *addr, uint64_t *size)
>> +{
>> +     __phys_map_get(chip->id, type, index, addr, size);
>> +}
>> +
>>  extern void phys_map_init(void);
>>
>>  #endif /* __PHYS_MAP_H */


More information about the Skiboot mailing list