aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi
diff options
context:
space:
mode:
authorLv Zheng <lv.zheng@intel.com>2015-02-27 01:48:15 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2015-03-09 19:58:36 -0400
commit3535a3c126651616a111491726c241e801fd9418 (patch)
treef5f563a0e43ef0cfc56213ee177ef7daa5cae34e /drivers/acpi
parent9eccca0843205f87c00404b663188b88eb248051 (diff)
ACPI / EC: Cleanup logging/debugging splitter support.
This patch refines logging/debugging splitter support so that when DEBUG is disabled, splitters won't be visible in the kernel logs while they are still available for developers when DEBUG is enabled. This patch also refines the splitters to mark the following handling process boundaries: +++++: boundary of driver starting/stopping boundary of IRQ storming =====: boundary of transaction advancement *****: boundary of EC command boundary of EC query #####: boundary of EC _Qxx evaluation The following 2 log entries are originally logged using pr_info() in order to be used as the boot/suspend/resume log entries for the EC device, this patch also restores them to pr_info() logging level: ACPI : EC: EC started ACPI : EC: EC stopped In this patch, one log entry around "Polling quirk" is converted into ec_dbg_raw() which doesn't contain the boundary marker. Signed-off-by: Lv Zheng <lv.zheng@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi')
-rw-r--r--drivers/acpi/ec.c108
1 files changed, 74 insertions, 34 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index a8dd2f763382..07426c8c255b 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -137,6 +137,48 @@ static int EC_FLAGS_CLEAR_ON_RESUME; /* Needs acpi_ec_clear() on boot/resume */
137static int EC_FLAGS_QUERY_HANDSHAKE; /* Needs QR_EC issued when SCI_EVT set */ 137static int EC_FLAGS_QUERY_HANDSHAKE; /* Needs QR_EC issued when SCI_EVT set */
138 138
139/* -------------------------------------------------------------------------- 139/* --------------------------------------------------------------------------
140 * Logging/Debugging
141 * -------------------------------------------------------------------------- */
142
143/*
144 * Splitters used by the developers to track the boundary of the EC
145 * handling processes.
146 */
147#ifdef DEBUG
148#define EC_DBG_SEP " "
149#define EC_DBG_DRV "+++++"
150#define EC_DBG_STM "====="
151#define EC_DBG_REQ "*****"
152#define EC_DBG_EVT "#####"
153#else
154#define EC_DBG_SEP ""
155#define EC_DBG_DRV
156#define EC_DBG_STM
157#define EC_DBG_REQ
158#define EC_DBG_EVT
159#endif
160
161#define ec_log_raw(fmt, ...) \
162 pr_info(fmt "\n", ##__VA_ARGS__)
163#define ec_dbg_raw(fmt, ...) \
164 pr_debug(fmt "\n", ##__VA_ARGS__)
165#define ec_log(filter, fmt, ...) \
166 ec_log_raw(filter EC_DBG_SEP fmt EC_DBG_SEP filter, ##__VA_ARGS__)
167#define ec_dbg(filter, fmt, ...) \
168 ec_dbg_raw(filter EC_DBG_SEP fmt EC_DBG_SEP filter, ##__VA_ARGS__)
169
170#define ec_log_drv(fmt, ...) \
171 ec_log(EC_DBG_DRV, fmt, ##__VA_ARGS__)
172#define ec_dbg_drv(fmt, ...) \
173 ec_dbg(EC_DBG_DRV, fmt, ##__VA_ARGS__)
174#define ec_dbg_stm(fmt, ...) \
175 ec_dbg(EC_DBG_STM, fmt, ##__VA_ARGS__)
176#define ec_dbg_req(fmt, ...) \
177 ec_dbg(EC_DBG_REQ, fmt, ##__VA_ARGS__)
178#define ec_dbg_evt(fmt, ...) \
179 ec_dbg(EC_DBG_EVT, fmt, ##__VA_ARGS__)
180
181/* --------------------------------------------------------------------------
140 * Device Flags 182 * Device Flags
141 * -------------------------------------------------------------------------- */ 183 * -------------------------------------------------------------------------- */
142 184
@@ -159,14 +201,14 @@ static inline u8 acpi_ec_read_status(struct acpi_ec *ec)
159{ 201{
160 u8 x = inb(ec->command_addr); 202 u8 x = inb(ec->command_addr);
161 203
162 pr_debug("EC_SC(R) = 0x%2.2x " 204 ec_dbg_raw("EC_SC(R) = 0x%2.2x "
163 "SCI_EVT=%d BURST=%d CMD=%d IBF=%d OBF=%d\n", 205 "SCI_EVT=%d BURST=%d CMD=%d IBF=%d OBF=%d",
164 x, 206 x,
165 !!(x & ACPI_EC_FLAG_SCI), 207 !!(x & ACPI_EC_FLAG_SCI),
166 !!(x & ACPI_EC_FLAG_BURST), 208 !!(x & ACPI_EC_FLAG_BURST),
167 !!(x & ACPI_EC_FLAG_CMD), 209 !!(x & ACPI_EC_FLAG_CMD),
168 !!(x & ACPI_EC_FLAG_IBF), 210 !!(x & ACPI_EC_FLAG_IBF),
169 !!(x & ACPI_EC_FLAG_OBF)); 211 !!(x & ACPI_EC_FLAG_OBF));
170 return x; 212 return x;
171} 213}
172 214
@@ -175,20 +217,20 @@ static inline u8 acpi_ec_read_data(struct acpi_ec *ec)
175 u8 x = inb(ec->data_addr); 217 u8 x = inb(ec->data_addr);
176 218
177 ec->curr->timestamp = jiffies; 219 ec->curr->timestamp = jiffies;
178 pr_debug("EC_DATA(R) = 0x%2.2x\n", x); 220 ec_dbg_raw("EC_DATA(R) = 0x%2.2x", x);
179 return x; 221 return x;
180} 222}
181 223
182static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command) 224static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command)
183{ 225{
184 pr_debug("EC_SC(W) = 0x%2.2x\n", command); 226 ec_dbg_raw("EC_SC(W) = 0x%2.2x", command);
185 outb(command, ec->command_addr); 227 outb(command, ec->command_addr);
186 ec->curr->timestamp = jiffies; 228 ec->curr->timestamp = jiffies;
187} 229}
188 230
189static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data) 231static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data)
190{ 232{
191 pr_debug("EC_DATA(W) = 0x%2.2x\n", data); 233 ec_dbg_raw("EC_DATA(W) = 0x%2.2x", data);
192 outb(data, ec->data_addr); 234 outb(data, ec->data_addr);
193 ec->curr->timestamp = jiffies; 235 ec->curr->timestamp = jiffies;
194} 236}
@@ -240,7 +282,7 @@ static inline void acpi_ec_enable_gpe(struct acpi_ec *ec, bool open)
240 * software need to manually trigger a pseudo GPE event on 282 * software need to manually trigger a pseudo GPE event on
241 * EN=1 writes. 283 * EN=1 writes.
242 */ 284 */
243 pr_debug("***** Polling quirk *****\n"); 285 ec_dbg_raw("Polling quirk");
244 advance_transaction(ec); 286 advance_transaction(ec);
245 } 287 }
246} 288}
@@ -299,7 +341,7 @@ static void acpi_ec_set_storm(struct acpi_ec *ec, u8 flag)
299{ 341{
300 if (!test_bit(flag, &ec->flags)) { 342 if (!test_bit(flag, &ec->flags)) {
301 acpi_ec_disable_gpe(ec, false); 343 acpi_ec_disable_gpe(ec, false);
302 pr_debug("+++++ Polling enabled +++++\n"); 344 ec_dbg_drv("Polling enabled");
303 set_bit(flag, &ec->flags); 345 set_bit(flag, &ec->flags);
304 } 346 }
305} 347}
@@ -309,7 +351,7 @@ static void acpi_ec_clear_storm(struct acpi_ec *ec, u8 flag)
309 if (test_bit(flag, &ec->flags)) { 351 if (test_bit(flag, &ec->flags)) {
310 clear_bit(flag, &ec->flags); 352 clear_bit(flag, &ec->flags);
311 acpi_ec_enable_gpe(ec, false); 353 acpi_ec_enable_gpe(ec, false);
312 pr_debug("+++++ Polling disabled +++++\n"); 354 ec_dbg_drv("Polling disabled");
313 } 355 }
314} 356}
315 357
@@ -335,7 +377,7 @@ static bool acpi_ec_submit_flushable_request(struct acpi_ec *ec)
335static void acpi_ec_submit_query(struct acpi_ec *ec) 377static void acpi_ec_submit_query(struct acpi_ec *ec)
336{ 378{
337 if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) { 379 if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) {
338 pr_debug("***** Event started *****\n"); 380 ec_dbg_req("Event started");
339 schedule_work(&ec->work); 381 schedule_work(&ec->work);
340 } 382 }
341} 383}
@@ -344,7 +386,7 @@ static void acpi_ec_complete_query(struct acpi_ec *ec)
344{ 386{
345 if (ec->curr->command == ACPI_EC_COMMAND_QUERY) { 387 if (ec->curr->command == ACPI_EC_COMMAND_QUERY) {
346 clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); 388 clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
347 pr_debug("***** Event stopped *****\n"); 389 ec_dbg_req("Event stopped");
348 } 390 }
349} 391}
350 392
@@ -366,8 +408,8 @@ static void advance_transaction(struct acpi_ec *ec)
366 u8 status; 408 u8 status;
367 bool wakeup = false; 409 bool wakeup = false;
368 410
369 pr_debug("===== %s (%d) =====\n", 411 ec_dbg_stm("%s (%d)", in_interrupt() ? "IRQ" : "TASK",
370 in_interrupt() ? "IRQ" : "TASK", smp_processor_id()); 412 smp_processor_id());
371 /* 413 /*
372 * By always clearing STS before handling all indications, we can 414 * By always clearing STS before handling all indications, we can
373 * ensure a hardware STS 0->1 change after this clearing can always 415 * ensure a hardware STS 0->1 change after this clearing can always
@@ -390,8 +432,8 @@ static void advance_transaction(struct acpi_ec *ec)
390 if (t->rlen == t->ri) { 432 if (t->rlen == t->ri) {
391 t->flags |= ACPI_EC_COMMAND_COMPLETE; 433 t->flags |= ACPI_EC_COMMAND_COMPLETE;
392 if (t->command == ACPI_EC_COMMAND_QUERY) 434 if (t->command == ACPI_EC_COMMAND_QUERY)
393 pr_debug("***** Command(%s) hardware completion *****\n", 435 ec_dbg_req("Command(%s) hardware completion",
394 acpi_ec_cmd_string(t->command)); 436 acpi_ec_cmd_string(t->command));
395 wakeup = true; 437 wakeup = true;
396 } 438 }
397 } else 439 } else
@@ -410,8 +452,8 @@ static void advance_transaction(struct acpi_ec *ec)
410 acpi_ec_complete_query(ec); 452 acpi_ec_complete_query(ec);
411 t->rdata[t->ri++] = 0x00; 453 t->rdata[t->ri++] = 0x00;
412 t->flags |= ACPI_EC_COMMAND_COMPLETE; 454 t->flags |= ACPI_EC_COMMAND_COMPLETE;
413 pr_debug("***** Command(%s) software completion *****\n", 455 ec_dbg_req("Command(%s) software completion",
414 acpi_ec_cmd_string(t->command)); 456 acpi_ec_cmd_string(t->command));
415 wakeup = true; 457 wakeup = true;
416 } else if ((status & ACPI_EC_FLAG_IBF) == 0) { 458 } else if ((status & ACPI_EC_FLAG_IBF) == 0) {
417 acpi_ec_write_cmd(ec, t->command); 459 acpi_ec_write_cmd(ec, t->command);
@@ -504,16 +546,14 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
504 } 546 }
505 /* following two actions should be kept atomic */ 547 /* following two actions should be kept atomic */
506 ec->curr = t; 548 ec->curr = t;
507 pr_debug("***** Command(%s) started *****\n", 549 ec_dbg_req("Command(%s) started", acpi_ec_cmd_string(t->command));
508 acpi_ec_cmd_string(t->command));
509 start_transaction(ec); 550 start_transaction(ec);
510 spin_unlock_irqrestore(&ec->lock, tmp); 551 spin_unlock_irqrestore(&ec->lock, tmp);
511 ret = ec_poll(ec); 552 ret = ec_poll(ec);
512 spin_lock_irqsave(&ec->lock, tmp); 553 spin_lock_irqsave(&ec->lock, tmp);
513 if (t->irq_count == ec_storm_threshold) 554 if (t->irq_count == ec_storm_threshold)
514 acpi_ec_clear_storm(ec, EC_FLAGS_COMMAND_STORM); 555 acpi_ec_clear_storm(ec, EC_FLAGS_COMMAND_STORM);
515 pr_debug("***** Command(%s) stopped *****\n", 556 ec_dbg_req("Command(%s) stopped", acpi_ec_cmd_string(t->command));
516 acpi_ec_cmd_string(t->command));
517 ec->curr = NULL; 557 ec->curr = NULL;
518 /* Disable GPE for command processing (IBF=0/OBF=1) */ 558 /* Disable GPE for command processing (IBF=0/OBF=1) */
519 acpi_ec_complete_request(ec); 559 acpi_ec_complete_request(ec);
@@ -676,11 +716,11 @@ static void acpi_ec_start(struct acpi_ec *ec, bool resuming)
676 716
677 spin_lock_irqsave(&ec->lock, flags); 717 spin_lock_irqsave(&ec->lock, flags);
678 if (!test_and_set_bit(EC_FLAGS_STARTED, &ec->flags)) { 718 if (!test_and_set_bit(EC_FLAGS_STARTED, &ec->flags)) {
679 pr_debug("+++++ Starting EC +++++\n"); 719 ec_dbg_drv("Starting EC");
680 /* Enable GPE for event processing (SCI_EVT=1) */ 720 /* Enable GPE for event processing (SCI_EVT=1) */
681 if (!resuming) 721 if (!resuming)
682 acpi_ec_submit_request(ec); 722 acpi_ec_submit_request(ec);
683 pr_debug("EC started\n"); 723 ec_log_drv("EC started");
684 } 724 }
685 spin_unlock_irqrestore(&ec->lock, flags); 725 spin_unlock_irqrestore(&ec->lock, flags);
686} 726}
@@ -702,7 +742,7 @@ static void acpi_ec_stop(struct acpi_ec *ec, bool suspending)
702 742
703 spin_lock_irqsave(&ec->lock, flags); 743 spin_lock_irqsave(&ec->lock, flags);
704 if (acpi_ec_started(ec)) { 744 if (acpi_ec_started(ec)) {
705 pr_debug("+++++ Stopping EC +++++\n"); 745 ec_dbg_drv("Stopping EC");
706 set_bit(EC_FLAGS_STOPPED, &ec->flags); 746 set_bit(EC_FLAGS_STOPPED, &ec->flags);
707 spin_unlock_irqrestore(&ec->lock, flags); 747 spin_unlock_irqrestore(&ec->lock, flags);
708 wait_event(ec->wait, acpi_ec_stopped(ec)); 748 wait_event(ec->wait, acpi_ec_stopped(ec));
@@ -712,7 +752,7 @@ static void acpi_ec_stop(struct acpi_ec *ec, bool suspending)
712 acpi_ec_complete_request(ec); 752 acpi_ec_complete_request(ec);
713 clear_bit(EC_FLAGS_STARTED, &ec->flags); 753 clear_bit(EC_FLAGS_STARTED, &ec->flags);
714 clear_bit(EC_FLAGS_STOPPED, &ec->flags); 754 clear_bit(EC_FLAGS_STOPPED, &ec->flags);
715 pr_debug("EC stopped\n"); 755 ec_log_drv("EC stopped");
716 } 756 }
717 spin_unlock_irqrestore(&ec->lock, flags); 757 spin_unlock_irqrestore(&ec->lock, flags);
718} 758}
@@ -824,12 +864,12 @@ static void acpi_ec_run(void *cxt)
824 864
825 if (!handler) 865 if (!handler)
826 return; 866 return;
827 pr_debug("##### Query(0x%02x) started #####\n", handler->query_bit); 867 ec_dbg_evt("Query(0x%02x) started", handler->query_bit);
828 if (handler->func) 868 if (handler->func)
829 handler->func(handler->data); 869 handler->func(handler->data);
830 else if (handler->handle) 870 else if (handler->handle)
831 acpi_evaluate_object(handler->handle, NULL, NULL, NULL); 871 acpi_evaluate_object(handler->handle, NULL, NULL, NULL);
832 pr_debug("##### Query(0x%02x) stopped #####\n", handler->query_bit); 872 ec_dbg_evt("Query(0x%02x) stopped", handler->query_bit);
833 acpi_ec_put_query_handler(handler); 873 acpi_ec_put_query_handler(handler);
834} 874}
835 875
@@ -861,8 +901,8 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 *data)
861 if (value == handler->query_bit) { 901 if (value == handler->query_bit) {
862 /* have custom handler for this bit */ 902 /* have custom handler for this bit */
863 handler = acpi_ec_get_query_handler(handler); 903 handler = acpi_ec_get_query_handler(handler);
864 pr_debug("##### Query(0x%02x) scheduled #####\n", 904 ec_dbg_evt("Query(0x%02x) scheduled",
865 handler->query_bit); 905 handler->query_bit);
866 status = acpi_os_execute((handler->func) ? 906 status = acpi_os_execute((handler->func) ?
867 OSL_NOTIFY_HANDLER : OSL_GPE_HANDLER, 907 OSL_NOTIFY_HANDLER : OSL_GPE_HANDLER,
868 acpi_ec_run, handler); 908 acpi_ec_run, handler);