Lines Matching refs:master

4  * A FSI master controller, using a simple GPIO bit-banging interface
25 #include "fsi-master.h"
88 struct fsi_master master;
120 #define to_fsi_master_acf(m) container_of(m, struct fsi_master_acf, master)
159 static bool check_same_address(struct fsi_master_acf *master, int id,
163 return master->last_addr == (((id & 0x3) << 21) | (addr & ~0x3));
166 static bool check_relative_address(struct fsi_master_acf *master, int id,
169 uint32_t last_addr = master->last_addr;
196 static void last_address_update(struct fsi_master_acf *master,
200 master->last_addr = LAST_ADDR_INVALID;
202 master->last_addr = ((id & 0x3) << 21) | (addr & ~0x3);
208 static void build_ar_command(struct fsi_master_acf *master,
227 if (check_same_address(master, id, addr)) {
232 trace_fsi_master_acf_cmd_same_addr(master);
234 } else if (check_relative_address(master, id, addr, &rel_addr)) {
239 trace_fsi_master_acf_cmd_rel_addr(master, rel_addr);
244 trace_fsi_master_acf_cmd_abs_addr(master, addr);
307 static int do_copro_command(struct fsi_master_acf *master, uint32_t op)
312 trace_fsi_master_acf_copro_command(master, op);
315 iowrite32be(op, master->sram + CMD_STAT_REG);
318 if (master->cvic)
319 iowrite32(0x2, master->cvic + CVIC_TRIG_REG);
324 dev_warn(master->dev,
328 stat = ioread8(master->sram + CMD_STAT_REG);
344 static int clock_zeros(struct fsi_master_acf *master, int count)
349 rc = do_copro_command(master,
358 static int send_request(struct fsi_master_acf *master, struct fsi_msg *cmd,
363 trace_fsi_master_acf_send_request(master, cmd, resp_bits);
366 iowrite32be((cmd->msg >> 32), master->sram + CMD_DATA);
367 iowrite32be((cmd->msg & 0xffffffff), master->sram + CMD_DATA + 4);
374 return do_copro_command(master, op);
377 static int read_copro_response(struct fsi_master_acf *master, uint8_t size,
380 uint8_t rtag = ioread8(master->sram + STAT_RTAG) & 0xf;
381 uint8_t rcrc = ioread8(master->sram + STAT_RCRC) & 0xf;
392 rdata = ioread32be(master->sram + RSP_DATA);
399 trace_fsi_master_acf_copro_response(master, rtag, rcrc, rdata, crc == 0);
408 dev_dbg(master->dev, "Bad response CRC !\n");
414 static int send_term(struct fsi_master_acf *master, uint8_t slave)
422 rc = send_request(master, &cmd, 0);
424 dev_warn(master->dev, "Error %d sending term\n", rc);
428 rc = read_copro_response(master, 0, NULL, &tag);
430 dev_err(master->dev,
434 dev_err(master->dev, "TERM failed; response %d\n", tag);
440 static void dump_ucode_trace(struct fsi_master_acf *master)
446 dev_dbg(master->dev,
448 ioread32be(master->sram + CMD_STAT_REG),
449 ioread8(master->sram + STAT_RTAG),
450 ioread8(master->sram + STAT_RCRC),
451 ioread32be(master->sram + RSP_DATA),
452 ioread32be(master->sram + INT_CNT));
458 v = ioread8(master->sram + TRACEBUF + i);
461 dev_dbg(master->dev, "%s\n", trbuf);
467 static int handle_response(struct fsi_master_acf *master,
476 rc = read_copro_response(master, size, &response, &tag);
489 trace_fsi_master_acf_crc_rsp_error(master, crc_err_retries);
490 if (master->trace_enabled)
491 dump_ucode_trace(master);
492 rc = clock_zeros(master, FSI_MASTER_EPOLL_CLOCKS);
494 dev_warn(master->dev,
499 rc = send_request(master, &cmd, size);
501 dev_warn(master->dev, "Error %d sending E_POLL\n", rc);
526 dev_dbg(master->dev, "Busy, retrying...\n");
527 if (master->trace_enabled)
528 dump_ucode_trace(master);
529 rc = clock_zeros(master, FSI_MASTER_DPOLL_CLOCKS);
531 dev_warn(master->dev,
537 rc = send_request(master, &cmd, size);
539 dev_warn(master->dev, "Error %d sending D_POLL\n", rc);
544 dev_dbg(master->dev,
546 send_term(master, slave);
551 dev_dbg(master->dev, "ERRA received\n");
552 if (master->trace_enabled)
553 dump_ucode_trace(master);
557 dev_dbg(master->dev, "ERRC received\n");
558 if (master->trace_enabled)
559 dump_ucode_trace(master);
565 trace_fsi_master_acf_poll_response_busy(master, busy_count);
571 static int fsi_master_acf_xfer(struct fsi_master_acf *master, uint8_t slave,
578 rc = send_request(master, cmd, resp_len);
581 dev_warn(master->dev, "Error %d sending command\n", rc);
584 rc = handle_response(master, slave, resp_len, resp);
588 dev_dbg(master->dev, "ECRC retry %d\n", retries);
601 struct fsi_master_acf *master = to_fsi_master_acf(_master);
608 mutex_lock(&master->lock);
609 dev_dbg(master->dev, "read id %d addr %x size %zd\n", id, addr, size);
610 build_ar_command(master, &cmd, id, addr, size, NULL);
611 rc = fsi_master_acf_xfer(master, id, &cmd, size, val);
612 last_address_update(master, id, rc == 0, addr);
614 dev_dbg(master->dev, "read id %d addr 0x%08x err: %d\n",
616 mutex_unlock(&master->lock);
625 struct fsi_master_acf *master = to_fsi_master_acf(_master);
632 mutex_lock(&master->lock);
633 build_ar_command(master, &cmd, id, addr, size, val);
634 dev_dbg(master->dev, "write id %d addr %x size %zd raw_data: %08x\n",
636 rc = fsi_master_acf_xfer(master, id, &cmd, 0, NULL);
637 last_address_update(master, id, rc == 0, addr);
639 dev_dbg(master->dev, "write id %d addr 0x%08x err: %d\n",
641 mutex_unlock(&master->lock);
649 struct fsi_master_acf *master = to_fsi_master_acf(_master);
656 mutex_lock(&master->lock);
658 dev_dbg(master->dev, "term id %d\n", id);
659 rc = fsi_master_acf_xfer(master, id, &cmd, 0, NULL);
660 last_address_update(master, id, false, 0);
661 mutex_unlock(&master->lock);
668 struct fsi_master_acf *master = to_fsi_master_acf(_master);
674 mutex_lock(&master->lock);
675 if (master->external_mode) {
676 mutex_unlock(&master->lock);
679 dev_dbg(master->dev, "sending BREAK\n");
680 rc = do_copro_command(master, CMD_BREAK);
681 last_address_update(master, 0, false, 0);
682 mutex_unlock(&master->lock);
690 static void reset_cf(struct fsi_master_acf *master)
692 regmap_write(master->scu, SCU_COPRO_CTRL, SCU_COPRO_RESET);
694 regmap_write(master->scu, SCU_COPRO_CTRL, 0);
698 static void start_cf(struct fsi_master_acf *master)
700 regmap_write(master->scu, SCU_COPRO_CTRL, SCU_COPRO_CLK_EN);
703 static void setup_ast2500_cf_maps(struct fsi_master_acf *master)
722 regmap_write(master->scu, SCU_2500_COPRO_SEG0, master->cf_mem_addr |
726 regmap_write(master->scu, SCU_2500_COPRO_SEG2, SYSREG_BASE |
728 regmap_write(master->scu, SCU_2500_COPRO_SEG3, SYSREG_BASE | 0x100000 |
732 regmap_write(master->scu, SCU_2500_COPRO_SEG6, SYSREG_BASE);
733 regmap_write(master->scu, SCU_2500_COPRO_SEG7, SYSREG_BASE | 0x100000);
736 regmap_write(master->scu, SCU_2500_COPRO_CACHE_CTL,
740 static void setup_ast2400_cf_maps(struct fsi_master_acf *master)
743 regmap_write(master->scu, SCU_2400_COPRO_SEG0, master->cf_mem_addr |
747 regmap_write(master->scu, SCU_2400_COPRO_SEG2, SYSREG_BASE |
751 regmap_write(master->scu, SCU_2400_COPRO_SEG6, SYSREG_BASE);
754 regmap_write(master->scu, SCU_2400_COPRO_CACHE_CTL,
758 static void setup_common_fw_config(struct fsi_master_acf *master,
761 iowrite16be(master->gpio_clk_vreg, base + HDR_CLOCK_GPIO_VADDR);
762 iowrite16be(master->gpio_clk_dreg, base + HDR_CLOCK_GPIO_DADDR);
763 iowrite16be(master->gpio_dat_vreg, base + HDR_DATA_GPIO_VADDR);
764 iowrite16be(master->gpio_dat_dreg, base + HDR_DATA_GPIO_DADDR);
765 iowrite16be(master->gpio_tra_vreg, base + HDR_TRANS_GPIO_VADDR);
766 iowrite16be(master->gpio_tra_dreg, base + HDR_TRANS_GPIO_DADDR);
767 iowrite8(master->gpio_clk_bit, base + HDR_CLOCK_GPIO_BIT);
768 iowrite8(master->gpio_dat_bit, base + HDR_DATA_GPIO_BIT);
769 iowrite8(master->gpio_tra_bit, base + HDR_TRANS_GPIO_BIT);
772 static void setup_ast2500_fw_config(struct fsi_master_acf *master)
774 void __iomem *base = master->cf_mem + HDR_OFFSET;
776 setup_common_fw_config(master, base);
780 static void setup_ast2400_fw_config(struct fsi_master_acf *master)
782 void __iomem *base = master->cf_mem + HDR_OFFSET;
784 setup_common_fw_config(master, base);
788 static int setup_gpios_for_copro(struct fsi_master_acf *master)
794 gpiod_direction_output(master->gpio_mux, 1);
795 gpiod_direction_output(master->gpio_enable, 1);
798 rc = aspeed_gpio_copro_grab_gpio(master->gpio_clk, &master->gpio_clk_vreg,
799 &master->gpio_clk_dreg, &master->gpio_clk_bit);
801 dev_err(master->dev, "failed to assign clock gpio to coprocessor\n");
804 rc = aspeed_gpio_copro_grab_gpio(master->gpio_data, &master->gpio_dat_vreg,
805 &master->gpio_dat_dreg, &master->gpio_dat_bit);
807 dev_err(master->dev, "failed to assign data gpio to coprocessor\n");
808 aspeed_gpio_copro_release_gpio(master->gpio_clk);
811 rc = aspeed_gpio_copro_grab_gpio(master->gpio_trans, &master->gpio_tra_vreg,
812 &master->gpio_tra_dreg, &master->gpio_tra_bit);
814 dev_err(master->dev, "failed to assign trans gpio to coprocessor\n");
815 aspeed_gpio_copro_release_gpio(master->gpio_clk);
816 aspeed_gpio_copro_release_gpio(master->gpio_data);
822 static void release_copro_gpios(struct fsi_master_acf *master)
824 aspeed_gpio_copro_release_gpio(master->gpio_clk);
825 aspeed_gpio_copro_release_gpio(master->gpio_data);
826 aspeed_gpio_copro_release_gpio(master->gpio_trans);
829 static int load_copro_firmware(struct fsi_master_acf *master)
838 rc = request_firmware(&fw, FW_FILE_NAME, master->dev);
841 master->dev, "Error %d to load firmware '%s' !\n",
847 if (master->gpio_clk_vreg == master->gpio_dat_vreg)
851 dev_dbg(master->dev, "Looking for image sig %04x\n", wanted_sig);
862 dev_err(master->dev, "Failed to locate image sig %04x in FW blob\n",
867 if (size > master->cf_mem_size) {
868 dev_err(master->dev, "FW size (%zd) bigger than memory reserve (%zd)\n",
869 fw->size, master->cf_mem_size);
872 memcpy_toio(master->cf_mem, data, size);
880 static int check_firmware_image(struct fsi_master_acf *master)
884 fw_vers = ioread16be(master->cf_mem + HDR_OFFSET + HDR_FW_VERS);
885 fw_api = ioread16be(master->cf_mem + HDR_OFFSET + HDR_API_VERS);
886 fw_options = ioread32be(master->cf_mem + HDR_OFFSET + HDR_FW_OPTIONS);
887 master->trace_enabled = !!(fw_options & FW_OPTION_TRACE_EN);
890 dev_info(master->dev, "ColdFire initialized, firmware v%d API v%d.%d (trace %s)\n",
892 master->trace_enabled ? "enabled" : "disabled");
895 dev_err(master->dev, "Unsupported coprocessor API version !\n");
902 static int copro_enable_sw_irq(struct fsi_master_acf *master)
912 iowrite32(0x2, master->cvic + CVIC_EN_REG);
913 val = ioread32(master->cvic + CVIC_EN_REG);
919 dev_err(master->dev, "Failed to enable coprocessor interrupt !\n");
925 static int fsi_master_acf_setup(struct fsi_master_acf *master)
931 reset_cf(master);
937 memset_io(master->sram, 0, SRAM_SIZE);
940 rc = setup_gpios_for_copro(master);
945 rc = load_copro_firmware(master);
950 rc = check_firmware_image(master);
955 if (master->is_ast2500) {
956 setup_ast2500_cf_maps(master);
957 setup_ast2500_fw_config(master);
959 setup_ast2400_cf_maps(master);
960 setup_ast2400_fw_config(master);
964 start_cf(master);
970 val = ioread8(master->sram + CF_STARTED);
976 dev_err(master->dev, "Coprocessor startup timeout !\n");
982 iowrite8(master->t_send_delay, master->sram + SEND_DLY_REG);
983 iowrite8(master->t_echo_delay, master->sram + ECHO_DLY_REG);
986 if (master->cvic) {
987 rc = copro_enable_sw_irq(master);
994 reset_cf(master);
997 release_copro_gpios(master);
1003 static void fsi_master_acf_terminate(struct fsi_master_acf *master)
1016 reset_cf(master);
1019 iowrite32(0, master->sram + CF_STARTED);
1024 iowrite8(ARB_ARM_ACK, master->sram + ARB_REG);
1029 release_copro_gpios(master);
1032 static void fsi_master_acf_setup_external(struct fsi_master_acf *master)
1034 /* Setup GPIOs for external FSI master (FSP box) */
1035 gpiod_direction_output(master->gpio_mux, 0);
1036 gpiod_direction_output(master->gpio_trans, 0);
1037 gpiod_direction_output(master->gpio_enable, 1);
1038 gpiod_direction_input(master->gpio_clk);
1039 gpiod_direction_input(master->gpio_data);
1045 struct fsi_master_acf *master = to_fsi_master_acf(_master);
1051 mutex_lock(&master->lock);
1052 if (!master->external_mode) {
1053 gpiod_set_value(master->gpio_enable, enable ? 1 : 0);
1056 mutex_unlock(&master->lock);
1064 struct fsi_master_acf *master = to_fsi_master_acf(_master);
1069 mutex_lock(&master->lock);
1070 master->t_send_delay = t_send_delay;
1071 master->t_echo_delay = t_echo_delay;
1072 dev_dbg(master->dev, "Changing delays: send=%d echo=%d\n",
1074 iowrite8(master->t_send_delay, master->sram + SEND_DLY_REG);
1075 iowrite8(master->t_echo_delay, master->sram + ECHO_DLY_REG);
1076 mutex_unlock(&master->lock);
1084 struct fsi_master_acf *master = dev_get_drvdata(dev);
1087 master->external_mode ? 1 : 0);
1093 struct fsi_master_acf *master = dev_get_drvdata(dev);
1104 mutex_lock(&master->lock);
1106 if (external_mode == master->external_mode) {
1107 mutex_unlock(&master->lock);
1111 master->external_mode = external_mode;
1112 if (master->external_mode) {
1113 fsi_master_acf_terminate(master);
1114 fsi_master_acf_setup_external(master);
1116 fsi_master_acf_setup(master);
1118 mutex_unlock(&master->lock);
1120 fsi_master_rescan(&master->master);
1130 struct fsi_master_acf *master = data;
1137 iowrite8(ARB_ARM_REQ, master->sram + ARB_REG);
1151 if (ioread32(master->sram + CF_STARTED) == 0) {
1154 regmap_read(master->scu, SCU_COPRO_CTRL, &reg);
1160 if (master->cvic)
1161 iowrite32(0x2, master->cvic + CVIC_TRIG_REG);
1164 val = ioread8(master->sram + ARB_REG);
1172 dev_warn(master->dev, "GPIO request arbitration timeout\n");
1179 struct fsi_master_acf *master = data;
1182 iowrite8(0, master->sram + ARB_REG);
1185 if (master->cvic)
1186 iowrite32(0x2, master->cvic + CVIC_TRIG_REG);
1193 struct fsi_master_acf *master = to_fsi_master_acf(to_fsi_master(dev));
1196 mutex_lock(&master->lock);
1197 fsi_master_acf_terminate(master);
1199 mutex_unlock(&master->lock);
1202 gen_pool_free(master->sram_pool, (unsigned long)master->sram, SRAM_SIZE);
1203 of_node_put(dev_of_node(master->dev));
1205 kfree(master);
1217 struct fsi_master_acf *master;
1223 master = kzalloc(sizeof(*master), GFP_KERNEL);
1224 if (!master)
1227 master->dev = &pdev->dev;
1228 master->master.dev.parent = master->dev;
1229 master->last_addr = LAST_ADDR_INVALID;
1232 master->is_ast2500 = of_device_is_compatible(mnode, "aspeed,ast2500-cf-fsi-master");
1235 if (master->is_ast2500)
1236 master->scu = syscon_regmap_lookup_by_compatible("aspeed,ast2500-scu");
1238 master->scu = syscon_regmap_lookup_by_compatible("aspeed,ast2400-scu");
1239 if (IS_ERR(master->scu)) {
1241 rc = PTR_ERR(master->scu);
1252 master->gpio_clk = gpio;
1260 master->gpio_data = gpio;
1269 master->gpio_trans = gpio;
1277 master->gpio_enable = gpio;
1285 master->gpio_mux = gpio;
1301 master->cf_mem_size = resource_size(&res);
1302 master->cf_mem_addr = (uint32_t)res.start;
1303 cf_mem_align = master->is_ast2500 ? 0x00100000 : 0x00200000;
1304 if (master->cf_mem_addr & (cf_mem_align - 1)) {
1309 master->cf_mem = devm_ioremap_resource(&pdev->dev, &res);
1310 if (IS_ERR(master->cf_mem)) {
1311 rc = PTR_ERR(master->cf_mem);
1314 dev_dbg(&pdev->dev, "DRAM allocation @%x\n", master->cf_mem_addr);
1317 if (master->is_ast2500) {
1325 master->cvic = devm_of_iomap(&pdev->dev, np, 0, NULL);
1326 if (IS_ERR(master->cvic)) {
1328 rc = PTR_ERR(master->cvic);
1333 &master->cvic_sw_irq);
1342 master->sram_pool = of_gen_pool_get(dev_of_node(&pdev->dev), "aspeed,sram", 0);
1343 if (!master->sram_pool) {
1351 master->sram = (void __iomem *)gen_pool_alloc_algo(master->sram_pool, SRAM_SIZE,
1353 if (!master->sram) {
1359 (unsigned long)gen_pool_virt_to_phys(master->sram_pool,
1360 (unsigned long)master->sram));
1366 aspeed_gpio_copro_set_ops(&fsi_master_acf_gpio_ops, master);
1369 master->t_send_delay = FSI_SEND_DELAY_CLOCKS;
1370 master->t_echo_delay = FSI_ECHO_DELAY_CLOCKS;
1371 master->master.n_links = 1;
1372 if (master->is_ast2500)
1373 master->master.flags = FSI_MASTER_FLAG_SWCLOCK;
1374 master->master.read = fsi_master_acf_read;
1375 master->master.write = fsi_master_acf_write;
1376 master->master.term = fsi_master_acf_term;
1377 master->master.send_break = fsi_master_acf_break;
1378 master->master.link_enable = fsi_master_acf_link_enable;
1379 master->master.link_config = fsi_master_acf_link_config;
1380 master->master.dev.of_node = of_node_get(dev_of_node(master->dev));
1381 master->master.dev.release = fsi_master_acf_release;
1382 platform_set_drvdata(pdev, master);
1383 mutex_init(&master->lock);
1385 mutex_lock(&master->lock);
1386 rc = fsi_master_acf_setup(master);
1387 mutex_unlock(&master->lock);
1395 rc = fsi_master_register(&master->master);
1399 device_remove_file(master->dev, &dev_attr_external_mode);
1400 put_device(&master->master.dev);
1404 fsi_master_acf_terminate(master);
1407 gen_pool_free(master->sram_pool, (unsigned long)master->sram, SRAM_SIZE);
1408 of_node_put(dev_of_node(master->dev));
1410 kfree(master);
1417 struct fsi_master_acf *master = platform_get_drvdata(pdev);
1419 device_remove_file(master->dev, &dev_attr_external_mode);
1421 fsi_master_unregister(&master->master);
1427 { .compatible = "aspeed,ast2400-cf-fsi-master" },
1428 { .compatible = "aspeed,ast2500-cf-fsi-master" },
1435 .name = "fsi-master-acf",