![echo 1 > /sys/bus/pci/slots/[スロット番号]/power PCIe 構成空間レジスタの値を変更しますか?](https://linux33.com/image/11548/echo%201%20%26gt%3B%20%2Fsys%2Fbus%2Fpci%2Fslots%2F%5B%E3%82%B9%E3%83%AD%E3%83%83%E3%83%88%E7%95%AA%E5%8F%B7%5D%2Fpower%20PCIe%20%E6%A7%8B%E6%88%90%E7%A9%BA%E9%96%93%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF%E3%81%AE%E5%80%A4%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F.png)
〜のように
echo 1 > /sys/bus/pci/slots/[slot number]/power
カーネルはデバイスのPCIe構成空間の一部(または特定)レジスタの値を変更しますか?
私が理解するには、システム(PC)の電源を入れるとPCIeデバイスに電力が供給されますが、カーネルはまだ一部のスロットのオンとオフを制御できます(例:この記事のsysfs contorlコマンド)。カーネルが電源を制御する構成空間にPCIeレジスタを設定しますか?
読み出し時にスロット制御レジスタのレジスタから読み出しますか?
前任者:
cat /sys/bus/pci/slots/[slot number]/power
答え1
ここに私の痕跡があります。 (間違っていたら教えてください。)
power_write_file() https://elixir.bootlin.com/linux/v4.10/source/drivers/pci/hotplug/pci_hotplug_core.c#L95
slot->ops->disable_slot(slot);
ops->disable_slot = disable_slot;
https://elixir.bootlin.com/linux/v4.10/source/drivers/pci/hotplug/pciehp_core.c#L107
static int disable_slot(struct hotplug_slot *hotplug_slot)
{
struct slot *slot = hotplug_slot->private;
return pciehp_sysfs_disable_slot(slot);
}
https://elixir.bootlin.com/linux/v4.10/source/drivers/pci/hotplug/pciehp_core.c#L167
retval = pciehp_disable_slot(p_slot);
remove_board(struct slot *p_slot)
https://elixir.bootlin.com/linux/v4.10/source/drivers/pci/hotplug/pciehp_ctrl.c#L135
最後に、次のようになります。
void pciehp_power_off_slot(struct slot *slot)
{
struct controller *ctrl = slot->ctrl;
pcie_write_cmd(ctrl, PCI_EXP_SLTCTL_PWR_OFF, PCI_EXP_SLTCTL_PCC);
ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__,
pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL,
PCI_EXP_SLTCTL_PWR_OFF);
}
https://elixir.bootlin.com/linux/v4.10/source/drivers/pci/hotplug/pciehp_hpc.c#L551
#define PCI_EXP_SLTCTL_PWR_OFF 0x0400 /* Power Off */
#define PCI_EXP_SLTCTL 24 /* Slot Control */
0x0400 ==> 10000000000#ビット10 == 1 ==>スロット制御レジスタの電源コントローラ制御レジスタは1です(オフセット18h == 24)。
電源コントローラ制御レジスタに関するPCIe仕様によると:
0b Power On
1b Power Off
したがって、答えは「はい」です。
コアはスロット制御レジスタの電源コントローラ制御レジスタを変更します。