[Skiboot] [PATCH 4/5] xscom: Add indirect form 1 scoms
Cédric Le Goater
clg at fr.ibm.com
Thu Mar 23 02:29:06 AEDT 2017
On 03/22/2017 03:59 AM, Michael Neuling wrote:
> Add code to perform indirect form 1 scoms.
>
> POWER8 does form 0 only. POWER9 adds form 1. The form is determined
> from the address only. Hardware only allows writes for form 1.
>
> Only hostboot uses these scoms during IPL, so they are unused by
> skiboot currently.
>
> Signed-off-by: Michael Neuling <mikey at neuling.org>
> ---
> hw/xscom.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 46 insertions(+), 2 deletions(-)
>
> diff --git a/hw/xscom.c b/hw/xscom.c
> index 1add658776..7f3e329fee 100644
> --- a/hw/xscom.c
> +++ b/hw/xscom.c
> @@ -317,7 +317,8 @@ static int __xscom_write(uint32_t gcid, uint32_t pcb_addr, uint64_t val)
> /*
> * Indirect XSCOM access functions
> */
> -static int xscom_indirect_read(uint32_t gcid, uint64_t pcb_addr, uint64_t *val)
> +static int xscom_indirect_read_form0(uint32_t gcid, uint64_t pcb_addr,
> + uint64_t *val)
> {
> uint32_t addr;
> uint64_t data;
> @@ -360,7 +361,18 @@ static int xscom_indirect_read(uint32_t gcid, uint64_t pcb_addr, uint64_t *val)
> return rc;
> }
>
> -static int xscom_indirect_write(uint32_t gcid, uint64_t pcb_addr, uint64_t val)
> +static int xscom_indirect_read(uint32_t gcid, uint64_t pcb_addr, uint64_t *val)
> +{
> + uint64_t form = (pcb_addr >> 60) & 1;
> +
> + if ((proc_gen == proc_gen_p9) && (form == 1))
> + return OPAL_UNSUPPORTED;
> +
> + return xscom_indirect_read_form0(gcid, pcb_addr, val);
> +}
> +
> +static int xscom_indirect_write_form0(uint32_t gcid, uint64_t pcb_addr,
> + uint64_t val)
> {
> uint32_t addr;
> uint64_t data;
> @@ -402,6 +414,38 @@ static int xscom_indirect_write(uint32_t gcid, uint64_t pcb_addr, uint64_t val)
> return rc;
> }
>
> +static int xscom_indirect_write_form1(uint32_t gcid, uint64_t pcb_addr,
> + uint64_t val)
> +{
> + uint32_t addr;
> + uint64_t data;
> + int rc;
> +
> + if (proc_gen < proc_gen_p9)
> + return OPAL_UNSUPPORTED;
> + if (val & 0xfff0000000000000ULL)
> + return OPAL_PARAMETER;
> +
> + /* Mangle address and data for form1 */
> + addr = (pcb_addr & 0x000ffffffff);
> + data = (pcb_addr & 0xfff00000000) << 20;
some bitmask definitions would help.
> + data |= val;
> + rc = __xscom_write(gcid, addr, data);
> + if (rc)
> + val = (uint64_t)-1;
who cares about val ?
> + return rc;
> +}
> +
> +static int xscom_indirect_write(uint32_t gcid, uint64_t pcb_addr, uint64_t val)
> +{
> + uint64_t form = (pcb_addr >> 60) & 1;
maybe use a helper ?
Cheers,
C.
> +
> + if ((proc_gen == proc_gen_p9) && (form == 1))
> + return xscom_indirect_write_form1(gcid, pcb_addr, val);
> +
> + return xscom_indirect_write_form0(gcid, pcb_addr, val);
> +}
> +
> static uint32_t xscom_decode_chiplet(uint32_t partid, uint64_t *pcb_addr)
> {
> uint32_t gcid = (partid & 0x0fffffff) >> 4;
>
More information about the Skiboot
mailing list