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 struct nvkm_bios
*bios
;
31 pramin_read(void *data
, u32 offset
, u32 length
, struct nvkm_bios
*bios
)
33 struct nvkm_device
*device
= bios
->subdev
.device
;
35 if (offset
+ length
<= 0x00100000) {
36 for (i
= offset
; i
< offset
+ length
; i
+= 4)
37 *(u32
*)&bios
->data
[i
] = nvkm_rd32(device
, 0x700000 + i
);
44 pramin_fini(void *data
)
46 struct priv
*priv
= data
;
48 struct nvkm_device
*device
= priv
->bios
->subdev
.device
;
49 nvkm_wr32(device
, 0x001700, priv
->bar0
);
55 pramin_init(struct nvkm_bios
*bios
, const char *name
)
57 struct nvkm_subdev
*subdev
= &bios
->subdev
;
58 struct nvkm_device
*device
= subdev
->device
;
59 struct priv
*priv
= NULL
;
62 /* PRAMIN always potentially available prior to nv50 */
63 if (device
->card_type
< NV_50
)
66 /* we can't get the bios image pointer without PDISP */
67 if (device
->card_type
>= GM100
)
68 addr
= nvkm_rd32(device
, 0x021c04);
70 if (device
->card_type
>= NV_C0
)
71 addr
= nvkm_rd32(device
, 0x022500);
72 if (addr
& 0x00000001) {
73 nvkm_debug(subdev
, "... display disabled\n");
74 return ERR_PTR(-ENODEV
);
77 /* check that the window is enabled and in vram, particularly
78 * important as we don't want to be touching vram on an
81 if (device
->card_type
>= GV100
)
82 addr
= nvkm_rd32(device
, 0x625f04);
84 addr
= nvkm_rd32(device
, 0x619f04);
85 if (!(addr
& 0x00000008)) {
86 nvkm_debug(subdev
, "... not enabled\n");
87 return ERR_PTR(-ENODEV
);
89 if ( (addr
& 0x00000003) != 1) {
90 nvkm_debug(subdev
, "... not in vram\n");
91 return ERR_PTR(-ENODEV
);
94 /* some alternate method inherited from xf86-video-nv... */
95 addr
= (addr
& 0xffffff00) << 8;
97 addr
= (u64
)nvkm_rd32(device
, 0x001700) << 16;
101 /* modify bar0 PRAMIN window to cover the bios image */
102 if (!(priv
= kmalloc(sizeof(*priv
), GFP_KERNEL
))) {
103 nvkm_error(subdev
, "... out of memory\n");
104 return ERR_PTR(-ENOMEM
);
108 priv
->bar0
= nvkm_rd32(device
, 0x001700);
109 nvkm_wr32(device
, 0x001700, addr
>> 16);
113 const struct nvbios_source