[Skiboot] [PATCH v2 5/5] external: Update xscom utils for type 1 indirect accesses
Cédric Le Goater
clg at kaod.org
Fri Mar 24 01:37:25 AEDT 2017
On 03/23/2017 07:15 AM, Michael Neuling wrote:
> Update get/putscom utils to support type 1 indirect access.
>
> Currently we do some (ugly) bit mangling so that we can fit a 64 bit
> scom address into the debugfs interface. The current code only shifts
> down the top bit (indirect bit). This patch changes it to shift down
> the whole top nibble so that the form of the indirection is also
> shifted.
>
> Also currently putscom always reads back the value. This causes a
> problem for form 1 which can only be written. This patch marks the
> form 1 as not readable and hence doesn't attempt the read back.
>
> The kernel debugfs scom driver doesn't do the bit mangling correctly.
> So for form1 to work correctly, the kernel debugfs scom driver needs
> updating. Existing scoms are forwards and backwards compatible with
> the kernel.
>
> (FWIW the kernel PRD scom interface doesn't need to be updated as it
> passes the whole 64 bit scom address without any bit mangling)
>
> Signed-off-by: Michael Neuling <mikey at neuling.org>
Reviewed-by: Cédric Le Goater <clg at kaod.org>
Thanks,
C.
> ---
> external/xscom-utils/putscom.c | 10 ++++++----
> external/xscom-utils/xscom.c | 21 +++++++++++++++++++--
> external/xscom-utils/xscom.h | 2 ++
> 3 files changed, 27 insertions(+), 6 deletions(-)
>
> diff --git a/external/xscom-utils/putscom.c b/external/xscom-utils/putscom.c
> index 7eaa59e8d1..ca8c0da305 100644
> --- a/external/xscom-utils/putscom.c
> +++ b/external/xscom-utils/putscom.c
> @@ -92,10 +92,12 @@ int main(int argc, char *argv[])
> fprintf(stderr,"Error %d writing XSCOM\n", rc);
> exit(1);
> }
> - rc = xscom_read(chip_id, addr, &val);
> - if (rc) {
> - fprintf(stderr,"Error %d reading XSCOM\n", rc);
> - exit(1);
> + if (xscom_readable(addr)) {
> + rc = xscom_read(chip_id, addr, &val);
> + if (rc) {
> + fprintf(stderr,"Error %d reading XSCOM\n", rc);
> + exit(1);
> + }
> }
> printf("%016" PRIx64 "\n", val);
> return 0;
> diff --git a/external/xscom-utils/xscom.c b/external/xscom-utils/xscom.c
> index 3338542b10..2425730334 100644
> --- a/external/xscom-utils/xscom.c
> +++ b/external/xscom-utils/xscom.c
> @@ -131,8 +131,17 @@ static struct xscom_chip *xscom_find_chip(uint32_t chip_id)
>
> static uint64_t xscom_mangle_addr(uint64_t addr)
> {
> - if (addr & (1ull << 63))
> - addr |= (1ull << 59);
> + uint64_t tmp;
> +
> + /*
> + * Shift the top 4 bits (indirect mode) down by 4 bits so we
> + * don't lose going through the debugfs interfaces.
> + */
> + tmp = (addr & 0xf000000000000000) >> 4;
> + addr &= 0x00ffffffffffffff;
> + addr |= tmp;
> +
> + /* Shift up by 3 for debugfs */
> return addr << 3;
> }
>
> @@ -192,6 +201,14 @@ int xscom_write_ex(uint32_t ex_target_id, uint64_t addr, uint64_t val)
> return xscom_write(chip_id, addr, val);
> }
>
> +bool xscom_readable(uint64_t addr)
> +{
> + /* Top nibble 9 indicates form 1 indirect, which is write only */
> + if (((addr >> 60) & 0xf) == 9)
> + return false;
> + return true;
> +}
> +
> uint32_t xscom_init(void)
> {
> return xscom_scan_chips(XSCOM_BASE_PATH);
> diff --git a/external/xscom-utils/xscom.h b/external/xscom-utils/xscom.h
> index 52ba119bf3..5f9edbc9b3 100644
> --- a/external/xscom-utils/xscom.h
> +++ b/external/xscom-utils/xscom.h
> @@ -27,6 +27,8 @@ extern int xscom_write_ex(uint32_t ex_target_id, uint64_t addr, uint64_t val);
>
> extern void xscom_for_each_chip(void (*cb)(uint32_t chip_id));
>
> +extern bool xscom_readable(uint64_t addr);
> +
> extern uint32_t xscom_init(void);
>
> #endif /* __XSCOM_H */
>
More information about the Skiboot
mailing list