/*
* Copyright 2010 Red Hat Inc .
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* THE COPYRIGHT HOLDER ( S ) OR AUTHOR ( S ) BE LIABLE FOR ANY CLAIM , DAMAGES OR
* OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE ,
* ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE .
*
* Authors : Ben Skeggs
*/
#include "mem.h"
#include "vmm.h"
#include <nvif/class .h>
/* Map from compressed to corresponding uncompressed storage type.
* The value 0 xff represents an invalid storage type .
*/
const u8 *
gf100_mmu_kind(struct nvkm_mmu *mmu, int *count, u8 *invalid)
{
static const u8
kind[256 ] = {
0 x00, 0 x01, 0 x01, 0 x01, 0 x01, 0 x01, 0 xff, 0 x01, /* 0x00 */
0 x01, 0 x01, 0 x01, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 x11, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 x11, /* 0x10 */
0 x11, 0 x11, 0 x11, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 x26, 0 x27, /* 0x20 */
0 x28, 0 x29, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, /* 0x30 */
0 xff, 0 xff, 0 x26, 0 x27, 0 x28, 0 x29, 0 x26, 0 x27,
0 x28, 0 x29, 0 xff, 0 xff, 0 xff, 0 xff, 0 x46, 0 xff, /* 0x40 */
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 x46, 0 x46, 0 x46, 0 x46, 0 xff, 0 xff, 0 xff, /* 0x50 */
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, /* 0x60 */
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, /* 0x70 */
0 xff, 0 xff, 0 xff, 0 x7b, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 x7b, 0 x7b, /* 0x80 */
0 x7b, 0 x7b, 0 xff, 0 x8b, 0 x8c, 0 x8d, 0 x8e, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, /* 0x90 */
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 x8b, 0 x8c, 0 x8d, 0 x8e, 0 xa7, /* 0xa0 */
0 xa8, 0 xa9, 0 xaa, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, /* 0xb0 */
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xa7,
0 xa8, 0 xa9, 0 xaa, 0 xc3, 0 xff, 0 xff, 0 xff, 0 xff, /* 0xc0 */
0 xff, 0 xff, 0 xff, 0 xff, 0 xfe, 0 xfe, 0 xc3, 0 xc3,
0 xc3, 0 xc3, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, /* 0xd0 */
0 xfe, 0 xff, 0 xff, 0 xfe, 0 xff, 0 xfe, 0 xff, 0 xfe,
0 xfe, 0 xff, 0 xfe, 0 xfe, 0 xfe, 0 xfe, 0 xfe, 0 xff, /* 0xe0 */
0 xff, 0 xfe, 0 xff, 0 xfe, 0 xff, 0 xfe, 0 xfe, 0 xff,
0 xfe, 0 xfe, 0 xfe, 0 xfe, 0 xfe, 0 xfe, 0 xfe, 0 xfe, /* 0xf0 */
0 xfe, 0 xfe, 0 xfe, 0 xfe, 0 xff, 0 xfd, 0 xfe, 0 xff
};
*count = ARRAY_SIZE(kind);
*invalid = 0 xff;
return kind;
}
static const struct nvkm_mmu_func
gf100_mmu = {
.dma_bits = 40 ,
.mmu = {{ -1 , -1 , NVIF_CLASS_MMU_GF100}},
.mem = {{ -1 , 0 , NVIF_CLASS_MEM_GF100}, gf100_mem_new, gf100_mem_map },
.vmm = {{ -1 , -1 , NVIF_CLASS_VMM_GF100}, gf100_vmm_new },
.kind = gf100_mmu_kind,
.kind_sys = true ,
};
int
gf100_mmu_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_mmu **pmmu)
{
return nvkm_mmu_new_(&gf100_mmu, device, type, inst, pmmu);
}
Messung V0.5 in Prozent C=81 H=100 G=90