struct vic_config {
        const char *firmware;
        unsigned int version;
+       bool supports_sid;
 };
 
 struct vic {
        if (vic->booted)
                return 0;
 
+       if (vic->config->supports_sid) {
+               struct iommu_fwspec *spec = dev_iommu_fwspec_get(vic->dev);
+               u32 value;
+
+               value = TRANSCFG_ATT(1, TRANSCFG_SID_FALCON) |
+                       TRANSCFG_ATT(0, TRANSCFG_SID_HW);
+               vic_writel(vic, value, VIC_TFBIF_TRANSCFG);
+
+               if (spec && spec->num_ids > 0) {
+                       value = spec->ids[0] & 0xffff;
+
+                       vic_writel(vic, value, VIC_THI_STREAMID0);
+                       vic_writel(vic, value, VIC_THI_STREAMID1);
+               }
+       }
+
        /* setup clockgating registers */
        vic_writel(vic, CG_IDLE_CG_DLY_CNT(4) |
                        CG_IDLE_CG_EN |
 static const struct vic_config vic_t124_config = {
        .firmware = NVIDIA_TEGRA_124_VIC_FIRMWARE,
        .version = 0x40,
+       .supports_sid = false,
 };
 
 #define NVIDIA_TEGRA_210_VIC_FIRMWARE "nvidia/tegra210/vic04_ucode.bin"
 static const struct vic_config vic_t210_config = {
        .firmware = NVIDIA_TEGRA_210_VIC_FIRMWARE,
        .version = 0x21,
+       .supports_sid = false,
 };
 
 #define NVIDIA_TEGRA_186_VIC_FIRMWARE "nvidia/tegra186/vic04_ucode.bin"
 static const struct vic_config vic_t186_config = {
        .firmware = NVIDIA_TEGRA_186_VIC_FIRMWARE,
        .version = 0x18,
+       .supports_sid = true,
 };
 
 #define NVIDIA_TEGRA_194_VIC_FIRMWARE "nvidia/tegra194/vic.bin"
 static const struct vic_config vic_t194_config = {
        .firmware = NVIDIA_TEGRA_194_VIC_FIRMWARE,
        .version = 0x19,
+       .supports_sid = true,
 };
 
 static const struct of_device_id vic_match[] = {
 
 
 /* VIC registers */
 
+#define VIC_THI_STREAMID0      0x00000030
+#define VIC_THI_STREAMID1      0x00000034
+
 #define NV_PVIC_MISC_PRI_VIC_CG                        0x000016d0
 #define CG_IDLE_CG_DLY_CNT(val)                        ((val & 0x3f) << 0)
 #define CG_IDLE_CG_EN                          (1 << 6)
 #define CG_WAKEUP_DLY_CNT(val)                 ((val & 0xf) << 16)
 
+#define VIC_TFBIF_TRANSCFG     0x00002044
+#define  TRANSCFG_ATT(i, v)    (((v) & 0x3) << (i * 4))
+#define  TRANSCFG_SID_HW       0
+#define  TRANSCFG_SID_PHY      1
+#define  TRANSCFG_SID_FALCON   2
+
 /* Firmware offsets */
 
 #define VIC_UCODE_FCE_HEADER_OFFSET            (6*4)