1 #ifndef __NVKM_BUS_HWSQ_H__
2 #define __NVKM_BUS_HWSQ_H__
3 #include <subdev/bus.h>
6 struct nvkm_subdev *subdev;
7 struct nvkm_hwsq *hwsq;
15 u32 stride; /* in bytes */
20 static inline struct hwsq_reg
21 hwsq_stride(u32 addr, u32 stride, u32 mask)
23 return (struct hwsq_reg) {
33 static inline struct hwsq_reg
34 hwsq_reg2(u32 addr1, u32 addr2)
36 return (struct hwsq_reg) {
40 .stride = addr2 - addr1,
46 static inline struct hwsq_reg
49 return (struct hwsq_reg) {
60 hwsq_init(struct hwsq *ram, struct nvkm_subdev *subdev)
64 ret = nvkm_hwsq_init(subdev, &ram->hwsq);
74 hwsq_exec(struct hwsq *ram, bool exec)
78 ret = nvkm_hwsq_fini(&ram->hwsq, exec);
85 hwsq_rd32(struct hwsq *ram, struct hwsq_reg *reg)
87 struct nvkm_device *device = ram->subdev->device;
88 if (reg->sequence != ram->sequence)
89 reg->data = nvkm_rd32(device, reg->addr);
94 hwsq_wr32(struct hwsq *ram, struct hwsq_reg *reg, u32 data)
98 reg->sequence = ram->sequence;
101 for (mask = reg->mask; mask > 0; mask = (mask & ~1) >> 1) {
103 nvkm_hwsq_wr32(ram->hwsq, reg->addr+off, reg->data);
110 hwsq_nuke(struct hwsq *ram, struct hwsq_reg *reg)
116 hwsq_mask(struct hwsq *ram, struct hwsq_reg *reg, u32 mask, u32 data)
118 u32 temp = hwsq_rd32(ram, reg);
119 if (temp != ((temp & ~mask) | data) || reg->force)
120 hwsq_wr32(ram, reg, (temp & ~mask) | data);
125 hwsq_setf(struct hwsq *ram, u8 flag, int data)
127 nvkm_hwsq_setf(ram->hwsq, flag, data);
131 hwsq_wait(struct hwsq *ram, u8 flag, u8 data)
133 nvkm_hwsq_wait(ram->hwsq, flag, data);
137 hwsq_wait_vblank(struct hwsq *ram)
139 nvkm_hwsq_wait_vblank(ram->hwsq);
143 hwsq_nsec(struct hwsq *ram, u32 nsec)
145 nvkm_hwsq_nsec(ram->hwsq, nsec);