xref: /rk3399_ARM-atf/plat/mediatek/drivers/booker/booker.c (revision cd662ab861b937f389d7d1bde362ce77979414fd)
1*997eba32SRunyang Chen /*
2*997eba32SRunyang Chen  * Copyright (c) 2025, MediaTek Inc. All rights reserved.
3*997eba32SRunyang Chen  *
4*997eba32SRunyang Chen  * SPDX-License-Identifier: BSD-3-Clause
5*997eba32SRunyang Chen  */
6*997eba32SRunyang Chen 
7*997eba32SRunyang Chen #include <arch_helpers.h>
8*997eba32SRunyang Chen #include <lib/mmio.h>
9*997eba32SRunyang Chen 
10*997eba32SRunyang Chen #include <drivers/booker.h>
11*997eba32SRunyang Chen #include <mtk_mmap_pool.h>
12*997eba32SRunyang Chen #include <platform_booker.h>
13*997eba32SRunyang Chen 
14*997eba32SRunyang Chen static const mmap_region_t booker_mmap[] MTK_MMAP_SECTION = {
15*997eba32SRunyang Chen 	MAP_REGION_FLAT(BOOKER_MAP_REGION, BOOKER_MAP_SIZE, MT_DEVICE | MT_RW | MT_SECURE),
16*997eba32SRunyang Chen 	{0}
17*997eba32SRunyang Chen };
18*997eba32SRunyang Chen DECLARE_MTK_MMAP_REGIONS(booker_mmap);
19*997eba32SRunyang Chen 
booker_mtsx_tc_flush(uintptr_t base)20*997eba32SRunyang Chen static void booker_mtsx_tc_flush(uintptr_t base)
21*997eba32SRunyang Chen {
22*997eba32SRunyang Chen 	/* make no new lines be allocated in tag cache */
23*997eba32SRunyang Chen 	mmio_setbits_64(base + MTU_AUX_CTL, BIT(TC_NO_FILL_MODE_BIT));
24*997eba32SRunyang Chen 	dsb();
25*997eba32SRunyang Chen 
26*997eba32SRunyang Chen 	/* start flush tag cache with Clean Invalid mode */
27*997eba32SRunyang Chen 	mmio_setbits_64(base + MTU_TC_FLUSH_PR, BIT(TC_FLUSH_ENABLE_BIT));
28*997eba32SRunyang Chen 	dsb();
29*997eba32SRunyang Chen 
30*997eba32SRunyang Chen 	/* polling until flush completed */
31*997eba32SRunyang Chen 	while (!(mmio_read_64(base + MTU_TC_FLUSH_SR) & BIT(TC_FLUSH_COMPLETE_BIT)))
32*997eba32SRunyang Chen 		;
33*997eba32SRunyang Chen }
34*997eba32SRunyang Chen 
booker_flush(void)35*997eba32SRunyang Chen void booker_flush(void)
36*997eba32SRunyang Chen {
37*997eba32SRunyang Chen 	unsigned int i;
38*997eba32SRunyang Chen 
39*997eba32SRunyang Chen 	/* flush tag cache before power down booker */
40*997eba32SRunyang Chen 	for (i = 0; i < ARRAY_SIZE(booker_mtsx_bases); i++)
41*997eba32SRunyang Chen 		booker_mtsx_tc_flush(booker_mtsx_bases[i]);
42*997eba32SRunyang Chen }
43