/* ipm_console.c - Console messages to/from another processor */ /* * Copyright (c) 2015 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _IPM_CONSOLE_H_ #define _IPM_CONSOLE_H_ #include #include #include #define IPM_CONSOLE_STDOUT (1 << 0) #define IPM_CONSOLE_PRINTK (1 << 1) /* * Good way to determine these numbers other than trial-and-error? * using printf() in the fiber seems to require a lot more stack space */ #define IPM_CONSOLE_STACK_SIZE 512 #define IPM_CONSOLE_PRI 2 struct ipm_console_receiver_config_info { /** Name of the low-level IPM driver to bind to */ char *bind_to; /** * Stack for the receiver's fiber, which prints out messages as * they come in. Should be sized IPM_CONSOLE_STACK_SIZE */ char *fiber_stack; /** * Ring buffer data area for stashing characters from the interrupt * callback */ uint32_t *ring_buf_data; /** Size of ring_buf_data in 32-bit chunks */ unsigned int rb_size32; /** * Line buffer for incoming messages, characters accumulate here * and then are sent to printk() once full (including a trailing NULL) * or a carriage return seen */ char *line_buf; /** Size in bytes of the line buffer. Must be at least 2 */ unsigned int lb_size; /** * Destination for received console messages, one of * IPM_CONSOLE_STDOUT or IPM_CONSOLE_PRINTK */ unsigned int flags; }; struct ipm_console_receiver_runtime_data { /** Buffer for received bytes from the low-level IPM device */ struct ring_buf rb; /** Semaphore to wake up the fiber to print out messages */ struct nano_sem sem; /** pointer to the bound low-level IPM device */ struct device *ipm_device; }; struct ipm_console_sender_config_info { /** Name of the low-level driver to bind to */ char *bind_to; /** * Source of messages to forward, hooks will be installed. * Can be IPM_CONSOLE_STDOUT, IPM_CONSOLE_PRINTK, or both */ int flags; }; #if CONFIG_IPM_CONSOLE_RECEIVER int ipm_console_receiver_init(struct device *d); #endif #if CONFIG_IPM_CONSOLE_SENDER int ipm_console_sender_init(struct device *d); #endif #endif /* _IPM_CONSOLE_H_ */