From: Denis Efremov <efremov@linux.com>
To: Bjorn Helgaas <bhelgaas@google.com>
Cc: Lukas Wunner <lukas@wunner.de>,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
Denis Efremov <efremov@linux.com>
Subject: [PATCH v2 1/4] PCI: pciehp: Add pciehp_set_indicators() to jointly set LED indicators
Date: Sun, 11 Aug 2019 22:59:41 +0300 [thread overview]
Message-ID: <20190811195944.23765-2-efremov@linux.com> (raw)
In-Reply-To: <20190811195944.23765-1-efremov@linux.com>
Add pciehp_set_indicators() to set power and attention indicators with a
single register write. Thus, avoiding waiting twice for Command Complete.
enum pciehp_indicator introduced to switch between the indicators statuses.
Signed-off-by: Denis Efremov <efremov@linux.com>
---
drivers/pci/hotplug/pciehp.h | 14 ++++++++++++
drivers/pci/hotplug/pciehp_hpc.c | 38 ++++++++++++++++++++++++++++++++
include/uapi/linux/pci_regs.h | 2 ++
3 files changed, 54 insertions(+)
diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h
index 8c51a04b8083..17305a6f01f1 100644
--- a/drivers/pci/hotplug/pciehp.h
+++ b/drivers/pci/hotplug/pciehp.h
@@ -150,6 +150,17 @@ struct controller {
#define NO_CMD_CMPL(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_NCCS)
#define PSN(ctrl) (((ctrl)->slot_cap & PCI_EXP_SLTCAP_PSN) >> 19)
+enum pciehp_indicator {
+ ATTN_NONE = -1,
+ ATTN_ON = 1,
+ ATTN_BLINK = 2,
+ ATTN_OFF = 3,
+ PWR_NONE = -1,
+ PWR_ON = 1,
+ PWR_BLINK = 2,
+ PWR_OFF = 3,
+};
+
void pciehp_request(struct controller *ctrl, int action);
void pciehp_handle_button_press(struct controller *ctrl);
void pciehp_handle_disable_request(struct controller *ctrl);
@@ -167,6 +178,9 @@ int pciehp_power_on_slot(struct controller *ctrl);
void pciehp_power_off_slot(struct controller *ctrl);
void pciehp_get_power_status(struct controller *ctrl, u8 *status);
+void pciehp_set_indicators(struct controller *ctrl,
+ enum pciehp_indicator pwr,
+ enum pciehp_indicator attn);
void pciehp_set_attention_status(struct controller *ctrl, u8 status);
void pciehp_get_latch_status(struct controller *ctrl, u8 *status);
int pciehp_query_power_fault(struct controller *ctrl);
diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c
index bd990e3371e3..5a690b1579ec 100644
--- a/drivers/pci/hotplug/pciehp_hpc.c
+++ b/drivers/pci/hotplug/pciehp_hpc.c
@@ -443,6 +443,44 @@ void pciehp_set_attention_status(struct controller *ctrl, u8 value)
pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, slot_cmd);
}
+void pciehp_set_indicators(struct controller *ctrl,
+ enum pciehp_indicator pwr,
+ enum pciehp_indicator attn)
+{
+ u16 cmd = 0, mask = 0;
+
+ if ((!PWR_LED(ctrl) || pwr == PWR_NONE) &&
+ (!ATTN_LED(ctrl) || attn == ATTN_NONE))
+ return;
+
+ switch (pwr) {
+ case PWR_ON:
+ case PWR_BLINK:
+ case PWR_OFF:
+ cmd = pwr << PCI_EXP_SLTCTL_PWR_IND_OFFSET;
+ mask = PCI_EXP_SLTCTL_PIC;
+ break;
+ default:
+ break;
+ }
+
+ switch (attn) {
+ case ATTN_ON:
+ case ATTN_BLINK:
+ case ATTN_OFF:
+ cmd |= attn << PCI_EXP_SLTCTL_ATTN_IND_OFFSET;
+ mask |= PCI_EXP_SLTCTL_AIC;
+ break;
+ default:
+ break;
+ }
+
+ pcie_write_cmd_nowait(ctrl, cmd, mask);
+ ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__,
+ pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL,
+ cmd);
+}
+
void pciehp_green_led_on(struct controller *ctrl)
{
if (!PWR_LED(ctrl))
diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h
index f28e562d7ca8..18722d1f54a0 100644
--- a/include/uapi/linux/pci_regs.h
+++ b/include/uapi/linux/pci_regs.h
@@ -591,10 +591,12 @@
#define PCI_EXP_SLTCTL_CCIE 0x0010 /* Command Completed Interrupt Enable */
#define PCI_EXP_SLTCTL_HPIE 0x0020 /* Hot-Plug Interrupt Enable */
#define PCI_EXP_SLTCTL_AIC 0x00c0 /* Attention Indicator Control */
+#define PCI_EXP_SLTCTL_ATTN_IND_OFFSET 0x6 /* Attention Indicator Offset */
#define PCI_EXP_SLTCTL_ATTN_IND_ON 0x0040 /* Attention Indicator on */
#define PCI_EXP_SLTCTL_ATTN_IND_BLINK 0x0080 /* Attention Indicator blinking */
#define PCI_EXP_SLTCTL_ATTN_IND_OFF 0x00c0 /* Attention Indicator off */
#define PCI_EXP_SLTCTL_PIC 0x0300 /* Power Indicator Control */
+#define PCI_EXP_SLTCTL_PWR_IND_OFFSET 0x8 /* Power Indicator Offset */
#define PCI_EXP_SLTCTL_PWR_IND_ON 0x0100 /* Power Indicator on */
#define PCI_EXP_SLTCTL_PWR_IND_BLINK 0x0200 /* Power Indicator blinking */
#define PCI_EXP_SLTCTL_PWR_IND_OFF 0x0300 /* Power Indicator off */
--
2.21.0
next prev parent reply other threads:[~2019-08-11 20:00 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-11 19:59 [PATCH v2 0/4] Simplify PCIe hotplug indicator control Denis Efremov
2019-08-11 19:59 ` Denis Efremov [this message]
2019-08-12 6:30 ` [PATCH v2 1/4] PCI: pciehp: Add pciehp_set_indicators() to jointly set LED indicators Lukas Wunner
2019-08-12 18:25 ` sathyanarayanan kuppuswamy
2019-08-12 18:49 ` sathyanarayanan kuppuswamy
2019-08-12 20:40 ` Lukas Wunner
2019-08-12 21:03 ` sathyanarayanan kuppuswamy
2019-08-12 20:03 ` Bjorn Helgaas
2019-08-11 19:59 ` [PATCH v2 2/4] PCI: pciehp: Switch LED indicators with a single write Denis Efremov
2019-08-12 18:27 ` sathyanarayanan kuppuswamy
2019-08-11 19:59 ` [PATCH v2 3/4] PCI: pciehp: Replace pciehp_set_attention_status() Denis Efremov
2019-08-12 6:32 ` Lukas Wunner
2019-08-12 18:28 ` sathyanarayanan kuppuswamy
2019-08-11 19:59 ` [PATCH v2 4/4] PCI: pciehp: Replace pciehp_green_led_{on,off,blink}() Denis Efremov
2019-08-12 18:45 ` sathyanarayanan kuppuswamy
2019-08-12 20:03 ` Bjorn Helgaas
2019-08-12 21:14 ` Denis Efremov
2019-08-12 22:12 ` Bjorn Helgaas
2019-08-12 20:02 ` [PATCH v2 0/4] Simplify PCIe hotplug indicator control Bjorn Helgaas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190811195944.23765-2-efremov@linux.com \
--to=efremov@linux.com \
--cc=bhelgaas@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lukas@wunner.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.