51 lines
982 B
C
51 lines
982 B
C
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
/*
|
||
|
* SPU local store allocation routines
|
||
|
*
|
||
|
* Copyright 2007 Benjamin Herrenschmidt, IBM Corp.
|
||
|
*/
|
||
|
|
||
|
#undef DEBUG
|
||
|
|
||
|
#include <linux/kernel.h>
|
||
|
#include <linux/mm.h>
|
||
|
#include <linux/slab.h>
|
||
|
#include <linux/vmalloc.h>
|
||
|
|
||
|
#include <asm/spu.h>
|
||
|
#include <asm/spu_csa.h>
|
||
|
#include <asm/mmu.h>
|
||
|
|
||
|
#include "spufs.h"
|
||
|
|
||
|
int spu_alloc_lscsa(struct spu_state *csa)
|
||
|
{
|
||
|
struct spu_lscsa *lscsa;
|
||
|
unsigned char *p;
|
||
|
|
||
|
lscsa = vzalloc(sizeof(*lscsa));
|
||
|
if (!lscsa)
|
||
|
return -ENOMEM;
|
||
|
csa->lscsa = lscsa;
|
||
|
|
||
|
/* Set LS pages reserved to allow for user-space mapping. */
|
||
|
for (p = lscsa->ls; p < lscsa->ls + LS_SIZE; p += PAGE_SIZE)
|
||
|
SetPageReserved(vmalloc_to_page(p));
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void spu_free_lscsa(struct spu_state *csa)
|
||
|
{
|
||
|
/* Clear reserved bit before vfree. */
|
||
|
unsigned char *p;
|
||
|
|
||
|
if (csa->lscsa == NULL)
|
||
|
return;
|
||
|
|
||
|
for (p = csa->lscsa->ls; p < csa->lscsa->ls + LS_SIZE; p += PAGE_SIZE)
|
||
|
ClearPageReserved(vmalloc_to_page(p));
|
||
|
|
||
|
vfree(csa->lscsa);
|
||
|
}
|