1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- /*
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2019 Western Digital Corporation or its affiliates.
- *
- * Authors:
- * Anup Patel <anup.patel@wdc.com>
- */
- #include <sbi/riscv_locks.h>
- #include <sbi/sbi_scratch.h>
- static spinlock_t extra_lock = SPIN_LOCK_INITIALIZER;
- static unsigned long extra_offset = SBI_SCRATCH_EXTRA_SPACE_OFFSET;
- unsigned long sbi_scratch_alloc_offset(unsigned long size, const char *owner)
- {
- unsigned long ret = 0;
- /*
- * We have a simple brain-dead allocator which never expects
- * anything to be free-ed hence it keeps incrementing the
- * next allocation offset until it runs-out of space.
- *
- * In future, we will have more sophisticated allocator which
- * will allow us to re-claim free-ed space.
- */
- if (!size)
- return 0;
- while (size & (__SIZEOF_POINTER__ - 1))
- size++;
- spin_lock(&extra_lock);
- if (SBI_SCRATCH_SIZE < (extra_offset + size))
- goto done;
- ret = extra_offset;
- extra_offset += size;
- done:
- spin_unlock(&extra_lock);
- return ret;
- }
- void sbi_scratch_free_offset(unsigned long offset)
- {
- if ((offset < SBI_SCRATCH_EXTRA_SPACE_OFFSET) ||
- (SBI_SCRATCH_SIZE <= offset))
- return;
- /*
- * We don't actually free-up because it's a simple
- * brain-dead allocator.
- */
- }
|