Linux Audio

Check our new training course

Linux BSP development engineering services

Need help to port Linux and bootloaders to your hardware?
Loading...
Note: File does not exist in v5.4.
 1// SPDX-License-Identifier: GPL-2.0
 2
 3#include <linux/pgtable.h>
 4#include <asm/abs_lowcore.h>
 5
 6unsigned long __bootdata_preserved(__abs_lowcore);
 7int __bootdata_preserved(relocate_lowcore);
 8
 9int abs_lowcore_map(int cpu, struct lowcore *lc, bool alloc)
10{
11	unsigned long addr = __abs_lowcore + (cpu * sizeof(struct lowcore));
12	unsigned long phys = __pa(lc);
13	int rc, i;
14
15	for (i = 0; i < LC_PAGES; i++) {
16		rc = __vmem_map_4k_page(addr, phys, PAGE_KERNEL, alloc);
17		if (rc) {
18			/*
19			 * Do not unmap allocated page tables in case the
20			 * allocation was not requested. In such a case the
21			 * request is expected coming from an atomic context,
22			 * while the unmap attempt might sleep.
23			 */
24			if (alloc) {
25				for (--i; i >= 0; i--) {
26					addr -= PAGE_SIZE;
27					vmem_unmap_4k_page(addr);
28				}
29			}
30			return rc;
31		}
32		addr += PAGE_SIZE;
33		phys += PAGE_SIZE;
34	}
35	return 0;
36}
37
38void abs_lowcore_unmap(int cpu)
39{
40	unsigned long addr = __abs_lowcore + (cpu * sizeof(struct lowcore));
41	int i;
42
43	for (i = 0; i < LC_PAGES; i++) {
44		vmem_unmap_4k_page(addr);
45		addr += PAGE_SIZE;
46	}
47}