| /* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| /* Shared memory module for Chrome EC */ |
| |
| #include "common.h" |
| #include "console.h" |
| #include "link_defs.h" |
| #include "shared_mem.h" |
| #include "system.h" |
| #include "util.h" |
| |
| static int buf_in_use; |
| static int max_used; |
| |
| int shared_mem_size(void) |
| { |
| /* |
| * Use all the RAM we can. The shared memory buffer is the last thing |
| * allocated from the start of RAM, so we can use everything up to the |
| * jump data at the end of RAM. |
| */ |
| return system_usable_ram_end() - (uintptr_t)__shared_mem_buf; |
| } |
| |
| int shared_mem_acquire(int size, char **dest_ptr) |
| { |
| if (size > shared_mem_size() || size <= 0) |
| return EC_ERROR_INVAL; |
| |
| if (buf_in_use) |
| return EC_ERROR_BUSY; |
| |
| /* |
| * We could guard buf_in_use with a mutex, but since shared memory is |
| * currently only used by debug commands, that's overkill. |
| */ |
| |
| buf_in_use = size; |
| *dest_ptr = __shared_mem_buf; |
| |
| if (max_used < size) |
| max_used = size; |
| |
| return EC_SUCCESS; |
| } |
| |
| void shared_mem_release(void *ptr) |
| { |
| buf_in_use = 0; |
| } |
| |
| #ifdef CONFIG_CMD_SHMEM |
| static int command_shmem(int argc, char **argv) |
| { |
| ccprintf("Size:%6d\n", shared_mem_size()); |
| ccprintf("Used:%6d\n", buf_in_use); |
| ccprintf("Max: %6d\n", max_used); |
| return EC_SUCCESS; |
| } |
| DECLARE_SAFE_CONSOLE_COMMAND(shmem, command_shmem, |
| NULL, |
| "Print shared memory stats"); |
| #endif |