Lines Matching +full:proc +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Creates entries in /proc/sal for various system features.
8 * Copyright (c) 2003 Hewlett-Packard Co
17 * Cache the record across multi-block reads from user space.
36 * Replace the counting semaphore with a mutex and a test if the cpumask is non-empty.
55 MODULE_DESCRIPTION("/proc interface to IA-64 SAL features");
59 const char *name; /* name of the proc entry */
65 * List {name,feature} pairs for every entry in /proc/sal/<feature>
85 ARRAY_SIZE(salinfo_entries) + /* /proc/sal/bus_lock */
86 ARRAY_SIZE(salinfo_log_name) + /* /proc/sal/{mca,...} */
87 (2 * ARRAY_SIZE(salinfo_log_name)) + /* /proc/sal/mca/{event,data} */
88 1]; /* /proc/sal */
96 u64 id; member
100 /* State transitions. Actions are :-
110 * write "read <cpunum>" -> NO_DATA or LOG_RECORD.
111 * write "clear <cpunum>" -> NO_DATA or LOG_RECORD.
112 * write "oemdata <cpunum> <offset> -> return -EINVAL.
113 * read data -> return EOF.
114 * close -> unchanged. Free record areas.
117 * write "read <cpunum>" -> NO_DATA or LOG_RECORD.
118 * write "clear <cpunum>" -> NO_DATA or LOG_RECORD.
119 * write "oemdata <cpunum> <offset> -> format the oem data, goto OEMDATA.
120 * read data -> return the INIT/MCA/CMC/CPE record.
121 * close -> unchanged. Keep record areas.
124 * write "read <cpunum>" -> NO_DATA or LOG_RECORD.
125 * write "clear <cpunum>" -> NO_DATA or LOG_RECORD.
126 * write "oemdata <cpunum> <offset> -> format the oem data, goto OEMDATA.
127 * read data -> return the formatted oemdata.
128 * close -> unchanged. Keep record areas.
148 int open; /* single-open to prevent races */
162 /** salinfo_platform_oemdata - optional callback to decode oemdata from an error
172 * and its strlen. Returns 0 for success, -ve for error. The callback is
188 return salinfo_platform_oemdata(parms->efi_guid, parms->oemdata, parms->oemdata_size); in salinfo_platform_oemdata_cpu()
194 memcpy(data->data_saved+shift, data->data_saved+shift+1, in shift1_data_saved()
195 (ARRAY_SIZE(data->data_saved) - (shift+1)) * sizeof(data->data_saved[0])); in shift1_data_saved()
196 memset(data->data_saved + ARRAY_SIZE(data->data_saved) - 1, 0, in shift1_data_saved()
197 sizeof(data->data_saved[0])); in shift1_data_saved()
208 * when user space processes the record. Save the record id to identify
218 int saved_size = ARRAY_SIZE(data->data_saved); in salinfo_log_wakeup()
225 for (i = 0, data_saved = data->data_saved; i < saved_size; ++i, ++data_saved) { in salinfo_log_wakeup()
226 if (!data_saved->buffer) in salinfo_log_wakeup()
230 if (!data->saved_num) { in salinfo_log_wakeup()
232 data_saved = data->data_saved + saved_size - 1; in salinfo_log_wakeup()
237 data_saved->cpu = smp_processor_id(); in salinfo_log_wakeup()
238 data_saved->id = ((sal_log_record_header_t *)buffer)->id; in salinfo_log_wakeup()
239 data_saved->size = size; in salinfo_log_wakeup()
240 data_saved->buffer = buffer; in salinfo_log_wakeup()
243 cpumask_set_cpu(smp_processor_id(), &data->cpu_event); in salinfo_log_wakeup()
245 wake_up_interruptible(&data->read_wait); in salinfo_log_wakeup()
258 if (!data->open) in salinfo_timeout_check()
260 if (!cpumask_empty(&data->cpu_event)) in salinfo_timeout_check()
261 wake_up_interruptible(&data->read_wait); in salinfo_timeout_check()
278 return -EPERM; in salinfo_event_open()
288 int i, n, cpu = -1; in salinfo_event_read()
291 if (cpumask_empty(&data->cpu_event)) { in salinfo_event_read()
292 if (file->f_flags & O_NONBLOCK) in salinfo_event_read()
293 return -EAGAIN; in salinfo_event_read()
294 if (wait_event_interruptible(data->read_wait, in salinfo_event_read()
295 !cpumask_empty(&data->cpu_event))) in salinfo_event_read()
296 return -EINTR; in salinfo_event_read()
299 n = data->cpu_check; in salinfo_event_read()
301 if (cpumask_test_cpu(n, &data->cpu_event)) { in salinfo_event_read()
303 cpumask_clear_cpu(n, &data->cpu_event); in salinfo_event_read()
313 if (cpu == -1) in salinfo_event_read()
319 data->cpu_check = cpu; in salinfo_event_read()
320 if (++data->cpu_check == nr_cpu_ids) in salinfo_event_read()
321 data->cpu_check = 0; in salinfo_event_read()
329 return -EFAULT; in salinfo_event_read()
346 return -EPERM; in salinfo_log_open()
349 if (data->open) { in salinfo_log_open()
351 return -EBUSY; in salinfo_log_open()
353 data->open = 1; in salinfo_log_open()
356 if (data->state == STATE_NO_DATA && in salinfo_log_open()
357 !(data->log_buffer = vmalloc(ia64_sal_get_state_info_size(data->type)))) { in salinfo_log_open()
358 data->open = 0; in salinfo_log_open()
359 return -ENOMEM; in salinfo_log_open()
370 if (data->state == STATE_NO_DATA) { in salinfo_log_release()
371 vfree(data->log_buffer); in salinfo_log_release()
372 vfree(data->oemdata); in salinfo_log_release()
373 data->log_buffer = NULL; in salinfo_log_release()
374 data->oemdata = NULL; in salinfo_log_release()
377 data->open = 0; in salinfo_log_release()
387 data->log_size = ia64_sal_get_state_info(data->type, (u64 *) data->log_buffer); in salinfo_log_read_cpu()
388 rh = (sal_log_record_header_t *)(data->log_buffer); in salinfo_log_read_cpu()
390 if (rh->severity == sal_log_severity_corrected) in salinfo_log_read_cpu()
391 ia64_sal_clear_state_info(data->type); in salinfo_log_read_cpu()
401 int saved_size = ARRAY_SIZE(data->data_saved); in salinfo_log_new_read()
403 data->saved_num = 0; in salinfo_log_new_read()
406 for (i = 0, data_saved = data->data_saved; i < saved_size; ++i, ++data_saved) { in salinfo_log_new_read()
407 if (data_saved->buffer && data_saved->cpu == cpu) { in salinfo_log_new_read()
408 sal_log_record_header_t *rh = (sal_log_record_header_t *)(data_saved->buffer); in salinfo_log_new_read()
409 data->log_size = data_saved->size; in salinfo_log_new_read()
410 memcpy(data->log_buffer, rh, data->log_size); in salinfo_log_new_read()
411 barrier(); /* id check must not be moved */ in salinfo_log_new_read()
412 if (rh->id == data_saved->id) { in salinfo_log_new_read()
413 data->saved_num = i+1; in salinfo_log_new_read()
423 if (!data->saved_num) in salinfo_log_new_read()
425 if (!data->log_size) { in salinfo_log_new_read()
426 data->state = STATE_NO_DATA; in salinfo_log_new_read()
427 cpumask_clear_cpu(cpu, &data->cpu_event); in salinfo_log_new_read()
429 data->state = STATE_LOG_RECORD; in salinfo_log_new_read()
440 if (data->state == STATE_LOG_RECORD) { in salinfo_log_read()
441 buf = data->log_buffer; in salinfo_log_read()
442 bufsize = data->log_size; in salinfo_log_read()
443 } else if (data->state == STATE_OEMDATA) { in salinfo_log_read()
444 buf = data->oemdata; in salinfo_log_read()
445 bufsize = data->oemdata_size; in salinfo_log_read()
458 ia64_sal_clear_state_info(data->type); in salinfo_log_clear_cpu()
468 data->state = STATE_NO_DATA; in salinfo_log_clear()
469 if (!cpumask_test_cpu(cpu, &data->cpu_event)) { in salinfo_log_clear()
473 cpumask_clear_cpu(cpu, &data->cpu_event); in salinfo_log_clear()
474 if (data->saved_num) { in salinfo_log_clear()
475 shift1_data_saved(data, data->saved_num - 1); in salinfo_log_clear()
476 data->saved_num = 0; in salinfo_log_clear()
479 rh = (sal_log_record_header_t *)(data->log_buffer); in salinfo_log_clear()
481 if (rh->severity != sal_log_severity_corrected) in salinfo_log_clear()
485 if (data->state == STATE_LOG_RECORD) { in salinfo_log_clear()
487 cpumask_set_cpu(cpu, &data->cpu_event); in salinfo_log_clear()
488 wake_up_interruptible(&data->read_wait); in salinfo_log_clear()
507 return -EFAULT; in salinfo_log_write()
516 if (data->state != STATE_LOG_RECORD && data->state != STATE_OEMDATA) in salinfo_log_write()
517 return -EINVAL; in salinfo_log_write()
518 if (offset > data->log_size - sizeof(efi_guid_t)) in salinfo_log_write()
519 return -EINVAL; in salinfo_log_write()
520 data->state = STATE_OEMDATA; in salinfo_log_write()
523 .efi_guid = data->log_buffer + offset, in salinfo_log_write()
524 .oemdata = &data->oemdata, in salinfo_log_write()
525 .oemdata_size = &data->oemdata_size in salinfo_log_write()
530 data->oemdata_size = 0; in salinfo_log_write()
532 return -EINVAL; in salinfo_log_write()
552 cpumask_set_cpu(cpu, &data->cpu_event); in salinfo_cpu_online()
553 wake_up_interruptible(&data->read_wait); in salinfo_cpu_online()
567 int j = ARRAY_SIZE(data->data_saved) - 1; in salinfo_cpu_pre_down()
569 for (data_saved = data->data_saved + j; j >= 0; in salinfo_cpu_pre_down()
570 --j, --data_saved) { in salinfo_cpu_pre_down()
571 if (data_saved->buffer && data_saved->cpu == cpu) in salinfo_cpu_pre_down()
574 cpumask_clear_cpu(cpu, &data->cpu_event); in salinfo_cpu_pre_down()
594 struct proc_dir_entry *salinfo_dir; /* /proc/sal dir entry */ in salinfo_init()
613 data->type = i; in salinfo_init()
614 init_waitqueue_head(&data->read_wait); in salinfo_init()