するとき
echo 1 > /sys/bus/pci/slots/[slot number]/power
カーネルは、このデバイスのPCIe構成スペースの一部の(または特定の)レジスターの値を変更しますか?
私の理解では、システム(PC)の電源がオンになると、電源はすでにPCIeデバイスに供給されますが、カーネルは(この記事のsysfs contorlコマンドのように)一部のスロットをオンとオフに制御できます。その電力を制御するPCIe構成スペースのレジスタ?
それを読み取るとき、それはスロット制御レジスタのレジスタからも読み取りますか?
例:
cat /sys/bus/pci/slots/[slot number]/power
これが私のトレースです(私が間違っている場合は知らせてください)
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
したがって、答えはイエスです、
カーネルは、スロット制御レジスタの電源コントローラ制御レジスタを変更します。