1*1571a7a1Sriastradh /* $NetBSD: nouveau_nvkm_subdev_fb_ramgf108.c,v 1.1.1.1 2021/12/18 20:15:41 riastradh Exp $ */ 2*1571a7a1Sriastradh 3*1571a7a1Sriastradh /* 4*1571a7a1Sriastradh * Copyright 2017 Red Hat Inc. 5*1571a7a1Sriastradh * 6*1571a7a1Sriastradh * Permission is hereby granted, free of charge, to any person obtaining a 7*1571a7a1Sriastradh * copy of this software and associated documentation files (the "Software"), 8*1571a7a1Sriastradh * to deal in the Software without restriction, including without limitation 9*1571a7a1Sriastradh * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10*1571a7a1Sriastradh * and/or sell copies of the Software, and to permit persons to whom the 11*1571a7a1Sriastradh * Software is furnished to do so, subject to the following conditions: 12*1571a7a1Sriastradh * 13*1571a7a1Sriastradh * The above copyright notice and this permission notice shall be included in 14*1571a7a1Sriastradh * all copies or substantial portions of the Software. 15*1571a7a1Sriastradh * 16*1571a7a1Sriastradh * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*1571a7a1Sriastradh * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*1571a7a1Sriastradh * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19*1571a7a1Sriastradh * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20*1571a7a1Sriastradh * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21*1571a7a1Sriastradh * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22*1571a7a1Sriastradh * OTHER DEALINGS IN THE SOFTWARE. 23*1571a7a1Sriastradh * 24*1571a7a1Sriastradh * Authors: Ben Skeggs <bskeggs@redhat.com> 25*1571a7a1Sriastradh */ 26*1571a7a1Sriastradh #include <sys/cdefs.h> 27*1571a7a1Sriastradh __KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_subdev_fb_ramgf108.c,v 1.1.1.1 2021/12/18 20:15:41 riastradh Exp $"); 28*1571a7a1Sriastradh 29*1571a7a1Sriastradh #include "ram.h" 30*1571a7a1Sriastradh 31*1571a7a1Sriastradh u32 32*1571a7a1Sriastradh gf108_ram_probe_fbp_amount(const struct nvkm_ram_func *func, u32 fbpao, 33*1571a7a1Sriastradh struct nvkm_device *device, int fbp, int *pltcs) 34*1571a7a1Sriastradh { 35*1571a7a1Sriastradh u32 fbpt = nvkm_rd32(device, 0x022438); 36*1571a7a1Sriastradh u32 fbpat = nvkm_rd32(device, 0x02243c); 37*1571a7a1Sriastradh u32 fbpas = fbpat / fbpt; 38*1571a7a1Sriastradh u32 fbpa = fbp * fbpas; 39*1571a7a1Sriastradh u32 size = 0; 40*1571a7a1Sriastradh while (fbpas--) { 41*1571a7a1Sriastradh if (!(fbpao & BIT(fbpa))) 42*1571a7a1Sriastradh size += func->probe_fbpa_amount(device, fbpa); 43*1571a7a1Sriastradh fbpa++; 44*1571a7a1Sriastradh } 45*1571a7a1Sriastradh *pltcs = 1; 46*1571a7a1Sriastradh return size; 47*1571a7a1Sriastradh } 48*1571a7a1Sriastradh 49*1571a7a1Sriastradh static const struct nvkm_ram_func 50*1571a7a1Sriastradh gf108_ram = { 51*1571a7a1Sriastradh .upper = 0x0200000000ULL, 52*1571a7a1Sriastradh .probe_fbp = gf100_ram_probe_fbp, 53*1571a7a1Sriastradh .probe_fbp_amount = gf108_ram_probe_fbp_amount, 54*1571a7a1Sriastradh .probe_fbpa_amount = gf100_ram_probe_fbpa_amount, 55*1571a7a1Sriastradh .init = gf100_ram_init, 56*1571a7a1Sriastradh .calc = gf100_ram_calc, 57*1571a7a1Sriastradh .prog = gf100_ram_prog, 58*1571a7a1Sriastradh .tidy = gf100_ram_tidy, 59*1571a7a1Sriastradh }; 60*1571a7a1Sriastradh 61*1571a7a1Sriastradh int 62*1571a7a1Sriastradh gf108_ram_new(struct nvkm_fb *fb, struct nvkm_ram **pram) 63*1571a7a1Sriastradh { 64*1571a7a1Sriastradh return gf100_ram_new_(&gf108_ram, fb, pram); 65*1571a7a1Sriastradh } 66