• Lv Zheng's avatar
    ACPI / EC: Add query flushing support · f252cb09
    Lv Zheng authored
    This patch implementes the QR_EC flushing support.
    
    Grace periods are implemented from the detection of an SCI_EVT to the
    submission/completion of the QR_EC transaction. During this period, all
    EC command transactions are allowed to be submitted.
    
    Note that query periods and event periods are intentionally distiguished to
    allow further improvements.
    1. Query period: from the detection of an SCI_EVT to the sumission of the
       QR_EC command. This period is used for storming prevention, as currently
       QR_EC is deferred to a work queue rather than directly issued from the
       IRQ context even there is no other transactions pending, so malicous
       SCI_EVT GPE can act like "level triggered" to trigger a GPE storm. We
       need to be prepared for this. And in the future, we may change it to be
       a part of the advance_transaction() where we will try QR_EC submission
       in appropriate positions to avoid such GPE storming.
    2. Event period: from the detection of an SCI_EVT to the completion of the
       QR_EC command. We may extend it to the completion of _Qxx evaluation.
       This is actually a grace period for event flushing, but we only flush
       queries due to the reason stated in known issue 1. That's also why we
       use EC_FLAGS_EVENT_xxx. During this period, QR_EC transactions need to
       pass the flushable submission check.
    
    In this patch, the following flags are implemented:
    1. EC_FLAGS_EVENT_ENABLED: this is derived from the old
       EC_FLAGS_QUERY_PENDING flag which can block SCI_EVT handlings.
       With this flag, the logics implemented by the original flag are
       extended:
       1. Old logic: unless both of the flags are set, the event poller will
                     not be scheduled, and
       2. New logic: as soon as both of the flags are set, the evet poller will
                     be scheduled.
    2. EC_FLAGS_EVENT_DETECTED: this is also derived from the old
       EC_FLAGS_QUERY_PENDING flag which can block SCI_EVT detection. It thus
       can be used to indicate the storming prevention period for query
       submission.
       acpi_ec_submit_request()/acpi_ec_complete_request() are invoked to
       implement this period so that acpi_set_gpe() can be invoked under the
       "reference count > 0" condition.
    3. EC_FLAGS_EVENT_PENDING: this is newly added to indicate the grace period
       for event flushing (query flushing for now).
       acpi_ec_submit_request()/acpi_ec_complete_request() are invoked to
       implement this period so that the flushing process can wait until the
       event handling (query transaction for now) to be completed.
    
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=82611
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=77431Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
    Tested-by: default avatarOrtwin Glück <odi@odi.ch>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    f252cb09
ec.c 39.2 KB