cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

oproxy.c (5525B)


      1/*
      2 * Copyright 2015 Red Hat Inc.
      3 *
      4 * Permission is hereby granted, free of charge, to any person obtaining a
      5 * copy of this software and associated documentation files (the "Software"),
      6 * to deal in the Software without restriction, including without limitation
      7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8 * and/or sell copies of the Software, and to permit persons to whom the
      9 * Software is furnished to do so, subject to the following conditions:
     10 *
     11 * The above copyright notice and this permission notice shall be included in
     12 * all copies or substantial portions of the Software.
     13 *
     14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     20 * OTHER DEALINGS IN THE SOFTWARE.
     21 *
     22 * Authors: Ben Skeggs <bskeggs@redhat.com>
     23 */
     24#include <core/oproxy.h>
     25
     26static int
     27nvkm_oproxy_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
     28{
     29	return nvkm_object_mthd(nvkm_oproxy(object)->object, mthd, data, size);
     30}
     31
     32static int
     33nvkm_oproxy_ntfy(struct nvkm_object *object, u32 mthd,
     34		 struct nvkm_event **pevent)
     35{
     36	return nvkm_object_ntfy(nvkm_oproxy(object)->object, mthd, pevent);
     37}
     38
     39static int
     40nvkm_oproxy_map(struct nvkm_object *object, void *argv, u32 argc,
     41		enum nvkm_object_map *type, u64 *addr, u64 *size)
     42{
     43	struct nvkm_oproxy *oproxy = nvkm_oproxy(object);
     44	return nvkm_object_map(oproxy->object, argv, argc, type, addr, size);
     45}
     46
     47static int
     48nvkm_oproxy_unmap(struct nvkm_object *object)
     49{
     50	return nvkm_object_unmap(nvkm_oproxy(object)->object);
     51}
     52
     53static int
     54nvkm_oproxy_rd08(struct nvkm_object *object, u64 addr, u8 *data)
     55{
     56	return nvkm_object_rd08(nvkm_oproxy(object)->object, addr, data);
     57}
     58
     59static int
     60nvkm_oproxy_rd16(struct nvkm_object *object, u64 addr, u16 *data)
     61{
     62	return nvkm_object_rd16(nvkm_oproxy(object)->object, addr, data);
     63}
     64
     65static int
     66nvkm_oproxy_rd32(struct nvkm_object *object, u64 addr, u32 *data)
     67{
     68	return nvkm_object_rd32(nvkm_oproxy(object)->object, addr, data);
     69}
     70
     71static int
     72nvkm_oproxy_wr08(struct nvkm_object *object, u64 addr, u8 data)
     73{
     74	return nvkm_object_wr08(nvkm_oproxy(object)->object, addr, data);
     75}
     76
     77static int
     78nvkm_oproxy_wr16(struct nvkm_object *object, u64 addr, u16 data)
     79{
     80	return nvkm_object_wr16(nvkm_oproxy(object)->object, addr, data);
     81}
     82
     83static int
     84nvkm_oproxy_wr32(struct nvkm_object *object, u64 addr, u32 data)
     85{
     86	return nvkm_object_wr32(nvkm_oproxy(object)->object, addr, data);
     87}
     88
     89static int
     90nvkm_oproxy_bind(struct nvkm_object *object, struct nvkm_gpuobj *parent,
     91		 int align, struct nvkm_gpuobj **pgpuobj)
     92{
     93	return nvkm_object_bind(nvkm_oproxy(object)->object,
     94				parent, align, pgpuobj);
     95}
     96
     97static int
     98nvkm_oproxy_sclass(struct nvkm_object *object, int index,
     99		   struct nvkm_oclass *oclass)
    100{
    101	struct nvkm_oproxy *oproxy = nvkm_oproxy(object);
    102	oclass->parent = oproxy->object;
    103	if (!oproxy->object->func->sclass)
    104		return -ENODEV;
    105	return oproxy->object->func->sclass(oproxy->object, index, oclass);
    106}
    107
    108static int
    109nvkm_oproxy_fini(struct nvkm_object *object, bool suspend)
    110{
    111	struct nvkm_oproxy *oproxy = nvkm_oproxy(object);
    112	int ret;
    113
    114	if (oproxy->func->fini[0]) {
    115		ret = oproxy->func->fini[0](oproxy, suspend);
    116		if (ret && suspend)
    117			return ret;
    118	}
    119
    120	if (oproxy->object->func->fini) {
    121		ret = oproxy->object->func->fini(oproxy->object, suspend);
    122		if (ret && suspend)
    123			return ret;
    124	}
    125
    126	if (oproxy->func->fini[1]) {
    127		ret = oproxy->func->fini[1](oproxy, suspend);
    128		if (ret && suspend)
    129			return ret;
    130	}
    131
    132	return 0;
    133}
    134
    135static int
    136nvkm_oproxy_init(struct nvkm_object *object)
    137{
    138	struct nvkm_oproxy *oproxy = nvkm_oproxy(object);
    139	int ret;
    140
    141	if (oproxy->func->init[0]) {
    142		ret = oproxy->func->init[0](oproxy);
    143		if (ret)
    144			return ret;
    145	}
    146
    147	if (oproxy->object->func->init) {
    148		ret = oproxy->object->func->init(oproxy->object);
    149		if (ret)
    150			return ret;
    151	}
    152
    153	if (oproxy->func->init[1]) {
    154		ret = oproxy->func->init[1](oproxy);
    155		if (ret)
    156			return ret;
    157	}
    158
    159	return 0;
    160}
    161
    162static void *
    163nvkm_oproxy_dtor(struct nvkm_object *object)
    164{
    165	struct nvkm_oproxy *oproxy = nvkm_oproxy(object);
    166	if (oproxy->func->dtor[0])
    167		oproxy->func->dtor[0](oproxy);
    168	nvkm_object_del(&oproxy->object);
    169	if (oproxy->func->dtor[1])
    170		oproxy->func->dtor[1](oproxy);
    171	return oproxy;
    172}
    173
    174static const struct nvkm_object_func
    175nvkm_oproxy_func = {
    176	.dtor = nvkm_oproxy_dtor,
    177	.init = nvkm_oproxy_init,
    178	.fini = nvkm_oproxy_fini,
    179	.mthd = nvkm_oproxy_mthd,
    180	.ntfy = nvkm_oproxy_ntfy,
    181	.map = nvkm_oproxy_map,
    182	.unmap = nvkm_oproxy_unmap,
    183	.rd08 = nvkm_oproxy_rd08,
    184	.rd16 = nvkm_oproxy_rd16,
    185	.rd32 = nvkm_oproxy_rd32,
    186	.wr08 = nvkm_oproxy_wr08,
    187	.wr16 = nvkm_oproxy_wr16,
    188	.wr32 = nvkm_oproxy_wr32,
    189	.bind = nvkm_oproxy_bind,
    190	.sclass = nvkm_oproxy_sclass,
    191};
    192
    193void
    194nvkm_oproxy_ctor(const struct nvkm_oproxy_func *func,
    195		 const struct nvkm_oclass *oclass, struct nvkm_oproxy *oproxy)
    196{
    197	nvkm_object_ctor(&nvkm_oproxy_func, oclass, &oproxy->base);
    198	oproxy->func = func;
    199}
    200
    201int
    202nvkm_oproxy_new_(const struct nvkm_oproxy_func *func,
    203		 const struct nvkm_oclass *oclass, struct nvkm_oproxy **poproxy)
    204{
    205	if (!(*poproxy = kzalloc(sizeof(**poproxy), GFP_KERNEL)))
    206		return -ENOMEM;
    207	nvkm_oproxy_ctor(func, oclass, *poproxy);
    208	return 0;
    209}