- 根目录:
- drivers
- gpu
- drm
- nouveau
- core
- subdev
- ibus
- nve0.c
#include <subdev/ibus.h>
struct nve0_ibus_priv {
struct nouveau_ibus base;
};
static void
nve0_ibus_intr_hub(struct nve0_ibus_priv *priv, int i)
{
u32 addr = nv_rd32(priv, 0x122120 + (i * 0x0800));
u32 data = nv_rd32(priv, 0x122124 + (i * 0x0800));
u32 stat = nv_rd32(priv, 0x122128 + (i * 0x0800));
nv_error(priv, "HUB%d: 0x%06x 0x%08x (0x%08x)\n", i, addr, data, stat);
nv_mask(priv, 0x122128 + (i * 0x0800), 0x00000200, 0x00000000);
}
static void
nve0_ibus_intr_rop(struct nve0_ibus_priv *priv, int i)
{
u32 addr = nv_rd32(priv, 0x124120 + (i * 0x0800));
u32 data = nv_rd32(priv, 0x124124 + (i * 0x0800));
u32 stat = nv_rd32(priv, 0x124128 + (i * 0x0800));
nv_error(priv, "ROP%d: 0x%06x 0x%08x (0x%08x)\n", i, addr, data, stat);
nv_mask(priv, 0x124128 + (i * 0x0800), 0x00000200, 0x00000000);
}
static void
nve0_ibus_intr_gpc(struct nve0_ibus_priv *priv, int i)
{
u32 addr = nv_rd32(priv, 0x128120 + (i * 0x0800));
u32 data = nv_rd32(priv, 0x128124 + (i * 0x0800));
u32 stat = nv_rd32(priv, 0x128128 + (i * 0x0800));
nv_error(priv, "GPC%d: 0x%06x 0x%08x (0x%08x)\n", i, addr, data, stat);
nv_mask(priv, 0x128128 + (i * 0x0800), 0x00000200, 0x00000000);
}
static void
nve0_ibus_intr(struct nouveau_subdev *subdev)
{
struct nve0_ibus_priv *priv = (void *)subdev;
u32 intr0 = nv_rd32(priv, 0x120058);
u32 intr1 = nv_rd32(priv, 0x12005c);
u32 hubnr = nv_rd32(priv, 0x120070);
u32 ropnr = nv_rd32(priv, 0x120074);
u32 gpcnr = nv_rd32(priv, 0x120078);
u32 i;
for (i = 0; (intr0 & 0x0000ff00) && i < hubnr; i++) {
u32 stat = 0x00000100 << i;
if (intr0 & stat) {
nve0_ibus_intr_hub(priv, i);
intr0 &= ~stat;
}
}
for (i = 0; (intr0 & 0xffff0000) && i < ropnr; i++) {
u32 stat = 0x00010000 << i;
if (intr0 & stat) {
nve0_ibus_intr_rop(priv, i);
intr0 &= ~stat;
}
}
for (i = 0; intr1 && i < gpcnr; i++) {
u32 stat = 0x00000001 << i;
if (intr1 & stat) {
nve0_ibus_intr_gpc(priv, i);
intr1 &= ~stat;
}
}
}
static int
nve0_ibus_init(struct nouveau_object *object)
{
struct nve0_ibus_priv *priv = (void *)object;
int ret = nouveau_ibus_init(&priv->base);
if (ret == 0) {
nv_mask(priv, 0x122318, 0x0003ffff, 0x00001000);
nv_mask(priv, 0x12231c, 0x0003ffff, 0x00000200);
nv_mask(priv, 0x122310, 0x0003ffff, 0x00000800);
nv_mask(priv, 0x122348, 0x0003ffff, 0x00000100);
nv_mask(priv, 0x1223b0, 0x0003ffff, 0x00000fff);
nv_mask(priv, 0x122348, 0x0003ffff, 0x00000200);
nv_mask(priv, 0x122358, 0x0003ffff, 0x00002880);
}
return ret;
}
static int
nve0_ibus_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
struct nouveau_oclass *oclass, void *data, u32 size,
struct nouveau_object **pobject)
{
struct nve0_ibus_priv *priv;
int ret;
ret = nouveau_ibus_create(parent, engine, oclass, &priv);
*pobject = nv_object(priv);
if (ret)
return ret;
nv_subdev(priv)->intr = nve0_ibus_intr;
return 0;
}
struct nouveau_oclass
nve0_ibus_oclass = {
.handle = NV_SUBDEV(IBUS, 0xe0),
.ofuncs = &(struct nouveau_ofuncs) {
.ctor = nve0_ibus_ctor,
.dtor = _nouveau_ibus_dtor,
.init = nve0_ibus_init,
.fini = _nouveau_ibus_fini,
},
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140