echo 1 > /sys/bus/pci/slots/[슬롯 번호]/power PCIe 구성 공간 레지스터 값을 변경하시겠습니까?

echo 1 > /sys/bus/pci/slots/[슬롯 번호]/power PCIe 구성 공간 레지스터 값을 변경하시겠습니까?

~처럼

echo 1  > /sys/bus/pci/slots/[slot number]/power

커널이 장치의 PCIe 구성 공간의 일부(또는 특정) 레지스터의 값을 변경합니까?

제가 이해하기로는 시스템(PC)의 전원이 켜지면 PCIe 장치에 전원이 공급되지만 커널은 여전히 ​​일부 슬롯의 ON 및 OFF를 제어할 수 있습니다(예: 이 기사의 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 */

https://github.com/torvalds/linux/blob/d01e12dd3f4227f1be5d7c5bffa7b8240787bec1/include/uapi/linux/pci_regs.h#L594

0x0400 ==> 10000000000 # 비트 10 == 1 ==> 슬롯 제어 레지스터의 전원 컨트롤러 제어 레지스터는 1입니다(오프셋 18h == 24).

전원 컨트롤러 제어 레지스터에 관한 PCIe 사양에 따르면:

0b Power On
1b Power Off

그러므로 대답은 '예'입니다.

코어는 슬롯 제어 레지스터의 전원 컨트롤러 제어 레지스터를 변경합니다.

관련 정보