On Sat, Mar 04, 2023 at 05:47:28PM +0800, lihuisong (C) wrote:Thanks for your unstanding.
在 2023/3/3 19:14, Sudeep Holla 写道:I would have avoided the type check above but I understand your concern
On Fri, Mar 03, 2023 at 02:33:49PM +0800, lihuisong (C) wrote:already modify this comment as below.
Sorry for my resend. Because I found that my last reply email is not in theThanks
thread of this patch. I guess it may be send failed.
在 2023/3/2 22:02, Sudeep Holla 写道:
No. I meant a comment saying it is not need since only one transfer can occurGot it. Agreed.
at a time and mailbox takes care of locking. So chan_in_use can be accessed
without a lock.
Understood.Agreed but there is no harm using the flag, you can add a comment that it isBTW, type 1 subspaces do not support a level triggered platform interrupt asFor types no need this flag, it is always hard to understand and redundantBut does it matter ? You can even support shared interrupt for type 1&2.
design.
no method is provided to clear the interrupt.
useful only if shared interrupts are supported. That will imply it is dummy
for type 1. I am avoiding too many type unnecessary checks especially in IRQ
handler.
It should be ok if all types except for type 3 do not check this flag inHow ?They support level interrupt, so we can add them too. I understand you canI understand what you do.
test only type 3, but this driver caters for all and the code must be generic
as much as possible. I don't see any point in check for type 3 only. Only
But type 2 also supports the communication flow from OSPM to Platfrom.
In this case, this flag will get in the way of type 2.
interrupt handle.
Namely, these types consider it as dummy, and do not use it, anywhere,
Right?
I think it can work well if these types completely ignore this flag, like below.Whether the interrupt belongs to a type2 channel is only determined byAgreed, but do you see any issue using the flag even if it acts as dummy ?
the status field in Generic Communications Channel Shared Memory Region,
which is done in rx_callback of PCC client.
what do you think?
-->8
diff --git a/drivers/mailbox/pcc.c b/drivers/mailbox/pcc.c
index ecd54f049de3..14405e99193d 100755
--- a/drivers/mailbox/pcc.c
+++ b/drivers/mailbox/pcc.c
@@ -92,6 +92,13 @@ struct pcc_chan_reg {
* @error: PCC register bundle for the error status register
* @plat_irq: platform interrupt
* @type: PCC subspace type
+ * @plat_irq_flags: platform interrupt flags
+ * @chan_in_use: this flag is used just to check if the interrupt needs
+ * handling when it is shared. Since only one transfer can
occur
+ * at a time and mailbox takes care of locking, this flag can
be
+ * accessed without a lock. Note: the type only support the
+ * communication from OSPM to Platform, like type3, use it, and
+ * other types completely ignore it.
*/
struct pcc_chan_info {
struct pcc_mbox_chan chan;
@@ -102,6 +109,8 @@ struct pcc_chan_info {
struct pcc_chan_reg error;
int plat_irq;
u8 type;
+ unsigned int plat_irq_flags;
+ bool chan_in_use;
};
#define to_pcc_chan_info(c) container_of(c, struct pcc_chan_info, chan)
@@ -225,6 +234,12 @@ static int pcc_map_interrupt(u32 interrupt, u32 flags)
return acpi_register_gsi(NULL, interrupt, trigger, polarity);
}
+static bool pcc_chan_plat_irq_can_be_shared(struct pcc_chan_info *pchan)
+{
+ return (pchan->plat_irq_flags & ACPI_PCCT_INTERRUPT_MODE) ==
+ ACPI_LEVEL_SENSITIVE;
+}
+
static bool pcc_chan_command_complete(struct pcc_chan_info *pchan,
u64 cmd_complete_reg_val)
{
@@ -277,6 +292,9 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p)
int ret;
pchan = chan->con_priv;
+ if (pchan->type == ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE &&
+ !pchan->chan_in_use)
so let us keep it like this for now.
I will send V2 ASAP.
Please submit non-RFC patch as some maintainers may not look at RFC.