0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #include "priv.h"
0023
0024 static void
0025 ga100_mc_intr_unarm(struct nvkm_mc *mc)
0026 {
0027 nvkm_wr32(mc->subdev.device, 0xb81610, 0x00000004);
0028 }
0029
0030 static void
0031 ga100_mc_intr_rearm(struct nvkm_mc *mc)
0032 {
0033 nvkm_wr32(mc->subdev.device, 0xb81608, 0x00000004);
0034 }
0035
0036 static void
0037 ga100_mc_intr_mask(struct nvkm_mc *mc, u32 mask, u32 intr)
0038 {
0039 nvkm_wr32(mc->subdev.device, 0xb81210, mask & intr );
0040 nvkm_wr32(mc->subdev.device, 0xb81410, mask & ~(mask & intr));
0041 }
0042
0043 static u32
0044 ga100_mc_intr_stat(struct nvkm_mc *mc)
0045 {
0046 u32 intr_top = nvkm_rd32(mc->subdev.device, 0xb81600), intr = 0x00000000;
0047 if (intr_top & 0x00000004)
0048 intr = nvkm_mask(mc->subdev.device, 0xb81010, 0x00000000, 0x00000000);
0049 return intr;
0050 }
0051
0052 static void
0053 ga100_mc_init(struct nvkm_mc *mc)
0054 {
0055 nv50_mc_init(mc);
0056 nvkm_wr32(mc->subdev.device, 0xb81210, 0xffffffff);
0057 }
0058
0059 static const struct nvkm_mc_func
0060 ga100_mc = {
0061 .init = ga100_mc_init,
0062 .intr = gp100_mc_intr,
0063 .intr_unarm = ga100_mc_intr_unarm,
0064 .intr_rearm = ga100_mc_intr_rearm,
0065 .intr_mask = ga100_mc_intr_mask,
0066 .intr_stat = ga100_mc_intr_stat,
0067 .reset = gk104_mc_reset,
0068 };
0069
0070 int
0071 ga100_mc_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_mc **pmc)
0072 {
0073 return nvkm_mc_new_(&ga100_mc, device, type, inst, pmc);
0074 }