1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * SPU local store allocation routines
4 *
5 * Copyright 2007 Benjamin Herrenschmidt, IBM Corp.
6 */
7
8#undef DEBUG
9
10#include <linux/kernel.h>
11#include <linux/mm.h>
12#include <linux/slab.h>
13#include <linux/vmalloc.h>
14
15#include <asm/spu.h>
16#include <asm/spu_csa.h>
17#include <asm/mmu.h>
18
19#include "spufs.h"
20
21int spu_alloc_lscsa(struct spu_state *csa)
22{
23 struct spu_lscsa *lscsa;
24 unsigned char *p;
25
26 lscsa = vzalloc(sizeof(*lscsa));
27 if (!lscsa)
28 return -ENOMEM;
29 csa->lscsa = lscsa;
30
31 /* Set LS pages reserved to allow for user-space mapping. */
32 for (p = lscsa->ls; p < lscsa->ls + LS_SIZE; p += PAGE_SIZE)
33 SetPageReserved(vmalloc_to_page(addr: p));
34
35 return 0;
36}
37
38void spu_free_lscsa(struct spu_state *csa)
39{
40 /* Clear reserved bit before vfree. */
41 unsigned char *p;
42
43 if (csa->lscsa == NULL)
44 return;
45
46 for (p = csa->lscsa->ls; p < csa->lscsa->ls + LS_SIZE; p += PAGE_SIZE)
47 ClearPageReserved(page: vmalloc_to_page(addr: p));
48
49 vfree(addr: csa->lscsa);
50}
51

source code of linux/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c