0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include "priv.h"
0027 #include "ram.h"
0028
0029 static void
0030 nv44_fb_tile_init(struct nvkm_fb *fb, int i, u32 addr, u32 size, u32 pitch,
0031 u32 flags, struct nvkm_fb_tile *tile)
0032 {
0033 tile->addr = 0x00000001;
0034 tile->addr |= addr;
0035 tile->limit = max(1u, addr + size) - 1;
0036 tile->pitch = pitch;
0037 }
0038
0039 void
0040 nv44_fb_tile_prog(struct nvkm_fb *fb, int i, struct nvkm_fb_tile *tile)
0041 {
0042 struct nvkm_device *device = fb->subdev.device;
0043 nvkm_wr32(device, 0x100604 + (i * 0x10), tile->limit);
0044 nvkm_wr32(device, 0x100608 + (i * 0x10), tile->pitch);
0045 nvkm_wr32(device, 0x100600 + (i * 0x10), tile->addr);
0046 nvkm_rd32(device, 0x100600 + (i * 0x10));
0047 }
0048
0049 void
0050 nv44_fb_init(struct nvkm_fb *fb)
0051 {
0052 struct nvkm_device *device = fb->subdev.device;
0053 nvkm_wr32(device, 0x100850, 0x80000000);
0054 nvkm_wr32(device, 0x100800, 0x00000001);
0055 }
0056
0057 static const struct nvkm_fb_func
0058 nv44_fb = {
0059 .init = nv44_fb_init,
0060 .tile.regions = 12,
0061 .tile.init = nv44_fb_tile_init,
0062 .tile.fini = nv20_fb_tile_fini,
0063 .tile.prog = nv44_fb_tile_prog,
0064 .ram_new = nv44_ram_new,
0065 };
0066
0067 int
0068 nv44_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
0069 {
0070 return nvkm_fb_new_(&nv44_fb, device, type, inst, pfb);
0071 }