On Fri, Jul 31, 2026 at 02:15:48PM -0700, Zhiping Zhang wrote:
> get_rp_completer_type() returns the Root Port's "TPH Completer
> Supported" field (bits 13:12 of Device Capabilities 2) verbatim. The
> 0b10 encoding is reserved, but pcie_enable_tph() feeds the raw value
> into the requester type:
> 
>       pdev->tph_req_type = min(pdev->tph_req_type, rp_req_type);
> 
> and later writes tph_req_type to the TPH Requester Enable field, which
> only defines 0b00 (disable), 0b01 (TPH only) and 0b11 (extended TPH).
> 
> No known hardware presents the reserved 0b10 in this field, so this is
> defensive hardening rather than a fix for observed silicon: fold the
> reserved encoding into "not supported" so only the three architected
> values can ever reach the Requester Enable field.
> 
> Signed-off-by: Zhiping Zhang <[email protected]>
> Acked-by: Chengwen Feng <[email protected]>

In subject, to match history of the file:

  PCI/TPH: Treat reserved 0b10 completer encoding as unsupported

Acked-by: Bjorn Helgaas <[email protected]>

> ---
>  drivers/pci/tph.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/pci/tph.c b/drivers/pci/tph.c
> index 655ffd60e62f..5cbb381e2a02 100644
> --- a/drivers/pci/tph.c
> +++ b/drivers/pci/tph.c
> @@ -200,6 +200,7 @@ EXPORT_SYMBOL(pcie_tph_get_st_table_size);
>  static u8 get_rp_completer_type(struct pci_dev *pdev)
>  {
>       struct pci_dev *rp;
> +     u8 tph_comp;
>       u32 reg;
>       int ret;
>  
> @@ -211,7 +212,15 @@ static u8 get_rp_completer_type(struct pci_dev *pdev)
>       if (ret)
>               return 0;
>  
> -     return FIELD_GET(PCI_EXP_DEVCAP2_TPH_COMP_MASK, reg);
> +     /*
> +      * 0b10 is reserved; treat it as "not supported" so only the
> +      * architected encodings reach the Requester Enable field.
> +      */
> +     tph_comp = FIELD_GET(PCI_EXP_DEVCAP2_TPH_COMP_MASK, reg);
> +     if (tph_comp == PCI_EXP_DEVCAP2_TPH_COMP_TPH_ONLY ||
> +         tph_comp == PCI_EXP_DEVCAP2_TPH_COMP_EXT_TPH)
> +             return tph_comp;
> +     return PCI_EXP_DEVCAP2_TPH_COMP_NONE;
>  }
>  
>  /* Write tag to ST table - Return 0 if OK, otherwise -errno */
> -- 
> 2.53.0-Meta
> 

Reply via email to