blob: c80082e9bbc22e00f7b83af7ff30ea0d3b95f4c9 [file] [log] [blame]
Achin Gupta4f6ad662013-10-25 09:08:21 +01001/*
Antonio Nino Diaz4b32e622018-08-16 16:52:57 +01002 * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
Achin Gupta4f6ad662013-10-25 09:08:21 +01003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Achin Gupta4f6ad662013-10-25 09:08:21 +01005 */
6
7#ifndef __BAKERY_LOCK_H__
8#define __BAKERY_LOCK_H__
9
Dan Handleyed6ff952014-05-14 17:44:19 +010010#include <platform_def.h>
Achin Gupta4f6ad662013-10-25 09:08:21 +010011
12#define BAKERY_LOCK_MAX_CPUS PLATFORM_CORE_COUNT
13
Soby Mathew523d6332015-01-08 18:02:19 +000014#ifndef __ASSEMBLY__
Antonio Nino Diaz4b32e622018-08-16 16:52:57 +010015#include <cdefs.h>
Soby Mathew523d6332015-01-08 18:02:19 +000016#include <stdint.h>
17
Soby Mathewa0a897d2015-02-19 16:23:51 +000018/*****************************************************************************
19 * Internal helper macros used by the bakery lock implementation.
20 ****************************************************************************/
21/* Convert a ticket to priority */
22#define PRIORITY(t, pos) (((t) << 8) | (pos))
23
24#define CHOOSING_TICKET 0x1
25#define CHOSEN_TICKET 0x0
26
27#define bakery_is_choosing(info) (info & 0x1)
28#define bakery_ticket_number(info) ((info >> 1) & 0x7FFF)
29#define make_bakery_data(choosing, number) \
30 (((choosing & 0x1) | (number << 1)) & 0xFFFF)
31
32/*****************************************************************************
33 * External bakery lock interface.
34 ****************************************************************************/
Soby Mathew523d6332015-01-08 18:02:19 +000035#if USE_COHERENT_MEM
Andrew Thoelkee466c9f2015-09-10 11:39:36 +010036/*
37 * Bakery locks are stored in coherent memory
38 *
39 * Each lock's data is contiguous and fully allocated by the compiler
40 */
Soby Mathew523d6332015-01-08 18:02:19 +000041
Dan Handleye2712bc2014-04-10 15:37:22 +010042typedef struct bakery_lock {
Soby Mathewa0a897d2015-02-19 16:23:51 +000043 /*
44 * The lock_data is a bit-field of 2 members:
45 * Bit[0] : choosing. This field is set when the CPU is
46 * choosing its bakery number.
47 * Bits[1 - 15] : number. This is the bakery number allocated.
48 */
49 volatile uint16_t lock_data[BAKERY_LOCK_MAX_CPUS];
Dan Handleye2712bc2014-04-10 15:37:22 +010050} bakery_lock_t;
Achin Gupta4f6ad662013-10-25 09:08:21 +010051
Soby Mathew523d6332015-01-08 18:02:19 +000052#else
Andrew Thoelkee466c9f2015-09-10 11:39:36 +010053/*
54 * Bakery locks are stored in normal .bss memory
55 *
56 * Each lock's data is spread across multiple cache lines, one per CPU,
57 * but multiple locks can share the same cache line.
58 * The compiler will allocate enough memory for one CPU's bakery locks,
59 * the remaining cache lines are allocated by the linker script
60 */
Soby Mathew523d6332015-01-08 18:02:19 +000061
62typedef struct bakery_info {
63 /*
64 * The lock_data is a bit-field of 2 members:
65 * Bit[0] : choosing. This field is set when the CPU is
66 * choosing its bakery number.
67 * Bits[1 - 15] : number. This is the bakery number allocated.
68 */
69 volatile uint16_t lock_data;
70} bakery_info_t;
71
Andrew Thoelkee466c9f2015-09-10 11:39:36 +010072typedef bakery_info_t bakery_lock_t;
Soby Mathew523d6332015-01-08 18:02:19 +000073
74#endif /* __USE_COHERENT_MEM__ */
Andrew Thoelkee466c9f2015-09-10 11:39:36 +010075
Sandrine Bailleux37a12df2016-04-11 13:17:50 +010076static inline void bakery_lock_init(bakery_lock_t *bakery) {}
Andrew Thoelkee466c9f2015-09-10 11:39:36 +010077void bakery_lock_get(bakery_lock_t *bakery);
78void bakery_lock_release(bakery_lock_t *bakery);
79
Soren Brinkmann46dd1702016-01-14 10:11:05 -080080#define DEFINE_BAKERY_LOCK(_name) bakery_lock_t _name __section("bakery_lock")
Andrew Thoelkee466c9f2015-09-10 11:39:36 +010081
82#define DECLARE_BAKERY_LOCK(_name) extern bakery_lock_t _name
83
84
Soby Mathew523d6332015-01-08 18:02:19 +000085#endif /* __ASSEMBLY__ */
Achin Gupta4f6ad662013-10-25 09:08:21 +010086#endif /* __BAKERY_LOCK_H__ */