Lines Matching refs:mc
14 #include <dt-bindings/memory/tegra20-mc.h>
16 #include "mc.h"
75 const struct tegra_mc *mc;
279 static int tegra20_mc_hotreset_assert(struct tegra_mc *mc,
285 spin_lock_irqsave(&mc->lock, flags);
287 value = mc_readl(mc, rst->reset);
288 mc_writel(mc, value & ~BIT(rst->bit), rst->reset);
290 spin_unlock_irqrestore(&mc->lock, flags);
295 static int tegra20_mc_hotreset_deassert(struct tegra_mc *mc,
301 spin_lock_irqsave(&mc->lock, flags);
303 value = mc_readl(mc, rst->reset);
304 mc_writel(mc, value | BIT(rst->bit), rst->reset);
306 spin_unlock_irqrestore(&mc->lock, flags);
311 static int tegra20_mc_block_dma(struct tegra_mc *mc,
317 spin_lock_irqsave(&mc->lock, flags);
319 value = mc_readl(mc, rst->control) & ~BIT(rst->bit);
320 mc_writel(mc, value, rst->control);
322 spin_unlock_irqrestore(&mc->lock, flags);
327 static bool tegra20_mc_dma_idling(struct tegra_mc *mc,
330 return mc_readl(mc, rst->status) == 0;
333 static int tegra20_mc_reset_status(struct tegra_mc *mc,
336 return (mc_readl(mc, rst->reset) & BIT(rst->bit)) == 0;
339 static int tegra20_mc_unblock_dma(struct tegra_mc *mc,
345 spin_lock_irqsave(&mc->lock, flags);
347 value = mc_readl(mc, rst->control) | BIT(rst->bit);
348 mc_writel(mc, value, rst->control);
350 spin_unlock_irqrestore(&mc->lock, flags);
395 struct tegra_mc *mc = icc_provider_to_tegra_mc(data);
400 list_for_each_entry(node, &mc->provider.nodes, node_list) {
420 for (i = 0; i < mc->soc->num_clients; i++) {
421 if (mc->soc->clients[i].id == idx)
425 dev_err(mc->dev, "invalid ICC client ID %u\n", idx);
452 const struct tegra_mc *mc = stat->mc;
461 mc_writel(mc, 0x00000000, MC_STAT_CONTROL);
462 mc_writel(mc, control_0, MC_STAT_EMC_CONTROL_0);
463 mc_writel(mc, control_1, MC_STAT_EMC_CONTROL_1);
464 mc_writel(mc, 0xffffffff, MC_STAT_EMC_CLOCK_LIMIT);
466 mc_writel(mc, EMC_GATHER_ENABLE, MC_STAT_CONTROL);
468 mc_writel(mc, EMC_GATHER_DISABLE, MC_STAT_CONTROL);
470 count0 = mc_readl(mc, MC_STAT_EMC_COUNT_0);
471 count1 = mc_readl(mc, MC_STAT_EMC_COUNT_1);
472 clocks = mc_readl(mc, MC_STAT_EMC_CLOCKS);
479 static void tegra20_mc_stat_events(const struct tegra_mc *mc,
503 stat.mc = mc;
511 static void tegra20_mc_collect_stats(const struct tegra_mc *mc,
518 for (i = 0; i < mc->soc->num_clients; i += 2) {
519 client0 = &mc->soc->clients[i];
520 client1 = &mc->soc->clients[i + 1];
522 if (i + 1 == mc->soc->num_clients)
525 tegra20_mc_stat_events(mc, client0, client1,
534 for (i = 0; i < mc->soc->num_clients; i++) {
535 unsigned int clienta, clientb = mc->soc->num_clients;
537 for (client0 = NULL; i < mc->soc->num_clients; i++) {
539 client0 = &mc->soc->clients[i];
545 for (client1 = NULL; i < mc->soc->num_clients; i++) {
547 client1 = &mc->soc->clients[i];
556 tegra20_mc_stat_events(mc, client0, client1,
563 tegra20_mc_stat_events(mc, client0, client1,
570 tegra20_mc_stat_events(mc, client0, client1,
577 tegra20_mc_stat_events(mc, client0, client1,
584 tegra20_mc_stat_events(mc, client0, client1,
591 tegra20_mc_stat_events(mc, client0, client1,
614 const struct tegra_mc *mc = dev_get_drvdata(s->private);
618 stats = kcalloc(mc->soc->num_clients + 1, sizeof(*stats), GFP_KERNEL);
624 tegra20_mc_collect_stats(mc, stats);
631 for (i = 0; i < mc->soc->num_clients; i++) {
632 seq_printf(s, "%-14s ", mc->soc->clients[i].name);
683 static int tegra20_mc_probe(struct tegra_mc *mc)
685 debugfs_create_devm_seqfile(mc->dev, "stats", mc->debugfs.root,
691 static int tegra20_mc_suspend(struct tegra_mc *mc)
695 if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && mc->gart) {
696 err = tegra_gart_suspend(mc->gart);
704 static int tegra20_mc_resume(struct tegra_mc *mc)
708 if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && mc->gart) {
709 err = tegra_gart_resume(mc->gart);
719 struct tegra_mc *mc = data;
724 status = mc_readl(mc, MC_INTSTATUS) & mc->soc->intmask;
739 value = mc_readl(mc, reg);
741 id = value & mc->soc->client_id_mask;
750 value = mc_readl(mc, reg);
752 id = (value >> 1) & mc->soc->client_id_mask;
761 value = mc_readl(mc, reg);
763 id = value & mc->soc->client_id_mask;
776 client = mc->soc->clients[id].name;
777 addr = mc_readl(mc, reg + sizeof(u32));
779 dev_err_ratelimited(mc->dev, "%s: %s%s @%pa: %s (%s)\n",
785 mc_writel(mc, status, MC_INTSTATUS);