pcie: Support PCIe Gen5/Gen6 link speeds
This patch extends the PCIe link speed option so that slots can be configured as supporting 32GT/s (Gen5) or 64GT/s (Gen5) speeds. This is as simple as setting the appropriate bit in LnkCap2 and the appropriate value in LnkCap and LnkCtl2. Signed-off-by: Lukas Stockner <lstockner@genesiscloud.com> Message-Id: <20240215012326.3272366-1-lstockner@genesiscloud.com> Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
52767e1063
commit
c08da86dc4
@ -955,7 +955,7 @@ const PropertyInfo qdev_prop_off_auto_pcibar = {
|
|||||||
.set_default_value = qdev_propinfo_set_default_value_enum,
|
.set_default_value = qdev_propinfo_set_default_value_enum,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- PCIELinkSpeed 2_5/5/8/16 -- */
|
/* --- PCIELinkSpeed 2_5/5/8/16/32/64 -- */
|
||||||
|
|
||||||
static void get_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
|
static void get_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
|
||||||
void *opaque, Error **errp)
|
void *opaque, Error **errp)
|
||||||
@ -977,6 +977,12 @@ static void get_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
|
|||||||
case QEMU_PCI_EXP_LNK_16GT:
|
case QEMU_PCI_EXP_LNK_16GT:
|
||||||
speed = PCIE_LINK_SPEED_16;
|
speed = PCIE_LINK_SPEED_16;
|
||||||
break;
|
break;
|
||||||
|
case QEMU_PCI_EXP_LNK_32GT:
|
||||||
|
speed = PCIE_LINK_SPEED_32;
|
||||||
|
break;
|
||||||
|
case QEMU_PCI_EXP_LNK_64GT:
|
||||||
|
speed = PCIE_LINK_SPEED_64;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
/* Unreachable */
|
/* Unreachable */
|
||||||
abort();
|
abort();
|
||||||
@ -1010,6 +1016,12 @@ static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
|
|||||||
case PCIE_LINK_SPEED_16:
|
case PCIE_LINK_SPEED_16:
|
||||||
*p = QEMU_PCI_EXP_LNK_16GT;
|
*p = QEMU_PCI_EXP_LNK_16GT;
|
||||||
break;
|
break;
|
||||||
|
case PCIE_LINK_SPEED_32:
|
||||||
|
*p = QEMU_PCI_EXP_LNK_32GT;
|
||||||
|
break;
|
||||||
|
case PCIE_LINK_SPEED_64:
|
||||||
|
*p = QEMU_PCI_EXP_LNK_64GT;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
/* Unreachable */
|
/* Unreachable */
|
||||||
abort();
|
abort();
|
||||||
@ -1018,7 +1030,7 @@ static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
|
|||||||
|
|
||||||
const PropertyInfo qdev_prop_pcie_link_speed = {
|
const PropertyInfo qdev_prop_pcie_link_speed = {
|
||||||
.name = "PCIELinkSpeed",
|
.name = "PCIELinkSpeed",
|
||||||
.description = "2_5/5/8/16",
|
.description = "2_5/5/8/16/32/64",
|
||||||
.enum_table = &PCIELinkSpeed_lookup,
|
.enum_table = &PCIELinkSpeed_lookup,
|
||||||
.get = get_prop_pcielinkspeed,
|
.get = get_prop_pcielinkspeed,
|
||||||
.set = set_prop_pcielinkspeed,
|
.set = set_prop_pcielinkspeed,
|
||||||
|
@ -153,6 +153,14 @@ static void pcie_cap_fill_slot_lnk(PCIDevice *dev)
|
|||||||
pci_long_test_and_set_mask(exp_cap + PCI_EXP_LNKCAP2,
|
pci_long_test_and_set_mask(exp_cap + PCI_EXP_LNKCAP2,
|
||||||
PCI_EXP_LNKCAP2_SLS_16_0GB);
|
PCI_EXP_LNKCAP2_SLS_16_0GB);
|
||||||
}
|
}
|
||||||
|
if (s->speed > QEMU_PCI_EXP_LNK_16GT) {
|
||||||
|
pci_long_test_and_set_mask(exp_cap + PCI_EXP_LNKCAP2,
|
||||||
|
PCI_EXP_LNKCAP2_SLS_32_0GB);
|
||||||
|
}
|
||||||
|
if (s->speed > QEMU_PCI_EXP_LNK_32GT) {
|
||||||
|
pci_long_test_and_set_mask(exp_cap + PCI_EXP_LNKCAP2,
|
||||||
|
PCI_EXP_LNKCAP2_SLS_64_0GB);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,6 +39,8 @@ typedef enum PCIExpLinkSpeed {
|
|||||||
QEMU_PCI_EXP_LNK_5GT,
|
QEMU_PCI_EXP_LNK_5GT,
|
||||||
QEMU_PCI_EXP_LNK_8GT,
|
QEMU_PCI_EXP_LNK_8GT,
|
||||||
QEMU_PCI_EXP_LNK_16GT,
|
QEMU_PCI_EXP_LNK_16GT,
|
||||||
|
QEMU_PCI_EXP_LNK_32GT,
|
||||||
|
QEMU_PCI_EXP_LNK_64GT,
|
||||||
} PCIExpLinkSpeed;
|
} PCIExpLinkSpeed;
|
||||||
|
|
||||||
#define QEMU_PCI_EXP_LNKCAP_MLS(speed) (speed)
|
#define QEMU_PCI_EXP_LNKCAP_MLS(speed) (speed)
|
||||||
|
@ -107,10 +107,14 @@
|
|||||||
#
|
#
|
||||||
# @16: 16.0GT/s
|
# @16: 16.0GT/s
|
||||||
#
|
#
|
||||||
|
# @32: 32.0GT/s
|
||||||
|
#
|
||||||
|
# @64: 64.0GT/s
|
||||||
|
#
|
||||||
# Since: 4.0
|
# Since: 4.0
|
||||||
##
|
##
|
||||||
{ 'enum': 'PCIELinkSpeed',
|
{ 'enum': 'PCIELinkSpeed',
|
||||||
'data': [ '2_5', '5', '8', '16' ] }
|
'data': [ '2_5', '5', '8', '16', '32', '64' ] }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @PCIELinkWidth:
|
# @PCIELinkWidth:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user