Lines Matching refs:falcon

12 #include "falcon.h"
20 static void falcon_writel(struct falcon *falcon, u32 value, u32 offset)
22 writel(value, falcon->regs + offset);
25 int falcon_wait_idle(struct falcon *falcon)
29 return readl_poll_timeout(falcon->regs + FALCON_IDLESTATE, value,
33 static int falcon_dma_wait_not_full(struct falcon *falcon)
37 return readl_poll_timeout(falcon->regs + FALCON_DMATRFCMD, value,
41 static int falcon_dma_wait_idle(struct falcon *falcon)
45 return readl_poll_timeout(falcon->regs + FALCON_DMATRFCMD, value,
49 static int falcon_copy_chunk(struct falcon *falcon,
68 err = falcon_dma_wait_not_full(falcon);
72 falcon_writel(falcon, offset, FALCON_DMATRFMOFFS);
73 falcon_writel(falcon, base, FALCON_DMATRFFBOFFS);
74 falcon_writel(falcon, cmd, FALCON_DMATRFCMD);
79 static void falcon_copy_firmware_image(struct falcon *falcon,
82 u32 *virt = falcon->firmware.virt;
90 static int falcon_parse_firmware_image(struct falcon *falcon)
92 struct falcon_fw_bin_header_v1 *bin = (void *)falcon->firmware.virt;
97 dev_err(falcon->dev, "incorrect firmware magic\n");
103 dev_err(falcon->dev, "unsupported firmware version\n");
108 if (bin->size > falcon->firmware.size) {
109 dev_err(falcon->dev, "firmware image size inconsistency\n");
113 os = falcon->firmware.virt + bin->os_header_offset;
115 falcon->firmware.bin_data.size = bin->os_size;
116 falcon->firmware.bin_data.offset = bin->os_data_offset;
117 falcon->firmware.code.offset = os->code_offset;
118 falcon->firmware.code.size = os->code_size;
119 falcon->firmware.data.offset = os->data_offset;
120 falcon->firmware.data.size = os->data_size;
125 int falcon_read_firmware(struct falcon *falcon, const char *name)
130 err = request_firmware(&falcon->firmware.firmware, name, falcon->dev);
134 falcon->firmware.size = falcon->firmware.firmware->size;
139 int falcon_load_firmware(struct falcon *falcon)
141 const struct firmware *firmware = falcon->firmware.firmware;
145 falcon_copy_firmware_image(falcon, firmware);
148 err = falcon_parse_firmware_image(falcon);
150 dev_err(falcon->dev, "failed to parse firmware image\n");
155 falcon->firmware.firmware = NULL;
160 int falcon_init(struct falcon *falcon)
162 falcon->firmware.virt = NULL;
167 void falcon_exit(struct falcon *falcon)
169 if (falcon->firmware.firmware)
170 release_firmware(falcon->firmware.firmware);
173 int falcon_boot(struct falcon *falcon)
179 if (!falcon->firmware.virt)
182 err = readl_poll_timeout(falcon->regs + FALCON_DMACTL, value,
189 falcon_writel(falcon, 0, FALCON_DMACTL);
192 falcon_writel(falcon, (falcon->firmware.iova +
193 falcon->firmware.bin_data.offset) >> 8,
197 for (offset = 0; offset < falcon->firmware.data.size; offset += 256)
198 falcon_copy_chunk(falcon,
199 falcon->firmware.data.offset + offset,
203 for (offset = 0; offset < falcon->firmware.code.size; offset += 256)
204 falcon_copy_chunk(falcon, falcon->firmware.code.offset + offset,
208 err = falcon_dma_wait_idle(falcon);
212 /* setup falcon interrupts */
213 falcon_writel(falcon, FALCON_IRQMSET_EXT(0xff) |
220 falcon_writel(falcon, FALCON_IRQDEST_EXT(0xff) |
228 falcon_writel(falcon, FALCON_ITFEN_MTHDEN |
232 /* boot falcon */
233 falcon_writel(falcon, 0x00000000, FALCON_BOOTVEC);
234 falcon_writel(falcon, FALCON_CPUCTL_STARTCPU, FALCON_CPUCTL);
236 err = falcon_wait_idle(falcon);
238 dev_err(falcon->dev, "Falcon boot failed due to timeout\n");
245 void falcon_execute_method(struct falcon *falcon, u32 method, u32 data)
247 falcon_writel(falcon, method >> 2, FALCON_UCLASS_METHOD_OFFSET);
248 falcon_writel(falcon, data, FALCON_UCLASS_METHOD_DATA);