1 /* $NetBSD: nouveau_nvkm_subdev_gsp_base.c,v 1.2 2021/12/18 23:45:39 riastradh Exp $ */ 2 3 /* 4 * Copyright 2019 Red Hat Inc. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 #include <sys/cdefs.h> 25 __KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_subdev_gsp_base.c,v 1.2 2021/12/18 23:45:39 riastradh Exp $"); 26 27 #include "priv.h" 28 #include <core/falcon.h> 29 #include <core/firmware.h> 30 #include <subdev/acr.h> 31 #include <subdev/top.h> 32 33 static void * 34 nvkm_gsp_dtor(struct nvkm_subdev *subdev) 35 { 36 struct nvkm_gsp *gsp = nvkm_gsp(subdev); 37 nvkm_falcon_dtor(&gsp->falcon); 38 return gsp; 39 } 40 41 static const struct nvkm_subdev_func 42 nvkm_gsp = { 43 .dtor = nvkm_gsp_dtor, 44 }; 45 46 int 47 nvkm_gsp_new_(const struct nvkm_gsp_fwif *fwif, struct nvkm_device *device, 48 int index, struct nvkm_gsp **pgsp) 49 { 50 struct nvkm_gsp *gsp; 51 52 if (!(gsp = *pgsp = kzalloc(sizeof(*gsp), GFP_KERNEL))) 53 return -ENOMEM; 54 55 nvkm_subdev_ctor(&nvkm_gsp, device, index, &gsp->subdev); 56 57 fwif = nvkm_firmware_load(&gsp->subdev, fwif, "Gsp", gsp); 58 if (IS_ERR(fwif)) 59 return PTR_ERR(fwif); 60 61 return nvkm_falcon_ctor(fwif->flcn, &gsp->subdev, 62 nvkm_subdev_name[gsp->subdev.index], 0, 63 &gsp->falcon); 64 } 65