[Skiboot] [PATCH v7 1/2] phb4: set PHB CMPM registers for tunneled operations

Frederic Barrat fbarrat at linux.vnet.ibm.com
Tue Feb 20 01:15:16 AEDT 2018



Le 16/02/2018 à 14:13, Philippe Bergheaud a écrit :
> P9 supports PCI tunneled operations (atomics and as_notify) that require
> setting the PHB ASN Compare/Mask register with a 16-bit indication.
> 
> This register is currently initialized by enable_capi_mode(). But, as
> tunneled operations may also work in PCI mode, the ASN Compare/Mask
> register should rather be initialized in phb4_init_ioda3().
> 
> This patch also adds "ibm,phb-indications" to the device tree, to tell
> Linux the values of CAPI, ASN, and NBW indications, when supported.
> 
> Tunneled operations tested by IBM in CAPI mode, by Mellanox Technologies
> in PCI mode.
> 
> Signed-off-by: Philippe Bergheaud <felix at linux.vnet.ibm.com>
> ---

Reviewed-by: Frederic Barrat <fbarrat at linux.vnet.ibm.com>


> Changelog:
> 
> v2: Do not let Linux choose indication values.
>      Let skiboot tell Linux via the device tree.
>      Initialize the PHB ASN indication in PCI mode.
> 
> v3: No functional change.
>      Drop cosmetic fixes in comments.
> 
> v4: No change.
> 
> v5: Set bit 59 of ASN indication and mask, as required for as_notify,
>      in order to prevent address translation on lpid,pid,tid messages,
>      that are not real addresses.
> 
> v6: No change.
> 
> v7: Explain those indicator and mask values, with comments kindly
>      supplied by Frederic Barrat.
>      Remove tests for dd1 in new code, as nobody in the capi galaxy
>      is using dd1 any more.
> ---
>   hw/phb4.c           | 49 ++++++++++++++++++++++++++++++++++++++++++-------
>   include/phb4-regs.h |  4 ++--
>   2 files changed, 44 insertions(+), 9 deletions(-)
> 
> diff --git a/hw/phb4.c b/hw/phb4.c
> index f4b8f409..56716995 100644
> --- a/hw/phb4.c
> +++ b/hw/phb4.c
> @@ -3747,6 +3747,39 @@ static void phb4_init_capp_errors(struct phb4 *p)
>   	out_be64(p->regs + 0x0cb0,	0x35777073ff000000ull);
>   }
> 
> + /*
> + * The capi indicator is over the 8 most significant bits on p9 (and
> + * not 16). We stay away from bits 59 (TVE select), 60 and 61 (MSI)
> + *
> + * For the mask, we keep bit 59 in, as capi messages must hit TVE#0.
> + * Bit 56 is not part of the mask, so that a NBW message (see below)
> + * is also considered a capi message.
> + */
> +#define CAPIIND		0x0200
> +#define CAPIMASK	0xFE00
> +
> +/*
> + * Non-Blocking Write messages are a subset of capi messages, so the
> + * indicator is the same as capi + an extra bit (56) to differentiate.
> + * Mask is the same as capi + the extra bit
> + */
> +#define NBWIND		0x0300
> +#define NBWMASK		0xFF00
> +
> +/*
> + * The ASN indicator is used for tunneled operations (as_notify and
> + * atomics).  Tunneled operation messages can be sent in PCI mode as
> + * well as CAPI mode.
> + *
> + * The format of those messages is specific and, for as_notify
> + * messages, the address field is hijacked to encode the LPID/PID/TID
> + * of the target thread, so those messages should not go through
> + * translation. They must hit TVE#1. Therefore bit 59 is part of the
> + * indicator.
> + */
> +#define ASNIND		0x0C00
> +#define ASNMASK		0xFF00
> +
>   /* Power Bus Common Queue Registers
>    * All PBCQ and PBAIB registers are accessed via SCOM
>    * NestBase = 4010C00 for PEC0
> @@ -3833,16 +3866,13 @@ static int64_t enable_capi_mode(struct phb4 *p, uint64_t pe_number,
> 
>   	/*
>   	 * Bit [0:7] XSL_DSNCTL[capiind]
> -	 * Init_25 - CAPI Compare/Mask
> +	 * Init_26 - CAPI Compare/Mask
>   	 */
>   	out_be64(p->regs + PHB_CAPI_CMPM,
> -		 0x0200FE0000000000Ull | PHB_CAPI_CMPM_ENABLE);
> +		 ((u64)CAPIIND << 48) |
> +		 ((u64)CAPIMASK << 32) | PHB_CAPI_CMPM_ENABLE);
> 
>   	if (!(p->rev == PHB4_REV_NIMBUS_DD10)) {
> -		/* Init_24 - ASN Compare/Mask */
> -		out_be64(p->regs + PHB_PBL_ASN_CMPM,
> -			 0x0400FF0000000000Ull | PHB_PBL_ASN_ENABLE);
> -
>   		/* PBCQ Tunnel Bar Register
>   		 * Write Tunnel register to match PSL TNR register
>   		 */
> @@ -4164,7 +4194,8 @@ static void phb4_init_ioda3(struct phb4 *p)
>   	/* See enable_capi_mode() */
> 
>   	/* Init_25 - ASN Compare/Mask */
> -	/* See enable_capi_mode() */
> +	out_be64(p->regs + PHB_ASN_CMPM, ((u64)ASNIND << 48) |
> +		 ((u64)ASNMASK << 32) | PHB_ASN_CMPM_ENABLE);
> 
>   	/* Init_26 - CAPI Compare/Mask */
>   	/* See enable_capi_mode() */
> @@ -4764,6 +4795,10 @@ static void phb4_add_properties(struct phb4 *p)
> 
>   	/* Indicate to Linux that CAPP timebase sync is supported */
>   	dt_add_property_string(np, "ibm,capp-timebase-sync", NULL);
> +
> +	/* Tell Linux Compare/Mask indication values */
> +	dt_add_property_cells(np, "ibm,phb-indications", CAPIIND, ASNIND,
> +			      NBWIND);
>   }
> 
>   static bool phb4_calculate_windows(struct phb4 *p)
> diff --git a/include/phb4-regs.h b/include/phb4-regs.h
> index 2dc64fe5..829d9ecb 100644
> --- a/include/phb4-regs.h
> +++ b/include/phb4-regs.h
> @@ -71,8 +71,8 @@
>   #define PHB_PEST_BAR			0x1a8
>   #define   PHB_PEST_BAR_ENABLE		PPC_BIT(0)
>   #define   PHB_PEST_BASE_ADDRESS		PPC_BITMASK(8,51)
> -#define PHB_PBL_ASN_CMPM		0x1C0
> -#define   PHB_PBL_ASN_ENABLE		PPC_BIT(63)
> +#define PHB_ASN_CMPM			0x1C0
> +#define   PHB_ASN_CMPM_ENABLE		PPC_BIT(63)
>   #define PHB_CAPI_CMPM			0x1C8
>   #define   PHB_CAPI_CMPM_ENABLE		PPC_BIT(63)
>   #define PHB_M64_UPPER_BITS		0x1f0
> 



More information about the Skiboot mailing list