Lines Matching defs:dart
144 #define DART_TCR(dart, sid) ((dart)->hw->tcr + ((sid) << 2))
146 #define DART_TTBR(dart, sid, idx) ((dart)->hw->ttbr + \
147 (((dart)->hw->ttbr_count * (sid)) << 2) + \
196 * @lock: lock for hardware operations involving this dart
238 * and never changed again afterwards. Devices with different dart pointers
241 * @dart dart pointer
245 struct apple_dart *dart;
249 struct apple_dart *dart;
294 i < MAX_DARTS_PER_DEVICE && stream_map->dart; \
308 struct apple_dart *dart = stream_map->dart;
311 for_each_set_bit(sid, stream_map->sidmap, dart->num_streams)
312 writel(dart->hw->tcr_enabled, dart->regs + DART_TCR(dart, sid));
317 struct apple_dart *dart = stream_map->dart;
320 for_each_set_bit(sid, stream_map->sidmap, dart->num_streams)
321 writel(dart->hw->tcr_disabled, dart->regs + DART_TCR(dart, sid));
327 struct apple_dart *dart = stream_map->dart;
330 WARN_ON(!stream_map->dart->supports_bypass);
331 for_each_set_bit(sid, stream_map->sidmap, dart->num_streams)
332 writel(dart->hw->tcr_bypass,
333 dart->regs + DART_TCR(dart, sid));
339 struct apple_dart *dart = stream_map->dart;
342 WARN_ON(paddr & ((1 << dart->hw->ttbr_shift) - 1));
343 for_each_set_bit(sid, stream_map->sidmap, dart->num_streams)
344 writel(dart->hw->ttbr_valid |
345 (paddr >> dart->hw->ttbr_shift) << dart->hw->ttbr_addr_field_shift,
346 dart->regs + DART_TTBR(dart, sid, idx));
352 struct apple_dart *dart = stream_map->dart;
355 for_each_set_bit(sid, stream_map->sidmap, dart->num_streams)
356 writel(0, dart->regs + DART_TTBR(dart, sid, idx));
364 for (i = 0; i < stream_map->dart->hw->ttbr_count; ++i)
376 spin_lock_irqsave(&stream_map->dart->lock, flags);
378 writel(stream_map->sidmap[0], stream_map->dart->regs + DART_T8020_STREAM_SELECT);
379 writel(command, stream_map->dart->regs + DART_T8020_STREAM_COMMAND);
382 stream_map->dart->regs + DART_T8020_STREAM_COMMAND, command_reg,
386 spin_unlock_irqrestore(&stream_map->dart->lock, flags);
389 dev_err(stream_map->dart->dev,
402 struct apple_dart *dart = stream_map->dart;
407 spin_lock_irqsave(&dart->lock, flags);
409 for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) {
412 writel(val, dart->regs + DART_T8110_TLB_CMD);
415 dart->regs + DART_T8110_TLB_CMD, val,
424 spin_unlock_irqrestore(&dart->lock, flags);
427 dev_err(stream_map->dart->dev,
450 static int apple_dart_hw_reset(struct apple_dart *dart)
456 config = readl(dart->regs + dart->hw->lock);
457 if (config & dart->hw->lock_bit) {
458 dev_err(dart->dev, "DART is locked down until reboot: %08x\n",
463 stream_map.dart = dart;
465 bitmap_set(stream_map.sidmap, 0, dart->num_streams);
470 for (i = 0; i < BITS_TO_U32(dart->num_streams); i++)
471 writel(U32_MAX, dart->regs + dart->hw->enable_streams + 4 * i);
474 writel(readl(dart->regs + dart->hw->error), dart->regs + dart->hw->error);
476 if (dart->hw->type == DART_T8110)
477 writel(0, dart->regs + DART_T8110_ERROR_MASK);
479 return dart->hw->invalidate_tlb(&stream_map);
489 stream_map.dart = domain_stream_map->dart;
491 for (j = 0; j < BITS_TO_LONGS(stream_map.dart->num_streams); j++)
494 stream_map.dart->hw->invalidate_tlb(&stream_map);
564 for (; i < stream_map->dart->hw->ttbr_count; ++i)
568 stream_map->dart->hw->invalidate_tlb(stream_map);
575 struct apple_dart *dart = cfg->stream_maps[0].dart;
586 dart_domain->stream_maps[i].dart = cfg->stream_maps[i].dart;
587 for (j = 0; j < BITS_TO_LONGS(dart->num_streams); j++)
593 .pgsize_bitmap = dart->pgsize,
594 .ias = dart->ias,
595 .oas = dart->oas,
597 .iommu_dev = dart->dev,
601 alloc_io_pgtable_ops(dart->hw->fmt, &pgtbl_cfg, domain);
609 domain->geometry.aperture_end = (dma_addr_t)DMA_BIT_MASK(dart->ias);
627 if (domain_maps[i].dart != master_maps[i].dart)
632 if (!domain_maps[i].dart)
634 for (j = 0; j < BITS_TO_LONGS(domain_maps[i].dart->num_streams); j++) {
662 if (cfg->stream_maps[0].dart->force_bypass &&
665 if (!cfg->stream_maps[0].dart->supports_bypass &&
706 dev, stream_map->dart->dev,
709 return &cfg->stream_maps[0].dart->iommu;
755 struct apple_dart *dart = platform_get_drvdata(iommu_pdev);
769 cfg_dart = cfg->stream_maps[0].dart;
771 if (cfg_dart->supports_bypass != dart->supports_bypass)
773 if (cfg_dart->force_bypass != dart->force_bypass)
775 if (cfg_dart->pgsize != dart->pgsize)
780 if (cfg->stream_maps[i].dart == dart) {
786 if (!cfg->stream_maps[i].dart) {
787 cfg->stream_maps[i].dart = dart;
807 for_each_set_bit(sid, stream_map->sidmap, stream_map->dart->num_streams)
808 stream_map->dart->sid2group[sid] = NULL;
823 if (src->stream_maps[1].dart)
825 if (dst->stream_maps[1].dart)
827 if (src->stream_maps[0].dart != dst->stream_maps[0].dart)
833 dst->stream_maps[0].dart->num_streams);
849 for_each_set_bit(sid, stream_map->sidmap, stream_map->dart->num_streams) {
851 stream_map->dart->sid2group[sid];
902 for_each_set_bit(sid, stream_map->sidmap, stream_map->dart->num_streams)
903 stream_map->dart->sid2group[sid] = group;
916 if (cfg->stream_maps[0].dart->force_bypass)
918 if (!cfg->stream_maps[0].dart->supports_bypass)
957 .pgsize_bitmap = -1UL, /* Restricted during dart probe */
973 struct apple_dart *dart = dev;
975 u32 error = readl(dart->regs + DART_T8020_ERROR);
977 u32 addr_lo = readl(dart->regs + DART_T8020_ERROR_ADDR_LO);
978 u32 addr_hi = readl(dart->regs + DART_T8020_ERROR_ADDR_HI);
1000 dart->dev,
1004 writel(error, dart->regs + DART_T8020_ERROR);
1010 struct apple_dart *dart = dev;
1012 u32 error = readl(dart->regs + DART_T8110_ERROR);
1014 u32 addr_lo = readl(dart->regs + DART_T8110_ERROR_ADDR_LO);
1015 u32 addr_hi = readl(dart->regs + DART_T8110_ERROR_ADDR_HI);
1039 dart->dev,
1043 writel(error, dart->regs + DART_T8110_ERROR);
1052 struct apple_dart *dart;
1055 dart = devm_kzalloc(dev, sizeof(*dart), GFP_KERNEL);
1056 if (!dart)
1059 dart->dev = dev;
1060 dart->hw = of_device_get_match_data(dev);
1061 spin_lock_init(&dart->lock);
1063 dart->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
1064 if (IS_ERR(dart->regs))
1065 return PTR_ERR(dart->regs);
1072 dart->irq = platform_get_irq(pdev, 0);
1073 if (dart->irq < 0)
1076 ret = devm_clk_bulk_get_all(dev, &dart->clks);
1079 dart->num_clks = ret;
1081 ret = clk_bulk_prepare_enable(dart->num_clks, dart->clks);
1085 dart_params[0] = readl(dart->regs + DART_PARAMS1);
1086 dart_params[1] = readl(dart->regs + DART_PARAMS2);
1087 dart->pgsize = 1 << FIELD_GET(DART_PARAMS1_PAGE_SHIFT, dart_params[0]);
1088 dart->supports_bypass = dart_params[1] & DART_PARAMS2_BYPASS_SUPPORT;
1090 switch (dart->hw->type) {
1093 dart->ias = 32;
1094 dart->oas = dart->hw->oas;
1095 dart->num_streams = dart->hw->max_sid_count;
1099 dart_params[2] = readl(dart->regs + DART_T8110_PARAMS3);
1100 dart_params[3] = readl(dart->regs + DART_T8110_PARAMS4);
1101 dart->ias = FIELD_GET(DART_T8110_PARAMS3_VA_WIDTH, dart_params[2]);
1102 dart->oas = FIELD_GET(DART_T8110_PARAMS3_PA_WIDTH, dart_params[2]);
1103 dart->num_streams = FIELD_GET(DART_T8110_PARAMS4_NUM_SIDS, dart_params[3]);
1107 if (dart->num_streams > DART_MAX_STREAMS) {
1109 dart->num_streams, DART_MAX_STREAMS);
1114 dart->force_bypass = dart->pgsize > PAGE_SIZE;
1116 ret = apple_dart_hw_reset(dart);
1120 ret = request_irq(dart->irq, dart->hw->irq_handler, IRQF_SHARED,
1121 "apple-dart fault handler", dart);
1125 platform_set_drvdata(pdev, dart);
1127 ret = iommu_device_sysfs_add(&dart->iommu, dev, NULL, "apple-dart.%s",
1132 ret = iommu_device_register(&dart->iommu, &apple_dart_iommu_ops, dev);
1139 dart->pgsize, dart->num_streams, dart->supports_bypass, dart->force_bypass);
1143 iommu_device_sysfs_remove(&dart->iommu);
1145 free_irq(dart->irq, dart);
1147 clk_bulk_disable_unprepare(dart->num_clks, dart->clks);
1154 struct apple_dart *dart = platform_get_drvdata(pdev);
1156 apple_dart_hw_reset(dart);
1157 free_irq(dart->irq, dart);
1159 iommu_device_unregister(&dart->iommu);
1160 iommu_device_sysfs_remove(&dart->iommu);
1162 clk_bulk_disable_unprepare(dart->num_clks, dart->clks);
1243 struct apple_dart *dart = dev_get_drvdata(dev);
1246 for (sid = 0; sid < dart->num_streams; sid++) {
1247 dart->save_tcr[sid] = readl_relaxed(dart->regs + DART_TCR(dart, sid));
1248 for (idx = 0; idx < dart->hw->ttbr_count; idx++)
1249 dart->save_ttbr[sid][idx] =
1250 readl(dart->regs + DART_TTBR(dart, sid, idx));
1258 struct apple_dart *dart = dev_get_drvdata(dev);
1262 ret = apple_dart_hw_reset(dart);
1268 for (sid = 0; sid < dart->num_streams; sid++) {
1269 for (idx = 0; idx < dart->hw->ttbr_count; idx++)
1270 writel(dart->save_ttbr[sid][idx],
1271 dart->regs + DART_TTBR(dart, sid, idx));
1272 writel(dart->save_tcr[sid], dart->regs + DART_TCR(dart, sid));
1281 { .compatible = "apple,t8103-dart", .data = &apple_dart_hw_t8103 },
1282 { .compatible = "apple,t8110-dart", .data = &apple_dart_hw_t8110 },
1283 { .compatible = "apple,t6000-dart", .data = &apple_dart_hw_t6000 },
1290 .name = "apple-dart",