2 * Copyright 2012 Red Hat Inc.
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:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
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.
26 #include <subdev/bios.h>
27 #include <subdev/bios/M0203.h>
30 nvkm_fb_bios_memtype(struct nvkm_bios
*bios
)
32 const u8 ramcfg
= (nv_rd32(bios
, 0x101000) & 0x0000003c) >> 2;
33 struct nvbios_M0203E M0203E
;
36 if (nvbios_M0203Em(bios
, ramcfg
, &ver
, &hdr
, &M0203E
)) {
37 switch (M0203E
.type
) {
38 case M0203E_TYPE_DDR2
: return NV_MEM_TYPE_DDR2
;
39 case M0203E_TYPE_DDR3
: return NV_MEM_TYPE_DDR3
;
40 case M0203E_TYPE_GDDR3
: return NV_MEM_TYPE_GDDR3
;
41 case M0203E_TYPE_GDDR5
: return NV_MEM_TYPE_GDDR5
;
43 nv_warn(bios
, "M0203E type %02x\n", M0203E
.type
);
44 return NV_MEM_TYPE_UNKNOWN
;
48 nv_warn(bios
, "M0203E not matched!\n");
49 return NV_MEM_TYPE_UNKNOWN
;
53 _nvkm_fb_fini(struct nvkm_object
*object
, bool suspend
)
55 struct nvkm_fb
*pfb
= (void *)object
;
58 ret
= nv_ofuncs(pfb
->ram
)->fini(nv_object(pfb
->ram
), suspend
);
62 return nvkm_subdev_fini(&pfb
->base
, suspend
);
66 _nvkm_fb_init(struct nvkm_object
*object
)
68 struct nvkm_fb
*pfb
= (void *)object
;
71 ret
= nvkm_subdev_init(&pfb
->base
);
75 ret
= nv_ofuncs(pfb
->ram
)->init(nv_object(pfb
->ram
));
79 for (i
= 0; i
< pfb
->tile
.regions
; i
++)
80 pfb
->tile
.prog(pfb
, i
, &pfb
->tile
.region
[i
]);
86 _nvkm_fb_dtor(struct nvkm_object
*object
)
88 struct nvkm_fb
*pfb
= (void *)object
;
91 for (i
= 0; i
< pfb
->tile
.regions
; i
++)
92 pfb
->tile
.fini(pfb
, i
, &pfb
->tile
.region
[i
]);
93 nvkm_mm_fini(&pfb
->tags
);
94 nvkm_mm_fini(&pfb
->vram
);
96 nvkm_object_ref(NULL
, (struct nvkm_object
**)&pfb
->ram
);
97 nvkm_subdev_destroy(&pfb
->base
);
101 nvkm_fb_create_(struct nvkm_object
*parent
, struct nvkm_object
*engine
,
102 struct nvkm_oclass
*oclass
, int length
, void **pobject
)
104 struct nvkm_fb_impl
*impl
= (void *)oclass
;
105 static const char *name
[] = {
106 [NV_MEM_TYPE_UNKNOWN
] = "unknown",
107 [NV_MEM_TYPE_STOLEN
] = "stolen system memory",
108 [NV_MEM_TYPE_SGRAM
] = "SGRAM",
109 [NV_MEM_TYPE_SDRAM
] = "SDRAM",
110 [NV_MEM_TYPE_DDR1
] = "DDR1",
111 [NV_MEM_TYPE_DDR2
] = "DDR2",
112 [NV_MEM_TYPE_DDR3
] = "DDR3",
113 [NV_MEM_TYPE_GDDR2
] = "GDDR2",
114 [NV_MEM_TYPE_GDDR3
] = "GDDR3",
115 [NV_MEM_TYPE_GDDR4
] = "GDDR4",
116 [NV_MEM_TYPE_GDDR5
] = "GDDR5",
118 struct nvkm_object
*ram
;
122 ret
= nvkm_subdev_create_(parent
, engine
, oclass
, 0, "PFB", "fb",
128 pfb
->memtype_valid
= impl
->memtype
;
130 ret
= nvkm_object_ctor(nv_object(pfb
), NULL
, impl
->ram
, NULL
, 0, &ram
);
132 nv_fatal(pfb
, "error detecting memory configuration!!\n");
136 pfb
->ram
= (void *)ram
;
138 if (!nvkm_mm_initialised(&pfb
->vram
)) {
139 ret
= nvkm_mm_init(&pfb
->vram
, 0, pfb
->ram
->size
>> 12, 1);
144 if (!nvkm_mm_initialised(&pfb
->tags
)) {
145 ret
= nvkm_mm_init(&pfb
->tags
, 0, pfb
->ram
->tags
?
146 ++pfb
->ram
->tags
: 0, 1);
151 nv_info(pfb
, "RAM type: %s\n", name
[pfb
->ram
->type
]);
152 nv_info(pfb
, "RAM size: %d MiB\n", (int)(pfb
->ram
->size
>> 20));
153 nv_info(pfb
, " ZCOMP: %d tags\n", pfb
->ram
->tags
);